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.
Files changed (217) hide show
  1. data/CHANGELOG.txt +60 -0
  2. data/CREDITS.txt +22 -4
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +6 -7
  5. data/Rakefile +58 -59
  6. data/TODO.txt +137 -65
  7. data/couch_url.txt +1 -0
  8. data/jruby_issue.txt +32 -0
  9. data/lib/ruote.rb +1 -1
  10. data/lib/ruote/context.rb +12 -10
  11. data/lib/ruote/engine.rb +280 -145
  12. data/lib/ruote/engine/process_error.rb +5 -5
  13. data/lib/ruote/engine/process_status.rb +47 -28
  14. data/lib/ruote/exp/command.rb +7 -10
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +130 -43
  17. data/lib/ruote/exp/fe_add_branches.rb +2 -2
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_cancel_process.rb +3 -3
  20. data/lib/ruote/exp/fe_command.rb +3 -3
  21. data/lib/ruote/exp/fe_concurrence.rb +4 -4
  22. data/lib/ruote/exp/fe_concurrent_iterator.rb +17 -5
  23. data/lib/ruote/exp/fe_cron.rb +3 -3
  24. data/lib/ruote/exp/fe_cursor.rb +5 -5
  25. data/lib/ruote/exp/fe_define.rb +3 -3
  26. data/lib/ruote/exp/fe_echo.rb +3 -3
  27. data/lib/ruote/exp/fe_equals.rb +2 -2
  28. data/lib/ruote/exp/fe_error.rb +2 -2
  29. data/lib/ruote/exp/fe_filter.rb +519 -0
  30. data/lib/ruote/exp/fe_forget.rb +9 -2
  31. data/lib/ruote/exp/fe_given.rb +154 -0
  32. data/lib/ruote/exp/fe_if.rb +16 -13
  33. data/lib/ruote/exp/fe_inc.rb +3 -3
  34. data/lib/ruote/exp/fe_iterator.rb +4 -4
  35. data/lib/ruote/exp/fe_let.rb +75 -0
  36. data/lib/ruote/exp/fe_listen.rb +68 -12
  37. data/lib/ruote/exp/fe_lose.rb +110 -0
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/{fe_when.rb → fe_once.rb} +25 -21
  40. data/lib/ruote/exp/fe_participant.rb +14 -17
  41. data/lib/ruote/exp/fe_redo.rb +10 -6
  42. data/lib/ruote/exp/fe_ref.rb +1 -1
  43. data/lib/ruote/exp/fe_registerp.rb +112 -0
  44. data/lib/ruote/exp/fe_reserve.rb +3 -3
  45. data/lib/ruote/exp/fe_restore.rb +2 -2
  46. data/lib/ruote/exp/fe_save.rb +2 -2
  47. data/lib/ruote/exp/fe_sequence.rb +3 -4
  48. data/lib/ruote/exp/fe_set.rb +16 -7
  49. data/lib/ruote/exp/fe_subprocess.rb +23 -1
  50. data/lib/ruote/exp/fe_that.rb +92 -0
  51. data/lib/ruote/exp/fe_undo.rb +3 -3
  52. data/lib/ruote/exp/fe_unregisterp.rb +71 -0
  53. data/lib/ruote/exp/fe_wait.rb +2 -2
  54. data/lib/ruote/exp/flowexpression.rb +153 -78
  55. data/lib/ruote/exp/iterator.rb +2 -2
  56. data/lib/ruote/exp/merge.rb +2 -2
  57. data/lib/ruote/exp/ro_attributes.rb +14 -12
  58. data/lib/ruote/exp/ro_filters.rb +136 -0
  59. data/lib/ruote/exp/ro_persist.rb +51 -35
  60. data/lib/ruote/exp/ro_variables.rb +18 -27
  61. data/lib/ruote/fei.rb +73 -33
  62. data/lib/ruote/id/mnemo_wfid_generator.rb +1 -1
  63. data/lib/ruote/id/wfid_generator.rb +11 -4
  64. data/lib/ruote/log/default_history.rb +122 -0
  65. data/lib/ruote/log/pretty.rb +36 -8
  66. data/lib/ruote/log/storage_history.rb +37 -5
  67. data/lib/ruote/log/test_logger.rb +26 -24
  68. data/lib/ruote/log/wait_logger.rb +5 -3
  69. data/lib/ruote/part/block_participant.rb +22 -11
  70. data/lib/ruote/part/engine_participant.rb +6 -7
  71. data/lib/ruote/part/local_participant.rb +6 -12
  72. data/lib/ruote/part/no_op_participant.rb +4 -4
  73. data/lib/ruote/part/null_participant.rb +4 -4
  74. data/lib/ruote/part/smtp_participant.rb +4 -4
  75. data/lib/ruote/part/storage_participant.rb +40 -20
  76. data/lib/ruote/part/template.rb +4 -4
  77. data/lib/ruote/participant.rb +0 -1
  78. data/lib/ruote/{parser.rb → reader.rb} +30 -25
  79. data/lib/ruote/{parser → reader}/ruby_dsl.rb +28 -11
  80. data/lib/ruote/{parser → reader}/xml.rb +6 -5
  81. data/lib/ruote/receiver/base.rb +35 -13
  82. data/lib/ruote/storage/base.rb +20 -18
  83. data/lib/ruote/storage/composite_storage.rb +10 -10
  84. data/lib/ruote/storage/fs_storage.rb +17 -10
  85. data/lib/ruote/storage/hash_storage.rb +29 -18
  86. data/lib/ruote/svc/dispatch_pool.rb +41 -14
  87. data/lib/ruote/svc/dollar_sub.rb +50 -17
  88. data/lib/ruote/svc/error_handler.rb +19 -11
  89. data/lib/ruote/svc/expression_map.rb +4 -4
  90. data/lib/ruote/svc/participant_list.rb +105 -100
  91. data/lib/ruote/svc/tracker.rb +58 -18
  92. data/lib/ruote/svc/treechecker.rb +51 -24
  93. data/lib/ruote/tree_dot.rb +4 -4
  94. data/lib/ruote/util/filter.rb +440 -0
  95. data/lib/ruote/util/hashdot.rb +4 -4
  96. data/lib/ruote/util/look.rb +2 -6
  97. data/lib/ruote/util/lookup.rb +9 -7
  98. data/lib/ruote/util/misc.rb +40 -8
  99. data/lib/ruote/util/ometa.rb +1 -1
  100. data/lib/ruote/util/serializer.rb +4 -4
  101. data/lib/ruote/util/subprocess.rb +29 -9
  102. data/lib/ruote/util/time.rb +4 -4
  103. data/lib/ruote/util/tree.rb +3 -3
  104. data/lib/ruote/version.rb +2 -2
  105. data/lib/ruote/worker.rb +55 -32
  106. data/lib/ruote/workitem.rb +64 -11
  107. data/ruote.gemspec +31 -302
  108. data/test/bm/launch_bench.rb +37 -0
  109. data/test/functional/base.rb +60 -18
  110. data/test/functional/concurrent_base.rb +2 -2
  111. data/test/functional/ct_0_concurrence.rb +1 -1
  112. data/test/functional/ct_1_iterator.rb +1 -1
  113. data/test/functional/ct_2_cancel.rb +1 -1
  114. data/test/functional/eft_0_process_definition.rb +2 -2
  115. data/test/functional/eft_10_cancel_process.rb +1 -1
  116. data/test/functional/eft_11_wait.rb +19 -11
  117. data/test/functional/eft_12_listen.rb +79 -13
  118. data/test/functional/eft_13_iterator.rb +13 -10
  119. data/test/functional/eft_14_cursor.rb +98 -9
  120. data/test/functional/eft_15_loop.rb +6 -4
  121. data/test/functional/eft_16_if.rb +12 -0
  122. data/test/functional/eft_18_concurrent_iterator.rb +31 -32
  123. data/test/functional/eft_19_reserve.rb +4 -4
  124. data/test/functional/eft_1_echo.rb +9 -0
  125. data/test/functional/eft_20_save.rb +4 -4
  126. data/test/functional/{eft_28_when.rb → eft_28_once.rb} +33 -7
  127. data/test/functional/eft_30_ref.rb +17 -2
  128. data/test/functional/eft_31_registerp.rb +130 -0
  129. data/test/functional/eft_32_lose.rb +93 -0
  130. data/test/functional/eft_33_let.rb +31 -0
  131. data/test/functional/eft_34_given.rb +123 -0
  132. data/test/functional/eft_35_filter.rb +269 -0
  133. data/test/functional/eft_3_participant.rb +4 -6
  134. data/test/functional/eft_4_set.rb +16 -2
  135. data/test/functional/eft_5_subprocess.rb +2 -4
  136. data/test/functional/eft_6_concurrence.rb +29 -29
  137. data/test/functional/eft_8_undo.rb +39 -3
  138. data/test/functional/eft_9_redo.rb +94 -2
  139. data/test/functional/ft_10_dollar.rb +81 -2
  140. data/test/functional/ft_11_recursion.rb +13 -17
  141. data/test/functional/ft_12_launchitem.rb +9 -5
  142. data/test/functional/ft_13_variables.rb +7 -9
  143. data/test/functional/ft_14_re_apply.rb +6 -9
  144. data/test/functional/ft_15_timeout.rb +18 -18
  145. data/test/functional/ft_16_participant_params.rb +1 -3
  146. data/test/functional/ft_17_conditional.rb +25 -2
  147. data/test/functional/ft_18_kill.rb +65 -12
  148. data/test/functional/ft_1_process_status.rb +147 -71
  149. data/test/functional/ft_20_storage_participant.rb +0 -1
  150. data/test/functional/ft_21_forget.rb +82 -1
  151. data/test/functional/{ft_24_block_participants.rb → ft_24_block_participant.rb} +42 -11
  152. data/test/functional/ft_25_receiver.rb +47 -17
  153. data/test/functional/{ft_26_participant_timeout.rb → ft_26_participant_rtimeout.rb} +56 -19
  154. data/test/functional/ft_29_part_template.rb +6 -5
  155. data/test/functional/ft_2_errors.rb +21 -37
  156. data/test/functional/ft_30_smtp_participant.rb +1 -1
  157. data/test/functional/ft_31_part_blocking.rb +8 -6
  158. data/test/functional/ft_34_cursor_rewind.rb +13 -10
  159. data/test/functional/ft_35_add_service.rb +1 -1
  160. data/test/functional/ft_36_storage_history.rb +24 -1
  161. data/test/functional/ft_37_default_history.rb +109 -0
  162. data/test/functional/ft_38_participant_more.rb +10 -10
  163. data/test/functional/ft_39_wait_for.rb +12 -9
  164. data/test/functional/ft_3_participant_registration.rb +111 -32
  165. data/test/functional/ft_40_wait_logger.rb +2 -1
  166. data/test/functional/ft_41_participants.rb +30 -4
  167. data/test/functional/ft_43_participant_on_reply.rb +6 -23
  168. data/test/functional/ft_45_participant_accept.rb +4 -4
  169. data/test/functional/ft_46_launch_single.rb +36 -2
  170. data/test/functional/ft_47_wfid_generator.rb +54 -0
  171. data/test/functional/ft_48_lose.rb +112 -0
  172. data/test/functional/ft_49_engine_on_error.rb +201 -0
  173. data/test/functional/ft_4_cancel.rb +66 -6
  174. data/test/functional/ft_50_engine_config.rb +22 -0
  175. data/test/functional/ft_51_misc.rb +67 -0
  176. data/test/functional/ft_52_case.rb +134 -0
  177. data/test/functional/ft_53_engine_on_terminate.rb +95 -0
  178. data/test/functional/ft_54_patterns.rb +104 -0
  179. data/test/functional/{ft_37_engine_participant.rb → ft_55_engine_participant.rb} +4 -5
  180. data/test/functional/ft_56_filter_attribute.rb +259 -0
  181. data/test/functional/ft_5_on_error.rb +77 -30
  182. data/test/functional/ft_6_on_cancel.rb +66 -11
  183. data/test/functional/ft_7_tags.rb +94 -5
  184. data/test/functional/ft_8_participant_consumption.rb +36 -5
  185. data/test/functional/ft_9_subprocesses.rb +10 -10
  186. data/test/functional/rt_1_listen.rb +3 -3
  187. data/test/functional/{rt_3_when.rb → rt_3_once.rb} +4 -4
  188. data/test/functional/storage_helper.rb +15 -13
  189. data/test/functional/test.rb +1 -3
  190. data/test/test_helper.rb +0 -8
  191. data/test/unit/storage.rb +154 -10
  192. data/test/unit/{ut_0_ruby_parser.rb → ut_0_ruby_reader.rb} +61 -11
  193. data/test/unit/ut_11_lookup.rb +7 -0
  194. data/test/unit/ut_13_serializer.rb +1 -1
  195. data/test/unit/ut_15_util.rb +23 -0
  196. data/test/unit/{ut_16_parser.rb → ut_16_reader.rb} +11 -13
  197. data/test/unit/ut_1_fei.rb +57 -10
  198. data/test/unit/ut_20_composite_storage.rb +25 -11
  199. data/test/unit/ut_21_participant_list.rb +47 -0
  200. data/test/unit/ut_22_filter.rb +903 -0
  201. data/test/unit/ut_3_wait_logger.rb +2 -6
  202. data/test/unit/ut_6_condition.rb +164 -17
  203. data/test/unit/ut_7_workitem.rb +28 -0
  204. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  205. data/test/unit/{ut_9_xml_parser.rb → ut_9_xml_reader.rb} +5 -5
  206. metadata +108 -84
  207. data/.gitignore +0 -4
  208. data/examples/barley.rb +0 -391
  209. data/examples/flickr_report.rb +0 -107
  210. data/examples/pong.rb +0 -37
  211. data/examples/ruote_quickstart.rb +0 -43
  212. data/examples/web_first_page.rb +0 -68
  213. data/lib/ruote/part/hash_participant.rb +0 -91
  214. data/test/README.rdoc +0 -15
  215. data/test/functional/crunner.sh +0 -19
  216. data/test/pdef.xml +0 -7
  217. data/test/unit/ut_2_wfidgen.rb +0 -21
@@ -0,0 +1,22 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Dec 6 10:40:29 JST 2010
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+
11
+ class FtEngineConfigTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_engine_config
15
+
16
+ @engine.configure('a', 'b')
17
+
18
+ assert_equal 'b', @engine.configuration('a')
19
+ assert_equal 'b', @engine.storage.get_configuration('engine')['a']
20
+ end
21
+ end
22
+
@@ -0,0 +1,67 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Thu Dec 9 16:39:54 JST 2010
6
+ #
7
+
8
+ require 'stringio'
9
+ require File.join(File.dirname(__FILE__), 'base')
10
+
11
+
12
+ class FtMiscTest < Test::Unit::TestCase
13
+ include FunctionalBase
14
+
15
+ def test_noisy
16
+
17
+ result = String.new
18
+ out = StringIO.new(result, 'w+')
19
+
20
+ prev = $stdout
21
+ $stdout = out
22
+
23
+ @engine.noisy = true
24
+
25
+ wfid = @engine.launch(Ruote.define do
26
+ echo 'nada'
27
+ end)
28
+
29
+ @engine.wait_for(wfid)
30
+
31
+ out.close
32
+ $stdout = prev
33
+
34
+ assert_not_nil result
35
+ end
36
+
37
+ class NoCancel
38
+ def consume(workitem)
39
+ # do nothing
40
+ end
41
+ # no cancel method implementation
42
+ end
43
+
44
+ def test_participant_missing_cancel_method
45
+
46
+ pdef = Ruote.define do
47
+ participant 'no_cancel'
48
+ end
49
+
50
+ @engine.register 'no_cancel', NoCancel
51
+
52
+ #noisy
53
+
54
+ wfid = @engine.launch(pdef)
55
+
56
+ @engine.wait_for(:no_cancel)
57
+
58
+ @engine.cancel(wfid)
59
+
60
+ @engine.wait_for(wfid)
61
+
62
+ assert_match(
63
+ /undefined method `cancel' for/,
64
+ @engine.ps(wfid).errors.first.message)
65
+ end
66
+ end
67
+
@@ -0,0 +1,134 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Fri Dec 24 14:53:30 JST 2010
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+
11
+ #
12
+ # Tests about replacement for case x when 'y' and switch(x) constructs.
13
+ #
14
+ class FtCaseTest < Test::Unit::TestCase
15
+ include FunctionalBase
16
+
17
+ # The alternatives are bound at the process level
18
+ #
19
+ def test_open_lambda
20
+
21
+ pdef = Ruote.define do
22
+
23
+ define 'a' do
24
+ set 'f:result' => 'a'
25
+ end
26
+ define 'b' do
27
+ set 'f:result' => 'b'
28
+ end
29
+
30
+ subprocess '${the_case}'
31
+ end
32
+
33
+ wfid = @engine.launch(pdef, 'the_case' => 'a')
34
+ r = @engine.wait_for(wfid)
35
+ assert_equal 'a', r['workitem']['fields']['result']
36
+
37
+ wfid = @engine.launch(pdef, 'the_case' => 'b')
38
+ r = @engine.wait_for(wfid)
39
+ assert_equal 'b', r['workitem']['fields']['result']
40
+ end
41
+
42
+ # The alternatives are bound inside of the case subprocess (definition)
43
+ #
44
+ def test_nested_lambda
45
+
46
+ pdef = Ruote.define do
47
+
48
+ define 'case' do
49
+ define 'a' do
50
+ set 'f:result' => 'a'
51
+ end
52
+ define 'b' do
53
+ set 'f:result' => 'b'
54
+ end
55
+ subprocess '${the_case}'
56
+ end
57
+
58
+ subprocess 'case'
59
+ end
60
+
61
+ wfid = @engine.launch(pdef, 'the_case' => 'a')
62
+ r = @engine.wait_for(wfid)
63
+ assert_equal 'a', r['workitem']['fields']['result']
64
+
65
+ wfid = @engine.launch(pdef, 'the_case' => 'b')
66
+ r = @engine.wait_for(wfid)
67
+ assert_equal 'b', r['workitem']['fields']['result']
68
+ end
69
+
70
+ # /!\
71
+ #
72
+ # Works as well, but the cases are bound in the global/process scope
73
+ #
74
+ def test_local_lambda
75
+
76
+ pdef = Ruote.define do
77
+
78
+ sequence do
79
+ define 'a' do
80
+ set 'f:result' => 'a'
81
+ end
82
+ define 'b' do
83
+ set 'f:result' => 'b'
84
+ end
85
+ subprocess '${the_case}'
86
+ end
87
+
88
+ subprocess 'a' # /!\
89
+ end
90
+
91
+ wfid = @engine.launch(pdef, 'the_case' => 'a')
92
+ r = @engine.wait_for(wfid)
93
+ assert_equal 'a', r['workitem']['fields']['result']
94
+
95
+ wfid = @engine.launch(pdef, 'the_case' => 'b')
96
+ r = @engine.wait_for(wfid)
97
+ assert_equal 'a', r['workitem']['fields']['result']
98
+ end
99
+
100
+ # Works as well, but the cases are bound in the global/process scope
101
+ #
102
+ def test_let_lambda
103
+
104
+ pdef = Ruote.define do
105
+
106
+ define 'a' do
107
+ echo 'global_a'
108
+ end
109
+
110
+ let do
111
+ define 'a' do
112
+ echo 'a'
113
+ end
114
+ define 'b' do
115
+ echo 'b'
116
+ end
117
+ subprocess '${the_case}'
118
+ end
119
+
120
+ subprocess 'a'
121
+ end
122
+
123
+ wfid = @engine.launch(pdef, 'the_case' => 'a')
124
+ @engine.wait_for(wfid)
125
+ assert_equal %w[ a global_a ], @tracer.to_a
126
+
127
+ @tracer.clear
128
+
129
+ wfid = @engine.launch(pdef, 'the_case' => 'b')
130
+ @engine.wait_for(wfid)
131
+ assert_equal %w[ b global_a ], @tracer.to_a
132
+ end
133
+ end
134
+
@@ -0,0 +1,95 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Thu Jan 6 21:49:01 JST 2011
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+ #require 'ruote/participant'
11
+
12
+
13
+ class FtEngineOnTerminateTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_no_on_terminate
17
+
18
+ assert_nil @engine.on_terminate
19
+ end
20
+
21
+ def test_on_terminate
22
+
23
+ @engine.on_terminate = 'supervisor'
24
+
25
+ assert_equal(
26
+ [ 'define', {}, [ [ 'supervisor', {}, [] ] ] ],
27
+ @engine.on_terminate)
28
+ end
29
+
30
+ def test_on_terminate_tree
31
+
32
+ @engine.on_terminate = Ruote.define do
33
+ echo '${__terminate__.wfid} terminated'
34
+ end
35
+
36
+ #@engine.noisy = true
37
+
38
+ wfid = @engine.launch(Ruote.define do
39
+ echo 'main'
40
+ end)
41
+
42
+ @engine.wait_for(wfid)
43
+ sleep 1
44
+
45
+ assert_equal [ 'main', "#{wfid} terminated" ], @tracer.to_a
46
+ end
47
+
48
+ # on_terminate processes are not triggered for on_error processes.
49
+ #
50
+ def test_no_on_terminate_when_on_error
51
+
52
+ @engine.on_error = Ruote.define do
53
+ echo 'on_error'
54
+ end
55
+ @engine.on_terminate = Ruote.define do
56
+ echo 'on_terminate'
57
+ end
58
+
59
+ #noisy
60
+
61
+ wfid = @engine.launch(Ruote.define do
62
+ echo 'main'
63
+ error 'in main'
64
+ end)
65
+
66
+ @engine.wait_for(wfid)
67
+ sleep 1
68
+
69
+ assert_equal [ 'main', 'on_error' ], @tracer.to_a
70
+ end
71
+
72
+ # on_error processes are triggered for on_terminate processes as well.
73
+ #
74
+ def test_on_error_when_on_terminate
75
+
76
+ @engine.on_error = Ruote.define do
77
+ echo 'on_error'
78
+ end
79
+ @engine.on_terminate = Ruote.define do
80
+ error 'in on_terminate'
81
+ end
82
+
83
+ #noisy
84
+
85
+ wfid = @engine.launch(Ruote.define do
86
+ echo 'main'
87
+ end)
88
+
89
+ @engine.wait_for(wfid)
90
+ sleep 1
91
+
92
+ assert_equal [ 'main', 'on_error' ], @tracer.to_a
93
+ end
94
+ end
95
+
@@ -0,0 +1,104 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Fri Jan 7 15:13:28 JST 2011
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), 'base')
9
+
10
+ #require 'ruote/participant'
11
+
12
+
13
+ class FtPatternsTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+
17
+ # A task is only enabled when the process instance (of which it is part) is
18
+ # in a specific state (typically a parallel branch). The state is assumed to
19
+ # be a specific execution point (also known as a milestone) in the process
20
+ # model. When this execution point is reached the nominated task can be
21
+ # enabled. If the process instance has progressed beyond this state, then the
22
+ # task cannot be enabled now or at any future time (i.e. the deadline has
23
+ # expired). Note that the execution does not influence the state itself, i.e.
24
+ # unlike normal control-flow dependencies it is a test rather than a trigger.
25
+
26
+ #MILESTONE = Ruote.define do
27
+ #
28
+ # concurrence :count => 1 do
29
+ #
30
+ # sequence do
31
+ # participant 'a'
32
+ # participant 'b', :tag => 'milestone'
33
+ # participant 'c'
34
+ # end
35
+ #
36
+ # listen :to => 'milestone', :upon => 'entering', :wfid => true do
37
+ # concurrence :count => 1 do
38
+ # listen :to => 'milestone', :upon => 'leaving', :wfid => true
39
+ # participant 'd'
40
+ # end
41
+ # end
42
+ # end
43
+ #end
44
+ # this works, but, if the participant d implementation is 'fast', the
45
+ # milestone could be left before the inner listen is reached.
46
+ # This listen could thus listen for an event that already occurred and
47
+ # thus be locked...
48
+ #
49
+ # the revised version makes sure the milestone is listened to (bot#
50
+ # entering and leaving) before participant b is reached.
51
+
52
+ MILESTONE = Ruote.define do
53
+
54
+ concurrence do
55
+
56
+ sequence do
57
+ participant 'a'
58
+ participant 'b', :tag => 'milestone'
59
+ participant 'c'
60
+ end
61
+
62
+ concurrence :count => 1 do
63
+ sequence do
64
+ listen :to => 'milestone', :upon => 'entering', :wfid => true
65
+ participant 'd'
66
+ end
67
+ listen :to => 'milestone', :upon => 'leaving', :wfid => true
68
+ end
69
+ end
70
+ end
71
+
72
+ def test_18_milestone
73
+
74
+ @engine.register do
75
+ catchall Ruote::StorageParticipant
76
+ end
77
+
78
+ #@engine.noisy = true
79
+
80
+ wfid = @engine.launch(MILESTONE)
81
+
82
+ @engine.wait_for(:a)
83
+
84
+ assert_equal({}, @engine.ps(wfid).tags)
85
+
86
+ @engine.storage_participant.reply(@engine.storage_participant.first)
87
+
88
+ @engine.wait_for(:d)
89
+
90
+ assert_equal %w[ milestone ], @engine.ps(wfid).tags.collect { |t| t.first }
91
+ assert_equal %w[ b d ], @engine.ps(wfid).position.collect { |pos| pos[1] }
92
+
93
+ wi = @engine.storage_participant.by_participant('b').first
94
+ @engine.storage_participant.reply(wi)
95
+
96
+ @engine.wait_for(:c)
97
+
98
+ sleep 0.7 # give some time for the task d to get removed
99
+
100
+ assert_equal({}, @engine.ps(wfid).tags)
101
+ assert_equal %w[ c ], @engine.ps(wfid).position.collect { |pos| pos[1] }
102
+ end
103
+ end
104
+
@@ -11,8 +11,7 @@ require File.join(File.dirname(__FILE__), 'base')
11
11
 
12
12
  require 'ruote'
13
13
  require 'ruote/storage/fs_storage'
14
- require 'ruote/part/hash_participant'
15
- require 'ruote/part/engine_participant'
14
+ require 'ruote/participant'
16
15
 
17
16
 
18
17
  class FtEngineParticipantTest < Test::Unit::TestCase
@@ -155,14 +154,14 @@ class FtEngineParticipantTest < Test::Unit::TestCase
155
154
 
156
155
  #noisy
157
156
 
158
- alpha = @engine1.register_participant :alpha, Ruote::HashParticipant.new
157
+ alpha = @engine1.register_participant :alpha, Ruote::StorageParticipant
159
158
 
160
159
  wfid = @engine0.launch(pdef)
161
160
 
162
161
  @engine1.wait_for(:alpha)
163
162
 
164
163
  assert_equal 1, alpha.size
165
- assert_not_nil alpha.first.fei.sub_wfid
164
+ assert_not_nil alpha.first.fei.subid
166
165
 
167
166
  @engine0.cancel_process(wfid)
168
167
  @engine0.wait_for(wfid)
@@ -236,7 +235,7 @@ class FtEngineParticipantTest < Test::Unit::TestCase
236
235
  end
237
236
  end
238
237
 
239
- bravo = @engine1.register_participant :bravo, Ruote::HashParticipant.new
238
+ bravo = @engine1.register_participant :bravo, Ruote::StorageParticipant
240
239
 
241
240
  #noisy
242
241