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 Dec 3 22:39:03 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/part/storage_participant'
11
11
 
@@ -19,18 +19,18 @@ class FtStorageParticipantTest < Test::Unit::TestCase
19
19
  alpha
20
20
  end
21
21
 
22
- @engine.register_participant :alpha, Ruote::StorageParticipant
22
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
23
23
 
24
24
  #noisy
25
25
 
26
- wfid = @engine.launch(pdef)
26
+ wfid = @dashboard.launch(pdef)
27
27
 
28
28
  wait_for(:alpha)
29
29
 
30
- assert_equal 1, @engine.storage.get_many('workitems').size
30
+ assert_equal 1, @dashboard.storage.get_many('workitems').size
31
31
 
32
32
  alpha = Ruote::StorageParticipant.new
33
- alpha.context = @engine.context
33
+ alpha.context = @dashboard.context
34
34
 
35
35
  wi = alpha.first
36
36
 
@@ -39,11 +39,11 @@ class FtStorageParticipantTest < Test::Unit::TestCase
39
39
  wi = alpha[alpha.first.fei]
40
40
  assert_equal Ruote::Workitem, wi.class
41
41
 
42
- alpha.reply(wi)
42
+ alpha.proceed(wi)
43
43
 
44
44
  wait_for(wfid)
45
45
 
46
- assert_nil @engine.process(wfid)
46
+ assert_nil @dashboard.process(wfid)
47
47
  end
48
48
 
49
49
  def test_purge
@@ -52,18 +52,18 @@ class FtStorageParticipantTest < Test::Unit::TestCase
52
52
  alpha
53
53
  end
54
54
 
55
- @engine.register_participant :alpha, Ruote::StorageParticipant
55
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
56
56
 
57
57
  #noisy
58
58
 
59
- wfid = @engine.launch(pdef)
59
+ wfid = @dashboard.launch(pdef)
60
60
 
61
61
  wait_for(:alpha)
62
62
 
63
- assert_equal 1, @engine.storage.get_many('workitems').size
63
+ assert_equal 1, @dashboard.storage.get_many('workitems').size
64
64
 
65
65
  alpha = Ruote::StorageParticipant.new
66
- alpha.context = @engine.context
66
+ alpha.context = @dashboard.context
67
67
 
68
68
  assert !alpha.first.nil?
69
69
 
@@ -72,7 +72,33 @@ class FtStorageParticipantTest < Test::Unit::TestCase
72
72
  assert alpha.first.nil?
73
73
  end
74
74
 
75
- def test_find_by_wfid
75
+ def test_all
76
+
77
+ n = 3
78
+
79
+ pdef = Ruote.process_definition :name => 'def0' do
80
+ alpha
81
+ end
82
+
83
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
84
+
85
+ wfids = []
86
+
87
+ n.times { wfids << @dashboard.launch(pdef) }
88
+
89
+ while @dashboard.storage_participant.size < n
90
+ sleep 0.400
91
+ end
92
+
93
+ assert_equal(
94
+ [ Ruote::Workitem ] * 3,
95
+ @dashboard.storage_participant.all.collect { |wi| wi.class })
96
+
97
+ assert_equal 3, @dashboard.storage_participant.size
98
+ assert_equal 3, @dashboard.storage_participant.all(:count => true)
99
+ end
100
+
101
+ def test_by_wfid
76
102
 
77
103
  pdef = Ruote.process_definition :name => 'def0' do
78
104
  concurrence do
@@ -81,19 +107,20 @@ class FtStorageParticipantTest < Test::Unit::TestCase
81
107
  end
82
108
  end
83
109
 
84
- @engine.register_participant :alpha, Ruote::StorageParticipant
110
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
85
111
 
86
- wfid = @engine.launch(pdef)
112
+ wfid = @dashboard.launch(pdef)
87
113
 
88
114
  wait_for(:alpha)
89
115
  wait_for(:alpha)
90
116
  # wait for the two workitems
91
117
 
92
118
  alpha = Ruote::StorageParticipant.new
93
- alpha.context = @engine.context
119
+ alpha.context = @dashboard.context
94
120
 
95
121
  assert_equal 2, alpha.size
96
122
  assert_equal 2, alpha.by_wfid(wfid).size
123
+ assert_equal 2, alpha.by_wfid(wfid, :count => true)
97
124
  end
98
125
 
99
126
  CON_AL_BRAVO = Ruote.process_definition :name => 'con_al_bravo' do
@@ -113,15 +140,15 @@ class FtStorageParticipantTest < Test::Unit::TestCase
113
140
 
114
141
  def prepare_al_bravo
115
142
 
116
- @engine.register_participant :alpha, Ruote::StorageParticipant
117
- @engine.register_participant :bravo, Ruote::StorageParticipant
143
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
144
+ @dashboard.register_participant :bravo, Ruote::StorageParticipant
118
145
 
119
- @wfid = @engine.launch(CON_AL_BRAVO)
146
+ @wfid = @dashboard.launch(CON_AL_BRAVO)
120
147
 
121
148
  wait_for(:bravo)
122
149
 
123
150
  @part = Ruote::StorageParticipant.new
124
- @part.context = @engine.context
151
+ @part.context = @dashboard.context
125
152
  end
126
153
 
127
154
  def test_by_participant
@@ -133,6 +160,41 @@ class FtStorageParticipantTest < Test::Unit::TestCase
133
160
  assert_equal Ruote::Workitem, @part.by_participant('alpha').first.class
134
161
  assert_equal 1, @part.by_participant('alpha').size
135
162
  assert_equal 1, @part.by_participant('bravo').size
163
+
164
+ assert_equal 1, @part.by_participant('alpha', :count => true)
165
+ assert_equal 1, @part.by_participant('bravo', :count => true)
166
+ end
167
+
168
+ def test_by_participant_and_limit
169
+
170
+ 3.times do |i|
171
+ @dashboard.storage.put(
172
+ 'type' => 'workitems',
173
+ '_id' => "0_#{i}!ffffff!20101219-yamamba",
174
+ 'participant_name' => 'al',
175
+ 'wfid' => '20101220-yamamba',
176
+ 'fields' => {})
177
+ end
178
+ 3.times do |i|
179
+ @dashboard.storage.put(
180
+ 'type' => 'workitems',
181
+ '_id' => "1_#{i}!eeeeee!20101219-yamamba",
182
+ 'participant_name' => 'bob',
183
+ 'wfid' => '20101220-yamamba',
184
+ 'fields' => {})
185
+ end
186
+
187
+ sp = @dashboard.storage_participant
188
+
189
+ assert_equal 6, sp.size
190
+
191
+ assert_equal 0, sp.by_participant('nada', :limit => 2).size
192
+ assert_equal 2, sp.by_participant('al', :limit => 2).size
193
+ assert_equal 2, sp.by_participant('al', :skip => 0, :limit => 2).size
194
+ assert_equal 2, sp.by_participant('al', :skip => 1, :limit => 2).size
195
+
196
+ assert_equal 2, sp.by_participant('bob', :skip => 0, :limit => 2).size
197
+ assert_equal 1, sp.by_participant('bob', :skip => 2, :limit => 2).size
136
198
  end
137
199
 
138
200
  def test_by_field
@@ -144,6 +206,18 @@ class FtStorageParticipantTest < Test::Unit::TestCase
144
206
  assert_equal 2, @part.by_field('place').size
145
207
  assert_equal 2, @part.by_field('character').size
146
208
  assert_equal 1, @part.by_field('adversary').size
209
+ assert_equal 2, @part.by_field('character', :count => true)
210
+ end
211
+
212
+ def test_by_field_and_limit
213
+
214
+ prepare_al_bravo
215
+
216
+ assert_equal(
217
+ %w[ bravo ],
218
+ @part.by_field(
219
+ 'character', :skip => 1, :limit => 2
220
+ ).collect { |wi| wi.participant_name })
147
221
  end
148
222
 
149
223
  def test_by_field_and_value
@@ -154,13 +228,14 @@ class FtStorageParticipantTest < Test::Unit::TestCase
154
228
  assert_equal 0, @part.by_field('place', 'nara').size
155
229
  assert_equal 2, @part.by_field('place', 'heiankyou').size
156
230
  assert_equal 1, @part.by_field('character', 'minamoto no hirosama').size
231
+ assert_equal 2, @part.by_field('place', 'heiankyou', :count => true)
157
232
  end
158
233
 
159
234
  def test_query
160
235
 
161
236
  prepare_al_bravo
162
237
 
163
- wfid2 = @engine.launch(CON_AL_BRAVO, 'adversary' => 'B')
238
+ wfid2 = @dashboard.launch(CON_AL_BRAVO, 'adversary' => 'B')
164
239
  wait_for(:bravo)
165
240
 
166
241
  #@part.query({}).each { |wi| puts '-' * 80; p wi }
@@ -193,19 +268,69 @@ class FtStorageParticipantTest < Test::Unit::TestCase
193
268
 
194
269
  assert_equal(
195
270
  2, @part.query('place' => 'heiankyou', :participant => 'alpha').size)
271
+
272
+ assert_equal 2, @part.query(:participant => 'alpha').size
273
+ assert_equal 2, @part.query(:participant => 'alpha', :count => true)
274
+ end
275
+
276
+ # Issue reported in
277
+ # http://groups.google.com/group/openwferu-users/browse_thread/thread/d0557c58f8636c9
278
+ #
279
+ def test_query_and_limit
280
+
281
+ n = 7
282
+
283
+ n.times do |i|
284
+ @dashboard.storage.put(
285
+ 'type' => 'workitems',
286
+ '_id' => "0_#{i}!ffffff!20101219-yamamba",
287
+ 'participant_name' => 'al',
288
+ 'wfid' => '20101219-yamamba',
289
+ 'fields' => {})
290
+ end
291
+ n.times do |i|
292
+ @dashboard.storage.put(
293
+ 'type' => 'workitems',
294
+ '_id' => "1_#{i}!ffffff!20101219-yamamba",
295
+ 'participant_name' => 'bob',
296
+ 'wfid' => '20101219-yamamba',
297
+ 'fields' => {})
298
+ end
299
+
300
+ sp = @dashboard.storage_participant
301
+
302
+ assert_equal n * 2, sp.query({}).size
303
+ assert_equal n * 2, sp.query(:offset => 0, :limit => 100).size
304
+ assert_equal n * 2, sp.query(:skip => 0, :limit => 100).size
305
+
306
+ assert_equal n / 2, sp.query(:offset => 0, :limit => n / 2).size
307
+ assert_equal n / 2, sp.query(:skip => 0, :limit => n / 2).size
308
+
309
+ assert_equal(
310
+ n / 2,
311
+ sp.query(:participant_name => 'al', :offset => 0, :limit => n / 2).size)
312
+ assert_equal(
313
+ n / 2,
314
+ sp.query(:participant_name => 'al', :skip => 0, :limit => n / 2).size)
315
+
316
+ assert_equal(
317
+ [ 'al' ] * (n / 2),
318
+ sp.query(
319
+ :participant_name => 'al', :skip => 0, :limit => n / 2
320
+ ).collect { |wi| wi.participant_name })
196
321
  end
197
322
 
198
323
  def test_initialize_engine_then_opts
199
324
 
200
- @engine.register_participant :alpha, Ruote::StorageParticipant
325
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
201
326
 
202
- wfid = @engine.launch(Ruote.process_definition do
327
+ wfid = @dashboard.launch(Ruote.process_definition do
203
328
  alpha
204
329
  end)
205
330
 
206
331
  wait_for(:alpha)
207
332
 
208
- part = Ruote::StorageParticipant.new(@engine)
333
+ part = Ruote::StorageParticipant.new(@dashboard)
209
334
 
210
335
  assert_equal 1, part.size
211
336
  end
@@ -216,32 +341,32 @@ class FtStorageParticipantTest < Test::Unit::TestCase
216
341
  alpha
217
342
  end
218
343
 
219
- @engine.register_participant :alpha, Ruote::StorageParticipant
344
+ @dashboard.register_participant :alpha, Ruote::StorageParticipant
220
345
 
221
346
  #noisy
222
347
 
223
- wfid = @engine.launch(pdef)
348
+ wfid = @dashboard.launch(pdef)
224
349
 
225
350
  wait_for(:alpha)
226
351
 
227
- @engine.cancel_process(wfid)
352
+ @dashboard.cancel_process(wfid)
228
353
 
229
354
  wait_for(wfid)
230
355
 
231
- assert_nil @engine.process(wfid)
232
- assert_equal 0, Ruote::StorageParticipant.new(@engine).size
356
+ assert_nil @dashboard.process(wfid)
357
+ assert_equal 0, Ruote::StorageParticipant.new(@dashboard).size
233
358
  end
234
359
 
235
360
  def test_shared_participant
236
361
 
237
- @engine.register_participant 'step_.*', Ruote::StorageParticipant
362
+ @dashboard.register_participant 'step_.*', Ruote::StorageParticipant
238
363
 
239
- wfid = @engine.launch(
364
+ wfid = @dashboard.launch(
240
365
  Ruote.process_definition { sequence { step_one; step_two } })
241
366
 
242
367
  wait_for(:step_one)
243
368
 
244
- participant = Ruote::StorageParticipant.new(@engine)
369
+ participant = Ruote::StorageParticipant.new(@dashboard)
245
370
 
246
371
  items = participant.by_wfid(wfid)
247
372
 
@@ -249,7 +374,7 @@ class FtStorageParticipantTest < Test::Unit::TestCase
249
374
  assert_equal 1, items.size
250
375
  assert_equal 'step_one', items.first.participant_name
251
376
 
252
- participant.reply(items.first)
377
+ participant.proceed(items.first)
253
378
 
254
379
  wait_for(:step_two)
255
380
 
@@ -259,20 +384,20 @@ class FtStorageParticipantTest < Test::Unit::TestCase
259
384
  assert_equal 1, items.size
260
385
  assert_equal 'step_two', items.first.participant_name
261
386
 
262
- participant.reply(items.first)
387
+ participant.proceed(items.first)
263
388
 
264
389
  wait_for(wfid)
265
390
 
266
- assert_nil @engine.process(wfid)
391
+ assert_nil @dashboard.process(wfid)
267
392
  end
268
393
 
269
394
  def test_update_workitem
270
395
 
271
- @engine.register_participant 'alpha', Ruote::StorageParticipant
396
+ @dashboard.register_participant 'alpha', Ruote::StorageParticipant
272
397
 
273
- wfid = @engine.launch(Ruote.process_definition { alpha })
398
+ wfid = @dashboard.launch(Ruote.process_definition { alpha })
274
399
 
275
- alpha = Ruote::StorageParticipant.new(@engine)
400
+ alpha = Ruote::StorageParticipant.new(@dashboard)
276
401
 
277
402
  wait_for(:alpha)
278
403
 
@@ -287,7 +412,7 @@ class FtStorageParticipantTest < Test::Unit::TestCase
287
412
 
288
413
  def test_registration
289
414
 
290
- pa = @engine.register_participant 'alpha', Ruote::StorageParticipant
415
+ pa = @dashboard.register_participant 'alpha', Ruote::StorageParticipant
291
416
 
292
417
  assert_equal Ruote::StorageParticipant, pa.class
293
418
 
@@ -296,9 +421,9 @@ class FtStorageParticipantTest < Test::Unit::TestCase
296
421
 
297
422
  def test_various_args
298
423
 
299
- sp = @engine.register_participant 'alpha', Ruote::StorageParticipant
424
+ sp = @dashboard.register_participant 'alpha', Ruote::StorageParticipant
300
425
 
301
- wfid = @engine.launch(Ruote.process_definition { alpha })
426
+ wfid = @dashboard.launch(Ruote.process_definition { alpha })
302
427
 
303
428
  wait_for(:alpha)
304
429
 
@@ -311,16 +436,292 @@ class FtStorageParticipantTest < Test::Unit::TestCase
311
436
  assert_equal wi, sp[wi.fei.to_storage_id]
312
437
  end
313
438
 
439
+ def test_by_fei
440
+
441
+ sp = @dashboard.register_participant 'alpha', Ruote::StorageParticipant
442
+
443
+ wfid = @dashboard.launch(Ruote.process_definition { alpha })
444
+
445
+ wait_for(:alpha)
446
+
447
+ wi = sp.first
448
+
449
+ assert_equal wi, sp.by_fei(wi)
450
+ assert_equal wi, sp.by_fei(wi.fei)
451
+ assert_equal wi, sp.by_fei(wi.to_h)
452
+ assert_equal wi, sp.by_fei(wi.fei.to_h)
453
+ assert_equal wi, sp.by_fei(wi.fei.to_storage_id)
454
+ end
455
+
314
456
  def test_engine_storage_participant
315
457
 
316
- @engine.register_participant 'step_.*', Ruote::StorageParticipant
458
+ @dashboard.register_participant 'step_.*', Ruote::StorageParticipant
317
459
 
318
- wfid = @engine.launch(Ruote.process_definition { step_one })
460
+ wfid = @dashboard.launch(Ruote.process_definition { step_one })
319
461
 
320
462
  wait_for(:step_one)
321
463
 
322
- assert_equal 1, @engine.storage_participant.size
323
- assert_equal 'step_one', @engine.storage_participant.first.participant_name
464
+ assert_equal 1, @dashboard.storage_participant.size
465
+ assert_equal 'step_one', @dashboard.storage_participant.first.participant_name
466
+ end
467
+
468
+ class MyParticipant < Ruote::StorageParticipant
469
+ def on_workitem
470
+ @context.tracer << "on_workitem\n"
471
+ super
472
+ end
473
+ #def update(wi)
474
+ # @context.tracer << "update\n"
475
+ # super
476
+ #end
477
+ end
478
+
479
+ def test_override_update
480
+
481
+ pdef = Ruote.define do
482
+ alpha
483
+ end
484
+
485
+ @dashboard.register do
486
+ alpha MyParticipant
487
+ end
488
+
489
+ @dashboard.launch(pdef)
490
+ @dashboard.wait_for(:alpha)
491
+
492
+ part = @dashboard.participant(:alpha)
493
+
494
+ initial_rev = part.first.h['_rev']
495
+
496
+ part.update(part.first)
497
+
498
+ assert_not_equal initial_rev, part.first.h['_rev']
499
+ assert_equal %w[ on_workitem ], @tracer.to_a
500
+ end
501
+
502
+ def test_fetch
503
+
504
+ @dashboard.register do
505
+ catchall
506
+ end
507
+
508
+ @dashboard.launch(Ruote.define do
509
+ alpha
510
+ end)
511
+
512
+ @dashboard.wait_for(:alpha)
513
+
514
+ fei = @dashboard.storage_participant.first.fei
515
+
516
+ wi = @dashboard.storage_participant.send(:fetch, fei)
517
+
518
+ assert wi.kind_of?(Hash)
519
+ end
520
+
521
+ # StorageParticipant includes Enumerable, therefore, it should respond
522
+ # to select...
523
+ #
524
+ # http://groups.google.com/group/openwferu-users/t/6b594fd141f5d4b1
525
+ #
526
+ def test_select
527
+
528
+ @dashboard.register { catchall }
529
+
530
+ @dashboard.launch(Ruote.define do
531
+ concurrence { alpha; bravo; charly }
532
+ end)
533
+
534
+ while @dashboard.storage_participant.size < 3; end
535
+
536
+ assert_equal(
537
+ 1,
538
+ @dashboard.storage_participant.select { |wi|
539
+ wi.participant_name == 'bravo'
540
+ }.size)
541
+ end
542
+
543
+ def test_reserve
544
+
545
+ #@dashboard.noisy = true
546
+
547
+ @dashboard.register { catchall }
548
+
549
+ wfid = @dashboard.launch(Ruote.define do
550
+ alpha
551
+ end)
552
+
553
+ while @dashboard.storage_participant.size < 1; end
554
+
555
+ wi0 = @dashboard.storage_participant.first
556
+
557
+ # #reserve yields the [updated] workitem when successful
558
+
559
+ wi = @dashboard.storage_participant.first
560
+ wi = @dashboard.storage_participant.reserve(wi, 'user0')
561
+
562
+ assert_equal 'user0', wi.owner
563
+ assert_not_equal wi0.h._rev, wi.h._rev # it's not the same wi
564
+
565
+ # #reserve yields nil when failing
566
+
567
+ wi = @dashboard.storage_participant.first
568
+ wi = @dashboard.storage_participant.reserve(wi, 'user1')
569
+
570
+ assert_equal nil, wi
571
+
572
+ # #proceed raises when the owner is not the right one
573
+
574
+ assert_raise(ArgumentError) do
575
+ @dashboard.storage_participant.proceed(wi0)
576
+ end
577
+
578
+ wi = @dashboard.storage_participant.first
579
+ @dashboard.storage_participant.proceed(wi)
580
+
581
+ @dashboard.wait_for('terminated')
582
+
583
+ # #proceed raises when the workitem is gone
584
+
585
+ assert_raise(ArgumentError) do
586
+ @dashboard.storage_participant.proceed(wi)
587
+ end
588
+ end
589
+
590
+ def test_delegate
591
+
592
+ #@dashboard.noisy = true
593
+
594
+ @dashboard.register { catchall }
595
+
596
+ wfid = @dashboard.launch(Ruote.define do
597
+ alpha
598
+ end)
599
+
600
+ while @dashboard.storage_participant.size < 1; end
601
+
602
+ wi0 = @dashboard.storage_participant.first
603
+
604
+ # can't delegate when there is no owner
605
+
606
+ assert_raise(ArgumentError) do
607
+ @dashboard.storage_participant.delegate(wi0, 'user0')
608
+ end
609
+
610
+ # can't delegate if the owner is not the right one
611
+
612
+ wi1 = @dashboard.storage_participant.reserve(wi0, 'user0')
613
+ wi1.h.owner = 'user9'
614
+
615
+ assert_raise(ArgumentError) do
616
+ @dashboard.storage_participant.delegate(wi1, 'user0')
617
+ end
618
+
619
+ # it delegates alrighty
620
+
621
+ wi1.h.owner = 'user0'
622
+ wi2 = @dashboard.storage_participant.delegate(wi1, 'user1')
623
+
624
+ assert_equal 'user1', wi2.h.owner
625
+
626
+ # it's ok to delegate to nil (disowns workitem)
627
+
628
+ wi = @dashboard.storage_participant.first
629
+ x = @dashboard.storage_participant.delegate(wi, nil)
630
+
631
+ wi = @dashboard.storage_participant.first
632
+
633
+ assert_equal nil, wi.h.owner
634
+ end
635
+
636
+ def test_worklist
637
+
638
+ assert_equal Ruote::StorageParticipant, @dashboard.storage_participant.class
639
+ assert_equal Ruote::StorageParticipant, @dashboard.worklist.class
640
+ end
641
+
642
+ def test_flunk
643
+
644
+ @dashboard.register :alpha, Ruote::StorageParticipant
645
+
646
+ wfid = @dashboard.launch(Ruote.define do
647
+ alpha
648
+ end)
649
+
650
+ @dashboard.wait_for('dispatched')
651
+
652
+ assert_equal 1, @dashboard.storage_participant.size
653
+
654
+ wi = @dashboard.storage_participant.first
655
+
656
+ @dashboard.storage_participant.flunk(wi, ArgumentError, 'sorry?')
657
+
658
+ r = @dashboard.wait_for(wfid)
659
+
660
+ assert_equal 'error_intercepted', r['action']
661
+ assert_equal 'ArgumentError', r['error']['class']
662
+ assert_equal 'sorry?', r['error']['message']
663
+ assert_match __FILE__, r['error']['trace'][1]
664
+
665
+ assert_equal 0, @dashboard.storage_participant.size
666
+ end
667
+
668
+ def test_flunk_error_instance
669
+
670
+ @dashboard.register :alpha, Ruote::StorageParticipant
671
+
672
+ wfid = @dashboard.launch(Ruote.define do
673
+ alpha
674
+ end)
675
+
676
+ @dashboard.wait_for('dispatched')
677
+
678
+ assert_equal 1, @dashboard.storage_participant.size
679
+
680
+ wi = @dashboard.storage_participant.first
681
+
682
+ begin
683
+ raise 'nada'
684
+ rescue => e
685
+ @dashboard.storage_participant.flunk(wi, e)
686
+ end
687
+
688
+ r = @dashboard.wait_for(wfid)
689
+
690
+ assert_equal 'error_intercepted', r['action']
691
+ assert_equal 'RuntimeError', r['error']['class']
692
+ assert_equal 'nada', r['error']['message']
693
+ assert_match __FILE__, r['error']['trace'].first
694
+
695
+ assert_equal 0, @dashboard.storage_participant.size
696
+ end
697
+
698
+ def test_flunk_with_on_error
699
+
700
+ @dashboard.register :alpha, Ruote::StorageParticipant
701
+
702
+ wfid = @dashboard.launch(Ruote.define do
703
+ sequence :on_error => 'report_error' do
704
+ alpha
705
+ end
706
+ define 'report_error' do
707
+ echo 'error...'
708
+ end
709
+ end)
710
+
711
+ @dashboard.wait_for('dispatched')
712
+
713
+ assert_equal 1, @dashboard.storage_participant.size
714
+
715
+ wi = @dashboard.storage_participant.first
716
+
717
+ @dashboard.storage_participant.flunk(wi, ArgumentError, 'pure fail')
718
+
719
+ r = @dashboard.wait_for(wfid)
720
+
721
+ assert_equal 'terminated', r['action']
722
+ assert_equal 'error...', @tracer.to_s
723
+
724
+ assert_equal 0, @dashboard.storage_participant.size
324
725
  end
325
726
  end
326
727