ruote 0.9.20 → 2.1.1

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 (397) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG.txt +8 -0
  3. data/CREDITS.txt +65 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.rdoc +76 -0
  6. data/Rakefile +68 -0
  7. data/TODO.txt +287 -0
  8. data/examples/flickr_report.rb +108 -0
  9. data/examples/ruote_quickstart.rb +42 -0
  10. data/examples/web_first_page.rb +57 -0
  11. data/lib/ruote.rb +6 -0
  12. data/lib/ruote/context.rb +136 -0
  13. data/lib/ruote/engine.rb +339 -0
  14. data/lib/{openwfe/expressions/merge.rb → ruote/engine/process_error.rb} +35 -24
  15. data/lib/ruote/engine/process_status.rb +236 -0
  16. data/lib/ruote/evt/tracker.rb +110 -0
  17. data/lib/ruote/exp/command.rb +88 -0
  18. data/lib/ruote/exp/commanded.rb +69 -0
  19. data/lib/ruote/exp/condition.rb +120 -0
  20. data/lib/ruote/exp/expression_map.rb +103 -0
  21. data/lib/ruote/exp/fe_add_branches.rb +138 -0
  22. data/lib/ruote/exp/fe_apply.rb +85 -0
  23. data/lib/ruote/exp/fe_cancel_process.rb +74 -0
  24. data/lib/ruote/exp/fe_command.rb +163 -0
  25. data/lib/ruote/exp/fe_concurrence.rb +273 -0
  26. data/lib/ruote/exp/fe_concurrent_iterator.rb +204 -0
  27. data/lib/ruote/exp/fe_cron.rb +141 -0
  28. data/lib/ruote/exp/fe_cursor.rb +270 -0
  29. data/lib/ruote/exp/fe_define.rb +112 -0
  30. data/lib/{openwfe/engine/fs_engine.rb → ruote/exp/fe_echo.rb} +24 -18
  31. data/lib/ruote/exp/fe_equals.rb +115 -0
  32. data/lib/ruote/exp/fe_error.rb +90 -0
  33. data/lib/ruote/exp/fe_forget.rb +81 -0
  34. data/lib/ruote/exp/fe_if.rb +124 -0
  35. data/lib/ruote/exp/fe_inc.rb +205 -0
  36. data/lib/ruote/exp/fe_iterator.rb +193 -0
  37. data/lib/ruote/exp/fe_listen.rb +197 -0
  38. data/lib/{openwfe/engine.rb → ruote/exp/fe_noop.rb} +20 -3
  39. data/lib/ruote/exp/fe_participant.rb +202 -0
  40. data/lib/ruote/exp/fe_redo.rb +83 -0
  41. data/lib/ruote/exp/fe_reserve.rb +126 -0
  42. data/lib/ruote/exp/fe_restore.rb +102 -0
  43. data/lib/ruote/exp/fe_save.rb +79 -0
  44. data/lib/ruote/exp/fe_sequence.rb +60 -0
  45. data/lib/ruote/exp/fe_set.rb +160 -0
  46. data/lib/ruote/exp/fe_subprocess.rb +203 -0
  47. data/lib/{openwfe/expool/errors.rb → ruote/exp/fe_undo.rb} +28 -30
  48. data/lib/ruote/exp/fe_wait.rb +92 -0
  49. data/lib/ruote/exp/fe_when.rb +214 -0
  50. data/lib/ruote/exp/flowexpression.rb +624 -0
  51. data/lib/{openwfe/omixins.rb → ruote/exp/iterator.rb} +41 -23
  52. data/lib/ruote/exp/merge.rb +66 -0
  53. data/lib/{openwfe/util/ometa.rb → ruote/exp/raw.rb} +16 -16
  54. data/lib/ruote/exp/ro_attributes.rb +203 -0
  55. data/lib/ruote/exp/ro_persist.rb +139 -0
  56. data/lib/ruote/exp/ro_variables.rb +192 -0
  57. data/lib/ruote/fei.rb +131 -0
  58. data/lib/{openwfe/version.rb → ruote/id/mnemo_wfid_generator.rb} +17 -3
  59. data/lib/{openwfe/extras/engine/dm_engine.rb → ruote/id/wfid_generator.rb} +34 -22
  60. data/lib/ruote/log/fs_history.rb +181 -0
  61. data/lib/ruote/log/test_logger.rb +254 -0
  62. data/lib/ruote/log/wait_logger.rb +67 -0
  63. data/lib/ruote/parser.rb +205 -0
  64. data/lib/ruote/parser/ruby_dsl.rb +85 -0
  65. data/lib/ruote/parser/xml.rb +92 -0
  66. data/lib/ruote/part/block_participant.rb +101 -0
  67. data/lib/ruote/part/dispatch_pool.rb +84 -0
  68. data/lib/ruote/part/hash_participant.rb +91 -0
  69. data/lib/ruote/part/local_participant.rb +52 -0
  70. data/lib/{openwfe/engine/tc_engine.rb → ruote/part/no_op_participant.rb} +19 -14
  71. data/lib/{openwfe/engine/tt_engine.rb → ruote/part/null_participant.rb} +17 -18
  72. data/lib/ruote/part/participant_list.rb +201 -0
  73. data/lib/ruote/part/smtp_participant.rb +135 -0
  74. data/lib/ruote/part/storage_participant.rb +140 -0
  75. data/lib/{openwfe/util/irb.rb → ruote/part/template.rb} +23 -31
  76. data/lib/ruote/participant.rb +6 -0
  77. data/lib/ruote/receiver/base.rb +73 -0
  78. data/lib/ruote/storage/base.rb +210 -0
  79. data/lib/ruote/storage/fs_storage.rb +89 -0
  80. data/lib/ruote/storage/hash_storage.rb +171 -0
  81. data/lib/ruote/tree_dot.rb +85 -0
  82. data/lib/{openwfe → ruote}/util/dollar.rb +47 -63
  83. data/lib/{openwfe/extras/singlecon.rb → ruote/util/hashdot.rb} +40 -19
  84. data/lib/ruote/util/look.rb +129 -0
  85. data/lib/ruote/util/lookup.rb +92 -0
  86. data/lib/ruote/util/misc.rb +119 -0
  87. data/lib/ruote/util/ometa.rb +55 -0
  88. data/lib/ruote/util/serializer.rb +103 -0
  89. data/lib/ruote/util/time.rb +90 -0
  90. data/lib/ruote/util/tree.rb +58 -0
  91. data/lib/{openwfe → ruote}/util/treechecker.rb +10 -16
  92. data/lib/ruote/worker.rb +375 -0
  93. data/lib/ruote/workitem.rb +176 -0
  94. data/phil.txt +14 -0
  95. data/ruote.gemspec +278 -0
  96. data/test/README.rdoc +15 -0
  97. data/test/bm/ci.rb +55 -0
  98. data/test/bm/ici.rb +71 -0
  99. data/test/bm/juuman.rb +54 -0
  100. data/test/bm/load_26c.rb +25 -7
  101. data/test/bm/mega.rb +64 -0
  102. data/test/bm/seq_thousand.rb +31 -0
  103. data/test/bm/t.rb +35 -0
  104. data/test/functional/base.rb +88 -99
  105. data/test/functional/concurrent_base.rb +91 -0
  106. data/test/functional/crunner.rb +26 -0
  107. data/test/functional/ct_0_concurrence.rb +68 -0
  108. data/test/functional/ct_1_iterator.rb +61 -0
  109. data/test/functional/ct_2_cancel.rb +69 -0
  110. data/test/functional/eft_0_process_definition.rb +46 -15
  111. data/test/functional/eft_10_cancel_process.rb +46 -0
  112. data/test/functional/eft_11_wait.rb +97 -0
  113. data/test/functional/eft_12_listen.rb +271 -0
  114. data/test/functional/eft_13_iterator.rb +267 -0
  115. data/test/functional/eft_14_cursor.rb +278 -0
  116. data/test/functional/eft_15_loop.rb +67 -0
  117. data/test/functional/eft_16_if.rb +171 -0
  118. data/test/functional/eft_17_equals.rb +55 -0
  119. data/test/functional/eft_18_concurrent_iterator.rb +361 -0
  120. data/test/functional/eft_19_reserve.rb +136 -0
  121. data/test/functional/eft_1_echo.rb +59 -0
  122. data/test/functional/eft_20_save.rb +76 -0
  123. data/test/functional/eft_21_restore.rb +61 -0
  124. data/test/functional/eft_22_noop.rb +28 -0
  125. data/test/functional/eft_23_apply.rb +145 -0
  126. data/test/functional/eft_24_add_branches.rb +86 -0
  127. data/test/functional/eft_25_command.rb +28 -0
  128. data/test/functional/eft_26_error.rb +77 -0
  129. data/test/functional/eft_27_inc.rb +279 -0
  130. data/test/functional/eft_28_when.rb +109 -0
  131. data/test/functional/eft_29_cron.rb +64 -0
  132. data/test/functional/eft_2_sequence.rb +38 -27
  133. data/test/functional/eft_3_participant.rb +122 -0
  134. data/test/functional/eft_4_set.rb +230 -0
  135. data/test/functional/eft_5_subprocess.rb +164 -0
  136. data/test/functional/eft_6_concurrence.rb +279 -0
  137. data/test/functional/eft_7_forget.rb +61 -0
  138. data/test/functional/eft_8_undo.rb +78 -0
  139. data/test/functional/eft_9_redo.rb +46 -0
  140. data/test/functional/ft_0_worker.rb +46 -0
  141. data/test/functional/ft_10_dollar.rb +90 -0
  142. data/test/functional/ft_11_recursion.rb +111 -0
  143. data/test/functional/ft_12_launchitem.rb +37 -0
  144. data/test/functional/ft_13_variables.rb +131 -0
  145. data/test/functional/ft_14_re_apply.rb +133 -0
  146. data/test/functional/ft_15_timeout.rb +205 -0
  147. data/test/functional/ft_16_participant_params.rb +47 -0
  148. data/test/functional/ft_17_conditional.rb +76 -0
  149. data/test/functional/ft_18_kill.rb +85 -0
  150. data/test/functional/ft_19_alias.rb +33 -0
  151. data/test/functional/ft_1_process_status.rb +410 -20
  152. data/test/functional/ft_20_storage_participant.rb +46 -0
  153. data/test/functional/ft_21_forget.rb +42 -0
  154. data/test/functional/ft_22_process_definitions.rb +80 -0
  155. data/test/functional/ft_23_load_defs.rb +55 -0
  156. data/test/functional/ft_24_block_participants.rb +59 -0
  157. data/test/functional/ft_25_receiver.rb +87 -0
  158. data/test/functional/ft_26_participant_timeout.rb +49 -0
  159. data/test/functional/ft_27_var_indirection.rb +93 -0
  160. data/test/functional/ft_28_null_noop_participants.rb +51 -0
  161. data/test/functional/ft_29_part_template.rb +78 -0
  162. data/test/functional/ft_2_errors.rb +320 -0
  163. data/test/functional/ft_30_smtp_participant.rb +69 -0
  164. data/test/functional/ft_31_part_blocking.rb +70 -0
  165. data/test/functional/ft_32_history.rb +184 -0
  166. data/test/functional/ft_33_participant_subprocess_priority.rb +32 -0
  167. data/test/functional/ft_34_cursor_rewind.rb +98 -0
  168. data/test/functional/ft_35_add_service.rb +48 -0
  169. data/test/functional/ft_3_participant_registration.rb +107 -0
  170. data/test/functional/ft_4_cancel.rb +72 -0
  171. data/test/functional/ft_5_on_error.rb +155 -0
  172. data/test/functional/ft_6_on_cancel.rb +165 -0
  173. data/test/functional/ft_7_tags.rb +88 -0
  174. data/test/functional/ft_8_participant_consumption.rb +75 -0
  175. data/test/functional/ft_9_subprocesses.rb +145 -0
  176. data/test/functional/restart_base.rb +17 -26
  177. data/test/functional/rt_0_wait.rb +55 -0
  178. data/test/functional/rt_1_listen.rb +56 -0
  179. data/test/functional/rt_2_errors.rb +56 -0
  180. data/test/functional/rt_3_when.rb +70 -0
  181. data/test/functional/rt_4_cron.rb +63 -0
  182. data/test/functional/rt_5_timeout.rb +60 -0
  183. data/test/functional/rtest.rb +8 -0
  184. data/test/functional/storage_helper.rb +79 -0
  185. data/test/functional/test.rb +23 -11
  186. data/test/mpc_test.rb +29 -0
  187. data/test/path_helper.rb +4 -2
  188. data/test/pdef.xml +7 -0
  189. data/test/test_helper.rb +2 -30
  190. data/test/unit/storages.rb +13 -0
  191. data/test/unit/test.rb +2 -11
  192. data/test/unit/ut_0_ruby_parser.rb +120 -0
  193. data/test/unit/ut_11_lookup.rb +51 -0
  194. data/test/unit/ut_13_serializer.rb +65 -0
  195. data/test/unit/ut_14_is_uri.rb +28 -0
  196. data/test/unit/ut_15_util.rb +34 -0
  197. data/test/unit/ut_16_parser.rb +100 -0
  198. data/test/unit/ut_17_storage.rb +122 -0
  199. data/test/unit/ut_1_fei.rb +20 -0
  200. data/test/unit/ut_2_wfidgen.rb +21 -0
  201. data/test/unit/ut_3_wait_logger.rb +41 -0
  202. data/test/unit/ut_4_expmap.rb +20 -0
  203. data/test/unit/ut_5_tree.rb +54 -0
  204. data/test/unit/ut_6_condition.rb +138 -0
  205. data/test/unit/ut_7_workitem.rb +21 -0
  206. data/test/unit/ut_8_tree_to_dot.rb +72 -0
  207. data/test/unit/ut_9_xml_parser.rb +61 -0
  208. metadata +246 -253
  209. data/README.txt +0 -36
  210. data/bin/validate-workflow.rb +0 -89
  211. data/examples/about_state.rb +0 -81
  212. data/examples/bigflow.rb +0 -19
  213. data/examples/csv_weather.rb +0 -23
  214. data/examples/engine_template.rb +0 -222
  215. data/examples/flowtracing.rb +0 -24
  216. data/examples/homeworkreview.rb +0 -68
  217. data/examples/kotoba.rb +0 -22
  218. data/examples/mano_tracker.rb +0 -172
  219. data/examples/openwferu.rb +0 -60
  220. data/examples/quickstart.rb +0 -87
  221. data/examples/quotereporter.rb +0 -150
  222. data/examples/simple.rb +0 -56
  223. data/lib/openwfe.rb +0 -27
  224. data/lib/openwfe/contextual.rb +0 -120
  225. data/lib/openwfe/def.rb +0 -37
  226. data/lib/openwfe/engine/engine.rb +0 -455
  227. data/lib/openwfe/engine/expool_methods.rb +0 -113
  228. data/lib/openwfe/engine/file_persisted_engine.rb +0 -84
  229. data/lib/openwfe/engine/launch_methods.rb +0 -245
  230. data/lib/openwfe/engine/listener_methods.rb +0 -128
  231. data/lib/openwfe/engine/lookup_methods.rb +0 -156
  232. data/lib/openwfe/engine/participant_methods.rb +0 -141
  233. data/lib/openwfe/engine/status_methods.rb +0 -382
  234. data/lib/openwfe/engine/update_exp_methods.rb +0 -119
  235. data/lib/openwfe/expool/def_parser.rb +0 -196
  236. data/lib/openwfe/expool/errorjournal.rb +0 -294
  237. data/lib/openwfe/expool/expool_pause_methods.rb +0 -87
  238. data/lib/openwfe/expool/expressionpool.rb +0 -941
  239. data/lib/openwfe/expool/expstorage.rb +0 -370
  240. data/lib/openwfe/expool/fs_expstorage.rb +0 -302
  241. data/lib/openwfe/expool/history.rb +0 -278
  242. data/lib/openwfe/expool/journal.rb +0 -210
  243. data/lib/openwfe/expool/journal_replay.rb +0 -305
  244. data/lib/openwfe/expool/representation.rb +0 -105
  245. data/lib/openwfe/expool/tc_expstorage.rb +0 -239
  246. data/lib/openwfe/expool/threaded_expstorage.rb +0 -163
  247. data/lib/openwfe/expool/tt_expstorage.rb +0 -55
  248. data/lib/openwfe/expool/wfidgen.rb +0 -370
  249. data/lib/openwfe/expool/yaml_errorjournal.rb +0 -187
  250. data/lib/openwfe/expressions/condition.rb +0 -226
  251. data/lib/openwfe/expressions/environment.rb +0 -232
  252. data/lib/openwfe/expressions/expression_map.rb +0 -248
  253. data/lib/openwfe/expressions/expression_tree.rb +0 -265
  254. data/lib/openwfe/expressions/fe_cancel.rb +0 -89
  255. data/lib/openwfe/expressions/fe_command.rb +0 -237
  256. data/lib/openwfe/expressions/fe_concurrence.rb +0 -599
  257. data/lib/openwfe/expressions/fe_cron.rb +0 -197
  258. data/lib/openwfe/expressions/fe_cursor.rb +0 -200
  259. data/lib/openwfe/expressions/fe_define.rb +0 -146
  260. data/lib/openwfe/expressions/fe_do.rb +0 -181
  261. data/lib/openwfe/expressions/fe_equals.rb +0 -273
  262. data/lib/openwfe/expressions/fe_error.rb +0 -103
  263. data/lib/openwfe/expressions/fe_filter.rb +0 -112
  264. data/lib/openwfe/expressions/fe_filter_definition.rb +0 -151
  265. data/lib/openwfe/expressions/fe_fqv.rb +0 -231
  266. data/lib/openwfe/expressions/fe_http.rb +0 -198
  267. data/lib/openwfe/expressions/fe_if.rb +0 -287
  268. data/lib/openwfe/expressions/fe_iterator.rb +0 -128
  269. data/lib/openwfe/expressions/fe_listen.rb +0 -327
  270. data/lib/openwfe/expressions/fe_losfor.rb +0 -102
  271. data/lib/openwfe/expressions/fe_misc.rb +0 -374
  272. data/lib/openwfe/expressions/fe_participant.rb +0 -231
  273. data/lib/openwfe/expressions/fe_reserve.rb +0 -192
  274. data/lib/openwfe/expressions/fe_save.rb +0 -255
  275. data/lib/openwfe/expressions/fe_sequence.rb +0 -102
  276. data/lib/openwfe/expressions/fe_set.rb +0 -121
  277. data/lib/openwfe/expressions/fe_step.rb +0 -146
  278. data/lib/openwfe/expressions/fe_subprocess.rb +0 -150
  279. data/lib/openwfe/expressions/fe_timeout.rb +0 -107
  280. data/lib/openwfe/expressions/fe_wait.rb +0 -183
  281. data/lib/openwfe/expressions/fe_when.rb +0 -118
  282. data/lib/openwfe/expressions/filter.rb +0 -85
  283. data/lib/openwfe/expressions/flowexpression.rb +0 -872
  284. data/lib/openwfe/expressions/iterator.rb +0 -206
  285. data/lib/openwfe/expressions/raw.rb +0 -330
  286. data/lib/openwfe/expressions/rprocdef.rb +0 -373
  287. data/lib/openwfe/expressions/time.rb +0 -314
  288. data/lib/openwfe/expressions/timeout.rb +0 -184
  289. data/lib/openwfe/expressions/value.rb +0 -100
  290. data/lib/openwfe/extras/engine/ar_engine.rb +0 -58
  291. data/lib/openwfe/extras/engine/db_persisted_engine.rb +0 -74
  292. data/lib/openwfe/extras/expool/ar_expstorage.rb +0 -337
  293. data/lib/openwfe/extras/expool/db_errorjournal.rb +0 -165
  294. data/lib/openwfe/extras/expool/db_expstorage.rb +0 -73
  295. data/lib/openwfe/extras/expool/db_history.rb +0 -163
  296. data/lib/openwfe/extras/expool/dm_expstorage.rb +0 -327
  297. data/lib/openwfe/extras/listeners/jabber_listeners.rb +0 -102
  298. data/lib/openwfe/extras/listeners/jabberlisteners.rb +0 -26
  299. data/lib/openwfe/extras/listeners/sqs_listeners.rb +0 -128
  300. data/lib/openwfe/extras/misc/activityfeed.rb +0 -249
  301. data/lib/openwfe/extras/misc/basecamp.rb +0 -485
  302. data/lib/openwfe/extras/misc/jabber_common.rb +0 -122
  303. data/lib/openwfe/extras/participants/active_participants.rb +0 -724
  304. data/lib/openwfe/extras/participants/active_resource_participants.rb +0 -213
  305. data/lib/openwfe/extras/participants/activeparticipants.rb +0 -3
  306. data/lib/openwfe/extras/participants/ar_participants.rb +0 -285
  307. data/lib/openwfe/extras/participants/atomfeed_participants.rb +0 -158
  308. data/lib/openwfe/extras/participants/atompub_participants.rb +0 -252
  309. data/lib/openwfe/extras/participants/basecamp_participants.rb +0 -73
  310. data/lib/openwfe/extras/participants/decision_participants.rb +0 -113
  311. data/lib/openwfe/extras/participants/jabber_participants.rb +0 -147
  312. data/lib/openwfe/extras/participants/jabberparticipants.rb +0 -3
  313. data/lib/openwfe/extras/participants/sqs_participants.rb +0 -108
  314. data/lib/openwfe/extras/participants/twitter_participants.rb +0 -162
  315. data/lib/openwfe/filterdef.rb +0 -277
  316. data/lib/openwfe/flowexpressionid.rb +0 -396
  317. data/lib/openwfe/listeners/listener.rb +0 -86
  318. data/lib/openwfe/listeners/listeners.rb +0 -135
  319. data/lib/openwfe/logging.rb +0 -108
  320. data/lib/openwfe/participants.rb +0 -5
  321. data/lib/openwfe/participants/mail_participants.rb +0 -216
  322. data/lib/openwfe/participants/participant.rb +0 -142
  323. data/lib/openwfe/participants/participant_map.rb +0 -245
  324. data/lib/openwfe/participants/participants.rb +0 -381
  325. data/lib/openwfe/participants/soap_participants.rb +0 -121
  326. data/lib/openwfe/participants/store_participants.rb +0 -249
  327. data/lib/openwfe/participants/yaml_filestorage.rb +0 -216
  328. data/lib/openwfe/representations.rb +0 -770
  329. data/lib/openwfe/rexml.rb +0 -44
  330. data/lib/openwfe/rudefinitions.rb +0 -114
  331. data/lib/openwfe/service.rb +0 -92
  332. data/lib/openwfe/tools/flowtracer.rb +0 -63
  333. data/lib/openwfe/util/json.rb +0 -55
  334. data/lib/openwfe/util/observable.rb +0 -119
  335. data/lib/openwfe/util/workqueue.rb +0 -125
  336. data/lib/openwfe/util/xml.rb +0 -270
  337. data/lib/openwfe/utils.rb +0 -484
  338. data/lib/openwfe/workitem.rb +0 -541
  339. data/lib/openwfe/worklist/storelocks.rb +0 -277
  340. data/lib/openwfe/worklist/storeparticipant.rb +0 -6
  341. data/lib/openwfe/worklist/worklist.rb +0 -283
  342. data/lib/pooltool.ru +0 -311
  343. data/test/ar_test_connection.rb +0 -63
  344. data/test/bm/fatxml.rb +0 -70
  345. data/test/dm_test_connection.rb +0 -11
  346. data/test/extras/base.rb +0 -3
  347. data/test/extras/et_0_sqs.rb +0 -37
  348. data/test/extras/et_jabber_test.rb +0 -226
  349. data/test/extras/test.rb +0 -16
  350. data/test/functional/db_ft_0_ar_participants.rb +0 -136
  351. data/test/functional/eft_10_unset.rb +0 -60
  352. data/test/functional/eft_11_sleep.rb +0 -95
  353. data/test/functional/eft_12_wait.rb +0 -57
  354. data/test/functional/eft_13_cursor.rb +0 -139
  355. data/test/functional/eft_14_loop.rb +0 -36
  356. data/test/functional/eft_15_undo.rb +0 -77
  357. data/test/functional/eft_16_redo.rb +0 -88
  358. data/test/functional/eft_1_print.rb +0 -57
  359. data/test/functional/eft_3_equals.rb +0 -98
  360. data/test/functional/eft_4_if.rb +0 -96
  361. data/test/functional/eft_5_eval.rb +0 -89
  362. data/test/functional/eft_6_reval.rb +0 -101
  363. data/test/functional/eft_7_exp.rb +0 -47
  364. data/test/functional/eft_8_log.rb +0 -50
  365. data/test/functional/eft_9_set.rb +0 -132
  366. data/test/functional/engine_helper.rb +0 -122
  367. data/test/functional/ft_0_vars_at_launch.rb +0 -27
  368. data/test/functional/ft_2_file_listener.rb +0 -45
  369. data/test/functional/ft_3_on_cancel.rb +0 -171
  370. data/test/functional/ft_4_on_error.rb +0 -220
  371. data/test/functional/ft_5_process_uri.rb +0 -82
  372. data/test/functional/ft_6_process_status.rb +0 -62
  373. data/test/functional/ft_7_parameters.rb +0 -103
  374. data/test/functional/ft_8_dollar.rb +0 -53
  375. data/test/functional/ft_9_register_participants.rb +0 -119
  376. data/test/functional/rft_0_sleep.rb +0 -76
  377. data/test/unit/ut_0_fei.rb +0 -166
  378. data/test/unit/ut_10_lookup_attribute.rb +0 -86
  379. data/test/unit/ut_11_filter.rb +0 -124
  380. data/test/unit/ut_12_conditional.rb +0 -162
  381. data/test/unit/ut_13_xmlutil.rb +0 -57
  382. data/test/unit/ut_14_var_field_lookup.rb +0 -85
  383. data/test/unit/ut_15_fe_att_lookup.rb +0 -55
  384. data/test/unit/ut_16_expstorage_findexp.rb +0 -38
  385. data/test/unit/ut_17_representations.rb +0 -330
  386. data/test/unit/ut_17b_representations_hash.rb +0 -97
  387. data/test/unit/ut_18_store_lock.rb +0 -77
  388. data/test/unit/ut_1_wfid.rb +0 -104
  389. data/test/unit/ut_2_utils.rb +0 -53
  390. data/test/unit/ut_3_expmap.rb +0 -65
  391. data/test/unit/ut_4_fulldup.rb +0 -163
  392. data/test/unit/ut_5_observable.rb +0 -132
  393. data/test/unit/ut_6_treechecker.rb +0 -101
  394. data/test/unit/ut_7_parser_ruby.rb +0 -344
  395. data/test/unit/ut_7b_parser_ruby.rb +0 -56
  396. data/test/unit/ut_8_parser_description.rb +0 -77
  397. data/test/unit/ut_9_workitem.rb +0 -72
@@ -0,0 +1,3 @@
1
+ .yardoc
2
+ ruote_rdoc/
3
+ work/
@@ -0,0 +1,8 @@
1
+
2
+ = ruote (OpenWFEru) - CHANGELOG.txt
3
+
4
+ == ruote - 2.0.0 not yet released
5
+
6
+ == OpenWFEru - 0.9.2 released 2007/01/26
7
+ == openwfe-ruby - 1.7.0 released 2006-05-08
8
+
@@ -0,0 +1,65 @@
1
+
2
+ CREDITS
3
+ =======
4
+
5
+ Ruote (OpenWFEru) is an open source Ruby workflow (and sometimes BPM) engine.
6
+
7
+
8
+ The main project team
9
+ ---------------------
10
+
11
+ John Mettraux http://jmettraux.wordpress.com
12
+ Kenneth Kalmer http://www.opensourcery.co.za
13
+
14
+
15
+ Contributors
16
+ ------------
17
+
18
+ Nicholas Faiz - http://github.com/biv
19
+ Chris Beer - http://github.com/cbeer
20
+ Enrico Bianco - http://github.com/enricob
21
+ Andrew Timberlake - timeout 'at'
22
+ Torsten Schoenebaum - ActiveResourceParticipant and more
23
+ Raphael Simon - error handling mechanism design and QA
24
+ Maarten Oelering - bug reports and test cases
25
+ Nick Petrella - socket listener issues and Python interactivity, dollar patch
26
+ Sakaguchi Masa - japanese website and articles in Japanese magazines
27
+ Patrice Cappelaere - lots of feedback and ideas
28
+ Tomaso Tosolini - database persisted engine implementation and patches
29
+ Alain Hoang (configuration managaer)
30
+ Matt Zukowski (senior developer)
31
+ Jamandru Reynolds (http://geometron.net)
32
+ Frederic Piccand
33
+ Richard Jennings
34
+
35
+
36
+ Feedback
37
+ --------
38
+
39
+ Francisco Kiko - "is set" issue
40
+ David Goldhirsch - EM participant block
41
+ dlamotte - set :val => nil
42
+ jpr5 + asm
43
+ Daniel Neighman "hassox" - :on_timeout => "error"
44
+ Jason Allen - multi-instance considerations
45
+ Petia Wohed - workflow patterns implementation evaluation
46
+ Ralph DeGuelle - sleep silent death report
47
+ Leo Venegas - various bug reports
48
+ Corin Moss - sync launch and ruote-rest balancing
49
+ Scott Sproule - missing read() method in rufus-verbs fopen()
50
+ Aye Thu - missing 'atom-tools' dependency
51
+ Machiel Groeneveld - missing 'rufus-mnemo' dependency
52
+ Harshal Hayat - :on_field => :executions idea
53
+ Ralf KaoticEntity - concurrence mix feedback
54
+ Graeme Lockley - every jobs {re/un}scheduling
55
+ JimJin - various feedback and bug reports
56
+ Andreas Baumann - bug reports and test cases
57
+ Fu Zhang - csv tables 'accumulate' and 'range' ideas
58
+ Lee Fyock - suggested the Scheduler 'tag' feature.
59
+ Art Schumer - cron scheduler bug
60
+ ara.t.howard on the ruby talk ml pointed out a weakness in scheduler.
61
+ Tomek "Tomash" Stachewicz - scheduler feedback
62
+ Jon "Compensator" - first report of the "yamlextras" issue
63
+
64
+ (see the mailing list at : http://groups.google.com/group/openwferu-users )
65
+
@@ -0,0 +1,21 @@
1
+
2
+ Copyright (c) 2001-2010, John Mettraux, jmettraux@gmail.com
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in
12
+ all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ THE SOFTWARE.
21
+
@@ -0,0 +1,76 @@
1
+
2
+ = ruote
3
+
4
+ Ruote is a Ruby workflow engine. It's thus a workflow definition interpreter. If you're enterprisey, you might say business process definition.
5
+
6
+ Instances of these definitions are meant to run for a long time, so Ruote is oriented towards persistency / modifiability instead of transience / performance like a regular interpreter is. A Ruote engine may run multiple instances of workflow definitions.
7
+
8
+ Persistent mostly means that you can stop Ruote and later restart it without losing processes. Modifiability means that you can modify a workflow instance on the fly.
9
+
10
+ Process definitions are mainly describing how workitems are routed to participants. These participants may represent worklists for users or group of users, pieces of code, ...
11
+
12
+
13
+ == usage
14
+
15
+ require 'rubygems'
16
+ require 'ruote'
17
+ require 'ruote/storage/fs_storage'
18
+
19
+ # preparing the engine
20
+
21
+ engine = Ruote::Engine.new(
22
+ Ruote::Worker.new(
23
+ Ruote::FsStorage.new('ruote_work')))
24
+
25
+ # registering participants
26
+
27
+ engine.register_participant :alpha do |workitem|
28
+ workitem.fields['message'] = { 'text' => 'hello !', 'author' => 'Alice' }
29
+ end
30
+
31
+ engine.register_participant :bravo do |workitem|
32
+ puts "I received a message from #{workitem.fields['message']['author']}"
33
+ end
34
+
35
+ # defining a process
36
+
37
+ pdef = Ruote.process_definition :name => 'test' do
38
+ sequence do
39
+ participant :alpha
40
+ participant :bravo
41
+ end
42
+ end
43
+
44
+ # launching, creating a process instance
45
+
46
+ wfid = engine.launch(pdef)
47
+
48
+ engine.wait_for(wfid)
49
+ # blocks current thread until our process instance terminates
50
+
51
+ # => 'I received a message from Alice'
52
+
53
+
54
+ == test suite
55
+
56
+ see http://github.com/jmettraux/ruote/tree/ruote2.1/test
57
+
58
+
59
+ == license
60
+
61
+ MIT
62
+
63
+
64
+ == Links
65
+
66
+ http://ruote.rubyforge.org
67
+ http://github.com/jmettraux/ruote
68
+
69
+ http://jmettraux.wordpress.com (blog)
70
+
71
+
72
+ == feedback
73
+
74
+ mailing list : http://groups.google.com/group/openwferu-users
75
+ irc : irc.freenode.net #ruote
76
+
@@ -0,0 +1,68 @@
1
+
2
+ require 'rubygems'
3
+ require 'rake'
4
+
5
+ $:.unshift( File.join(File.dirname(__FILE__), 'lib') )
6
+ require File.join(File.dirname(__FILE__), %w[ lib ruote worker.rb ])
7
+
8
+ begin
9
+
10
+ require 'jeweler'
11
+
12
+ Jeweler::Tasks.new do |gem|
13
+
14
+ gem.version = Ruote::VERSION
15
+ gem.name = 'ruote'
16
+ gem.summary = 'an open source ruby workflow engine'
17
+ gem.description = %{
18
+ ruote is an open source ruby workflow engine.
19
+ }
20
+ gem.email = 'jmettraux@gmail.com'
21
+ gem.homepage = 'http://ruote.rubyforge.org'
22
+ gem.authors = [ 'John Mettraux', 'Kenneth Kalmer' ]
23
+ gem.rubyforge_project = 'ruote'
24
+ gem.test_file = 'test/test.rb'
25
+
26
+ gem.add_dependency 'rufus-cloche', '>= 0.1.6'
27
+ gem.add_dependency 'rufus-dollar'
28
+ gem.add_dependency 'rufus-json'
29
+ gem.add_dependency 'rufus-lru'
30
+ gem.add_dependency 'rufus-mnemo', '>= 1.1.0'
31
+ gem.add_dependency 'rufus-scheduler', '>= 2.0.3'
32
+ gem.add_dependency 'rufus-treechecker', '>= 1.0.3'
33
+
34
+ gem.add_development_dependency 'json'
35
+ gem.add_development_dependency 'yard'
36
+
37
+ # Gem::Specification http://www.rubygems.org/read/chapter/20
38
+ end
39
+ Jeweler::GemcutterTasks.new
40
+ rescue LoadError
41
+ puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler'
42
+ end
43
+
44
+ begin
45
+ require 'yard'
46
+ YARD::Rake::YardocTask.new do |doc|
47
+ doc.options = [ '-o', 'ruote_rdoc', '--title', "ruote #{Ruote::VERSION}" ]
48
+ end
49
+ rescue LoadError
50
+ task :yard do
51
+ abort 'YARD is not available. In order to run yardoc, you must: sudo gem install yard'
52
+ end
53
+ end
54
+
55
+ require 'rake/clean'
56
+ CLEAN.include('pkg', 'rdoc', 'work', 'logs')
57
+
58
+ task :default => [ :clean ]
59
+
60
+ desc 'Upload the documentation to rubyforge'
61
+ task :upload_rdoc => :rdoc do
62
+ sh %{
63
+ rsync -azv -e ssh \
64
+ ruote_rdoc \
65
+ jmettraux@rubyforge.org:/var/www/gforge-projects/ruote/
66
+ }
67
+ end
68
+
@@ -0,0 +1,287 @@
1
+
2
+ [o] port load26 (requires BlockParticipant)
3
+ [o] logger service
4
+ [o] test logger
5
+ [o] object full_dup
6
+ [o] engine#remove_service
7
+ [o] :receive or :receive_back for when workitems come back from participant
8
+ [o] emit :processes :launch :wfid
9
+ [o] emit :processes :terminate :wfid only
10
+ [o] arch doc
11
+ [o] verbose always on
12
+ [o] ev : :participants :register/:unregister
13
+ [o] test logger always on for tests (in-memory only)
14
+ [o] NullParticipant
15
+ [o] NoOpParticipant
16
+ [o] rufus-dollar
17
+ [o] variables in ProcessStatus (process level only)
18
+ [o] ProcessStatus#tree
19
+ [o] subprocess binding
20
+ [o] subprocess lookup
21
+ [o] participant lookup
22
+ [o] event : launch_sub
23
+ [o] event : :processes, :cancelled ?
24
+ [o] concurrence : over_if
25
+ [o] pool cleanup
26
+ [o] fexp : created_time
27
+ [o] ps : launched_time
28
+ [o] ps : #tags
29
+ [o] wi test (and fix) ${f:xyz}
30
+ [o] wi#to_h #from_h
31
+ [o] wi.params
32
+ [o] self rec for [main] process
33
+ [o] fexp.modified_time
34
+ [o] wfid_gen : rufus-mnemo
35
+ [o] fs_error_journal
36
+ [o] fs_error_journal : restart test
37
+ [o] do errors get removed after being replayed ? yes.
38
+ [o] cache storage
39
+ [o] fs storage
40
+ [o] tag (which implies variables)
41
+ [o] event : upon setting tag !
42
+ [o] event : upon leaving tag
43
+ [o] undo
44
+ [o] redo
45
+ [o] cancel-process (exp)
46
+ [o] cancel_process
47
+ [o] cancel
48
+ [o] on_error
49
+ [o] on_cancel
50
+ [o] iterator
51
+ [o] iterator : break, cancel, ...
52
+ [o] cursor
53
+ [o] cursor : jump to tag
54
+ [o] loop
55
+ [o] if
56
+ [o] equals
57
+ [o] unset
58
+ [o] cursor/loop/iterator : break-if rewind-if
59
+ [o] stop passing full exp in message, except for expression updates
60
+ [x] engine#reload
61
+ [o] participants shutdown
62
+ [o] stalled [participant] expressions restart (apply/reply ?)
63
+ "re-apply on reload"
64
+ http://groups.google.com/group/openwferu-users/browse_thread/thread/c2aa4b53d1664d45
65
+ [x] workitem.__result__ / why, the workitem itself is the result
66
+ [o] tracker
67
+ [o] sleep
68
+ [o] listen
69
+ [o] listen wfid="x"
70
+ [o] exploded scheduler
71
+ [x] wfid --> piid (stick with the funny old name)
72
+ [o] persisted tracker
73
+ [o] wfidgen.shutdown (close wfidgen.last)
74
+ [o] conditional for everybody
75
+ [o] timeout for everybody
76
+ [o] __timed_out__ = true ? (wi.fields)
77
+ [o] engine.processes()
78
+ [o] kill_process != cancel_process (need a way to not trigger on_cancel)
79
+ [o] pdef.to_dot (a beginning)
80
+ [o] @in_cancel, @in_error --> @state (active|cancelling|killing)
81
+ [o] wait
82
+ [o] listen
83
+ [o] Jason Allen's check about concurrence
84
+ [x] on_cancel => 'error' NO
85
+ [o] event on [un]setting variable
86
+ [o] condition : != ~= >= ....
87
+ [o] fs_participant
88
+ [o] participant : do thread (and do_not_thread)
89
+ [o] add test for error replay in participant
90
+ [o] forget : participant ? subprocess ? everybody
91
+ [o] Ruote.VERSION = "2.0.0" for Kenneth
92
+ [o] on_timeout => 'part|sub' (idea by hassox)
93
+ [o] on_timeout => 'error' (idea by hassox)
94
+ [o] exp : concurrent-iterator < concurrence
95
+ [o] exp : reserve
96
+ [o] exp : unset
97
+ [o] exp : save
98
+ [o] exp : restore (and its set-fields alias)
99
+ [o] participant : if EM is present use next_ or defer instead of Thread.new
100
+ [o] XML process definitions
101
+ [o] remote process definitions
102
+ [o] json process definitions
103
+ [o] check nested ${f:a.b.c}
104
+ [o] test : participant in error timeout (error should cancel timeout)
105
+ [o] nested set wi.fields['a.b.0'] = x
106
+ [o] nested save wi.fields['a.b.0'] = x
107
+ [o] parser.rb : test security check
108
+ [o] add Ruote::Launchitem
109
+ [o] participant#cancel pass flavour as well nil|:kill|:timeout
110
+ [o] BlockParticipant : |workitem, fexp|
111
+ [o] listeners
112
+ [o] engine.wait_for
113
+ [o] func tests : wire assert_no_errors back in
114
+ [o] timeout set by participant [implementation]
115
+ [o] test for wfids of errors in subprocesses !
116
+ [o] Ruote::Exp:: namespace for expressions
117
+ [o] exp : apply (ex-eval)
118
+ [o] apply : attributes to variables
119
+ [o] subprocess : attributes to variables
120
+ [o] concurrent_iterator :times => X
121
+ [o] iterator defaults to :to_v => 'i'
122
+ [o] concurrent_iterator defaults to :to_v => 'i'
123
+ [o] set "f:x" => "blah"; set "v:y" => [ 1, 2 ] (defaults to f:)
124
+ [o] subprocess :ref => uri
125
+ [o] participants : pass the &block under the option :block
126
+ [o] concurrence : :over_unless
127
+ [x] engine#register_subprocess (replaced by engine#variables)
128
+ [x] switch to JSON friendly pers format for flow expressions
129
+ [o] switch to JSON friendly pers format for workitems
130
+ [o] rewind :ref => 'tag_of_cursor_exp' (direct) :tag oriented.
131
+ [o] exp : error
132
+ [o] wait 0.500 / wait 60
133
+ [x] exp : reval : not needed, participants are here
134
+ [o] exp : inc ? if target is array, becomes append (not cons)
135
+ [o] exp : dec ? if target is array, then pop (not car)
136
+ [o] _if '${f:x} == ${f:y}'
137
+ [x] equals : equals "v:v" => "true" NO => evokes assignment
138
+ [x] if : _if "v:v" => "true" ? NO => evokes assignement
139
+ [x] deferred apply technique / not OK, with EM and next_tick / pro
140
+ [o] reserve : perhaps it's better to have an atomic get and set variable...
141
+ [o] clean up lookup_var/set_var into locate_var/lookup_var/set_var
142
+ [x] Sun Hao's up-to-date-tree idea ${f:participant_name} ps#resolved_tree
143
+ [o] error : when an error expression is cancelled, should the err get remove
144
+ from the process status ? yes.
145
+ [o] file logger / history service
146
+ [o] engine.process_history(wfid)
147
+ [o] add_branch :times/:branches
148
+ [o] cursor : :break_if / :break_unless
149
+ [o] exp : when (exploit :var :set event, or frequency)
150
+ [o] when : restart test
151
+ [o] when : cron frequency
152
+ [o] let listeners accept launchitems
153
+ [o] exp : cron
154
+ [o] exp : every
155
+ [o] write rt test for 'timeout'
156
+ [o] undo exp : alias to 'cancel'
157
+ [o] Andrew's at for timeouts (Chronic maybe)
158
+ [x] timeout :at and :after (timeout expression vanished)
159
+
160
+ [ ] exp : exp (restricted form of eval ?)
161
+ [ ] exp : case (is it necessary ?)
162
+ [ ] exp : filter
163
+ [ ] exp : filter-definition
164
+ [x] exp : lose ?
165
+ [x] exp : parameter
166
+ [ ] exp : log
167
+
168
+ [ ] exp : defined (not really necessary)
169
+ [ ] exp : quote (not really necessary)
170
+ [ ] exp : field / attribute (not really necessary)
171
+ [ ] exp : variable (not really necessary)
172
+
173
+ [ ] exp : step (jump to cursor tag ?)
174
+
175
+ [ ] conditional : rprefix ! ${r:x} is perhaps sufficient
176
+
177
+ [ ] auto-participant re-apply
178
+
179
+ [ ] define without name (__result__)
180
+
181
+ [ ] pooltool.ru
182
+
183
+ [ ] participant dispatch thread throttling ?
184
+
185
+ [ ] expstorage.to_dot
186
+
187
+ [ ] tailcall
188
+ [ ] subprocesses participants (alias ?)
189
+
190
+ [ ] __command__ + tag (rewind that cursor there, not the current one)
191
+
192
+ [ ] beanstalk [as a] workqueue ?
193
+
194
+ [ ] recursion : should cope with modified trees 'main' => :tree ??
195
+
196
+ [ ] user3 :rif => "!wi.fields['approvers'].include?('user3')" : 'in' operator
197
+
198
+ [ ] set :var => 'y' { '2342342' }
199
+
200
+ [ ] pause engine
201
+ [ ] pause process instance
202
+
203
+ [ ] file/fs_listener [example] ?
204
+
205
+ [ ] tree.to_xml (require builder ?)
206
+ [ ] tree.to_rb
207
+
208
+ [ ] concurrence / concurrent_iterator : merge plugin ?
209
+ use participant for that ?
210
+
211
+ [ ] restore : implement merge strategies
212
+
213
+ [ ] one file, no multi-process, persistence ? LateHashStorage ?
214
+
215
+ [ ] apply : ruby or xml (instead of just ast) ?
216
+
217
+ [ ] unify ruote/util/json and ruote/util/serializer
218
+
219
+ [ ] history.to_tree ?
220
+
221
+ [ ] Ruote.process_definition ... Ruote.method_missing or sequence ?
222
+
223
+ [ ] concurrence / concurrent_iterator : merge_type => 'discard' / 'ignore'
224
+ keep track of the first "process sub id" ?
225
+
226
+ [ ] @children diff/undiff idea ?
227
+
228
+ [ ] write doc about engine options (multi-process !)
229
+ [ ] _if '${f:x} == ${f:y} || ${f:x} == ${f:z}'
230
+
231
+ [ ] document the dollar notation / substitution / extrapolation
232
+
233
+ [ ] condition : "${f:x} [is] empty" / this one is hard
234
+
235
+ [ ] ruote/exp/fe_set.rb:147: warning: already initialized constant PREFIX_REGEX
236
+
237
+ [ ] implement kill_process! (kill_expression! ?)
238
+
239
+ [ ] engine.force_reply_to_parent(fei) ?
240
+
241
+ [ ] break fs_history, prepare for dm_history
242
+
243
+ [ ] :on_timeout => :rewind (break, jump to x)...
244
+ [ ] rewind 'x' where x is a tagname (command x)
245
+
246
+ [ ] repeat : have a counter in a variable (:to => x maybe) (subprocessid ?)
247
+
248
+ [ ] when : add test for cancelling when child has been triggered / is running
249
+ [x] listen : should it forget its triggered children ? yes
250
+
251
+ [ ] engine.cancel_forgotten_children(wfid) ?
252
+
253
+ [ ] port subprocess on_cancel test from ruote 0.9 http://groups.google.com/group/openwferu-users/t/75f02bdadf7b93eb
254
+
255
+ [ ] double-check on_cancel rewrite (ft_1_process_status)
256
+
257
+ [o] limit the number of msgs returned
258
+ [o] should redo/undo follow the example of command and add_branches ?
259
+ everything through reply (receive)
260
+ should re_apply not touch the state of its expression ?
261
+ [o] test undo when cancelling parent expression
262
+ [o] issue with :unless => '${f:index} == 2000'
263
+ [o] implement Engine#reply (Engine simply has to include ReceiverMixin
264
+ [o] listeners X receivers
265
+ [o] add_service(name, path, klass, opts={}) opts local to services (really?)
266
+ [o] add_branches : pass message to concurrent_iterator like a command expression
267
+
268
+ [ ] verify get_last/get_raw logic, no + 0.0001...
269
+ [ ] clean up persists present in #apply
270
+ [ ] case exp : smarter one ?
271
+ [ ] spare 1 get_msg by caching msg (but keep 'deleting')
272
+ [ ] [un]set_var : via message ? should be ok like that... Not much traffic there
273
+
274
+ [ ] empty iterator or concurrent-iterator, log ? crash ? empty while...
275
+ [ ] maybe cancel should have a safely / redo_reply thing
276
+ [ ] at expression ?
277
+ [ ] listen to participants/errors/tags {in|out}
278
+
279
+ [ ] implement StorageHistory
280
+ [ ] nuke FsHistory ?
281
+
282
+ [ ] remove abort_on_exception=true
283
+
284
+ [ ] check : what if a reply on a concurrence wants to save, whereas the
285
+ concurrence terminated (got removed) meanwhile ?
286
+ the reply returns true...
287
+