こんにちは、id:Pocke です。 ハロウィンはどう過ごされたでしょうか? 私は渋谷にあるオフィスには行かずリモートで勤務していました。
さて、先日RuboCopのバージョン0.45.0(The Halloween Release!)がリリースされました。
0.45.0 には、多数の機能追加やバグ修正が含まれています。
このリリースには、SideCIメンバーによるPull Requestも10個含まれています。 今日はそのCHANGELOGから、気になる新機能を見ていきましょう。
新規Cop追加
Copとは、RuboCopにおいてひとつのルールを指す言葉です。例えば、「インデントが正しいかチェックする」「非推奨メソッドを使っていないかチェックする」などが1つのCopの単位になります。
この章では、0.45.0で新たに追加されたCopをひとつずつ紹介します。
Lint/EmptyWhen
- Issue https://github.com/bbatsov/rubocop/issues/3646
- PR https://github.com/bbatsov/rubocop/pull/3651
- Document: http://rubocop.readthedocs.io/en/latest/cops_lint/#lintemptywhen
解説
このCopは、空のwhen節を検出します。
case variable when 'x' do_something when 'y' # Nothing end
上記のコードではvariable
が'y'
の場合のwhen
節が書かれていますが、この中身は空であるため意味を成しません。
そのため、上記のwhen 'y'
節はそのまま削除することが出来ます。
ただし、以下の様なコードの場合はwhen
節を削除すると結果が変わってしまう為、安全にwhen
節を削除出来ないので注意が必要です。
# else 節が存在する場合 case variable when 'x' do_something when 'y' # Nothing else do_something2 end # 空のwhen節を、他のwhen節がカバーする場合 case number when 42 # 42 ならば何もしない when 1..100 do_something when 101..200 do_something2 end # when 節の条件が他に影響を及ぼす場合 case variable when p('x') # Nothing when 'y' do_something end
Style/MultilineIfModifier
- Issue https://github.com/bbatsov/rubocop/issues/3570
- PR https://github.com/bbatsov/rubocop/pull/3636
- Document: http://rubocop.readthedocs.io/en/latest/cops_style/#multilineifmodifier
解説
Rubyには通常のif
式とは別に、修飾子スタイルのif
式が存在します。
この二つのif
式は、両者共に同様の結果を返します。
# 通常の if 式 if cond do_something end # 修飾子スタイルの if 式 do_something if cond
修飾子スタイルのif
は記述が簡潔になるため便利ですが、以下のように複数行に渡る式に対して使用すると分かりづらいと言う欠点があります。
array.each do |item| item.do_something end if cond
このCopは、上記のような複数行にかかるif
修飾子を検出します。
また、このCopはAuto-Correctに対応しているので、RuboCopに-a
オプションを付与して実行することで、自動的に修正することが可能です。
Style/SpaceInLambdaLiteral
- Issue https://github.com/bbatsov/rubocop/issues/3631
- PR https://github.com/bbatsov/rubocop/pull/3656
- Document: http://rubocop.readthedocs.io/en/latest/cops_style/#stylespaceinlambdaliteral
解説
Rubyには無名関数を定義する方法がいくつかありますが、そのうちの一つにlambdaのSyntaxがあります。
a = -> (x) { puts x }
参考: Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 2.3.0)
このCopは、lambdaを定義する際の->
と(
の間にスペースを入れるかどうかを検査します。
a = -> (x) { puts x } a = ->(x) { puts x }
デフォルトの設定では、間にスペースを入れない後者のコードを正しいものとし、スペースが入った前者のコードにはwarningを出します。
.rubocop.yml
に以下のように記述することで、逆の設定を行うことが可能です。
Style/SpaceInLambdaLiteral: EnforcedStyle: require_space
Lint/EmptyExpression
- PR https://github.com/bbatsov/rubocop/pull/3680
- Document: http://rubocop.readthedocs.io/en/latest/cops_lint/#lintemptyexpression
解説
Rubyは以下のような空のカッコも正しい式とみなします。
また、その値はnil
となります。
a = ()
p a # => nil
このようなコードは何らかの誤りである可能性が高いでしょう。
そのため、このCopは上記のようなコードに対してwarningを出します。
その他新機能
今回のリリースでは新規Cop以外にもいくつかの新機能が追加されています。 そのうちのいくつかを見ていきましょう。
ドキュメントにCopのリストが追加
- Issue: https://github.com/bbatsov/rubocop/issues/3246
- PR: https://github.com/bbatsov/rubocop/pull/3538
正確には新機能ではないのですが、今回のリリースに含まれているので紹介させていただきます。
- http://rubocop.readthedocs.io/en/latest/cops_lint/
- http://rubocop.readthedocs.io/en/latest/cops_metrics/
- http://rubocop.readthedocs.io/en/latest/cops_performance/
- http://rubocop.readthedocs.io/en/latest/cops_rails/
- http://rubocop.readthedocs.io/en/latest/cops_security/
- http://rubocop.readthedocs.io/en/latest/cops_style/
上記のリンクに全てのCopのドキュメントが書かれています。
各Copについて、解説、使用例、デフォルト値などが書かれているので、Copを設定する際の良い手助けになるでしょう。
--force-default-config
オプションの追加
- Issue: https://github.com/bbatsov/rubocop/issues/3647
- PR: https://github.com/bbatsov/rubocop/pull/3658
--force-default-config
オプションを使用すると、.rubocop.yml
などの存在を無視してRuboCopを動作させることが可能です。
今までは同様のことをrubocop --config /dev/null
のようなワークアラウンドで実現することが出来ましたが、このオプションによって公式にこの機能が提供されました。
RuboCop自体のデバッグの際などに便利かも知れませんね。
まとめ
この記事は以上になりますが、RuboCop 0.45.0ではこの他にも多くの機能追加、バグ修正が行われています。 より詳しい変更を知りたい方は、リリースノートをご覧ください。
Release RuboCop 0.45 (The Halloween Release) · bbatsov/rubocop
また、SideCIでは今すぐRuboCop 0.45.0を利用することが可能です。是非お試し下さい!