lib/trailblazer/activity/wrap.rb in trailblazer-activity-0.2.0 vs lib/trailblazer/activity/wrap.rb in trailblazer-activity-0.2.1

- old
+ new

@@ -1,70 +1,7 @@ class Trailblazer::Activity module Wrap - # The runner is passed into Activity#call( runner: Runner ) and is called for every task in the circuit. - # Its primary job is to actually `call` the task. - # - # Here, we extend this, and wrap the task `call` into its own pipeline, so we can add external behavior per task. - module Runner - # Runner signature: call( task, direction, options, static_wraps ) - # - # @api private - # @interface Runner - def self.call(task, (options, *args), wrap_runtime: raise, wrap_static: raise, **circuit_options) - wrap_ctx = { task: task } - - # this activity is "wrapped around" the actual `task`. - task_wrap_activity = apply_wirings(task, wrap_static, wrap_runtime) - - # We save all original args passed into this Runner.call, because we want to return them later after this wrap - # is finished. - original_args = [ [options, *args], circuit_options.merge( wrap_runtime: wrap_runtime, wrap_static: wrap_static ) ] - - # call the wrap for the task. - wrap_end_signal, ( wrap_ctx, _ ) = task_wrap_activity.( - [ wrap_ctx, original_args ] # we omit circuit_options here on purpose, so the wrapping activity uses the plain Runner. - ) - - # don't return the wrap's end signal, but the one from call_task. - # return all original_args for the next "real" task in the circuit (this includes circuit_options). - - # raise if wrap_ctx[:result_args][2] != static_wraps - - # TODO: make circuit ignore all returned but the first - [ wrap_ctx[:result_direction], wrap_ctx[:result_args] ] - end - - private - - # Compute the task's wrap by applying alterations both static and from runtime. - # - # NOTE: this is for performance reasons: we could have only one hash containing everything but that'd mean - # unnecessary computations at `call`-time since steps might not even be executed. - def self.apply_wirings(task, wrap_static, wrap_runtime) - wrap_activity = wrap_static[task] # find static wrap for this specific task, or default wrap activity. - - # Apply runtime alterations. - # Grab the additional wirings for the particular `task` from `wrap_runtime` (returns default otherwise). - wrap_activity = Trailblazer::Activity.merge(wrap_activity, wrap_runtime[task]) - end - end # Runner - - # The call_task method implements one default step `Call` in the Wrap::Activity circuit. - # It calls the actual, wrapped task. - def self.call_task((wrap_ctx, original_args), **circuit_options) - task = wrap_ctx[:task] - - # Call the actual task we're wrapping here. - puts "~~~~wrap.call: #{task}" - wrap_ctx[:result_direction], wrap_ctx[:result_args] = task.( *original_args ) - - # DISCUSS: do we want original_args here to be passed on, or the "effective" result_args which are different to original_args now? - [ Trailblazer::Circuit::Right, [ wrap_ctx, original_args ], **circuit_options ] - end - - Call = method(:call_task) - # Wrap::Activity is the actual circuit that implements the Task wrap. This circuit is # also known as `task_wrap`. # # Example with tracing: # @@ -84,10 +21,10 @@ def self.initial_activity Trailblazer::Activity.from_wirings( [ [ :attach!, target: [ Trailblazer::Circuit::End.new(:default), type: :event, id: "End.default" ], edge: [ Trailblazer::Circuit::Right, {} ] ], - [ :insert_before!, "End.default", node: [ Call, id: "task_wrap.call_task" ], outgoing: [ Trailblazer::Circuit::Right, {} ], incoming: ->(*) { true } ] + [ :insert_before!, "End.default", node: [ Wrap.method(:call_task), id: "task_wrap.call_task" ], outgoing: [ Trailblazer::Circuit::Right, {} ], incoming: ->(*) { true } ] ] ) end end end