@@ -11,46 +11,68 @@ module OverrideHooksMethods
11
11
alias_method :old_hooks , :hooks
12
12
13
13
def hooks
14
- if @__hooks . nil?
15
- old = old_hooks
16
- @__hooks ||= OverridenHookCollections . new ( old . instance_variable_get ( :@owner ) , old . instance_variable_get ( :@data ) )
17
- [ :before , :after ] . each { |scope |
18
- @__hooks [ scope ] [ :step ] = HookCollection . new
19
- }
20
- end
21
- @__hooks
14
+ @__hooks ||= OverridenHookCollections . new ( self , RSpec ::Core ::FilterableItemRepository ::UpdateOptimized )
22
15
end
23
16
24
17
private
25
18
26
19
class OverridenHookCollections < RSpec ::Core ::Hooks ::HookCollections
27
- private
20
+ def initialize ( *args )
21
+ super
22
+ @before_step_hooks = nil
23
+ @after_step_hooks = nil
24
+ end
28
25
29
- SCOPES = [ :example , :context , :suite , :step ]
30
26
31
- def before_step_hooks_for ( example )
32
- RSpec ::Core ::Hooks ::HookCollection . new ( RSpec ::Core ::FlatMap . flat_map ( @owner . parent_groups . reverse ) do |a |
33
- a . hooks [ :before ] [ :step ]
34
- end ) . for ( example )
27
+ def run ( position , scope , example_or_group )
28
+ if scope == :step
29
+ run_owned_hooks_for ( position , scope , example_or_group )
30
+ else
31
+ super
32
+ end
35
33
end
36
34
37
- def after_step_hooks_for ( example )
38
- RSpec ::Core ::Hooks ::HookCollection . new ( RSpec ::Core ::FlatMap . flat_map ( @owner . parent_groups ) do |a |
39
- a . hooks [ :after ] [ :step ]
40
- end ) . for ( example )
35
+ protected
36
+
37
+ # TODO: This code is highly related to the RSpec internals.
38
+ # It should be supported with every new RSpec version
39
+ def matching_hooks_for ( position , scope , example_or_group )
40
+ if scope == :step
41
+ repo = hooks_for ( position , scope ) || example_or_group . example_group . hooks . hooks_for ( position , scope )
42
+ metadata = case example_or_group
43
+ when RSpec ::Core ::ExampleGroup then
44
+ example_or_group . class . metadata
45
+ else
46
+ example_or_group . metadata
47
+ end
48
+ repo . nil? ? EMPTY_HOOK_ARRAY : repo . items_for ( metadata )
49
+ else
50
+ super
51
+ end
41
52
end
42
53
43
- def find_hook ( hook , scope , example_or_group , initial_procsy )
44
- case [ hook , scope ]
45
- when [ :before , :step ]
46
- before_step_hooks_for ( example_or_group )
47
- when [ :after , :step ]
48
- after_step_hooks_for ( example_or_group )
54
+ def hooks_for ( position , scope )
55
+ if scope == :step
56
+ position == :before ? @before_step_hooks : @after_step_hooks
57
+ else
58
+ super
59
+ end
60
+ end
61
+
62
+ def ensure_hooks_initialized_for ( position , scope )
63
+ if scope == :step
64
+ if position == :before
65
+ @before_step_hooks ||= @filterable_item_repo_class . new ( :all? )
49
66
else
50
- super ( hook , scope , example_or_group , initial_procsy )
67
+ @after_step_hooks ||= @filterable_item_repo_class . new ( :all? )
68
+ end
69
+ else
70
+ super
51
71
end
52
72
end
53
73
74
+ SCOPES = [ :example , :context , :step ]
75
+
54
76
def known_scope? ( scope )
55
77
SCOPES . include? ( scope ) || super ( scope )
56
78
end
0 commit comments