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
  # Wed May 20 09:23:01 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 EftSetTest < Test::Unit::TestCase
@@ -129,10 +129,10 @@ class EftSetTest < Test::Unit::TestCase
129
129
  alpha
130
130
  end
131
131
 
132
- @engine.register_participant :alpha do |workitem|
132
+ @dashboard.register_participant :alpha do |workitem|
133
133
  workitem.fields.delete('params')
134
134
  workitem.fields.delete('dispatched_at')
135
- @tracer << workitem.fields.inspect
135
+ tracer << workitem.fields.inspect
136
136
  end
137
137
 
138
138
  assert_trace '{"f"=>nil}', pdef
@@ -164,9 +164,8 @@ class EftSetTest < Test::Unit::TestCase
164
164
  end
165
165
  end
166
166
 
167
- @engine.register_participant :alpha do |workitem|
168
- @tracer << workitem.fields['f']
169
- @tracer << "\n"
167
+ @dashboard.register_participant :alpha do |workitem|
168
+ tracer << workitem.fields['f'] + "\n"
170
169
  end
171
170
 
172
171
  #noisy
@@ -219,12 +218,12 @@ class EftSetTest < Test::Unit::TestCase
219
218
 
220
219
  #noisy
221
220
 
222
- wfid = @engine.launch(pdef)
221
+ wfid = @dashboard.launch(pdef)
223
222
 
224
223
  wait_for(wfid)
225
224
 
226
- assert_nil @engine.process(wfid)
227
- assert_nil @engine.variables['v']
225
+ assert_nil @dashboard.process(wfid)
226
+ assert_nil @dashboard.variables['v']
228
227
  end
229
228
 
230
229
  # 'rset' is an alias for 'set'.
@@ -233,13 +232,113 @@ class EftSetTest < Test::Unit::TestCase
233
232
  #
234
233
  def test_rset
235
234
 
236
- wfid = @engine.launch(Ruote.define do
235
+ wfid = @dashboard.launch(Ruote.define do
237
236
  rset 'developer' => 'Rebo'
238
237
  end)
239
238
 
240
- r = @engine.wait_for(wfid)
239
+ r = @dashboard.wait_for(wfid)
241
240
 
242
241
  assert_equal 'Rebo', r['workitem']['fields']['developer']
243
242
  end
243
+
244
+ def test_unset_field
245
+
246
+ pdef = Ruote.define do
247
+
248
+ set 'f:alpha' => 'alice'
249
+ set 'f:bravo' => 'bob'
250
+ set 'f:charly' => 'charles'
251
+ set 'f:__timed_out__' => %w[ seriously ]
252
+ set 'f:delta' => { 'echo' => 'e', 'foxtrott' => 'f' }
253
+
254
+ unset 'f:alpha'
255
+ unset :f => 'bravo'
256
+ unset :field => 'charly'
257
+ unset :field => '__timed_out__'
258
+ unset 'f:delta.echo'
259
+ end
260
+
261
+ wfid = @dashboard.launch(pdef)
262
+
263
+ r = @dashboard.wait_for(wfid)
264
+
265
+ assert_equal(
266
+ { '__result__' => 'e', 'delta' => { 'foxtrott' => 'f' } },
267
+ r['workitem']['fields'])
268
+ end
269
+
270
+ class VarPeek
271
+ include Ruote::LocalParticipant
272
+ def consume
273
+ context.tracer << fexp.compile_variables.inspect
274
+ reply
275
+ end
276
+ end
277
+
278
+ def test_unset_var
279
+
280
+ pdef = Ruote.define do
281
+ set 'v:v0' => 'nada'
282
+ set 'v:v1' => 'nada'
283
+ unset 'v:v0'
284
+ unset :v => 'v1'
285
+ peek
286
+ end
287
+
288
+ @dashboard.register :peek, VarPeek
289
+
290
+ #@dashboard.noisy = true
291
+
292
+ wfid = @dashboard.launch(pdef)
293
+
294
+ r = @dashboard.wait_for(wfid)
295
+
296
+ assert_equal '{}', @tracer.to_s
297
+ end
298
+
299
+ def test_set_sets_return_field
300
+
301
+ pdef = Ruote.define do
302
+ set 'v:v0' => 'nada'
303
+ end
304
+
305
+ wfid = @dashboard.launch(pdef)
306
+ r = @dashboard.wait_for(wfid)
307
+
308
+ assert_equal 'nada', r['workitem']['fields']['__result__']
309
+ end
310
+
311
+ def test_set_picks_latest
312
+
313
+ pdef = Ruote.define do
314
+ set 'f0' do
315
+ set 'v:v0' => '1'
316
+ set 'v:v1' => '2'
317
+ set 'f1' => '${v:v0}${v:v1}'
318
+ end
319
+ echo '${f0}/${v:v0}'
320
+ end
321
+
322
+ #@dashboard.noisy = true
323
+
324
+ wfid = @dashboard.launch(pdef)
325
+ r = @dashboard.wait_for(wfid)
326
+
327
+ assert_equal '12', r['workitem']['fields']['f0']
328
+ assert_equal '12/', @tracer.to_s
329
+ end
330
+
331
+ def test_set_if
332
+
333
+ pdef = Ruote.define do
334
+ set 'f:x' => '${v:v_r}', :if => '${v:v_r}'
335
+ end
336
+
337
+ wfid = @dashboard.launch(pdef)
338
+ r = @dashboard.wait_for(wfid)
339
+
340
+ assert_equal('terminated', r['action'])
341
+ assert_equal({}, r['workitem']['fields'])
342
+ end
244
343
  end
245
344
 
@@ -5,7 +5,7 @@
5
5
  # Wed May 20 17:08:17 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 EftSubprocessTest < Test::Unit::TestCase
@@ -96,7 +96,7 @@ class EftSubprocessTest < Test::Unit::TestCase
96
96
  end
97
97
  end
98
98
 
99
- @engine.register_participant :alpha do |workitem, fexp|
99
+ @dashboard.register_participant :alpha do |workitem, fexp|
100
100
  stash[:tree] = fexp.lookup_variable('tree')
101
101
  end
102
102
 
@@ -134,13 +134,14 @@ class EftSubprocessTest < Test::Unit::TestCase
134
134
 
135
135
  #noisy
136
136
 
137
- wfid = @engine.launch(pdef)
137
+ wfid = @dashboard.launch(pdef)
138
138
 
139
139
  wait_for(wfid)
140
140
 
141
141
  assert_equal(
142
142
  "#<RuntimeError: no subprocess named 'nada' found>",
143
- @engine.process(wfid).errors.first.message)
143
+ #"#<RuntimeError: unknown participant or subprocess 'nada'>",
144
+ @dashboard.process(wfid).errors.first.message)
144
145
  end
145
146
 
146
147
  def test_subprocess_in_engine_variable
@@ -152,11 +153,32 @@ class EftSubprocessTest < Test::Unit::TestCase
152
153
  end
153
154
  end
154
155
 
155
- @engine.variables['sub0'] = Ruote.process_definition do
156
+ @dashboard.variables['sub0'] = Ruote.process_definition do
156
157
  echo 'in sub0'
157
158
  end
158
159
 
159
160
  assert_trace "in sub0\ndone.", pdef
160
161
  end
162
+
163
+ def test_atts_to_fields
164
+
165
+ pdef = Ruote.define do
166
+ set 'address' => { 'city' => 'boston' }
167
+ subprocess(
168
+ 'sub0',
169
+ 'f:a' => 'fa',
170
+ 'field:b' => 'mi',
171
+ 'var:c' => 'sol',
172
+ 'f:address.city' => 'nyc')
173
+ define 'sub0' do
174
+ echo '${a} ${b} ${v:c} ${address.city}'
175
+ end
176
+ end
177
+
178
+ wfid = @dashboard.launch(pdef)
179
+ @dashboard.wait_for(wfid)
180
+
181
+ assert_equal 'fa mi sol nyc', @tracer.to_s
182
+ end
161
183
  end
162
184
 
@@ -5,9 +5,7 @@
5
5
  # Thu Jun 11 15:24:47 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), 'base')
9
-
10
- #require 'ruote/part/hash_participant'
8
+ require File.expand_path('../base', __FILE__)
11
9
 
12
10
 
13
11
  class EftConcurrenceTest < Test::Unit::TestCase
@@ -22,15 +20,40 @@ class EftConcurrenceTest < Test::Unit::TestCase
22
20
  end
23
21
  end
24
22
 
25
- @engine.register_participant :alpha do
26
- @tracer << "alpha\n"
23
+ @dashboard.register_participant :alpha do
24
+ tracer << "alpha\n"
27
25
  end
28
26
 
29
- #noisy
30
-
31
27
  assert_trace %w[ alpha alpha ], pdef
32
28
  end
33
29
 
30
+ def test_empty
31
+
32
+ pdef = Ruote.process_definition do
33
+ concurrence do
34
+ end
35
+ echo 'done.'
36
+ end
37
+
38
+ assert_trace %w[ done. ], pdef
39
+ end
40
+
41
+ def test_accidental_empty
42
+
43
+ @dashboard.register_participant :nada do
44
+ tracer << "nada\n"
45
+ end
46
+
47
+ pdef = Ruote.process_definition do
48
+ concurrence do
49
+ nada :if => false
50
+ end
51
+ echo 'done.'
52
+ end
53
+
54
+ assert_trace %w[ done. ], pdef
55
+ end
56
+
34
57
  def test_over_if
35
58
 
36
59
  pdef = Ruote.process_definition do
@@ -42,35 +65,88 @@ class EftConcurrenceTest < Test::Unit::TestCase
42
65
  bravo
43
66
  end
44
67
 
45
- @engine.context.instance_eval do
46
- @count = 0
47
- end
48
- # since block participants are evaluated in the context context
68
+ stash[:count] = 0
49
69
 
50
- alpha = @engine.register_participant :alpha, 'do_not_thread' => true do |wi|
51
- wi.fields['seen'] = 'indeed' if @count == 1
52
- @tracer << "alpha\n"
53
- @count = @count + 1
70
+ alpha = @dashboard.register :alpha, 'do_not_thread' => true do |wi|
71
+ wi.fields['seen'] = 'indeed' if stash[:count] == 1
72
+ tracer << "alpha\n"
73
+ stash[:count] += 1
54
74
  nil
55
75
  end
56
76
 
57
- @engine.register_participant :bravo do |workitem|
77
+ @dashboard.register_participant :bravo do |workitem|
58
78
  stash[:fields] = workitem.fields
59
79
  nil
60
80
  end
61
81
 
62
- #noisy
63
-
64
82
  assert_trace(%w[ alpha ] * 3, pdef)
65
83
 
66
84
  #assert_equal(
67
85
  # {'1'=>{"seen"=>"indeed"}, '0'=>{}, "params"=>{"ref"=>"bravo"}},
68
86
  # fields)
69
87
 
70
- params = @engine.context.stash[:fields].delete('params')
88
+ params = @dashboard.context.stash[:fields].delete('params')
71
89
 
72
90
  assert_equal({ 'ref' => 'bravo' }, params)
73
- assert_match /seen/, @engine.context.stash[:fields].inspect
91
+ assert_match /seen/, @dashboard.context.stash[:fields].inspect
92
+ end
93
+
94
+ def test_over_if__remaining_cancel
95
+
96
+ @dashboard.register 'alpha', Ruote::StorageParticipant
97
+
98
+ pdef = Ruote.define do
99
+ concurrence :over_if => '${seen}' do
100
+ alpha
101
+ alpha
102
+ end
103
+ end
104
+
105
+ wfid = @dashboard.launch(pdef)
106
+
107
+ @dashboard.wait_for('dispatched')
108
+
109
+ wi = @dashboard.storage_participant.first
110
+
111
+ wi.fields['seen'] = true
112
+ @dashboard.storage_participant.proceed(wi)
113
+
114
+ @dashboard.wait_for('dispatch_cancel')
115
+ sleep 0.350
116
+
117
+ assert_equal 0, @dashboard.storage_participant.size
118
+ end
119
+
120
+ def test_over_if__post
121
+
122
+ @dashboard.register :alpha do |workitem|
123
+ tracer << "alpha\n"
124
+ workitem.fields['ok'] = 'yes'
125
+ end
126
+ @dashboard.register :bravo do |workitem|
127
+ sleep 0.5
128
+ tracer << "bravo\n"
129
+ end
130
+ @dashboard.register :zulu do |workitem|
131
+ tracer << "zulu\n"
132
+ end
133
+
134
+ pdef = Ruote.define do
135
+ set 'f:ok' => 'no'
136
+ concurrence :over_if => '${f:ok} == yes' do
137
+ #concurrence :over_if => '${f:ok} == yes', :merge_type => 'mix' do
138
+ alpha
139
+ bravo :if => 'false'
140
+ end
141
+ zulu :if => '${f:ok} == yes'
142
+ end
143
+
144
+ wfid = @dashboard.launch(pdef)
145
+ r = @dashboard.wait_for(wfid)
146
+
147
+ assert_equal 'terminated', r['action']
148
+ assert_equal 'yes', r['workitem']['fields']['ok']
149
+ assert_equal %w[ alpha zulu ], @tracer.to_a
74
150
  end
75
151
 
76
152
  def test_over_unless
@@ -85,28 +161,23 @@ class EftConcurrenceTest < Test::Unit::TestCase
85
161
  echo 'done.'
86
162
  end
87
163
 
88
- @engine.context.instance_eval do
89
- @count = 0
90
- end
91
- # since block participants are evaluated in the context context
164
+ stash[:count] = 0
92
165
 
93
- alpha = @engine.register_participant :alpha, 'do_not_thread' => true do |wi|
94
- if @count > 1
166
+ alpha = @dashboard.register :alpha, 'do_not_thread' => true do |wi|
167
+ if stash[:count] > 1
95
168
  wi.fields['ok'] = false
96
169
  else
97
- @tracer << "a\n"
98
- @count = @count + 1
170
+ tracer << "a\n"
171
+ stash[:count] += 1
99
172
  end
100
173
  end
101
174
 
102
175
  fields = nil
103
176
 
104
- @engine.register_participant :bravo do |workitem|
177
+ @dashboard.register_participant :bravo do |workitem|
105
178
  fields = workitem.fields
106
179
  end
107
180
 
108
- #noisy
109
-
110
181
  assert_trace(%w[ a a done. ], pdef)
111
182
  end
112
183
 
@@ -120,8 +191,6 @@ class EftConcurrenceTest < Test::Unit::TestCase
120
191
  echo 'done.'
121
192
  end
122
193
 
123
- #noisy
124
-
125
194
  assert_trace %w[ a b done. ], %w[ b a done. ], pdef
126
195
  end
127
196
 
@@ -139,11 +208,11 @@ class EftConcurrenceTest < Test::Unit::TestCase
139
208
  alpha
140
209
  end
141
210
 
142
- alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
211
+ alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
143
212
 
144
213
  noisy if noise
145
214
 
146
- wfid = @engine.launch(pdef)
215
+ wfid = @dashboard.launch(pdef)
147
216
 
148
217
  wait_for(:alpha)
149
218
  wait_for(:alpha)
@@ -151,14 +220,14 @@ class EftConcurrenceTest < Test::Unit::TestCase
151
220
  2.times do
152
221
  wi = alpha.first
153
222
  wi.fields['seen'] = wi.fei.expid
154
- alpha.reply(wi)
223
+ alpha.proceed(wi)
155
224
  end
156
225
 
157
226
  wait_for(:alpha)
158
227
 
159
228
  wi = alpha.first
160
229
 
161
- ps = @engine.process(wi.fei.wfid)
230
+ ps = @dashboard.process(wi.fei.wfid)
162
231
  assert_equal %w[ 0 0_1 ], ps.expressions.collect { |e| e.fei.expid }.sort
163
232
 
164
233
  wi
@@ -217,15 +286,15 @@ class EftConcurrenceTest < Test::Unit::TestCase
217
286
  end
218
287
  end
219
288
 
220
- @engine.register_participant '.+', Ruote::StorageParticipant
289
+ @dashboard.register_participant '.+', Ruote::StorageParticipant
221
290
 
222
291
  noisy if noise
223
292
 
224
- wfid = @engine.launch(pdef)
293
+ wfid = @dashboard.launch(pdef)
225
294
 
226
295
  wait_for(:alpha)
227
296
 
228
- @engine.storage_participant.reply(@engine.storage_participant.first)
297
+ @dashboard.storage_participant.proceed(@dashboard.storage_participant.first)
229
298
 
230
299
  wait_for(wfid)
231
300
 
@@ -234,8 +303,6 @@ class EftConcurrenceTest < Test::Unit::TestCase
234
303
 
235
304
  def test_count
236
305
 
237
- #noisy
238
-
239
306
  wfid = run_test_count('cancel', false)
240
307
 
241
308
  #puts
@@ -245,31 +312,47 @@ class EftConcurrenceTest < Test::Unit::TestCase
245
312
 
246
313
  sleep 0.350 # since now dispatch_cancel occurs asynchronously...
247
314
 
248
- assert_equal 0, @engine.storage_participant.size
315
+ assert_equal 0, @dashboard.storage_participant.size
249
316
  end
250
317
 
251
318
  def test_count_remaining_forget
252
319
 
253
- #noisy
254
-
255
320
  wfid = run_test_count('forget', false)
256
321
 
257
322
  #assert_equal 1, logger.log.select { |e| e['action'] == 'forget' }.size
258
323
 
259
- assert_equal 1, @engine.storage_participant.size
260
- assert_equal 'bravo', @engine.storage_participant.first.participant_name
324
+ assert_equal 1, @dashboard.storage_participant.size
325
+ assert_equal 'bravo', @dashboard.storage_participant.first.participant_name
261
326
 
262
- #@engine.context.storage.get_many('expressions').each { |e| p e['fei'] }
263
- #puts @engine.context.storage.dump('expressions')
264
- assert_equal 2, @engine.context.storage.get_many('expressions').size
265
- assert_not_nil @engine.process(wfid)
327
+ #@dashboard.context.storage.get_many('expressions').each { |e| p e['fei'] }
328
+ #puts @dashboard.context.storage.dump('expressions')
329
+ assert_equal 2, @dashboard.context.storage.get_many('expressions').size
330
+ assert_not_nil @dashboard.process(wfid)
266
331
 
267
- @engine.storage_participant.reply(@engine.storage_participant.first)
332
+ @dashboard.storage_participant.proceed(@dashboard.storage_participant.first)
268
333
 
269
334
  wait_for(wfid)
270
335
 
271
- @engine.context.storage.get_many('expressions').each { |e| p e['fei'] }
272
- assert_equal 0, @engine.context.storage.get_many('expressions').size
336
+ @dashboard.context.storage.get_many('expressions').each { |e| p e['fei'] }
337
+ assert_equal 0, @dashboard.context.storage.get_many('expressions').size
338
+ end
339
+
340
+ def test_count_negative
341
+
342
+ pdef = Ruote.define do
343
+ concurrence :mt => 'mix', :c => -1 do # all but 1
344
+ set 'a' => 1
345
+ set 'b' => 2
346
+ set 'c' => 3
347
+ end
348
+ end
349
+
350
+ wfid = @dashboard.launch(pdef)
351
+ r = @dashboard.wait_for(wfid)
352
+
353
+ assert_equal 1, r['workitem']['fields']['a']
354
+ assert_equal 2, r['workitem']['fields']['b']
355
+ assert_equal nil, r['workitem']['fields']['c']
273
356
  end
274
357
 
275
358
  def test_cancel
@@ -281,24 +364,180 @@ class EftConcurrenceTest < Test::Unit::TestCase
281
364
  end
282
365
  end
283
366
 
284
- alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
367
+ alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
285
368
 
286
- #noisy
287
-
288
- wfid = @engine.launch(pdef)
369
+ wfid = @dashboard.launch(pdef)
289
370
 
290
371
  wait_for(:alpha)
291
372
  wait_for(:alpha)
292
373
 
293
374
  assert_equal 2, alpha.size
294
375
 
295
- @engine.cancel_process(wfid)
376
+ @dashboard.cancel_process(wfid)
296
377
 
297
378
  wait_for(wfid)
298
379
 
299
- ps = @engine.process(wfid)
380
+ ps = @dashboard.process(wfid)
300
381
 
301
382
  assert_nil ps
302
383
  end
384
+
385
+ #
386
+ # 'wait_for' tests
387
+
388
+ # 'wait_for => 1' is equivalent to 'count => 1'
389
+ #
390
+ def test_wait_for_int
391
+
392
+ pdef = Ruote.define do
393
+ concurrence :wait_for => 1 do
394
+ sequence do
395
+ stall
396
+ echo 'alpha'
397
+ end
398
+ echo 'bravo'
399
+ end
400
+ echo 'over.'
401
+ end
402
+
403
+ wfid = @dashboard.launch(pdef)
404
+
405
+ @dashboard.wait_for(wfid)
406
+
407
+ assert_equal %w[ bravo over. ], @tracer.to_a
408
+ end
409
+
410
+ def test_wait_for_zero
411
+
412
+ pdef = Ruote.define do
413
+ concurrence :wait_for => 0, :remaining => :forget do
414
+ sequence do
415
+ wait '5s'
416
+ echo 'alpha'
417
+ end
418
+ end
419
+ echo 'over.'
420
+ end
421
+
422
+ wfid = @dashboard.launch(pdef)
423
+
424
+ @dashboard.wait_for(wfid)
425
+
426
+ assert_equal %w[ over. ], @tracer.to_a
427
+ end
428
+
429
+ def test_wait_for_tags
430
+
431
+ pdef = Ruote.define do
432
+ concurrence :wait_for => 'azuma, bashamichi', :merge_type => 'concat' do
433
+ sequence :tag => 'azuma' do
434
+ set 'seen' => [ 'azuma' ]
435
+ end
436
+ sequence :tag => 'bashamichi' do
437
+ set 'seen' => [ 'bashamichi' ]
438
+ end
439
+ sequence :tag => 'katou' do
440
+ set 'seen' => [ 'katou' ]
441
+ end
442
+ end
443
+ end
444
+
445
+ wfid = @dashboard.launch(pdef)
446
+
447
+ r = @dashboard.wait_for(wfid)
448
+
449
+ assert_equal %w[ azuma bashamichi ], r['workitem']['fields']['seen'].sort
450
+ end
451
+
452
+ def test_wait_for_tags_array
453
+
454
+ pdef = Ruote.define do
455
+ concurrence :wait_for => %w[ azuma bashamichi ], :mt => 'concat' do
456
+ sequence :tag => 'azuma' do
457
+ set 'seen' => [ 'azuma' ]
458
+ end
459
+ sequence :tag => 'bashamichi' do
460
+ set 'seen' => [ 'bashamichi' ]
461
+ end
462
+ sequence :tag => 'katou' do
463
+ set 'seen' => [ 'katou' ]
464
+ wait '5s'
465
+ end
466
+ end
467
+ end
468
+
469
+ wfid = @dashboard.launch(pdef)
470
+
471
+ r = @dashboard.wait_for(wfid)
472
+
473
+ assert_equal %w[ azuma bashamichi ], r['workitem']['fields']['seen'].sort
474
+ end
475
+
476
+ def test_wait_for_one_tag
477
+
478
+ @dashboard.register do
479
+ administrator do |workitem|
480
+ tracer << "administrator\n"
481
+ sleep 0.7
482
+ end
483
+ evaluator Ruote::NullParticipant
484
+ #evaluator Ruote::NoOpParticipant
485
+ end
486
+
487
+ pdef = Ruote.process_definition do
488
+ concurrence :wait_for => 'first' do
489
+ sequence :tag => 'first' do
490
+ administrator
491
+ end
492
+ sequence :tag => 'second' do
493
+ evaluator
494
+ end
495
+ end
496
+ echo 'done.'
497
+ end
498
+
499
+ wfid = @dashboard.launch(pdef)
500
+
501
+ r = @dashboard.wait_for(wfid)
502
+
503
+ assert_equal 'terminated', r['action']
504
+ assert_equal "administrator\ndone.", @tracer.to_s
505
+ end
506
+
507
+ def test_wait_for_unknown_tag
508
+
509
+ pdef = Ruote.define do
510
+ concurrence :wait_for => 'nada' do
511
+ echo 'a'
512
+ echo 'b'
513
+ end
514
+ echo 'c'
515
+ end
516
+
517
+ wfid = @dashboard.launch(pdef)
518
+ r = @dashboard.wait_for(wfid)
519
+
520
+ assert_equal 'ceased', r['action']
521
+ assert_equal %w[ a b ], @tracer.to_a.sort
522
+ end
523
+
524
+ def test_remaining_wait
525
+
526
+ pdef = Ruote.define do
527
+ concurrence :count => 1, :rem => 'wait', :mt => 'mix' do
528
+ set 'a' => true
529
+ sequence do
530
+ set 'b' => true
531
+ stall
532
+ end
533
+ end
534
+ end
535
+
536
+ wfid = @dashboard.launch(pdef); r = @dashboard.wait_for(wfid)
537
+
538
+ assert_equal(
539
+ { 'a' => true, 'b' => true, '__result__' => true },
540
+ r['workitem']['fields'])
541
+ end
303
542
  end
304
543