rubocopの導入

## 背景
最初に導入すべきですが、ほぼ一人で開発していたので、してなかった。チームの拡大で、やっぱコードがやばくなってきたので、早めに導入することを決めた。

## Rubocopは何
[Ruby style guide](https://github.com/bbatsov/ruby-style-guide)を基づいて作られたstatic code analyzerです。

https://github.com/bbatsov/rubocop

## 導入
#### インストール
- 開発環境とステージングに入れてます。最新のバージョン0.55.0を入れてます。

```ruby
group :development, :staging do
  gem 'rubocop', '~> 0.55.0', require: false
end
```

#### 自動修正
最初は.rubocop_todo.ymlがないと動かないようなので、`touch .rubocop_todo.yml`で空っぽのファイルを生成して、
`rubocop -a`で自動修正できる部分を修正してもらって、コミットする。

#### 手動修正
自動的に修正してくれない部分もあるので、`rubocop --auto-config-gen`で.rubocop.ymlを生成する。

.rubocop.ymlはrubocopのチェックを無視する設定ファイルです。そのファイルの中に自分が修正した部分をコメントアウトして、`rubocop`を実行すればエラーが出るので、そのエラーメッセージを参照して修正します。

後チームの中独自のルールを入れたいときにもそこで書きましょう。

自分が使ってるものは

```ruby
inherit_from: .rubocop_todo.yml

AllCops:
  Exclude:
    - db/**/*
    - tmp/**/*
    - vendor/**/*
    - lib/geohash.rb
    - lib/manager/geo.rb
    - bin/spring
  TargetRubyVersion: 2.3

# Offense count: 326
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Metrics/LineLength:
  Exclude:
    - 'Rakefile'
    - '**/*/.rake'
    - 'spec/**/*.rb'
  Max: 275

Metrics/MethodLength:
  Max: 150 # remove this after refacotr

PredicateName:
  NamePrefixBlacklist:
    - has_

MixinUsage:
  Include:
    - app/**/*.rb

Naming/UncommunicativeMethodParamName:
  MinNameLength: 1

Naming/AccessorMethodName:
  Enabled: false

Style/Documentation:
  Enabled: false

Style/AsciiComments:
  Enabled: false

# Offense count: 7
Metrics/PerceivedComplexity:
  Max: 18

# Offense count: 45
# Configuration parameters: CountComments.
Metrics/MethodLength:
  Max: 106

# Offense count: 45
# Configuration parameters: CountComments.
Metrics/MethodLength:
  Max: 109

# Offense count: 1
# Configuration parameters: CountKeywordArgs.
Metrics/ParameterLists:
  Max: 7

# Offense count: 7
Metrics/CyclomaticComplexity:
  Max: 15

# Offense count: 4
# Configuration parameters: CountComments.
Metrics/ClassLength:
  Max: 140

# Offense count: 1
# Configuration parameters: CountBlocks.
Metrics/BlockNesting:
  Max: 4

# Offense count: 40
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/BlockLength:
  Max: 111

# Offense count: 53
Metrics/AbcSize:
  Max: 109

# Offense count: 1
Lint/HandleExceptions:
  Exclude:
    - 'config/unicorn.rb'
```

修正すべきところもまだまだあるので、やりながら、修正していきたいです。

### Railsについて
`rubocop -R`するとrubyだけではなく、Railsもチェックしてくれますので、これから使う予定です。

## CircleCI 2.0 に入れる
```yml
version: 2
jobs:
  build:
    <<: *defaults
    steps:
      - checkout
      - run:
        name: rubocop
        command: bundle exec rubocop

```

開発環境とステージングにデプロイする時に走らせるようにしてます。

## Rubymine
2017.1からrubymineはデフォルトにrubocopが入れてます。でも自分で設定しないと動かないです。

![Screen Shot 2018-04-26 at 16.23.53.png](https://qiita-image-store.s3.amazonaws.com/0/37718/072498bc-19c2-7b1f-e3b8-96fc7db2ae94.png)

Code -> Inspect codeを走らせると↓の結果が出ます。

![Screen Shot 2018-04-26 at 17.06.17.png](https://qiita-image-store.s3.amazonaws.com/0/37718/a311fee7-b4e4-1bf6-eb91-0b0e11aa1f3a.png)

## 感想
プロジェクトが始めた時に入れるべきものです！

自動的に走らせて貰いたい！うるさいかなあ

## 参照
- http://tech.smarthr.jp/entry/2017/07/12/073000
- https://www.jetbrains.com/help/ruby/rubocop.html