こんにちは、 id:Pocke です。 12月に入り寒さも本格化してきましたが、いかがお過ごしでしょうか?
さて、先日RuboCopのバージョン(0.46.0)がリリースされました。
0.46.0 には、多数の機能追加やバグ修正が含まれています。
このリリースには、SideCIメンバーによるPull Requestも4個含まれています。 今日はそのCHANGELOGから、気になる新機能を見ていきましょう。
新規Cop追加
Copとは、RuboCopにおいてひとつのルールを指す言葉です。例えば、「インデントが正しいかチェックする」「非推奨メソッドを使っていないかチェックする」などが1つのCopの単位になります。
この章では、0.46.0で新たに追加されたCopをひとつずつ紹介します。
Bundler/DuplicatedGem
- Issue https://github.com/bbatsov/rubocop/issues/3600
- PR https://github.com/bbatsov/rubocop/pull/3638
- Document http://rubocop.readthedocs.io/en/latest/cops_bundler/#bundlerduplicatedgem
解説
Bundler/*
cop は、このバージョンで新設された区分です。
Gemfile
などbundler関連のファイルに対する検査を行うCopです。
このCopは、Gemfile
内の重複したgemを検出します。
# Gemfile gem 'rubocop' # ..... gem 'rubocop'
上記のコードでは、rubocop
が重複して指定されていますが、このCopではそれを検出することができます。
# Gemfile group :development do gem 'rubocop' end group :test do gem 'rubocop' end
また、上記のように複数のグループで同じGemが存在している場合にも警告を出します。上記のようなコードは次のように書き換えることが可能です。
group :development, :test do gem 'rubocop' end
Gemfile
が肥大化してくる巨大なプロジェクトでは、このCopが役に立つかも知れません。
Style/EmptyMethod
- PR https://github.com/bbatsov/rubocop/pull/3720
- Document http://rubocop.readthedocs.io/en/latest/cops_style/#styleemptymethod
解説
このCopは、内容が空のメソッドを書く場合のスタイルを検査します。
内容が空のメソッドを記述する際、以下のような2通りの書き方が考えられます。
def empty_method end def empty_method; end
このCopは、デフォルトでは下の1行で書くスタイルの書き方を推奨し、上の様な複数行になる書き方にwarningを出します。
もしコーディングスタイルが上の複数行で書くような書き方の場合、.rubocop.yml
に以下の記述を追加することで、そちらの書き方を推奨することが出来ます。
Style/EmptyMethod: EnforcedStyle: expanded
また、このCopはAuto-Correctに対応しているため、異なったスタイルのコードを自動的に修正することが可能です。
Rails/EnumUniqueness
- Issue https://github.com/bbatsov/rubocop/issues/3723
- PR https://github.com/bbatsov/rubocop/pull/3724
- Document http://rubocop.readthedocs.io/en/latest/cops_rails/#railsenumuniqueness
解説
Rails 4.1 から、enumの機能が導入されました。
class PullRequest < ApplicationRecord enum state: [:open, :closed, :merged] # or enum state: {open: 10, closed: 20, merged: 30} end
enumはModelで上記のように定義します。
enumの定義には2種類あり、[:open, :closed, :merged]
の用に配列で指定する方法と、{open: 10, closed: 20, merged: 30}
のようにHashで指定する方法があります。
この内Hashで指定する方法はArrayでの指定と違い、新たな項目をenumに追加しても値がずれることがなくて便利なのですが、気をつけないと次のように値が重複してしまう可能性があります。
class PullRequest < ApplicationRecord # open と merged の値が両方共10になっている! enum state: {open: 10, closed: 20, merged: 10} end
このCopは、このような重複したenumの値を検出します。
Bundler/OrderedGems
- PR https://github.com/bbatsov/rubocop/pull/3657
- Issue https://github.com/bbatsov/rubocop/issues/3600
- Document http://rubocop.readthedocs.io/en/latest/cops_bundler/#bundlerorderedgems
解説
このCopは、Gemfile
内でgemがアルファベット順に並んでいるかを検査します。
# Gemfile gem 'devise' gem 'omniauth' gem 'omniauth-facebook' gem 'omniauth-github' gem 'omniauth-twitter' gem 'koala' gem 'octokit' gem 'twitter'
上記のようなGemfile
はgemがアルファベット順に並んでいると認識されます。
また、例えばomniauth-twitter
がomniauth-facebook
より前にある状態では、warningが発生します。
上記の例からもわかる通り空行を挟んだ場合は段落が分けて考えられるため、カテゴリ毎にGemを分けた上でアルファベット順に並べることが可能です。
このCopは現状Auto-Correctをサポートしていないため、アルファベット順に並べ直すためには手動で行う必要があります。 この件に関してはPull Requestを作成したため、次期リリースでは自動で並び替えが出来るようになると思われます。 https://github.com/bbatsov/rubocop/pull/3757
まとめ
この記事は以上になりますが、RuboCop 0.46.0ではこの他にも多くの機能追加、バグ修正が行われています。 より詳しい変更を知りたい方は、リリースノートをご覧ください。
Release RuboCop 0.46 · bbatsov/rubocop
また、SideCIでは今すぐRuboCop 0.46.0を利用することが可能です。是非お試し下さい!