RuboCop 2.4 系の最初のリリースとなる 2.4.0 をリリースしたので、概要をざっくり記しておきます。
Rails 部署に新たに追加された cop は以下の4つ。
Rails/ApplicationController cop
Rails/ApplicationRecord の Controller 版。
# bad class MyController < ActionController::Base end # good class MyController < ApplicationController end
Rails/ApplicationMailer cop
Rails/ApplicationRecord の Mailer 版。ApplicationMailer クラス層が導入された Rails 5.0 以上のアプリケーションが検査対象となる。
# bad class MyMailer < ActionMailer::Base end # good class MyMailer < ApplicationMailer end
Rails/RakeEnvironment cop
Rails アプリケーションにおける Rake ファイルのタスク定義で :environment タスクに依存しているか検査する。
# bad task :foo do end # good task foo: :environment do end
:environment タスクへの依存を失念するというケースがなるほどの一方で、振る舞いを変える可能性があるため auto-correct はデフォルトで unsafe としている。
Rails/SafeNavigationWithBlank cop
以下について検査する cop で少し説明が必要なので後述。
# bad do_something if foo&.blank? do_something unless foo&.blank? # good do_something if foo.blank? do_something unless foo.blank?
これは以下のようにレシーバーが nil の場合に safe navigation operator で blank? メソッドを呼び出した結果 falsy になるので、意図に反している可能性を示唆する cop となる。
nil.blank? #=> true nil&.blank? #=> nil
そのため auto-correct はデフォルトで unsafe としている。
Rails/UnknownEnv の拡張
Rails/UnknownEnv について以下のケースも検知するようになった。
# bad Rails.env.proudction? +Rails.env == 'proudction' # good - Rails.env.production? + Rails.env == 'production'
Rails/FilePath cop のデフォルトスタイル変更
このリリースでの大きな変更として Rails/FilePath のデフォルトの EnforcedStyle の変更がある。これまでの bad と good が反転してデフォルトの EnforcedStyle: slashes では以下のようになる。
# bad Rails.root.join('app', 'models', 'goober') File.join(Rails.root, 'app/models/goober') "#{Rails.root}/app/models/goober" # good Rails.root.join('app/models/goober')
もともと Windows 環境でのファイルパスセパレータとの互換を考慮して配列引数で渡しましょうといった流れだったようだが、Rails.root の戻り値となる Pathname オブジェクトはファイルパスセパレータに対する環境差異を吸収してくれているので、文字列引数で問題がなかった。また、生成する文字列の数も減らせそう、かつ、引数はひとつで固定されるなどの理由からデフォルトを変更した。これは Rails/OSS パッチ会で松田さんからデフォルト変更の提案があったことがきっかけになっている。
もし従来のスタイルの方が好ましい場合は EnforcedStyle: arguments を指定してください。
その他に Rails/ReversibleMigration, Rails/EnumHash, Rails/Presence, Rails/SaveBang といった cop へのバグ修正が含まれています。
エンジョイ!