SideCI TechBlog

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


RuboCop 0.46.0 のCHANGELOGを読む

f:id:Pocke:20161019163732p:plain

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

解説

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

解説

このCopは、内容が空のメソッドを書く場合のスタイルを検査します。

内容が空のメソッドを記述する際、以下のような2通りの書き方が考えられます。

def empty_method
end

def empty_method; end

このCopは、デフォルトでは下の1行で書くスタイルの書き方を推奨し、上の様な複数行になる書き方にwarningを出します。

もしコーディングスタイルが上の複数行で書くような書き方の場合、.rubocop.ymlに以下の記述を追加することで、そちらの書き方を推奨することが出来ます。

Style/EmptyMethod:
  EnforcedStyle: expanded

また、このCopはAuto-Correctに対応しているため、異なったスタイルのコードを自動的に修正することが可能です。

Rails/EnumUniqueness

解説

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

解説

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