ruote 2.1.11 → 2.2.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.
- data/CHANGELOG.txt +60 -0
- data/CREDITS.txt +22 -4
- data/LICENSE.txt +1 -1
- data/README.rdoc +6 -7
- data/Rakefile +58 -59
- data/TODO.txt +137 -65
- data/couch_url.txt +1 -0
- data/jruby_issue.txt +32 -0
- data/lib/ruote.rb +1 -1
- data/lib/ruote/context.rb +12 -10
- data/lib/ruote/engine.rb +280 -145
- data/lib/ruote/engine/process_error.rb +5 -5
- data/lib/ruote/engine/process_status.rb +47 -28
- data/lib/ruote/exp/command.rb +7 -10
- data/lib/ruote/exp/commanded.rb +2 -2
- data/lib/ruote/exp/condition.rb +130 -43
- data/lib/ruote/exp/fe_add_branches.rb +2 -2
- data/lib/ruote/exp/fe_apply.rb +1 -1
- data/lib/ruote/exp/fe_cancel_process.rb +3 -3
- data/lib/ruote/exp/fe_command.rb +3 -3
- data/lib/ruote/exp/fe_concurrence.rb +4 -4
- data/lib/ruote/exp/fe_concurrent_iterator.rb +17 -5
- data/lib/ruote/exp/fe_cron.rb +3 -3
- data/lib/ruote/exp/fe_cursor.rb +5 -5
- data/lib/ruote/exp/fe_define.rb +3 -3
- data/lib/ruote/exp/fe_echo.rb +3 -3
- data/lib/ruote/exp/fe_equals.rb +2 -2
- data/lib/ruote/exp/fe_error.rb +2 -2
- data/lib/ruote/exp/fe_filter.rb +519 -0
- data/lib/ruote/exp/fe_forget.rb +9 -2
- data/lib/ruote/exp/fe_given.rb +154 -0
- data/lib/ruote/exp/fe_if.rb +16 -13
- data/lib/ruote/exp/fe_inc.rb +3 -3
- data/lib/ruote/exp/fe_iterator.rb +4 -4
- data/lib/ruote/exp/fe_let.rb +75 -0
- data/lib/ruote/exp/fe_listen.rb +68 -12
- data/lib/ruote/exp/fe_lose.rb +110 -0
- data/lib/ruote/exp/fe_noop.rb +1 -1
- data/lib/ruote/exp/{fe_when.rb → fe_once.rb} +25 -21
- data/lib/ruote/exp/fe_participant.rb +14 -17
- data/lib/ruote/exp/fe_redo.rb +10 -6
- data/lib/ruote/exp/fe_ref.rb +1 -1
- data/lib/ruote/exp/fe_registerp.rb +112 -0
- data/lib/ruote/exp/fe_reserve.rb +3 -3
- data/lib/ruote/exp/fe_restore.rb +2 -2
- data/lib/ruote/exp/fe_save.rb +2 -2
- data/lib/ruote/exp/fe_sequence.rb +3 -4
- data/lib/ruote/exp/fe_set.rb +16 -7
- data/lib/ruote/exp/fe_subprocess.rb +23 -1
- data/lib/ruote/exp/fe_that.rb +92 -0
- data/lib/ruote/exp/fe_undo.rb +3 -3
- data/lib/ruote/exp/fe_unregisterp.rb +71 -0
- data/lib/ruote/exp/fe_wait.rb +2 -2
- data/lib/ruote/exp/flowexpression.rb +153 -78
- data/lib/ruote/exp/iterator.rb +2 -2
- data/lib/ruote/exp/merge.rb +2 -2
- data/lib/ruote/exp/ro_attributes.rb +14 -12
- data/lib/ruote/exp/ro_filters.rb +136 -0
- data/lib/ruote/exp/ro_persist.rb +51 -35
- data/lib/ruote/exp/ro_variables.rb +18 -27
- data/lib/ruote/fei.rb +73 -33
- data/lib/ruote/id/mnemo_wfid_generator.rb +1 -1
- data/lib/ruote/id/wfid_generator.rb +11 -4
- data/lib/ruote/log/default_history.rb +122 -0
- data/lib/ruote/log/pretty.rb +36 -8
- data/lib/ruote/log/storage_history.rb +37 -5
- data/lib/ruote/log/test_logger.rb +26 -24
- data/lib/ruote/log/wait_logger.rb +5 -3
- data/lib/ruote/part/block_participant.rb +22 -11
- data/lib/ruote/part/engine_participant.rb +6 -7
- data/lib/ruote/part/local_participant.rb +6 -12
- data/lib/ruote/part/no_op_participant.rb +4 -4
- data/lib/ruote/part/null_participant.rb +4 -4
- data/lib/ruote/part/smtp_participant.rb +4 -4
- data/lib/ruote/part/storage_participant.rb +40 -20
- data/lib/ruote/part/template.rb +4 -4
- data/lib/ruote/participant.rb +0 -1
- data/lib/ruote/{parser.rb → reader.rb} +30 -25
- data/lib/ruote/{parser → reader}/ruby_dsl.rb +28 -11
- data/lib/ruote/{parser → reader}/xml.rb +6 -5
- data/lib/ruote/receiver/base.rb +35 -13
- data/lib/ruote/storage/base.rb +20 -18
- data/lib/ruote/storage/composite_storage.rb +10 -10
- data/lib/ruote/storage/fs_storage.rb +17 -10
- data/lib/ruote/storage/hash_storage.rb +29 -18
- data/lib/ruote/svc/dispatch_pool.rb +41 -14
- data/lib/ruote/svc/dollar_sub.rb +50 -17
- data/lib/ruote/svc/error_handler.rb +19 -11
- data/lib/ruote/svc/expression_map.rb +4 -4
- data/lib/ruote/svc/participant_list.rb +105 -100
- data/lib/ruote/svc/tracker.rb +58 -18
- data/lib/ruote/svc/treechecker.rb +51 -24
- data/lib/ruote/tree_dot.rb +4 -4
- data/lib/ruote/util/filter.rb +440 -0
- data/lib/ruote/util/hashdot.rb +4 -4
- data/lib/ruote/util/look.rb +2 -6
- data/lib/ruote/util/lookup.rb +9 -7
- data/lib/ruote/util/misc.rb +40 -8
- data/lib/ruote/util/ometa.rb +1 -1
- data/lib/ruote/util/serializer.rb +4 -4
- data/lib/ruote/util/subprocess.rb +29 -9
- data/lib/ruote/util/time.rb +4 -4
- data/lib/ruote/util/tree.rb +3 -3
- data/lib/ruote/version.rb +2 -2
- data/lib/ruote/worker.rb +55 -32
- data/lib/ruote/workitem.rb +64 -11
- data/ruote.gemspec +31 -302
- data/test/bm/launch_bench.rb +37 -0
- data/test/functional/base.rb +60 -18
- data/test/functional/concurrent_base.rb +2 -2
- data/test/functional/ct_0_concurrence.rb +1 -1
- data/test/functional/ct_1_iterator.rb +1 -1
- data/test/functional/ct_2_cancel.rb +1 -1
- data/test/functional/eft_0_process_definition.rb +2 -2
- data/test/functional/eft_10_cancel_process.rb +1 -1
- data/test/functional/eft_11_wait.rb +19 -11
- data/test/functional/eft_12_listen.rb +79 -13
- data/test/functional/eft_13_iterator.rb +13 -10
- data/test/functional/eft_14_cursor.rb +98 -9
- data/test/functional/eft_15_loop.rb +6 -4
- data/test/functional/eft_16_if.rb +12 -0
- data/test/functional/eft_18_concurrent_iterator.rb +31 -32
- data/test/functional/eft_19_reserve.rb +4 -4
- data/test/functional/eft_1_echo.rb +9 -0
- data/test/functional/eft_20_save.rb +4 -4
- data/test/functional/{eft_28_when.rb → eft_28_once.rb} +33 -7
- data/test/functional/eft_30_ref.rb +17 -2
- data/test/functional/eft_31_registerp.rb +130 -0
- data/test/functional/eft_32_lose.rb +93 -0
- data/test/functional/eft_33_let.rb +31 -0
- data/test/functional/eft_34_given.rb +123 -0
- data/test/functional/eft_35_filter.rb +269 -0
- data/test/functional/eft_3_participant.rb +4 -6
- data/test/functional/eft_4_set.rb +16 -2
- data/test/functional/eft_5_subprocess.rb +2 -4
- data/test/functional/eft_6_concurrence.rb +29 -29
- data/test/functional/eft_8_undo.rb +39 -3
- data/test/functional/eft_9_redo.rb +94 -2
- data/test/functional/ft_10_dollar.rb +81 -2
- data/test/functional/ft_11_recursion.rb +13 -17
- data/test/functional/ft_12_launchitem.rb +9 -5
- data/test/functional/ft_13_variables.rb +7 -9
- data/test/functional/ft_14_re_apply.rb +6 -9
- data/test/functional/ft_15_timeout.rb +18 -18
- data/test/functional/ft_16_participant_params.rb +1 -3
- data/test/functional/ft_17_conditional.rb +25 -2
- data/test/functional/ft_18_kill.rb +65 -12
- data/test/functional/ft_1_process_status.rb +147 -71
- data/test/functional/ft_20_storage_participant.rb +0 -1
- data/test/functional/ft_21_forget.rb +82 -1
- data/test/functional/{ft_24_block_participants.rb → ft_24_block_participant.rb} +42 -11
- data/test/functional/ft_25_receiver.rb +47 -17
- data/test/functional/{ft_26_participant_timeout.rb → ft_26_participant_rtimeout.rb} +56 -19
- data/test/functional/ft_29_part_template.rb +6 -5
- data/test/functional/ft_2_errors.rb +21 -37
- data/test/functional/ft_30_smtp_participant.rb +1 -1
- data/test/functional/ft_31_part_blocking.rb +8 -6
- data/test/functional/ft_34_cursor_rewind.rb +13 -10
- data/test/functional/ft_35_add_service.rb +1 -1
- data/test/functional/ft_36_storage_history.rb +24 -1
- data/test/functional/ft_37_default_history.rb +109 -0
- data/test/functional/ft_38_participant_more.rb +10 -10
- data/test/functional/ft_39_wait_for.rb +12 -9
- data/test/functional/ft_3_participant_registration.rb +111 -32
- data/test/functional/ft_40_wait_logger.rb +2 -1
- data/test/functional/ft_41_participants.rb +30 -4
- data/test/functional/ft_43_participant_on_reply.rb +6 -23
- data/test/functional/ft_45_participant_accept.rb +4 -4
- data/test/functional/ft_46_launch_single.rb +36 -2
- data/test/functional/ft_47_wfid_generator.rb +54 -0
- data/test/functional/ft_48_lose.rb +112 -0
- data/test/functional/ft_49_engine_on_error.rb +201 -0
- data/test/functional/ft_4_cancel.rb +66 -6
- data/test/functional/ft_50_engine_config.rb +22 -0
- data/test/functional/ft_51_misc.rb +67 -0
- data/test/functional/ft_52_case.rb +134 -0
- data/test/functional/ft_53_engine_on_terminate.rb +95 -0
- data/test/functional/ft_54_patterns.rb +104 -0
- data/test/functional/{ft_37_engine_participant.rb → ft_55_engine_participant.rb} +4 -5
- data/test/functional/ft_56_filter_attribute.rb +259 -0
- data/test/functional/ft_5_on_error.rb +77 -30
- data/test/functional/ft_6_on_cancel.rb +66 -11
- data/test/functional/ft_7_tags.rb +94 -5
- data/test/functional/ft_8_participant_consumption.rb +36 -5
- data/test/functional/ft_9_subprocesses.rb +10 -10
- data/test/functional/rt_1_listen.rb +3 -3
- data/test/functional/{rt_3_when.rb → rt_3_once.rb} +4 -4
- data/test/functional/storage_helper.rb +15 -13
- data/test/functional/test.rb +1 -3
- data/test/test_helper.rb +0 -8
- data/test/unit/storage.rb +154 -10
- data/test/unit/{ut_0_ruby_parser.rb → ut_0_ruby_reader.rb} +61 -11
- data/test/unit/ut_11_lookup.rb +7 -0
- data/test/unit/ut_13_serializer.rb +1 -1
- data/test/unit/ut_15_util.rb +23 -0
- data/test/unit/{ut_16_parser.rb → ut_16_reader.rb} +11 -13
- data/test/unit/ut_1_fei.rb +57 -10
- data/test/unit/ut_20_composite_storage.rb +25 -11
- data/test/unit/ut_21_participant_list.rb +47 -0
- data/test/unit/ut_22_filter.rb +903 -0
- data/test/unit/ut_3_wait_logger.rb +2 -6
- data/test/unit/ut_6_condition.rb +164 -17
- data/test/unit/ut_7_workitem.rb +28 -0
- data/test/unit/ut_8_tree_to_dot.rb +1 -1
- data/test/unit/{ut_9_xml_parser.rb → ut_9_xml_reader.rb} +5 -5
- metadata +108 -84
- data/.gitignore +0 -4
- data/examples/barley.rb +0 -391
- data/examples/flickr_report.rb +0 -107
- data/examples/pong.rb +0 -37
- data/examples/ruote_quickstart.rb +0 -43
- data/examples/web_first_page.rb +0 -68
- data/lib/ruote/part/hash_participant.rb +0 -91
- data/test/README.rdoc +0 -15
- data/test/functional/crunner.sh +0 -19
- data/test/pdef.xml +0 -7
- data/test/unit/ut_2_wfidgen.rb +0 -21
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
|
|
2
|
+
#
|
|
3
|
+
# testing ruote
|
|
4
|
+
#
|
|
5
|
+
# Mon Jan 31 14:45:09 JST 2011
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
require File.join(File.dirname(__FILE__), 'base')
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class EftFilterTest < Test::Unit::TestCase
|
|
12
|
+
include FunctionalBase
|
|
13
|
+
|
|
14
|
+
def assert_terminates(pdef, fields, result=nil)
|
|
15
|
+
|
|
16
|
+
wfid = @engine.launch(pdef, fields)
|
|
17
|
+
r = @engine.wait_for(wfid)
|
|
18
|
+
|
|
19
|
+
assert_equal 'terminated', r['action']
|
|
20
|
+
assert_equal(result, r['workitem']['fields']) if result
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def assert_does_not_validate(pdef, fields={})
|
|
24
|
+
|
|
25
|
+
wfid = @engine.launch(pdef, fields)
|
|
26
|
+
r = @engine.wait_for(wfid)
|
|
27
|
+
|
|
28
|
+
assert_equal 'error_intercepted', r['action']
|
|
29
|
+
assert_match /ValidationError/, @engine.errors.first.message
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
#
|
|
33
|
+
# the tests
|
|
34
|
+
|
|
35
|
+
def test_filter_single_rule_validation
|
|
36
|
+
|
|
37
|
+
pdef = Ruote.process_definition do
|
|
38
|
+
filter 'x', :type => 'string'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
assert_terminates(pdef, 'x' => 'nada')
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_filter_single_rule_validation_failure
|
|
45
|
+
|
|
46
|
+
pdef = Ruote.process_definition do
|
|
47
|
+
filter 'x', :type => 'string'
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
assert_does_not_validate(pdef, 'x' => 2)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_filter_single_rule_transformation
|
|
54
|
+
|
|
55
|
+
pdef = Ruote.process_definition do
|
|
56
|
+
filter 'x', :or => 'crimea'
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
assert_terminates(pdef, {}, { 'x' => 'crimea' })
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def test_filter_single_rule_in
|
|
63
|
+
|
|
64
|
+
pdef = Ruote.process_definition do
|
|
65
|
+
filter 'colour', :in => %w[ red green blue ]
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
assert_terminates(pdef, 'colour' => 'green')
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
PDEF1 = Ruote.process_definition do
|
|
72
|
+
filter :in => [
|
|
73
|
+
{ :field => 'x', :type => 'string' },
|
|
74
|
+
{ :field => 'y', :type => 'number' }
|
|
75
|
+
]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def test_filter_multiple_rules_validation
|
|
79
|
+
|
|
80
|
+
assert_terminates(PDEF1, 'x' => 's', 'y' => 2)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def test_filter_multiple_rules_validation_failure
|
|
84
|
+
|
|
85
|
+
assert_does_not_validate(PDEF1, 'x' => 's', 'y' => 's')
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def test_filter_multiple_rules_transformation
|
|
89
|
+
|
|
90
|
+
pdef = Ruote.process_definition do
|
|
91
|
+
filter :in => [
|
|
92
|
+
{ :field => 'x', :or => 'alpha' },
|
|
93
|
+
{ :field => 'y', :or => 'bravo' }
|
|
94
|
+
]
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
assert_terminates(pdef, {}, { 'x' => 'alpha', 'y' => 'bravo' })
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_filter_in_variable
|
|
101
|
+
|
|
102
|
+
pdef = Ruote.process_definition do
|
|
103
|
+
set 'v:toto' => [
|
|
104
|
+
{ :field => 'a', :set => 'A' },
|
|
105
|
+
{ :field => 'b', :or => 'B' },
|
|
106
|
+
]
|
|
107
|
+
filter 'v:toto'
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
assert_terminates(pdef, {}, { 'a' => 'A', 'b' => 'B' })
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def test_in_filter_in_variable
|
|
114
|
+
|
|
115
|
+
# compatibility with the :filter attribute
|
|
116
|
+
|
|
117
|
+
pdef = Ruote.process_definition do
|
|
118
|
+
set 'v:toto' => { :in => [
|
|
119
|
+
{ :field => 'a', :set => 'A' },
|
|
120
|
+
{ :field => 'b', :or => 'B' },
|
|
121
|
+
] }
|
|
122
|
+
filter 'v:toto'
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
assert_terminates(pdef, {}, { 'a' => 'A', 'b' => 'B' })
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_filter_in_field
|
|
129
|
+
|
|
130
|
+
pdef = Ruote.process_definition do
|
|
131
|
+
set 'f:toto' => [
|
|
132
|
+
{ :field => 'a', :set => 'A' },
|
|
133
|
+
{ :field => 'b', :or => 'B' },
|
|
134
|
+
]
|
|
135
|
+
filter 'f:toto'
|
|
136
|
+
unset 'f:toto'
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
assert_terminates(pdef, {}, { 'a' => 'A', 'b' => 'B' })
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def test_in_filter_in_field
|
|
143
|
+
|
|
144
|
+
pdef = Ruote.process_definition do
|
|
145
|
+
set 'f:toto' => { :in => [
|
|
146
|
+
{ :field => 'a', :set => 'A' },
|
|
147
|
+
{ :field => 'b', :or => 'B' },
|
|
148
|
+
] }
|
|
149
|
+
filter 'f:toto'
|
|
150
|
+
unset 'f:toto'
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
assert_terminates(pdef, {}, { 'a' => 'A', 'b' => 'B' })
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def test_tilde
|
|
157
|
+
|
|
158
|
+
# the ~ points to the hash as it was right before the filtering began
|
|
159
|
+
|
|
160
|
+
pdef = Ruote.process_definition do
|
|
161
|
+
filter :in => [
|
|
162
|
+
{ :field => 'x', :set => 'X' },
|
|
163
|
+
{ :field => 'x', :copy_from => '~.x' },
|
|
164
|
+
]
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
assert_terminates(pdef, { 'x' => 1 }, { 'x' => 1 })
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def test_double_tilde
|
|
171
|
+
|
|
172
|
+
# the ~~ points to the workitem fields as they are in the parent expression
|
|
173
|
+
|
|
174
|
+
pdef = Ruote.process_definition do
|
|
175
|
+
filter 'x', :set => 'X'
|
|
176
|
+
filter 'x', :copy_from => '~~.x'
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
assert_terminates(pdef, { 'x' => 1 }, { 'x' => 1 })
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def test_record
|
|
183
|
+
|
|
184
|
+
pdef = Ruote.process_definition do
|
|
185
|
+
filter 'x', :type => 'string', :record => true
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
assert_terminates(
|
|
189
|
+
pdef,
|
|
190
|
+
{ 'x' => 1 },
|
|
191
|
+
{ '__validation_errors__' => [
|
|
192
|
+
[ { 'type' => 'string', 'field' => 'x' }, 'x', 1 ]
|
|
193
|
+
],
|
|
194
|
+
'x' => 1
|
|
195
|
+
})
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def test_record__complex
|
|
199
|
+
|
|
200
|
+
pdef = Ruote.process_definition do
|
|
201
|
+
filter :in => [
|
|
202
|
+
{ :field => 'x', :type => 'string', :record => true },
|
|
203
|
+
{ :field => 'y', :type => 'number' }
|
|
204
|
+
]
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
assert_terminates(
|
|
208
|
+
pdef,
|
|
209
|
+
{ 'x' => 1 },
|
|
210
|
+
{ '__validation_errors__' => [
|
|
211
|
+
[ { 'type' => 'string', 'field' => 'x' }, 'x', 1 ],
|
|
212
|
+
[ { 'type' => 'number', 'field' => 'y' }, 'y', nil ]
|
|
213
|
+
],
|
|
214
|
+
'x' => 1
|
|
215
|
+
})
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def test_record_in_designated_field
|
|
219
|
+
|
|
220
|
+
pdef = Ruote.process_definition do
|
|
221
|
+
filter 'x', :type => 'string', :record => 'verrors'
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
assert_terminates(
|
|
225
|
+
pdef,
|
|
226
|
+
{ 'x' => 1 },
|
|
227
|
+
{ 'verrors' => [
|
|
228
|
+
[ { 'type' => 'string', 'field' => 'x' }, 'x', 1 ]
|
|
229
|
+
],
|
|
230
|
+
'x' => 1
|
|
231
|
+
})
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def test_record_accumulates
|
|
235
|
+
|
|
236
|
+
pdef = Ruote.process_definition do
|
|
237
|
+
filter 'x', :type => 'string', :record => true
|
|
238
|
+
filter 'y', :type => 'number', :record => true
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
assert_terminates(
|
|
242
|
+
pdef,
|
|
243
|
+
{ 'x' => 1 },
|
|
244
|
+
{ '__validation_errors__' => [
|
|
245
|
+
[ { 'type' => 'string', 'field' => 'x' }, 'x', 1 ],
|
|
246
|
+
[ { 'type' => 'number', 'field' => 'y' }, 'y', nil ]
|
|
247
|
+
],
|
|
248
|
+
'x' => 1
|
|
249
|
+
})
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def test_record_flushes_and_accumulates
|
|
253
|
+
|
|
254
|
+
pdef = Ruote.process_definition do
|
|
255
|
+
filter 'x', :type => 'string', :record => true
|
|
256
|
+
filter 'y', :type => 'number', :record => true, :flush => true
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
assert_terminates(
|
|
260
|
+
pdef,
|
|
261
|
+
{ 'x' => 1 },
|
|
262
|
+
{ '__validation_errors__' => [
|
|
263
|
+
[ { 'type' => 'number', 'field' => 'y' }, 'y', nil ]
|
|
264
|
+
],
|
|
265
|
+
'x' => 1
|
|
266
|
+
})
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
|
|
@@ -68,7 +68,7 @@ class EftParticipantTest < Test::Unit::TestCase
|
|
|
68
68
|
delta :tag => 'whatever'
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
delta = @engine.register_participant :delta, Ruote::
|
|
71
|
+
delta = @engine.register_participant :delta, Ruote::StorageParticipant
|
|
72
72
|
|
|
73
73
|
@engine.launch(pdef)
|
|
74
74
|
wait_for(:delta)
|
|
@@ -88,7 +88,7 @@ class EftParticipantTest < Test::Unit::TestCase
|
|
|
88
88
|
|
|
89
89
|
%w[ eecho fox gamma ].each do |pname|
|
|
90
90
|
@engine.register_participant pname do |workitem|
|
|
91
|
-
@tracer << "#{
|
|
91
|
+
@tracer << "#{workitem.participant_name}\n"
|
|
92
92
|
end
|
|
93
93
|
end
|
|
94
94
|
|
|
@@ -104,11 +104,9 @@ class EftParticipantTest < Test::Unit::TestCase
|
|
|
104
104
|
echo 'done.'
|
|
105
105
|
end
|
|
106
106
|
|
|
107
|
-
atts = nil
|
|
108
|
-
|
|
109
107
|
@engine.register_participant :notify do |wi, fe|
|
|
110
108
|
#p fe.attribute_text
|
|
111
|
-
atts = fe.attributes
|
|
109
|
+
stash[:atts] = fe.attributes
|
|
112
110
|
end
|
|
113
111
|
|
|
114
112
|
#noisy
|
|
@@ -117,7 +115,7 @@ class EftParticipantTest < Test::Unit::TestCase
|
|
|
117
115
|
|
|
118
116
|
assert_equal(
|
|
119
117
|
{ "commander of the left guard"=>nil, "if"=>"true", "ref"=>"notify" },
|
|
120
|
-
atts)
|
|
118
|
+
stash[:atts])
|
|
121
119
|
end
|
|
122
120
|
|
|
123
121
|
def test_dispatched
|
|
@@ -223,9 +223,23 @@ class EftSetTest < Test::Unit::TestCase
|
|
|
223
223
|
|
|
224
224
|
wait_for(wfid)
|
|
225
225
|
|
|
226
|
-
|
|
226
|
+
assert_nil @engine.process(wfid)
|
|
227
|
+
assert_nil @engine.variables['v']
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# 'rset' is an alias for 'set'.
|
|
231
|
+
#
|
|
232
|
+
# motivation at http://groups.google.com/group/openwferu-users/browse_thread/thread/9ac606e30ada686e
|
|
233
|
+
#
|
|
234
|
+
def test_rset
|
|
235
|
+
|
|
236
|
+
wfid = @engine.launch(Ruote.define do
|
|
237
|
+
rset 'developer' => 'Rebo'
|
|
238
|
+
end)
|
|
239
|
+
|
|
240
|
+
r = @engine.wait_for(wfid)
|
|
227
241
|
|
|
228
|
-
assert_equal
|
|
242
|
+
assert_equal 'Rebo', r['workitem']['fields']['developer']
|
|
229
243
|
end
|
|
230
244
|
end
|
|
231
245
|
|
|
@@ -96,17 +96,15 @@ class EftSubprocessTest < Test::Unit::TestCase
|
|
|
96
96
|
end
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
-
tree = nil
|
|
100
|
-
|
|
101
99
|
@engine.register_participant :alpha do |workitem, fexp|
|
|
102
|
-
tree = fexp.lookup_variable('tree')
|
|
100
|
+
stash[:tree] = fexp.lookup_variable('tree')
|
|
103
101
|
end
|
|
104
102
|
|
|
105
103
|
#noisy
|
|
106
104
|
|
|
107
105
|
assert_trace '', pdef
|
|
108
106
|
|
|
109
|
-
assert_equal ["noop", {}, []], tree
|
|
107
|
+
assert_equal ["noop", {}, []], stash[:tree]
|
|
110
108
|
end
|
|
111
109
|
|
|
112
110
|
def test_subprocess_uri
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
require File.join(File.dirname(__FILE__), 'base')
|
|
9
9
|
|
|
10
|
-
require 'ruote/part/hash_participant'
|
|
10
|
+
#require 'ruote/part/hash_participant'
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class EftConcurrenceTest < Test::Unit::TestCase
|
|
@@ -42,20 +42,20 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
42
42
|
bravo
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
@engine.context.instance_eval do
|
|
46
|
+
@count = 0
|
|
47
|
+
end
|
|
48
|
+
# since block participants are evaluated in the context context
|
|
46
49
|
|
|
47
|
-
alpha = @engine.register_participant :alpha do |
|
|
48
|
-
|
|
50
|
+
alpha = @engine.register_participant :alpha, 'do_not_thread' => true do |wi|
|
|
51
|
+
wi.fields['seen'] = 'indeed' if @count == 1
|
|
49
52
|
@tracer << "alpha\n"
|
|
50
|
-
count = count + 1
|
|
53
|
+
@count = @count + 1
|
|
51
54
|
nil
|
|
52
55
|
end
|
|
53
|
-
alpha.do_not_thread = true
|
|
54
|
-
|
|
55
|
-
fields = nil
|
|
56
56
|
|
|
57
57
|
@engine.register_participant :bravo do |workitem|
|
|
58
|
-
fields = workitem.fields
|
|
58
|
+
stash[:fields] = workitem.fields
|
|
59
59
|
nil
|
|
60
60
|
end
|
|
61
61
|
|
|
@@ -67,10 +67,10 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
67
67
|
# {'1'=>{"seen"=>"indeed"}, '0'=>{}, "params"=>{"ref"=>"bravo"}},
|
|
68
68
|
# fields)
|
|
69
69
|
|
|
70
|
-
params = fields.delete('params')
|
|
70
|
+
params = @engine.context.stash[:fields].delete('params')
|
|
71
71
|
|
|
72
72
|
assert_equal({ 'ref' => 'bravo' }, params)
|
|
73
|
-
assert_match /seen/, fields.inspect
|
|
73
|
+
assert_match /seen/, @engine.context.stash[:fields].inspect
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
def test_over_unless
|
|
@@ -85,17 +85,19 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
85
85
|
echo 'done.'
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
@engine.context.instance_eval do
|
|
89
|
+
@count = 0
|
|
90
|
+
end
|
|
91
|
+
# since block participants are evaluated in the context context
|
|
89
92
|
|
|
90
|
-
alpha = @engine.register_participant :alpha do |
|
|
91
|
-
if count > 1
|
|
92
|
-
|
|
93
|
+
alpha = @engine.register_participant :alpha, 'do_not_thread' => true do |wi|
|
|
94
|
+
if @count > 1
|
|
95
|
+
wi.fields['ok'] = false
|
|
93
96
|
else
|
|
94
97
|
@tracer << "a\n"
|
|
95
|
-
count = count + 1
|
|
98
|
+
@count = @count + 1
|
|
96
99
|
end
|
|
97
100
|
end
|
|
98
|
-
alpha.do_not_thread = true
|
|
99
101
|
|
|
100
102
|
fields = nil
|
|
101
103
|
|
|
@@ -125,7 +127,7 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
125
127
|
|
|
126
128
|
# helper
|
|
127
129
|
#
|
|
128
|
-
def run_concurrence
|
|
130
|
+
def run_concurrence(concurrence_attributes, noise)
|
|
129
131
|
|
|
130
132
|
pdef = Ruote.process_definition do
|
|
131
133
|
sequence do
|
|
@@ -137,7 +139,7 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
137
139
|
alpha
|
|
138
140
|
end
|
|
139
141
|
|
|
140
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
|
142
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
|
141
143
|
|
|
142
144
|
noisy if noise
|
|
143
145
|
|
|
@@ -206,7 +208,7 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
206
208
|
|
|
207
209
|
# helper
|
|
208
210
|
#
|
|
209
|
-
def run_test_count
|
|
211
|
+
def run_test_count(remaining, noise)
|
|
210
212
|
|
|
211
213
|
pdef = Ruote.process_definition do
|
|
212
214
|
concurrence :count => 1, :remaining => remaining do
|
|
@@ -215,8 +217,7 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
215
217
|
end
|
|
216
218
|
end
|
|
217
219
|
|
|
218
|
-
@
|
|
219
|
-
@bravo = @engine.register_participant :bravo, Ruote::HashParticipant.new
|
|
220
|
+
@engine.register_participant '.+', Ruote::StorageParticipant
|
|
220
221
|
|
|
221
222
|
noisy if noise
|
|
222
223
|
|
|
@@ -224,7 +225,7 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
224
225
|
|
|
225
226
|
wait_for(:alpha)
|
|
226
227
|
|
|
227
|
-
@
|
|
228
|
+
@engine.storage_participant.reply(@engine.storage_participant.first)
|
|
228
229
|
|
|
229
230
|
wait_for(wfid)
|
|
230
231
|
|
|
@@ -244,8 +245,7 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
244
245
|
|
|
245
246
|
sleep 0.350 # since now dispatch_cancel occurs asynchronously...
|
|
246
247
|
|
|
247
|
-
assert_equal 0, @
|
|
248
|
-
assert_equal 0, @bravo.size
|
|
248
|
+
assert_equal 0, @engine.storage_participant.size
|
|
249
249
|
end
|
|
250
250
|
|
|
251
251
|
def test_count_remaining_forget
|
|
@@ -256,15 +256,15 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
256
256
|
|
|
257
257
|
#assert_equal 1, logger.log.select { |e| e['action'] == 'forget' }.size
|
|
258
258
|
|
|
259
|
-
assert_equal
|
|
260
|
-
assert_equal
|
|
259
|
+
assert_equal 1, @engine.storage_participant.size
|
|
260
|
+
assert_equal 'bravo', @engine.storage_participant.first.participant_name
|
|
261
261
|
|
|
262
262
|
#@engine.context.storage.get_many('expressions').each { |e| p e['fei'] }
|
|
263
263
|
#puts @engine.context.storage.dump('expressions')
|
|
264
264
|
assert_equal 2, @engine.context.storage.get_many('expressions').size
|
|
265
265
|
assert_not_nil @engine.process(wfid)
|
|
266
266
|
|
|
267
|
-
@
|
|
267
|
+
@engine.storage_participant.reply(@engine.storage_participant.first)
|
|
268
268
|
|
|
269
269
|
wait_for(wfid)
|
|
270
270
|
|
|
@@ -281,7 +281,7 @@ class EftConcurrenceTest < Test::Unit::TestCase
|
|
|
281
281
|
end
|
|
282
282
|
end
|
|
283
283
|
|
|
284
|
-
alpha = @engine.register_participant :alpha, Ruote::
|
|
284
|
+
alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
|
|
285
285
|
|
|
286
286
|
#noisy
|
|
287
287
|
|