# File activesupport/lib/active_support/execution_wrapper.rb, line 112 def self.error_reporter @error_reporter ||= ActiveSupport::ErrorReporter.new end
# File activesupport/lib/active_support/execution_wrapper.rb, line 51 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
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.)
# File activesupport/lib/active_support/execution_wrapper.rb, line 67 def self.run! if active? Null else new.tap do |instance| success = nil begin instance.run! success = true ensure instance.complete! unless success end end end end
Run this execution.
Returns an instance, whose complete!
method must be invoked after the work has been performed.
Where possible, prefer wrap
.
# File activesupport/lib/active_support/execution_wrapper.rb, line 22 def self.to_complete(*args, &block) set_callback(:complete, *args, &block) end
# File activesupport/lib/active_support/execution_wrapper.rb, line 18 def self.to_run(*args, &block) set_callback(:run, *args, &block) end
# File activesupport/lib/active_support/execution_wrapper.rb, line 84 def self.wrap return yield if active? instance = run! begin yield rescue => error error_reporter.report(error, handled: false) raise ensure instance.complete! end end
Perform the work in the supplied block as an execution.
# File activesupport/lib/active_support/execution_wrapper.rb, line 140 def complete! complete ensure self.class.active.delete(IsolatedExecutionState.unique_id) end
Complete this in-flight execution. This method must be called exactly once on the result of any call to run!
.
Where possible, prefer wrap
.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.