読者です 読者をやめる 読者になる 読者になる

SideCI TechBlog

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


RuboCop 0.41 / 0.41.1 がリリースされました。

こんにちは、RuboCop大好き@pockeです!

f:id:sideci-dev:20160628100359p:plain

先日(日本時間2016年6月26日)、RuboCop 0.41及びバグ修正リリースの0.41.1がリリースされました。
0.41 では13個のCopの新規追加の他、機能追加、バグ修正などが行われております。
また、0.41.1では新規追加されたCopがRailsプロジェクトにおいてクラッシュしてしまう問題が修正されています(該当のPR)。
そのため特にRailsプロジェクトでRuboCopを使用しているのであれば、バージョン0.41.1を使用することをおすすめします。

また今回のリリースでは、先ほど紹介したバグ修正を含むいくつかのコミットに私も関わっています。 ですので今回のリリースの概要を紹介させていただきたいと思います。

では、CHANGELOGを読んでいきましょう。

Release RuboCop 0.41 · bbatsov/rubocop

New Features

新規Cop

今回のリリースでは、13個の新規Copが追加されました。

  • Style/SpaceInsidePercentLiteralDelimiters
  • Style/SpaceInsideArrayPercentLiteral
  • Style/NumericLiteralPrefix
  • Style/ImplicitRuntimeError
  • Style/EachForSimpleLoop
  • Lint/ShadowedException
  • Lint/PercentSymbolArray
  • Lint/PercentStringArray
  • Lint/InheritException
  • Performance/PushSplat
  • Rails/RequestReferer
  • Rails/OutputSafety
  • Rails/Exit

以下で一つ一つ見ていきましょう。

Style/SpaceInsidePercentLiteralDelimiters

Rubyのパーセント記法において、パーセントの内側にスペースが書かれてしまっていることを指摘します。

# Good
%i(foo bar baz)

# Bad
%i( foo bar baz )

Style/SpaceInsideArrayPercentLiteral

上のStyle/SpaceInsidePercentLiteralDelimitersと似ていますが、Rubyのパーセント記法において、余分なパーセントが入っている場合を指摘します。

# Good
%i(foo bar baz)

# Bad
%w(foo  bar  baz)

Style/NumericLiteralPrefix

数値リテラルのプレフィックスを統一するよう指摘します。

See. リテラル (Ruby 2.3.0) #数値リテラル

Style/ImplicitRuntimeError

暗黙的なRuntimeErrorを指摘します。

# Bad
# 文字列を直接投げると、RuntimeErrorが暗黙的に適用されてしまう
raise 'error'

# Good
raise ArgumentError, 'error'

Style/EachForSimpleLoop

.eachをよりシンプルに出来る場合を指摘します。

# Bad
(0..10).each { }

# Good
# 上の例はtimesで置き換えられる
10.times { }

Lint/ShadowedException

rescue節において、一般的な例外クラスがより限定的な例外クラスより前に置かれていることを指摘します

# Bad
begin
  something
rescue Exception # ExceptionはStandardErrorの親クラスなので、StandardErrorの例外もここで拾ってしまう
  handle_exception
rescue StandardError
  handle_standard_error
end

# Good
begin
  something
rescue StandardError
  handle_standard_error
rescue Exception
  handle_exception
end

Lint/PercentSymbolArray

RubyのSymbolのパーセント記法において、必要のない文字が入っていることを指摘します

# Bad
# : と , はパーセント記法では必要がない
%i(:foo, :bar)

# Good
%i(foo bar)

Lint/PercentStringArray

Lint/PercentSymbolArrayと同様、RubyのStringのパーセント記法において、必要のない文字が入っていることを指摘します

# Bad
# ' , " はパーセント記法では必要ない
%w('foo', "bar")

# Good
%w(foo bar)

Lint/InheritException

Exceptionを直接継承した例外クラスを指摘します。
Rubyでは通常、Exceptionを直接継承した例外クラスは定義せず、StandardErrorなどから継承します。
See Rubyで独自例外を定義するときはStandardErrorを継承する - Hack Your Design!

# Bad
class SomeError < Exception; end

# Good
class SomeError < StandardError; end

Performance/PushSplat

配列を連結する際に、パフォーマンスが悪い方法で書かれていることを指摘します。

# Bad
[1, 2, 3].push(*a)

# Good
[1, 2, 3].concat(a)

Rails/RequestReferer

Railsにおいて、request.referrerrequest.refererのどちらかを使用するよう統一します。

本来、参照元という意味の英単語は「referrer」であるが、HTTPリファラの場合は意図的に「referer」と綴る場合がある。これは、HTTPが策定された時にヘッダ名を間違ったスペルで書いてしまい、それが今でも使われている、という歴史的経緯のためである。

HTTPリファラ - Wikipedia

Rails/OutputSafety

RailsのView / Helper等で、.html_safeを使っているものを指摘します。

Rails/Exit

Railsアプリケーション内で、exitメソッドを使用していることを指摘します。
通常はexitの代わりに、raise, break, returnなどを使用すべきでしょう。

注目する新機能

新規Copの他に、以下の2点の新規機能に特に注目しています。

.ruby-versionを見るようになった

RuboCopはデフォルトではRuby 2.0を想定したパーサで解析を実行します。
この挙動は従来、下記のように.rubocop.ymlを設定することで変更可能でした。

# Ruby 2.3 のパーサを使用する場合
AllCops:
  TargetRubyVersion: 2.3

RuboCop 0.41からは、.rubocop.ymlの設定より優先して、.ruby-versionの内容から使用すべきパーサのバージョンを推定するようになりました。

テスト用のヘルパー関数がGemに含まれた

これは主にRuboCopプラグインを開発している人を対象とした変更です。

従来、RuboCopのテストヘルパー関数はspec/下に置かれていました。
Gemとして配布する際にはspec/下は含まれていなかったため、RuboCopプラグイン開発者はgit submoduleなどを駆使して別途RuboCopのソースコードをプロジェクトに含める必要がありました。

今回の変更でテストヘルパー関数はlib/下に移され、Gemにも含まれるようになりました。
その為、プラグイン開発者もRuboCopをGemとしてインストールするだけでテストヘルパー関数をプラグインから利用することが可能となりました。

その他機能追加

CHANGELOGからのコピペになりますが、以下にその他の新規機能をまとめます。

  • Add IndentationWidth configuration parameter for Style/AlignParameters cop.
  • New compact style for Style/SpaceInsideLiteralHashBraces.
  • Add Fastlane’s Fastfile to the default Includes.
  • Make Style/ModuleFunction configurable with module_function and extend_self styles.
  • Allow arbitrary comments after cop names in CommentConfig lines (e.g. rubocop:enable).
  • Add configuration style indented_relative_to_receiver for Style/MultilineMethodCallIndentation.
  • Add autocorrect for Rails/Validation cop.
  • Add autocorrect for Style/EachForSimpleLoop cop.

その他

数多くのバグ修正と、いくつかの修正が行われたようです。

まとめ

RuboCopのCHANGELOGをまとめてみましたが、いかがでしたでしょうか?
これを機に今書いているRubyのスタイルを見直してみるのも良いかも知れません。

また、SideCIでは最新のRuboCop 0.41.1がお使いいただけます! 是非一度お試しください。