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
@@ -0,0 +1,65 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Tue Apr 26 03:30:29 JST 2011
6
+ #
7
+ # between Changi and Haneda (JA622A)
8
+ #
9
+
10
+ require File.expand_path('../base', __FILE__)
11
+
12
+
13
+ class FtCodeParticipantTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ def test_participant_in_vars_not_enabled
17
+
18
+ pdef = Ruote.process_definition do
19
+ set 'v:alpha' => '''
20
+ def consume(wi)
21
+ context.tracer << "#{wi.participant_name}\n"
22
+ end
23
+ def cancel(fei, flavour)
24
+ context.tracer << "cancelled\n"
25
+ end
26
+ '''
27
+ alpha
28
+ end
29
+
30
+ wfid = @dashboard.launch(pdef)
31
+ r = @dashboard.wait_for(wfid)
32
+
33
+ assert_equal 'error_intercepted', r['action']
34
+ end
35
+
36
+ def test_workitems_dispatching_message
37
+
38
+ @dashboard.context['participant_in_variable_enabled'] = true
39
+
40
+ pdef = Ruote.process_definition do
41
+ set 'v:alpha' => '''
42
+ def consume(wi)
43
+ context.tracer << "#{wi.participant_name}\n"
44
+ end
45
+ def cancel(fei, flavour)
46
+ context.tracer << "cancelled\n"
47
+ end
48
+ '''
49
+ alpha
50
+ end
51
+
52
+ wfid = @dashboard.launch(pdef)
53
+
54
+ @dashboard.wait_for(:alpha)
55
+ @dashboard.wait_for(1)
56
+
57
+ assert_equal 'alpha', @tracer.to_s
58
+
59
+ @dashboard.cancel(wfid)
60
+ @dashboard.wait_for(wfid)
61
+
62
+ assert_equal "alpha\ncancelled", @tracer.to_s
63
+ end
64
+ end
65
+
@@ -0,0 +1,34 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Thu Jun 9 11:37:56 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtTrailingFields < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_t_fields
15
+
16
+ pdef = Ruote.define do
17
+ alpha
18
+ echo 'a', :if => '${t.verbose}'
19
+ bravo
20
+ echo 'b', :if => '${t.verbose}'
21
+ end
22
+
23
+ @dashboard.register(:alpha) { |wi| wi.t['verbose'] = true }
24
+ @dashboard.register(:bravo, Ruote::NoOpParticipant)
25
+
26
+ #@dashboard.noisy = true
27
+
28
+ wfid = @dashboard.launch(pdef)
29
+ @dashboard.wait_for(wfid)
30
+
31
+ assert_equal 'a', @tracer.to_s
32
+ end
33
+ end
34
+
@@ -0,0 +1,35 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Sat Jun 25 21:00:57 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtExpNameAndDollarSubstitution < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_t_fields
15
+
16
+ pdef = <<-EOS
17
+ define
18
+ set 'v:x': alpha
19
+ user_${v:x}
20
+ user_${v:nada}
21
+ EOS
22
+
23
+ @dashboard.register /^user_/ do |wi|
24
+ tracer << wi.participant_name + "\n"
25
+ end
26
+
27
+ #@dashboard.noisy = true
28
+
29
+ wfid = @dashboard.launch(pdef)
30
+ @dashboard.wait_for(wfid)
31
+
32
+ assert_equal %w[ user_alpha user_ ], @tracer.to_a
33
+ end
34
+ end
35
+
@@ -0,0 +1,458 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Jun 27 15:18:18 JST 2011
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtParticipantsTwoTwoOne < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ #
15
+ # on_workitem / consume
16
+
17
+ class ClassicParticipant
18
+ include Ruote::LocalParticipant
19
+ def consume(workitem)
20
+ (workitem.fields['trace'] ||= []) << workitem.participant_name
21
+ reply_to_engine(workitem)
22
+ end
23
+ end
24
+
25
+ class AlphaParticipant
26
+ include Ruote::LocalParticipant
27
+ def on_workitem(workitem)
28
+ (workitem.fields['trace'] ||= []) << workitem.participant_name
29
+ reply_to_engine(workitem)
30
+ end
31
+ end
32
+
33
+ class BravoParticipant
34
+ include Ruote::LocalParticipant
35
+ def on_workitem
36
+ (workitem.fields['trace'] ||= []) << workitem.participant_name
37
+ reply_to_engine
38
+ end
39
+ end
40
+
41
+ class CharlyParticipant
42
+ include Ruote::LocalParticipant
43
+ def consume
44
+ (workitem.fields['trace'] ||= []) << workitem.participant_name
45
+ reply_to_engine
46
+ end
47
+ end
48
+
49
+ class DeltaParticipant
50
+ include Ruote::LocalParticipant
51
+ def on_workitem
52
+ (workitem.fields['trace'] ||= []) << workitem.participant_name
53
+ reply
54
+ end
55
+ end
56
+
57
+ def test_on_workitem
58
+
59
+ @dashboard.register do
60
+ classic ClassicParticipant
61
+ alpha AlphaParticipant
62
+ bravo BravoParticipant
63
+ charly CharlyParticipant
64
+ delta DeltaParticipant
65
+ end
66
+
67
+ #@dashboard.noisy = true
68
+
69
+ wfid = @dashboard.launch(Ruote.define do
70
+ classic; alpha; bravo; charly; delta
71
+ end)
72
+
73
+ r = @dashboard.wait_for(wfid)
74
+
75
+ assert_equal(
76
+ %w[ classic alpha bravo charly delta ], r['workitem']['fields']['trace'])
77
+ end
78
+
79
+ #
80
+ # on_cancel / cancel
81
+
82
+ class ZuluParticipant
83
+ include Ruote::LocalParticipant
84
+ def on_workitem
85
+ # do nothing
86
+ end
87
+ def cancel(fei, flavour)
88
+ (workitem.fields['trace'] ||= []) <<
89
+ "#{workitem.participant_name}/#{fei.sid}/#{flavour}"
90
+ end
91
+ end
92
+
93
+ class YankeeParticipant
94
+ include Ruote::LocalParticipant
95
+ def on_workitem
96
+ # do nothing
97
+ end
98
+ def on_cancel(fei, flavour)
99
+ (workitem.fields['trace'] ||= []) <<
100
+ "#{workitem.participant_name}/#{fei.sid}/#{flavour}"
101
+ end
102
+ end
103
+
104
+ class XrayParticipant
105
+ include Ruote::LocalParticipant
106
+ def on_workitem
107
+ # do nothing
108
+ end
109
+ def on_cancel
110
+ (workitem.fields['trace'] ||= []) <<
111
+ "#{workitem.participant_name}/#{fei.sid}/#{flavour}"
112
+ end
113
+ end
114
+
115
+ def test_on_cancel
116
+
117
+ @dashboard.register do
118
+ xray XrayParticipant
119
+ yankee YankeeParticipant
120
+ zulu ZuluParticipant
121
+ end
122
+
123
+ #@dashboard.noisy = true
124
+
125
+ wfid = @dashboard.launch(Ruote.define do
126
+ xray; yankee; zulu
127
+ end)
128
+
129
+ [ :xray, :yankee, :zulu ].each do |participant|
130
+ r = @dashboard.wait_for(participant)
131
+ @dashboard.wait_for(1)
132
+ @dashboard.cancel(r['fei'])
133
+ end
134
+
135
+ @dashboard.wait_for(wfid)
136
+ end
137
+
138
+ #
139
+ # accept?
140
+
141
+ class AcAlphaParticipant
142
+ include Ruote::LocalParticipant
143
+ def on_workitem
144
+ @context.tracer << workitem.participant_name + "\n"
145
+ reply
146
+ end
147
+ def accept?(workitem)
148
+ @context.tracer << "a/#{workitem.participant_name}\n"
149
+ true
150
+ end
151
+ end
152
+
153
+ class AcBravoParticipant
154
+ include Ruote::LocalParticipant
155
+ def on_workitem
156
+ @context.tracer << workitem.participant_name + "\n"
157
+ reply
158
+ end
159
+ def accept?
160
+ @context.tracer << "a/#{workitem.participant_name}\n"
161
+ true
162
+ end
163
+ end
164
+
165
+ def test_accept
166
+
167
+ #@dashboard.noisy = true
168
+
169
+ @dashboard.register do
170
+ alpha AcAlphaParticipant
171
+ bravo AcBravoParticipant
172
+ end
173
+
174
+ wfid = @dashboard.launch(Ruote.define do
175
+ alpha; bravo
176
+ end)
177
+
178
+ @dashboard.wait_for(wfid)
179
+
180
+ assert_equal %w[ a/alpha alpha a/bravo bravo ], @tracer.to_a
181
+ end
182
+
183
+ #
184
+ # on_reply
185
+
186
+ class OrAlphaParticipant
187
+ include Ruote::LocalParticipant
188
+ def on_workitem
189
+ @context.tracer << "ow/#{workitem.participant_name}\n"
190
+ reply
191
+ end
192
+ def on_reply(workitem)
193
+ @context.tracer << "or/#{workitem.participant_name}\n"
194
+ end
195
+ end
196
+
197
+ class OrBravoParticipant
198
+ include Ruote::LocalParticipant
199
+ def on_workitem
200
+ @context.tracer << "ow/#{workitem.participant_name}\n"
201
+ reply
202
+ end
203
+ def on_reply
204
+ @context.tracer << "or/#{workitem.participant_name}\n"
205
+ end
206
+ end
207
+
208
+ def test_on_reply
209
+
210
+ #@dashboard.noisy = true
211
+
212
+ @dashboard.register do
213
+ alpha OrAlphaParticipant
214
+ bravo OrBravoParticipant
215
+ end
216
+
217
+ wfid = @dashboard.launch(Ruote.define do
218
+ alpha; bravo
219
+ end)
220
+
221
+ @dashboard.wait_for(wfid)
222
+
223
+ assert_equal %w[ ow/alpha or/alpha ow/bravo or/bravo ], @tracer.to_a
224
+ end
225
+
226
+ #
227
+ # do_not_thread? / do_not_thread
228
+
229
+ class DntAlphaParticipant
230
+ include Ruote::LocalParticipant
231
+ def on_workitem
232
+ @context.tracer << "ow/#{workitem.participant_name}\n"
233
+ reply
234
+ end
235
+ def do_not_thread(workitem)
236
+ @context.tracer << "dnt/#{workitem.participant_name}\n"
237
+ end
238
+ end
239
+
240
+ class DntBravoParticipant
241
+ include Ruote::LocalParticipant
242
+ def on_workitem
243
+ @context.tracer << "ow/#{workitem.participant_name}\n"
244
+ reply
245
+ end
246
+ def do_not_thread?(workitem)
247
+ @context.tracer << "dnt/#{workitem.participant_name}\n"
248
+ end
249
+ end
250
+
251
+ class DntCharlyParticipant
252
+ include Ruote::LocalParticipant
253
+ def on_workitem
254
+ @context.tracer << "ow/#{workitem.participant_name}\n"
255
+ reply
256
+ end
257
+ def do_not_thread?
258
+ @context.tracer << "dnt/#{workitem.participant_name}\n"
259
+ end
260
+ end
261
+
262
+ class DntDeltaParticipant
263
+ include Ruote::LocalParticipant
264
+ def on_workitem
265
+ @context.tracer << "ow/#{workitem.participant_name}\n"
266
+ reply
267
+ end
268
+ def dont_thread?
269
+ @context.tracer << "dnt/#{workitem.participant_name}\n"
270
+ end
271
+ end
272
+
273
+ def test_do_not_thread
274
+
275
+ #@dashboard.noisy = true
276
+
277
+ @dashboard.register do
278
+ alpha DntAlphaParticipant
279
+ bravo DntBravoParticipant
280
+ charly DntCharlyParticipant
281
+ delta DntDeltaParticipant
282
+ end
283
+
284
+ wfid = @dashboard.launch(Ruote.define do
285
+ alpha; bravo; charly; delta
286
+ end)
287
+
288
+ @dashboard.wait_for(wfid)
289
+
290
+ assert_equal(
291
+ %w[ dnt/alpha ow/alpha
292
+ dnt/bravo ow/bravo
293
+ dnt/charly ow/charly
294
+ dnt/delta ow/delta ],
295
+ @tracer.to_a)
296
+ end
297
+
298
+ #
299
+ # on_pause / on_resume
300
+
301
+ class OpAlphaParticipant
302
+ include Ruote::LocalParticipant
303
+ def on_workitem
304
+ @context.tracer << "ow/#{workitem.participant_name}\n"
305
+ end
306
+ def on_cancel
307
+ @context.tracer << "oc/#{fei.expid}\n"
308
+ end
309
+ def on_pause(fei)
310
+ @context.tracer << "op/#{fei.expid}\n"
311
+ end
312
+ def on_resume(fei)
313
+ @context.tracer << "or/#{fei.expid}\n"
314
+ end
315
+ end
316
+
317
+ class OpBravoParticipant
318
+ include Ruote::LocalParticipant
319
+ def on_workitem
320
+ @context.tracer << "ow/#{workitem.participant_name}\n"
321
+ end
322
+ def on_pause
323
+ @context.tracer << "op/#{fei.expid}\n"
324
+ end
325
+ def on_resume
326
+ @context.tracer << "or/#{fei.expid}\n"
327
+ end
328
+ end
329
+
330
+ def test_on_pause_on_resume
331
+
332
+ #@dashboard.noisy = true
333
+
334
+ @dashboard.register do
335
+ alpha OpAlphaParticipant
336
+ bravo OpBravoParticipant
337
+ end
338
+
339
+ wfid = @dashboard.launch(Ruote.define do
340
+ alpha; bravo
341
+ end)
342
+
343
+ r = @dashboard.wait_for(:alpha)
344
+ @dashboard.wait_for(1)
345
+
346
+ @dashboard.pause(r['fei'])
347
+ @dashboard.wait_for(2)
348
+
349
+ @dashboard.resume(r['fei'])
350
+ @dashboard.wait_for(2)
351
+
352
+ @dashboard.cancel(r['fei'])
353
+
354
+ r = @dashboard.wait_for(:bravo)
355
+ @dashboard.wait_for(1)
356
+
357
+ @dashboard.pause(r['fei'])
358
+ @dashboard.wait_for(2)
359
+
360
+ @dashboard.resume(r['fei'])
361
+ @dashboard.wait_for(2)
362
+
363
+ assert_equal(
364
+ %w[ ow/alpha op/0_0 or/0_0 oc/0_0 ow/bravo op/0_1 or/0_1 ],
365
+ @tracer.to_a)
366
+ end
367
+
368
+ #
369
+ # implicit participant name
370
+
371
+ class IpnParticipant
372
+ include Ruote::LocalParticipant
373
+ def consume
374
+ @context.tracer << participant_name
375
+ reply
376
+ end
377
+ end
378
+
379
+ def test_implicit_participant_name
380
+
381
+ @dashboard.register { hypno IpnParticipant }
382
+
383
+ #@dashboard.noisy = true
384
+
385
+ wfid = @dashboard.launch(Ruote.define do
386
+ hypno
387
+ end)
388
+
389
+ @dashboard.wait_for(wfid)
390
+
391
+ assert_equal 'hypno', @tracer.to_s
392
+ end
393
+
394
+ #
395
+ # fexp, fexp(fei)
396
+ # workitem, workitem(fei)
397
+ # applied_workitem, applied_workitem(fei)
398
+
399
+ class FexpParticipant
400
+ include Ruote::LocalParticipant
401
+ def consume
402
+
403
+ @context.tracer << fexp.lookup_variable('nada') + "\n"
404
+ @context.tracer << fexp(fei).lookup_variable('nada') + "\n"
405
+
406
+ @context.tracer << workitem.fields.size.to_s + "\n"
407
+ @context.tracer << workitem(fei).fields.size.to_s + "\n"
408
+
409
+ @context.tracer << applied_workitem.fields.size.to_s + "\n"
410
+ @context.tracer << applied_workitem(fei).fields.size.to_s + "\n"
411
+
412
+ reply
413
+ end
414
+ end
415
+
416
+ def test_helper_methods
417
+
418
+ @dashboard.register { felix FexpParticipant }
419
+
420
+ #@dashboard.noisy = true
421
+
422
+ wfid = @dashboard.launch(
423
+ Ruote.define() { felix },
424
+ {},
425
+ { 'nada' => 'surf' })
426
+
427
+ @dashboard.wait_for(wfid)
428
+
429
+ assert_equal(
430
+ %w[ surf surf 2 1 1 1 ],
431
+ @tracer.to_a)
432
+ end
433
+
434
+ #
435
+ # lookup_variable(key)
436
+
437
+ class LvParticipant
438
+ include Ruote::LocalParticipant
439
+ def on_workitem
440
+ @context.tracer << lookup_variable('nada') + "\n"
441
+ reply
442
+ end
443
+ end
444
+
445
+ def test_lookup_variable
446
+
447
+ @dashboard.register { louis LvParticipant }
448
+
449
+ #@dashboard.noisy = true
450
+
451
+ wfid = @dashboard.launch(Ruote.define() { louis }, {}, { 'nada' => 'surf' })
452
+
453
+ @dashboard.wait_for(wfid)
454
+
455
+ assert_equal 'surf', @tracer.to_s
456
+ end
457
+ end
458
+