Class: ActiveSupport::ExecutionWrapper
- Includes:
- Callbacks
- Defined in:
- lib/active_support/execution_wrapper.rb
Defined Under Namespace
Classes: CompleteHook, RunHook
Constant Summary collapse
- Null =
:nodoc:
Object.new
Constants included from Callbacks
Callbacks::CALLBACK_FILTER_TYPES
Class Method Summary collapse
-
.active? ⇒ Boolean
:nodoc:.
-
.active_key ⇒ Object
:nodoc:.
-
.error_reporter ⇒ Object
:nodoc:.
-
.perform ⇒ Object
:nodoc:.
-
.register_hook(hook, outer: false) ⇒ Object
Register an object to be invoked during both the
run
andcomplete
steps. -
.run!(reset: false) ⇒ Object
Run this execution.
- .to_complete(*args, &block) ⇒ Object
- .to_run(*args, &block) ⇒ Object
-
.wrap(source: "application.active_support") ⇒ Object
Perform the work in the supplied block as an execution.
Instance Method Summary collapse
-
#complete ⇒ Object
:nodoc:.
-
#complete! ⇒ Object
Complete this in-flight execution.
-
#run ⇒ Object
:nodoc:.
-
#run! ⇒ Object
:nodoc:.
Methods included from Callbacks
Methods included from Concern
#append_features, #class_methods, extended, #included, #prepend_features, #prepended
Class Method Details
.active? ⇒ Boolean
:nodoc:
118 119 120 |
# File 'lib/active_support/execution_wrapper.rb', line 118 def self.active? # :nodoc: IsolatedExecutionState.key?(active_key) end |
.active_key ⇒ Object
:nodoc:
114 115 116 |
# File 'lib/active_support/execution_wrapper.rb', line 114 def self.active_key # :nodoc: @active_key ||= :"active_execution_wrapper_#{object_id}" end |
.error_reporter ⇒ Object
:nodoc:
110 111 112 |
# File 'lib/active_support/execution_wrapper.rb', line 110 def self.error_reporter # :nodoc: ActiveSupport.error_reporter end |
.perform ⇒ Object
:nodoc:
100 101 102 103 104 105 106 107 108 |
# File 'lib/active_support/execution_wrapper.rb', line 100 def self.perform # :nodoc: instance = new instance.run begin yield ensure instance.complete end end |
.register_hook(hook, outer: false) ⇒ Object
Register an object to be invoked during both the run
and complete
steps.
hook.complete
will be passed the value returned from hook.run
, and will only be invoked if run
has previously been called. (Mostly, this means it won’t be invoked if an exception occurs in a preceding to_run
block; all ordinary to_complete
blocks are invoked in that situation.)
50 51 52 53 54 55 56 57 58 |
# File 'lib/active_support/execution_wrapper.rb', line 50 def self.register_hook(hook, outer: false) if outer to_run RunHook.new(hook), prepend: true to_complete :after, CompleteHook.new(hook) else to_run RunHook.new(hook) to_complete CompleteHook.new(hook) end end |
.run!(reset: false) ⇒ Object
Run this execution.
Returns an instance, whose complete!
method must be invoked after the work has been performed.
Where possible, prefer wrap
.
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/active_support/execution_wrapper.rb', line 66 def self.run!(reset: false) if reset lost_instance = IsolatedExecutionState.delete(active_key) lost_instance&.complete! else return Null if active? end new.tap do |instance| success = nil begin instance.run! success = true ensure instance.complete! unless success end end end |
.to_complete(*args, &block) ⇒ Object
21 22 23 |
# File 'lib/active_support/execution_wrapper.rb', line 21 def self.to_complete(*args, &block) set_callback(:complete, *args, &block) end |
.to_run(*args, &block) ⇒ Object
17 18 19 |
# File 'lib/active_support/execution_wrapper.rb', line 17 def self.to_run(*args, &block) set_callback(:run, *args, &block) end |
.wrap(source: "application.active_support") ⇒ Object
Perform the work in the supplied block as an execution.
86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/active_support/execution_wrapper.rb', line 86 def self.wrap(source: "application.active_support") return yield if active? instance = run! begin yield rescue => error error_reporter&.report(error, handled: false, source: source) raise ensure instance.complete! end end |
Instance Method Details
#complete ⇒ Object
:nodoc:
141 142 143 |
# File 'lib/active_support/execution_wrapper.rb', line 141 def complete # :nodoc: run_callbacks(:complete) end |
#complete! ⇒ Object
Complete this in-flight execution. This method must be called exactly once on the result of any call to run!
.
Where possible, prefer wrap
.
135 136 137 138 139 |
# File 'lib/active_support/execution_wrapper.rb', line 135 def complete! complete ensure IsolatedExecutionState.delete(self.class.active_key) end |
#run ⇒ Object
:nodoc:
127 128 129 |
# File 'lib/active_support/execution_wrapper.rb', line 127 def run # :nodoc: run_callbacks(:run) end |
#run! ⇒ Object
:nodoc:
122 123 124 125 |
# File 'lib/active_support/execution_wrapper.rb', line 122 def run! # :nodoc: IsolatedExecutionState[self.class.active_key] = self run end |