class ActiveSupport::ExecutionWrapper
Inherits From
-
module
ActiveSupport::
Callbacks
Public class methods
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.)
Source code GitHub
# File activesupport/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 this execution.
Returns an instance, whose complete!
method must be invoked after the work has been performed.
Where possible, prefer wrap
.
Source code GitHub
# File activesupport/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
Source code GitHub
# File activesupport/lib/active_support/execution_wrapper.rb, line 21
def self.to_complete(*args, &block)
set_callback(:complete, *args, &block)
end
Source code GitHub
# File activesupport/lib/active_support/execution_wrapper.rb, line 17
def self.to_run(*args, &block)
set_callback(:run, *args, &block)
end
Perform the work in the supplied block as an execution.
Source code GitHub
# File activesupport/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
Public instance methods
Complete this in-flight execution. This method must be called exactly once on the result of any call to run!
.
Where possible, prefer wrap
.
Source code GitHub
# File activesupport/lib/active_support/execution_wrapper.rb, line 135
def complete!
complete
ensure
IsolatedExecutionState.delete(self.class.active_key)
end