RuboCopで導入される`--safe`オプションと`--safe-auto-correct`オプション

次の RuboCop (> 0.59) のリリースで、RuboCop 1.0 に向けた --safe オプションと --safe-auto-correct オプションが導入される。

% rubocop --help | grep safe
        --safe                       Run only safe cops.
        --safe-auto-correct          Run auto-correct only when it's safe.

これらは RuboCop 1.0 に向けたオプションであり、現状は以下のような振る舞いをする。

--safe オプション

rubocop --safe とオプション付きで実行すると以下のように RuboCop の config/default.yml なりアプリケーションの .rubocop.yml なんかで Safe: false となる Cop は適用対象外となる (厳密にいうと Enable が true かつ Safe も true の Cop が対象になる) 。

 Performance/InefficientHashSearch:
   Description: 'Use `key?` or `value?` instead of `keys.include?` or `values.include?`'
   Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashkey-instead-of-hashkeysinclude-code'
   Enabled: true
   VersionAdded: 0.56
+  Safe: false

YAMLSafe: false の指定がなければデフォルトで Safe: true として扱われる。

なお、--safe オプションなしでの rubocop コマンド実行はこれまでどおり基本的に Enable :false でないものが対象。

現状で偽陽性を回避しづらいケースがある場合に Safe: false となっているようで、これまで Enabled: false だと Cop が持つスタイルへの音楽性の違いを無効にするものか、 Cop の不具合を回避するものなのか、そもそも避けづらい偽陽性を回避したいのか不明瞭など混在した根拠が分類された形になった、、、と思う (なお新たな Cop は不具合を持っている可能性を考慮して無効にしたいという意図のメタデータrubocop-hq/rubocop#5979 で検討されているところ) 。

--safe-auto-correct オプション

rubocop --safe-auto-correct とオプション付きで実行すると以下のような SafeAutoCorrect: false となっている Cop を対象外に auto-correct する。

 Style/InfiniteLoop:
   Description: 'Use Kernel#loop for infinite loops.'
   StyleGuide: '#infinite-loop'
   Enabled: true
   VersionAdded: 0.26
+  SafeAutoCorrect: false

YAMLSafeAutoCorrect: false の指定がなければデフォルトで SafeAutoCorrect: true として扱われる。

なお、--safe-auto-correct オプションは --auto-correct オプションのより安全なオプションということで、AutoCorrect: false はそもそも auto-correct 対象外となっているうえで、AutoCorrect: false の指定がない (デフォルトで AutoCorrect: true 扱い) 場合でも SafeAutoCorrect: false のものは安全とみなさないといったオプションとなる。

現状だと RuboCop の config/default.yml で AutoCorrect: false の Cop に加えて、Security/YAMLLoad cop と Style/InfiniteLoop cop ならびに Style/SpecialGlobalVars cop といった、auto-correct で破壊的変更をしてしまうレポートが挙げられてたり回避が難しそうな Cop が対象になっているもよう。


これらのオプション追加に関する PR は以下なので、実装に興味があればそちらを読まれたい。

github.com

また config/default.yml には、Cop が導入されたバージョン、変更されたバージョン、削除されたバージョンといったメタデータも取り込まれており、これらもいずれ振る舞いに関与してくることになると思う。このあたりのメンテナンスについて不明瞭な点があるので、あとで開発者向けにも明らかにしていきたいと思う。

github.com