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



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

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

.contract_attributes(transition, workflow_class:) ⇒ Object



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

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



75
76
77
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 75

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

.from_transition(transition, workflow_class: nil) ⇒ Object



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

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

.kind_for(transition) ⇒ Object



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

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



79
80
81
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 79

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

.orchestration_for(transition, workflow_class:) ⇒ Object



83
84
85
# File 'lib/smith/workflow/graph/transition_snapshot.rb', line 83

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

.retry_policy_for(transition) ⇒ Object



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

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



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

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



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

def to_h
  {
    name: name,
    from: from,
    to: to,
    kind: kind,
    parallel_count: parallel_count,
    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