bpmn 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +6 -6
- data/lib/{spot_flow → bpmn}/context.rb +5 -5
- data/lib/bpmn/definitions.rb +53 -0
- data/lib/bpmn/element.rb +42 -0
- data/lib/bpmn/event.rb +193 -0
- data/lib/bpmn/event_definition.rb +133 -0
- data/lib/{spot_flow → bpmn}/execution.rb +8 -8
- data/lib/bpmn/extension_elements.rb +27 -0
- data/lib/bpmn/extensions.rb +75 -0
- data/lib/bpmn/flow.rb +45 -0
- data/lib/bpmn/gateway.rb +83 -0
- data/lib/bpmn/process.rb +177 -0
- data/lib/bpmn/step.rb +56 -0
- data/lib/bpmn/task.rb +126 -0
- data/lib/bpmn/version.rb +5 -0
- data/lib/{spot_flow.rb → bpmn.rb} +19 -8
- metadata +32 -22
- data/lib/spot_flow/bpmn/definitions.rb +0 -55
- data/lib/spot_flow/bpmn/element.rb +0 -44
- data/lib/spot_flow/bpmn/event.rb +0 -195
- data/lib/spot_flow/bpmn/event_definition.rb +0 -135
- data/lib/spot_flow/bpmn/extension_elements.rb +0 -29
- data/lib/spot_flow/bpmn/extensions.rb +0 -77
- data/lib/spot_flow/bpmn/flow.rb +0 -47
- data/lib/spot_flow/bpmn/gateway.rb +0 -85
- data/lib/spot_flow/bpmn/process.rb +0 -179
- data/lib/spot_flow/bpmn/step.rb +0 -58
- data/lib/spot_flow/bpmn/task.rb +0 -128
- data/lib/spot_flow/bpmn.rb +0 -18
- data/lib/spot_flow/version.rb +0 -5
@@ -1,179 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SpotFlow
|
4
|
-
module Bpmn
|
5
|
-
class Process < Step
|
6
|
-
attr_accessor :is_executable
|
7
|
-
|
8
|
-
attr_accessor :start_events, :end_events, :intermediate_catch_events, :intermediate_throw_events, :boundary_events
|
9
|
-
attr_accessor :tasks, :user_tasks, :service_tasks, :script_tasks, :send_tasks, :receive_tasks, :manual_tasks, :business_rule_tasks, :call_activities
|
10
|
-
attr_accessor :sub_processes, :ad_hoc_sub_processes
|
11
|
-
attr_accessor :sequence_flows, :message_flows, :associations, :data_associations, :data_inputs, :data_outputs
|
12
|
-
attr_accessor :data_objects, :data_stores, :data_stores_references
|
13
|
-
attr_accessor :gateways, :exclusive_gateways, :parallel_gateways, :inclusive_gateways, :event_based_gateways, :complex_gateways
|
14
|
-
|
15
|
-
attr_accessor :parent
|
16
|
-
|
17
|
-
def initialize(attributes = {})
|
18
|
-
super(attributes.slice(:id, :name, :extension_elements, :incoming, :outgoing, :default))
|
19
|
-
|
20
|
-
@is_executable = attributes[:is_executable] == ("true" || true)
|
21
|
-
|
22
|
-
@start_events = Array.wrap(attributes[:start_event]).map { |se| StartEvent.new(se) }
|
23
|
-
@end_events = Array.wrap(attributes[:end_event]).map { |ee| EndEvent.new(ee) }
|
24
|
-
@intermediate_catch_events = Array.wrap(attributes[:intermediate_catch_event]).map { |ice| IntermediateCatchEvent.new(ice) }
|
25
|
-
@intermediate_throw_events = Array.wrap(attributes[:intermediate_throw_event]).map { |ite| IntermediateThrowEvent.new(ite) }
|
26
|
-
@boundary_events = Array.wrap(attributes[:boundary_event]).map { |be| BoundaryEvent.new(be) }
|
27
|
-
@tasks = Array.wrap(attributes[:task]).map { |t| Task.new(t) }
|
28
|
-
@user_tasks = Array.wrap(attributes[:user_task]).map { |ut| UserTask.new(ut) }
|
29
|
-
@service_tasks = Array.wrap(attributes[:service_task]).map { |st| ServiceTask.new(st) }
|
30
|
-
@script_tasks = Array.wrap(attributes[:script_task]).map { |st| ScriptTask.new(st) }
|
31
|
-
@business_rule_tasks = Array.wrap(attributes[:business_rule_task]).map { |brt| BusinessRuleTask.new(brt) }
|
32
|
-
@call_activities = Array.wrap(attributes[:call_activity]).map { |ca| CallActivity.new(ca) }
|
33
|
-
@sub_processes = Array.wrap(attributes[:sub_process]).map { |sp| SubProcess.new(sp) }
|
34
|
-
@ad_hoc_sub_processes = Array.wrap(attributes[:ad_hoc_sub_processe]).map { |ahsp| AdHocSubProcess.new(ahsp) }
|
35
|
-
@exclusive_gateways = Array.wrap(attributes[:exclusive_gateway]).map { |eg| ExclusiveGateway.new(eg) }
|
36
|
-
@parallel_gateways = Array.wrap(attributes[:parallel_gateway]).map { |pg| ParallelGateway.new(pg) }
|
37
|
-
@inclusive_gateways = Array.wrap(attributes[:inclusive_gateway]).map { |ig| InclusiveGateway.new(ig) }
|
38
|
-
@event_based_gateways = Array.wrap(attributes[:event_based_gateway]).map { |ebg| EventBasedGateway.new(ebg) }
|
39
|
-
@sequence_flows = Array.wrap(attributes[:sequence_flow]).map { |sf| SequenceFlow.new(sf) }
|
40
|
-
end
|
41
|
-
|
42
|
-
def elements
|
43
|
-
@elements ||= {}.tap do |elements|
|
44
|
-
elements.merge!(start_events.index_by(&:id))
|
45
|
-
elements.merge!(end_events.index_by(&:id))
|
46
|
-
elements.merge!(intermediate_catch_events.index_by(&:id))
|
47
|
-
elements.merge!(intermediate_throw_events.index_by(&:id))
|
48
|
-
elements.merge!(boundary_events.index_by(&:id))
|
49
|
-
elements.merge!(tasks.index_by(&:id))
|
50
|
-
elements.merge!(user_tasks.index_by(&:id))
|
51
|
-
elements.merge!(service_tasks.index_by(&:id))
|
52
|
-
elements.merge!(script_tasks.index_by(&:id))
|
53
|
-
elements.merge!(business_rule_tasks.index_by(&:id))
|
54
|
-
elements.merge!(call_activities.index_by(&:id))
|
55
|
-
elements.merge!(sub_processes.index_by(&:id))
|
56
|
-
elements.merge!(ad_hoc_sub_processes.index_by(&:id))
|
57
|
-
elements.merge!(exclusive_gateways.index_by(&:id))
|
58
|
-
elements.merge!(parallel_gateways.index_by(&:id))
|
59
|
-
elements.merge!(inclusive_gateways.index_by(&:id))
|
60
|
-
elements.merge!(event_based_gateways.index_by(&:id))
|
61
|
-
elements.merge!(sequence_flows.index_by(&:id))
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def wire_references(definitions)
|
66
|
-
elements.values.each do |element|
|
67
|
-
if element.is_a?(Step)
|
68
|
-
element.incoming = element.incoming.map { |id| element_by_id(id) }
|
69
|
-
element.outgoing = element.outgoing.map { |id| element_by_id(id) }
|
70
|
-
|
71
|
-
if element.is_a?(Event)
|
72
|
-
|
73
|
-
element.event_definitions.each do |event_definition|
|
74
|
-
if event_definition.is_a?(MessageEventDefinition)
|
75
|
-
event_definition.message = definitions.message_by_id(event_definition.message_ref)
|
76
|
-
elsif event_definition.is_a?(SignalEventDefinition)
|
77
|
-
event_definition.signal = definitions.signal_by_id(event_definition.signal_ref)
|
78
|
-
elsif event_definition.is_a?(ErrorEventDefinition)
|
79
|
-
event_definition.error = definitions.error_by_id(event_definition.error_ref)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
if element.is_a?(BoundaryEvent)
|
84
|
-
host_element = element_by_id(element.attached_to_ref)
|
85
|
-
host_element.attachments << element
|
86
|
-
element.attached_to = host_element
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
if element.is_a?(Gateway)
|
92
|
-
element.default = element_by_id(element.default_ref)
|
93
|
-
end
|
94
|
-
|
95
|
-
if element.is_a?(SubProcess)
|
96
|
-
element.wire_references(definitions)
|
97
|
-
end
|
98
|
-
|
99
|
-
elsif element.is_a?(SequenceFlow)
|
100
|
-
element.source = element_by_id(element.source_ref)
|
101
|
-
element.target = element_by_id(element.target_ref)
|
102
|
-
end
|
103
|
-
|
104
|
-
# Not handled participant process ref
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def element_by_id(id)
|
109
|
-
elements[id]
|
110
|
-
end
|
111
|
-
|
112
|
-
def elements_by_type(type)
|
113
|
-
elements.select { |e| e.class == type }
|
114
|
-
end
|
115
|
-
|
116
|
-
def default_start_event
|
117
|
-
start_events.find { |se| se.event_definitions.empty? }
|
118
|
-
end
|
119
|
-
|
120
|
-
def execute(execution)
|
121
|
-
start_event = execution.start_event_id ? element_by_id(execution.start_event_id) : default_start_event
|
122
|
-
raise ExecutionErrorNew.new("Process must have at least one start event.") if start_event.blank?
|
123
|
-
execution.execute_step(start_event)
|
124
|
-
end
|
125
|
-
|
126
|
-
def inspect
|
127
|
-
parts = ["#<#{self.class.name.gsub(/SpotFlow::/, "")} @id=#{id.inspect} @name=#{name.inspect} @is_executable=#{is_executable.inspect}"]
|
128
|
-
parts << "@parent=#{parent.inspect}" if parent
|
129
|
-
event_attrs = (start_events + intermediate_catch_events + intermediate_throw_events + boundary_events + end_events).compact
|
130
|
-
parts << "@events=#{event_attrs.inspect}" unless event_attrs.blank?
|
131
|
-
activity_attrs = (tasks + user_tasks + service_tasks + script_tasks + business_rule_tasks + call_activities).compact
|
132
|
-
parts << "@activities=#{activity_attrs.inspect}" unless activity_attrs.blank?
|
133
|
-
gateway_attrs = (exclusive_gateways + parallel_gateways + inclusive_gateways + event_based_gateways).compact
|
134
|
-
parts << "@gateways=#{gateway_attrs.inspect}" unless gateway_attrs.blank?
|
135
|
-
sub_process_attrs = (sub_processes + ad_hoc_sub_processes).compact
|
136
|
-
parts << "@sub_processes=#{sub_process_attrs.inspect}" unless sub_process_attrs.blank?
|
137
|
-
parts << "@sequence_flows=#{sequence_flows.inspect}" unless sequence_flows.blank?
|
138
|
-
parts.join(" ") + ">"
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
class SubProcess < Process
|
143
|
-
attr_accessor :triggered_by_event
|
144
|
-
|
145
|
-
def initialize(attributes = {})
|
146
|
-
super(attributes.except(:triggered_by_event))
|
147
|
-
|
148
|
-
@is_executable = false
|
149
|
-
@sub_processes = []
|
150
|
-
@triggered_by_event = attributes[:triggered_by_event]
|
151
|
-
end
|
152
|
-
|
153
|
-
def execution_ended(execution)
|
154
|
-
leave(execution)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
class AdHocSubProcess < SubProcess
|
159
|
-
|
160
|
-
end
|
161
|
-
|
162
|
-
class CallActivity < Activity
|
163
|
-
attr_reader :process_id
|
164
|
-
|
165
|
-
def execute(execution)
|
166
|
-
if extension_elements&.called_element&.process_id&.start_with?("=")
|
167
|
-
@process_id = SpotFeel.evaluate(extension_elements&.called_element&.process_id, variables: execution.variables)
|
168
|
-
else
|
169
|
-
@process_id = extension_elements&.called_element&.process_id
|
170
|
-
end
|
171
|
-
|
172
|
-
execution.wait
|
173
|
-
|
174
|
-
process = execution.context.process_by_id(@process_id) if @process_id
|
175
|
-
execution.execute_step(process.default_start_event) if process
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
data/lib/spot_flow/bpmn/step.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SpotFlow
|
4
|
-
module Bpmn
|
5
|
-
class Step < Element
|
6
|
-
attr_accessor :incoming, :outgoing, :default, :default_ref
|
7
|
-
|
8
|
-
def initialize(attributes = {})
|
9
|
-
super(attributes.except(:incoming, :outgoing, :default))
|
10
|
-
|
11
|
-
@incoming = Array.wrap(attributes[:incoming]) || []
|
12
|
-
@outgoing = Array.wrap(attributes[:outgoing]) || []
|
13
|
-
@default_ref = attributes[:default]
|
14
|
-
end
|
15
|
-
|
16
|
-
def diverging?
|
17
|
-
outgoing.length > 1
|
18
|
-
end
|
19
|
-
|
20
|
-
def converging?
|
21
|
-
incoming.length > 1
|
22
|
-
end
|
23
|
-
|
24
|
-
def leave(execution)
|
25
|
-
execution.end(false)
|
26
|
-
execution.take_all(outgoing_flows(execution))
|
27
|
-
end
|
28
|
-
|
29
|
-
def outgoing_flows(execution)
|
30
|
-
flows = []
|
31
|
-
outgoing.each do |flow|
|
32
|
-
result = flow.evaluate(execution) unless default&.id == flow.id
|
33
|
-
flows.push flow if result
|
34
|
-
end
|
35
|
-
flows = [default] if flows.empty? && default
|
36
|
-
return flows
|
37
|
-
end
|
38
|
-
|
39
|
-
def input_mappings
|
40
|
-
extension_elements&.io_mapping&.inputs || []
|
41
|
-
end
|
42
|
-
|
43
|
-
def output_mappings
|
44
|
-
extension_elements&.io_mapping&.outputs || []
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
class Activity < Step
|
49
|
-
attr_accessor :attachments
|
50
|
-
|
51
|
-
def initialize(attributes = {})
|
52
|
-
super(attributes.except(:attachments))
|
53
|
-
|
54
|
-
@attachments = []
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
data/lib/spot_flow/bpmn/task.rb
DELETED
@@ -1,128 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module SpotFlow
|
4
|
-
module Bpmn
|
5
|
-
class Task < Activity
|
6
|
-
|
7
|
-
def is_automated?
|
8
|
-
false
|
9
|
-
end
|
10
|
-
|
11
|
-
def is_manual?
|
12
|
-
true
|
13
|
-
end
|
14
|
-
|
15
|
-
def execute(execution)
|
16
|
-
execution.wait
|
17
|
-
end
|
18
|
-
|
19
|
-
def signal(execution)
|
20
|
-
leave(execution)
|
21
|
-
end
|
22
|
-
|
23
|
-
def result_to_variables(result)
|
24
|
-
if result_variable
|
25
|
-
return { "#{result_variable}": result }
|
26
|
-
else
|
27
|
-
if result.is_a? Hash
|
28
|
-
result
|
29
|
-
else
|
30
|
-
{}.tap { |h| h[id.underscore] = result }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class UserTask < Task
|
37
|
-
|
38
|
-
def form_key
|
39
|
-
extension_elements&.form_definition&.form_key
|
40
|
-
end
|
41
|
-
|
42
|
-
def assignee
|
43
|
-
extension_elements&.assignment_definition&.assignee
|
44
|
-
end
|
45
|
-
|
46
|
-
def candidate_groups
|
47
|
-
extension_elements&.assignment_definition&.candidate_groups
|
48
|
-
end
|
49
|
-
|
50
|
-
def candidate_users
|
51
|
-
extension_elements&.assignment_definition&.candidate_users
|
52
|
-
end
|
53
|
-
|
54
|
-
def due_date
|
55
|
-
extension_elements&.task_schedule&.due_date
|
56
|
-
end
|
57
|
-
|
58
|
-
def follow_up_date
|
59
|
-
extension_elements&.task_schedule&.follow_up_date
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
class ServiceTask < Task
|
64
|
-
attr_accessor :service
|
65
|
-
|
66
|
-
def is_automated?
|
67
|
-
true
|
68
|
-
end
|
69
|
-
|
70
|
-
def is_manual?
|
71
|
-
false
|
72
|
-
end
|
73
|
-
|
74
|
-
def execute(execution)
|
75
|
-
execution.wait
|
76
|
-
end
|
77
|
-
|
78
|
-
def task_type
|
79
|
-
extension_elements&.task_definition&.type
|
80
|
-
end
|
81
|
-
|
82
|
-
def task_retries
|
83
|
-
extension_elements&.task_definition&.retries
|
84
|
-
end
|
85
|
-
|
86
|
-
def headers
|
87
|
-
extension_elements&.task_headers&.headers
|
88
|
-
end
|
89
|
-
|
90
|
-
def run(execution)
|
91
|
-
if defined?(task_type)
|
92
|
-
klass = task_type.constantize
|
93
|
-
klass.new.call(execution.parent.variables, headers || {})
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
class ScriptTask < ServiceTask
|
99
|
-
|
100
|
-
def script
|
101
|
-
extension_elements&.script&.expression
|
102
|
-
end
|
103
|
-
|
104
|
-
def result_variable
|
105
|
-
extension_elements&.script&.result_variable
|
106
|
-
end
|
107
|
-
|
108
|
-
def run(execution)
|
109
|
-
SpotFeel.evaluate(script.delete_prefix("="), variables: execution.parent.variables)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
class BusinessRuleTask < ServiceTask
|
114
|
-
|
115
|
-
def decision_id
|
116
|
-
extension_elements&.called_decision&.decision_id
|
117
|
-
end
|
118
|
-
|
119
|
-
def result_variable
|
120
|
-
extension_elements&.called_decision&.result_variable
|
121
|
-
end
|
122
|
-
|
123
|
-
def run(execution)
|
124
|
-
SpotFeel.decide(decision_id, definitions: execution.context.dmn_definitions_by_decision_id(decision_id), variables: execution.parent.variables)
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
data/lib/spot_flow/bpmn.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "bpmn/element"
|
4
|
-
require_relative "bpmn/extensions"
|
5
|
-
require_relative "bpmn/extension_elements"
|
6
|
-
require_relative "bpmn/step"
|
7
|
-
require_relative "bpmn/flow"
|
8
|
-
require_relative "bpmn/event_definition"
|
9
|
-
require_relative "bpmn/event"
|
10
|
-
require_relative "bpmn/gateway"
|
11
|
-
require_relative "bpmn/task"
|
12
|
-
require_relative "bpmn/process"
|
13
|
-
require_relative "bpmn/definitions"
|
14
|
-
|
15
|
-
module SpotFlow
|
16
|
-
module Bpmn
|
17
|
-
end
|
18
|
-
end
|