rubocop / rubocop-jp

A place for RuboCop discussions in Japanese
55 stars 2 forks source link

Layouts/DefEndAlignment Cop で怒られる場合と怒られない場合がある #44

Closed skmtpalm closed 6 years ago

skmtpalm commented 6 years ago

Layouts/DefEndAlignment Cop の挙動について質問させてください! gem ruboco-airbnb を継承して使っているのですが、こちらの設定には特におかしいところがなさそうだったので、こちらで質問させていただきました。

https://github.com/airbnb/ruby/tree/master/rubocop-airbnb

<怒られたり怒られなかったりするコード例>

# Warning Layouts/DefEndAlignment end at 6, 2 is not aligned with ApplicationController
# app/controller/some/categories_contriller.rb
class Some::CategoriesController < ApplicationController
  def show
    #..some code...
  end
end

# Not Warning Some Controller
# app/controller/some/products_controller.rb
class Some::ProductsController < ApplicationController
  SOME_CONSTANT = 10
  def show
    # ...some code...
  end
end

.rubocop.yml

inherit_from:
  - .rubocop_airbnb.yml
  - .rubocop_todo.yml

Rails:
  Enabled: true

AllCops:
  TargetRubyVersion: 2.4.1
  Exclude:
    - vendor/bundle/**/*
    - bin/*
    - db/**/*
    - config/**/*
    - Gemfile

rubocop-airbnb のDefEndAlignement の設定箇所

...
Layout/DefEndAlignment:
  Enabled: true
  EnforcedStyleAlignWith: start_of_line
  AutoCorrect: false
...

Cop 対象のコントローラー(some/categories_controller.rb) で class の直下にコードを何か挿入すると怒られなくなります。 (例えば、対象のコントローラーのように定数を入れたり、before_action など入れても怒られない)

他の挙動として

# ApplicationController がトップの定数だと明示すると怒られない
class Some::CategoriesController < ::ApplicationController
  #...
end

ここの挙動と対処の仕方がどうしても理解できず issue を立てさせていただきました。よろしくお願いします!

Gemfile.lock

rails (~> 5.1.3)

rubocop(0.57.2)
rubocop-airbnb (1.5.0)
    rubocop (= 0.57.2)
    rubocop-rspec (= 1.27.0)
rubocop-rspec (1.27.0)
    rubocop (>= 0.56.0)

ruby-version : 2.4.1p111

koic commented 6 years ago

こんにちは。 手元でいくらか試してみたのですが、再現することはできませんでした。

ちなみに RuboCop Airbnb を適用せずに、素の RuboCop だけで実行しても同様の現象が発生するでしょうか?以下のように .rubocop.yml から .rubocop_airbnb.yml を外して実行することになります。

 inherit_from:
-  - .rubocop_airbnb.yml
   - .rubocop_todo.yml
skmtpalm commented 6 years ago

早速の返信ありがとうございます! Gemfile の構成は変えずに

inherit_from:
   - .rubocop_todo.yml

として継承しないで、該当ファイルのみ実行してみた結果は変わらず Warning が出ました。

しかし、rubocop だけ 0.58.2 にアップデートして、rubocop-airbnb の 依存も外したら Warning が出なくなりました!

差分です。

#Gemfile
-  gem 'rubocop-airbnb'
+  gem 'rubocop', require: false

#Gemfile.lock
-    rubocop (0.57.2)
+    rubocop (0.58.2)
       jaro_winkler (~> 1.5.1)
       parallel (~> 1.10)
-      parser (>= 2.5)
+      parser (>= 2.5, != 2.5.1.1)
       powerpack (~> 0.1)
       rainbow (>= 2.2.2, < 4.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (~> 1.0, >= 1.0.1)
-    rubocop-airbnb (1.5.0)
-      rubocop (= 0.57.2)
-      rubocop-rspec (= 1.27.0)
-    rubocop-rspec (1.27.0)
-      rubocop (>= 0.56.0)
     ruby-graphviz (1.2.3)

それで、もう一度 rubocop-airbnb を外さず、rubocop のみアップデートして、 継承して使ってみたところ怒られなくなりました!

--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -203,7 +203,7 @@ GEM
     parallel (1.12.1)
     paranoia (2.3.1)
       activerecord (>= 4.0, < 5.2)
-    parser (2.5.1.1)
+    parser (2.5.1.2)
       ast (~> 2.4.0)
     polyamorous (1.3.1)
       activerecord (>= 3.0)
@@ -263,9 +263,8 @@ GEM
       method_source
       rake (>= 0.8.7)
       thor (>= 0.18.1, < 2.0)
-    rainbow (2.2.2)
-      rake
-    rake (12.1.0)
+    rainbow (3.0.0)
+    rake (12.3.1)
     ransack (1.8.3)
       actionpack (>= 3.0)
       activerecord (>= 3.0)

このバージョンで固定されたら 怒られなくなりました 🙏

依存している parserrainbow という gem の問題だったのでしょうか?!

どうして解決したか自分ではわからないのですが、お手間を取らせてしまってすいません!

koic commented 6 years ago

RuboCop と RuboCop Airbnb のバージョンの組み合わせが良くなかったのかもしれませんね。 もしくは最後に添付されている Gemfile.lock に Parser 2.5.1.1 とありますが、この Parser のバージョンは問題を含んでいるため修正された 2.5.1.2 が即日リリースされたという経緯があり、そちらが何か関与していたのかもしれないです。 いずれにせよ、解決されたようで良かったです ⭐️

skmtpalm commented 6 years ago

parser そういう経緯があったのですね!依存 gemのバージョンの問題に久々に出くわしました。 自分だけでは解決できませんでした。。。大変勉強になりました!ありがとうございました!