ruote 2.1.10 → 2.1.11
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.
- data/CHANGELOG.txt +51 -1
- data/CREDITS.txt +9 -0
- data/README.rdoc +13 -0
- data/Rakefile +50 -21
- data/TODO.txt +42 -4
- data/examples/pong.rb +37 -0
- data/lib/ruote/context.rb +19 -9
- data/lib/ruote/engine/process_error.rb +10 -0
- data/lib/ruote/engine/process_status.rb +140 -41
- data/lib/ruote/engine.rb +394 -27
- data/lib/ruote/exp/command.rb +2 -0
- data/lib/ruote/exp/fe_concurrence.rb +8 -0
- data/lib/ruote/exp/fe_concurrent_iterator.rb +3 -0
- data/lib/ruote/exp/fe_cursor.rb +48 -4
- data/lib/ruote/exp/fe_iterator.rb +40 -0
- data/lib/ruote/exp/fe_listen.rb +3 -3
- data/lib/ruote/exp/fe_participant.rb +30 -12
- data/lib/ruote/exp/fe_ref.rb +126 -0
- data/lib/ruote/exp/fe_subprocess.rb +20 -1
- data/lib/ruote/exp/fe_wait.rb +4 -1
- data/lib/ruote/exp/fe_when.rb +7 -10
- data/lib/ruote/exp/flowexpression.rb +23 -12
- data/lib/ruote/exp/ro_attributes.rb +5 -8
- data/lib/ruote/exp/ro_variables.rb +4 -2
- data/lib/ruote/fei.rb +2 -0
- data/lib/ruote/id/wfid_generator.rb +1 -1
- data/lib/ruote/log/pretty.rb +137 -0
- data/lib/ruote/log/storage_history.rb +1 -1
- data/lib/ruote/log/test_logger.rb +51 -126
- data/lib/ruote/log/wait_logger.rb +8 -13
- data/lib/ruote/parser/ruby_dsl.rb +4 -4
- data/lib/ruote/parser.rb +2 -2
- data/lib/ruote/part/block_participant.rb +1 -1
- data/lib/ruote/part/engine_participant.rb +1 -1
- data/lib/ruote/part/storage_participant.rb +27 -28
- data/lib/ruote/part/template.rb +8 -3
- data/lib/ruote/receiver/base.rb +24 -6
- data/lib/ruote/storage/base.rb +76 -11
- data/lib/ruote/storage/fs_storage.rb +10 -0
- data/lib/ruote/storage/hash_storage.rb +19 -8
- data/lib/ruote/{part → svc}/dispatch_pool.rb +3 -2
- data/lib/ruote/svc/dollar_sub.rb +265 -0
- data/lib/ruote/{error_handler.rb → svc/error_handler.rb} +6 -1
- data/lib/ruote/{exp → svc}/expression_map.rb +31 -37
- data/lib/ruote/{part → svc}/participant_list.rb +165 -25
- data/lib/ruote/{evt → svc}/tracker.rb +0 -0
- data/lib/ruote/{util → svc}/treechecker.rb +0 -0
- data/lib/ruote/util/look.rb +4 -1
- data/lib/ruote/util/ometa.rb +21 -5
- data/lib/ruote/{subprocess.rb → util/subprocess.rb} +0 -0
- data/lib/ruote/version.rb +1 -1
- data/lib/ruote/worker.rb +29 -69
- data/lib/ruote/workitem.rb +28 -1
- data/ruote.gemspec +26 -22
- data/test/functional/base.rb +3 -0
- data/test/functional/concurrent_base.rb +1 -0
- data/test/functional/crunner.sh +1 -1
- data/test/functional/ct_0_concurrence.rb +6 -0
- data/test/functional/ct_1_iterator.rb +3 -0
- data/test/functional/ct_2_cancel.rb +5 -0
- data/test/functional/eft_13_iterator.rb +39 -4
- data/test/functional/eft_14_cursor.rb +39 -0
- data/test/functional/eft_30_ref.rb +140 -0
- data/test/functional/eft_3_participant.rb +25 -23
- data/test/functional/ft_10_dollar.rb +17 -1
- data/test/functional/ft_14_re_apply.rb +76 -0
- data/test/functional/ft_1_process_status.rb +170 -29
- data/test/functional/ft_20_storage_participant.rb +14 -0
- data/test/functional/ft_24_block_participants.rb +1 -1
- data/test/functional/ft_26_participant_timeout.rb +93 -0
- data/test/functional/ft_2_errors.rb +24 -17
- data/test/functional/ft_30_smtp_participant.rb +7 -2
- data/test/functional/ft_38_participant_more.rb +15 -0
- data/test/functional/ft_39_wait_for.rb +34 -1
- data/test/functional/ft_3_participant_registration.rb +270 -2
- data/test/functional/ft_40_wait_logger.rb +61 -0
- data/test/functional/ft_42_storage_copy.rb +4 -0
- data/test/functional/{ft_40_participant_on_reply.rb → ft_43_participant_on_reply.rb} +17 -0
- data/test/functional/ft_44_var_participant.rb +35 -0
- data/test/functional/ft_45_participant_accept.rb +64 -0
- data/test/functional/ft_46_launch_single.rb +49 -0
- data/test/functional/ft_5_on_error.rb +39 -1
- data/test/functional/storage_helper.rb +7 -1
- data/test/test_helper.rb +1 -1
- data/test/unit/storage.rb +105 -32
- data/test/unit/ut_0_ruby_parser.rb +31 -1
- data/test/unit/ut_16_parser.rb +20 -0
- data/test/unit/ut_19_part_template.rb +11 -1
- data/test/unit/ut_20_composite_storage.rb +1 -1
- data/test/unit/ut_4_expmap.rb +1 -1
- data/test/unit/ut_6_condition.rb +2 -2
- metadata +112 -74
- data/lib/ruote/exp/raw.rb +0 -44
- data/lib/ruote/util/dollar.rb +0 -193
data/test/unit/storage.rb
CHANGED
@@ -8,24 +8,33 @@
|
|
8
8
|
require File.join(File.dirname(__FILE__), %w[ .. test_helper.rb ])
|
9
9
|
|
10
10
|
require_json
|
11
|
-
require_patron
|
11
|
+
#require_patron
|
12
12
|
|
13
13
|
require File.join(File.dirname(__FILE__), %w[ .. functional storage_helper.rb ])
|
14
14
|
|
15
|
+
#
|
16
|
+
# note : using the 'errors' type, but this test is about generic storage, not
|
17
|
+
# about errors per se.
|
18
|
+
#
|
15
19
|
|
16
20
|
class UtStorage < Test::Unit::TestCase
|
17
21
|
|
18
22
|
def setup
|
23
|
+
|
19
24
|
@s = determine_storage({})
|
20
|
-
|
25
|
+
|
26
|
+
#@s.add_type('errors')
|
27
|
+
|
21
28
|
@s.put(
|
22
29
|
'_id' => 'toto',
|
23
|
-
'type' => '
|
30
|
+
'type' => 'errors',
|
24
31
|
'message' => 'testing')
|
25
32
|
end
|
26
33
|
def teardown
|
27
34
|
|
28
|
-
@s.get_many('
|
35
|
+
@s.get_many('errors').each do |d|
|
36
|
+
@s.delete(d)
|
37
|
+
end
|
29
38
|
end
|
30
39
|
|
31
40
|
def test_get_configuration
|
@@ -35,24 +44,25 @@ class UtStorage < Test::Unit::TestCase
|
|
35
44
|
|
36
45
|
def test_get
|
37
46
|
|
38
|
-
h = @s.get('
|
47
|
+
h = @s.get('errors', 'toto')
|
39
48
|
|
40
49
|
assert_not_nil h['_rev']
|
41
50
|
|
42
|
-
h = @s.get('
|
51
|
+
h = @s.get('errors', 'nada')
|
43
52
|
|
44
53
|
assert_nil h
|
45
54
|
end
|
46
55
|
|
47
56
|
def test_put
|
48
57
|
|
49
|
-
doc = {
|
58
|
+
doc = {
|
59
|
+
'_id' => 'test_put', 'type' => 'errors', 'message' => 'testing (2)' }
|
50
60
|
|
51
61
|
@s.put(doc)
|
52
62
|
|
53
63
|
assert_nil doc['_rev']
|
54
64
|
|
55
|
-
h = @s.get('
|
65
|
+
h = @s.get('errors', 'test_put')
|
56
66
|
|
57
67
|
assert_not_nil h['_rev']
|
58
68
|
assert_not_nil h['put_at']
|
@@ -60,7 +70,7 @@ class UtStorage < Test::Unit::TestCase
|
|
60
70
|
|
61
71
|
def test_put_fail
|
62
72
|
|
63
|
-
r = @s.put('_id' => 'toto', 'type' => '
|
73
|
+
r = @s.put('_id' => 'toto', 'type' => 'errors', 'message' => 'more')
|
64
74
|
|
65
75
|
assert_equal 'toto', r['_id']
|
66
76
|
assert_not_nil r['_rev']
|
@@ -68,7 +78,7 @@ class UtStorage < Test::Unit::TestCase
|
|
68
78
|
|
69
79
|
def test_put_update_rev
|
70
80
|
|
71
|
-
doc = { '_id' => '
|
81
|
+
doc = { '_id' => 'tpur', 'type' => 'errors', 'message' => 'more' }
|
72
82
|
|
73
83
|
r = @s.put(doc, :update_rev => true)
|
74
84
|
|
@@ -77,15 +87,15 @@ class UtStorage < Test::Unit::TestCase
|
|
77
87
|
|
78
88
|
def test_put_put_and_put
|
79
89
|
|
80
|
-
doc = { '_id' => 'whiskas', 'type' => '
|
90
|
+
doc = { '_id' => 'whiskas', 'type' => 'errors', 'message' => 'miam' }
|
81
91
|
|
82
92
|
r = @s.put(doc)
|
83
|
-
doc = @s.get('
|
93
|
+
doc = @s.get('errors', 'whiskas')
|
84
94
|
|
85
95
|
r = @s.put(doc)
|
86
96
|
assert_nil r
|
87
97
|
|
88
|
-
doc = @s.get('
|
98
|
+
doc = @s.get('errors', 'whiskas')
|
89
99
|
|
90
100
|
assert_not_nil doc['put_at']
|
91
101
|
|
@@ -95,12 +105,12 @@ class UtStorage < Test::Unit::TestCase
|
|
95
105
|
|
96
106
|
def test_put_update_rev_twice
|
97
107
|
|
98
|
-
doc = { '_id' => '
|
108
|
+
doc = { '_id' => 'tpurt', 'type' => 'errors', 'message' => 'more' }
|
99
109
|
|
100
110
|
r = @s.put(doc, :update_rev => true)
|
101
111
|
assert_nil r
|
102
112
|
|
103
|
-
doc = { '_id' => '
|
113
|
+
doc = { '_id' => 'tpurt', 'type' => 'errors', 'message' => 'more' }
|
104
114
|
|
105
115
|
r = @s.put(doc, :update_rev => true)
|
106
116
|
assert_not_nil r
|
@@ -108,6 +118,8 @@ class UtStorage < Test::Unit::TestCase
|
|
108
118
|
|
109
119
|
def test_delete_fail
|
110
120
|
|
121
|
+
# missing _rev
|
122
|
+
|
111
123
|
assert_raise(ArgumentError) do
|
112
124
|
@s.delete('_id' => 'toto')
|
113
125
|
end
|
@@ -115,7 +127,7 @@ class UtStorage < Test::Unit::TestCase
|
|
115
127
|
|
116
128
|
def test_delete
|
117
129
|
|
118
|
-
doc = @s.get('
|
130
|
+
doc = @s.get('errors', 'toto')
|
119
131
|
|
120
132
|
r = @s.delete(doc)
|
121
133
|
|
@@ -124,18 +136,18 @@ class UtStorage < Test::Unit::TestCase
|
|
124
136
|
|
125
137
|
def test_delete_missing
|
126
138
|
|
127
|
-
r = @s.delete('_id' => 'x', '_rev' => '12-13231123132', 'type' => '
|
139
|
+
r = @s.delete('_id' => 'x', '_rev' => '12-13231123132', 'type' => 'errors')
|
128
140
|
|
129
141
|
assert_equal true, r
|
130
142
|
end
|
131
143
|
|
132
144
|
def test_keys_should_be_string
|
133
145
|
|
134
|
-
doc = { '_id' => 'h0', 'type' => '
|
146
|
+
doc = { '_id' => 'h0', 'type' => 'errors', :m0 => :z, :m1 => [ :a, :b ] }
|
135
147
|
|
136
148
|
@s.put(doc)
|
137
149
|
|
138
|
-
doc = @s.get('
|
150
|
+
doc = @s.get('errors', 'h0')
|
139
151
|
|
140
152
|
assert_equal 'z', doc['m0']
|
141
153
|
assert_equal %w[ a b ], doc['m1']
|
@@ -145,7 +157,7 @@ class UtStorage < Test::Unit::TestCase
|
|
145
157
|
#
|
146
158
|
def test_put_gone
|
147
159
|
|
148
|
-
h = @s.get('
|
160
|
+
h = @s.get('errors', 'toto')
|
149
161
|
|
150
162
|
assert_nil @s.delete(h)
|
151
163
|
|
@@ -156,31 +168,92 @@ class UtStorage < Test::Unit::TestCase
|
|
156
168
|
|
157
169
|
def test_purge_type
|
158
170
|
|
159
|
-
@s.purge_type!('
|
171
|
+
@s.purge_type!('errors')
|
160
172
|
|
161
|
-
assert_equal 0, @s.get_many('
|
173
|
+
assert_equal 0, @s.get_many('errors').size
|
162
174
|
end
|
163
175
|
|
176
|
+
def test_clear
|
177
|
+
|
178
|
+
@s.clear
|
179
|
+
|
180
|
+
assert_equal 0, @s.get_many('errors').size
|
181
|
+
end
|
182
|
+
|
183
|
+
#def test_purge
|
184
|
+
# @s.purge!
|
185
|
+
# assert_equal 0, @s.get_many('errors').size
|
186
|
+
#end
|
187
|
+
|
164
188
|
def test_ids
|
165
189
|
|
166
|
-
@s.put('_id' => '
|
167
|
-
@s.put('_id' => '
|
168
|
-
@s.put('_id' => '
|
190
|
+
@s.put('_id' => 't_ids0', 'type' => 'errors', 'message' => 'testing')
|
191
|
+
@s.put('_id' => 't_ids1', 'type' => 'errors', 'message' => 'testing')
|
192
|
+
@s.put('_id' => 't_ids2', 'type' => 'errors', 'message' => 'testing')
|
169
193
|
|
170
|
-
assert_equal %w[
|
194
|
+
assert_equal %w[ t_ids0 t_ids1 t_ids2 toto ], @s.ids('errors').sort
|
171
195
|
end
|
172
196
|
|
173
197
|
def test_get_many
|
174
198
|
|
175
199
|
30.times do |i|
|
176
|
-
@s.put(
|
200
|
+
@s.put(
|
201
|
+
'_id' => "xx!#{i}",
|
202
|
+
'type' => 'errors',
|
203
|
+
'wfid' => i.to_s,
|
204
|
+
'msg' => "whatever #{i}")
|
177
205
|
end
|
178
206
|
|
179
|
-
assert_equal 31, @s.get_many('
|
180
|
-
assert_equal
|
181
|
-
assert_equal 1, @s.get_many('
|
182
|
-
assert_equal 30, @s.get_many('
|
183
|
-
assert_equal 30, @s.get_many('
|
207
|
+
assert_equal 31, @s.get_many('errors').size
|
208
|
+
assert_equal 1, @s.get_many('errors', '7').size
|
209
|
+
assert_equal 1, @s.get_many('errors', /!7$/).size
|
210
|
+
assert_equal 30, @s.get_many('errors', /^xx!/).size
|
211
|
+
assert_equal 30, @s.get_many('errors', /x/).size
|
212
|
+
assert_equal 10, @s.get_many('errors', nil, :limit => 10).size
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_get_many_options
|
216
|
+
|
217
|
+
30.times do |i|
|
218
|
+
@s.put(
|
219
|
+
'_id' => sprintf("yy!%0.2d", i),
|
220
|
+
'type' => 'errors',
|
221
|
+
'msg' => "whatever #{i}")
|
222
|
+
end
|
223
|
+
|
224
|
+
# limit
|
225
|
+
|
226
|
+
assert_equal 10, @s.get_many('errors', nil, :limit => 10).size
|
227
|
+
|
228
|
+
# count
|
229
|
+
|
230
|
+
assert_equal 31, @s.get_many('errors', nil, :count => true)
|
231
|
+
|
232
|
+
# skip and limit
|
233
|
+
|
234
|
+
assert_equal(
|
235
|
+
%w[ toto yy!00 yy!01 yy!02 ],
|
236
|
+
@s.get_many(
|
237
|
+
'errors', nil, :skip => 0, :limit => 4
|
238
|
+
).collect { |d| d['_id'] })
|
239
|
+
assert_equal(
|
240
|
+
%w[ yy!02 yy!03 yy!04 ],
|
241
|
+
@s.get_many(
|
242
|
+
'errors', nil, :skip => 3, :limit => 3
|
243
|
+
).collect { |d| d['_id'] })
|
244
|
+
|
245
|
+
# skip, limit and reverse
|
246
|
+
|
247
|
+
assert_equal(
|
248
|
+
%w[ yy!29 yy!28 yy!27 ],
|
249
|
+
@s.get_many(
|
250
|
+
'errors', nil, :skip => 0, :limit => 3, :descending => true
|
251
|
+
).collect { |d| d['_id'] })
|
252
|
+
assert_equal(
|
253
|
+
%w[ yy!29 yy!28 yy!27 ],
|
254
|
+
@s.get_many(
|
255
|
+
'errors', nil, :skip => 0, :limit => 3, :descending => true
|
256
|
+
).collect { |d| d['_id'] })
|
184
257
|
end
|
185
258
|
end
|
186
259
|
|
@@ -7,7 +7,8 @@
|
|
7
7
|
|
8
8
|
require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
|
9
9
|
|
10
|
-
require 'ruote/parser
|
10
|
+
require 'ruote/parser'
|
11
|
+
#require 'ruote/parser/ruby_dsl'
|
11
12
|
|
12
13
|
|
13
14
|
class UtRubyParserTest < Test::Unit::TestCase
|
@@ -123,5 +124,34 @@ class UtRubyParserTest < Test::Unit::TestCase
|
|
123
124
|
[ 'sequence', {}, [ [ 'alpha', {}, [] ], [ 'bravo', {}, [] ] ] ],
|
124
125
|
Ruote.to_tree { sequence { alpha; bravo } })
|
125
126
|
end
|
127
|
+
|
128
|
+
def test_raise
|
129
|
+
|
130
|
+
#assert_raise Nada do
|
131
|
+
Ruote::Parser.parse %{ Ruote.define { alpha } }
|
132
|
+
#end
|
133
|
+
|
134
|
+
assert_raise ArgumentError do
|
135
|
+
Ruote::Parser.parse %{ Ruote.define { abort } }
|
136
|
+
end
|
137
|
+
assert_raise ArgumentError do
|
138
|
+
Ruote::Parser.parse %{ Ruote.define { exit } }
|
139
|
+
end
|
140
|
+
assert_raise ArgumentError do
|
141
|
+
Ruote::Parser.parse %{ Ruote.define { exit! } }
|
142
|
+
end
|
143
|
+
|
144
|
+
assert_raise ArgumentError do
|
145
|
+
Ruote::Parser.parse %{ Ruote.define { x = Kernel } }
|
146
|
+
end
|
147
|
+
|
148
|
+
assert_raise ArgumentError do
|
149
|
+
Ruote::Parser.parse %{ Ruote.define { module Nada; end } }
|
150
|
+
end
|
151
|
+
|
152
|
+
assert_raise ArgumentError do
|
153
|
+
Ruote::Parser.parse %{ Ruote.define { File.read('stuff') } }
|
154
|
+
end
|
155
|
+
end
|
126
156
|
end
|
127
157
|
|
data/test/unit/ut_16_parser.rb
CHANGED
@@ -139,5 +139,25 @@ end
|
|
139
139
|
|
140
140
|
FileUtils.rm(fn)
|
141
141
|
end
|
142
|
+
|
143
|
+
# Make sure that ruby method names like 'freeze' or 'clone' can be used
|
144
|
+
# in process definitions.
|
145
|
+
#
|
146
|
+
def test_ruby_blank_slate
|
147
|
+
|
148
|
+
t = Ruote::Parser.parse(%{
|
149
|
+
Ruote.define do
|
150
|
+
freeze
|
151
|
+
clone
|
152
|
+
untrust
|
153
|
+
end
|
154
|
+
})
|
155
|
+
|
156
|
+
assert_equal(
|
157
|
+
[ 'define', {}, [
|
158
|
+
[ 'freeze', {}, [] ], [ 'clone', {}, [] ], [ 'untrust', {}, [] ]
|
159
|
+
] ],
|
160
|
+
t)
|
161
|
+
end
|
142
162
|
end
|
143
163
|
|
@@ -8,19 +8,29 @@
|
|
8
8
|
require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
|
9
9
|
|
10
10
|
require_json
|
11
|
+
require 'ruote/context'
|
11
12
|
require 'ruote/part/template'
|
13
|
+
require 'ruote/storage/hash_storage'
|
12
14
|
|
13
15
|
|
14
16
|
class UtPartTemplateTest < Test::Unit::TestCase
|
15
17
|
|
16
18
|
class MyParticipant
|
17
19
|
include ::Ruote::TemplateMixin
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
|
23
|
+
@context = ::Ruote::Context.new(::Ruote::HashStorage.new)
|
24
|
+
end
|
18
25
|
end
|
19
26
|
|
20
27
|
DEFAULT = %{
|
21
28
|
workitem for gonzalo
|
22
29
|
|
23
|
-
{
|
30
|
+
{
|
31
|
+
"wfid": "20100304-bidehachina",
|
32
|
+
"expid": "0_0_1"
|
33
|
+
}
|
24
34
|
|
25
35
|
- 'car' ==> "BMW"
|
26
36
|
- 'model' ==> "BMW 328 Mille Miglia"
|
@@ -20,7 +20,7 @@ class UtCompositeStorageTest < Test::Unit::TestCase
|
|
20
20
|
|
21
21
|
cs = Ruote::CompositeStorage.new(default, 'msgs' => msgs)
|
22
22
|
|
23
|
-
cs.put('action' => 'terminate', 'type' => 'msgs', '
|
23
|
+
cs.put('action' => 'terminate', 'type' => 'msgs', '_id' => 'xxx')
|
24
24
|
cs.put_msg('terminate', 'type' => 'msgs')
|
25
25
|
cs.put_schedule('at', {}, Time.now + 10, 'action' => 'reply')
|
26
26
|
|
data/test/unit/ut_4_expmap.rb
CHANGED
data/test/unit/ut_6_condition.rb
CHANGED
@@ -7,8 +7,8 @@
|
|
7
7
|
|
8
8
|
require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
|
9
9
|
|
10
|
-
require 'ruote/
|
11
|
-
require 'ruote/
|
10
|
+
require 'ruote/svc/treechecker'
|
11
|
+
require 'ruote/svc/expression_map'
|
12
12
|
|
13
13
|
|
14
14
|
class ConditionTest < Test::Unit::TestCase
|