SideCI TechBlog

SideCIを作っているアクトキャットのエンジニアによる技術ブログです。


RuboCop 0.45.0 のCHANGELOGを読む

f:id:Pocke:20161019163732p:plain

こんにちは、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

解説

この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

解説

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

解説

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

解説

Rubyは以下のような空のカッコも正しい式とみなします。 また、その値はnilとなります。

a = ()
p a # => nil

このようなコードは何らかの誤りである可能性が高いでしょう。
そのため、このCopは上記のようなコードに対してwarningを出します。

その他新機能

今回のリリースでは新規Cop以外にもいくつかの新機能が追加されています。 そのうちのいくつかを見ていきましょう。

ドキュメントにCopのリストが追加

正確には新機能ではないのですが、今回のリリースに含まれているので紹介させていただきます。

上記のリンクに全てのCopのドキュメントが書かれています。

各Copについて、解説、使用例、デフォルト値などが書かれているので、Copを設定する際の良い手助けになるでしょう。

--force-default-configオプションの追加

--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を利用することが可能です。是非お試し下さい!