ruote 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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