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