module ActiveInteractor::Organizer::Perform
Organizer
perform methods. Because {Perform} is a module classes should include {Perform} rather than inherit from it.
@author Aaron Allen <hello@aaronmallen.me> @since 1.0.0
Public Class Methods
included(base)
click to toggle source
# File lib/active_interactor/organizer/perform.rb, line 39 def self.included(base) base.class_eval do class_attribute :parallel, instance_writer: false, default: false end end
Public Instance Methods
perform()
click to toggle source
Call the {Organize::ClassMethods#organized .organized} {ActiveInteractor::Base interactors} {Interactor::Perform#perform perform
}. An {Base organizer} is expected not to define its own {Interactor::Perform#perform perform
} method in favor of this default implementation.
# File lib/active_interactor/organizer/perform.rb, line 48 def perform if self.class.parallel perform_in_parallel else perform_in_order end end
Private Instance Methods
execute_and_merge_contexts(interface)
click to toggle source
# File lib/active_interactor/organizer/perform.rb, line 76 def execute_and_merge_contexts(interface) interface.execute_inplace_callback(self, :before) result = execute_interactor_with_callbacks(interface, true) return if result.nil? context.merge!(result) context_fail! if result.failure? interface.execute_inplace_callback(self, :after) end
execute_interactor(interface, fail_on_error = false, perform_options = {})
click to toggle source
# File lib/active_interactor/organizer/perform.rb, line 58 def execute_interactor(interface, fail_on_error = false, perform_options = {}) interface.perform(self, context, fail_on_error, perform_options) end
execute_interactor_with_callbacks(interface, fail_on_error = false, perform_options = {})
click to toggle source
# File lib/active_interactor/organizer/perform.rb, line 62 def execute_interactor_with_callbacks(interface, fail_on_error = false, perform_options = {}) args = [interface, fail_on_error, perform_options] return execute_interactor(*args) if options.skip_each_perform_callbacks run_callbacks :each_perform do execute_interactor(*args) end end
merge_contexts(contexts)
click to toggle source
# File lib/active_interactor/organizer/perform.rb, line 71 def merge_contexts(contexts) contexts.each { |context| @context.merge!(context) } context_fail! if contexts.any?(&:failure?) end
perform_in_order()
click to toggle source
# File lib/active_interactor/organizer/perform.rb, line 86 def perform_in_order self.class.organized.each do |interface| execute_and_merge_contexts(interface) end rescue ActiveInteractor::Error::ContextFailure => e context.merge!(e.context) end
perform_in_parallel()
click to toggle source
# File lib/active_interactor/organizer/perform.rb, line 94 def perform_in_parallel results = self.class.organized.map do |interface| Thread.new { execute_interactor_with_callbacks(interface, false, skip_rollback: true) } end merge_contexts(results.map(&:value)) end