swarm 0.3.0 → 0.4.0
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 +5 -5
- data/.ruby-version +1 -1
- data/Gemfile +2 -0
- data/Rakefile +3 -1
- data/bin/console +1 -0
- data/lib/swarm/engine/{base/job.rb → job.rb} +2 -0
- data/lib/swarm/engine/{base/queue.rb → queue.rb} +7 -5
- data/lib/swarm/engine/volatile/job.rb +6 -2
- data/lib/swarm/engine/volatile/queue.rb +7 -4
- data/lib/swarm/engine/worker/command.rb +5 -1
- data/lib/swarm/engine/worker.rb +22 -19
- data/lib/swarm/evaluation/expression_evaluator.rb +21 -14
- data/lib/swarm/expression.rb +8 -6
- data/lib/swarm/expressions/activity_expression.rb +2 -0
- data/lib/swarm/expressions/branch_expression.rb +12 -9
- data/lib/swarm/expressions/concurrence_expression.rb +8 -5
- data/lib/swarm/expressions/conditional_expression.rb +4 -2
- data/lib/swarm/expressions/sequence_expression.rb +4 -2
- data/lib/swarm/expressions/subprocess_expression.rb +4 -1
- data/lib/swarm/hive.rb +9 -16
- data/lib/swarm/hive_dweller.rb +69 -38
- data/lib/swarm/observers/base.rb +3 -1
- data/lib/swarm/observers/logger.rb +40 -0
- data/lib/swarm/participant.rb +3 -1
- data/lib/swarm/participants/storage_participant.rb +6 -4
- data/lib/swarm/participants/trace_participant.rb +2 -0
- data/lib/swarm/pollen/parser.rb +48 -44
- data/lib/swarm/pollen/reader.rb +5 -3
- data/lib/swarm/pollen/transformer.rb +30 -24
- data/lib/swarm/process.rb +21 -14
- data/lib/swarm/process_definition.rb +13 -10
- data/lib/swarm/router.rb +8 -6
- data/lib/swarm/storage/hash_storage.rb +3 -1
- data/lib/swarm/storage/key_value_storage.rb +27 -13
- data/lib/swarm/storage/redis_storage.rb +4 -2
- data/lib/swarm/storage.rb +3 -1
- data/lib/swarm/stored_workitem.rb +4 -2
- data/lib/swarm/support.rb +13 -16
- data/lib/swarm/version.rb +3 -1
- data/lib/swarm.rb +4 -2
- data/swarm.gemspec +7 -5
- metadata +51 -24
- data/lib/swarm/evaluation/workitem_context.rb +0 -17
data/lib/swarm/router.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Swarm
|
2
4
|
class Router
|
3
5
|
class << self
|
4
6
|
def expression_class_for_node(node)
|
5
7
|
command = node[0]
|
6
8
|
expression_type = case command
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
when "if", "unless"
|
10
|
+
"conditional"
|
11
|
+
when "sequence", "concurrence", "subprocess"
|
12
|
+
command
|
13
|
+
else
|
14
|
+
"activity"
|
13
15
|
end
|
14
16
|
Swarm::Support.constantize("swarm/#{expression_type}_expression")
|
15
17
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Swarm
|
2
4
|
module Storage
|
3
5
|
class KeyValueStorage
|
6
|
+
class AssociationKeyMissingError < StandardError; end
|
7
|
+
|
4
8
|
attr_reader :store
|
5
9
|
|
6
10
|
def initialize(store)
|
@@ -16,35 +20,45 @@ module Swarm
|
|
16
20
|
end
|
17
21
|
|
18
22
|
def regex_for_type(type)
|
19
|
-
/^#{type}
|
23
|
+
/^#{type}:(.*)/
|
20
24
|
end
|
21
25
|
|
22
|
-
def ids_for_type(
|
26
|
+
def ids_for_type(_type)
|
23
27
|
raise "Not implemented yet!"
|
24
28
|
end
|
25
29
|
|
26
|
-
def all_of_type(
|
30
|
+
def all_of_type(_type)
|
27
31
|
raise "Not implemented yet!"
|
28
32
|
end
|
29
33
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
def add_association(association_name, associated, owner:, class_name:, foreign_key: nil)
|
35
|
+
key = :"#{association_name}_ids"
|
36
|
+
raise AssociationKeyMissingError, key unless owner.respond_to?(key)
|
37
|
+
|
38
|
+
ids = owner.send(key) || owner.send("#{key}=", [])
|
39
|
+
ids << associated.id
|
40
|
+
associated
|
41
|
+
end
|
42
|
+
|
43
|
+
def load_associations(association_name, owner:, class_name:, foreign_key: nil)
|
44
|
+
key = :"#{association_name}_ids"
|
45
|
+
raise AssociationKeyMissingError, key unless owner.respond_to?(key)
|
46
|
+
|
47
|
+
ids = owner.send(key) || []
|
48
|
+
ids.map { |id|
|
49
|
+
self["#{class_name.split("::").last}:#{id}"]
|
50
|
+
}.compact
|
39
51
|
end
|
40
52
|
|
41
53
|
def serialize(value)
|
42
54
|
return nil if value.nil?
|
55
|
+
|
43
56
|
value.to_json
|
44
57
|
end
|
45
58
|
|
46
59
|
def deserialize(value)
|
47
60
|
return nil if value.nil?
|
61
|
+
|
48
62
|
JSON.parse(value)
|
49
63
|
end
|
50
64
|
|
@@ -56,7 +70,7 @@ module Swarm
|
|
56
70
|
store[key] = serialize(value)
|
57
71
|
end
|
58
72
|
|
59
|
-
def delete(
|
73
|
+
def delete(_key)
|
60
74
|
raise "Not implemented yet!"
|
61
75
|
end
|
62
76
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "redis"
|
2
4
|
require_relative "key_value_storage"
|
3
5
|
|
@@ -13,7 +15,7 @@ module Swarm
|
|
13
15
|
if subtypes
|
14
16
|
hsh.values
|
15
17
|
else
|
16
|
-
hsh.select { |
|
18
|
+
hsh.select { |_key, value| value["type"] == type }.values
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
@@ -26,4 +28,4 @@ module Swarm
|
|
26
28
|
end
|
27
29
|
end
|
28
30
|
end
|
29
|
-
end
|
31
|
+
end
|
data/lib/swarm/storage.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Swarm
|
2
4
|
class StoredWorkitem < HiveDweller
|
3
5
|
extend Forwardable
|
@@ -5,11 +7,11 @@ module Swarm
|
|
5
7
|
def_delegators :expression, :node, :command, :arguments, :process_id, :workitem
|
6
8
|
|
7
9
|
set_columns :expression_id
|
8
|
-
many_to_one :expression, :
|
10
|
+
many_to_one :expression, class_name: "Swarm::Expression"
|
9
11
|
|
10
12
|
def proceed
|
11
13
|
delete
|
12
14
|
expression.reply
|
13
15
|
end
|
14
16
|
end
|
15
|
-
end
|
17
|
+
end
|
data/lib/swarm/support.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "securerandom"
|
2
4
|
|
3
5
|
module Swarm
|
4
6
|
module Support
|
5
7
|
class << self
|
6
8
|
def deep_merge(hsh1, hsh2, combine_arrays: :override)
|
7
|
-
hsh1.merge(hsh2) { |
|
9
|
+
hsh1.merge(hsh2) { |_key, v1, v2|
|
8
10
|
if [v1, v2].all? { |v| v.is_a?(Array) }
|
9
11
|
combine_arrays(v1, v2, method: combine_arrays)
|
10
12
|
elsif [v1, v2].all? { |v| v.is_a?(Hash) }
|
@@ -45,15 +47,18 @@ module Swarm
|
|
45
47
|
|
46
48
|
def tokenize(string)
|
47
49
|
return nil if string.nil?
|
48
|
-
|
49
|
-
|
50
|
-
gsub(/
|
50
|
+
|
51
|
+
string.to_s.gsub(/&/, ' and ').
|
52
|
+
gsub(%r{[ /]+}, '_').
|
53
|
+
gsub(/([a-z\d])([A-Z])/, '\1_\2').
|
51
54
|
downcase
|
52
55
|
end
|
53
56
|
|
54
57
|
def camelize(string)
|
55
|
-
string = string.sub(/^[a-z\d]*/) {
|
56
|
-
string
|
58
|
+
string = string.sub(/^[a-z\d]*/) { ::Regexp.last_match(0).capitalize }
|
59
|
+
string.gsub(%r{(?:_|(/))([a-z\d]*)}) {
|
60
|
+
"#{::Regexp.last_match(1)}#{::Regexp.last_match(2).capitalize}"
|
61
|
+
}.gsub('/', '::')
|
57
62
|
end
|
58
63
|
|
59
64
|
def constantize(string)
|
@@ -70,20 +75,12 @@ module Swarm
|
|
70
75
|
constant
|
71
76
|
end
|
72
77
|
|
73
|
-
def slice(hash, *keys)
|
74
|
-
{}.tap { |h|
|
75
|
-
keys.each { |k|
|
76
|
-
h[k] = hash[k] if hash.has_key?(k)
|
77
|
-
}
|
78
|
-
}
|
79
|
-
end
|
80
|
-
|
81
78
|
def wait_until(timeout: 5, initial_delay: nil)
|
82
79
|
sleep(initial_delay) if initial_delay.is_a?(Numeric)
|
83
|
-
Timeout
|
80
|
+
Timeout.timeout(timeout) do
|
84
81
|
sleep 0.05 until yield
|
85
82
|
end
|
86
83
|
end
|
87
84
|
end
|
88
85
|
end
|
89
|
-
end
|
86
|
+
end
|
data/lib/swarm/version.rb
CHANGED
data/lib/swarm.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "forwardable"
|
1
4
|
require "swarm/version"
|
2
5
|
require "swarm/support"
|
3
|
-
require "swarm/engine/
|
6
|
+
require "swarm/engine/queue"
|
4
7
|
require "swarm/engine/volatile/queue"
|
5
8
|
require "swarm/engine/worker"
|
6
9
|
require "swarm/hive"
|
@@ -19,7 +22,6 @@ require "swarm/participants/storage_participant"
|
|
19
22
|
require "swarm/pollen/reader"
|
20
23
|
require "swarm/storage"
|
21
24
|
|
22
|
-
|
23
25
|
module Swarm
|
24
26
|
# Your code goes here...
|
25
27
|
end
|
data/swarm.gemspec
CHANGED
@@ -21,11 +21,13 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.add_dependency "redis"
|
23
23
|
spec.add_dependency "parslet"
|
24
|
+
spec.add_dependency "dentaku"
|
24
25
|
|
25
|
-
spec.add_development_dependency "bundler"
|
26
|
-
spec.add_development_dependency "rake"
|
27
|
-
spec.add_development_dependency "rspec", "~> 3
|
28
|
-
spec.add_development_dependency "timecop"
|
29
|
-
spec.add_development_dependency
|
26
|
+
spec.add_development_dependency "bundler"
|
27
|
+
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "rspec", "~> 3"
|
29
|
+
spec.add_development_dependency "timecop"
|
30
|
+
spec.add_development_dependency "simplecov"
|
30
31
|
spec.add_development_dependency "pry"
|
32
|
+
spec.add_development_dependency "rubocop"
|
31
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: swarm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ravi Gadad
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -38,62 +38,76 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: dentaku
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- - "
|
59
|
+
- - ">="
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
61
|
+
version: '0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- - "
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- - "
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
75
|
+
version: '0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- - "
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rspec
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '3
|
89
|
+
version: '3'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '3
|
96
|
+
version: '3'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: timecop
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- - "
|
101
|
+
- - ">="
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0
|
103
|
+
version: '0'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- - "
|
108
|
+
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0
|
110
|
+
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: simplecov
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +136,20 @@ dependencies:
|
|
122
136
|
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
125
153
|
description: A Ruby workflow engine
|
126
154
|
email:
|
127
155
|
- ravi@gadad.net
|
@@ -140,14 +168,13 @@ files:
|
|
140
168
|
- bin/console
|
141
169
|
- bin/setup
|
142
170
|
- lib/swarm.rb
|
143
|
-
- lib/swarm/engine/
|
144
|
-
- lib/swarm/engine/
|
171
|
+
- lib/swarm/engine/job.rb
|
172
|
+
- lib/swarm/engine/queue.rb
|
145
173
|
- lib/swarm/engine/volatile/job.rb
|
146
174
|
- lib/swarm/engine/volatile/queue.rb
|
147
175
|
- lib/swarm/engine/worker.rb
|
148
176
|
- lib/swarm/engine/worker/command.rb
|
149
177
|
- lib/swarm/evaluation/expression_evaluator.rb
|
150
|
-
- lib/swarm/evaluation/workitem_context.rb
|
151
178
|
- lib/swarm/expression.rb
|
152
179
|
- lib/swarm/expressions/activity_expression.rb
|
153
180
|
- lib/swarm/expressions/branch_expression.rb
|
@@ -158,6 +185,7 @@ files:
|
|
158
185
|
- lib/swarm/hive.rb
|
159
186
|
- lib/swarm/hive_dweller.rb
|
160
187
|
- lib/swarm/observers/base.rb
|
188
|
+
- lib/swarm/observers/logger.rb
|
161
189
|
- lib/swarm/participant.rb
|
162
190
|
- lib/swarm/participants/storage_participant.rb
|
163
191
|
- lib/swarm/participants/trace_participant.rb
|
@@ -179,7 +207,7 @@ homepage: https://github.com/bumbleworks/swarm
|
|
179
207
|
licenses:
|
180
208
|
- MIT
|
181
209
|
metadata: {}
|
182
|
-
post_install_message:
|
210
|
+
post_install_message:
|
183
211
|
rdoc_options: []
|
184
212
|
require_paths:
|
185
213
|
- lib
|
@@ -194,9 +222,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
222
|
- !ruby/object:Gem::Version
|
195
223
|
version: '0'
|
196
224
|
requirements: []
|
197
|
-
|
198
|
-
|
199
|
-
signing_key:
|
225
|
+
rubygems_version: 3.5.11
|
226
|
+
signing_key:
|
200
227
|
specification_version: 4
|
201
228
|
summary: A Ruby workflow engine
|
202
229
|
test_files: []
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Swarm
|
2
|
-
class WorkitemContext
|
3
|
-
attr_reader :workitem
|
4
|
-
|
5
|
-
def initialize(workitem)
|
6
|
-
@workitem = Support.symbolize_keys(workitem)
|
7
|
-
end
|
8
|
-
|
9
|
-
def method_missing(method, *args)
|
10
|
-
if workitem.has_key?(method)
|
11
|
-
workitem.fetch(method, nil)
|
12
|
-
else
|
13
|
-
super
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|