ruote 2.2.0 → 2.3.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 (305) hide show
  1. data/CHANGELOG.txt +166 -1
  2. data/CREDITS.txt +36 -17
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +1 -7
  5. data/Rakefile +38 -29
  6. data/TODO.txt +93 -52
  7. data/lib/ruote-fs.rb +3 -0
  8. data/lib/ruote.rb +5 -1
  9. data/lib/ruote/context.rb +140 -35
  10. data/lib/ruote/dashboard.rb +1247 -0
  11. data/lib/ruote/{engine → dboard}/process_error.rb +22 -2
  12. data/lib/ruote/dboard/process_status.rb +587 -0
  13. data/lib/ruote/engine.rb +6 -871
  14. data/lib/ruote/exp/command.rb +7 -2
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +38 -13
  17. data/lib/ruote/exp/fe_add_branches.rb +1 -1
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_await.rb +357 -0
  20. data/lib/ruote/exp/fe_cancel_process.rb +17 -3
  21. data/lib/ruote/exp/fe_command.rb +8 -4
  22. data/lib/ruote/exp/fe_concurrence.rb +218 -18
  23. data/lib/ruote/exp/fe_concurrent_iterator.rb +71 -10
  24. data/lib/ruote/exp/fe_cron.rb +3 -10
  25. data/lib/ruote/exp/fe_cursor.rb +14 -4
  26. data/lib/ruote/exp/fe_define.rb +3 -1
  27. data/lib/ruote/exp/fe_echo.rb +1 -1
  28. data/lib/ruote/exp/fe_equals.rb +1 -1
  29. data/lib/ruote/exp/fe_error.rb +1 -1
  30. data/lib/ruote/exp/fe_filter.rb +163 -4
  31. data/lib/ruote/exp/fe_forget.rb +21 -4
  32. data/lib/ruote/exp/fe_given.rb +1 -1
  33. data/lib/ruote/exp/fe_if.rb +1 -1
  34. data/lib/ruote/exp/fe_inc.rb +102 -35
  35. data/lib/ruote/exp/fe_iterator.rb +47 -12
  36. data/lib/ruote/exp/fe_listen.rb +96 -11
  37. data/lib/ruote/exp/fe_lose.rb +31 -4
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/fe_on_error.rb +109 -0
  40. data/lib/ruote/exp/fe_once.rb +10 -19
  41. data/lib/ruote/exp/fe_participant.rb +90 -28
  42. data/lib/ruote/exp/fe_read.rb +69 -0
  43. data/lib/ruote/exp/fe_redo.rb +3 -2
  44. data/lib/ruote/exp/fe_ref.rb +57 -27
  45. data/lib/ruote/exp/fe_registerp.rb +1 -3
  46. data/lib/ruote/exp/fe_reserve.rb +1 -1
  47. data/lib/ruote/exp/fe_restore.rb +6 -6
  48. data/lib/ruote/exp/fe_save.rb +12 -19
  49. data/lib/ruote/exp/fe_sequence.rb +38 -2
  50. data/lib/ruote/exp/fe_set.rb +143 -40
  51. data/lib/ruote/exp/{fe_let.rb → fe_stall.rb} +7 -38
  52. data/lib/ruote/exp/fe_subprocess.rb +8 -2
  53. data/lib/ruote/exp/fe_that.rb +1 -1
  54. data/lib/ruote/exp/fe_undo.rb +40 -4
  55. data/lib/ruote/exp/fe_unregisterp.rb +1 -3
  56. data/lib/ruote/exp/fe_wait.rb +12 -25
  57. data/lib/ruote/exp/{flowexpression.rb → flow_expression.rb} +375 -229
  58. data/lib/ruote/exp/iterator.rb +2 -2
  59. data/lib/ruote/exp/merge.rb +78 -17
  60. data/lib/ruote/exp/ro_attributes.rb +46 -36
  61. data/lib/ruote/exp/ro_filters.rb +34 -8
  62. data/lib/ruote/exp/ro_on_x.rb +431 -0
  63. data/lib/ruote/exp/ro_persist.rb +19 -7
  64. data/lib/ruote/exp/ro_timers.rb +123 -0
  65. data/lib/ruote/exp/ro_variables.rb +90 -29
  66. data/lib/ruote/fei.rb +57 -3
  67. data/lib/ruote/fs.rb +3 -0
  68. data/lib/ruote/id/mnemo_wfid_generator.rb +30 -7
  69. data/lib/ruote/id/wfid_generator.rb +17 -38
  70. data/lib/ruote/log/default_history.rb +23 -9
  71. data/lib/ruote/log/fancy_printing.rb +265 -0
  72. data/lib/ruote/log/storage_history.rb +23 -13
  73. data/lib/ruote/log/wait_logger.rb +224 -17
  74. data/lib/ruote/observer.rb +82 -0
  75. data/lib/ruote/part/block_participant.rb +65 -28
  76. data/lib/ruote/part/code_participant.rb +81 -0
  77. data/lib/ruote/part/engine_participant.rb +7 -2
  78. data/lib/ruote/part/local_participant.rb +221 -21
  79. data/lib/ruote/part/no_op_participant.rb +1 -1
  80. data/lib/ruote/part/null_participant.rb +1 -1
  81. data/lib/ruote/part/participant.rb +50 -0
  82. data/lib/ruote/part/rev_participant.rb +178 -0
  83. data/lib/ruote/part/smtp_participant.rb +2 -2
  84. data/lib/ruote/part/storage_participant.rb +228 -60
  85. data/lib/ruote/part/template.rb +1 -1
  86. data/lib/ruote/participant.rb +2 -0
  87. data/lib/ruote/reader.rb +205 -68
  88. data/lib/ruote/reader/json.rb +49 -0
  89. data/lib/ruote/reader/radial.rb +303 -0
  90. data/lib/ruote/reader/ruby_dsl.rb +44 -9
  91. data/lib/ruote/reader/xml.rb +11 -8
  92. data/lib/ruote/receiver/base.rb +98 -45
  93. data/lib/ruote/storage/base.rb +104 -35
  94. data/lib/ruote/storage/composite_storage.rb +50 -60
  95. data/lib/ruote/storage/fs_storage.rb +25 -34
  96. data/lib/ruote/storage/hash_storage.rb +38 -36
  97. data/lib/ruote/svc/dispatch_pool.rb +104 -35
  98. data/lib/ruote/svc/dollar_sub.rb +10 -8
  99. data/lib/ruote/svc/error_handler.rb +108 -52
  100. data/lib/ruote/svc/expression_map.rb +3 -3
  101. data/lib/ruote/svc/participant_list.rb +160 -55
  102. data/lib/ruote/svc/tracker.rb +31 -31
  103. data/lib/ruote/svc/treechecker.rb +28 -16
  104. data/lib/ruote/tree_dot.rb +1 -1
  105. data/lib/ruote/util/deep.rb +143 -0
  106. data/lib/ruote/util/filter.rb +125 -18
  107. data/lib/ruote/util/hashdot.rb +15 -13
  108. data/lib/ruote/util/look.rb +1 -1
  109. data/lib/ruote/util/lookup.rb +60 -22
  110. data/lib/ruote/util/misc.rb +63 -18
  111. data/lib/ruote/util/mpatch.rb +53 -0
  112. data/lib/ruote/util/ometa.rb +1 -2
  113. data/lib/ruote/util/process_observer.rb +177 -0
  114. data/lib/ruote/util/subprocess.rb +1 -1
  115. data/lib/ruote/util/time.rb +2 -2
  116. data/lib/ruote/util/tree.rb +64 -2
  117. data/lib/ruote/version.rb +3 -2
  118. data/lib/ruote/worker.rb +421 -92
  119. data/lib/ruote/workitem.rb +157 -22
  120. data/ruote.gemspec +15 -9
  121. data/test/bm/ci.rb +0 -2
  122. data/test/bm/ici.rb +0 -2
  123. data/test/bm/load_26c.rb +0 -3
  124. data/test/bm/mega.rb +0 -2
  125. data/test/functional/base.rb +57 -43
  126. data/test/functional/concurrent_base.rb +16 -13
  127. data/test/functional/ct_0_concurrence.rb +7 -11
  128. data/test/functional/ct_1_iterator.rb +9 -11
  129. data/test/functional/ct_2_cancel.rb +28 -17
  130. data/test/functional/eft_0_flow_expression.rb +35 -0
  131. data/test/functional/eft_10_cancel_process.rb +1 -1
  132. data/test/functional/eft_11_wait.rb +13 -13
  133. data/test/functional/eft_12_listen.rb +199 -66
  134. data/test/functional/eft_13_iterator.rb +95 -29
  135. data/test/functional/eft_14_cursor.rb +74 -24
  136. data/test/functional/eft_15_loop.rb +7 -7
  137. data/test/functional/eft_16_if.rb +1 -1
  138. data/test/functional/eft_17_equals.rb +1 -1
  139. data/test/functional/eft_18_concurrent_iterator.rb +156 -68
  140. data/test/functional/eft_19_reserve.rb +15 -15
  141. data/test/functional/eft_1_echo.rb +1 -1
  142. data/test/functional/eft_20_save.rb +51 -9
  143. data/test/functional/eft_21_restore.rb +1 -1
  144. data/test/functional/eft_22_noop.rb +1 -1
  145. data/test/functional/eft_23_apply.rb +1 -1
  146. data/test/functional/eft_24_add_branches.rb +7 -8
  147. data/test/functional/eft_25_command.rb +1 -1
  148. data/test/functional/eft_26_error.rb +11 -11
  149. data/test/functional/eft_27_inc.rb +111 -67
  150. data/test/functional/eft_28_once.rb +16 -16
  151. data/test/functional/eft_29_cron.rb +9 -9
  152. data/test/functional/eft_2_sequence.rb +23 -4
  153. data/test/functional/eft_30_ref.rb +36 -24
  154. data/test/functional/eft_31_registerp.rb +24 -24
  155. data/test/functional/eft_32_lose.rb +46 -20
  156. data/test/functional/eft_34_given.rb +1 -1
  157. data/test/functional/eft_35_filter.rb +161 -7
  158. data/test/functional/eft_36_read.rb +97 -0
  159. data/test/functional/{eft_0_process_definition.rb → eft_37_process_definition.rb} +4 -4
  160. data/test/functional/eft_38_on_error.rb +195 -0
  161. data/test/functional/eft_39_stall.rb +35 -0
  162. data/test/functional/eft_3_participant.rb +77 -22
  163. data/test/functional/eft_40_await.rb +297 -0
  164. data/test/functional/eft_4_set.rb +110 -11
  165. data/test/functional/eft_5_subprocess.rb +27 -5
  166. data/test/functional/eft_6_concurrence.rb +299 -60
  167. data/test/functional/eft_7_forget.rb +24 -22
  168. data/test/functional/eft_8_undo.rb +52 -15
  169. data/test/functional/eft_9_redo.rb +18 -20
  170. data/test/functional/ft_0_worker.rb +122 -13
  171. data/test/functional/ft_10_dollar.rb +77 -16
  172. data/test/functional/ft_11_recursion.rb +9 -9
  173. data/test/functional/ft_12_launchitem.rb +7 -9
  174. data/test/functional/ft_13_variables.rb +125 -22
  175. data/test/functional/ft_14_re_apply.rb +112 -56
  176. data/test/functional/ft_15_timeout.rb +64 -33
  177. data/test/functional/ft_16_participant_params.rb +59 -6
  178. data/test/functional/ft_17_conditional.rb +68 -2
  179. data/test/functional/ft_18_kill.rb +48 -30
  180. data/test/functional/ft_19_participant_code.rb +67 -0
  181. data/test/functional/ft_1_process_status.rb +222 -150
  182. data/test/functional/ft_20_storage_participant.rb +445 -44
  183. data/test/functional/ft_21_forget.rb +21 -26
  184. data/test/functional/ft_22_process_definitions.rb +8 -6
  185. data/test/functional/ft_23_load_defs.rb +29 -5
  186. data/test/functional/ft_24_block_participant.rb +199 -20
  187. data/test/functional/ft_25_receiver.rb +98 -46
  188. data/test/functional/ft_26_participant_rtimeout.rb +34 -26
  189. data/test/functional/ft_27_var_indirection.rb +40 -5
  190. data/test/functional/ft_28_null_noop_participants.rb +5 -5
  191. data/test/functional/ft_29_part_template.rb +2 -2
  192. data/test/functional/ft_2_errors.rb +106 -74
  193. data/test/functional/ft_30_smtp_participant.rb +7 -7
  194. data/test/functional/ft_31_part_blocking.rb +11 -11
  195. data/test/functional/ft_32_scope.rb +50 -0
  196. data/test/functional/ft_33_participant_subprocess_priority.rb +3 -3
  197. data/test/functional/ft_34_cursor_rewind.rb +14 -14
  198. data/test/functional/ft_35_add_service.rb +67 -9
  199. data/test/functional/ft_36_storage_history.rb +92 -24
  200. data/test/functional/ft_37_default_history.rb +35 -23
  201. data/test/functional/ft_38_participant_more.rb +189 -32
  202. data/test/functional/ft_39_wait_for.rb +25 -25
  203. data/test/functional/ft_3_participant_registration.rb +235 -107
  204. data/test/functional/ft_40_wait_logger.rb +105 -18
  205. data/test/functional/ft_41_participants.rb +13 -12
  206. data/test/functional/ft_42_storage_copy.rb +12 -12
  207. data/test/functional/ft_43_participant_on_reply.rb +85 -11
  208. data/test/functional/ft_44_var_participant.rb +5 -5
  209. data/test/functional/ft_45_participant_accept.rb +3 -3
  210. data/test/functional/ft_46_launch_single.rb +17 -17
  211. data/test/functional/ft_47_wfids.rb +41 -0
  212. data/test/functional/ft_48_lose.rb +19 -25
  213. data/test/functional/ft_49_engine_on_error.rb +54 -70
  214. data/test/functional/ft_4_cancel.rb +84 -26
  215. data/test/functional/ft_50_engine_config.rb +4 -4
  216. data/test/functional/ft_51_misc.rb +12 -12
  217. data/test/functional/ft_52_case.rb +17 -17
  218. data/test/functional/ft_53_engine_on_terminate.rb +18 -21
  219. data/test/functional/ft_54_patterns.rb +18 -16
  220. data/test/functional/ft_55_engine_participant.rb +55 -55
  221. data/test/functional/ft_56_filter_attribute.rb +90 -52
  222. data/test/functional/ft_57_rev_participant.rb +252 -0
  223. data/test/functional/ft_58_workitem.rb +150 -0
  224. data/test/functional/ft_59_pause.rb +329 -0
  225. data/test/functional/ft_5_on_error.rb +430 -77
  226. data/test/functional/ft_60_code_participant.rb +65 -0
  227. data/test/functional/ft_61_trailing_fields.rb +34 -0
  228. data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
  229. data/test/functional/ft_63_participants_221.rb +458 -0
  230. data/test/functional/ft_64_stash.rb +41 -0
  231. data/test/functional/ft_65_timers.rb +313 -0
  232. data/test/functional/ft_66_flank.rb +133 -0
  233. data/test/functional/ft_67_radial_misc.rb +34 -0
  234. data/test/functional/ft_68_reput.rb +72 -0
  235. data/test/functional/ft_69_worker_info.rb +56 -0
  236. data/test/functional/ft_6_on_cancel.rb +189 -36
  237. data/test/functional/ft_70_take_and_discard_attributes.rb +94 -0
  238. data/test/functional/ft_71_retries.rb +144 -0
  239. data/test/functional/ft_72_on_terminate.rb +60 -0
  240. data/test/functional/ft_73_raise_msg.rb +107 -0
  241. data/test/functional/ft_74_respark.rb +106 -0
  242. data/test/functional/ft_75_context.rb +66 -0
  243. data/test/functional/ft_76_observer.rb +53 -0
  244. data/test/functional/ft_77_process_observer.rb +157 -0
  245. data/test/functional/ft_78_part_participant.rb +37 -0
  246. data/test/functional/ft_7_tags.rb +238 -50
  247. data/test/functional/ft_8_participant_consumption.rb +27 -21
  248. data/test/functional/ft_9_subprocesses.rb +48 -18
  249. data/test/functional/restart_base.rb +4 -6
  250. data/test/functional/rt_0_wait.rb +10 -10
  251. data/test/functional/rt_1_listen.rb +6 -6
  252. data/test/functional/rt_2_errors.rb +12 -12
  253. data/test/functional/rt_3_once.rb +17 -12
  254. data/test/functional/rt_4_cron.rb +17 -17
  255. data/test/functional/rt_5_timeout.rb +13 -13
  256. data/test/functional/signals.rb +103 -0
  257. data/test/functional/storage.rb +730 -0
  258. data/test/functional/storage_helper.rb +48 -35
  259. data/test/functional/test.rb +6 -2
  260. data/test/misc/idle.rb +21 -0
  261. data/test/misc/light.rb +29 -0
  262. data/test/path_helper.rb +1 -1
  263. data/test/test.rb +2 -5
  264. data/test/test_helper.rb +13 -0
  265. data/test/unit/test.rb +1 -4
  266. data/test/unit/ut_0_ruby_reader.rb +25 -9
  267. data/test/unit/ut_10_participants.rb +47 -0
  268. data/test/unit/ut_11_lookup.rb +59 -2
  269. data/test/unit/ut_12_wait_logger.rb +123 -0
  270. data/test/unit/ut_14_is_uri.rb +1 -1
  271. data/test/unit/ut_15_util.rb +1 -1
  272. data/test/unit/ut_16_reader.rb +136 -14
  273. data/test/unit/ut_17_merge.rb +155 -0
  274. data/test/unit/ut_19_part_template.rb +1 -1
  275. data/test/unit/ut_1_fei.rb +11 -2
  276. data/test/unit/ut_20_composite_storage.rb +27 -1
  277. data/test/unit/{ut_21_participant_list.rb → ut_21_svc_participant_list.rb} +2 -3
  278. data/test/unit/ut_22_filter.rb +231 -10
  279. data/test/unit/ut_23_svc_tracker.rb +48 -0
  280. data/test/unit/ut_24_radial_reader.rb +458 -0
  281. data/test/unit/ut_25_process_status.rb +143 -0
  282. data/test/unit/ut_26_deep.rb +131 -0
  283. data/test/unit/ut_2_dashboard.rb +114 -0
  284. data/test/unit/ut_3_worker.rb +54 -0
  285. data/test/unit/ut_4_expmap.rb +1 -1
  286. data/test/unit/ut_5_tree.rb +23 -23
  287. data/test/unit/ut_6_condition.rb +71 -29
  288. data/test/unit/ut_7_workitem.rb +18 -4
  289. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  290. data/test/unit/ut_9_xml_reader.rb +1 -1
  291. metadata +142 -63
  292. data/jruby_issue.txt +0 -32
  293. data/lib/ruote/engine/process_status.rb +0 -403
  294. data/lib/ruote/log/pretty.rb +0 -165
  295. data/lib/ruote/log/test_logger.rb +0 -204
  296. data/lib/ruote/util/serializer.rb +0 -103
  297. data/phil.txt +0 -14
  298. data/test/functional/eft_33_let.rb +0 -31
  299. data/test/functional/ft_19_alias.rb +0 -33
  300. data/test/functional/ft_47_wfid_generator.rb +0 -54
  301. data/test/unit/storage.rb +0 -403
  302. data/test/unit/storages.rb +0 -37
  303. data/test/unit/ut_13_serializer.rb +0 -65
  304. data/test/unit/ut_18_engine.rb +0 -47
  305. data/test/unit/ut_3_wait_logger.rb +0 -39
@@ -5,7 +5,7 @@
5
5
  # Thu Jul 9 12:40:10 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), 'base')
8
+ require File.expand_path('../base', __FILE__)
9
9
 
10
10
 
11
11
  class EftIfTest < Test::Unit::TestCase
@@ -5,7 +5,7 @@
5
5
  # Thu Jul 9 13:31:59 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), 'base')
8
+ require File.expand_path('../base', __FILE__)
9
9
 
10
10
 
11
11
  class EftEqualsTest < Test::Unit::TestCase
@@ -5,7 +5,7 @@
5
5
  # Wed Jul 29 23:25:44 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), 'base')
8
+ require File.expand_path('../base', __FILE__)
9
9
 
10
10
 
11
11
  class EftConcurrentIteratorTest < Test::Unit::TestCase
@@ -21,7 +21,21 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
21
21
  end
22
22
  end
23
23
 
24
- #noisy
24
+ assert_trace('done.', pdef)
25
+ end
26
+
27
+ def test_empty_iterator_2
28
+
29
+ @dashboard.register 'nada', Ruote::NullParticipant
30
+
31
+ pdef = Ruote.process_definition :name => 'test' do
32
+ sequence do
33
+ concurrent_iterator :on_val => 'alice, bob, charly', :to_var => 'v' do
34
+ nada :if => 'false'
35
+ end
36
+ echo 'done.'
37
+ end
38
+ end
25
39
 
26
40
  assert_trace('done.', pdef)
27
41
  end
@@ -37,8 +51,6 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
37
51
  end
38
52
  end
39
53
 
40
- #noisy
41
-
42
54
  assert_trace('done.', pdef)
43
55
  end
44
56
 
@@ -52,9 +64,7 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
52
64
 
53
65
  register_catchall_participant
54
66
 
55
- #noisy
56
-
57
- wfid = @engine.launch(pdef)
67
+ wfid = @dashboard.launch(pdef)
58
68
 
59
69
  wait_for(wfid)
60
70
 
@@ -73,9 +83,7 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
73
83
 
74
84
  register_catchall_participant
75
85
 
76
- #noisy
77
-
78
- wfid = @engine.launch(pdef, 'assets' => %w[ a b c ])
86
+ wfid = @dashboard.launch(pdef, 'assets' => %w[ a b c ])
79
87
 
80
88
  wait_for(wfid)
81
89
 
@@ -94,9 +102,7 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
94
102
 
95
103
  register_catchall_participant
96
104
 
97
- #noisy
98
-
99
- wfid = @engine.launch(pdef)
105
+ wfid = @dashboard.launch(pdef)
100
106
 
101
107
  wait_for(wfid)
102
108
 
@@ -118,9 +124,7 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
118
124
 
119
125
  register_catchall_participant
120
126
 
121
- #noisy
122
-
123
- wfid = @engine.launch(pdef)
127
+ wfid = @dashboard.launch(pdef)
124
128
 
125
129
  wait_for(wfid)
126
130
 
@@ -143,13 +147,11 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
143
147
  end
144
148
  end
145
149
 
146
- sto = @engine.register_participant '.+', Ruote::StorageParticipant
150
+ sto = @dashboard.register_participant '.+', Ruote::StorageParticipant
147
151
 
148
152
  assert_equal 0, sto.size # just to be sure
149
153
 
150
- #noisy
151
-
152
- wfid = @engine.launch(pdef)
154
+ wfid = @dashboard.launch(pdef)
153
155
 
154
156
  wait_for(:participant_1)
155
157
  wait_for(:participant_1)
@@ -158,7 +160,7 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
158
160
  { 'participant_1' => 2 },
159
161
  sto.per_participant_count)
160
162
 
161
- sto.reply(sto.first)
163
+ sto.proceed(sto.first)
162
164
 
163
165
  wait_for(:participant_2)
164
166
  wait_for(1)
@@ -167,7 +169,7 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
167
169
  { 'participant_1' => 1, 'participant_2' => 1 },
168
170
  sto.per_participant_count)
169
171
 
170
- sto.reply(sto.per_participant['participant_2'].first)
172
+ sto.proceed(sto.per_participant['participant_2'].first)
171
173
 
172
174
  wait_for(3)
173
175
 
@@ -186,12 +188,10 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
186
188
  end
187
189
  end
188
190
 
189
- @engine.register_participant :p1 do |workitem|
190
- @tracer << "p1:#{workitem.fields['f'].join(':')}\n"
191
+ @dashboard.register_participant :p1 do |workitem|
192
+ tracer << "p1:#{workitem.fields['f'].join(':')}\n"
191
193
  end
192
194
 
193
- #noisy
194
-
195
195
  assert_trace %w[ p1:a:A out ], pdef
196
196
  end
197
197
 
@@ -203,8 +203,6 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
203
203
  end
204
204
  end
205
205
 
206
- #noisy
207
-
208
206
  assert_trace %w[ a a ], pdef
209
207
  end
210
208
 
@@ -216,8 +214,6 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
216
214
  end
217
215
  end
218
216
 
219
- #noisy
220
-
221
217
  assert_trace %w[ a a ], pdef
222
218
  end
223
219
 
@@ -231,11 +227,10 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
231
227
 
232
228
  register_catchall_participant
233
229
 
234
- #noisy
230
+ wfid = @dashboard.launch(pdef)
231
+ r = @dashboard.wait_for(wfid)
235
232
 
236
- wfid = @engine.launch(pdef)
237
-
238
- wait_for(wfid)
233
+ assert_equal 'terminated', r['action']
239
234
 
240
235
  trace = @tracer.to_s.split("\n").sort
241
236
  assert_equal %w[ alice:0/0_0_0 bob:1/0_0_0 charly:2/0_0_0 ], trace
@@ -250,8 +245,6 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
250
245
  end
251
246
  end
252
247
 
253
- #noisy
254
-
255
248
  #assert_trace(*%w[ a b c ].permutation.to_a, pdef)
256
249
  # this is not ruby 1.8.7p72 friendly
257
250
 
@@ -269,16 +262,14 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
269
262
  bravo
270
263
  end
271
264
 
272
- @engine.register_participant :bravo do |workitem|
265
+ @dashboard.register_participant :bravo do |workitem|
273
266
  stash[:mf] = workitem.fields
274
267
  nil
275
268
  end
276
269
 
277
- #noisy
278
-
279
270
  assert_trace(%w[ . . . ], pdef)
280
271
 
281
- mf = ('0'..'2').to_a.map { |k| @engine.context.stash[:mf][k]['f'] }.sort
272
+ mf = ('0'..'2').to_a.map { |k| @dashboard.context.stash[:mf][k]['f'] }.sort
282
273
  assert_equal %w[ a b c ], mf
283
274
  end
284
275
 
@@ -291,21 +282,19 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
291
282
  bravo
292
283
  end
293
284
 
294
- @engine.register_participant :bravo do |workitem|
285
+ @dashboard.register_participant :bravo do |workitem|
295
286
  stash[:mf] = workitem.fields
296
287
  nil
297
288
  end
298
289
 
299
- #noisy
300
-
301
290
  assert_trace(%w[ . . ], pdef)
302
291
 
303
292
  assert_equal(
304
293
  [["a"], ["b"]],
305
- @engine.context.stash[:mf]['stack'].collect { |f| f.values }.sort)
294
+ @dashboard.context.stash[:mf]['stack'].collect { |f| f.values }.sort)
306
295
  assert_equal(
307
296
  {"on"=>"a, b", "to_f"=>"f", "merge_type"=>"stack"},
308
- @engine.context.stash[:mf]['stack_attributes'])
297
+ @dashboard.context.stash[:mf]['stack_attributes'])
309
298
  end
310
299
 
311
300
  def test_cancel
@@ -322,23 +311,21 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
322
311
  end
323
312
  end
324
313
 
325
- @engine.context.stash[:a_count] = 0
326
- @engine.register_participant(:alpha) { |wi| stash[:a_count] += 1 }
327
- @engine.register_participant(:bravo, Ruote::NullParticipant)
314
+ @dashboard.context.stash[:a_count] = 0
315
+ @dashboard.register_participant(:alpha) { |wi| stash[:a_count] += 1 }
316
+ @dashboard.register_participant(:bravo, Ruote::NullParticipant)
328
317
 
329
- #noisy
318
+ wfid = @dashboard.launch(pdef)
330
319
 
331
- wfid = @engine.launch(pdef)
320
+ #wait_for(2 + n * 5)
321
+ (2 * n).times { @dashboard.wait_for('dispatched') }
332
322
 
333
- wait_for(2 + n * 5)
334
- #p "=" * 80
323
+ assert_equal n, @dashboard.context.stash[:a_count]
335
324
 
336
- assert_equal n, @engine.context.stash[:a_count]
337
-
338
- @engine.cancel_process(wfid)
325
+ @dashboard.cancel_process(wfid)
339
326
  wait_for(wfid)
340
327
 
341
- assert_nil @engine.process(wfid)
328
+ assert_nil @dashboard.process(wfid)
342
329
  end
343
330
 
344
331
  def test_add_branch_command
@@ -352,36 +339,137 @@ class EftConcurrentIteratorTest < Test::Unit::TestCase
352
339
  end
353
340
  end
354
341
 
355
- @engine.register_participant 'alpha' do |wi|
342
+ @dashboard.register_participant 'alpha' do |wi|
356
343
 
357
- @tracer << "#{workitem.fields['f']}\n"
344
+ tracer << "#{wi.fields['f']}\n"
358
345
 
359
346
  wi.fields['__add_branches__'] = %w[ a b ] if wi.fields['f'] == 2
360
347
  end
361
348
 
362
- #noisy
363
-
364
- wfid = @engine.launch(pdef)
349
+ wfid = @dashboard.launch(pdef)
365
350
  wait_for(wfid)
366
351
 
367
352
  assert_equal %w[ . 1 2 a b ], @tracer.to_a.sort
368
353
  end
369
354
 
355
+ def test_union_merge_type
356
+
357
+ pdef = Ruote.process_definition :name => 'test' do
358
+ concurrent_iterator :on_value => (1..3).to_a, :merge_type => 'union' do
359
+ alpha
360
+ end
361
+ end
362
+
363
+ @dashboard.register_participant :alpha do |workitem|
364
+ workitem.fields['a'] = [ 'x' ]
365
+ end
366
+
367
+ wfid = @dashboard.launch(pdef)
368
+ r = @dashboard.wait_for(wfid)
369
+
370
+ assert_equal %w[ x ], r['workitem']['fields']['a']
371
+ end
372
+
373
+ def test_union_concat_type
374
+
375
+ pdef = Ruote.process_definition :name => 'test' do
376
+ concurrent_iterator :on_value => (1..3).to_a, :merge_type => 'concat' do
377
+ alpha
378
+ end
379
+ end
380
+
381
+ @dashboard.register_participant :alpha do |workitem|
382
+ workitem.fields['a'] = [ 'x' ]
383
+ end
384
+
385
+ wfid = @dashboard.launch(pdef)
386
+ r = @dashboard.wait_for(wfid)
387
+
388
+ assert_equal %w[ x x x ], r['workitem']['fields']['a']
389
+ end
390
+
391
+ def test_ignore_merge_type
392
+
393
+ @dashboard.register_participant :alpha do |workitem|
394
+ workitem.fields['a'] = 'B'
395
+ end
396
+
397
+ pdef = Ruote.process_definition :name => 'test' do
398
+ set 'f:a' => 'a'
399
+ concurrent_iterator :on_value => (1..3).to_a, :merge_type => 'ignore' do
400
+ alpha
401
+ end
402
+ echo '${f:a}'
403
+ end
404
+
405
+ wfid = @dashboard.launch(pdef)
406
+ @dashboard.wait_for(wfid)
407
+
408
+ assert_equal 'a', @tracer.to_s
409
+ end
410
+
411
+ def test_implicit_sequence
412
+
413
+ pdef = Ruote.define do
414
+ concurrent_iterator :on => %w[ a b c ] do
415
+ echo '0:${v:i}'
416
+ echo '1:${v:i}'
417
+ end
418
+ end
419
+
420
+ wfid = @dashboard.launch(pdef)
421
+ @dashboard.wait_for(wfid)
422
+
423
+ assert_equal(
424
+ %w[ 0:a 0:b 0:c 1:a 1:b 1:c ],
425
+ @tracer.to_a.sort)
426
+ end
427
+
428
+ def test_count_zero
429
+
430
+ pdef = Ruote.define do
431
+ concurrent_iterator :on => %w[ a b c ], :count => 0 do
432
+ wait '2s'
433
+ echo '0:${v:i}'
434
+ end
435
+ echo 'over.'
436
+ end
437
+
438
+ wfid = @dashboard.launch(pdef)
439
+ @dashboard.wait_for(wfid)
440
+
441
+ assert_equal %w[ over. ], @tracer.to_a
442
+ end
443
+
444
+ def test_negative_count
445
+
446
+ pdef = Ruote.define do
447
+ concurrent_iterator :on => %w[ a b c d ], :c => -2, :mt => 'mix' do
448
+ set '${v:i}' => 'x'
449
+ end
450
+ end
451
+
452
+ wfid = @dashboard.launch(pdef)
453
+ r = @dashboard.wait_for(wfid)
454
+
455
+ assert_equal 'x', r['workitem']['fields']['a']
456
+ assert_equal 'x', r['workitem']['fields']['b']
457
+ assert_equal nil, r['workitem']['fields']['c']
458
+ assert_equal nil, r['workitem']['fields']['d']
459
+ end
460
+
370
461
  protected
371
462
 
372
463
  def register_catchall_participant
373
464
 
374
465
  @subs = []
375
- subs = @subs
376
- @engine.context.instance_eval do
377
- @subs = subs
378
- end
466
+ @dashboard.context.add_service('subs', @subs)
379
467
 
380
- @engine.register_participant '.*' do |workitem|
468
+ @dashboard.register_participant '.*' do |workitem|
381
469
 
382
- @subs << workitem.fei.subid
470
+ context.subs << workitem.fei.subid
383
471
 
384
- @tracer << [
472
+ tracer << [
385
473
  workitem.participant_name, workitem.fei.expid
386
474
  ].join('/') + "\n"
387
475
  end
@@ -5,7 +5,7 @@
5
5
  # Fri Jul 31 21:44:04 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), 'base')
8
+ require File.expand_path('../base', __FILE__)
9
9
 
10
10
  require 'ruote/participant'
11
11
 
@@ -28,16 +28,16 @@ class EftReserveTest < Test::Unit::TestCase
28
28
 
29
29
  #noisy
30
30
 
31
- alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
31
+ alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
32
32
 
33
- wfid = @engine.launch(pdef)
33
+ wfid = @dashboard.launch(pdef)
34
34
 
35
35
  wait_for(:alpha)
36
36
 
37
37
  assert_equal 1, alpha.size
38
38
  assert_equal '0_0_0_0', alpha.first.fei.expid
39
39
 
40
- ps = @engine.process(wfid)
40
+ ps = @dashboard.process(wfid)
41
41
 
42
42
  assert_equal 2, ps.variables.size
43
43
 
@@ -47,14 +47,14 @@ class EftReserveTest < Test::Unit::TestCase
47
47
  [ '0_0_0', '0_0_1' ],
48
48
  ps.variables['a'].last.collect { |e| e['expid'] })
49
49
 
50
- alpha.reply(alpha.first)
50
+ alpha.proceed(alpha.first)
51
51
 
52
52
  wait_for(:alpha)
53
53
 
54
54
  assert_equal 1, alpha.size
55
55
  assert_equal '0_0_1_0', alpha.first.fei.expid
56
56
 
57
- alpha.reply(alpha.first)
57
+ alpha.proceed(alpha.first)
58
58
 
59
59
  wait_for(wfid)
60
60
  end
@@ -74,16 +74,16 @@ class EftReserveTest < Test::Unit::TestCase
74
74
 
75
75
  #noisy
76
76
 
77
- alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
77
+ alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
78
78
 
79
- wfid = @engine.launch(pdef)
79
+ wfid = @dashboard.launch(pdef)
80
80
 
81
81
  wait_for(:alpha)
82
82
 
83
- ps = @engine.process(wfid)
83
+ ps = @dashboard.process(wfid)
84
84
  exp = ps.expressions.find { |e| e.fei.expid == '0_0_0' }
85
85
 
86
- @engine.cancel_expression(exp.fei)
86
+ @dashboard.cancel_expression(exp.fei)
87
87
 
88
88
  wait_for(:alpha)
89
89
 
@@ -92,7 +92,7 @@ class EftReserveTest < Test::Unit::TestCase
92
92
  assert_equal 1, alpha.size
93
93
  assert_equal '0_0_1_0', alpha.first.fei.expid
94
94
 
95
- alpha.reply(alpha.first)
95
+ alpha.proceed(alpha.first)
96
96
 
97
97
  wait_for(wfid)
98
98
  end
@@ -112,9 +112,9 @@ class EftReserveTest < Test::Unit::TestCase
112
112
 
113
113
  #noisy
114
114
 
115
- alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
115
+ alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
116
116
 
117
- wfid = @engine.launch(pdef)
117
+ wfid = @dashboard.launch(pdef)
118
118
 
119
119
  2.times do
120
120
 
@@ -122,12 +122,12 @@ class EftReserveTest < Test::Unit::TestCase
122
122
 
123
123
  assert_equal 1, alpha.size
124
124
 
125
- ps = @engine.process(wfid)
125
+ ps = @dashboard.process(wfid)
126
126
 
127
127
  assert_equal 2, ps.variables.size
128
128
  assert_not_nil ps.variables['reserve']
129
129
 
130
- alpha.reply(alpha.first)
130
+ alpha.proceed(alpha.first)
131
131
  end
132
132
 
133
133
  wait_for(wfid)