flow_core 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/app/models/flow_core/instance.rb +48 -42
- data/app/models/flow_core/task.rb +71 -44
- data/app/models/flow_core/transition.rb +16 -19
- data/app/models/flow_core/workflow.rb +25 -3
- data/db/migrate/20200130200532_create_flow_core_tables.rb +2 -8
- data/lib/flow_core.rb +1 -0
- data/lib/flow_core/task_executable.rb +1 -2
- data/lib/flow_core/transition_callbackable.rb +3 -3
- data/lib/flow_core/transition_triggerable.rb +6 -8
- data/lib/flow_core/version.rb +1 -1
- data/lib/flow_core/workflow_callbacks.rb +29 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d31b83d470547f95bbe973b6376c596a2d2ebe7c5d15efe569452a4342cfe5b8
|
4
|
+
data.tar.gz: 1b7ae085f8487d2d6765cb946435b5f83c1d32bbea26e625303ee8941ec2efa1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1765159897d571c89c05b3cca8f3d30229a13e6511a3797f8bfda0620540ac97940132bcc019a80fd371b1db8680bba91cca27927c841a54e0c4f48f88ad80ca
|
7
|
+
data.tar.gz: c6d354ddecbdda0596132ad83d56fce39bcbb9ab05a7a642e4c20bfa557ef792a0932156d6be195d8a66ff7e6143fc076a46a166e62be6cc77e33152a888d1de
|
data/README.md
CHANGED
@@ -131,6 +131,8 @@ Some notable:
|
|
131
131
|
- Require app task finished first (if bind)
|
132
132
|
- `terminated` Task killed by instance (e.g Instance cancelled) or other race condition task
|
133
133
|
|
134
|
+
![Life cycle of workflow instance](doc/assets/life_cycle_of_workflow_instance.png)
|
135
|
+
|
134
136
|
### FlowKit
|
135
137
|
|
136
138
|
Because FlowCore only care about essentials of workflow engine,
|
@@ -156,7 +158,8 @@ and you shall have fully control and without any unnecessary abstraction.
|
|
156
158
|
|
157
159
|
- Document
|
158
160
|
- Test
|
159
|
-
- Activity-based to Petri-net mapping
|
161
|
+
- Activity-based to Petri-net mapping that will possible to integrate to existing visual editors (with some modification),
|
162
|
+
see <https://www.researchgate.net/figure/The-mapping-between-BPMN-and-Petri-nets_tbl2_221250389> for understanding.
|
160
163
|
- More efficient and powerful workflow definition checking
|
161
164
|
- Grammar and naming correction (I'm not English native-speaker)
|
162
165
|
|
@@ -5,8 +5,8 @@ module FlowCore
|
|
5
5
|
self.table_name = "flow_core_instances"
|
6
6
|
|
7
7
|
FORBIDDEN_ATTRIBUTES = %i[
|
8
|
-
workflow_id stage activated_at finished_at canceled_at terminated_at
|
9
|
-
|
8
|
+
workflow_id stage activated_at finished_at canceled_at terminated_at terminate_reason
|
9
|
+
created_at updated_at
|
10
10
|
].freeze
|
11
11
|
|
12
12
|
belongs_to :workflow, class_name: "FlowCore::Workflow"
|
@@ -32,14 +32,14 @@ module FlowCore
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def errored?
|
35
|
-
errored_at.
|
35
|
+
tasks.where.not(errored_at: nil).exists?
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
39
|
-
|
38
|
+
def can_cancel?
|
39
|
+
created?
|
40
40
|
end
|
41
41
|
|
42
|
-
def
|
42
|
+
def can_activate?
|
43
43
|
created?
|
44
44
|
end
|
45
45
|
|
@@ -47,69 +47,75 @@ module FlowCore
|
|
47
47
|
activated?
|
48
48
|
end
|
49
49
|
|
50
|
-
def
|
51
|
-
|
50
|
+
def can_terminate?
|
51
|
+
true
|
52
|
+
end
|
53
|
+
|
54
|
+
def cancel
|
55
|
+
return false unless can_cancel?
|
56
|
+
|
57
|
+
with_transaction_returning_status do
|
58
|
+
update! stage: :canceled, canceled_at: Time.zone.now
|
59
|
+
workflow.on_instance_cancel(self)
|
60
|
+
|
61
|
+
true
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def activate
|
66
|
+
return false unless can_activate?
|
52
67
|
|
53
|
-
|
68
|
+
with_transaction_returning_status do
|
54
69
|
tokens.create! place: workflow.start_place
|
55
70
|
update! stage: :activated, activated_at: Time.zone.now
|
56
|
-
|
71
|
+
workflow.on_instance_activate(self)
|
57
72
|
|
58
|
-
|
73
|
+
true
|
74
|
+
end
|
59
75
|
end
|
60
76
|
|
61
77
|
def finish
|
62
78
|
return false unless can_finish?
|
63
79
|
|
64
|
-
|
80
|
+
with_transaction_returning_status do
|
65
81
|
update! stage: :finished, finished_at: Time.zone.now
|
66
82
|
|
67
83
|
tasks.where(stage: %i[created enabled]).find_each do |task|
|
68
84
|
task.terminate! reason: "Instance finished"
|
69
85
|
end
|
70
86
|
tokens.where(stage: %i[free locked]).find_each(&:terminate!)
|
71
|
-
|
72
|
-
|
73
|
-
true
|
74
|
-
end
|
87
|
+
workflow.on_instance_finish(self)
|
75
88
|
|
76
|
-
|
77
|
-
|
89
|
+
true
|
90
|
+
end
|
78
91
|
end
|
79
92
|
|
80
|
-
def
|
81
|
-
|
82
|
-
end
|
93
|
+
def terminate(reason:)
|
94
|
+
return unless can_terminate?
|
83
95
|
|
84
|
-
|
85
|
-
|
96
|
+
with_transaction_returning_status do
|
97
|
+
tasks.enabled.each { |task| task.terminate! reason: "Instance terminated" }
|
98
|
+
update! stage: :terminated, terminated_at: Time.zone.now, terminate_reason: reason
|
99
|
+
workflow.on_instance_terminate(self)
|
86
100
|
|
87
|
-
|
101
|
+
true
|
102
|
+
end
|
88
103
|
end
|
89
104
|
|
90
|
-
def
|
91
|
-
|
92
|
-
return unless tasks.errored.any?
|
93
|
-
|
94
|
-
update! errored_at: nil, rescued_at: Time.zone.now
|
105
|
+
def cancel!
|
106
|
+
cancel || raise(FlowCore::InvalidTransition, "Can't cancel Instance##{id}")
|
95
107
|
end
|
96
108
|
|
97
|
-
def
|
98
|
-
|
99
|
-
|
100
|
-
transaction do
|
101
|
-
tasks.enabled.each(&:suspend!)
|
102
|
-
update! suspended_at: Time.zone.now
|
103
|
-
end
|
109
|
+
def activate!
|
110
|
+
activate || raise(FlowCore::InvalidTransition, "Can't activate Instance##{id}")
|
104
111
|
end
|
105
112
|
|
106
|
-
def
|
107
|
-
|
113
|
+
def finish!
|
114
|
+
finish || raise(FlowCore::InvalidTransition, "Can't finish Instance##{id}")
|
115
|
+
end
|
108
116
|
|
109
|
-
|
110
|
-
|
111
|
-
update! suspended_at: nil, resumed_at: Time.zone.now
|
112
|
-
end
|
117
|
+
def terminate!(reason:)
|
118
|
+
terminate(reason: reason) || raise(FlowCore::InvalidTransition, "Can't terminate Instance##{id}")
|
113
119
|
end
|
114
120
|
end
|
115
121
|
end
|
@@ -7,7 +7,7 @@ module FlowCore
|
|
7
7
|
belongs_to :workflow, class_name: "FlowCore::Workflow"
|
8
8
|
belongs_to :transition, class_name: "FlowCore::Transition"
|
9
9
|
|
10
|
-
belongs_to :instance, class_name: "FlowCore::Instance"
|
10
|
+
belongs_to :instance, class_name: "FlowCore::Instance", autosave: true
|
11
11
|
belongs_to :created_by_token, class_name: "FlowCore::Token", optional: true
|
12
12
|
|
13
13
|
belongs_to :executable, polymorphic: true, optional: true
|
@@ -80,20 +80,21 @@ module FlowCore
|
|
80
80
|
def enable
|
81
81
|
return false unless can_enable?
|
82
82
|
|
83
|
-
|
83
|
+
with_transaction_returning_status do
|
84
84
|
input_free_tokens.each(&:lock!)
|
85
85
|
update! stage: :enabled, enabled_at: Time.zone.now
|
86
86
|
|
87
|
-
transition.
|
88
|
-
|
87
|
+
transition.on_task_enable(self)
|
88
|
+
workflow.on_instance_task_enable(self)
|
89
89
|
|
90
|
-
|
90
|
+
true
|
91
|
+
end
|
91
92
|
end
|
92
93
|
|
93
94
|
def finish
|
94
95
|
return false unless can_finish?
|
95
96
|
|
96
|
-
|
97
|
+
with_transaction_returning_status do
|
97
98
|
# terminate other racing tasks
|
98
99
|
instance.tasks.enabled.where(created_by_token: created_by_token).find_each do |task|
|
99
100
|
task.terminate! reason: "Same origin task #{id} finished"
|
@@ -102,80 +103,106 @@ module FlowCore
|
|
102
103
|
input_locked_tokens.each { |token| token.consume! by: self }
|
103
104
|
update! stage: :finished, finished_at: Time.zone.now
|
104
105
|
|
105
|
-
transition.
|
106
|
-
|
106
|
+
transition.on_task_finish(self)
|
107
|
+
workflow.on_instance_task_finish(self)
|
107
108
|
|
108
|
-
|
109
|
+
true
|
110
|
+
end
|
109
111
|
|
110
|
-
|
112
|
+
create_output_token
|
111
113
|
end
|
112
114
|
|
113
115
|
def terminate(reason:)
|
114
116
|
return false unless can_terminate?
|
115
117
|
|
116
|
-
|
118
|
+
with_transaction_returning_status do
|
117
119
|
update! stage: :terminated, terminated_at: Time.zone.now, terminate_reason: reason
|
118
|
-
transition.
|
119
|
-
|
120
|
-
|
121
|
-
true
|
122
|
-
end
|
120
|
+
transition.on_task_terminate(self)
|
121
|
+
workflow.on_instance_task_terminate(self)
|
123
122
|
|
124
|
-
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
def finish!
|
129
|
-
finish || raise(FlowCore::InvalidTransition, "Can't finish Task##{id}")
|
130
|
-
end
|
131
|
-
|
132
|
-
def terminate!(reason:)
|
133
|
-
terminate(reason: reason) || raise(FlowCore::InvalidTransition, "Can't terminate Task##{id}")
|
123
|
+
true
|
124
|
+
end
|
134
125
|
end
|
135
126
|
|
136
|
-
def error
|
137
|
-
|
138
|
-
|
139
|
-
|
127
|
+
def error(error)
|
128
|
+
update! errored_at: Time.zone.now, error_reason: error.message
|
129
|
+
instance.update! errored_at: Time.zone.now
|
130
|
+
transition.on_task_errored(self, error)
|
131
|
+
workflow.on_instance_task_errored(self, error)
|
140
132
|
|
141
|
-
|
142
|
-
end
|
133
|
+
true
|
143
134
|
end
|
144
135
|
|
145
|
-
def rescue
|
136
|
+
def rescue
|
146
137
|
return unless errored?
|
147
138
|
|
148
|
-
|
139
|
+
with_transaction_returning_status do
|
149
140
|
update! errored_at: nil, rescued_at: Time.zone.now
|
150
|
-
|
141
|
+
instance.update! errored_at: nil, rescued_at: Time.zone.now
|
142
|
+
transition.on_task_rescue(self)
|
143
|
+
workflow.on_instance_task_rescue(self)
|
151
144
|
|
152
|
-
|
145
|
+
true
|
153
146
|
end
|
154
147
|
end
|
155
148
|
|
156
|
-
def suspend
|
157
|
-
|
149
|
+
def suspend
|
150
|
+
with_transaction_returning_status do
|
158
151
|
update! suspended_at: Time.zone.now
|
159
|
-
transition.
|
152
|
+
transition.on_task_suspend(self)
|
153
|
+
workflow.on_instance_task_suspend(self)
|
154
|
+
|
155
|
+
true
|
160
156
|
end
|
161
157
|
end
|
162
158
|
|
163
|
-
def resume
|
164
|
-
|
159
|
+
def resume
|
160
|
+
with_transaction_returning_status do
|
165
161
|
update! suspended_at: nil, resumed_at: Time.zone.now
|
166
|
-
transition.
|
162
|
+
transition.on_task_resume(self)
|
163
|
+
workflow.on_instance_task_resume(self)
|
164
|
+
|
165
|
+
true
|
167
166
|
end
|
168
167
|
end
|
169
168
|
|
170
|
-
def create_output_token
|
169
|
+
def create_output_token
|
171
170
|
return if output_token_created
|
172
171
|
|
173
|
-
|
172
|
+
with_transaction_returning_status do
|
174
173
|
transition.create_tokens_for_output(task: self)
|
175
174
|
update! output_token_created: true
|
175
|
+
|
176
|
+
true
|
176
177
|
end
|
177
178
|
end
|
178
179
|
|
180
|
+
def enable!
|
181
|
+
enable || raise(FlowCore::InvalidTransition, "Can't enable Task##{id}")
|
182
|
+
end
|
183
|
+
|
184
|
+
def finish!
|
185
|
+
finish || raise(FlowCore::InvalidTransition, "Can't finish Task##{id}")
|
186
|
+
end
|
187
|
+
|
188
|
+
def terminate!(reason:)
|
189
|
+
terminate(reason: reason) || raise(FlowCore::InvalidTransition, "Can't terminate Task##{id}")
|
190
|
+
end
|
191
|
+
|
192
|
+
alias error! error
|
193
|
+
|
194
|
+
def rescue!
|
195
|
+
self.rescue || raise(FlowCore::InvalidTransition, "Can't rescue Task##{id}")
|
196
|
+
end
|
197
|
+
|
198
|
+
def suspend!
|
199
|
+
suspend || raise(FlowCore::InvalidTransition, "Can't suspend Task##{id}")
|
200
|
+
end
|
201
|
+
|
202
|
+
def resume!
|
203
|
+
resume || raise(FlowCore::InvalidTransition, "Can't resume Task##{id}")
|
204
|
+
end
|
205
|
+
|
179
206
|
private
|
180
207
|
|
181
208
|
def input_tokens
|
@@ -76,7 +76,9 @@ module FlowCore
|
|
76
76
|
end
|
77
77
|
|
78
78
|
if candidate_arcs.empty?
|
79
|
-
|
79
|
+
# TODO: find a better way
|
80
|
+
on_task_errored task, FlowCore::NoNewTokenCreated.new
|
81
|
+
return
|
80
82
|
end
|
81
83
|
|
82
84
|
candidate_arcs.each do |arc|
|
@@ -84,43 +86,38 @@ module FlowCore
|
|
84
86
|
end
|
85
87
|
end
|
86
88
|
|
87
|
-
def
|
88
|
-
trigger&.
|
89
|
+
def on_task_enable(task)
|
90
|
+
trigger&.on_task_enable(task)
|
89
91
|
callbacks.each { |callback| callback.call task }
|
90
92
|
end
|
91
93
|
|
92
|
-
def
|
93
|
-
trigger&.
|
94
|
+
def on_task_finish(task)
|
95
|
+
trigger&.on_task_finish(task)
|
94
96
|
callbacks.each { |callback| callback.call task }
|
95
97
|
end
|
96
98
|
|
97
|
-
def
|
98
|
-
trigger&.
|
99
|
-
callbacks.each { |callback| callback.call task }
|
100
|
-
end
|
101
|
-
|
102
|
-
def on_task_terminated(task)
|
103
|
-
trigger&.on_task_terminated(task)
|
99
|
+
def on_task_terminate(task)
|
100
|
+
trigger&.on_task_terminate(task)
|
104
101
|
callbacks.each { |callback| callback.call task }
|
105
102
|
end
|
106
103
|
|
107
104
|
def on_task_errored(task, error)
|
108
105
|
trigger&.on_task_errored(task, error)
|
109
|
-
callbacks.each { |callback| callback.call task }
|
106
|
+
callbacks.each { |callback| callback.call task, error }
|
110
107
|
end
|
111
108
|
|
112
|
-
def
|
113
|
-
trigger&.
|
109
|
+
def on_task_rescue(task)
|
110
|
+
trigger&.on_task_rescue(task)
|
114
111
|
callbacks.each { |callback| callback.call task }
|
115
112
|
end
|
116
113
|
|
117
|
-
def
|
118
|
-
trigger&.
|
114
|
+
def on_task_suspend(task)
|
115
|
+
trigger&.on_task_suspend(task)
|
119
116
|
callbacks.each { |callback| callback.call task }
|
120
117
|
end
|
121
118
|
|
122
|
-
def
|
123
|
-
trigger&.
|
119
|
+
def on_task_resume(task)
|
120
|
+
trigger&.on_task_resume(task)
|
124
121
|
callbacks.each { |callback| callback.call task }
|
125
122
|
end
|
126
123
|
|
@@ -15,12 +15,34 @@ module FlowCore
|
|
15
15
|
has_one :start_place, class_name: "FlowCore::StartPlace", dependent: :delete
|
16
16
|
has_one :end_place, class_name: "FlowCore::EndPlace", dependent: :delete
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
class_attribute :force_workflow_verified_on_create_instance, default: false
|
19
|
+
|
20
|
+
include FlowCore::WorkflowCallbacks
|
21
|
+
|
22
|
+
def build_instance(attributes = {})
|
23
|
+
if force_workflow_verified_on_create_instance && invalid?
|
20
24
|
raise FlowCore::UnverifiedWorkflow, "Workflow##{id} didn't do soundness check yet."
|
21
25
|
end
|
22
26
|
|
23
|
-
instances.
|
27
|
+
instances.build attributes.with_indifferent_access.except(FlowCore::Instance::FORBIDDEN_ATTRIBUTES)
|
28
|
+
end
|
29
|
+
|
30
|
+
def create_instance(attributes = {})
|
31
|
+
instance = build_instance(attributes)
|
32
|
+
return unless instance
|
33
|
+
|
34
|
+
instance.save
|
35
|
+
instance
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_instance!(attributes = {})
|
39
|
+
instance = build_instance(attributes)
|
40
|
+
unless instance
|
41
|
+
raise RecordNotSaved.new("Failed to create workflow instance", instance)
|
42
|
+
end
|
43
|
+
|
44
|
+
instance.save!
|
45
|
+
instance
|
24
46
|
end
|
25
47
|
|
26
48
|
def invalid?
|
@@ -85,13 +85,7 @@ class CreateFlowCoreTables < ActiveRecord::Migration[6.0]
|
|
85
85
|
t.datetime :canceled_at
|
86
86
|
t.datetime :terminated_at
|
87
87
|
|
88
|
-
t.string :
|
89
|
-
|
90
|
-
t.datetime :errored_at
|
91
|
-
t.datetime :rescued_at
|
92
|
-
|
93
|
-
t.datetime :suspended_at
|
94
|
-
t.datetime :resumed_at
|
88
|
+
t.string :terminate_reason
|
95
89
|
|
96
90
|
t.text :payload
|
97
91
|
|
@@ -128,8 +122,8 @@ class CreateFlowCoreTables < ActiveRecord::Migration[6.0]
|
|
128
122
|
t.integer :stage, default: 0, comment: "0-created, 1-enabled, 11-finished, 12-terminated"
|
129
123
|
t.datetime :enabled_at
|
130
124
|
t.datetime :finished_at
|
131
|
-
t.datetime :terminated_at
|
132
125
|
|
126
|
+
t.datetime :terminated_at
|
133
127
|
t.string :terminate_reason
|
134
128
|
|
135
129
|
t.datetime :errored_at
|
data/lib/flow_core.rb
CHANGED
@@ -13,6 +13,7 @@ require "flow_core/arc_guardable"
|
|
13
13
|
require "flow_core/transition_triggerable"
|
14
14
|
require "flow_core/transition_callbackable"
|
15
15
|
require "flow_core/task_executable"
|
16
|
+
require "flow_core/workflow_callbacks"
|
16
17
|
|
17
18
|
require "flow_core/definition"
|
18
19
|
require "flow_core/violations"
|
@@ -5,8 +5,7 @@ module FlowCore
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
included do
|
8
|
-
has_one :task, as: :executable,
|
9
|
-
has_one :instance, through: :task, class_name: "FlowCore::Instance"
|
8
|
+
has_one :task, as: :executable, class_name: "FlowCore::Task", autosave: true, required: true
|
10
9
|
has_one :transition, -> { readonly }, through: :task, class_name: "FlowCore::Transition"
|
11
10
|
|
12
11
|
after_save :notify_workflow_task_finished!, if: :implicit_notify_workflow_task_finished
|
@@ -19,15 +19,15 @@ module FlowCore
|
|
19
19
|
true
|
20
20
|
end
|
21
21
|
|
22
|
-
def _call(_task)
|
22
|
+
def _call(_task, *_args)
|
23
23
|
raise NotImplementedError
|
24
24
|
end
|
25
25
|
|
26
|
-
def call(task)
|
26
|
+
def call(task, *args)
|
27
27
|
return unless on.include? task.stage.to_sym
|
28
28
|
return unless callable? task
|
29
29
|
|
30
|
-
_call task
|
30
|
+
_call task, *args
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -6,22 +6,20 @@ module FlowCore
|
|
6
6
|
|
7
7
|
def on_verify(_transition, _violations); end
|
8
8
|
|
9
|
-
def
|
9
|
+
def on_task_enable(_task); end
|
10
10
|
|
11
|
-
def
|
11
|
+
def on_task_finish(_task); end
|
12
12
|
|
13
|
-
def
|
13
|
+
def on_task_terminate(_task); end
|
14
14
|
|
15
|
-
def
|
15
|
+
def on_task_suspend(_task); end
|
16
16
|
|
17
|
-
def
|
18
|
-
|
19
|
-
def on_task_resumed(_task); end
|
17
|
+
def on_task_resume(_task); end
|
20
18
|
|
21
19
|
def on_task_errored(_task, error)
|
22
20
|
raise error
|
23
21
|
end
|
24
22
|
|
25
|
-
def
|
23
|
+
def on_task_rescue(_task); end
|
26
24
|
end
|
27
25
|
end
|
data/lib/flow_core/version.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FlowCore
|
4
|
+
module WorkflowCallbacks
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
def on_instance_cancel(_instance); end
|
8
|
+
|
9
|
+
def on_instance_activate(_instance); end
|
10
|
+
|
11
|
+
def on_instance_finish(_instance); end
|
12
|
+
|
13
|
+
def on_instance_terminate(_instance); end
|
14
|
+
|
15
|
+
def on_instance_task_enable(_task); end
|
16
|
+
|
17
|
+
def on_instance_task_finish(_task); end
|
18
|
+
|
19
|
+
def on_instance_task_terminate(_task); end
|
20
|
+
|
21
|
+
def on_instance_task_errored(_task, _error); end
|
22
|
+
|
23
|
+
def on_instance_task_rescue(_task); end
|
24
|
+
|
25
|
+
def on_instance_task_suspend(_task); end
|
26
|
+
|
27
|
+
def on_instance_task_resume(_task); end
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flow_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jasl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- lib/flow_core/transition_triggerable.rb
|
96
96
|
- lib/flow_core/version.rb
|
97
97
|
- lib/flow_core/violations.rb
|
98
|
+
- lib/flow_core/workflow_callbacks.rb
|
98
99
|
- lib/tasks/flow_core_tasks.rake
|
99
100
|
homepage: https://github.com/rails-engine/flow_core
|
100
101
|
licenses:
|
@@ -115,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
116
|
- !ruby/object:Gem::Version
|
116
117
|
version: '0'
|
117
118
|
requirements: []
|
118
|
-
rubygems_version: 3.
|
119
|
+
rubygems_version: 3.0.8
|
119
120
|
signing_key:
|
120
121
|
specification_version: 4
|
121
122
|
summary: A multi purpose, extendable, Workflow-net-based workflow engine for Rails
|