次の 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
YAML に Safe: 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
YAML に SafeAutoCorrect: 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 は以下なので、実装に興味があればそちらを読まれたい。
また config/default.yml には、Cop が導入されたバージョン、変更されたバージョン、削除されたバージョンといったメタデータも取り込まれており、これらもいずれ振る舞いに関与してくることになると思う。このあたりのメンテナンスについて不明瞭な点があるので、あとで開発者向けにも明らかにしていきたいと思う。