petri_flow 0.1.6 → 0.1.7
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 +5 -2
- data/app/controllers/wf/guards_controller.rb +1 -1
- data/app/models/wf/case_command/cancel_workitem.rb +1 -0
- data/app/models/wf/entry.rb +4 -0
- data/app/models/wf/guard.rb +53 -11
- data/app/models/wf/workitem.rb +1 -2
- data/app/views/wf/arcs/show.html.erb +5 -1
- data/app/views/wf/guards/_form.html.erb +6 -6
- data/lib/wf/engine.rb +1 -0
- data/lib/wf/version.rb +1 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b75f2ac3288f2b169d4364a8aaa11586497d710477ecabe92adb6af2ffbf7376
|
4
|
+
data.tar.gz: 3a12e23472cc059ba4437ee1535d216b4df290f64d1de05c54a8395a648c5246
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6aad07e5b69eb1ed0046afaa59f9679a3f77b259fa7410533eb2939883b43da7adf7518fe4b4d17e1d3f3f3b40feca8d12c954d9c837ca9c052bf1af84385942
|
7
|
+
data.tar.gz: e278b0c46d95a0b7744ef457ebac2d8f8f56d5ac943ff009264086490b762378cfb37ea3e7c5b64362d7fe09d674374f48bb0eb4008f90d7aa732343cd1cd4f0
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Petri Flow 
|
1
|
+
# Petri Flow  
|
2
2
|
|
3
3
|
Workflow engine for Rails.
|
4
4
|
|
@@ -67,6 +67,7 @@ Migration:
|
|
67
67
|
bundle exec rake wf:install:migrations
|
68
68
|
bundle exec rails db:create
|
69
69
|
bundle exec rails db:migrate
|
70
|
+
bundle exec rails db:seed
|
70
71
|
```
|
71
72
|
## Usage
|
72
73
|
|
@@ -116,7 +117,9 @@ visit:
|
|
116
117
|
http://localhost:3000/wf
|
117
118
|
```
|
118
119
|
|
119
|
-
|
120
|
+
## Testing
|
121
|
+
|
122
|
+
* RAILS_ENV=test rake app:db:migrate && RAILS_ENV=test rake app:db:test:prepare && bundle exec rake test
|
120
123
|
|
121
124
|
## Contributing
|
122
125
|
Contribution directions go here.
|
@@ -40,7 +40,7 @@ module Wf
|
|
40
40
|
|
41
41
|
def update
|
42
42
|
@arc = Wf::Arc.find(params[:arc_id])
|
43
|
-
gp = guard_params.merge(fieldable: GlobalID::Locator.locate(guard_params[:fieldable]))
|
43
|
+
gp = guard_params.merge(fieldable: GlobalID::Locator.locate(guard_params[:fieldable]))
|
44
44
|
@guard = @arc.guards.find(params[:id])
|
45
45
|
if @guard.update(gp)
|
46
46
|
redirect_to workflow_arc_path(@arc.workflow, @arc), notice: "guard was successfully created."
|
data/app/models/wf/entry.rb
CHANGED
@@ -28,6 +28,10 @@ module Wf
|
|
28
28
|
field_values.includes(:field).map { |x| [x.field_id.to_i, { field_id: x.id.to_i, field_name: x.field.name, value: x.value_after_cast }] }.to_h
|
29
29
|
end
|
30
30
|
|
31
|
+
def for_mini_racer
|
32
|
+
field_values.includes(:field).map { |x| [x.field.name, x.value_after_cast] }.to_h
|
33
|
+
end
|
34
|
+
|
31
35
|
def update_payload!
|
32
36
|
update(payload: json)
|
33
37
|
end
|
data/app/models/wf/guard.rb
CHANGED
@@ -27,6 +27,8 @@ module Wf
|
|
27
27
|
self.workflow = arc.workflow
|
28
28
|
end
|
29
29
|
|
30
|
+
validate :validate_exp_and_fieldable
|
31
|
+
|
30
32
|
OP = %w[
|
31
33
|
=
|
32
34
|
>
|
@@ -38,36 +40,76 @@ module Wf
|
|
38
40
|
|
39
41
|
def value_after_cast
|
40
42
|
field = fieldable
|
41
|
-
|
42
|
-
|
43
|
+
fieldable&.cast(value)
|
44
|
+
end
|
45
|
+
|
46
|
+
def pass?(entry, workitem)
|
47
|
+
if exp
|
48
|
+
check_exp(entry, workitem)
|
43
49
|
else
|
44
|
-
|
50
|
+
check_fieldable(entry)
|
45
51
|
end
|
46
52
|
end
|
47
53
|
|
48
|
-
def
|
54
|
+
def check_exp(entry, workitem)
|
55
|
+
form_hash = if entry
|
56
|
+
entry.for_mini_racer
|
57
|
+
else
|
58
|
+
{}
|
59
|
+
end
|
60
|
+
|
61
|
+
target_hash = workitem&.case&.targetable&.attributes || {}
|
62
|
+
user_hash = workitem&.holding_user&.attributes || {}
|
63
|
+
|
64
|
+
# 1000ms, 200mb
|
65
|
+
context = MiniRacer::Context.new(timeout: 1000, max_memory: 200_000_000)
|
66
|
+
context.eval("let form = #{form_hash.to_json};")
|
67
|
+
context.eval("let user = #{user_hash.to_json};")
|
68
|
+
context.eval("let target = #{target_hash.to_json};")
|
69
|
+
exp_value = context.eval(exp)
|
70
|
+
yes_or_no?(exp_value, value)
|
71
|
+
end
|
72
|
+
|
73
|
+
def check_fieldable(entry)
|
49
74
|
fv = entry.field_values.where(field_id: fieldable_id).first
|
50
75
|
return unless fv
|
51
76
|
|
77
|
+
yes_or_no?(fv.value_after_cast, value_after_cast)
|
78
|
+
end
|
79
|
+
|
80
|
+
def yes_or_no?(input_value, setting_value)
|
52
81
|
if op == "="
|
53
|
-
|
82
|
+
input_value == setting_value
|
54
83
|
elsif op == ">"
|
55
|
-
|
84
|
+
input_value > setting_value
|
56
85
|
elsif op == "<"
|
57
|
-
|
86
|
+
input_value < setting_value
|
58
87
|
elsif op == ">="
|
59
|
-
|
88
|
+
input_value >= setting_value
|
60
89
|
elsif op == "<="
|
61
|
-
|
90
|
+
input_value <= setting_value
|
62
91
|
elsif op == "is_empty"
|
63
|
-
|
92
|
+
input_value.blank?
|
64
93
|
else
|
65
94
|
false
|
66
95
|
end
|
67
96
|
end
|
68
97
|
|
69
98
|
def inspect
|
70
|
-
|
99
|
+
if exp
|
100
|
+
%(eval(exp) #{op} #{value})
|
101
|
+
else
|
102
|
+
%(#{fieldable&.form&.name}.#{fieldable&.name} #{op} #{value})
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def validate_exp_and_fieldable
|
107
|
+
if fieldable && exp.present?
|
108
|
+
errors.add(:exp, "Exp and Fieldable can not be set at the same time.")
|
109
|
+
return
|
110
|
+
end
|
111
|
+
|
112
|
+
errors.add(:exp, "Must set one of Exp and Fieldable.") unless fieldable || exp.present?
|
71
113
|
end
|
72
114
|
end
|
73
115
|
end
|
data/app/models/wf/workitem.rb
CHANGED
@@ -44,13 +44,12 @@ module Wf
|
|
44
44
|
"Workitem -> #{id}"
|
45
45
|
end
|
46
46
|
|
47
|
-
# TODO: guards exp && target guards
|
48
47
|
def pass_guard?(arc, has_passed = false)
|
49
48
|
if arc.guards_count == 0
|
50
49
|
!has_passed
|
51
50
|
else
|
52
51
|
entry = entries.where(user: holding_user).first
|
53
|
-
arc.guards.all? { |guard| guard.pass?(entry) }
|
52
|
+
arc.guards.all? { |guard| guard.pass?(entry, self) }
|
54
53
|
end
|
55
54
|
end
|
56
55
|
|
@@ -58,7 +58,11 @@
|
|
58
58
|
<td><%= guard.fieldable&.form&.name %>/<%= guard.fieldable&.name %></td>
|
59
59
|
<td><%= guard.op %></td>
|
60
60
|
<td><%= guard.value %></td>
|
61
|
-
<td
|
61
|
+
<td>
|
62
|
+
<pre>
|
63
|
+
<%= guard.exp %>
|
64
|
+
</pre>
|
65
|
+
</td>
|
62
66
|
<td><%= link_to 'Edit Guard', edit_arc_guard_path(@arc, guard), class: 'btn btn-sm btn-info' %></td>
|
63
67
|
<td><%= link_to 'Delete Guard', [@arc, guard], remote: true, method: :delete, data: {confirm: 'confirm?'}, class: 'btn btn-sm btn-info' %></td>
|
64
68
|
</tr>
|
@@ -18,7 +18,12 @@
|
|
18
18
|
|
19
19
|
<div class="form-group">
|
20
20
|
<%= f.label :fieldable, class: "label" %>
|
21
|
-
<%= f.select :fieldable, options_for_select(@arc.transition.form&.fields&.map {|x| [x.name, x.to_global_id]} || [], selected: f.object&.fieldable&.to_global_id), {}, class: "form-control custom-select", placeholder: "fieldable" %>
|
21
|
+
<%= f.select :fieldable, options_for_select(@arc.transition.form&.fields&.map {|x| [x.name, x.to_global_id]} || [], selected: f.object&.fieldable&.to_global_id), {include_blank: "select a field"}, class: "form-control custom-select", placeholder: "fieldable" %>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="form-group">
|
25
|
+
<%= f.label :exp, class: "label" %> <small>JavaScript with build-in variable <span class="badge badge-danger">user</span>, <span class="badge badge-danger">form</span>, <span class="badge badge-danger">target</span>.</small>
|
26
|
+
<%= f.text_area :exp, class: "form-control", placeholder: "Exp", rows: 8 %>
|
22
27
|
</div>
|
23
28
|
|
24
29
|
<div class="form-group">
|
@@ -32,11 +37,6 @@
|
|
32
37
|
<%= f.text_field :value, class: "form-control", placeholder: "Value" %>
|
33
38
|
</div>
|
34
39
|
|
35
|
-
<div class="form-group">
|
36
|
-
<%= f.label :exp, class: "label" %>
|
37
|
-
<%= f.text_field :exp, class: "form-control", placeholder: "Exp" %>
|
38
|
-
</div>
|
39
|
-
|
40
40
|
<div class="form-group">
|
41
41
|
<%= f.submit class: "btn btn-primary", data: {disable_with: 'Waiting...'} %>
|
42
42
|
</div>
|
data/lib/wf/engine.rb
CHANGED
data/lib/wf/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: petri_flow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hooopo Wang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bootstrap
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mini_racer
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: pg
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|