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,66 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Jul 30 17:27:22 JST 2012
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtContextTest < Test::Unit::TestCase
12
+
13
+ def teardown
14
+
15
+ @dashboard.shutdown
16
+ @dashboard.context.storage.purge!
17
+ end
18
+
19
+ def test_wait_for_goes_last
20
+
21
+ @dashboard = Ruote::Engine.new(Ruote::Worker.new(determine_storage({})))
22
+
23
+ log = []
24
+
25
+ c = Object.new
26
+ class << c
27
+ attr_accessor :log
28
+ def on_msg(msg)
29
+ log << 'c'
30
+ end
31
+ def wait_for # it's a waiter
32
+ raise 'never called anyway'
33
+ end
34
+ end
35
+ c.log = log
36
+
37
+ b = Object.new
38
+ class << b
39
+ attr_accessor :log
40
+ def on_msg(msg)
41
+ log << 'b'
42
+ end
43
+ end
44
+ b.log = log
45
+
46
+ a = Object.new
47
+ class << a
48
+ attr_accessor :log
49
+ def on_msg(msg)
50
+ log << 'a'
51
+ end
52
+ end
53
+ a.log = log
54
+
55
+ @dashboard.add_service('c', c) # waiter
56
+ @dashboard.add_service('b', b) # observer
57
+ @dashboard.add_service('a', a) # observer
58
+
59
+ wfid = @dashboard.launch(Ruote.define do
60
+ end)
61
+ @dashboard.wait_for(wfid)
62
+
63
+ assert_equal %w[ a b c a b c ], log
64
+ end
65
+ end
66
+
@@ -0,0 +1,53 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Jul 30 19:47:59 JST 2012
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+ require 'ruote/observer'
11
+
12
+
13
+ class FtObserverTest < Test::Unit::TestCase
14
+ include FunctionalBase
15
+
16
+ class MyObserver < Ruote::Observer
17
+ attr_reader :events
18
+ def initialize(context)
19
+ super
20
+ @events = []
21
+ end
22
+ def on_msg_launch(msg)
23
+ @events << [ 'launch', msg['wfid'] ]
24
+ end
25
+ def on_msg_terminated(msg)
26
+ @events << [ 'terminated', msg['wfid'] ]
27
+ end
28
+ end
29
+
30
+ def test_respark
31
+
32
+ @dashboard.register 'alpha', Ruote::NoOpParticipant
33
+
34
+ my_observer = MyObserver.new(@dashboard.context)
35
+ @dashboard.add_service 'my_observer', my_observer
36
+ #
37
+ # using an instantiated service for easier testing...
38
+
39
+ pdef = Ruote.define do
40
+ alpha
41
+ end
42
+
43
+ wfid = @dashboard.launch(pdef)
44
+ m = @dashboard.wait_for(wfid)
45
+
46
+ assert_equal 'terminated', m['action']
47
+
48
+ assert_equal(
49
+ [ [ 'launch', wfid ], [ 'terminated', wfid ] ],
50
+ my_observer.events)
51
+ end
52
+ end
53
+
@@ -0,0 +1,157 @@
1
+ #
2
+ # Testing process observers
3
+ #
4
+ # Made in Germany
5
+ # by Hartog de Mik
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+ require 'ruote/util/process_observer'
10
+
11
+ class FtProcessObservingTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ def test_on_launch
15
+ observer = Class.new(Ruote::ProcessObserver) do
16
+ class << self
17
+ attr_accessor :started
18
+ end
19
+
20
+ def on_launch(wfid)
21
+ self.class.started = true
22
+ end
23
+
24
+ def on_error_intercepted(wfid, fields)
25
+ ex = fields[:error]
26
+ STDERR.puts "#{ex.class.name}: #{ex.message}"
27
+ STDERR.puts "\t#{ex.backtrace.join("\n\t")}"
28
+ end
29
+ end
30
+
31
+ @dashboard.add_service('start_subscriber', observer)
32
+
33
+ wfid = @dashboard.launch Ruote.define do; echo "hello"; end
34
+ res = @dashboard.wait_for(wfid)
35
+
36
+ assert_equal true, observer.started
37
+ end
38
+
39
+ def test_on_sub_launch
40
+ observer = Class.new(Ruote::ProcessObserver) do
41
+ class << self
42
+ attr_accessor :opts, :launches
43
+ end
44
+
45
+ def on_launch(wfid, opts)
46
+ self.class.opts = opts.dup
47
+ self.class.launches += 1
48
+ end
49
+ end
50
+ observer.launches = 0
51
+
52
+ @dashboard.add_service("sub_launch_observer", observer)
53
+ pdef = Ruote.define do
54
+ sequence do
55
+ alpha
56
+ end
57
+
58
+ define :alpha do
59
+ echo "I am the sub"
60
+ end
61
+ end
62
+
63
+ wfid = @dashboard.launch pdef
64
+ @dashboard.wait_for(wfid)
65
+
66
+ assert_not_nil observer.opts
67
+ assert_equal 2, observer.launches
68
+ assert_equal true, observer.opts[:child]
69
+ assert_not_nil observer.opts[:pdef]
70
+ end
71
+
72
+ def test_on_end
73
+ observer = Class.new(Ruote::ProcessObserver) do
74
+ class << self
75
+ attr_accessor :stopped
76
+ end
77
+
78
+ def on_terminated(wfid)
79
+ self.class.stopped = true
80
+ end
81
+ end
82
+ @dashboard.add_service('stop_server', observer)
83
+
84
+ wfid = @dashboard.launch Ruote.define do; echo "hello"; end
85
+ res = @dashboard.wait_for(wfid)
86
+
87
+ assert_equal true, observer.stopped
88
+ end
89
+
90
+ def test_on_error
91
+ observer = Class.new(Ruote::ProcessObserver) do
92
+ class << self
93
+ attr_accessor :flunked, :opts
94
+ end
95
+
96
+ def on_error_intercepted(wfid, opts)
97
+ self.class.flunked = true
98
+ self.class.opts = opts
99
+ end
100
+ end
101
+
102
+ @dashboard.add_service('flunk_subscriber', observer)
103
+
104
+ @dashboard.register_participant :pinky do |wi|
105
+ raise "hell"
106
+ end
107
+
108
+ wfid = @dashboard.launch Ruote.define() { pinky }
109
+ res = @dashboard.wait_for(wfid)
110
+
111
+ assert_equal true, observer.flunked
112
+ assert_not_nil observer.opts
113
+ assert_not_nil observer.opts[:error]
114
+ assert_equal "hell", observer.opts[:error].message
115
+ end
116
+
117
+ def test_on_cancel
118
+ observer = Class.new(Ruote::ProcessObserver) do
119
+ class << self
120
+ attr_accessor :canceled
121
+ end
122
+
123
+ def on_cancel(wfid)
124
+ self.class.canceled = true
125
+ end
126
+ end
127
+
128
+ @dashboard.add_service('cancel_subscriber', observer)
129
+
130
+ @dashboard.register_participant :brain do |wi|
131
+ context.dashboard.cancel(wi.wfid)
132
+ end
133
+
134
+ wfid = @dashboard.launch Ruote.define() { brain }
135
+ res = @dashboard.wait_for(wfid)
136
+
137
+ assert_equal true, observer.canceled
138
+ end
139
+
140
+ def test_error_handling
141
+ observer = Class.new(Ruote::ProcessObserver) do
142
+ class << self; attr_accessor :flunked; end
143
+ def on_launch(wfid)
144
+ raise "Sit still! I'm trying to kill you!"
145
+ end
146
+ def on_error_intercepted(wfid)
147
+ self.class.flunked = true
148
+ end
149
+ end
150
+
151
+ @dashboard.add_service('process_timer', observer)
152
+ wfid = @dashboard.launch Ruote.define do; echo('hi'); end
153
+ res = @dashboard.wait_for(wfid)
154
+
155
+ assert_equal nil, observer.flunked
156
+ end
157
+ end
@@ -0,0 +1,37 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Mon Sep 3 06:29:08 JST 2012
6
+ #
7
+
8
+ require File.expand_path('../base', __FILE__)
9
+
10
+
11
+ class FtPartParticipantTest < Test::Unit::TestCase
12
+ include FunctionalBase
13
+
14
+ class MyParticipant < Ruote::Participant
15
+ def on_workitem
16
+ (workitem.fields['seen'] ||= []) << workitem.participant_name
17
+ reply
18
+ end
19
+ end
20
+
21
+ def test_participant
22
+
23
+ @dashboard.register '.+', MyParticipant
24
+
25
+ pdef = Ruote.process_definition do
26
+ alpha
27
+ bravo
28
+ end
29
+
30
+ wfid = @dashboard.launch(pdef)
31
+ r = @dashboard.wait_for(wfid)
32
+
33
+ assert_equal 'terminated', r['action']
34
+ assert_equal %w[ alpha bravo ], r['workitem']['fields']['seen']
35
+ end
36
+ end
37
+
@@ -5,7 +5,7 @@
5
5
  # Wed Jun 10 11:03:26 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), 'base')
8
+ require File.expand_path('../base', __FILE__)
9
9
 
10
10
  require 'ruote/participant'
11
11
 
@@ -21,14 +21,12 @@ class FtTagsTest < Test::Unit::TestCase
21
21
  end
22
22
  end
23
23
 
24
- alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
24
+ alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
25
25
 
26
- #noisy
27
-
28
- wfid = @engine.launch(pdef)
26
+ wfid = @dashboard.launch(pdef)
29
27
  wait_for(:alpha)
30
28
 
31
- ps = @engine.process(wfid)
29
+ ps = @dashboard.process(wfid)
32
30
 
33
31
  #p ps.variables
34
32
  #ps.expressions.each { |e| p [ e.fei, e.variables ] }
@@ -38,7 +36,7 @@ class FtTagsTest < Test::Unit::TestCase
38
36
  #logger.log.each { |e| puts e['action'] }
39
37
  assert_equal 2, logger.log.select { |e| e['action'] == 'entered_tag' }.size
40
38
 
41
- alpha.reply(alpha.first)
39
+ alpha.proceed(alpha.first)
42
40
  wait_for(wfid)
43
41
 
44
42
  assert_equal 2, logger.log.select { |e| e['action'] == 'left_tag' }.size
@@ -48,43 +46,115 @@ class FtTagsTest < Test::Unit::TestCase
48
46
  #
49
47
  def test_on_cancel
50
48
 
49
+ @dashboard.register_participant '.+', Ruote::StorageParticipant
50
+
51
51
  pdef = Ruote.process_definition do
52
52
  sequence do
53
53
  sequence :tag => 'a', :on_cancel => 'decom' do
54
54
  alpha
55
55
  end
56
- alpha
56
+ bravo
57
57
  end
58
58
  define 'decom' do
59
- alpha
59
+ charly
60
60
  end
61
61
  end
62
62
 
63
- alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
64
-
65
- #noisy
66
-
67
- wfid = @engine.launch(pdef)
63
+ wfid = @dashboard.launch(pdef)
68
64
 
69
65
  wait_for(:alpha)
70
66
 
71
- assert_equal 1, @engine.process(wfid).tags.size
67
+ assert_equal 1, @dashboard.process(wfid).tags.size
72
68
 
73
- fei = @engine.process(wfid).expressions.find { |e|
69
+ fei = @dashboard.process(wfid).expressions.find { |e|
74
70
  e.fei.expid == '0_1_0'
75
71
  }.fei
76
72
 
77
- @engine.cancel_expression(fei)
73
+ @dashboard.cancel_expression(fei)
78
74
 
79
- wait_for(:alpha)
75
+ wait_for(:charly)
80
76
 
81
- assert_equal 0, @engine.process(wfid).tags.size
77
+ assert_equal 1, @dashboard.process(wfid).tags.size
82
78
 
83
- alpha.reply(alpha.first)
79
+ @dashboard.storage_participant.proceed(@dashboard.storage_participant.first)
84
80
 
85
- wait_for(:alpha)
81
+ wait_for(:bravo)
82
+
83
+ ps = @dashboard.process(wfid)
84
+
85
+ assert_equal 0, ps.tags.size
86
+ assert_equal 1, ps.past_tags.size
87
+ assert_equal 'a', ps.root_expression.variables['__past_tags__'].first.first
88
+
89
+ @dashboard.storage_participant.proceed(@dashboard.storage_participant.first)
90
+
91
+ r = @dashboard.wait_for(wfid)
92
+
93
+ assert_equal 'terminated', r['action']
94
+
95
+ assert_equal 1, r['variables']['__past_tags__'].size
96
+
97
+ a = r['variables']['__past_tags__'].first
98
+
99
+ assert_equal 'a', a[0]
100
+ assert_match /^0_1_0!/, a[1]
101
+ assert_match /!#{wfid}$/, a[1]
102
+ assert_equal 'cancelled', a[2]
103
+ assert_match /\sUTC$/, a[3]
104
+ end
105
+
106
+ def test_cancel_tag
107
+
108
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
109
+
110
+ pdef = Ruote.define do
111
+ sequence :tag => 'a' do
112
+ alpha
113
+ end
114
+ end
115
+
116
+ wfid = @dashboard.launch(pdef)
117
+ r = @dashboard.wait_for(:alpha)
86
118
 
87
- assert_equal 0, @engine.process(wfid).tags.size
119
+ ps = @dashboard.ps(wfid)
120
+ @dashboard.cancel(ps.expressions[1])
121
+
122
+ r = @dashboard.wait_for(wfid)
123
+
124
+ assert_equal 'terminated', r['action']
125
+ assert_equal 1, r['variables']['__past_tags__'].size
126
+
127
+ a = r['variables']['__past_tags__'].first
128
+
129
+ assert_equal 'a', a[0]
130
+ assert_equal 'cancelled', a[2]
131
+ end
132
+
133
+ def test_kill_tag
134
+
135
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
136
+
137
+ pdef = Ruote.define do
138
+ sequence :tag => 'a' do
139
+ alpha
140
+ end
141
+ end
142
+
143
+ wfid = @dashboard.launch(pdef)
144
+ r = @dashboard.wait_for(:alpha)
145
+
146
+ ps = @dashboard.ps(wfid)
147
+ @dashboard.kill(ps.expressions[1])
148
+
149
+ r = @dashboard.wait_for(wfid)
150
+
151
+ assert_equal 'terminated', r['action']
152
+ assert_equal 1, r['variables']['__past_tags__'].size
153
+
154
+ a = r['variables']['__past_tags__'].first
155
+
156
+ assert_equal 'a', a[0]
157
+ assert_equal 'killed', a[2]
88
158
  end
89
159
 
90
160
  def test_unset_tag_when_parent_gone
@@ -99,16 +169,14 @@ class FtTagsTest < Test::Unit::TestCase
99
169
  end
100
170
  end
101
171
 
102
- #@engine.noisy = true
103
-
104
- @engine.register :alpha, Ruote::NullParticipant
105
- @engine.register :bravo, Ruote::NoOpParticipant
172
+ @dashboard.register :alpha, Ruote::NullParticipant
173
+ @dashboard.register :bravo, Ruote::NoOpParticipant
106
174
 
107
- wfid = @engine.launch(pdef)
175
+ wfid = @dashboard.launch(pdef)
108
176
 
109
- @engine.wait_for(23)
177
+ @dashboard.wait_for(23)
110
178
 
111
- assert_nil @engine.process(wfid)
179
+ assert_nil @dashboard.process(wfid)
112
180
  end
113
181
 
114
182
  def test_tags_and_workitems
@@ -124,54 +192,174 @@ class FtTagsTest < Test::Unit::TestCase
124
192
  david
125
193
  end
126
194
 
127
- @engine.register { catchall }
195
+ @dashboard.register { catchall }
128
196
 
129
- wfid = @engine.launch(pdef)
130
- @engine.wait_for(:alpha)
131
- wi = @engine.storage_participant.first
197
+ wfid = @dashboard.launch(pdef)
198
+ @dashboard.wait_for(:alpha)
199
+ wi = @dashboard.storage_participant.first
132
200
 
133
201
  assert_equal %w[ first-stage ], wi.tags
134
202
 
135
- @engine.storage_participant.reply(wi)
136
- @engine.wait_for(:bravo)
137
- wi = @engine.storage_participant.first
203
+ @dashboard.storage_participant.proceed(wi)
204
+ @dashboard.wait_for(:bravo)
205
+ wi = @dashboard.storage_participant.first
138
206
 
139
207
  assert_equal %w[ second-stage ], wi.tags
140
208
 
141
- @engine.storage_participant.reply(wi)
142
- @engine.wait_for(:charly)
143
- wi = @engine.storage_participant.first
209
+ @dashboard.storage_participant.proceed(wi)
210
+ @dashboard.wait_for(:charly)
211
+ wi = @dashboard.storage_participant.first
144
212
 
145
213
  assert_equal %w[ second-stage third-stage ], wi.tags
146
214
 
147
- @engine.storage_participant.reply(wi)
148
- @engine.wait_for(:david)
149
- wi = @engine.storage_participant.first
215
+ @dashboard.storage_participant.proceed(wi)
216
+ @dashboard.wait_for(:david)
217
+ wi = @dashboard.storage_participant.first
150
218
 
151
219
  assert_equal [], wi.tags
152
220
  end
153
221
 
222
+ # Cf http://groups.google.com/group/openwferu-users/browse_thread/thread/61f037bc491dcf4c
223
+ #
224
+ def test_tags_workitems_and_cursor
225
+
226
+ pdef = Ruote.define do
227
+ sequence :tag => 'phase1' do
228
+ concurrence :merge_type => :union do
229
+ alpha
230
+ bravo
231
+ end
232
+ charly
233
+ end
234
+ end
235
+
236
+ @dashboard.register_participant '.+' do |workitem|
237
+ if workitem.participant_name == 'charly'
238
+ workitem.fields['tags'] = workitem.fields['__tags__'].dup
239
+ end
240
+ nil
241
+ end
242
+
243
+ wfid = @dashboard.launch(pdef, 'my_array' => [ 1 ])
244
+ r = @dashboard.wait_for(wfid)
245
+
246
+ assert_equal(%w[ phase1 ], r['workitem']['fields']['tags'])
247
+ assert_equal('phase1', r['workitem']['fields']['__left_tag__'])
248
+ assert_equal([], r['workitem']['fields']['__tags__'])
249
+ end
250
+
154
251
  def test_tag_and_define
155
252
 
156
253
  pdef = Ruote.define :tag => 'nada' do
157
254
  alpha
158
255
  end
159
256
 
160
- @engine.register 'alpha', Ruote::StorageParticipant
161
-
162
- #noisy
257
+ @dashboard.register 'alpha', Ruote::StorageParticipant
163
258
 
164
- wfid = @engine.launch(pdef)
165
- @engine.wait_for(:alpha)
259
+ wfid = @dashboard.launch(pdef)
260
+ @dashboard.wait_for(:alpha)
166
261
 
167
262
  assert_equal 1, logger.log.select { |e| e['action'] == 'entered_tag' }.size
168
263
 
169
- wi = @engine.storage_participant.first
170
- @engine.storage_participant.reply(wi)
264
+ wi = @dashboard.storage_participant.first
265
+ @dashboard.storage_participant.proceed(wi)
171
266
 
172
- @engine.wait_for(wfid)
267
+ @dashboard.wait_for(wfid)
173
268
 
174
269
  assert_equal 1, logger.log.select { |e| e['action'] == 'left_tag' }.size
175
270
  end
271
+
272
+ def test_absolute_tags
273
+
274
+ pdef = Ruote.define do
275
+ concurrence do
276
+ sequence do
277
+ listen :to => 'b', :upon => 'entering'
278
+ echo 'b'
279
+ end
280
+ sequence do
281
+ listen :to => 'a/b', :upon => 'entering'
282
+ echo 'a/b'
283
+ end
284
+ sequence :tag => 'a' do
285
+ wait '1s'
286
+ sequence :tag => 'b' do
287
+ end
288
+ end
289
+ end
290
+ end
291
+
292
+ wfid = @dashboard.launch(pdef)
293
+ r = @dashboard.wait_for(wfid)
294
+
295
+ assert_equal %w[ a/b b ], @tracer.to_a.sort
296
+
297
+ past_tags = r['variables']['__past_tags__']
298
+
299
+ assert_equal(
300
+ %w[ a a/b ],
301
+ past_tags.collect(&:first).sort)
302
+
303
+ past_tag = past_tags.first
304
+
305
+ assert_equal(
306
+ [ String, String, NilClass, String, NilClass ], past_tag.collect(&:class))
307
+
308
+ assert_equal(
309
+ Ruote::FlowExpressionId, Ruote.extract_fei(past_tag[1]).class)
310
+ assert_match(
311
+ / UTC$/, past_tag[3])
312
+ end
313
+
314
+ def test_tags_and_re_apply
315
+
316
+ @dashboard.register_participant :look_at_tags do |workitem|
317
+ tracer << workitem.tags.join('/') + "\n"
318
+ end
319
+
320
+ pdef = Ruote.define do
321
+ sequence :tag => 'alpha' do
322
+ look_at_tags
323
+ error 'nada'
324
+ end
325
+ end
326
+
327
+ wfid = @dashboard.launch(pdef)
328
+ r = @dashboard.wait_for('error_intercepted')
329
+
330
+ seq = @dashboard.ps(wfid).expressions[1]
331
+ @dashboard.re_apply(seq)
332
+
333
+ r = @dashboard.wait_for('error_intercepted')
334
+
335
+ assert_equal %w[ alpha alpha ], @tracer.to_a
336
+ end
337
+
338
+ def test_tag_and_on_handler
339
+
340
+ pdef = Ruote.define do
341
+ define 'h' do
342
+ echo 'in_handler'
343
+ wait '1s'
344
+ echo 'handler_out'
345
+ end
346
+ concurrence do
347
+ sequence do
348
+ await :left_tag => 'alpha'
349
+ echo 'left_tag'
350
+ end
351
+ sequence :tag => 'alpha', :on_error => 'h' do
352
+ error 'nada'
353
+ end
354
+ end
355
+ end
356
+
357
+ wfid = @dashboard.launch(pdef)
358
+ r = @dashboard.wait_for(wfid)
359
+
360
+ assert_equal 'terminated', r['action']
361
+
362
+ assert_equal %w[ in_handler handler_out left_tag ], @tracer.to_a
363
+ end
176
364
  end
177
365