ruote 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. data/CHANGELOG.txt +166 -1
  2. data/CREDITS.txt +36 -17
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +1 -7
  5. data/Rakefile +38 -29
  6. data/TODO.txt +93 -52
  7. data/lib/ruote-fs.rb +3 -0
  8. data/lib/ruote.rb +5 -1
  9. data/lib/ruote/context.rb +140 -35
  10. data/lib/ruote/dashboard.rb +1247 -0
  11. data/lib/ruote/{engine → dboard}/process_error.rb +22 -2
  12. data/lib/ruote/dboard/process_status.rb +587 -0
  13. data/lib/ruote/engine.rb +6 -871
  14. data/lib/ruote/exp/command.rb +7 -2
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +38 -13
  17. data/lib/ruote/exp/fe_add_branches.rb +1 -1
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_await.rb +357 -0
  20. data/lib/ruote/exp/fe_cancel_process.rb +17 -3
  21. data/lib/ruote/exp/fe_command.rb +8 -4
  22. data/lib/ruote/exp/fe_concurrence.rb +218 -18
  23. data/lib/ruote/exp/fe_concurrent_iterator.rb +71 -10
  24. data/lib/ruote/exp/fe_cron.rb +3 -10
  25. data/lib/ruote/exp/fe_cursor.rb +14 -4
  26. data/lib/ruote/exp/fe_define.rb +3 -1
  27. data/lib/ruote/exp/fe_echo.rb +1 -1
  28. data/lib/ruote/exp/fe_equals.rb +1 -1
  29. data/lib/ruote/exp/fe_error.rb +1 -1
  30. data/lib/ruote/exp/fe_filter.rb +163 -4
  31. data/lib/ruote/exp/fe_forget.rb +21 -4
  32. data/lib/ruote/exp/fe_given.rb +1 -1
  33. data/lib/ruote/exp/fe_if.rb +1 -1
  34. data/lib/ruote/exp/fe_inc.rb +102 -35
  35. data/lib/ruote/exp/fe_iterator.rb +47 -12
  36. data/lib/ruote/exp/fe_listen.rb +96 -11
  37. data/lib/ruote/exp/fe_lose.rb +31 -4
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/fe_on_error.rb +109 -0
  40. data/lib/ruote/exp/fe_once.rb +10 -19
  41. data/lib/ruote/exp/fe_participant.rb +90 -28
  42. data/lib/ruote/exp/fe_read.rb +69 -0
  43. data/lib/ruote/exp/fe_redo.rb +3 -2
  44. data/lib/ruote/exp/fe_ref.rb +57 -27
  45. data/lib/ruote/exp/fe_registerp.rb +1 -3
  46. data/lib/ruote/exp/fe_reserve.rb +1 -1
  47. data/lib/ruote/exp/fe_restore.rb +6 -6
  48. data/lib/ruote/exp/fe_save.rb +12 -19
  49. data/lib/ruote/exp/fe_sequence.rb +38 -2
  50. data/lib/ruote/exp/fe_set.rb +143 -40
  51. data/lib/ruote/exp/{fe_let.rb → fe_stall.rb} +7 -38
  52. data/lib/ruote/exp/fe_subprocess.rb +8 -2
  53. data/lib/ruote/exp/fe_that.rb +1 -1
  54. data/lib/ruote/exp/fe_undo.rb +40 -4
  55. data/lib/ruote/exp/fe_unregisterp.rb +1 -3
  56. data/lib/ruote/exp/fe_wait.rb +12 -25
  57. data/lib/ruote/exp/{flowexpression.rb → flow_expression.rb} +375 -229
  58. data/lib/ruote/exp/iterator.rb +2 -2
  59. data/lib/ruote/exp/merge.rb +78 -17
  60. data/lib/ruote/exp/ro_attributes.rb +46 -36
  61. data/lib/ruote/exp/ro_filters.rb +34 -8
  62. data/lib/ruote/exp/ro_on_x.rb +431 -0
  63. data/lib/ruote/exp/ro_persist.rb +19 -7
  64. data/lib/ruote/exp/ro_timers.rb +123 -0
  65. data/lib/ruote/exp/ro_variables.rb +90 -29
  66. data/lib/ruote/fei.rb +57 -3
  67. data/lib/ruote/fs.rb +3 -0
  68. data/lib/ruote/id/mnemo_wfid_generator.rb +30 -7
  69. data/lib/ruote/id/wfid_generator.rb +17 -38
  70. data/lib/ruote/log/default_history.rb +23 -9
  71. data/lib/ruote/log/fancy_printing.rb +265 -0
  72. data/lib/ruote/log/storage_history.rb +23 -13
  73. data/lib/ruote/log/wait_logger.rb +224 -17
  74. data/lib/ruote/observer.rb +82 -0
  75. data/lib/ruote/part/block_participant.rb +65 -28
  76. data/lib/ruote/part/code_participant.rb +81 -0
  77. data/lib/ruote/part/engine_participant.rb +7 -2
  78. data/lib/ruote/part/local_participant.rb +221 -21
  79. data/lib/ruote/part/no_op_participant.rb +1 -1
  80. data/lib/ruote/part/null_participant.rb +1 -1
  81. data/lib/ruote/part/participant.rb +50 -0
  82. data/lib/ruote/part/rev_participant.rb +178 -0
  83. data/lib/ruote/part/smtp_participant.rb +2 -2
  84. data/lib/ruote/part/storage_participant.rb +228 -60
  85. data/lib/ruote/part/template.rb +1 -1
  86. data/lib/ruote/participant.rb +2 -0
  87. data/lib/ruote/reader.rb +205 -68
  88. data/lib/ruote/reader/json.rb +49 -0
  89. data/lib/ruote/reader/radial.rb +303 -0
  90. data/lib/ruote/reader/ruby_dsl.rb +44 -9
  91. data/lib/ruote/reader/xml.rb +11 -8
  92. data/lib/ruote/receiver/base.rb +98 -45
  93. data/lib/ruote/storage/base.rb +104 -35
  94. data/lib/ruote/storage/composite_storage.rb +50 -60
  95. data/lib/ruote/storage/fs_storage.rb +25 -34
  96. data/lib/ruote/storage/hash_storage.rb +38 -36
  97. data/lib/ruote/svc/dispatch_pool.rb +104 -35
  98. data/lib/ruote/svc/dollar_sub.rb +10 -8
  99. data/lib/ruote/svc/error_handler.rb +108 -52
  100. data/lib/ruote/svc/expression_map.rb +3 -3
  101. data/lib/ruote/svc/participant_list.rb +160 -55
  102. data/lib/ruote/svc/tracker.rb +31 -31
  103. data/lib/ruote/svc/treechecker.rb +28 -16
  104. data/lib/ruote/tree_dot.rb +1 -1
  105. data/lib/ruote/util/deep.rb +143 -0
  106. data/lib/ruote/util/filter.rb +125 -18
  107. data/lib/ruote/util/hashdot.rb +15 -13
  108. data/lib/ruote/util/look.rb +1 -1
  109. data/lib/ruote/util/lookup.rb +60 -22
  110. data/lib/ruote/util/misc.rb +63 -18
  111. data/lib/ruote/util/mpatch.rb +53 -0
  112. data/lib/ruote/util/ometa.rb +1 -2
  113. data/lib/ruote/util/process_observer.rb +177 -0
  114. data/lib/ruote/util/subprocess.rb +1 -1
  115. data/lib/ruote/util/time.rb +2 -2
  116. data/lib/ruote/util/tree.rb +64 -2
  117. data/lib/ruote/version.rb +3 -2
  118. data/lib/ruote/worker.rb +421 -92
  119. data/lib/ruote/workitem.rb +157 -22
  120. data/ruote.gemspec +15 -9
  121. data/test/bm/ci.rb +0 -2
  122. data/test/bm/ici.rb +0 -2
  123. data/test/bm/load_26c.rb +0 -3
  124. data/test/bm/mega.rb +0 -2
  125. data/test/functional/base.rb +57 -43
  126. data/test/functional/concurrent_base.rb +16 -13
  127. data/test/functional/ct_0_concurrence.rb +7 -11
  128. data/test/functional/ct_1_iterator.rb +9 -11
  129. data/test/functional/ct_2_cancel.rb +28 -17
  130. data/test/functional/eft_0_flow_expression.rb +35 -0
  131. data/test/functional/eft_10_cancel_process.rb +1 -1
  132. data/test/functional/eft_11_wait.rb +13 -13
  133. data/test/functional/eft_12_listen.rb +199 -66
  134. data/test/functional/eft_13_iterator.rb +95 -29
  135. data/test/functional/eft_14_cursor.rb +74 -24
  136. data/test/functional/eft_15_loop.rb +7 -7
  137. data/test/functional/eft_16_if.rb +1 -1
  138. data/test/functional/eft_17_equals.rb +1 -1
  139. data/test/functional/eft_18_concurrent_iterator.rb +156 -68
  140. data/test/functional/eft_19_reserve.rb +15 -15
  141. data/test/functional/eft_1_echo.rb +1 -1
  142. data/test/functional/eft_20_save.rb +51 -9
  143. data/test/functional/eft_21_restore.rb +1 -1
  144. data/test/functional/eft_22_noop.rb +1 -1
  145. data/test/functional/eft_23_apply.rb +1 -1
  146. data/test/functional/eft_24_add_branches.rb +7 -8
  147. data/test/functional/eft_25_command.rb +1 -1
  148. data/test/functional/eft_26_error.rb +11 -11
  149. data/test/functional/eft_27_inc.rb +111 -67
  150. data/test/functional/eft_28_once.rb +16 -16
  151. data/test/functional/eft_29_cron.rb +9 -9
  152. data/test/functional/eft_2_sequence.rb +23 -4
  153. data/test/functional/eft_30_ref.rb +36 -24
  154. data/test/functional/eft_31_registerp.rb +24 -24
  155. data/test/functional/eft_32_lose.rb +46 -20
  156. data/test/functional/eft_34_given.rb +1 -1
  157. data/test/functional/eft_35_filter.rb +161 -7
  158. data/test/functional/eft_36_read.rb +97 -0
  159. data/test/functional/{eft_0_process_definition.rb → eft_37_process_definition.rb} +4 -4
  160. data/test/functional/eft_38_on_error.rb +195 -0
  161. data/test/functional/eft_39_stall.rb +35 -0
  162. data/test/functional/eft_3_participant.rb +77 -22
  163. data/test/functional/eft_40_await.rb +297 -0
  164. data/test/functional/eft_4_set.rb +110 -11
  165. data/test/functional/eft_5_subprocess.rb +27 -5
  166. data/test/functional/eft_6_concurrence.rb +299 -60
  167. data/test/functional/eft_7_forget.rb +24 -22
  168. data/test/functional/eft_8_undo.rb +52 -15
  169. data/test/functional/eft_9_redo.rb +18 -20
  170. data/test/functional/ft_0_worker.rb +122 -13
  171. data/test/functional/ft_10_dollar.rb +77 -16
  172. data/test/functional/ft_11_recursion.rb +9 -9
  173. data/test/functional/ft_12_launchitem.rb +7 -9
  174. data/test/functional/ft_13_variables.rb +125 -22
  175. data/test/functional/ft_14_re_apply.rb +112 -56
  176. data/test/functional/ft_15_timeout.rb +64 -33
  177. data/test/functional/ft_16_participant_params.rb +59 -6
  178. data/test/functional/ft_17_conditional.rb +68 -2
  179. data/test/functional/ft_18_kill.rb +48 -30
  180. data/test/functional/ft_19_participant_code.rb +67 -0
  181. data/test/functional/ft_1_process_status.rb +222 -150
  182. data/test/functional/ft_20_storage_participant.rb +445 -44
  183. data/test/functional/ft_21_forget.rb +21 -26
  184. data/test/functional/ft_22_process_definitions.rb +8 -6
  185. data/test/functional/ft_23_load_defs.rb +29 -5
  186. data/test/functional/ft_24_block_participant.rb +199 -20
  187. data/test/functional/ft_25_receiver.rb +98 -46
  188. data/test/functional/ft_26_participant_rtimeout.rb +34 -26
  189. data/test/functional/ft_27_var_indirection.rb +40 -5
  190. data/test/functional/ft_28_null_noop_participants.rb +5 -5
  191. data/test/functional/ft_29_part_template.rb +2 -2
  192. data/test/functional/ft_2_errors.rb +106 -74
  193. data/test/functional/ft_30_smtp_participant.rb +7 -7
  194. data/test/functional/ft_31_part_blocking.rb +11 -11
  195. data/test/functional/ft_32_scope.rb +50 -0
  196. data/test/functional/ft_33_participant_subprocess_priority.rb +3 -3
  197. data/test/functional/ft_34_cursor_rewind.rb +14 -14
  198. data/test/functional/ft_35_add_service.rb +67 -9
  199. data/test/functional/ft_36_storage_history.rb +92 -24
  200. data/test/functional/ft_37_default_history.rb +35 -23
  201. data/test/functional/ft_38_participant_more.rb +189 -32
  202. data/test/functional/ft_39_wait_for.rb +25 -25
  203. data/test/functional/ft_3_participant_registration.rb +235 -107
  204. data/test/functional/ft_40_wait_logger.rb +105 -18
  205. data/test/functional/ft_41_participants.rb +13 -12
  206. data/test/functional/ft_42_storage_copy.rb +12 -12
  207. data/test/functional/ft_43_participant_on_reply.rb +85 -11
  208. data/test/functional/ft_44_var_participant.rb +5 -5
  209. data/test/functional/ft_45_participant_accept.rb +3 -3
  210. data/test/functional/ft_46_launch_single.rb +17 -17
  211. data/test/functional/ft_47_wfids.rb +41 -0
  212. data/test/functional/ft_48_lose.rb +19 -25
  213. data/test/functional/ft_49_engine_on_error.rb +54 -70
  214. data/test/functional/ft_4_cancel.rb +84 -26
  215. data/test/functional/ft_50_engine_config.rb +4 -4
  216. data/test/functional/ft_51_misc.rb +12 -12
  217. data/test/functional/ft_52_case.rb +17 -17
  218. data/test/functional/ft_53_engine_on_terminate.rb +18 -21
  219. data/test/functional/ft_54_patterns.rb +18 -16
  220. data/test/functional/ft_55_engine_participant.rb +55 -55
  221. data/test/functional/ft_56_filter_attribute.rb +90 -52
  222. data/test/functional/ft_57_rev_participant.rb +252 -0
  223. data/test/functional/ft_58_workitem.rb +150 -0
  224. data/test/functional/ft_59_pause.rb +329 -0
  225. data/test/functional/ft_5_on_error.rb +430 -77
  226. data/test/functional/ft_60_code_participant.rb +65 -0
  227. data/test/functional/ft_61_trailing_fields.rb +34 -0
  228. data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
  229. data/test/functional/ft_63_participants_221.rb +458 -0
  230. data/test/functional/ft_64_stash.rb +41 -0
  231. data/test/functional/ft_65_timers.rb +313 -0
  232. data/test/functional/ft_66_flank.rb +133 -0
  233. data/test/functional/ft_67_radial_misc.rb +34 -0
  234. data/test/functional/ft_68_reput.rb +72 -0
  235. data/test/functional/ft_69_worker_info.rb +56 -0
  236. data/test/functional/ft_6_on_cancel.rb +189 -36
  237. data/test/functional/ft_70_take_and_discard_attributes.rb +94 -0
  238. data/test/functional/ft_71_retries.rb +144 -0
  239. data/test/functional/ft_72_on_terminate.rb +60 -0
  240. data/test/functional/ft_73_raise_msg.rb +107 -0
  241. data/test/functional/ft_74_respark.rb +106 -0
  242. data/test/functional/ft_75_context.rb +66 -0
  243. data/test/functional/ft_76_observer.rb +53 -0
  244. data/test/functional/ft_77_process_observer.rb +157 -0
  245. data/test/functional/ft_78_part_participant.rb +37 -0
  246. data/test/functional/ft_7_tags.rb +238 -50
  247. data/test/functional/ft_8_participant_consumption.rb +27 -21
  248. data/test/functional/ft_9_subprocesses.rb +48 -18
  249. data/test/functional/restart_base.rb +4 -6
  250. data/test/functional/rt_0_wait.rb +10 -10
  251. data/test/functional/rt_1_listen.rb +6 -6
  252. data/test/functional/rt_2_errors.rb +12 -12
  253. data/test/functional/rt_3_once.rb +17 -12
  254. data/test/functional/rt_4_cron.rb +17 -17
  255. data/test/functional/rt_5_timeout.rb +13 -13
  256. data/test/functional/signals.rb +103 -0
  257. data/test/functional/storage.rb +730 -0
  258. data/test/functional/storage_helper.rb +48 -35
  259. data/test/functional/test.rb +6 -2
  260. data/test/misc/idle.rb +21 -0
  261. data/test/misc/light.rb +29 -0
  262. data/test/path_helper.rb +1 -1
  263. data/test/test.rb +2 -5
  264. data/test/test_helper.rb +13 -0
  265. data/test/unit/test.rb +1 -4
  266. data/test/unit/ut_0_ruby_reader.rb +25 -9
  267. data/test/unit/ut_10_participants.rb +47 -0
  268. data/test/unit/ut_11_lookup.rb +59 -2
  269. data/test/unit/ut_12_wait_logger.rb +123 -0
  270. data/test/unit/ut_14_is_uri.rb +1 -1
  271. data/test/unit/ut_15_util.rb +1 -1
  272. data/test/unit/ut_16_reader.rb +136 -14
  273. data/test/unit/ut_17_merge.rb +155 -0
  274. data/test/unit/ut_19_part_template.rb +1 -1
  275. data/test/unit/ut_1_fei.rb +11 -2
  276. data/test/unit/ut_20_composite_storage.rb +27 -1
  277. data/test/unit/{ut_21_participant_list.rb → ut_21_svc_participant_list.rb} +2 -3
  278. data/test/unit/ut_22_filter.rb +231 -10
  279. data/test/unit/ut_23_svc_tracker.rb +48 -0
  280. data/test/unit/ut_24_radial_reader.rb +458 -0
  281. data/test/unit/ut_25_process_status.rb +143 -0
  282. data/test/unit/ut_26_deep.rb +131 -0
  283. data/test/unit/ut_2_dashboard.rb +114 -0
  284. data/test/unit/ut_3_worker.rb +54 -0
  285. data/test/unit/ut_4_expmap.rb +1 -1
  286. data/test/unit/ut_5_tree.rb +23 -23
  287. data/test/unit/ut_6_condition.rb +71 -29
  288. data/test/unit/ut_7_workitem.rb +18 -4
  289. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  290. data/test/unit/ut_9_xml_reader.rb +1 -1
  291. metadata +142 -63
  292. data/jruby_issue.txt +0 -32
  293. data/lib/ruote/engine/process_status.rb +0 -403
  294. data/lib/ruote/log/pretty.rb +0 -165
  295. data/lib/ruote/log/test_logger.rb +0 -204
  296. data/lib/ruote/util/serializer.rb +0 -103
  297. data/phil.txt +0 -14
  298. data/test/functional/eft_33_let.rb +0 -31
  299. data/test/functional/ft_19_alias.rb +0 -33
  300. data/test/functional/ft_47_wfid_generator.rb +0 -54
  301. data/test/unit/storage.rb +0 -403
  302. data/test/unit/storages.rb +0 -37
  303. data/test/unit/ut_13_serializer.rb +0 -65
  304. data/test/unit/ut_18_engine.rb +0 -47
  305. data/test/unit/ut_3_wait_logger.rb +0 -39
@@ -5,7 +5,7 @@
5
5
  # Thu Nov 25 10:05:28 JST 2010
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
 
@@ -19,16 +19,16 @@ class EftLoseTest < Test::Unit::TestCase
19
19
  lose
20
20
  end
21
21
 
22
- #@engine.noisy = true
22
+ #@dashboard.noisy = true
23
23
 
24
- wfid = @engine.launch(pdef)
24
+ wfid = @dashboard.launch(pdef)
25
25
 
26
- @engine.wait_for(2)
26
+ @dashboard.wait_for(2)
27
27
  # wait until the process reaches the 'lose' expression
28
28
 
29
29
  sleep 0.500
30
30
 
31
- ps = @engine.process(wfid)
31
+ ps = @dashboard.process(wfid)
32
32
 
33
33
  assert_equal 0, ps.errors.size
34
34
  assert_equal 2, ps.expressions.size
@@ -45,15 +45,15 @@ class EftLoseTest < Test::Unit::TestCase
45
45
  charly
46
46
  end
47
47
 
48
- @engine.register_participant '.+' do |wi|
49
- @tracer << wi.participant_name
48
+ @dashboard.register_participant '.+' do |wi|
49
+ tracer << wi.participant_name
50
50
  end
51
51
 
52
- #@engine.noisy = true
52
+ #@dashboard.noisy = true
53
53
 
54
- wfid = @engine.launch(pdef)
54
+ wfid = @dashboard.launch(pdef)
55
55
 
56
- @engine.wait_for(7)
56
+ @dashboard.wait_for(7)
57
57
  # wait until 'alpha' replies to its parent 'lose'
58
58
 
59
59
  sleep 0.500
@@ -69,25 +69,51 @@ class EftLoseTest < Test::Unit::TestCase
69
69
  end
70
70
  end
71
71
 
72
- @engine.register_participant '.+', Ruote::StorageParticipant
72
+ @dashboard.register_participant '.+', Ruote::StorageParticipant
73
73
 
74
- #@engine.noisy = true
74
+ #@dashboard.noisy = true
75
75
 
76
- wfid = @engine.launch(pdef)
76
+ wfid = @dashboard.launch(pdef)
77
77
 
78
- @engine.wait_for(6)
78
+ @dashboard.wait_for(6)
79
79
  # wait until 'alpha' replies to its parent 'lose'
80
80
 
81
- sleep 0.500
81
+ assert_equal 1, @dashboard.storage_participant.size
82
82
 
83
- assert_equal 1, @engine.storage_participant.size
83
+ @dashboard.cancel_process(wfid)
84
84
 
85
- @engine.cancel_process(wfid)
85
+ @dashboard.wait_for(wfid)
86
86
 
87
- sleep 0.500
87
+ assert_equal 0, @dashboard.storage_participant.size
88
+ assert_nil @dashboard.process(wfid)
89
+ end
90
+
91
+ def test_multi
92
+
93
+ pdef = Ruote.define do
94
+ lose do
95
+ alpha
96
+ bravo
97
+ end
98
+ end
99
+
100
+ @dashboard.register '.+', Ruote::StorageParticipant
101
+
102
+ #@dashboard.noisy = true
103
+
104
+ wfid = @dashboard.launch(pdef)
105
+
106
+ @dashboard.wait_for(9)
107
+
108
+ assert_equal 2, @dashboard.storage_participant.size
109
+ assert_equal 0, @dashboard.ps(wfid).errors.size
110
+ assert_equal 4, @dashboard.ps(wfid).expressions.size
111
+
112
+ @dashboard.cancel(wfid)
113
+
114
+ @dashboard.wait_for(wfid)
88
115
 
89
- assert_equal 0, @engine.storage_participant.size
90
- assert_nil @engine.process(wfid)
116
+ assert_nil @dashboard.ps(wfid)
91
117
  end
92
118
  end
93
119
 
@@ -5,7 +5,7 @@
5
5
  # Sat Dec 25 12:21:00 JST 2010
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 EftGivenTest < Test::Unit::TestCase
@@ -5,7 +5,7 @@
5
5
  # Mon Jan 31 14:45:09 JST 2011
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 EftFilterTest < Test::Unit::TestCase
@@ -13,20 +13,29 @@ class EftFilterTest < Test::Unit::TestCase
13
13
 
14
14
  def assert_terminates(pdef, fields, result=nil)
15
15
 
16
- wfid = @engine.launch(pdef, fields)
17
- r = @engine.wait_for(wfid)
16
+ wfid = @dashboard.launch(pdef, fields)
17
+ r = @dashboard.wait_for(wfid)
18
18
 
19
19
  assert_equal 'terminated', r['action']
20
- assert_equal(result, r['workitem']['fields']) if result
20
+
21
+ fields = r['workitem']['fields']
22
+ fields.delete('__result__')
23
+
24
+ assert_equal(result, fields) if result
21
25
  end
22
26
 
23
27
  def assert_does_not_validate(pdef, fields={})
24
28
 
25
- wfid = @engine.launch(pdef, fields)
26
- r = @engine.wait_for(wfid)
29
+ wfid = @dashboard.launch(pdef, fields)
30
+ r = @dashboard.wait_for(wfid)
31
+
32
+ err = @dashboard.errors.first
27
33
 
28
34
  assert_equal 'error_intercepted', r['action']
29
- assert_match /ValidationError/, @engine.errors.first.message
35
+ assert_match /ValidationError/, err.message
36
+ assert_equal Array, err.deviations.class
37
+
38
+ #p @dashboard.ps(wfid)
30
39
  end
31
40
 
32
41
  #
@@ -41,6 +50,15 @@ class EftFilterTest < Test::Unit::TestCase
41
50
  assert_terminates(pdef, 'x' => 'nada')
42
51
  end
43
52
 
53
+ def test_filter_single_rule__drop_if
54
+
55
+ pdef = Ruote.process_definition do
56
+ filter 'x', :type => 'string', :if => true
57
+ end
58
+
59
+ assert_terminates(pdef, 'x' => 'nada')
60
+ end
61
+
44
62
  def test_filter_single_rule_validation_failure
45
63
 
46
64
  pdef = Ruote.process_definition do
@@ -265,5 +283,141 @@ class EftFilterTest < Test::Unit::TestCase
265
283
  'x' => 1
266
284
  })
267
285
  end
286
+
287
+ def test_filter_and_block
288
+
289
+ pdef = Ruote.process_definition do
290
+ filter do
291
+ field 'x', :type => 'string'
292
+ field 'y', :type => 'number'
293
+ end
294
+ end
295
+
296
+ #@dashboard.noisy = true
297
+
298
+ assert_terminates(pdef, 'x' => 's', 'y' => 2)
299
+ assert_does_not_validate(pdef, 'x' => 's', 'y' => 's')
300
+ end
301
+
302
+ def test_filter_and_block__radial
303
+
304
+ pdef = %{
305
+ define
306
+ filter
307
+ f x, type: 'string'
308
+ f y, type: 'number'
309
+ }
310
+
311
+ #@dashboard.noisy = true
312
+
313
+ assert_terminates(pdef, 'x' => 's', 'y' => 2)
314
+ assert_does_not_validate(pdef, 'x' => 's', 'y' => 's')
315
+ end
316
+
317
+ def test_filter_and_block__field_name_is_expname
318
+
319
+ pdef = %{
320
+ define
321
+ filter
322
+ x type: 'string'
323
+ y type: 'number'
324
+ }
325
+
326
+ #@dashboard.noisy = true
327
+
328
+ assert_terminates(pdef, 'x' => 's', 'y' => 2)
329
+ assert_does_not_validate(pdef, 'x' => 's', 'y' => 's')
330
+ end
331
+
332
+ def test_filter_and_block__collision_with_if
333
+
334
+ pdef = %{
335
+ define
336
+ filter if: true
337
+ x type: 'string'
338
+ y type: 'number'
339
+ }
340
+
341
+ #@dashboard.noisy = true
342
+
343
+ assert_terminates(pdef, 'x' => 's', 'y' => 2)
344
+ assert_does_not_validate(pdef, 'x' => 's', 'y' => 's')
345
+ end
346
+
347
+ def test_filter_block_and_or
348
+
349
+ pdef = Ruote.process_definition do
350
+ filter do
351
+ field 'x', :type => 'string'
352
+ _or
353
+ field 'x', :type => 'number'
354
+ end
355
+ end
356
+
357
+ #@dashboard.noisy = true
358
+
359
+ assert_terminates(pdef, 'x' => 's')
360
+ assert_terminates(pdef, 'x' => 5)
361
+ assert_does_not_validate(pdef, 'x' => true)
362
+ end
363
+
364
+ def test_filter_block_and_or__radial
365
+
366
+ pdef = %{
367
+ define
368
+ filter
369
+ x type: 'string'
370
+ or
371
+ x type: 'number'
372
+ }
373
+
374
+ #@dashboard.noisy = true
375
+
376
+ assert_terminates(pdef, 'x' => 's')
377
+ assert_terminates(pdef, 'x' => 5)
378
+ assert_does_not_validate(pdef, 'x' => true)
379
+ end
380
+
381
+ def test_cancel_filter_in_error
382
+
383
+ #@dashboard.noisy = true
384
+
385
+ pdef = Ruote.define do
386
+ filter :in => [ { :field => 'x', :type => :number } ]
387
+ end
388
+
389
+ wfid = @dashboard.launch(pdef)
390
+
391
+ @dashboard.wait_for(wfid)
392
+
393
+ assert_equal 1, @dashboard.ps(wfid).errors.size
394
+
395
+ @dashboard.cancel(wfid)
396
+
397
+ @dashboard.wait_for('terminated')
398
+
399
+ assert_nil @dashboard.ps(wfid)
400
+ end
401
+
402
+ def test_cancel_filter_out_error
403
+
404
+ #@dashboard.noisy = true
405
+
406
+ pdef = Ruote.define do
407
+ filter :out => [ { :field => 'x', :type => :number } ]
408
+ end
409
+
410
+ wfid = @dashboard.launch(pdef)
411
+
412
+ @dashboard.wait_for(wfid)
413
+
414
+ assert_equal 1, @dashboard.ps(wfid).errors.size
415
+
416
+ @dashboard.cancel(wfid)
417
+
418
+ @dashboard.wait_for('terminated')
419
+
420
+ assert_nil @dashboard.ps(wfid)
421
+ end
268
422
  end
269
423
 
@@ -0,0 +1,97 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Fri Apr 15 09:49:10 JST 2011
6
+ #
7
+ # over Canada, between SFO and FRA
8
+ #
9
+
10
+
11
+ require File.expand_path('../base', __FILE__)
12
+
13
+ require_json
14
+ Rufus::Json.detect_backend
15
+
16
+
17
+ class EftReadTest < Test::Unit::TestCase
18
+ include FunctionalBase
19
+
20
+ def test_read_text_file
21
+
22
+ dir = "t_rtf_#{$$}_#{self.object_id}_#{Time.now.to_f}"
23
+ fname = File.join(dir, 'message.txt')
24
+ FileUtils.mkdir(dir)
25
+
26
+ File.open(fname, 'wb') { |f| f.write('kilroy was here') }
27
+
28
+ pdef = Ruote.process_definition do
29
+ read fname, :to => 'x'
30
+ read :from => fname, :to => 'f:y'
31
+ read fname, :to => 'v:z'
32
+ set 'f:z' => '$v:z'
33
+ end
34
+
35
+ #@dashboard.noisy = true
36
+
37
+ wfid = @dashboard.launch(pdef)
38
+
39
+ fields = @dashboard.wait_for(wfid)['workitem']['fields']
40
+
41
+ assert_equal(
42
+ [ 'kilroy was here' ],
43
+ %w[ x y z ].collect { |k| fields[k] }.uniq)
44
+
45
+ ensure
46
+ FileUtils.rm_rf(dir)
47
+ end
48
+
49
+ def test_read_json_file
50
+
51
+ dir = "t_rjf_#{$$}_#{self.object_id}_#{Time.now.to_f}"
52
+ fname = File.join(dir, 'message.json')
53
+ FileUtils.mkdir(dir)
54
+
55
+ File.open(fname, 'wb') do |f|
56
+ f.puts(Rufus::Json.encode('kilroy' => 'here'))
57
+ end
58
+
59
+ pdef = Ruote.process_definition do
60
+ read fname, :to => 'x'
61
+ read :from => fname, :to => 'f:y'
62
+ read fname, :to => 'v:z'
63
+ set 'f:z' => '$v:z'
64
+ end
65
+
66
+ #@dashboard.noisy = true
67
+
68
+ wfid = @dashboard.launch(pdef)
69
+
70
+ fields = @dashboard.wait_for(wfid)['workitem']['fields']
71
+
72
+ assert_equal(
73
+ [ { 'kilroy' => 'here' } ],
74
+ %w[ x y z ].collect { |k| fields[k] }.uniq)
75
+
76
+ ensure
77
+ FileUtils.rm_rf(dir)
78
+ end
79
+
80
+ def test_read_http
81
+
82
+ pdef = Ruote.process_definition do
83
+ read 'http://ruote.s3.amazonaws.com/eft_36_read.txt', :to => :x
84
+ read 'http://ruote.s3.amazonaws.com/eft_36_read.json', :to => :y
85
+ end
86
+
87
+ wfid = @dashboard.launch(pdef)
88
+
89
+ fields = @dashboard.wait_for(wfid)['workitem']['fields']
90
+
91
+ assert_equal(
92
+ "kilroy was here\n", fields['x'], "\nkilroy wasn't here (no network ?)\n")
93
+ assert_equal(
94
+ { 'kilroy' => 'here' }, fields['y'])
95
+ end
96
+ end
97
+
@@ -5,7 +5,7 @@
5
5
  # Sat Jan 24 22:40:35 JST 2009
6
6
  #
7
7
 
8
- require File.join(File.dirname(__FILE__), 'base')
8
+ require File.expand_path('../base', __FILE__)
9
9
 
10
10
  require 'ruote/participant'
11
11
 
@@ -28,15 +28,15 @@ class EftProcessDefinitionTest < Test::Unit::TestCase
28
28
  participant :ref => :alpha
29
29
  end
30
30
 
31
- alpha = @engine.register_participant :alpha, Ruote::StorageParticipant
31
+ alpha = @dashboard.register_participant :alpha, Ruote::StorageParticipant
32
32
 
33
33
  #noisy
34
34
 
35
- wfid = @engine.launch(pdef)
35
+ wfid = @dashboard.launch(pdef)
36
36
 
37
37
  wait_for(:alpha)
38
38
 
39
- ps = @engine.process(wfid)
39
+ ps = @dashboard.process(wfid)
40
40
 
41
41
  assert_equal(
42
42
  {"sub0"=> ["0_0", ["define", {"name"=>"sub0"}, []]],
@@ -0,0 +1,195 @@
1
+
2
+ #
3
+ # testing ruote
4
+ #
5
+ # Tue Jul 19 18:05:49 JST 2011
6
+ #
7
+ # Hiroshima
8
+ #
9
+
10
+ require File.expand_path('../base', __FILE__)
11
+
12
+ require 'ruote/participant'
13
+
14
+
15
+ class EftOnErrorTest < Test::Unit::TestCase
16
+ include FunctionalBase
17
+
18
+ def test_empty_on_error
19
+
20
+ pdef = Ruote.process_definition do
21
+ on_error
22
+ echo 'over.'
23
+ end
24
+
25
+ #@dashboard.noisy = true
26
+
27
+ wfid = @dashboard.launch(pdef)
28
+
29
+ @dashboard.wait_for(wfid)
30
+
31
+ assert_equal 'over.', @tracer.to_s
32
+ end
33
+
34
+ def test_on_error
35
+
36
+ pdef = Ruote.process_definition do
37
+ on_error 'catcher'
38
+ nada
39
+ end
40
+
41
+ @dashboard.register_participant :catcher do
42
+ tracer << "caught\n"
43
+ end
44
+
45
+ #@dashboard.noisy = true
46
+
47
+ wfid = @dashboard.launch(pdef)
48
+ @dashboard.wait_for(wfid)
49
+
50
+ assert_equal 'caught', @tracer.to_s
51
+ assert_equal 1, logger.log.select { |e| e['action'] == 'fail' }.size
52
+ end
53
+
54
+ def test_on_error_regex
55
+
56
+ pdef = Ruote.process_definition do
57
+ on_error /unknown participant/ => 'bravo'
58
+ on_error 'alpha'
59
+ nada
60
+ end
61
+
62
+ @dashboard.register_participant /alpha|bravo/ do |workitem|
63
+ tracer << workitem.participant_name
64
+ end
65
+
66
+ #@dashboard.noisy = true
67
+
68
+ wfid = @dashboard.launch(pdef)
69
+ @dashboard.wait_for(wfid)
70
+
71
+ assert_equal 'bravo', @tracer.to_s
72
+ end
73
+
74
+ def test_on_error_block
75
+
76
+ pdef = Ruote.process_definition do
77
+ on_error do
78
+ echo 'caught'
79
+ end
80
+ nada
81
+ end
82
+
83
+ #@dashboard.noisy = true
84
+
85
+ wfid = @dashboard.launch(pdef)
86
+ @dashboard.wait_for(wfid)
87
+
88
+ assert_equal 'caught', @tracer.to_s
89
+ end
90
+
91
+ def test_on_error_block_and_regex
92
+
93
+ pdef = Ruote.process_definition do
94
+ on_error /unknown participant/ do
95
+ echo 'unknown participant'
96
+ end
97
+ on_error do
98
+ echo 'caught'
99
+ end
100
+ nada
101
+ end
102
+
103
+ #@dashboard.noisy = true
104
+
105
+ wfid = @dashboard.launch(pdef)
106
+ @dashboard.wait_for(wfid)
107
+
108
+ assert_equal 'unknown participant', @tracer.to_s
109
+ end
110
+
111
+ def test_class_match
112
+
113
+ pdef = Ruote.process_definition do
114
+ on_error 'RuntimeError' => 'bravo'
115
+ on_error 'alpha'
116
+ nada
117
+ end
118
+
119
+ @dashboard.register_participant /alpha|bravo/ do |workitem|
120
+ tracer << workitem.participant_name
121
+ end
122
+
123
+ #@dashboard.noisy = true
124
+
125
+ wfid = @dashboard.launch(pdef)
126
+ @dashboard.wait_for(wfid)
127
+
128
+ assert_equal 'bravo', @tracer.to_s
129
+ end
130
+
131
+ class BadParticipant
132
+ include Ruote::LocalParticipant
133
+ def on_workitem
134
+ fail '503 retry later'
135
+ end
136
+ def on_cancel
137
+ # nada
138
+ end
139
+ end
140
+
141
+ def test_enhanced_retry
142
+
143
+ @dashboard.register :toto, BadParticipant
144
+
145
+ pdef = Ruote.define do
146
+ sequence do
147
+ on_error /503/ => '1s: retry'
148
+ participant 'toto'
149
+ end
150
+ end
151
+
152
+ #@dashboard.noisy = true
153
+
154
+ wfid = @dashboard.launch(pdef)
155
+
156
+ @dashboard.wait_for('dispatch_cancel')
157
+ @dashboard.wait_for(2)
158
+
159
+ assert_equal 1, @dashboard.ps(wfid).expressions.last.h.timers.size
160
+
161
+ @dashboard.wait_for('error_intercepted')
162
+
163
+ assert_equal(
164
+ '#<RuntimeError: 503 retry later>',
165
+ @dashboard.ps(wfid).errors.first.message)
166
+ end
167
+
168
+ def test_enhanced_retry_no_pattern
169
+
170
+ @dashboard.register :toto, BadParticipant
171
+
172
+ pdef = Ruote.define do
173
+ sequence do
174
+ on_error '1s: retry'
175
+ participant 'toto'
176
+ end
177
+ end
178
+
179
+ #@dashboard.noisy = true
180
+
181
+ wfid = @dashboard.launch(pdef)
182
+
183
+ @dashboard.wait_for('dispatch_cancel')
184
+ @dashboard.wait_for(2)
185
+
186
+ assert_equal 1, @dashboard.ps(wfid).expressions.last.h.timers.size
187
+
188
+ @dashboard.wait_for('error_intercepted')
189
+
190
+ assert_equal(
191
+ '#<RuntimeError: 503 retry later>',
192
+ @dashboard.ps(wfid).errors.first.message)
193
+ end
194
+ end
195
+