Class: Opera::Operation::Executor

Inherits:
Object
  • Object
show all
Defined in:
lib/opera/operation/executor.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(operation) ⇒ Executor

Returns a new instance of Executor.



8
9
10
# File 'lib/opera/operation/executor.rb', line 8

def initialize(operation)
  @operation = operation
end

Instance Attribute Details

#operationObject (readonly)

Returns the value of attribute operation.



6
7
8
# File 'lib/opera/operation/executor.rb', line 6

def operation
  @operation
end

Instance Method Details

#add_instruction_output(instruction, output = {}) ⇒ Object



93
94
95
# File 'lib/opera/operation/executor.rb', line 93

def add_instruction_output(instruction, output = {})
  context[:"#{instruction[:method]}_output"] = output
end

#break_conditionObject



89
90
91
# File 'lib/opera/operation/executor.rb', line 89

def break_condition
  operation.finished? || result.failure?
end

#call(instruction) ⇒ Object



12
13
14
15
16
17
18
19
20
# File 'lib/opera/operation/executor.rb', line 12

def call(instruction)
  instructions = instruction[:instructions]

  if instructions
    evaluate_instructions(instructions)
  else
    evaluate_instruction(instruction)
  end
end

#configObject



73
74
75
# File 'lib/opera/operation/executor.rb', line 73

def config
  operation.config
end

#contextObject



81
82
83
# File 'lib/opera/operation/executor.rb', line 81

def context
  operation.context
end

#evaluate_instruction(instruction) ⇒ Object

rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/opera/operation/executor.rb', line 43

def evaluate_instruction(instruction)
  case instruction[:kind]
  when :step
    Instructions::Executors::Step.new(operation).call(instruction)
  when :operation
    Instructions::Executors::Operation.new(operation).call(instruction)
  when :operations
    Instructions::Executors::Operations.new(operation).call(instruction)
  when :success
    Instructions::Executors::Success.new(operation).call(instruction)
  when :validate
    Instructions::Executors::Validate.new(operation).call(instruction)
  when :transaction
    Instructions::Executors::Transaction.new(operation).call(instruction)
  when :finish_if
    Instructions::Executors::FinishIf.new(operation).call(instruction)
  when :within
    Instructions::Executors::Within.new(operation).call(instruction)
  when :always
    Instructions::Executors::Always.new(operation).call(instruction)
  else
    raise(UnknownInstructionError, "Unknown instruction #{instruction[:kind]}")
  end
end

#evaluate_instructions(instructions = []) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/opera/operation/executor.rb', line 22

def evaluate_instructions(instructions = [])
  instructions.each do |instruction|
    next if instruction[:kind] != :always && break_condition

    evaluate_instruction(instruction)
  end
end

#execute_step(instruction) ⇒ Object

Executes the operation method named in the instruction, instruments it, and records the execution. This is the shared primitive that all executors use to invoke a step method without mutating the instruction hash.



33
34
35
36
37
38
39
40
# File 'lib/opera/operation/executor.rb', line 33

def execute_step(instruction)
  method = instruction[:method]

  Instrumentation.new(operation).instrument(name: "##{method}", level: :step) do
    result.add_execution(method) unless production_mode?
    operation.send(method)
  end
end

#production_mode?Boolean

Returns:

  • (Boolean)


77
78
79
# File 'lib/opera/operation/executor.rb', line 77

def production_mode?
  config.mode == Config::PRODUCTION_MODE
end

#reporterObject



85
86
87
# File 'lib/opera/operation/executor.rb', line 85

def reporter
  config.reporter
end

#resultObject

rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity



69
70
71
# File 'lib/opera/operation/executor.rb', line 69

def result
  operation.result
end