From 26d92ba219a28ef7d9106a03eee021532b97e663 Mon Sep 17 00:00:00 2001 From: Tejas Bubane Date: Wed, 29 Apr 2020 13:27:52 +0530 Subject: [PATCH] Fix `RSpec/ScatteredLet` to detect `let` with proc argument Closes #771 --- CHANGELOG.md | 2 ++ lib/rubocop/rspec/language/node_pattern.rb | 6 +++++- spec/rubocop/cop/rspec/scattered_let_spec.rb | 11 +++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5a0d3230..c5b4f8e51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * Add new `Capybara/VisibilityMatcher` cop. ([@aried3r][]) * Ignore String constants by `RSpec/Describe`. ([@AlexWayfer][]) * Drop support for ruby 2.3. ([@bquorning][]) +* Fix `RSpec/ScatteredLet` to detect `let` with proc argument. ([@tejasbubane][]) ## 1.38.1 (2020-02-15) @@ -497,3 +498,4 @@ Compatibility release so users can upgrade RuboCop to 0.51.0. No new features. [@eitoball]: https://github.com/eitoball [@aried3r]: https://github.com/aried3r [@AlexWayfer]: https://github.com/AlexWayfer +[@tejasbubane]: https://github.com/tejasbubane diff --git a/lib/rubocop/rspec/language/node_pattern.rb b/lib/rubocop/rspec/language/node_pattern.rb index 63378fd42..6a185b595 100644 --- a/lib/rubocop/rspec/language/node_pattern.rb +++ b/lib/rubocop/rspec/language/node_pattern.rb @@ -17,7 +17,11 @@ module NodePattern def_node_matcher :hook?, Hooks::ALL.block_pattern - def_node_matcher :let?, Helpers::ALL.block_pattern + def_node_matcher :let?, <<-PATTERN + {#{Helpers::ALL.block_pattern} + (send #{RSPEC} #{Helpers::ALL.node_pattern_union} + _ (block_pass ...))} + PATTERN def_node_matcher :subject?, Subject::ALL.block_pattern end diff --git a/spec/rubocop/cop/rspec/scattered_let_spec.rb b/spec/rubocop/cop/rspec/scattered_let_spec.rb index 09ecb4cf0..9044b5bc6 100644 --- a/spec/rubocop/cop/rspec/scattered_let_spec.rb +++ b/spec/rubocop/cop/rspec/scattered_let_spec.rb @@ -25,4 +25,15 @@ end RUBY end + + it 'flags `let` with proc argument' do + expect_offense(<<-RUBY) + RSpec.describe User do + let(:a) { a } + subject { User } + let(:user, &args[:build_user]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Group all let/let! blocks in the example group together. + end + RUBY + end end