@@ -8,6 +8,7 @@ module RSpec
88 # Unify `before` and `after` hooks when possible.
99 # However, `around` hooks are allowed to be defined multiple times,
1010 # as unifying them would typically make the code harder to read.
11+ # Hooks defined in class methods are also ignored.
1112 #
1213 # @example
1314 # # bad
@@ -30,6 +31,14 @@ module RSpec
3031 # around { |example| before2; example.call; after2 }
3132 # end
3233 #
34+ # # good
35+ # describe Foo do
36+ # before { setup1 }
37+ # def self.setup
38+ # before { setup2 }
39+ # end
40+ # end
41+ #
3342 class ScatteredSetup < Base
3443 include FinalEndLocation
3544 include RangeHelp
@@ -56,7 +65,7 @@ def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
5665 def repeated_hooks ( node )
5766 hooks = RuboCop ::RSpec ::ExampleGroup . new ( node )
5867 . hooks
59- . select { |hook | hook . knowable_scope? && hook . name != :around }
68+ . select { |hook | repeated_hook? ( hook ) }
6069 . group_by { |hook | [ hook . name , hook . scope , hook . metadata ] }
6170 . values
6271 . reject ( &:one? )
@@ -94,6 +103,12 @@ def autocorrect(corrector, first_occurrence, occurrence)
94103 corrector . remove ( range_by_whole_lines ( occurrence . source_range ,
95104 include_final_newline : true ) )
96105 end
106+
107+ def repeated_hook? ( hook )
108+ hook . knowable_scope? &&
109+ hook . name != :around &&
110+ !hook . inside_class_method?
111+ end
97112 end
98113 end
99114 end
0 commit comments