momota.txt

hello, hello, hello, how low?

RuboCop でコーディングスタイルを矯正する

RuboCop Logo

textlintで日本語テキストの文字校正を試してみた とかで、lint 系の記事を目にしたので そろそろ導入してみるか、と思い立った。

RuboCop はRuby の静的コードアナライザ。 bbatsov/rubocop

The Ruby Style Guide に沿ったコーディングスタイルに矯正(注意)してくれる。 無駄なスペースが入力されている、とか、無駄な改行が入っている、とか、 この変数1度も使われてないよ?とかクラスの中の行数が多すぎる、とか、 1行の文字数が長すぎる、とか。

大人数で開発していると細かなコーディングスタイルを合わせるだけでも面倒なので こういうツールによって人間が矯正されると AI 時代に思いを馳せることができて良い感じですね。

RuboCop インストール

gem でインストールする。

1
2
3
$ gem install rubocop
$ rubocop -v
0.40.0

実行はrubocop コマンドにチェックしたいスクリプトを渡す。 例えば、以下のような Ruby スクリプトを

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# conding: utf-8
require "date"


class SampleRubocop
  def initialize( key )
    @key = key
  end

  def hey
    @key
  end
end


if __FILE__ == $0
  hoge = SampleRubocop.new("hoge")
  p hoge.hey
end

RuboCop でチェックすると以下のような感じで注意を受ける。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ rubocop sample_rubocop.rb
Inspecting 1 file
C

Offenses:

sample_rubocop.rb:2:9: C: Prefer single-quoted strings when you don't need string interpolation or special symbols.
require "date"
        ^^^^^^
sample_rubocop.rb:4:1: C: Extra blank line detected.
sample_rubocop.rb:5:1: C: Missing top-level class documentation comment.
class SampleRubocop
^^^^^
sample_rubocop.rb:6:18: C: Space inside parentheses detected.
  def initialize( key )
                 ^
sample_rubocop.rb:6:22: C: Space inside parentheses detected.
  def initialize( key )
                     ^
sample_rubocop.rb:15:1: C: Extra blank line detected.
sample_rubocop.rb:16:16: C: Prefer $PROGRAM_NAME over $0.
if __FILE__ == $0
               ^^
sample_rubocop.rb:17:28: C: Prefer single-quoted strings when you don't need string interpolation or special symbols.
  hoge = SampleRubocop.new("hoge")
                           ^^^^^^
sample_rubocop.rb:20:1: C: 1 trailing blank lines detected.

無駄な改行とかスペースを注意されていますね。修正しましょう。

The Ruby Style Guide が自分(たち) の コーディングスタイルに合わない場合は、カスタマイズが可能。 .rubocop.yml を編集する。

いったん、今書いているものを正しいコーディングスタイルとみなした .rubocop.yml を生成するには --auto-gen-config オプションをつけて rubocop を実行する。

1
2
3
$ cd /path/to/project
$ rubocop --auto-gen-config
# => /path/to/project/.rubocp_todo.yml が出力される

上記コマンドにより、プロジェクトディレクトリ(/path/to/project)配下のコードが解析されて、cop と 呼ばれるルール群が .rubocp_todo.yml というファイルで出力される。 .rubocp_todo.yml の中身は、以下のように cop 単位にそのプロジェクトに沿った設定が入ったものが 出力されている。

以下は、出力された .rubocp_todo.yml の一部を抜粋。

1
2
3
4
5
6
7
8
9
10
11
#
# -- snip --
#
# Offense count: 113
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
# URISchemes: http, https
Metrics/LineLength:
  Max: 137
#
# -- snip --
#

上記は、以下を示している。

  • デフォルト 1 行 80 文字までがコーディング規約となっているが最大 137 文字の行がある
    • 1 行あたり最大 137 文字まで許容する、という設定
  • 1 行 80 文字以上 (違反: offense) に該当する箇所が 113 件

.rubocp_todo.yml の修正不可能・修正困難部分のみを残したりチューニングして、.rubocop.yml に リネームしたら自分たちのコーディングスタイルに沿った現実的なルールを適用できる。

標準のコーディング規約に沿ってコードを修正していく場合は、.rubocop.yml に以下の行を追加するか

1
inherit_from: .rubocop-todo.yml

rubocop --config .rubocop_todo.yml を実行して、違反をつぶしていく。

コードの自動修正機能もある。 .rubocop_todo.yml# Cop supports --auto-correct. と記述されている cop については、以下の コマンドにより自動修正が可能。

1
2
$ rubocop -a
# $ rubocop --auto-correct でもOK

vim と RuboCop を連携する

コーディングしながら RuboCop に注意されたいので、vim と連携する。

vim プラグインの scrooloose/syntastic を入れる。

NeoBundle を使っているので、手持ちの vimrc を以下のように修正し、:NeoBundleInstall してインストールする。

1
2
3
4
5
6
+ NeoBundle 'scrooloose/syntastic'

+ " ----------------------------------------------------------------------
+ " syntastic
+ let g:syntastic_mode_map = { 'mode': 'active' }
+ let g:syntastic_ruby_checkers = ['rubocop']

そうすると、:SyntaxCheck を実行するか、保存:w のタイミングで RuboCop が動いてくれる。 以下のように指摘してくれる。

syntastic_ss

Comments