1

Ruby 的 Sorbet 类型检查器有一个实用程序 ,srb rbi suggest-typed它将自动更新# typed:每个文件上的符号。然而,正如 Sorbet 文档所解释的那样,“目前,建议过程是错误的,并且可能会在没有必要时建议降级。” 我有一个 Sorbet 类型的代码库,我想尝试升级它的类型(以“棘轮”任何已完全键入而没有更改其印记的文件),但因为它是一个非常大的代码库,我不想必须手动审核每个更改的文件。有没有办法让 Sorbet 仅在升级时才对印记应用更改?

4

2 回答 2

0

似乎没有任何方法可以让 Sorbet 自己做到这一点。相反,作为一种解决方法,这里有一些说明,使用 Git 仅提交升级印记的更改,并丢弃任何降级的更改。

  1. 从一个干净的工作目录开始(确保git status不显示任何更改的文件)。
  2. 运行srb rbi suggest-typed。这将改变很多印记,包括升级和降级。
  3. 对已进行的不同类型的更改进行总结:
    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+}
    
  4. 用于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 --
    
  5. 重新运行步骤 3 中的摘要命令,以确保结果仅包含您想要的内容。
  6. 犯罪。
于 2021-07-06T01:06:53.717 回答
0

我认为你可以创造性地利用rubocop-sorbet这一点:

  1. 如果它还rubocop-sorbet没有在Gemfile
  2. 更改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
  1. 调用rubocop --auto-gen-config --exclude-limit 10000(或其他足够大的数字,可以防止 rubocop 完全禁用规则)
  2. 调用srb rbi suggest-typed
  3. 任何降级的文件现在都应该触发 rubocop 违规。您可以撤消对这些文件的更改rubocop -f fi | xargs git checkout --
  4. 还记得在提交结果之前将任何不需要的更改还原为Gemfile.rubocop.yml.rubocop_todo.yml等。
于 2021-07-06T14:36:19.673 回答