Class: Smith::Workflow::Graph::TransitionSnapshot

Inherits:
Object
  • Object
show all
Extended by:
Dry::Initializer
Defined in:
lib/smith/workflow/graph/transition_snapshot.rb

Constant Summary collapse

KINDS =
[
  %i[deterministic deterministic?],
  %i[router routed?],
  %i[nested_workflow nested?],
  %i[optimizer optimized?],
  %i[orchestrator orchestrated?],
  %i[fanout fanout?],
  %i[parallel parallel?]
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.attributes_for(transition, workflow_class:) ⇒ Object



44
45
46
47
48
49
50
51
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 44

def self.attributes_for(transition, workflow_class:)
  {
    name: transition.name,
    from: transition.from,
    to: transition.to,
    kind: kind_for(transition)
  }.merge(routing_attributes(transition), contract_attributes(transition, workflow_class: workflow_class))
end

.contract_attributes(transition, workflow_class:) ⇒ Object



64
65
66
67
68
69
70
71
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 64

def self.contract_attributes(transition, workflow_class:)
  {
    fanout: fanout_for(transition, workflow_class: workflow_class),
    optimization: optimization_for(transition, workflow_class: workflow_class),
    orchestration: orchestration_for(transition, workflow_class: workflow_class),
    retry_policy: retry_policy_for(transition)
  }
end

.fanout_for(transition, workflow_class:) ⇒ Object



73
74
75
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 73

def self.fanout_for(transition, workflow_class:)
  FanoutContract.from_transition(transition, workflow_class: workflow_class)
end

.from_transition(transition, workflow_class: nil) ⇒ Object



40
41
42
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 40

def self.from_transition(transition, workflow_class: nil)
  new(**attributes_for(transition, workflow_class: workflow_class))
end

.kind_for(transition) ⇒ Object



98
99
100
101
102
103
104
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 98

def self.kind_for(transition)
  kind = KINDS.find { |_name, predicate| transition.public_send(predicate) }
  return kind.first if kind
  return :agent if transition.agent_name

  :noop
end

.optimization_for(transition, workflow_class:) ⇒ Object



77
78
79
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 77

def self.optimization_for(transition, workflow_class:)
  OptimizationContract.from_transition(transition, workflow_class: workflow_class)
end

.orchestration_for(transition, workflow_class:) ⇒ Object



81
82
83
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 81

def self.orchestration_for(transition, workflow_class:)
  OrchestrationContract.from_transition(transition, workflow_class: workflow_class)
end

.retry_policy_for(transition) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 85

def self.retry_policy_for(transition)
  config = transition.retry_config
  return unless config

  {
    attempts: config.fetch(:attempts),
    error_classes: config.fetch(:error_classes).map(&:name),
    backoff: config.fetch(:backoff),
    max_delay: config[:max_delay],
    jitter: config.fetch(:jitter)
  }.compact
end

.routing_attributes(transition) ⇒ Object



53
54
55
56
57
58
59
60
61
62
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 53

def self.routing_attributes(transition)
  {
    success_transition: transition.success_transition,
    failure_transition: transition.failure_transition,
    routes: transition.router_config&.fetch(:routes, nil),
    fallback: transition.router_config&.fetch(:fallback, nil),
    deterministic_routes: transition.deterministic_routes,
    fanout_branches: transition.fanout_config&.fetch(:branches, nil)
  }
end

Instance Method Details

#to_hObject



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 106

def to_h
  {
    name: name,
    from: from,
    to: to,
    kind: kind,
    success_transition: success_transition,
    failure_transition: failure_transition,
    routes: routes,
    fallback: fallback,
    deterministic_routes: deterministic_routes,
    fanout_branches: fanout_branches,
    fanout: fanout,
    optimization: optimization,
    orchestration: orchestration,
    retry_policy: retry_policy
  }.compact
end