ruote 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (305) hide show
  1. data/CHANGELOG.txt +166 -1
  2. data/CREDITS.txt +36 -17
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +1 -7
  5. data/Rakefile +38 -29
  6. data/TODO.txt +93 -52
  7. data/lib/ruote-fs.rb +3 -0
  8. data/lib/ruote.rb +5 -1
  9. data/lib/ruote/context.rb +140 -35
  10. data/lib/ruote/dashboard.rb +1247 -0
  11. data/lib/ruote/{engine → dboard}/process_error.rb +22 -2
  12. data/lib/ruote/dboard/process_status.rb +587 -0
  13. data/lib/ruote/engine.rb +6 -871
  14. data/lib/ruote/exp/command.rb +7 -2
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +38 -13
  17. data/lib/ruote/exp/fe_add_branches.rb +1 -1
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_await.rb +357 -0
  20. data/lib/ruote/exp/fe_cancel_process.rb +17 -3
  21. data/lib/ruote/exp/fe_command.rb +8 -4
  22. data/lib/ruote/exp/fe_concurrence.rb +218 -18
  23. data/lib/ruote/exp/fe_concurrent_iterator.rb +71 -10
  24. data/lib/ruote/exp/fe_cron.rb +3 -10
  25. data/lib/ruote/exp/fe_cursor.rb +14 -4
  26. data/lib/ruote/exp/fe_define.rb +3 -1
  27. data/lib/ruote/exp/fe_echo.rb +1 -1
  28. data/lib/ruote/exp/fe_equals.rb +1 -1
  29. data/lib/ruote/exp/fe_error.rb +1 -1
  30. data/lib/ruote/exp/fe_filter.rb +163 -4
  31. data/lib/ruote/exp/fe_forget.rb +21 -4
  32. data/lib/ruote/exp/fe_given.rb +1 -1
  33. data/lib/ruote/exp/fe_if.rb +1 -1
  34. data/lib/ruote/exp/fe_inc.rb +102 -35
  35. data/lib/ruote/exp/fe_iterator.rb +47 -12
  36. data/lib/ruote/exp/fe_listen.rb +96 -11
  37. data/lib/ruote/exp/fe_lose.rb +31 -4
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/fe_on_error.rb +109 -0
  40. data/lib/ruote/exp/fe_once.rb +10 -19
  41. data/lib/ruote/exp/fe_participant.rb +90 -28
  42. data/lib/ruote/exp/fe_read.rb +69 -0
  43. data/lib/ruote/exp/fe_redo.rb +3 -2
  44. data/lib/ruote/exp/fe_ref.rb +57 -27
  45. data/lib/ruote/exp/fe_registerp.rb +1 -3
  46. data/lib/ruote/exp/fe_reserve.rb +1 -1
  47. data/lib/ruote/exp/fe_restore.rb +6 -6
  48. data/lib/ruote/exp/fe_save.rb +12 -19
  49. data/lib/ruote/exp/fe_sequence.rb +38 -2
  50. data/lib/ruote/exp/fe_set.rb +143 -40
  51. data/lib/ruote/exp/{fe_let.rb → fe_stall.rb} +7 -38
  52. data/lib/ruote/exp/fe_subprocess.rb +8 -2
  53. data/lib/ruote/exp/fe_that.rb +1 -1
  54. data/lib/ruote/exp/fe_undo.rb +40 -4
  55. data/lib/ruote/exp/fe_unregisterp.rb +1 -3
  56. data/lib/ruote/exp/fe_wait.rb +12 -25
  57. data/lib/ruote/exp/{flowexpression.rb → flow_expression.rb} +375 -229
  58. data/lib/ruote/exp/iterator.rb +2 -2
  59. data/lib/ruote/exp/merge.rb +78 -17
  60. data/lib/ruote/exp/ro_attributes.rb +46 -36
  61. data/lib/ruote/exp/ro_filters.rb +34 -8
  62. data/lib/ruote/exp/ro_on_x.rb +431 -0
  63. data/lib/ruote/exp/ro_persist.rb +19 -7
  64. data/lib/ruote/exp/ro_timers.rb +123 -0
  65. data/lib/ruote/exp/ro_variables.rb +90 -29
  66. data/lib/ruote/fei.rb +57 -3
  67. data/lib/ruote/fs.rb +3 -0
  68. data/lib/ruote/id/mnemo_wfid_generator.rb +30 -7
  69. data/lib/ruote/id/wfid_generator.rb +17 -38
  70. data/lib/ruote/log/default_history.rb +23 -9
  71. data/lib/ruote/log/fancy_printing.rb +265 -0
  72. data/lib/ruote/log/storage_history.rb +23 -13
  73. data/lib/ruote/log/wait_logger.rb +224 -17
  74. data/lib/ruote/observer.rb +82 -0
  75. data/lib/ruote/part/block_participant.rb +65 -28
  76. data/lib/ruote/part/code_participant.rb +81 -0
  77. data/lib/ruote/part/engine_participant.rb +7 -2
  78. data/lib/ruote/part/local_participant.rb +221 -21
  79. data/lib/ruote/part/no_op_participant.rb +1 -1
  80. data/lib/ruote/part/null_participant.rb +1 -1
  81. data/lib/ruote/part/participant.rb +50 -0
  82. data/lib/ruote/part/rev_participant.rb +178 -0
  83. data/lib/ruote/part/smtp_participant.rb +2 -2
  84. data/lib/ruote/part/storage_participant.rb +228 -60
  85. data/lib/ruote/part/template.rb +1 -1
  86. data/lib/ruote/participant.rb +2 -0
  87. data/lib/ruote/reader.rb +205 -68
  88. data/lib/ruote/reader/json.rb +49 -0
  89. data/lib/ruote/reader/radial.rb +303 -0
  90. data/lib/ruote/reader/ruby_dsl.rb +44 -9
  91. data/lib/ruote/reader/xml.rb +11 -8
  92. data/lib/ruote/receiver/base.rb +98 -45
  93. data/lib/ruote/storage/base.rb +104 -35
  94. data/lib/ruote/storage/composite_storage.rb +50 -60
  95. data/lib/ruote/storage/fs_storage.rb +25 -34
  96. data/lib/ruote/storage/hash_storage.rb +38 -36
  97. data/lib/ruote/svc/dispatch_pool.rb +104 -35
  98. data/lib/ruote/svc/dollar_sub.rb +10 -8
  99. data/lib/ruote/svc/error_handler.rb +108 -52
  100. data/lib/ruote/svc/expression_map.rb +3 -3
  101. data/lib/ruote/svc/participant_list.rb +160 -55
  102. data/lib/ruote/svc/tracker.rb +31 -31
  103. data/lib/ruote/svc/treechecker.rb +28 -16
  104. data/lib/ruote/tree_dot.rb +1 -1
  105. data/lib/ruote/util/deep.rb +143 -0
  106. data/lib/ruote/util/filter.rb +125 -18
  107. data/lib/ruote/util/hashdot.rb +15 -13
  108. data/lib/ruote/util/look.rb +1 -1
  109. data/lib/ruote/util/lookup.rb +60 -22
  110. data/lib/ruote/util/misc.rb +63 -18
  111. data/lib/ruote/util/mpatch.rb +53 -0
  112. data/lib/ruote/util/ometa.rb +1 -2
  113. data/lib/ruote/util/process_observer.rb +177 -0
  114. data/lib/ruote/util/subprocess.rb +1 -1
  115. data/lib/ruote/util/time.rb +2 -2
  116. data/lib/ruote/util/tree.rb +64 -2
  117. data/lib/ruote/version.rb +3 -2
  118. data/lib/ruote/worker.rb +421 -92
  119. data/lib/ruote/workitem.rb +157 -22
  120. data/ruote.gemspec +15 -9
  121. data/test/bm/ci.rb +0 -2
  122. data/test/bm/ici.rb +0 -2
  123. data/test/bm/load_26c.rb +0 -3
  124. data/test/bm/mega.rb +0 -2
  125. data/test/functional/base.rb +57 -43
  126. data/test/functional/concurrent_base.rb +16 -13
  127. data/test/functional/ct_0_concurrence.rb +7 -11
  128. data/test/functional/ct_1_iterator.rb +9 -11
  129. data/test/functional/ct_2_cancel.rb +28 -17
  130. data/test/functional/eft_0_flow_expression.rb +35 -0
  131. data/test/functional/eft_10_cancel_process.rb +1 -1
  132. data/test/functional/eft_11_wait.rb +13 -13
  133. data/test/functional/eft_12_listen.rb +199 -66
  134. data/test/functional/eft_13_iterator.rb +95 -29
  135. data/test/functional/eft_14_cursor.rb +74 -24
  136. data/test/functional/eft_15_loop.rb +7 -7
  137. data/test/functional/eft_16_if.rb +1 -1
  138. data/test/functional/eft_17_equals.rb +1 -1
  139. data/test/functional/eft_18_concurrent_iterator.rb +156 -68
  140. data/test/functional/eft_19_reserve.rb +15 -15
  141. data/test/functional/eft_1_echo.rb +1 -1
  142. data/test/functional/eft_20_save.rb +51 -9
  143. data/test/functional/eft_21_restore.rb +1 -1
  144. data/test/functional/eft_22_noop.rb +1 -1
  145. data/test/functional/eft_23_apply.rb +1 -1
  146. data/test/functional/eft_24_add_branches.rb +7 -8
  147. data/test/functional/eft_25_command.rb +1 -1
  148. data/test/functional/eft_26_error.rb +11 -11
  149. data/test/functional/eft_27_inc.rb +111 -67
  150. data/test/functional/eft_28_once.rb +16 -16
  151. data/test/functional/eft_29_cron.rb +9 -9
  152. data/test/functional/eft_2_sequence.rb +23 -4
  153. data/test/functional/eft_30_ref.rb +36 -24
  154. data/test/functional/eft_31_registerp.rb +24 -24
  155. data/test/functional/eft_32_lose.rb +46 -20
  156. data/test/functional/eft_34_given.rb +1 -1
  157. data/test/functional/eft_35_filter.rb +161 -7
  158. data/test/functional/eft_36_read.rb +97 -0
  159. data/test/functional/{eft_0_process_definition.rb → eft_37_process_definition.rb} +4 -4
  160. data/test/functional/eft_38_on_error.rb +195 -0
  161. data/test/functional/eft_39_stall.rb +35 -0
  162. data/test/functional/eft_3_participant.rb +77 -22
  163. data/test/functional/eft_40_await.rb +297 -0
  164. data/test/functional/eft_4_set.rb +110 -11
  165. data/test/functional/eft_5_subprocess.rb +27 -5
  166. data/test/functional/eft_6_concurrence.rb +299 -60
  167. data/test/functional/eft_7_forget.rb +24 -22
  168. data/test/functional/eft_8_undo.rb +52 -15
  169. data/test/functional/eft_9_redo.rb +18 -20
  170. data/test/functional/ft_0_worker.rb +122 -13
  171. data/test/functional/ft_10_dollar.rb +77 -16
  172. data/test/functional/ft_11_recursion.rb +9 -9
  173. data/test/functional/ft_12_launchitem.rb +7 -9
  174. data/test/functional/ft_13_variables.rb +125 -22
  175. data/test/functional/ft_14_re_apply.rb +112 -56
  176. data/test/functional/ft_15_timeout.rb +64 -33
  177. data/test/functional/ft_16_participant_params.rb +59 -6
  178. data/test/functional/ft_17_conditional.rb +68 -2
  179. data/test/functional/ft_18_kill.rb +48 -30
  180. data/test/functional/ft_19_participant_code.rb +67 -0
  181. data/test/functional/ft_1_process_status.rb +222 -150
  182. data/test/functional/ft_20_storage_participant.rb +445 -44
  183. data/test/functional/ft_21_forget.rb +21 -26
  184. data/test/functional/ft_22_process_definitions.rb +8 -6
  185. data/test/functional/ft_23_load_defs.rb +29 -5
  186. data/test/functional/ft_24_block_participant.rb +199 -20
  187. data/test/functional/ft_25_receiver.rb +98 -46
  188. data/test/functional/ft_26_participant_rtimeout.rb +34 -26
  189. data/test/functional/ft_27_var_indirection.rb +40 -5
  190. data/test/functional/ft_28_null_noop_participants.rb +5 -5
  191. data/test/functional/ft_29_part_template.rb +2 -2
  192. data/test/functional/ft_2_errors.rb +106 -74
  193. data/test/functional/ft_30_smtp_participant.rb +7 -7
  194. data/test/functional/ft_31_part_blocking.rb +11 -11
  195. data/test/functional/ft_32_scope.rb +50 -0
  196. data/test/functional/ft_33_participant_subprocess_priority.rb +3 -3
  197. data/test/functional/ft_34_cursor_rewind.rb +14 -14
  198. data/test/functional/ft_35_add_service.rb +67 -9
  199. data/test/functional/ft_36_storage_history.rb +92 -24
  200. data/test/functional/ft_37_default_history.rb +35 -23
  201. data/test/functional/ft_38_participant_more.rb +189 -32
  202. data/test/functional/ft_39_wait_for.rb +25 -25
  203. data/test/functional/ft_3_participant_registration.rb +235 -107
  204. data/test/functional/ft_40_wait_logger.rb +105 -18
  205. data/test/functional/ft_41_participants.rb +13 -12
  206. data/test/functional/ft_42_storage_copy.rb +12 -12
  207. data/test/functional/ft_43_participant_on_reply.rb +85 -11
  208. data/test/functional/ft_44_var_participant.rb +5 -5
  209. data/test/functional/ft_45_participant_accept.rb +3 -3
  210. data/test/functional/ft_46_launch_single.rb +17 -17
  211. data/test/functional/ft_47_wfids.rb +41 -0
  212. data/test/functional/ft_48_lose.rb +19 -25
  213. data/test/functional/ft_49_engine_on_error.rb +54 -70
  214. data/test/functional/ft_4_cancel.rb +84 -26
  215. data/test/functional/ft_50_engine_config.rb +4 -4
  216. data/test/functional/ft_51_misc.rb +12 -12
  217. data/test/functional/ft_52_case.rb +17 -17
  218. data/test/functional/ft_53_engine_on_terminate.rb +18 -21
  219. data/test/functional/ft_54_patterns.rb +18 -16
  220. data/test/functional/ft_55_engine_participant.rb +55 -55
  221. data/test/functional/ft_56_filter_attribute.rb +90 -52
  222. data/test/functional/ft_57_rev_participant.rb +252 -0
  223. data/test/functional/ft_58_workitem.rb +150 -0
  224. data/test/functional/ft_59_pause.rb +329 -0
  225. data/test/functional/ft_5_on_error.rb +430 -77
  226. data/test/functional/ft_60_code_participant.rb +65 -0
  227. data/test/functional/ft_61_trailing_fields.rb +34 -0
  228. data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
  229. data/test/functional/ft_63_participants_221.rb +458 -0
  230. data/test/functional/ft_64_stash.rb +41 -0
  231. data/test/functional/ft_65_timers.rb +313 -0
  232. data/test/functional/ft_66_flank.rb +133 -0
  233. data/test/functional/ft_67_radial_misc.rb +34 -0
  234. data/test/functional/ft_68_reput.rb +72 -0
  235. data/test/functional/ft_69_worker_info.rb +56 -0
  236. data/test/functional/ft_6_on_cancel.rb +189 -36
  237. data/test/functional/ft_70_take_and_discard_attributes.rb +94 -0
  238. data/test/functional/ft_71_retries.rb +144 -0
  239. data/test/functional/ft_72_on_terminate.rb +60 -0
  240. data/test/functional/ft_73_raise_msg.rb +107 -0
  241. data/test/functional/ft_74_respark.rb +106 -0
  242. data/test/functional/ft_75_context.rb +66 -0
  243. data/test/functional/ft_76_observer.rb +53 -0
  244. data/test/functional/ft_77_process_observer.rb +157 -0
  245. data/test/functional/ft_78_part_participant.rb +37 -0
  246. data/test/functional/ft_7_tags.rb +238 -50
  247. data/test/functional/ft_8_participant_consumption.rb +27 -21
  248. data/test/functional/ft_9_subprocesses.rb +48 -18
  249. data/test/functional/restart_base.rb +4 -6
  250. data/test/functional/rt_0_wait.rb +10 -10
  251. data/test/functional/rt_1_listen.rb +6 -6
  252. data/test/functional/rt_2_errors.rb +12 -12
  253. data/test/functional/rt_3_once.rb +17 -12
  254. data/test/functional/rt_4_cron.rb +17 -17
  255. data/test/functional/rt_5_timeout.rb +13 -13
  256. data/test/functional/signals.rb +103 -0
  257. data/test/functional/storage.rb +730 -0
  258. data/test/functional/storage_helper.rb +48 -35
  259. data/test/functional/test.rb +6 -2
  260. data/test/misc/idle.rb +21 -0
  261. data/test/misc/light.rb +29 -0
  262. data/test/path_helper.rb +1 -1
  263. data/test/test.rb +2 -5
  264. data/test/test_helper.rb +13 -0
  265. data/test/unit/test.rb +1 -4
  266. data/test/unit/ut_0_ruby_reader.rb +25 -9
  267. data/test/unit/ut_10_participants.rb +47 -0
  268. data/test/unit/ut_11_lookup.rb +59 -2
  269. data/test/unit/ut_12_wait_logger.rb +123 -0
  270. data/test/unit/ut_14_is_uri.rb +1 -1
  271. data/test/unit/ut_15_util.rb +1 -1
  272. data/test/unit/ut_16_reader.rb +136 -14
  273. data/test/unit/ut_17_merge.rb +155 -0
  274. data/test/unit/ut_19_part_template.rb +1 -1
  275. data/test/unit/ut_1_fei.rb +11 -2
  276. data/test/unit/ut_20_composite_storage.rb +27 -1
  277. data/test/unit/{ut_21_participant_list.rb → ut_21_svc_participant_list.rb} +2 -3
  278. data/test/unit/ut_22_filter.rb +231 -10
  279. data/test/unit/ut_23_svc_tracker.rb +48 -0
  280. data/test/unit/ut_24_radial_reader.rb +458 -0
  281. data/test/unit/ut_25_process_status.rb +143 -0
  282. data/test/unit/ut_26_deep.rb +131 -0
  283. data/test/unit/ut_2_dashboard.rb +114 -0
  284. data/test/unit/ut_3_worker.rb +54 -0
  285. data/test/unit/ut_4_expmap.rb +1 -1
  286. data/test/unit/ut_5_tree.rb +23 -23
  287. data/test/unit/ut_6_condition.rb +71 -29
  288. data/test/unit/ut_7_workitem.rb +18 -4
  289. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  290. data/test/unit/ut_9_xml_reader.rb +1 -1
  291. metadata +142 -63
  292. data/jruby_issue.txt +0 -32
  293. data/lib/ruote/engine/process_status.rb +0 -403
  294. data/lib/ruote/log/pretty.rb +0 -165
  295. data/lib/ruote/log/test_logger.rb +0 -204
  296. data/lib/ruote/util/serializer.rb +0 -103
  297. data/phil.txt +0 -14
  298. data/test/functional/eft_33_let.rb +0 -31
  299. data/test/functional/ft_19_alias.rb +0 -33
  300. data/test/functional/ft_47_wfid_generator.rb +0 -54
  301. data/test/unit/storage.rb +0 -403
  302. data/test/unit/storages.rb +0 -37
  303. data/test/unit/ut_13_serializer.rb +0 -65
  304. data/test/unit/ut_18_engine.rb +0 -47
  305. data/test/unit/ut_3_wait_logger.rb +0 -39
@@ -2,7 +2,172 @@
2
2
  = ruote - CHANGELOG.txt
3
3
 
4
4
 
5
- == ruote - 2.2.0 not yet released
5
+ == ruote - 2.3.0 released 2012/09/04
6
+
7
+ - Dashboard#wait_for('action' => 'apply', 'name' => 'wait')
8
+ - past_tags: track variables
9
+ - Workitem#launched_at and #sub_wf_launched_at
10
+ - Ruote.deep_delete and .deep_mutate
11
+ - Ruote::Observer (a base classing for observing a ruote engine's activity)
12
+ - thread['ruote_worker']
13
+ - Dashboard#respark(wfid, opts={})
14
+ - StorageBase#dump: go with YAML
15
+ - on_error: !immediate
16
+ - "kill" expression (undo/cancel alias)
17
+ - ${tags}, ${tag} and ${full_tag}
18
+ - StorageParticipant#flunk(workitem, err, *err_args)
19
+ - ReceiverMixin#flunk(workitem, err, *err_args)
20
+ - workitem: sub_wf_name and sub_wf_revision
21
+ - new 'raise' msg for passing back errors to worker
22
+ - participant#on_apply
23
+ - push/pop specialized aliases for inc/dec
24
+ - inc/dec: 'v:x' => 2 shortcut
25
+ - inc/dec: drop default 'v:d' and accept nested {in|de}crement
26
+ - 'participant_in_variable_enabled' switch
27
+ - make re_apply use the applied workitem by default
28
+ - ${mnemo_id} (along with ${expid} and ${subid})
29
+ - Dashboard#remove_process (idea Claudio Petasecca Donati)
30
+ - re_dispatch bug fix (patch by Doug Bryant)
31
+ - Ruote.extract_wfid(o)
32
+ - on_error/on_timeout: cancel/cando
33
+ - Worker#handle_step_error(e, msg) enhancements
34
+ - cancel "flavour" rebound
35
+ - Dashboard#logger shortcut
36
+ - :on_error => 'raise'
37
+ - :over_if bug fix (reported by Alex Wang)
38
+ - :merge_type => 'deep' (idea Jim MarsBomber Li)
39
+ - Dashboard#launch accepts :wfid "field", custom wfid
40
+ - kill_process expression (and on_error)
41
+ - the "second take" (__on_error__, __on_cancel__)
42
+ - Ruote.tree(&block) alias to Ruote.to_tree(&block)
43
+ - added 'tree' entry to error doc and error msg
44
+ - error handler $f:__error__: added 'tree' entry
45
+ - Ruote::Reader.to_expid_radial
46
+ - wfid_generator: dropping the @last['raw'] concept
47
+ - wait_for(:x, :or_error) (thanks John Roberts)
48
+ - concurrence over_if bug (thanks alexw668)
49
+ - concurrence and citerator :remaining => 'wait' (idea Pedro Visintin)
50
+ - set 'v:x' => 'y', :over[ride] => true/'sub'
51
+ - concurrence and citerator :count => -x (all but x)
52
+ - "await" expression, successor to "listen"
53
+ - root expression: __past_tags__ variable
54
+ - full tags
55
+ - concurrence and citerator: :count => 0 (immediate reply)
56
+ - iterator and concurrent-iterator: implicit sequence
57
+ - iterator: stopped creating new variable scope
58
+ - :vars_to_f common attribute
59
+ - :scope => true forces a new variable scope
60
+ - subprocess 'field:x' => 'y' (variables and now fields)
61
+ - Dashboard#worklist (alias for Dashboard#storage_participant)
62
+ - set: now accepting children (and behaving like a sequence)
63
+ - [un]set: setting __result__
64
+ - concurrence :wait_for => 'alpha, bravo' (idea Raphael Simon)
65
+ - BlockParticipant: nicer multi blocks
66
+ - Dashboard #cancel and #kill now accept options
67
+ - StorageParticipant #reserve and #delegate
68
+ - 'terminated/ceased' msg: include root exp variables
69
+ - Dashboard#worker_state[=] (running/paused/stopped)
70
+ - define :on_terminate => :regenerate
71
+ - :on_error => '5m: retry * 3, 10m: retry'
72
+ - :on_error => '5m: retry, 2m: retry, pass'
73
+ - dsub for attribute keys as well
74
+ - conf option: 'worker_info_enabled' (defaults to true, enabled)
75
+ - Dashboard#register saves list in one batch (unless :clear => true)
76
+ - DefaultHistory include Enumerable
77
+ - Dashboard#wait_for(action_name) (dispatch, cancel, reply, ...)
78
+ - merged TestLogger into WaitLogger
79
+ - :take and :discard common attributes
80
+ - filter: 'take' and 'discard'
81
+ - Participant: on_cancel -> false prevents on_cancel reply
82
+ - LocalParticipant #is_gone? #is_cancel[l]ed?
83
+ - Dashboard#worker_info
84
+ - msg: put_doc, low-level action
85
+ - participant: #rtimers, #rtimeout and #timers
86
+ - lose and forget expressions: aligned 'multi' behaviour
87
+ - concurrence and citerator: :merge_type => 'ignore'
88
+ - :timers error, redo/retry, undo/pass and commands
89
+ - :timers common attribute
90
+ - :flank common attribute
91
+ - Storage#done(worker, msg) optional method
92
+ - get_many :batch option (used by some storages for optimization)
93
+ - 'stall' expression (mostly for testing)
94
+ - context and worker : subscription reworked
95
+ - worker: 'restless_worker' option
96
+ - Ruote::Dashboard (will slowly phase Ruote::Engine out)
97
+ - :on_timeout => 'rewind', :on_timeout => 'jump to alpha'
98
+ - :on_error => 'rewind', :on_error => 'jump to alpha'
99
+ - dispatch_pool and context['participant_threads_enabled']
100
+ - participant params.__children__
101
+ - on_error expression
102
+ - concurrence :merge_type => 'concat' (vs 'union') (Thanks Julien France)
103
+ - Workitem#re_dispatch_count
104
+ - Engine#launch(pdef, fields, vars, root_stash)
105
+ - Workitem #[] amd #[]= (#lookup and #set_field shortcuts)
106
+ - LocalParticipant#lookup_variable(key)
107
+ - LocalParticipant / Receiver : stash_get / stash_put
108
+ - LocalParticipant implicit participant_name
109
+ - LocalParticipant implicit workitem, fei, flavour and fexp
110
+ - Participant #on_workitem, #dont_thread?, etc
111
+ - FlowExpression #root and #root_id
112
+ - dollar substitution in expression name as well
113
+ - Engine#replay_at_error(err_or_fei_or_wi)
114
+ - Engine#error(wi_or_fei)
115
+ - storages: #replace_engine_configuration(opts)
116
+ - FsStorage: saving newer configuration (Thanks Nicholas Faiz)
117
+ - ProcessStatus context: linking expression <-> error
118
+ - ProcessStatus#root_workitem
119
+ - ProcessStatus#leaves
120
+ - filter 'includes' and 'is' (Thanks Nando Sola)
121
+ - trailing fields (a Simone Carletti idea)
122
+ - concurrence vs history issue fixed (Thanks Juris Galang)
123
+ - unset and fields: made sure the field is removed (Thanks jpgilman)
124
+ - sourcify, using to_raw_source from now on
125
+ - filter expression and blocks
126
+ - set 'v:display' => 'echo', aliasing of expressions
127
+ - Reader.read(s): better error raised when failed to 'parse'
128
+ - :on_field => 'my.nested.field' now possible
129
+ - [concurrent-]iterator :to => 'v:x' / 'f:y' / 'y'
130
+ - concurrence :merge_type => 'union'
131
+ - Reader.to_radial(tree)
132
+ - Workitem#param_or_field(key) and #field_or_param(key)
133
+ - Workitem#param_text
134
+ - ProcessError#deviations (cf filter and Ruote::ValidationError)
135
+ - reworked (process definition) Reader
136
+ - filter top-level 'or'
137
+ - filter field => 'x|y' (or on field names)
138
+ - 'radial' process definitions
139
+ - fixed Tracker#add_tracker (2nd try) issue (Thanks Pedro Texeira)
140
+ - Engine#register :on_workitem / :on_reply / ...
141
+ - set 'v:participant' => lambda { |wi| wi.fields['x'] = 'y' }
142
+ - listen :to => :errors, :class => string / :message/:msg => string / regex
143
+ - listen :to => :errors
144
+ - dropped require 'json' and co from fs_storage (Thanks Torsten)
145
+ - cursor : 'reset' command and :reset_if attribute
146
+ - Engine#resume(wfid, :anyway => true) resumes any paused expression in a
147
+ given process
148
+ - Engine#pause(fei, :breakpoint => true) pauses only one expression (and not
149
+ its children)
150
+ - CompositeStorage#delete_schedule fix (Thanks Greg)
151
+ - read 'http://'|'file', :to => 'f:a' / :to => 'v:b'
152
+ - save :to => 'f:a' / :to => 'v:b'
153
+ - pause(fei/wfid), resume(fei/wfid)
154
+ - participant list, multiple participants with same regex now ok, allowing
155
+ for cascading participants (at consume and at on_error)
156
+ - register block : fixed issue with lonely pname and block
157
+ - register_participant : after/before/over
158
+ - register block : now clearing by default
159
+ - fixed issue with deep set and unset (Thanks Nando Sola)
160
+ - improved conditional evaluation for dollar notation
161
+ - register block : catchall and catch_all
162
+ - Workitem #wf_name and #wf_revision
163
+ - StorageParticipant :skip and :limit issues (Thanks Jan Topiński)
164
+ - StorageParticipant #proceed deprecates #reply
165
+ - fix for :if => '${a}' when a like '456ab' (Thanks John Le)
166
+ - StorageParticipant :count => true uniformization (Thanks Jan Topiński)
167
+ - StorageParticipant#by_fei (alias for #[])
168
+
169
+
170
+ == ruote - 2.2.0 released 2011/03/01
6
171
 
7
172
  - Engine#participant(name) returns an instance of any participant
8
173
  - :filter => 'participant_name' (consume(wi) / filter(fields))
@@ -1,21 +1,30 @@
1
1
 
2
- CREDITS
3
- =======
2
+ = CREDITS
4
3
 
5
- Ruote is an open source Ruby workflow engine.
4
+ (Ruote is an open source Ruby workflow engine)
6
5
 
7
6
 
8
- The main project team
9
- ---------------------
7
+ == The main project team
10
8
 
11
9
  John Mettraux - http://jmettraux.wordpress.com
12
10
  Torsten Schoenebaum - http://github.com/tosch
13
11
  Kenneth Kalmer - http://www.opensourcery.co.za
14
12
 
15
13
 
16
- Contributors
17
- ------------
18
-
14
+ == Contributors
15
+
16
+ Gvozden Neskovic - https://github.com/ladenBrain
17
+ Hartog C. de Mik - https://github.com/coffeeaddict
18
+ Doug Bryant - re_dispatch bug and 'dispatched' << 'workitem'
19
+ Sjors - https://github.com/xtr3me - missing "concat" tactic for concurrence
20
+ Islam Amer - https://github.com/iamer
21
+ Nathan Stults - https://github.com/PlasticLizard - lots of help
22
+ Akeem Adeniji - https://github.com/akeem - add_type and composite storage
23
+ Bjoern Boettcher - https://github.com/doITdistributed - example fixing
24
+ Julien France - https://github.com/xaop - concat/union merge types enhancements
25
+ Simone Carletti - documentation, bug hunting and various ideas
26
+ Raphael Simon - error handling + filters design
27
+ Nando Sola - lots of help
19
28
  Neil Pennell - http://github.com/npennel
20
29
  Patrick Gannon - fix for compatibility with ruote-mongodb
21
30
  Fix Peña - 'jump to' bug patch
@@ -31,7 +40,6 @@ Nicholas Faiz - http://github.com/biv
31
40
  Chris Beer - http://github.com/cbeer
32
41
  Enrico Bianco - http://github.com/enricob
33
42
  Andrew Timberlake - timeout 'at'
34
- Raphael Simon - error handling mechanism design and QA
35
43
  Maarten Oelering - bug reports and test cases
36
44
  Nick Petrella - socket listener issues and Python interactivity, dollar patch
37
45
  Sakaguchi Masa - japanese website and articles in Japanese magazines
@@ -44,10 +52,23 @@ Frederic Piccand
44
52
  Richard Jennings
45
53
 
46
54
 
47
- Feedback
48
- --------
49
-
50
- Nando Sola - many help
55
+ == Feedback
56
+
57
+ tsdeng - https://github.com/tsdeng
58
+ Klaus Schmidtmamn - sub_wf_name inspiration
59
+ chaofan - https://github.com/chaofoan
60
+ Nagender Reddy Paduru - various design discussions
61
+ Chris Conley - https://github.com/chrisconley
62
+ Jim "MarsBomber" Li - :merge_type => 'deep'
63
+ John Roberts - idea for wait_for(:x, :or_error)
64
+ Alex - https://github.com/alexw668
65
+ Pedro Visintin - :remaining => 'wait'
66
+ Christophe Malaurie - quickstart fix
67
+ Juris Galang - https://github.com/jurisgalang (concurrence vs history issue)
68
+ John 'jpgilman' - timed_out and name of the participant
69
+ Pedro Texeira - add_tracker issue
70
+ Greg Lazarev - composite storage issues
71
+ Jan Topiński - https://github.com/simcha
51
72
  Iuri Gagnidze - ProcessStatus#definition_name issues, Engine#leftovers
52
73
  John Le - https://github.com/sandbox
53
74
  Sean Johnson - https://github.com/belucid
@@ -59,7 +80,6 @@ Claudio Petasecca Donati - many help
59
80
  Daniel Neighman "hassox" - :on_timeout => "error" and many issue reports
60
81
  Eric Platon - engine.launch_single idea
61
82
  Marc Lee - storage.clear consistency
62
- Nathan Stults - enhanced dollar substitution and service
63
83
  Don H. French - Engine#register_from_dir idea
64
84
  Kaspar Schiess - http://github.com/kschiess
65
85
  Oleg (foenixx) - many suggestions and bug reports
@@ -91,8 +111,7 @@ Jon "Compensator" - first report of the "yamlextras" issue
91
111
  (see the mailing list at : http://groups.google.com/group/openwferu-users )
92
112
 
93
113
 
94
- Last but not least
95
- ------------------
114
+ = Last but not least
96
115
 
97
- Many thanks to the authors, the contributors and the community of the Ruby language, the various json gems, the builder, mailtrap, sourcify, parsetree gems, and many more.
116
+ Many thanks to the authors, the contributors and the community of the Ruby language, the various json gems, the builder, mailtrap, sourcify, parsetree, parslet gems, and many more.
98
117
 
@@ -1,5 +1,5 @@
1
1
 
2
- Copyright (c) 2001-2011, John Mettraux, jmettraux@gmail.com
2
+ Copyright (c) 2001-2012, John Mettraux, jmettraux@gmail.com
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
@@ -17,12 +17,6 @@ grab ruote
17
17
  gem install ruote
18
18
  gem install yajl-ruby
19
19
 
20
- Note : the json gem has a serious bug :
21
-
22
- http://github.com/flori/json/issues#issue/21
23
-
24
- So yajl-ruby is seriously recommended.
25
-
26
20
  Then
27
21
 
28
22
  require 'rubygems'
@@ -66,7 +60,7 @@ Then
66
60
 
67
61
  == test suite
68
62
 
69
- see http://github.com/jmettraux/ruote/tree/ruote2.1/test
63
+ see http://github.com/jmettraux/ruote/tree/master/test
70
64
 
71
65
 
72
66
  == license
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'rubygems/user_interaction' if Gem::RubyGemsVersion == '1.5.0'
6
6
 
7
7
  require 'rake'
8
8
  require 'rake/clean'
9
- require 'rake/rdoctask'
9
+ #require 'rdoc/task'
10
10
 
11
11
 
12
12
  #
@@ -54,36 +54,37 @@ task :push => :build do
54
54
  end
55
55
 
56
56
 
57
+ ##
58
+ ## rdoc
59
+ ##
60
+ ## make sure to have rdoc 2.5.x to run that
57
61
  #
58
- # rdoc
62
+ #Rake::RDocTask.new do |rd|
59
63
  #
60
- # make sure to have rdoc 2.5.x to run that
61
-
62
- Rake::RDocTask.new do |rd|
63
-
64
- rd.main = 'README.rdoc'
65
- rd.rdoc_dir = 'rdoc'
66
-
67
- rd.rdoc_files.include(
68
- 'README.rdoc', 'CHANGELOG.txt', 'CREDITS.txt', 'lib/**/*.rb')
69
-
70
- rd.title = "#{GEMSPEC.name} #{GEMSPEC.version}"
71
- end
72
-
73
-
64
+ # rd.main = 'README.rdoc'
65
+ # rd.rdoc_dir = 'rdoc'
74
66
  #
75
- # upload_rdoc
76
-
77
- desc %{
78
- upload the rdoc to rubyforge
79
- }
80
- task :upload_rdoc => [ :clean, :rdoc ] do
81
-
82
- account = 'jmettraux@rubyforge.org'
83
- webdir = '/var/www/gforge-projects/ruote'
84
-
85
- sh "rsync -azv -e ssh rdoc #{account}:#{webdir}/"
86
- end
67
+ # rd.rdoc_files.include(
68
+ # 'README.rdoc', 'CHANGELOG.txt', 'CREDITS.txt', 'lib/**/*.rb')
69
+ #
70
+ # rd.title = "#{GEMSPEC.name} #{GEMSPEC.version}"
71
+ #end
72
+ #
73
+ ##
74
+ ## upload_rdoc
75
+ #
76
+ #desc %{
77
+ # upload the rdoc to rubyforge
78
+ #}
79
+ #task :upload_rdoc => [ :clean, :rdoc ] do
80
+ #
81
+ # account = 'jmettraux@rubyforge.org'
82
+ # webdir = '/var/www/gforge-projects/ruote'
83
+ #
84
+ # sh "rsync -azv -e ssh rdoc #{account}:#{webdir}/"
85
+ #end
86
+ #
87
+ # leverage rdoc.info instead
87
88
 
88
89
 
89
90
  desc %{
@@ -93,7 +94,15 @@ task :doublons do
93
94
 
94
95
  lines = `grep -r " def test_" test/ | sort`.split("\n")
95
96
  lines.inject(nil) do |previous, line|
96
- p line if line == previous
97
+ puts line if line == previous
98
+ line
99
+ end
100
+
101
+ lines = `grep -r "TestCase" test/`.split("\n")
102
+ lines = lines.collect { |line| [ line, line.split(/\.rb:/).last ] }
103
+ lines = lines.sort_by { |line, klass| klass }
104
+ lines.inject(nil) do |previous, (line, klass)|
105
+ puts klass if line == previous
97
106
  line
98
107
  end
99
108
  end
data/TODO.txt CHANGED
@@ -3,7 +3,6 @@
3
3
  [o] logger service
4
4
  [o] test logger
5
5
  [o] object full_dup
6
- [o] engine#remove_service
7
6
  [o] :receive or :receive_back for when workitems come back from participant
8
7
  [o] emit :processes :launch :wfid
9
8
  [o] emit :processes :terminate :wfid only
@@ -139,7 +138,7 @@
139
138
  [o] reserve : perhaps it's better to have an atomic get and set variable...
140
139
  [o] clean up lookup_var/set_var into locate_var/lookup_var/set_var
141
140
  [x] Sun Hao's up-to-date-tree idea ${f:participant_name} ps#resolved_tree
142
- [o] error : when an error expression is cancelled, should the err get remove
141
+ [o] error : when an error expression is cancelled, should the err get removed
143
142
  from the process status ? yes.
144
143
  [o] file logger / history service
145
144
  [o] engine.process_history(wfid)
@@ -287,35 +286,57 @@
287
286
  [o] DefaultHistory : add a method to list all wfids (for by_wfid)
288
287
  [x] issue with ruote-kit and inpa participants...
289
288
  [x] .nil? .empty? .set? for "${x}.nil?"
290
-
291
- [ ] exp : exp (restricted form of eval ?) (is it apply ?)
289
+ [o] BlockParticipant : proc.to_source thanks to sourcify
290
+ [o] register :overwrite { ... } ? (wipes all the participants)
291
+ [o] pause engine
292
+ [o] pause process instance
293
+ [o] filter : blank? equivalent (maybe it already exists)
294
+ [o] eft_18 weak with jruby-1.5.1 and 1.5.6
295
+ [o] participant : consume/cancel/accept?/on_reply without params
296
+ [o] participant : consume -> on_workitem
297
+ [o] remove abort_on_exception=true
298
+ [o] concurrence / concurrent_iterator : merge_type => 'discard' / 'ignore'
299
+ keep track of the first "process sub id" ?
300
+ [o] register :toto, :accept? => lambda { |workitem| ... }
301
+ [o] register :toto, :do_not_thread => lambda { |workitem| ... }
302
+ [o] :on_timeout => :rewind (break, jump to x)...
303
+ [o] :on_error => :rewind (break, jump to x)...
304
+ [o] worker identification/registration
305
+ http://groups.google.com/group/openwferu-users/browse_thread/thread/c51b94fb8bb685da
306
+ [o] worker shutdown initiated by engine (same thread)
307
+ [o] set :var => 'y' { '2342342' }
308
+ [o] wfid generator UTC?
309
+ [o] iterator: drop the need for the sequence --> implicit sequence
310
+ [o] citerator: drop the need for the sequence --> implicit sequence
311
+ [o] move test/unit/storage[s].rb to test/functional/
312
+ [x] exp : defined (not really necessary)
313
+ [x] exp : quote (not really necessary)
314
+ [x] exp : field / attribute (not really necessary)
315
+ [x] exp : variable (not really necessary)
316
+ [o] expression :concurrent => true idea (reply immediately, cancellable)
317
+ `- covered by :flank => true
318
+ [o] concurrence: allow empty
319
+ [o] citerator: allow empty
320
+
321
+ [ ] exp : at expression ? comparable to cron
322
+ [x] exp : exp (restricted form of eval ?) (is it apply ?)
292
323
  [x] exp : filter
293
324
  [x] exp : filter-definition
294
325
  [x] exp : parameter
295
326
  [ ] exp : log : or could it be a participant ?
296
-
297
- [ ] exp : defined (not really necessary)
298
- [ ] exp : quote (not really necessary)
299
- [ ] exp : field / attribute (not really necessary)
300
- [ ] exp : variable (not really necessary)
327
+ [x] wait_for(:participant) what about 'dispatched' instead of 'dispatch' ?
301
328
 
302
329
  [ ] define without name (__result__)
303
330
 
304
331
  [ ] participant dispatch thread throttling ?
305
332
 
306
333
  [ ] tailcall
334
+ - is it really necessary? The storage is the limit.
335
+
307
336
  [ ] subprocesses participants (alias ?)
308
337
 
309
338
  [ ] recursion : should cope with modified trees 'main' => :tree ??
310
339
 
311
- [ ] set :var => 'y' { '2342342' }
312
-
313
- [ ] pause engine
314
- [ ] pause process instance
315
- |
316
- would it mean something like placing a paused list in the storage
317
- and fetching it all the time ?
318
-
319
340
  [ ] file/fs_listener [example] ?
320
341
 
321
342
  [ ] concurrence / concurrent_iterator : merge plugin ?
@@ -324,23 +345,18 @@
324
345
  [ ] restore : implement merge strategies
325
346
 
326
347
  [ ] one file, no multi-process, persistence ? LateHashStorage ?
348
+ [ ] one file per process ?
327
349
 
328
350
  [ ] apply : ruby or xml (instead of just ast) ?
329
351
 
330
- [ ] unify ruote/util/json and ruote/util/serializer
331
-
332
352
  [ ] history.to_tree ?
333
353
 
334
354
  [ ] Ruote.process_definition ... Ruote.method_missing or sequence ?
335
355
 
336
- [ ] concurrence / concurrent_iterator : merge_type => 'discard' / 'ignore'
337
- keep track of the first "process sub id" ?
338
-
339
356
  [ ] @children diff/undiff idea ?
340
357
 
341
- [ ] :on_timeout => :rewind (break, jump to x)...
342
- [ ] :on_error => :rewind (break, jump to x)...
343
-
358
+ [o] cursor : 'reset' command ?
359
+ [ ] cursor : 'restart' alias for 'reset' ?
344
360
  [ ] repeat : have a counter in a variable (:to => x maybe) (subprocessid ?)
345
361
 
346
362
  [ ] engine.cancel_forgotten_children(wfid) ?
@@ -350,13 +366,11 @@
350
366
  [ ] double-check on_cancel rewrite (ft_1_process_status)
351
367
 
352
368
  [ ] verify get_last/get_raw logic, no + 0.0001...
353
- [ ] spare 1 get_msg by caching msg (but keep 'deleting')
369
+ [x] spare 1 get_msg by caching msg (but keep 'deleting')
354
370
  [ ] [un]set_var : via message ? should be ok like that... Not much traffic there
355
371
 
356
372
  [ ] empty iterator or concurrent-iterator, log ? crash ? empty while...
357
373
 
358
- [ ] remove abort_on_exception=true
359
-
360
374
  [ ] shell ? irb ? Shell.new(storage)
361
375
  [ ] focus on fulldup or json.dup (via fulldup ?)
362
376
 
@@ -372,8 +386,6 @@
372
386
 
373
387
  [ ] LocalParticipant def consume; handle; reply; end
374
388
 
375
- [ ] find better solution than "get all schedules"
376
-
377
389
  [ ] worker : minuteman, make it cron triggerable
378
390
  trap SIGUSR1 or USR2
379
391
  maybe it's expensive to fire a [worker] process each minute
@@ -387,7 +399,7 @@
387
399
  [ ] re_apply_stalled
388
400
  http://groups.google.com/group/openwferu-users/browse_thread/thread/ff29f26d6b5fd135
389
401
 
390
- [ ] engine.purge (arts style : worker.@msgs = [])
402
+ [ ] engine.purge (arts style: worker.@msgs = [])
391
403
 
392
404
  [ ] http://ruote.rubyforge.org/irclogs/ruote_2010-07-07.txt
393
405
  configuration issue
@@ -406,8 +418,6 @@
406
418
 
407
419
  [x] cursor : previous_command field ? not really necessary with :break_if => x
408
420
 
409
- [ ] register :overwrite { ... } ? (wipes all the participants)
410
-
411
421
  [ ] storage_participant.by_participant([ a, b, c, d ], opts)
412
422
  storage_participant.by_participant(a, b, c, d, opts) too
413
423
  leverage things like
@@ -421,24 +431,21 @@
421
431
  [ ] engine.force_reply_to_parent(fei) ?
422
432
  but, this is a cancel_expression(fei)
423
433
 
424
- [ ] at expression ? :names :wait, :at
425
-
426
434
  [ ] concurrence : add_child ?
427
435
  How would that impact concurrent_iterator's add_branches ?
428
436
  [ ] detach / attach segments of processes
429
- [ ] clone process ? (could be used by {de|at}tach)
437
+ [x] clone process ? (could be used by {de|at}tach)
438
+ what about participants ?
430
439
 
431
440
  [ ] console for InformatiQ / console or dashboard or tool ?
432
441
  [ ] pooltool.ru : there are already storage copy methods
433
442
 
434
- [ ] BlockParticipant : proc.to_source thanks to sourcify
435
-
436
443
  [o] doc : enhance doc on conditional (and, empty, null, ...)
437
444
  [o] doc : document engine.on_{error|terminate}
438
445
  [o] doc : document on_error = retry and on_error = pass
439
446
  [ ] doc : add piece of doc about running workers on their own
440
447
 
441
- [ ] listen to errors {in|out}
448
+ [o] listen to errors {in|out}
442
449
  well... there is already on_error...
443
450
  but on_error is for nested stuff...
444
451
  [o] listen to tags {entering|leaving}
@@ -450,30 +457,64 @@
450
457
  it's :where and it's not documented :-( but it's tested :-)
451
458
  [o] engine#on_terminate, similar to on_error
452
459
  [o] let engine#on_error use svc/tracker.rb instead of 'notifications'
460
+ [ ] process supervise other process, listen...
461
+ launch a process with a designed 'supervisor' ?
462
+ listen to termination, listen to error, for a given process ?
463
+ [ ] events for put_schedule/delete_schedule/trigger_schedule
464
+
465
+ [ ] use 'raise' instead of error_handler.action_handle
466
+ (ruote-amqp, ruote-beanstalk)
453
467
 
454
468
  [ ] ruote cheatsheet
455
469
  [ ] ruote slides
456
470
 
457
- [ ] process supervise other process, listen...
458
- launch a process with a designed 'supervisor' ?
459
-
460
471
  [x] ci : ruote-amqp
461
- [ ] ci : ruote-mongodb
472
+ [o] ci : ruote-mon
462
473
  [ ] ci : jruby
463
474
 
464
- [ ] StorageParticipant#reply : raise if workitem not found ?
465
- [ ] StorageParticipant#reply : accept fei ?
475
+ [ ] ruote-doozer?
476
+
477
+ [ ] StorageParticipant#proceed : raise if workitem not found ?
478
+ [ ] StorageParticipant#proceed : accept fei ?
466
479
  [ ] Engine#reply(wi), should remove from storage...
467
480
 
468
- [ ] eft_18 weak with jruby-1.5.1 and 1.5.6
481
+ [o] @engine.context['participant_in_variable_enabled'] = true
482
+ [ ] @engine.register(x, :trusted => true, &block)
483
+ [ ] security service ? context['x'] but then, more advanced behaviours
484
+ [ ] subaltern
469
485
 
470
- [ ] participant : consume/cancel/accept?/on_reply without params
486
+ [x] investigate 1.9's json
487
+ [ ] Parslet for conditions?
488
+ [ ] subaltern for conditions?
489
+ [ ] enhance radial/Parslet error messages (cf Raphael)
471
490
 
472
- [ ] worker identification/registration
473
- http://groups.google.com/group/openwferu-users/browse_thread/thread/c51b94fb8bb685da
474
- [ ] worker shutdown initiated by engine (same thread)
491
+ [ ] concurrence: reply_to_parent instead of cease when no more children ?
492
+ https://github.com/jmettraux/ruote/blob/1f9add961f90049ea951b8940622fbe8d136c45f/lib/ruote/exp/fe_concurrence.rb#L304-310
493
+
494
+ [ ] cursor: deeper jumps
495
+ http://groups.google.com/group/openwferu-users/browse_thread/thread/a973f0ea5fbb1a96
496
+
497
+ [ ] on_cancel like on_error expression
498
+ [ ] on_timeout like on_error expression (or make timeout an error)
499
+
500
+ [ ] #get_msgs to cover #get_schedules (make #get_schedules empty)
501
+ | | |
502
+ [ ] find better solution than "get all schedules"
503
+ ... or discard get_schedules completely
504
+
505
+ [ ] eft_6_concurrence : 2 Fs when running standalone...
506
+
507
+ [ ] get rid of the "web" test[s]
508
+
509
+ [.] remove #dump from all storage implementations
510
+
511
+ [ ] engine#remove_service
475
512
 
476
- [ ] wait_for(:participant) what about 'dispatched' instead of 'dispatch' ?
513
+ == 3.0
514
+ [ ] deprecate get_schedules
515
+ (let the storage include triggered schedules as msgs)
516
+ [ ] deprecate "trackers as variables"
477
517
 
478
- [ ] expression :concurrent => true idea (reply immediately, cancellable)
518
+ == 4.0
519
+ [ ] deprecate listen (await?) or make it an alias of await?
479
520