rubocop / rubocop-jp

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

ディレクトリを遡って .ruby-version ファイルを見つけて欲しい #36

Closed ybiquitous closed 6 years ago

ybiquitous commented 6 years ago

.ruby-version ファイルがあれば TargetRubyVersion が自動で設定される機能を、大変重宝してます。

が、.ruby-version ファイルが RuboCop を実行したディレクトリに存在しないと、TargetRubyVersion が設定されずに困っています。 具体的には、エディタで Ruby ファイルを編集中に RuboCop を走らせているのですが、その際にパースエラーが発生してしまいます。

.ruby-version ファイルがディレクトリに存在しない場合、ディレクトリを遡って見つけて欲しいです。

こちらにサンプルプロジェクトを用意しました。

/
- .ruby-version
- app/
  - models/
    - player.rb
$ cd app/models/
$ bundle exec rubocop player.rb
Inspecting 1 file
E

Offenses:

player.rb:13:6: E: Lint/Syntax: unexpected token error
(Using Ruby 2.1 parser; configure using TargetRubyVersion parameter, under AllCops)
    b&.strip
     ^^

1 file inspected, 1 offense detected

参考

https://github.com/bbatsov/rubocop/blob/f72860cf9f879d8ecef19b30624d777d8cc3bd80/manual/configuration.md#setting-the-target-ruby-version

pocke commented 6 years ago

フィードバックありがとうございます!

https://github.com/bbatsov/rubocop/blob/fdb936a8408f7f2192f93bf5bc1978e38c314efe/lib/rubocop/config.rb#L386

この辺で再帰的に上のディレクトリを見るようにすれば実現できそうですね。 rbenvは.ruby-versionを上のディレクトリに遡って見るようになっていますし、RuboCopも.rubocop.ymlに関しては上のディレクトリを遡って見るようになっているので、この挙動はバグだと思います。

ybiquitous commented 6 years ago

@pocke 返信遅くなってすみません 🙇 これは直接本家にプルリク送ってもいいんでしょうか? それとも、本家にも issue を作った方がいいんでしょうか?

pocke commented 6 years ago

コードを書いて頂けるのであれば、本家にそのままプルリクを送って頂けると非常にありがたいです! コードを書くのが大変そうであれば、本家のほうに英語でIssueを書いていただけるだけでも助かります。。

RuboCopは「PRの際にIssueがないとダメ」というスタイルではないので、気にせずプルリクを送ってしまって問題ないです! 議論が分かれそうなものや自分で実装するのが厳しそうなものはIssueにしてしまったほうが良いと思いますが、今回のようなケースなどでは単にPRを送ってしまって全然問題ないと思いますー

ybiquitous commented 6 years ago

本家にすでに上がっていました。issue は open のままですが、PRは非常に長い議論の末、reject されています。

ybiquitous commented 6 years ago

https://github.com/bbatsov/rubocop/pull/4186 の議論では、 .ruby-version ファイルのチェックではなく RUBY_VERSION 定数のチェックの方がいいのでは?という意見が発生し(こちらまたはこちら)、最終的には RUBY_VERSIONアイデアは却下されています。

却下の理由: /usr/bin/ruby -S rubocop というエッジケースでは、.ruby-versionRUBY_VERSION が異なるから。

ybiquitous commented 6 years ago

Submitted PR bbatsov/rubocop#5326.

pocke commented 6 years ago

4186の議論を全部読む気になれなくて全然読めていなくて申し訳ないです。。 そもそもRUBY_VERSIONを見よう、というのは間違っている(RuboCopはRuntimeのRubyのバージョンによって挙動を変えるべきではない)ので、.ruby-versionをみるので良いと思います。

PRありがとうございます!!

ybiquitous commented 6 years ago

v0.52.1 に取り込まれましたので、クローズします 🎉 😄 https://github.com/bbatsov/rubocop/releases/tag/v0.52.1

@pocke サポートありがとうございます! 🙇 👍