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
@@ -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