class NxtPipeline::Step

Attributes

argument[R]
callbacks[R]
constructor[R]
error[RW]
execution_duration[RW]
execution_finished_at[RW]
execution_started_at[RW]
index[R]
mapped_options[RW]
name=[RW]
options_mapper[R]
opts[R]
pipeline[R]
result[RW]
status[RW]
to_s[RW]

Public Class Methods

new(argument, constructor, index, pipeline, callbacks, **opts) click to toggle source
# File lib/nxt_pipeline/step.rb, line 3
def initialize(argument, constructor, index, pipeline, callbacks, **opts)
  define_attr_readers(opts)

  @pipeline = pipeline
  @callbacks = callbacks
  @argument = argument
  @index = index
  @opts = opts
  @constructor = constructor
  @to_s = "#{opts.merge(argument: argument)}"
  @options_mapper = opts[:map_options]

  @status = nil
  @result = nil
  @error = nil
  @mapped_options = nil
end

Public Instance Methods

execute(**change_set) click to toggle source
# File lib/nxt_pipeline/step.rb, line 37
def execute(**change_set)
  track_execution_time do
    set_mapped_options(change_set)
    guard_args = [change_set, self]

    callbacks.run(:before, :step, change_set)

    if evaluate_unless_guard(guard_args) && evaluate_if_guard(guard_args)
      callbacks.around(:step, change_set) do
        set_result(change_set)
      end
    end

    callbacks.run(:after, :step, change_set)

    set_status
    result
  end
rescue StandardError => e
  self.status = :failed
  self.error = e
  raise
end
set_mapped_options(change_set) click to toggle source
# File lib/nxt_pipeline/step.rb, line 61
def set_mapped_options(change_set)
  mapper = options_mapper || default_options_mapper
  mapper_args = [change_set, self].take(mapper.arity)
  self.mapped_options = mapper.call(*mapper_args)
end

Private Instance Methods

default_options_mapper() click to toggle source
# File lib/nxt_pipeline/step.rb, line 139
def default_options_mapper
  # returns an empty hash
  ->(_) { {} }
end
define_attr_readers(opts) click to toggle source
# File lib/nxt_pipeline/step.rb, line 107
def define_attr_readers(opts)
  opts.each do |key, value|
    define_singleton_method key.to_s do
      value
    end
  end
end
evaluate_if_guard(args) click to toggle source
# File lib/nxt_pipeline/step.rb, line 72
def evaluate_if_guard(args)
  execute_callable(if_guard, args)
end
evaluate_unless_guard(args) click to toggle source
# File lib/nxt_pipeline/step.rb, line 76
def evaluate_unless_guard(args)
  !execute_callable(unless_guard, args)
end
execute_callable(callable, args) click to toggle source
# File lib/nxt_pipeline/step.rb, line 85
def execute_callable(callable, args)
  args =  args.take(callable.arity)

  if args.last.is_a?(Hash)
    callable.call(*args.take(args.length - 1), **args.last)
  else
    callable.call(*args)
  end
end
guard(result) click to toggle source
# File lib/nxt_pipeline/step.rb, line 103
def guard(result)
  -> { result }
end
if_guard() click to toggle source
# File lib/nxt_pipeline/step.rb, line 95
def if_guard
  opts.fetch(:if) { guard(true) }
end
set_execution_duration() click to toggle source
# File lib/nxt_pipeline/step.rb, line 135
def set_execution_duration
  self.execution_duration = execution_finished_at - execution_started_at
end
set_execution_finished_at() click to toggle source
# File lib/nxt_pipeline/step.rb, line 131
def set_execution_finished_at
  self.execution_finished_at = Time.current
end
set_execution_started_at() click to toggle source
# File lib/nxt_pipeline/step.rb, line 127
def set_execution_started_at
  self.execution_started_at = Time.current
end
set_result(change_set) click to toggle source
# File lib/nxt_pipeline/step.rb, line 80
def set_result(change_set)
  args = [self, change_set]
  self.result = execute_callable(constructor, args)
end
set_status() click to toggle source
# File lib/nxt_pipeline/step.rb, line 115
def set_status
  self.status = result.present? ? :success : :skipped
end
track_execution_time(&block) click to toggle source
# File lib/nxt_pipeline/step.rb, line 119
def track_execution_time(&block)
  set_execution_started_at
  block.call
ensure
  set_execution_finished_at
  set_execution_duration
end
unless_guard() click to toggle source
# File lib/nxt_pipeline/step.rb, line 99
def unless_guard
  opts.fetch(:unless) { guard(false) }
end