こんにちは、RuboCop大好き@pockeです!
先日(日本時間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.referrer
かrequest.referer
のどちらかを使用するよう統一します。
本来、参照元という意味の英単語は「referrer」であるが、HTTPリファラの場合は意図的に「referer」と綴る場合がある。これは、HTTPが策定された時にヘッダ名を間違ったスペルで書いてしまい、それが今でも使われている、という歴史的経緯のためである。
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がお使いいただけます! 是非一度お試しください。