如何在不降级印记的情况下使用 `srb rbi suggest-typed`?
How do I use `srb rbi suggest-typed` without downgrading sigils?
Ruby 的 Sorbet 类型检查器有一个实用程序 srb rbi suggest-typed
,它会自动更新每个文件上的 # typed:
符号。但是,as the Sorbet docs explain,“目前,建议过程是容易出错的,可能会在没有必要的时候建议降级。”我有一个 Sorbet 类型的代码库,我想尝试升级类型(以“棘轮”任何已完全键入而没有更改其印记的文件),但因为它是一个非常大的代码库,我不想必须手动审核每个更改的文件。有没有办法让 Sorbet 仅在升级时应用对印记的更改?
似乎没有办法让 Sorbet 自己做这件事。相反,作为一种解决方法,这里有一些使用 Git 的说明仅 提交 升级印记的更改,并丢弃任何降级的更改。
- 从一个干净的工作目录开始(确保
git status
不显示任何更改的文件)。
- 运行
srb rbi suggest-typed
。这将改变很多印记,包括升级和降级。
- 生成已进行的各种更改的摘要:
git diff --word-diff -U0 | grep '# typed: ' | sort | uniq -c
36 # typed: [-false-]{+ignore+}
8 # typed: [-false-]{+strict+}
27 # typed: [-false-]{+true+}
36 # typed: [-strict-]{+false+}
150 # typed: [-true-]{+strict+}
80 {+# typed: false+}
- 使用
grepdiff
查找您不想要的每个更改,并将结果通过管道传输到git checkout
以删除这些更改(修改根据您已获得的更改所需的以下命令):
git diff | grepdiff --output-matching=hunk --only-match=rem 'typed: false' | grepdiff --only-match=add 'typed: ignore' --strip=1 | xargs git checkout --
git diff | grepdiff --output-matching=hunk --only-match=rem 'typed: strict' | grepdiff --only-match=add 'typed: false' --strip=1 | xargs git checkout --
git diff | grepdiff --only-match=add 'typed: false' --strip=1 | xargs git checkout --
- 重新运行第 3 步中的摘要命令以确保结果只包含您想要的内容。
- 提交。
我认为你可以创造性地利用 rubocop-sorbet
来做到这一点:
- 如果
rubocop-sorbet
不在 Gemfile
中,请添加
- 将
rubocop.yml
更改为:
---
inherit_from: .rubocop_todo.yml
inherit_mode:
merge:
- Include
require:
- rubocop-sorbet
AllCops:
DisabledByDefault: true
Include:
- '**/*/*.rbi'
Sorbet/FalseSigil:
Enabled: true
Sorbet/IgnoreSigil:
Enabled: true
Sorbet/StrictSigil:
Enabled: true
Sorbet/StrongSigil:
Enabled: true
Sorbet/TrueSigil:
Enabled: true
- 调用
rubocop --auto-gen-config --exclude-limit 10000
(或其他足够大的数字以防止 rubocop 完全禁用规则)
- 调用
srb rbi suggest-typed
- 任何降级的文件现在都应该触发 rubocop 违规行为。您可以使用
rubocop -f fi | xargs git checkout --
撤消对这些文件的更改
- 还记得在提交结果之前还原对
Gemfile
、.rubocop.yml
、.rubocop_todo.yml
等的任何不需要的更改。
Ruby 的 Sorbet 类型检查器有一个实用程序 srb rbi suggest-typed
,它会自动更新每个文件上的 # typed:
符号。但是,as the Sorbet docs explain,“目前,建议过程是容易出错的,可能会在没有必要的时候建议降级。”我有一个 Sorbet 类型的代码库,我想尝试升级类型(以“棘轮”任何已完全键入而没有更改其印记的文件),但因为它是一个非常大的代码库,我不想必须手动审核每个更改的文件。有没有办法让 Sorbet 仅在升级时应用对印记的更改?
似乎没有办法让 Sorbet 自己做这件事。相反,作为一种解决方法,这里有一些使用 Git 的说明仅 提交 升级印记的更改,并丢弃任何降级的更改。
- 从一个干净的工作目录开始(确保
git status
不显示任何更改的文件)。 - 运行
srb rbi suggest-typed
。这将改变很多印记,包括升级和降级。 - 生成已进行的各种更改的摘要:
git diff --word-diff -U0 | grep '# typed: ' | sort | uniq -c
36 # typed: [-false-]{+ignore+} 8 # typed: [-false-]{+strict+} 27 # typed: [-false-]{+true+} 36 # typed: [-strict-]{+false+} 150 # typed: [-true-]{+strict+} 80 {+# typed: false+}
- 使用
grepdiff
查找您不想要的每个更改,并将结果通过管道传输到git checkout
以删除这些更改(修改根据您已获得的更改所需的以下命令):git diff | grepdiff --output-matching=hunk --only-match=rem 'typed: false' | grepdiff --only-match=add 'typed: ignore' --strip=1 | xargs git checkout -- git diff | grepdiff --output-matching=hunk --only-match=rem 'typed: strict' | grepdiff --only-match=add 'typed: false' --strip=1 | xargs git checkout -- git diff | grepdiff --only-match=add 'typed: false' --strip=1 | xargs git checkout --
- 重新运行第 3 步中的摘要命令以确保结果只包含您想要的内容。
- 提交。
我认为你可以创造性地利用 rubocop-sorbet
来做到这一点:
- 如果
rubocop-sorbet
不在Gemfile
中,请添加
- 将
rubocop.yml
更改为:
---
inherit_from: .rubocop_todo.yml
inherit_mode:
merge:
- Include
require:
- rubocop-sorbet
AllCops:
DisabledByDefault: true
Include:
- '**/*/*.rbi'
Sorbet/FalseSigil:
Enabled: true
Sorbet/IgnoreSigil:
Enabled: true
Sorbet/StrictSigil:
Enabled: true
Sorbet/StrongSigil:
Enabled: true
Sorbet/TrueSigil:
Enabled: true
- 调用
rubocop --auto-gen-config --exclude-limit 10000
(或其他足够大的数字以防止 rubocop 完全禁用规则) - 调用
srb rbi suggest-typed
- 任何降级的文件现在都应该触发 rubocop 违规行为。您可以使用
rubocop -f fi | xargs git checkout --
撤消对这些文件的更改
- 还记得在提交结果之前还原对
Gemfile
、.rubocop.yml
、.rubocop_todo.yml
等的任何不需要的更改。