rubocop-rspec 1.40.0 → 1.43.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +37 -0
  3. data/CODE_OF_CONDUCT.md +17 -0
  4. data/config/default.yml +12 -2
  5. data/lib/rubocop-rspec.rb +3 -1
  6. data/lib/rubocop/cop/rspec/align_left_let_brace.rb +12 -19
  7. data/lib/rubocop/cop/rspec/align_right_let_brace.rb +12 -19
  8. data/lib/rubocop/cop/rspec/any_instance.rb +1 -1
  9. data/lib/rubocop/cop/rspec/around_block.rb +1 -1
  10. data/lib/rubocop/cop/rspec/base.rb +74 -0
  11. data/lib/rubocop/cop/rspec/be.rb +2 -2
  12. data/lib/rubocop/cop/rspec/be_eql.rb +6 -6
  13. data/lib/rubocop/cop/rspec/before_after_all.rb +1 -1
  14. data/lib/rubocop/cop/rspec/capybara/current_path_expectation.rb +19 -17
  15. data/lib/rubocop/cop/rspec/capybara/feature_methods.rb +14 -12
  16. data/lib/rubocop/cop/rspec/capybara/visibility_matcher.rb +1 -1
  17. data/lib/rubocop/cop/rspec/context_method.rb +7 -9
  18. data/lib/rubocop/cop/rspec/context_wording.rb +3 -3
  19. data/lib/rubocop/cop/rspec/cop.rb +2 -66
  20. data/lib/rubocop/cop/rspec/describe_class.rb +20 -27
  21. data/lib/rubocop/cop/rspec/describe_method.rb +14 -6
  22. data/lib/rubocop/cop/rspec/describe_symbol.rb +2 -2
  23. data/lib/rubocop/cop/rspec/described_class.rb +12 -9
  24. data/lib/rubocop/cop/rspec/described_class_module_wrapping.rb +1 -1
  25. data/lib/rubocop/cop/rspec/dialect.rb +5 -12
  26. data/lib/rubocop/cop/rspec/empty_example_group.rb +91 -7
  27. data/lib/rubocop/cop/rspec/empty_hook.rb +6 -10
  28. data/lib/rubocop/cop/rspec/empty_line_after_example.rb +5 -7
  29. data/lib/rubocop/cop/rspec/empty_line_after_example_group.rb +5 -9
  30. data/lib/rubocop/cop/rspec/empty_line_after_final_let.rb +8 -8
  31. data/lib/rubocop/cop/rspec/empty_line_after_hook.rb +5 -9
  32. data/lib/rubocop/cop/rspec/empty_line_after_subject.rb +6 -6
  33. data/lib/rubocop/cop/rspec/example_length.rb +1 -1
  34. data/lib/rubocop/cop/rspec/example_without_description.rb +1 -1
  35. data/lib/rubocop/cop/rspec/example_wording.rb +10 -11
  36. data/lib/rubocop/cop/rspec/expect_actual.rb +8 -11
  37. data/lib/rubocop/cop/rspec/expect_change.rb +10 -35
  38. data/lib/rubocop/cop/rspec/expect_in_hook.rb +3 -3
  39. data/lib/rubocop/cop/rspec/expect_output.rb +2 -2
  40. data/lib/rubocop/cop/rspec/factory_bot/attribute_defined_statically.rb +24 -21
  41. data/lib/rubocop/cop/rspec/factory_bot/create_list.rb +20 -22
  42. data/lib/rubocop/cop/rspec/factory_bot/factory_class_name.rb +7 -8
  43. data/lib/rubocop/cop/rspec/file_path.rb +25 -17
  44. data/lib/rubocop/cop/rspec/focus.rb +7 -11
  45. data/lib/rubocop/cop/rspec/hook_argument.rb +16 -23
  46. data/lib/rubocop/cop/rspec/hooks_before_examples.rb +13 -14
  47. data/lib/rubocop/cop/rspec/implicit_block_expectation.rb +1 -1
  48. data/lib/rubocop/cop/rspec/implicit_expect.rb +7 -15
  49. data/lib/rubocop/cop/rspec/implicit_subject.rb +16 -11
  50. data/lib/rubocop/cop/rspec/instance_spy.rb +18 -12
  51. data/lib/rubocop/cop/rspec/instance_variable.rb +4 -8
  52. data/lib/rubocop/cop/rspec/invalid_predicate_matcher.rb +3 -6
  53. data/lib/rubocop/cop/rspec/it_behaves_like.rb +5 -6
  54. data/lib/rubocop/cop/rspec/iterated_expectation.rb +1 -1
  55. data/lib/rubocop/cop/rspec/leading_subject.rb +27 -20
  56. data/lib/rubocop/cop/rspec/leaky_constant_declaration.rb +2 -5
  57. data/lib/rubocop/cop/rspec/let_before_examples.rb +13 -11
  58. data/lib/rubocop/cop/rspec/let_setup.rb +21 -6
  59. data/lib/rubocop/cop/rspec/message_chain.rb +7 -6
  60. data/lib/rubocop/cop/rspec/message_expectation.rb +2 -2
  61. data/lib/rubocop/cop/rspec/message_spies.rb +2 -3
  62. data/lib/rubocop/cop/rspec/missing_example_group_argument.rb +1 -1
  63. data/lib/rubocop/cop/rspec/multiple_describes.rb +11 -8
  64. data/lib/rubocop/cop/rspec/multiple_expectations.rb +7 -11
  65. data/lib/rubocop/cop/rspec/multiple_memoized_helpers.rb +148 -0
  66. data/lib/rubocop/cop/rspec/multiple_subjects.rb +18 -19
  67. data/lib/rubocop/cop/rspec/named_subject.rb +2 -2
  68. data/lib/rubocop/cop/rspec/nested_groups.rb +12 -13
  69. data/lib/rubocop/cop/rspec/not_to_not.rb +5 -6
  70. data/lib/rubocop/cop/rspec/overwriting_setup.rb +1 -1
  71. data/lib/rubocop/cop/rspec/pending.rb +1 -1
  72. data/lib/rubocop/cop/rspec/predicate_matcher.rb +32 -69
  73. data/lib/rubocop/cop/rspec/rails/http_status.rb +5 -9
  74. data/lib/rubocop/cop/rspec/receive_counts.rb +15 -17
  75. data/lib/rubocop/cop/rspec/receive_never.rb +12 -12
  76. data/lib/rubocop/cop/rspec/repeated_description.rb +1 -1
  77. data/lib/rubocop/cop/rspec/repeated_example.rb +2 -2
  78. data/lib/rubocop/cop/rspec/repeated_example_group_body.rb +1 -1
  79. data/lib/rubocop/cop/rspec/repeated_example_group_description.rb +1 -1
  80. data/lib/rubocop/cop/rspec/return_from_stub.rb +12 -22
  81. data/lib/rubocop/cop/rspec/scattered_let.rb +8 -11
  82. data/lib/rubocop/cop/rspec/scattered_setup.rb +1 -1
  83. data/lib/rubocop/cop/rspec/shared_context.rb +8 -21
  84. data/lib/rubocop/cop/rspec/shared_examples.rb +6 -9
  85. data/lib/rubocop/cop/rspec/single_argument_message_chain.rb +15 -18
  86. data/lib/rubocop/cop/rspec/subject_stub.rb +5 -11
  87. data/lib/rubocop/cop/rspec/unspecified_exception.rb +1 -1
  88. data/lib/rubocop/cop/rspec/variable_definition.rb +6 -6
  89. data/lib/rubocop/cop/rspec/variable_name.rb +28 -9
  90. data/lib/rubocop/cop/rspec/verified_doubles.rb +1 -1
  91. data/lib/rubocop/cop/rspec/void_expect.rb +1 -1
  92. data/lib/rubocop/cop/rspec/yield.rb +14 -11
  93. data/lib/rubocop/cop/rspec_cops.rb +1 -0
  94. data/lib/rubocop/rspec/corrector/move_node.rb +7 -5
  95. data/lib/rubocop/rspec/description_extractor.rb +1 -1
  96. data/lib/rubocop/rspec/{blank_line_separation.rb → empty_line_separation.rb} +13 -10
  97. data/lib/rubocop/rspec/example_group.rb +21 -49
  98. data/lib/rubocop/rspec/factory_bot.rb +7 -1
  99. data/lib/rubocop/rspec/language.rb +6 -4
  100. data/lib/rubocop/rspec/language/node_pattern.rb +10 -1
  101. data/lib/rubocop/rspec/top_level_describe.rb +2 -2
  102. data/lib/rubocop/rspec/top_level_group.rb +57 -0
  103. data/lib/rubocop/rspec/variable.rb +1 -1
  104. data/lib/rubocop/rspec/version.rb +1 -1
  105. metadata +29 -11
@@ -21,7 +21,9 @@ module RuboCop
21
21
  # end
22
22
  # end
23
23
  #
24
- class SubjectStub < Cop
24
+ class SubjectStub < Base
25
+ include RuboCop::RSpec::TopLevelGroup
26
+
25
27
  MSG = 'Do not stub methods of the object under test.'
26
28
 
27
29
  # @!method subject(node)
@@ -37,7 +39,7 @@ module RuboCop
37
39
  # name # => :thing
38
40
  # end
39
41
  #
40
- # @param node [RuboCop::Node]
42
+ # @param node [RuboCop::AST::Node]
41
43
  #
42
44
  # @yield [Symbol] subject name
43
45
  def_node_matcher :subject, <<-PATTERN
@@ -75,11 +77,7 @@ module RuboCop
75
77
  } ...)
76
78
  PATTERN
77
79
 
78
- def on_block(node)
79
- return unless example_group?(node)
80
- return if (processed_example_groups & node.ancestors).any?
81
-
82
- processed_example_groups << node
80
+ def on_top_level_group(node)
83
81
  @explicit_subjects = find_all_explicit_subjects(node)
84
82
 
85
83
  find_subject_expectations(node) do |stub|
@@ -89,10 +87,6 @@ module RuboCop
89
87
 
90
88
  private
91
89
 
92
- def processed_example_groups
93
- @processed_example_groups ||= Set.new
94
- end
95
-
96
90
  def find_all_explicit_subjects(node)
97
91
  node.each_descendant(:block).with_object({}) do |child, h|
98
92
  name = subject(child)
@@ -30,7 +30,7 @@ module RuboCop
30
30
  # }.to raise_error(/err/)
31
31
  #
32
32
  # expect { do_something }.not_to raise_error
33
- class UnspecifiedException < Cop
33
+ class UnspecifiedException < Base
34
34
  MSG = 'Specify the exception being captured'
35
35
 
36
36
  def_node_matcher :empty_raise_error_or_exception, <<-PATTERN
@@ -7,22 +7,22 @@ module RuboCop
7
7
  #
8
8
  # @example EnforcedStyle: symbols (default)
9
9
  # # bad
10
- # let('user_name') { 'Adam' }
11
10
  # subject('user') { create_user }
11
+ # let('user_name') { 'Adam' }
12
12
  #
13
13
  # # good
14
- # let(:user_name) { 'Adam' }
15
14
  # subject(:user) { create_user }
15
+ # let(:user_name) { 'Adam' }
16
16
  #
17
17
  # @example EnforcedStyle: strings
18
18
  # # bad
19
- # let(:user_name) { 'Adam' }
20
19
  # subject(:user) { create_user }
20
+ # let(:user_name) { 'Adam' }
21
21
  #
22
22
  # # good
23
- # let('user_name') { 'Adam' }
24
23
  # subject('user') { create_user }
25
- class VariableDefinition < Cop
24
+ # let('user_name') { 'Adam' }
25
+ class VariableDefinition < Base
26
26
  include ConfigurableEnforcedStyle
27
27
  include RuboCop::RSpec::Variable
28
28
 
@@ -44,7 +44,7 @@ module RuboCop
44
44
  end
45
45
 
46
46
  def string?(node)
47
- node.str_type? || node.dstr_type?
47
+ node.str_type?
48
48
  end
49
49
 
50
50
  def symbol?(node)
@@ -5,25 +5,43 @@ module RuboCop
5
5
  module RSpec
6
6
  # Checks that memoized helper names use the configured style.
7
7
  #
8
+ # Variables can be excluded from checking using the `IgnoredPatterns`
9
+ # option.
10
+ #
8
11
  # @example EnforcedStyle: snake_case (default)
9
12
  # # bad
10
- # let(:userName) { 'Adam' }
11
- # subject(:userName) { 'Adam' }
13
+ # subject(:userName1) { 'Adam' }
14
+ # let(:userName2) { 'Adam' }
12
15
  #
13
16
  # # good
14
- # let(:user_name) { 'Adam' }
15
- # subject(:user_name) { 'Adam' }
17
+ # subject(:user_name_1) { 'Adam' }
18
+ # let(:user_name_2) { 'Adam' }
16
19
  #
17
20
  # @example EnforcedStyle: camelCase
18
21
  # # bad
19
- # let(:user_name) { 'Adam' }
20
- # subject(:user_name) { 'Adam' }
22
+ # subject(:user_name_1) { 'Adam' }
23
+ # let(:user_name_2) { 'Adam' }
21
24
  #
22
25
  # # good
23
- # let(:userName) { 'Adam' }
24
- # subject(:userName) { 'Adam' }
25
- class VariableName < Cop
26
+ # subject(:userName1) { 'Adam' }
27
+ # let(:userName2) { 'Adam' }
28
+ #
29
+ # @example IgnoredPatterns configuration
30
+ #
31
+ # # rubocop.yml
32
+ # # RSpec/VariableName:
33
+ # # EnforcedStyle: snake_case
34
+ # # IgnoredPatterns:
35
+ # # - ^userFood
36
+ #
37
+ # @example
38
+ # # okay because it matches the `^userFood` regex in `IgnoredPatterns`
39
+ # subject(:userFood_1) { 'spaghetti' }
40
+ # let(:userFood_2) { 'fettuccine' }
41
+ #
42
+ class VariableName < Base
26
43
  include ConfigurableNaming
44
+ include IgnoredPattern
27
45
  include RuboCop::RSpec::Variable
28
46
 
29
47
  MSG = 'Use %<style>s for variable names.'
@@ -31,6 +49,7 @@ module RuboCop
31
49
  def on_send(node)
32
50
  variable_definition?(node) do |variable|
33
51
  return if variable.dstr_type? || variable.dsym_type?
52
+ return if matches_ignored_pattern?(variable.value)
34
53
 
35
54
  check_name(node, variable.value, variable.loc.expression)
36
55
  end
@@ -22,7 +22,7 @@ module RuboCop
22
22
  # let(:foo) do
23
23
  # instance_double("ClassName", method_name: 'returned value')
24
24
  # end
25
- class VerifiedDoubles < Cop
25
+ class VerifiedDoubles < Base
26
26
  MSG = 'Prefer using verifying doubles over normal doubles.'
27
27
 
28
28
  def_node_matcher :unverified_double, <<-PATTERN
@@ -11,7 +11,7 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # expect(something).to be(1)
14
- class VoidExpect < Cop
14
+ class VoidExpect < Base
15
15
  MSG = 'Do not use `expect()` without `.to` or `.not_to`. ' \
16
16
  'Chain the methods or remove it.'
17
17
 
@@ -11,7 +11,8 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # expect(foo).to be(:bar).and_yield(1)
14
- class Yield < Cop
14
+ class Yield < Base
15
+ extend AutoCorrector
15
16
  include RangeHelp
16
17
 
17
18
  MSG = 'Use `.and_yield`.'
@@ -27,22 +28,24 @@ module RuboCop
27
28
 
28
29
  block_arg(node.arguments) do |block|
29
30
  if calling_block?(node.body, block)
30
- add_offense(node, location: block_range(node))
31
- end
32
- end
33
- end
31
+ range = block_range(node)
34
32
 
35
- def autocorrect(node)
36
- lambda do |corrector|
37
- node_range = range_with_surrounding_space(
38
- range: block_range(node), side: :left
39
- )
40
- corrector.replace(node_range, generate_replacement(node.body))
33
+ add_offense(range) do |corrector|
34
+ autocorrect(corrector, node, range)
35
+ end
36
+ end
41
37
  end
42
38
  end
43
39
 
44
40
  private
45
41
 
42
+ def autocorrect(corrector, node, range)
43
+ corrector.replace(
44
+ range_with_surrounding_space(range: range, side: :left),
45
+ generate_replacement(node.body)
46
+ )
47
+ end
48
+
46
49
  def calling_block?(node, block)
47
50
  if node.begin_type?
48
51
  node.each_child_node.all? { |child| block_call?(child, block) }
@@ -65,6 +65,7 @@ require_relative 'rspec/message_spies'
65
65
  require_relative 'rspec/missing_example_group_argument'
66
66
  require_relative 'rspec/multiple_describes'
67
67
  require_relative 'rspec/multiple_expectations'
68
+ require_relative 'rspec/multiple_memoized_helpers'
68
69
  require_relative 'rspec/multiple_subjects'
69
70
  require_relative 'rspec/named_subject'
70
71
  require_relative 'rspec/nested_groups'
@@ -16,19 +16,21 @@ module RuboCop
16
16
  @processed_source = processed_source # used by RangeHelp
17
17
  end
18
18
 
19
- def move_before(other) # rubocop:disable Metrics/AbcSize
19
+ def move_before(other)
20
20
  position = other.loc.expression
21
- indent = "\n" + ' ' * other.loc.column
21
+ indent = ' ' * other.loc.column
22
+ newline_indent = "\n#{indent}"
22
23
 
23
- corrector.insert_before(position, source(original) + indent)
24
+ corrector.insert_before(position, source(original) + newline_indent)
24
25
  corrector.remove(node_range_with_surrounding_space(original))
25
26
  end
26
27
 
27
28
  def move_after(other)
28
29
  position = final_end_location(other)
29
- indent = "\n" + ' ' * other.loc.column
30
+ indent = ' ' * other.loc.column
31
+ newline_indent = "\n#{indent}"
30
32
 
31
- corrector.insert_after(position, indent + source(original))
33
+ corrector.insert_after(position, newline_indent + source(original))
32
34
  corrector.remove(node_range_with_surrounding_space(original))
33
35
  end
34
36
 
@@ -21,7 +21,7 @@ module RuboCop
21
21
 
22
22
  # Decorator of a YARD code object for working with documented rspec cops
23
23
  class CodeObject
24
- COP_CLASS_NAME = 'RuboCop::Cop::RSpec::Cop'
24
+ COP_CLASS_NAME = 'RuboCop::Cop::RSpec::Base'
25
25
  RSPEC_NAMESPACE = 'RuboCop::Cop::RSpec'
26
26
 
27
27
  def initialize(yardoc)
@@ -2,12 +2,23 @@
2
2
 
3
3
  module RuboCop
4
4
  module RSpec
5
- # Helps determine the offending location if there is not a blank line
5
+ # Helps determine the offending location if there is not an empty line
6
6
  # following the node. Allows comments to follow directly after.
7
- module BlankLineSeparation
7
+ module EmptyLineSeparation
8
8
  include FinalEndLocation
9
9
  include RuboCop::Cop::RangeHelp
10
10
 
11
+ def missing_separating_line_offense(node)
12
+ return if last_child?(node)
13
+
14
+ missing_separating_line(node) do |location|
15
+ msg = yield(node.method_name)
16
+ add_offense(location, message: msg) do |corrector|
17
+ corrector.insert_after(location.end, "\n")
18
+ end
19
+ end
20
+ end
21
+
11
22
  def missing_separating_line(node)
12
23
  line = final_end_location(node).line
13
24
 
@@ -32,14 +43,6 @@ module RuboCop
32
43
 
33
44
  node.equal?(node.parent.children.last)
34
45
  end
35
-
36
- def autocorrect(node)
37
- lambda do |corrector|
38
- missing_separating_line(node) do |location|
39
- corrector.insert_after(location.end, "\n")
40
- end
41
- end
42
- end
43
46
  end
44
47
  end
45
48
  end
@@ -14,72 +14,44 @@ module RuboCop
14
14
  ExampleGroups::ALL + SharedGroups::ALL + Includes::ALL
15
15
  ).block_pattern
16
16
 
17
+ def lets
18
+ find_all_in_scope(node, :let?)
19
+ end
20
+
17
21
  def subjects
18
- subjects_in_scope(node)
22
+ find_all_in_scope(node, :subject?)
19
23
  end
20
24
 
21
25
  def examples
22
- examples_in_scope(node).map(&Example.public_method(:new))
26
+ find_all_in_scope(node, :example?).map(&Example.public_method(:new))
23
27
  end
24
28
 
25
29
  def hooks
26
- hooks_in_scope(node).map(&Hook.public_method(:new))
30
+ find_all_in_scope(node, :hook?).map(&Hook.public_method(:new))
27
31
  end
28
32
 
29
33
  private
30
34
 
31
- def subjects_in_scope(node)
32
- node.each_child_node.flat_map do |child|
33
- find_subjects(child)
34
- end
35
- end
36
-
37
- def find_subjects(node)
38
- return [] if scope_change?(node)
39
-
40
- if subject?(node)
41
- [node]
42
- else
43
- subjects_in_scope(node)
44
- end
45
- end
46
-
47
- def hooks_in_scope(node)
48
- node.each_child_node.flat_map do |child|
49
- find_hooks(child)
50
- end
51
- end
52
-
53
- def find_hooks(node)
54
- return [] if scope_change?(node) || example?(node)
55
-
56
- if hook?(node)
57
- [node]
58
- else
59
- hooks_in_scope(node)
60
- end
61
- end
62
-
63
- def examples_in_scope(node, &blk)
64
- node.each_child_node.flat_map do |child|
65
- find_examples(child, &blk)
66
- end
67
- end
68
-
69
- # Recursively search for examples within the current scope
35
+ # Recursively search for predicate within the current scope
70
36
  #
71
- # Searches node for examples and halts when a scope change is detected
37
+ # Searches node and halts when a scope change is detected
72
38
  #
73
- # @param node [RuboCop::Node] node to recursively search for examples
39
+ # @param node [RuboCop::AST::Node] node to recursively search
74
40
  #
75
- # @return [Array<RuboCop::Node>] discovered example nodes
76
- def find_examples(node)
77
- return [] if scope_change?(node)
41
+ # @return [Array<RuboCop::AST::Node>] discovered nodes
42
+ def find_all_in_scope(node, predicate)
43
+ node.each_child_node.flat_map do |child|
44
+ find_all(child, predicate)
45
+ end
46
+ end
78
47
 
79
- if example?(node)
48
+ def find_all(node, predicate)
49
+ if public_send(predicate, node)
80
50
  [node]
51
+ elsif scope_change?(node) || example?(node)
52
+ []
81
53
  else
82
- examples_in_scope(node)
54
+ find_all_in_scope(node, predicate)
83
55
  end
84
56
  end
85
57
  end
@@ -4,7 +4,13 @@ module RuboCop
4
4
  module RSpec
5
5
  # RuboCop FactoryBot project namespace
6
6
  module FactoryBot
7
- ATTRIBUTE_DEFINING_METHODS = %i[factory trait transient ignore].freeze
7
+ ATTRIBUTE_DEFINING_METHODS = %i[
8
+ factory
9
+ ignore
10
+ trait
11
+ traits_for_enum
12
+ transient
13
+ ].freeze
8
14
 
9
15
  UNPROXIED_METHODS = %i[
10
16
  __send__
@@ -4,8 +4,6 @@ module RuboCop
4
4
  module RSpec
5
5
  # RSpec public API methods that are commonly used in cops
6
6
  module Language
7
- RSPEC = '{(const {nil? cbase} :RSpec) nil?}'
8
-
9
7
  # Set of method selectors
10
8
  class SelectorSet
11
9
  def initialize(selectors)
@@ -29,7 +27,7 @@ module RuboCop
29
27
  end
30
28
 
31
29
  def block_pass_pattern
32
- "(send #{RSPEC} #{node_pattern_union} _ block_pass)"
30
+ "(send #rspec? #{node_pattern_union} _ block_pass)"
33
31
  end
34
32
 
35
33
  def block_or_block_pass_pattern
@@ -37,7 +35,11 @@ module RuboCop
37
35
  end
38
36
 
39
37
  def send_pattern
40
- "(send #{RSPEC} #{node_pattern_union} ...)"
38
+ "(send #rspec? #{node_pattern_union} ...)"
39
+ end
40
+
41
+ def send_or_block_or_block_pass_pattern
42
+ "{#{send_pattern} #{block_pattern} #{block_pass_pattern}}"
41
43
  end
42
44
 
43
45
  def node_pattern_union
@@ -7,10 +7,16 @@ module RuboCop
7
7
  module NodePattern
8
8
  extend RuboCop::NodePattern::Macros
9
9
 
10
+ def_node_matcher :rspec?, '{(const {nil? cbase} :RSpec) nil?}'
11
+
10
12
  def_node_matcher :example_group?, ExampleGroups::ALL.block_pattern
13
+ def_node_matcher :shared_group?, SharedGroups::ALL.block_pattern
14
+
15
+ spec_groups = ExampleGroups::ALL + SharedGroups::ALL
16
+ def_node_matcher :spec_group?, spec_groups.block_pattern
11
17
 
12
18
  def_node_matcher :example_group_with_body?, <<-PATTERN
13
- (block #{ExampleGroups::ALL.send_pattern} args [!nil?])
19
+ (block #{ExampleGroups::ALL.send_pattern} args !nil?)
14
20
  PATTERN
15
21
 
16
22
  def_node_matcher :example?, Examples::ALL.block_pattern
@@ -19,6 +25,9 @@ module RuboCop
19
25
 
20
26
  def_node_matcher :let?, Helpers::ALL.block_or_block_pass_pattern
21
27
 
28
+ def_node_matcher :include?,
29
+ Includes::ALL.send_or_block_or_block_pass_pattern
30
+
22
31
  def_node_matcher :subject?, Subject::ALL.block_pattern
23
32
  end
24
33
  end