rubocop / rubocop-jp

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

RSpec::ContextWording で 接尾辞でも設定できるようにしたい #49

Closed kyohah closed 1 year ago

kyohah commented 5 years ago

https://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/ContextWording

# Overview
`context` block descriptions should start with 'when', or 'with'.

Prefixes:
  - when
  - with
  - without
  - if

現状Prefixesしか設定できず、 日本語でrspecを書く場合

context '画面に表示されていないとき'
context '画面に表示されていない場合'

のようにとき場合などのSuffixesの設定ができるようにしたいと思いました。

実装してPRを出そうとしたのですが、 RSpec::ContextWordingの条件の部分は

desctiprion # 'with metadata hash'
prefixes # ['when', 'with']
def bad_prefix?(description)
  !prefixes.include?(description.split.first)
end

https://github.com/rubocop-hq/rubocop-rspec/blob/0442757fb4af570994b37b3e0ca35baeec635eb0/lib/rubocop/cop/rspec/context_wording.rb#L45

desctiprion画面に表示されていない場合のような日本語はsplitできません。

pocke commented 5 years ago

Suffixes を指定できるようにするのは良いと思います。その場合「Prefixesにマッチしない」かつ「Suffixesにマッチしない」時に警告を出すのが合理的なように思います。

desctiprion画面に表示されていない場合のような日本語はsplitできません。

これはちょっと厄介ですね。。実装するとしたら、

のどちらかになるかなと思います。

機能自体はreasonableなので受け入れられると思います。日本語の説明をするのがちょっと厄介ですが…。

英語を書くのが手間でなかったら、rubocop-rspecの方にIssueを立ててもらうことはできますか? 実装方法に選択肢があるので、他の人の意見もきいてみたいです。

pocke commented 5 years ago

FYIですが、querlyというツールを使うと同様のチェックをすることができます。 https://github.com/soutaro/querly

次のYAMLをquerly.ymlとして保存して、querly checkコマンドを実行するとチェックできます。

rules:
  - id: ja.rspec.context_warding
    pattern:
      - subject: "context(!:string: as 'sentence, ...)"
        where:
          sentence:
            - /場合$/
            - /とき$/
      - subject: "describe(!:string: as 'sentence, ...)"
        where:
          sentence:
            - /場合$/
            - /とき$/
    message: 'RSpecのcontext、describeの説明文は「場合」もしくは「とき」で終わる必要があります'
    examples:
      - before: 'context "画面に表示されていない" do; end'
        after: 'context "画面に表示されていないとき" do; end'
      - before: 'describe "画面に表示されていない" do; end'
        after: 'describe "画面に表示されていない場合" do; end'
check:
  - path: /spec
    rules:
      - ja.rspec.context_warding

追記: あ、このパターンだとdescribe SomeClassNameにも警告が出てしまう気がしますね。ちゃんと使うにはその辺を調整したほうが良さそう

kyohah commented 5 years ago

@pocke すみません英語を書くのがすごい苦手で、場合ときという日本語を英語で説明するのは自分には難しいです。 代わりに投稿していただけるとすごい助かります 🙇

pocke commented 5 years ago

https://github.com/rubocop-hq/rubocop-rspec/issues/745 Issueにあげてみました!

ken1flan commented 4 years ago

こんな感じで作ってみようと思うのですが…どうでしょう…。 (これはメモ用に自分のフォークしたリポジトリに対して作ったものです。) https://github.com/ken1flan/rubocop-rspec/pull/1

koic commented 4 years ago

@ken1flan 私の方ですと RuboCop RSpec はあまり見れていないので、PR を開いて RuboCop RSpec チームにレビューをしてもらうのが良さそうです。

^if, ^unless, ^for, ^before, ^after, or ^during

^ より \A の方が適しているかもしれません。

\Aif, \Aunless, \Afor, \Abefore, \Aafter, or \Aduring

koic commented 1 year ago

745 が解決されているためクローズします。