flow_core 0.0.3 → 0.0.5
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 +7 -0
- data/app/models/flow_core/arc.rb +8 -0
- data/app/models/flow_core/arc_guard.rb +27 -2
- data/app/models/flow_core/branch.rb +48 -0
- data/app/models/flow_core/instance.rb +10 -1
- data/app/models/flow_core/pipeline.rb +58 -0
- data/app/models/flow_core/place.rb +2 -1
- data/app/models/flow_core/step.rb +337 -0
- data/app/models/flow_core/steps/end.rb +32 -0
- data/app/models/flow_core/steps/exclusive_choice.rb +72 -0
- data/app/models/flow_core/steps/parallel_split.rb +42 -0
- data/app/models/flow_core/steps/redirection.rb +39 -0
- data/app/models/flow_core/steps/task.rb +25 -0
- data/app/models/flow_core/task.rb +21 -8
- data/app/models/flow_core/transition.rb +44 -6
- data/app/models/flow_core/transition_callback.rb +19 -2
- data/app/models/flow_core/transition_trigger.rb +19 -2
- data/app/models/flow_core/workflow.rb +11 -4
- data/db/migrate/{20200130200532_create_flow_core_tables.rb → 20200130200532_create_workflow_tables.rb} +32 -29
- data/db/migrate/20200130200533_create_pipeline_tables.rb +64 -0
- data/lib/flow_core.rb +3 -4
- data/lib/flow_core/definition/net.rb +6 -4
- data/lib/flow_core/definition/transition.rb +37 -25
- data/lib/flow_core/engine.rb +5 -0
- data/lib/flow_core/locale/en.yml +9 -4
- data/lib/flow_core/task_executable.rb +4 -0
- data/lib/flow_core/version.rb +1 -1
- data/lib/flow_core/workflow_callbacks.rb +2 -0
- metadata +41 -4
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
class
|
3
|
+
class CreateWorkflowTables < ActiveRecord::Migration[6.0]
|
4
4
|
def change
|
5
5
|
create_table :flow_core_workflows do |t|
|
6
6
|
t.string :name, null: false
|
@@ -30,64 +30,67 @@ class CreateFlowCoreTables < ActiveRecord::Migration[6.0]
|
|
30
30
|
|
31
31
|
t.string :name
|
32
32
|
t.string :tag
|
33
|
+
t.integer :output_token_create_strategy, null: false, default: 0, comment: "0-petri_net"
|
34
|
+
t.integer :auto_finish_strategy, null: false, default: 0, comment: "0-disabled"
|
33
35
|
|
34
36
|
t.timestamps
|
35
37
|
end
|
36
38
|
|
37
|
-
create_table :
|
39
|
+
create_table :flow_core_arcs do |t|
|
38
40
|
t.references :workflow, null: false, foreign_key: { to_table: :flow_core_workflows }
|
39
41
|
t.references :transition, null: false, foreign_key: { to_table: :flow_core_transitions }
|
42
|
+
t.references :place, null: false, foreign_key: { to_table: :flow_core_places }
|
40
43
|
|
41
|
-
t.
|
42
|
-
t.
|
44
|
+
t.integer :direction, null: false, default: 0, comment: "0-in, 1-out"
|
45
|
+
t.boolean :fallback_arc, null: false, default: false
|
43
46
|
|
44
47
|
t.timestamps
|
45
48
|
end
|
46
49
|
|
47
|
-
create_table :
|
50
|
+
create_table :flow_core_instances do |t|
|
48
51
|
t.references :workflow, null: false, foreign_key: { to_table: :flow_core_workflows }
|
49
|
-
t.references :transition, null: false, foreign_key: { to_table: :flow_core_transitions }
|
50
52
|
|
51
|
-
t.
|
52
|
-
t.string :type
|
53
|
+
t.string :tag, index: { unique: true }
|
53
54
|
|
54
|
-
t.
|
55
|
-
|
55
|
+
t.integer :stage, default: 0, comment: "0-created, 1-activated, 2-canceled, 3-finished, 4-terminated"
|
56
|
+
t.datetime :activated_at
|
57
|
+
t.datetime :finished_at
|
58
|
+
t.datetime :canceled_at
|
59
|
+
t.datetime :terminated_at
|
56
60
|
|
57
|
-
|
58
|
-
t.references :workflow, null: false, foreign_key: { to_table: :flow_core_workflows }
|
59
|
-
t.references :transition, null: false, foreign_key: { to_table: :flow_core_transitions }
|
60
|
-
t.references :place, null: false, foreign_key: { to_table: :flow_core_places }
|
61
|
+
t.string :terminate_reason
|
61
62
|
|
62
|
-
t.
|
63
|
+
t.text :payload
|
63
64
|
|
64
65
|
t.timestamps
|
65
66
|
end
|
66
67
|
|
67
|
-
create_table :
|
68
|
-
t.references :workflow,
|
69
|
-
t.references :
|
68
|
+
create_table :flow_core_transition_callbacks do |t|
|
69
|
+
t.references :workflow, foreign_key: { to_table: :flow_core_workflows }
|
70
|
+
t.references :transition, foreign_key: { to_table: :flow_core_transitions }
|
70
71
|
|
71
|
-
t.
|
72
|
+
t.string :configuration
|
72
73
|
t.string :type
|
73
74
|
|
74
75
|
t.timestamps
|
75
76
|
end
|
76
77
|
|
77
|
-
create_table :
|
78
|
-
t.references :workflow,
|
78
|
+
create_table :flow_core_transition_triggers do |t|
|
79
|
+
t.references :workflow, foreign_key: { to_table: :flow_core_workflows }
|
80
|
+
t.references :transition, foreign_key: { to_table: :flow_core_transitions }
|
79
81
|
|
80
|
-
t.
|
82
|
+
t.text :configuration
|
83
|
+
t.string :type
|
81
84
|
|
82
|
-
t.
|
83
|
-
|
84
|
-
t.datetime :finished_at
|
85
|
-
t.datetime :canceled_at
|
86
|
-
t.datetime :terminated_at
|
85
|
+
t.timestamps
|
86
|
+
end
|
87
87
|
|
88
|
-
|
88
|
+
create_table :flow_core_arc_guards do |t|
|
89
|
+
t.references :workflow, foreign_key: { to_table: :flow_core_workflows }
|
90
|
+
t.references :arc, foreign_key: { to_table: :flow_core_arcs }
|
89
91
|
|
90
|
-
t.text :
|
92
|
+
t.text :configuration
|
93
|
+
t.string :type
|
91
94
|
|
92
95
|
t.timestamps
|
93
96
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class CreatePipelineTables < ActiveRecord::Migration[6.0]
|
4
|
+
def change
|
5
|
+
create_table :flow_core_pipelines do |t|
|
6
|
+
t.string :name, null: false
|
7
|
+
t.string :type
|
8
|
+
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
|
12
|
+
create_table :flow_core_steps do |t|
|
13
|
+
t.references :pipeline, null: false, foreign_key: { to_table: :flow_core_pipelines }
|
14
|
+
|
15
|
+
t.string :ancestry, index: true
|
16
|
+
t.integer :position, null: false
|
17
|
+
|
18
|
+
t.string :name
|
19
|
+
t.string :type
|
20
|
+
t.boolean :verified, null: false, default: false
|
21
|
+
|
22
|
+
t.references :redirect_to_step, foreign_key: { to_table: :flow_core_steps }
|
23
|
+
|
24
|
+
t.timestamps
|
25
|
+
end
|
26
|
+
|
27
|
+
create_table :flow_core_branches do |t|
|
28
|
+
t.references :pipeline, null: false, foreign_key: { to_table: :flow_core_pipelines }
|
29
|
+
t.references :step, null: false, foreign_key: { to_table: :flow_core_steps }
|
30
|
+
|
31
|
+
t.string :name
|
32
|
+
t.boolean :fallback_branch, null: false, default: false
|
33
|
+
|
34
|
+
t.timestamps
|
35
|
+
end
|
36
|
+
|
37
|
+
change_table :flow_core_steps do |t|
|
38
|
+
t.references :branch, foreign_key: { to_table: :flow_core_branches }
|
39
|
+
end
|
40
|
+
|
41
|
+
change_table :flow_core_transition_triggers do |t|
|
42
|
+
t.references :pipeline, foreign_key: { to_table: :flow_core_pipelines }
|
43
|
+
t.references :step, foreign_key: { to_table: :flow_core_steps }
|
44
|
+
end
|
45
|
+
|
46
|
+
change_table :flow_core_transition_callbacks do |t|
|
47
|
+
t.references :pipeline, foreign_key: { to_table: :flow_core_pipelines }
|
48
|
+
t.references :step, foreign_key: { to_table: :flow_core_steps }
|
49
|
+
end
|
50
|
+
|
51
|
+
change_table :flow_core_arc_guards do |t|
|
52
|
+
t.references :pipeline, foreign_key: { to_table: :flow_core_pipelines }
|
53
|
+
t.references :branch, foreign_key: { to_table: :flow_core_branches }
|
54
|
+
end
|
55
|
+
|
56
|
+
change_table :flow_core_transitions do |t|
|
57
|
+
t.references :generated_by_step, foreign_key: { to_table: :flow_core_steps }
|
58
|
+
end
|
59
|
+
|
60
|
+
change_table :flow_core_workflows do |t|
|
61
|
+
t.references :generated_by_pipeline, foreign_key: { to_table: :flow_core_pipelines }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/flow_core.rb
CHANGED
@@ -6,6 +6,9 @@ require "rgl/topsort"
|
|
6
6
|
require "rgl/traversal"
|
7
7
|
require "rgl/path"
|
8
8
|
|
9
|
+
require "acts_as_list"
|
10
|
+
require "ancestry"
|
11
|
+
|
9
12
|
require "flow_core/engine"
|
10
13
|
|
11
14
|
require "flow_core/errors"
|
@@ -18,9 +21,5 @@ require "flow_core/workflow_callbacks"
|
|
18
21
|
require "flow_core/definition"
|
19
22
|
require "flow_core/violations"
|
20
23
|
|
21
|
-
ActiveSupport.on_load(:i18n) do
|
22
|
-
I18n.load_path << File.expand_path("flow_core/locale/en.yml", __dir__)
|
23
|
-
end
|
24
|
-
|
25
24
|
module FlowCore
|
26
25
|
end
|
@@ -67,7 +67,8 @@ module FlowCore::Definition
|
|
67
67
|
|
68
68
|
workflow = nil
|
69
69
|
FlowCore::ApplicationRecord.transaction do
|
70
|
-
workflow = FlowCore::Workflow.
|
70
|
+
workflow = FlowCore::Workflow.new attributes
|
71
|
+
workflow.save!
|
71
72
|
|
72
73
|
# Places
|
73
74
|
place_records = {}
|
@@ -97,9 +98,10 @@ module FlowCore::Definition
|
|
97
98
|
|
98
99
|
td.output_tags.each do |output|
|
99
100
|
arc = workflow.arcs.out.create! transition: transition_records[td.tag],
|
100
|
-
place: place_records[output[:tag]]
|
101
|
-
|
102
|
-
|
101
|
+
place: place_records[output[:tag]],
|
102
|
+
fallback_arc: output[:fallback]
|
103
|
+
output[:guards].each do |guard|
|
104
|
+
arc.guards.create! guard.compile
|
103
105
|
end
|
104
106
|
end
|
105
107
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
module FlowCore::Definition
|
4
4
|
class Transition
|
5
5
|
attr_reader :net, :tag, :attributes, :trigger, :callbacks, :input_tags, :output_tags
|
6
|
+
|
6
7
|
private :net
|
7
8
|
|
8
9
|
def initialize(net, tag, attributes = {}, &block)
|
@@ -19,8 +20,8 @@ module FlowCore::Definition
|
|
19
20
|
output = attributes.delete(:output)
|
20
21
|
raise ArgumentError, "Require `input`" unless input
|
21
22
|
|
22
|
-
|
23
|
-
|
23
|
+
inputs(*input)
|
24
|
+
outputs(*output) if output
|
24
25
|
|
25
26
|
trigger = attributes.delete :with_trigger
|
26
27
|
@trigger =
|
@@ -31,7 +32,7 @@ module FlowCore::Definition
|
|
31
32
|
callbacks = []
|
32
33
|
callbacks.concat Array.wrap(attributes.delete(:with_callbacks))
|
33
34
|
callbacks.concat Array.wrap(attributes.delete(:with_callback))
|
34
|
-
@callbacks = callbacks.map { |cb| FlowCore::Definition::Callback.new cb }
|
35
|
+
@callbacks = callbacks.compact.map { |cb| FlowCore::Definition::Callback.new cb }
|
35
36
|
|
36
37
|
@attributes = attributes.with_indifferent_access.except(FlowCore::Transition::FORBIDDEN_ATTRIBUTES)
|
37
38
|
@attributes[:name] ||= tag.to_s
|
@@ -54,42 +55,53 @@ module FlowCore::Definition
|
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
|
-
def input(tag)
|
58
|
-
places
|
59
|
-
|
60
|
-
|
58
|
+
def input(tag, attributes = {})
|
59
|
+
unless net.places.find { |place| place.tag == tag }
|
60
|
+
net.add_place(tag, attributes)
|
61
|
+
end
|
62
|
+
|
63
|
+
@input_tags << tag
|
64
|
+
end
|
65
|
+
|
66
|
+
def inputs(*tags)
|
67
|
+
tags.each do |tag|
|
68
|
+
case tag
|
61
69
|
when Symbol
|
62
|
-
|
63
|
-
tag = place
|
70
|
+
input(tag)
|
64
71
|
when Array # Expect `[:p1, {name: "Place 1"}]`
|
65
|
-
|
66
|
-
tag = place.first
|
72
|
+
input(*tag)
|
67
73
|
else
|
68
74
|
raise TypeError, "Unknown pattern - #{place}"
|
69
75
|
end
|
70
|
-
|
71
|
-
@input_tags << tag
|
72
76
|
end
|
73
77
|
end
|
74
78
|
|
75
79
|
def output(tag, attributes = {})
|
76
|
-
|
77
|
-
|
80
|
+
guards = []
|
81
|
+
guards.concat Array.wrap(attributes.delete(:with_guards))
|
82
|
+
guards.concat Array.wrap(attributes.delete(:with_guard))
|
83
|
+
guards.compact!
|
84
|
+
guards.map! { |guard| FlowCore::Definition::Guard.new guard }
|
78
85
|
|
79
|
-
|
80
|
-
|
81
|
-
|
86
|
+
fallback = attributes.delete(:fallback) || false
|
87
|
+
|
88
|
+
unless net.places.find { |place| place.tag == tag }
|
89
|
+
net.add_place(tag, attributes)
|
90
|
+
end
|
91
|
+
|
92
|
+
@output_tags << { tag: tag, guards: guards, fallback: fallback }
|
93
|
+
end
|
94
|
+
|
95
|
+
def outputs(*tags)
|
96
|
+
tags.each do |tag|
|
97
|
+
case tag
|
82
98
|
when Symbol
|
83
|
-
|
84
|
-
tag = place
|
99
|
+
output(tag)
|
85
100
|
when Array # Expect `[:p1, {name: "Place 1"}]`
|
86
|
-
|
87
|
-
tag = place.first
|
101
|
+
output(*tag)
|
88
102
|
else
|
89
103
|
raise TypeError, "Unknown pattern - #{place}"
|
90
104
|
end
|
91
|
-
|
92
|
-
@output_tags << { tag: tag, guard: guard }
|
93
105
|
end
|
94
106
|
end
|
95
107
|
|
@@ -100,7 +112,7 @@ module FlowCore::Definition
|
|
100
112
|
trigger: @trigger&.compile,
|
101
113
|
callbacks: @callbacks.map(&:compile),
|
102
114
|
input_tags: @input_tags,
|
103
|
-
output_tags: @output_tags.map { |output| { tag: output[:tag],
|
115
|
+
output_tags: @output_tags.map { |output| { tag: output[:tag], guards: output[:guards].map(&:compile) } }
|
104
116
|
}
|
105
117
|
end
|
106
118
|
end
|
data/lib/flow_core/engine.rb
CHANGED
data/lib/flow_core/locale/en.yml
CHANGED
@@ -5,11 +5,11 @@ en:
|
|
5
5
|
flow_core/place: Place
|
6
6
|
flow_core/start_place: Start Place
|
7
7
|
flow_core/end_place: End Place
|
8
|
-
flow_core/transition:
|
9
|
-
flow_core/transition_trigger: Transition Trigger
|
10
|
-
flow_core/transition_callback:
|
8
|
+
flow_core/transition: Transition
|
9
|
+
# flow_core/transition_trigger: Transition Trigger
|
10
|
+
# flow_core/transition_callback: Transition Callback
|
11
11
|
flow_core/arc: Arc
|
12
|
-
flow_core/arc_guard: Arc Guard
|
12
|
+
# flow_core/arc_guard: Arc Guard
|
13
13
|
flow_core/instance: Instance
|
14
14
|
flow_core/token: Token
|
15
15
|
flow_core/task: Task
|
@@ -19,8 +19,13 @@ en:
|
|
19
19
|
verified: Verified
|
20
20
|
invalid: Invalid
|
21
21
|
violations:
|
22
|
+
no_start_place: "No start place"
|
23
|
+
no_end_place: "No end place"
|
22
24
|
format: "%{model} %{name} %{message}"
|
23
25
|
unreachable: "Unreachable from start place"
|
24
26
|
impassable: "Impassable to end place"
|
25
27
|
trigger_unconfigure: "Trigger not configured yet"
|
26
28
|
callback_unconfigure: "Callback not configured yet"
|
29
|
+
pipeline:
|
30
|
+
synchronization_transition_name: "Synchronization"
|
31
|
+
fallback_branch_name: "Default branch"
|
data/lib/flow_core/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
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.5
|
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-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: acts_as_list
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ancestry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: rails
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,10 +94,18 @@ files:
|
|
66
94
|
- app/models/flow_core/application_record.rb
|
67
95
|
- app/models/flow_core/arc.rb
|
68
96
|
- app/models/flow_core/arc_guard.rb
|
97
|
+
- app/models/flow_core/branch.rb
|
69
98
|
- app/models/flow_core/end_place.rb
|
70
99
|
- app/models/flow_core/instance.rb
|
100
|
+
- app/models/flow_core/pipeline.rb
|
71
101
|
- app/models/flow_core/place.rb
|
72
102
|
- app/models/flow_core/start_place.rb
|
103
|
+
- app/models/flow_core/step.rb
|
104
|
+
- app/models/flow_core/steps/end.rb
|
105
|
+
- app/models/flow_core/steps/exclusive_choice.rb
|
106
|
+
- app/models/flow_core/steps/parallel_split.rb
|
107
|
+
- app/models/flow_core/steps/redirection.rb
|
108
|
+
- app/models/flow_core/steps/task.rb
|
73
109
|
- app/models/flow_core/task.rb
|
74
110
|
- app/models/flow_core/token.rb
|
75
111
|
- app/models/flow_core/transition.rb
|
@@ -77,7 +113,8 @@ files:
|
|
77
113
|
- app/models/flow_core/transition_trigger.rb
|
78
114
|
- app/models/flow_core/workflow.rb
|
79
115
|
- config/routes.rb
|
80
|
-
- db/migrate/
|
116
|
+
- db/migrate/20200130200532_create_workflow_tables.rb
|
117
|
+
- db/migrate/20200130200533_create_pipeline_tables.rb
|
81
118
|
- lib/flow_core.rb
|
82
119
|
- lib/flow_core/arc_guardable.rb
|
83
120
|
- lib/flow_core/definition.rb
|
@@ -116,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
153
|
- !ruby/object:Gem::Version
|
117
154
|
version: '0'
|
118
155
|
requirements: []
|
119
|
-
rubygems_version: 3.
|
156
|
+
rubygems_version: 3.1.4
|
120
157
|
signing_key:
|
121
158
|
specification_version: 4
|
122
159
|
summary: A multi purpose, extendable, Workflow-net-based workflow engine for Rails
|