ruote-maestrodev 2.2.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 (265) hide show
  1. data/CHANGELOG.txt +290 -0
  2. data/CREDITS.txt +99 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.rdoc +88 -0
  5. data/Rakefile +108 -0
  6. data/TODO.txt +488 -0
  7. data/lib/ruote.rb +7 -0
  8. data/lib/ruote/context.rb +194 -0
  9. data/lib/ruote/engine.rb +1062 -0
  10. data/lib/ruote/engine/process_error.rb +122 -0
  11. data/lib/ruote/engine/process_status.rb +448 -0
  12. data/lib/ruote/exp/command.rb +87 -0
  13. data/lib/ruote/exp/commanded.rb +69 -0
  14. data/lib/ruote/exp/condition.rb +227 -0
  15. data/lib/ruote/exp/fe_add_branches.rb +138 -0
  16. data/lib/ruote/exp/fe_apply.rb +154 -0
  17. data/lib/ruote/exp/fe_cancel_process.rb +78 -0
  18. data/lib/ruote/exp/fe_command.rb +156 -0
  19. data/lib/ruote/exp/fe_concurrence.rb +321 -0
  20. data/lib/ruote/exp/fe_concurrent_iterator.rb +219 -0
  21. data/lib/ruote/exp/fe_cron.rb +141 -0
  22. data/lib/ruote/exp/fe_cursor.rb +324 -0
  23. data/lib/ruote/exp/fe_define.rb +112 -0
  24. data/lib/ruote/exp/fe_echo.rb +60 -0
  25. data/lib/ruote/exp/fe_equals.rb +115 -0
  26. data/lib/ruote/exp/fe_error.rb +82 -0
  27. data/lib/ruote/exp/fe_filter.rb +648 -0
  28. data/lib/ruote/exp/fe_forget.rb +88 -0
  29. data/lib/ruote/exp/fe_given.rb +154 -0
  30. data/lib/ruote/exp/fe_if.rb +127 -0
  31. data/lib/ruote/exp/fe_inc.rb +205 -0
  32. data/lib/ruote/exp/fe_iterator.rb +234 -0
  33. data/lib/ruote/exp/fe_let.rb +75 -0
  34. data/lib/ruote/exp/fe_listen.rb +304 -0
  35. data/lib/ruote/exp/fe_lose.rb +110 -0
  36. data/lib/ruote/exp/fe_noop.rb +45 -0
  37. data/lib/ruote/exp/fe_once.rb +215 -0
  38. data/lib/ruote/exp/fe_participant.rb +287 -0
  39. data/lib/ruote/exp/fe_read.rb +69 -0
  40. data/lib/ruote/exp/fe_redo.rb +82 -0
  41. data/lib/ruote/exp/fe_ref.rb +152 -0
  42. data/lib/ruote/exp/fe_registerp.rb +110 -0
  43. data/lib/ruote/exp/fe_reserve.rb +126 -0
  44. data/lib/ruote/exp/fe_restore.rb +102 -0
  45. data/lib/ruote/exp/fe_save.rb +72 -0
  46. data/lib/ruote/exp/fe_sequence.rb +59 -0
  47. data/lib/ruote/exp/fe_set.rb +154 -0
  48. data/lib/ruote/exp/fe_subprocess.rb +211 -0
  49. data/lib/ruote/exp/fe_that.rb +92 -0
  50. data/lib/ruote/exp/fe_undo.rb +67 -0
  51. data/lib/ruote/exp/fe_unregisterp.rb +69 -0
  52. data/lib/ruote/exp/fe_wait.rb +95 -0
  53. data/lib/ruote/exp/flowexpression.rb +886 -0
  54. data/lib/ruote/exp/iterator.rb +81 -0
  55. data/lib/ruote/exp/merge.rb +118 -0
  56. data/lib/ruote/exp/ro_attributes.rb +212 -0
  57. data/lib/ruote/exp/ro_filters.rb +136 -0
  58. data/lib/ruote/exp/ro_persist.rb +154 -0
  59. data/lib/ruote/exp/ro_variables.rb +189 -0
  60. data/lib/ruote/exp/ro_vf.rb +68 -0
  61. data/lib/ruote/fei.rb +260 -0
  62. data/lib/ruote/id/mnemo_wfid_generator.rb +43 -0
  63. data/lib/ruote/id/wfid_generator.rb +81 -0
  64. data/lib/ruote/log/default_history.rb +122 -0
  65. data/lib/ruote/log/pretty.rb +176 -0
  66. data/lib/ruote/log/storage_history.rb +159 -0
  67. data/lib/ruote/log/test_logger.rb +208 -0
  68. data/lib/ruote/log/wait_logger.rb +64 -0
  69. data/lib/ruote/part/block_participant.rb +137 -0
  70. data/lib/ruote/part/code_participant.rb +81 -0
  71. data/lib/ruote/part/engine_participant.rb +189 -0
  72. data/lib/ruote/part/local_participant.rb +138 -0
  73. data/lib/ruote/part/no_op_participant.rb +60 -0
  74. data/lib/ruote/part/null_participant.rb +54 -0
  75. data/lib/ruote/part/rev_participant.rb +169 -0
  76. data/lib/ruote/part/smtp_participant.rb +116 -0
  77. data/lib/ruote/part/storage_participant.rb +392 -0
  78. data/lib/ruote/part/template.rb +84 -0
  79. data/lib/ruote/participant.rb +7 -0
  80. data/lib/ruote/reader.rb +278 -0
  81. data/lib/ruote/reader/json.rb +49 -0
  82. data/lib/ruote/reader/radial.rb +290 -0
  83. data/lib/ruote/reader/ruby_dsl.rb +186 -0
  84. data/lib/ruote/reader/xml.rb +99 -0
  85. data/lib/ruote/receiver/base.rb +212 -0
  86. data/lib/ruote/storage/base.rb +364 -0
  87. data/lib/ruote/storage/composite_storage.rb +121 -0
  88. data/lib/ruote/storage/fs_storage.rb +139 -0
  89. data/lib/ruote/storage/hash_storage.rb +211 -0
  90. data/lib/ruote/svc/dispatch_pool.rb +158 -0
  91. data/lib/ruote/svc/dollar_sub.rb +298 -0
  92. data/lib/ruote/svc/error_handler.rb +138 -0
  93. data/lib/ruote/svc/expression_map.rb +97 -0
  94. data/lib/ruote/svc/participant_list.rb +397 -0
  95. data/lib/ruote/svc/tracker.rb +172 -0
  96. data/lib/ruote/svc/treechecker.rb +141 -0
  97. data/lib/ruote/tree_dot.rb +85 -0
  98. data/lib/ruote/util/filter.rb +525 -0
  99. data/lib/ruote/util/hashdot.rb +79 -0
  100. data/lib/ruote/util/look.rb +128 -0
  101. data/lib/ruote/util/lookup.rb +127 -0
  102. data/lib/ruote/util/misc.rb +167 -0
  103. data/lib/ruote/util/ometa.rb +71 -0
  104. data/lib/ruote/util/serializer.rb +103 -0
  105. data/lib/ruote/util/subprocess.rb +88 -0
  106. data/lib/ruote/util/time.rb +100 -0
  107. data/lib/ruote/util/tree.rb +58 -0
  108. data/lib/ruote/version.rb +29 -0
  109. data/lib/ruote/worker.rb +386 -0
  110. data/lib/ruote/workitem.rb +394 -0
  111. data/phil.txt +14 -0
  112. data/ruote.gemspec +44 -0
  113. data/test/bm/ci.rb +55 -0
  114. data/test/bm/ici.rb +71 -0
  115. data/test/bm/juuman.rb +54 -0
  116. data/test/bm/launch_bench.rb +37 -0
  117. data/test/bm/load_26c.rb +97 -0
  118. data/test/bm/mega.rb +64 -0
  119. data/test/bm/seq_thousand.rb +31 -0
  120. data/test/bm/t.rb +35 -0
  121. data/test/functional/base.rb +247 -0
  122. data/test/functional/concurrent_base.rb +98 -0
  123. data/test/functional/crunner.rb +31 -0
  124. data/test/functional/ct_0_concurrence.rb +65 -0
  125. data/test/functional/ct_1_iterator.rb +67 -0
  126. data/test/functional/ct_2_cancel.rb +81 -0
  127. data/test/functional/eft_0_process_definition.rb +65 -0
  128. data/test/functional/eft_10_cancel_process.rb +46 -0
  129. data/test/functional/eft_11_wait.rb +109 -0
  130. data/test/functional/eft_12_listen.rb +500 -0
  131. data/test/functional/eft_13_iterator.rb +342 -0
  132. data/test/functional/eft_14_cursor.rb +456 -0
  133. data/test/functional/eft_15_loop.rb +69 -0
  134. data/test/functional/eft_16_if.rb +183 -0
  135. data/test/functional/eft_17_equals.rb +55 -0
  136. data/test/functional/eft_18_concurrent_iterator.rb +410 -0
  137. data/test/functional/eft_19_reserve.rb +136 -0
  138. data/test/functional/eft_1_echo.rb +68 -0
  139. data/test/functional/eft_20_save.rb +116 -0
  140. data/test/functional/eft_21_restore.rb +61 -0
  141. data/test/functional/eft_22_noop.rb +28 -0
  142. data/test/functional/eft_23_apply.rb +168 -0
  143. data/test/functional/eft_24_add_branches.rb +98 -0
  144. data/test/functional/eft_25_command.rb +28 -0
  145. data/test/functional/eft_26_error.rb +77 -0
  146. data/test/functional/eft_27_inc.rb +280 -0
  147. data/test/functional/eft_28_once.rb +135 -0
  148. data/test/functional/eft_29_cron.rb +64 -0
  149. data/test/functional/eft_2_sequence.rb +58 -0
  150. data/test/functional/eft_30_ref.rb +155 -0
  151. data/test/functional/eft_31_registerp.rb +130 -0
  152. data/test/functional/eft_32_lose.rb +93 -0
  153. data/test/functional/eft_33_let.rb +31 -0
  154. data/test/functional/eft_34_given.rb +123 -0
  155. data/test/functional/eft_35_filter.rb +375 -0
  156. data/test/functional/eft_36_read.rb +95 -0
  157. data/test/functional/eft_3_participant.rb +149 -0
  158. data/test/functional/eft_4_set.rb +296 -0
  159. data/test/functional/eft_5_subprocess.rb +163 -0
  160. data/test/functional/eft_6_concurrence.rb +304 -0
  161. data/test/functional/eft_7_forget.rb +61 -0
  162. data/test/functional/eft_8_undo.rb +114 -0
  163. data/test/functional/eft_9_redo.rb +138 -0
  164. data/test/functional/ft_0_worker.rb +65 -0
  165. data/test/functional/ft_10_dollar.rb +304 -0
  166. data/test/functional/ft_11_recursion.rb +109 -0
  167. data/test/functional/ft_12_launchitem.rb +43 -0
  168. data/test/functional/ft_13_variables.rb +151 -0
  169. data/test/functional/ft_14_re_apply.rb +324 -0
  170. data/test/functional/ft_15_timeout.rb +226 -0
  171. data/test/functional/ft_16_participant_params.rb +98 -0
  172. data/test/functional/ft_17_conditional.rb +102 -0
  173. data/test/functional/ft_18_kill.rb +138 -0
  174. data/test/functional/ft_19_participant_code.rb +67 -0
  175. data/test/functional/ft_1_process_status.rb +796 -0
  176. data/test/functional/ft_20_storage_participant.rb +543 -0
  177. data/test/functional/ft_21_forget.rb +153 -0
  178. data/test/functional/ft_22_process_definitions.rb +90 -0
  179. data/test/functional/ft_23_load_defs.rb +79 -0
  180. data/test/functional/ft_24_block_participant.rb +235 -0
  181. data/test/functional/ft_25_receiver.rb +207 -0
  182. data/test/functional/ft_26_participant_rtimeout.rb +179 -0
  183. data/test/functional/ft_27_var_indirection.rb +128 -0
  184. data/test/functional/ft_28_null_noop_participants.rb +51 -0
  185. data/test/functional/ft_29_part_template.rb +60 -0
  186. data/test/functional/ft_2_errors.rb +380 -0
  187. data/test/functional/ft_30_smtp_participant.rb +122 -0
  188. data/test/functional/ft_31_part_blocking.rb +72 -0
  189. data/test/functional/ft_33_participant_subprocess_priority.rb +32 -0
  190. data/test/functional/ft_34_cursor_rewind.rb +101 -0
  191. data/test/functional/ft_35_add_service.rb +56 -0
  192. data/test/functional/ft_36_storage_history.rb +150 -0
  193. data/test/functional/ft_37_default_history.rb +109 -0
  194. data/test/functional/ft_38_participant_more.rb +193 -0
  195. data/test/functional/ft_39_wait_for.rb +136 -0
  196. data/test/functional/ft_3_participant_registration.rb +574 -0
  197. data/test/functional/ft_40_wait_logger.rb +62 -0
  198. data/test/functional/ft_41_participants.rb +91 -0
  199. data/test/functional/ft_42_storage_copy.rb +71 -0
  200. data/test/functional/ft_43_participant_on_reply.rb +87 -0
  201. data/test/functional/ft_44_var_participant.rb +35 -0
  202. data/test/functional/ft_45_participant_accept.rb +64 -0
  203. data/test/functional/ft_46_launch_single.rb +83 -0
  204. data/test/functional/ft_47_wfid_generator.rb +54 -0
  205. data/test/functional/ft_48_lose.rb +112 -0
  206. data/test/functional/ft_49_engine_on_error.rb +201 -0
  207. data/test/functional/ft_4_cancel.rb +132 -0
  208. data/test/functional/ft_50_engine_config.rb +22 -0
  209. data/test/functional/ft_51_misc.rb +67 -0
  210. data/test/functional/ft_52_case.rb +134 -0
  211. data/test/functional/ft_53_engine_on_terminate.rb +95 -0
  212. data/test/functional/ft_54_patterns.rb +104 -0
  213. data/test/functional/ft_55_engine_participant.rb +303 -0
  214. data/test/functional/ft_56_filter_attribute.rb +259 -0
  215. data/test/functional/ft_57_rev_participant.rb +252 -0
  216. data/test/functional/ft_58_workitem.rb +69 -0
  217. data/test/functional/ft_59_pause.rb +343 -0
  218. data/test/functional/ft_5_on_error.rb +384 -0
  219. data/test/functional/ft_60_code_participant.rb +45 -0
  220. data/test/functional/ft_61_trailing_fields.rb +34 -0
  221. data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
  222. data/test/functional/ft_6_on_cancel.rb +221 -0
  223. data/test/functional/ft_7_tags.rb +177 -0
  224. data/test/functional/ft_8_participant_consumption.rb +124 -0
  225. data/test/functional/ft_9_subprocesses.rb +146 -0
  226. data/test/functional/restart_base.rb +34 -0
  227. data/test/functional/rt_0_wait.rb +55 -0
  228. data/test/functional/rt_1_listen.rb +56 -0
  229. data/test/functional/rt_2_errors.rb +56 -0
  230. data/test/functional/rt_3_once.rb +70 -0
  231. data/test/functional/rt_4_cron.rb +64 -0
  232. data/test/functional/rt_5_timeout.rb +60 -0
  233. data/test/functional/rtest.rb +8 -0
  234. data/test/functional/storage_helper.rb +93 -0
  235. data/test/functional/test.rb +44 -0
  236. data/test/functional/vertical.rb +46 -0
  237. data/test/path_helper.rb +15 -0
  238. data/test/test.rb +13 -0
  239. data/test/test_helper.rb +28 -0
  240. data/test/unit/storage.rb +428 -0
  241. data/test/unit/storages.rb +37 -0
  242. data/test/unit/test.rb +28 -0
  243. data/test/unit/ut_0_ruby_reader.rb +223 -0
  244. data/test/unit/ut_11_lookup.rb +122 -0
  245. data/test/unit/ut_13_serializer.rb +65 -0
  246. data/test/unit/ut_14_is_uri.rb +28 -0
  247. data/test/unit/ut_15_util.rb +57 -0
  248. data/test/unit/ut_16_reader.rb +225 -0
  249. data/test/unit/ut_18_engine.rb +47 -0
  250. data/test/unit/ut_19_part_template.rb +86 -0
  251. data/test/unit/ut_1_fei.rb +165 -0
  252. data/test/unit/ut_20_composite_storage.rb +74 -0
  253. data/test/unit/ut_21_svc_participant_list.rb +46 -0
  254. data/test/unit/ut_22_filter.rb +1094 -0
  255. data/test/unit/ut_23_svc_tracker.rb +48 -0
  256. data/test/unit/ut_24_radial_reader.rb +332 -0
  257. data/test/unit/ut_25_merge.rb +113 -0
  258. data/test/unit/ut_3_wait_logger.rb +39 -0
  259. data/test/unit/ut_4_expmap.rb +20 -0
  260. data/test/unit/ut_5_tree.rb +54 -0
  261. data/test/unit/ut_6_condition.rb +303 -0
  262. data/test/unit/ut_7_workitem.rb +99 -0
  263. data/test/unit/ut_8_tree_to_dot.rb +72 -0
  264. data/test/unit/ut_9_xml_reader.rb +61 -0
  265. metadata +504 -0
@@ -0,0 +1,290 @@
1
+
2
+ = ruote - CHANGELOG.txt
3
+
4
+
5
+ == ruote - 2.2.1 not yet released
6
+
7
+ - dollar substitution in expression name as well
8
+ - Engine#replay_at_error(err_or_fei_or_wi)
9
+ - Engine#error(wi_or_fei)
10
+ - storages : #replace_engine_configuration(opts)
11
+ - FsStorage : saving newer configuration (Thanks Nicholas Faiz)
12
+ - ProcessStatus context : linking expression <-> error
13
+ - ProcessStatus#root_workitem
14
+ - ProcessStatus#leaves
15
+ - filter 'includes' and 'is' (Thanks Nando Sola)
16
+ - trailing fields (a Simone Carletti idea)
17
+ - concurrence vs history issue fixed (Thanks Juris Galang)
18
+ - unset and fields : made sure the field is removed (Thanks jpgilman)
19
+ - sourcify, using to_raw_source from now on
20
+ - filter expression and blocks
21
+ - set 'v:display' => 'echo', aliasing of expressions
22
+ - Reader.read(s) : better error raised when failed to 'parse'
23
+ - :on_field => 'my.nested.field' now possible
24
+ - [concurrent-]iterator :to => 'v:x' / 'f:y' / 'y'
25
+ - concurrence :merge_type => 'union'
26
+ - Reader.to_radial(tree)
27
+ - Workitem#param_or_field(key) and #field_or_param(key)
28
+ - Workitem#param_text
29
+ - ProcessError#deviations (cf filter and Ruote::ValidationError)
30
+ - reworked (process definition) Reader
31
+ - filter top-level 'or'
32
+ - filter field => 'x|y' (or on field names)
33
+ - 'radial' process definitions
34
+ - fixed Tracker#add_tracker (2nd try) issue (Thanks Pedro Texeira)
35
+ - Engine#register :on_workitem / :on_reply / ...
36
+ - set 'v:participant' => lambda { |wi| wi.fields['x'] = 'y' }
37
+ - listen :to => :errors, :class => string / :message/:msg => string / regex
38
+ - listen :to => :errors
39
+ - dropped require 'json' and co from fs_storage (Thanks Torsten)
40
+ - cursor : 'reset' command and :reset_if attribute
41
+ - Engine#resume(wfid, :anyway => true) resumes any paused expression in a
42
+ given process
43
+ - Engine#pause(fei, :breakpoint => true) pauses only one expression (and not
44
+ its children)
45
+ - CompositeStorage#delete_schedule fix (Thanks Greg)
46
+ - read 'http://'|'file', :to => 'f:a' / :to => 'v:b'
47
+ - save :to => 'f:a' / :to => 'v:b'
48
+ - pause(fei/wfid), resume(fei/wfid)
49
+ - participant list, multiple participants with same regex now ok, allowing
50
+ for cascading participants (at consume and at on_error)
51
+ - register block : fixed issue with lonely pname and block
52
+ - register_participant : after/before/over
53
+ - register block : now clearing by default
54
+ - fixed issue with deep set and unset (Thanks Nando Sola)
55
+ - improved conditional evaluation for dollar notation
56
+ - register block : catchall and catch_all
57
+ - Workitem #wf_name and #wf_revision
58
+ - StorageParticipant :skip and :limit issues (Thanks Jan Topiński)
59
+ - StorageParticipant #proceed deprecates #reply
60
+ - fix for :if => '${a}' when a like '456ab' (Thanks John Le)
61
+ - StorageParticipant :count => true uniformization (Thanks Jan Topiński)
62
+ - StorageParticipant#by_fei (alias for #[])
63
+
64
+
65
+ == ruote - 2.2.0 released 2011/03/01
66
+
67
+ - Engine#participant(name) returns an instance of any participant
68
+ - :filter => 'participant_name' (consume(wi) / filter(fields))
69
+ - listen block and forget issue fixed (Thanks Nando Sola)
70
+ - @msg always set in FlowExpression
71
+ - aliased 'cancel_process' to 'terminate'
72
+ - Engine#leftovers (Thanks Iuri)
73
+ - $x, $f:x and $v:y vs ${x}, ${f:x} and ${v:y} (literally)
74
+ - :filter common attribute
75
+ - Participant#do_not_thread : optional workitem parameter
76
+ - filter expression
77
+ - LocalParticipant / Receiver #applied_workitem(fei)
78
+ - using Sourcify to store block participant's code as a string
79
+ - CompositeStorage#delete bug fix (Thanks Claudio)
80
+ - ParticipantList#register bug fix (Thanks 'sandbox')
81
+ - StorageHistory#wfids and DefaultHistory#wfids
82
+ - Engine#history -> DefaultHistory (keeping the last 1000 msgs)
83
+ - 'citerator' alias to 'concurrent_iterator'
84
+ - Participant#rtimeout(workitem) (optional)
85
+ - moved Engine#workitem(fei) to ReceiverMixin
86
+ - storage#delete_schedule ignoring nil schedule_id
87
+ - Participant #rtimeout instead of #timeout
88
+ - StorageParticipant making @options available
89
+ - Engine#register, allowing block participants (Thanks Hery)
90
+ - fixed Engine#launch_single relaunch issue (Thanks Gonzalo)
91
+ - 'rset', an alias for the 'set' expression (Thanks Rebo)
92
+ - listen :to => /x/ or "/x/" required for regular expressions
93
+ - engine#on_terminate = participant_name / subprocess_name / tree
94
+ - listen :to => 'tagname', :upon => 'entering' / 'leaving'
95
+ - Ruote::Parser becomes Ruote::Reader
96
+ - :if => "${customer} in ${customer_list}", :if => "4 in {4 => 5}"
97
+ - Ruote::Workitem .from_json #as_json
98
+ - :on_error => redo/retry // undo/pass
99
+ - given : a case/switch ruote equivalent
100
+ - conditionals : "${x} is empty" and "${x} is null"
101
+ - once expression (once, _when, as_soon_as)
102
+ - let expression (a sequence with its own variable scope)
103
+ - engine.ps(wfid=nil)
104
+ - once : made sure child is cancelled as well
105
+ - :if => '${f:a} and ${f:b}'
106
+ - workitem.tags (workitem['fields']['__tags__']
107
+ - better participant initialization (Thanks Neil Pennell)
108
+ - Engine #cancel and #kill (expression or process, whichever)
109
+ - subid (sub_wfid) for every expression
110
+ - undo and redo : more robust (broken tags)
111
+ - cursor : giving a sub_wfid to children (play nice with :forget)
112
+ - Ruote.is_tree?(o) .is_definition_tree?(o) consolidated
113
+ - engine#on_error = [] registering error notifications and the like
114
+ - engine#configuration(key) (counterpart to engine#configure(key, value))
115
+ - implemented the :lose attribute
116
+ - implemented the 'lose' expression
117
+ - fixed issue with "over" (Thanks Daniel 'hassox' Neighman)
118
+ - fixed issue with workitem.command = 'jump to x' (Thanks Fix Peña)
119
+ - fixed issue with ProcessStatus#position and errors in ParticipantExpression
120
+ (Thanks Eric Smith)
121
+ - 'registerp' and 'unregisterp' expressions
122
+ - ${r:xxx} when ruby_eval_allowed == false now raises an error
123
+
124
+
125
+ == ruote - 2.1.11 released 2010/10/01
126
+
127
+ - Engine#process broken with process where schedule count > 1 (Thanks David)
128
+ - Engine#launch_single for 1! instance processes (Thanks Eric)
129
+ - Workitem#command and #command= helpers
130
+ - ProcessError#workitem helper
131
+ - fetch_flow_expression made public and aliased to fexp
132
+ - ${r:workitem_field} (idea: Nathan Stults)
133
+ - Ruote::Dollar::Dict and Ruote::Dollar::RubyContext
134
+ - made Ruote.dsub a service : @context.dollar_sub.s(...) (idea: Nathan Stults)
135
+ - moved simpler services to ruote/svc/
136
+ - using BlankSlate for ruby process definitions
137
+ - Engine.new(worker, :join => true) will let the worker run in the current
138
+ thread (and not return)
139
+ - StorageParticipant#query(:count => true)
140
+ - storage.get_many(type, keys, :descending => true)
141
+ - engine.processes(:skip => 50, limit => 50)
142
+ - listen expression : using lwfid instead of wfid (storage change)
143
+ - fixed issue when re-applying root expressions (Thanks Brett)
144
+ - storage_participant.query using :skip and :limit
145
+ - engine.schedules([wfid]) and ProcessStatus#schedules
146
+ - differentiating on_re_apply from on_cancel (process gardening)
147
+ - engine.participant_list= more tolerant about its input
148
+ - engine.process(wfid).stored_workitems
149
+ - engine.process(wfid).workitems and .position
150
+ - engine.process(wfid).last_active
151
+ - engine.errors(wfid=nil) now returns array of ProcessError instances
152
+ - engine.register { block } (Torsten)
153
+ - participant.accept?(workitem)
154
+ - 'ref' expression (pointing to participants or subprocesses)
155
+ - engine.process_wfids (list process instance wfids)
156
+ - set 'v:alpha' => [ 'MyParticipant', { 'flavour' => 'vanilla' }]
157
+ participants registered as variables (just for that process instance)
158
+ - engine.participant_list and .participant_list=
159
+ - engine.register_participant 'al', 'AlParticipant', :require_path => 'pa/th'
160
+ - engine.register_participant 'al', 'AlParticipant', :load_path => 'pa/th'
161
+ - engine.[un]register for .[un]register_participant
162
+ - engine.noisy = true (a shortcut)
163
+ - engine.storage_participant (a shortcut)
164
+ - removed direct dependency on rufus-lru
165
+ - WaitLogger : a transient @seen (Thanks Kaspar)
166
+ - error_handler : more error catching
167
+ - storage#copy_to(other_storage) item by item implementation
168
+ - Engine#wait_for OK with multiple threads
169
+ - ExpressionMap now loads all expressions in Ruote::Exp:: namespace
170
+ - 'error_intercepted' msg now features error_class, _message and _backtrace (RM)
171
+ - Engine#join and Worker#join
172
+ - workitem.error now includes error's backtrace (contributed by Rich Meyers)
173
+
174
+
175
+ == ruote - 2.1.10 released 2010/06/15
176
+
177
+ - storage#copy_to(other_storage) implemented
178
+ - #launch moved from Engine to ReceiverMixin
179
+ - participants without initialize(opts) are now allowed
180
+ - engine.wait_for(:inactive)
181
+ - engine.wait_for(*interests) unlocked
182
+ - engine.wait_for(:empty)
183
+ - fixed issue with participant 'x' and :on_error. Thanks Oleg.
184
+ - receiver : reply and reply_to_engine : from aliases to wrappers
185
+ - Ruote::StorageParticipant more flexibility for method args
186
+ - Ruote::FlowExpressionId .extract_h and .extract
187
+ - dropped fs_history (storage_history is better)
188
+ - parser to_xml _if 'x == b' --> <if test="x == b">
189
+ - workitem.sid shortcut for workitem.fei.to_storage_id
190
+ - workitem.wfid shorcut for workitem.fei.wfid
191
+ - new error_handler service
192
+ - Receiver.new(x), x can be worker, engine, context or storage
193
+ - Participant#on_reply(workitem) manipulating workitems when they come back
194
+ - set '${v:customers.0.name}' => 'x' now OK, was limited to fields. Thanks Oleg
195
+ - LocalParticipant#put(fei, hash) #get(fei, key) for stashing info
196
+ - LocalParticipant#re_dispatch(wi, opts)
197
+ - bug in HashStorage, apply over apply didn't raise a persist error. Fixed.
198
+ - keeping track of workitem fields as they were right before a participant error
199
+ - Workitem.error holds the error when on_error. Thanks Oleg.
200
+ - Workitem#error and Workitem#timed_out shortcuts
201
+ - participant :on_error => 'x' broken. Fixed. Thanks Oleg.
202
+ - Engine#workitem(fei) for advanced users
203
+ - LocalParticipant : added a reject(workitem) method
204
+ - participant exp : dispatched = true set right after dispatch
205
+
206
+
207
+ == ruote - 2.1.9 released 2010/03/22
208
+
209
+ - made participant.cancel occur asynchronously (as should be)
210
+ - lookup_variable : making sure not to break when the parent exp is gone
211
+ - workitem.fields['__dispatch_time__'] is now set
212
+
213
+
214
+ == ruote - 2.1.8 released 2010/03/15
215
+
216
+ - participant#schedule_timeout workaround for issue with JRuby 1.4.0 (1.8.7)
217
+ - implemented Ruote::CompositeStorage
218
+ - leveraging rufus-cloche 0.1.16 and the 'cloche_nolock' option (FsStorage)
219
+ - SmtpParticipant and ruote/part/template.rb reorganization
220
+ - StorageParticipant when returned by engine#register was unusable. Fixed.
221
+ - string keys for SmtpParticipant. Thanks Gonzalo
222
+ - fixed every('10m') bug. Thanks Gonzalo Suarez
223
+ - Ruote::FlowExpressionId.from_id(s) more permissive
224
+ - concurrence (and concurrent-iterator) :merge_type => :stack
225
+
226
+
227
+ == ruote - 2.1.7 released 2010/02/15
228
+
229
+ - now works on WinXP, Ruby 1.8.7
230
+ - reformed msgs ids and adapted Ruote::StorageHistory
231
+ - engine.register_participant(x, Ruote::StorageParticipant) now returning
232
+ a instance of the participant, for easy query
233
+ - StorageParticipant, added #query(criteria), thanks Torsten and Brett
234
+ - Ruote::Workitem #lookup('deep.field') and #set_field('deep.field') are back
235
+ - Ruote::Workitem added == and hash (list.uniq friendly), thanks Brett
236
+ - Engine#configure(key, value), thanks Torsten
237
+ - Ruote.to_tree (lightweight version of Ruote.process_definition)
238
+ - ParticipantList#names, thanks Kenneth
239
+
240
+
241
+ == ruote - 2.1.6 released 2010/02/08
242
+
243
+ - welcoming ruote-dm (datamapper persistency)
244
+ - Engine#re_apply(fei, opts) where opts in [ :tree, :fields, :merge_in_fields ]
245
+ - fixed issue about StorageParticipant#update, thanks Torsten
246
+
247
+
248
+ == ruote - 2.1.5 released 2010/01/28
249
+
250
+ - fixed StorageParticipant a to b flow, fix by Torsten
251
+ - fixed StorageParticipant#cancel
252
+ - dollar : made sure of ${fei} and ${wfid}
253
+ - implemented ProcessStatus#to_dot
254
+ - if a participant implementation cancel method returns false,
255
+ reply_to_parent will not get called
256
+ - changes about errors without [stored] expressions, they now appear in process
257
+ statuses
258
+ - EngineParticipant implemented
259
+ - 'ruby_eval_allowed' instead of :ruby_eval_allowed
260
+ - ${v:customer.address.1} deep trick now ok (as it was ok for fields)
261
+ - added d() to the $ notation : echo "${r: d('f:toto') }"
262
+ - Engine#kill_process(wfid) can cure errored participant expressions
263
+ - made sure ${r:wi} and ${r:workitem} is and instance of Ruote::Workitem
264
+ - implemented StorageParticipant#by_field
265
+
266
+
267
+ == ruote - 2.1.4 released 2010/01/11
268
+
269
+ - implemented StorageHistory
270
+ - using yyyy-mm-dd instead of yyyy/mm/dd for Ruote.time_to_utc_s(t)
271
+ - implemented Storage#purge_type!(t)
272
+ - Engine#add_service now returning just bound service
273
+
274
+
275
+ == ruote - 2.1.3 released 2010/01/04
276
+
277
+ - fixed issue with Rufus.is_cron_string (thanks Torsten)
278
+ - fixed issue with FlowExpression#cancel (Kenneth)
279
+
280
+
281
+ == ruote - 2.1.2 released 2010/01/03
282
+
283
+ - fixed issue when initializing engine without worker. Thanks Matt Nichols.
284
+
285
+
286
+ == ruote - 2.1.1 released 2009/12/31
287
+
288
+ == OpenWFEru - 0.9.2 released 2007/01/26
289
+ == openwfe-ruby - 1.7.0 released 2006/05/08
290
+
@@ -0,0 +1,99 @@
1
+
2
+ = CREDITS
3
+
4
+ Ruote is an open source Ruby workflow engine.
5
+
6
+
7
+ == The main project team
8
+
9
+ John Mettraux - http://jmettraux.wordpress.com
10
+ Torsten Schoenebaum - http://github.com/tosch
11
+ Kenneth Kalmer - http://www.opensourcery.co.za
12
+
13
+
14
+ == Contributors
15
+
16
+ Simone Carletti - documentation, bug hunting and various ideas
17
+ Raphael Simon - error handling + filters design
18
+ Nando Sola - lots of help
19
+ Neil Pennell - http://github.com/npennel
20
+ Patrick Gannon - fix for compatibility with ruote-mongodb
21
+ Fix Peña - 'jump to' bug patch
22
+ Eric Smith - position when error patch
23
+ David Goodlad - http://github.com/dgoodlad
24
+ Eric Dennis - http://github.com/threetee
25
+ David Greaves - http://github.com/lbt
26
+ Rich Meyers - http://github.com/richmeyers
27
+ Oleg Pudeyev - http://github.com/p
28
+ Brett Anthoine - http://github.com/anb
29
+ Matt Nichols - http://github.com/mattnichols
30
+ Nicholas Faiz - http://github.com/biv
31
+ Chris Beer - http://github.com/cbeer
32
+ Enrico Bianco - http://github.com/enricob
33
+ Andrew Timberlake - timeout 'at'
34
+ Maarten Oelering - bug reports and test cases
35
+ Nick Petrella - socket listener issues and Python interactivity, dollar patch
36
+ Sakaguchi Masa - japanese website and articles in Japanese magazines
37
+ Patrice Cappelaere - lots of feedback and ideas
38
+ Tomaso Tosolini - database persisted engine implementation and patches
39
+ Alain Hoang (configuration managaer)
40
+ Matt Zukowski (senior developer)
41
+ Jamandru Reynolds (http://geometron.net)
42
+ Frederic Piccand
43
+ Richard Jennings
44
+
45
+
46
+ == Feedback
47
+
48
+ Juris Galang - https://github.com/jurisgalang (concurrence vs history issue)
49
+ John 'jpgilman' - timed_out and name of the participant
50
+ Pedro Texeira - add_tracker issue
51
+ Greg Lazarev - composite storage issues
52
+ Jan Topiński - https://github.com/simcha
53
+ Iuri Gagnidze - ProcessStatus#definition_name issues, Engine#leftovers
54
+ John Le - https://github.com/sandbox
55
+ Sean Johnson - https://github.com/belucid
56
+ Hery - Engine#register and block participants
57
+ Gonzalo Suarez - many many help
58
+ Rebo - 'set' issue with Sinatra
59
+ Copper Hill - test coverage enhancements
60
+ Claudio Petasecca Donati - many help
61
+ Daniel Neighman "hassox" - :on_timeout => "error" and many issue reports
62
+ Eric Platon - engine.launch_single idea
63
+ Marc Lee - storage.clear consistency
64
+ Nathan Stults - enhanced dollar substitution and service
65
+ Don H. French - Engine#register_from_dir idea
66
+ Kaspar Schiess - http://github.com/kschiess
67
+ Oleg (foenixx) - many suggestions and bug reports
68
+ Avishai Shalom - discussion and ideas about participant/worker locality
69
+ Francisco Kiko - many help
70
+ David Goldhirsch - EM participant block
71
+ dlamotte - set :val => nil
72
+ jpr5 + asm
73
+ Jason Allen - multi-instance considerations
74
+ Petia Wohed - workflow patterns implementation evaluation
75
+ Ralph DeGuelle - sleep silent death report
76
+ Leo Venegas - various bug reports
77
+ Corin Moss - sync launch and ruote-rest balancing
78
+ Scott Sproule - missing read() method in rufus-verbs fopen()
79
+ Aye Thu - missing 'atom-tools' dependency
80
+ Machiel Groeneveld - missing 'rufus-mnemo' dependency
81
+ Harshal Hayat - :on_field => :executions idea
82
+ Ralf KaoticEntity - concurrence mix feedback
83
+ Graeme Lockley - every jobs {re/un}scheduling
84
+ JimJin - various feedback and bug reports
85
+ Andreas Baumann - bug reports and test cases
86
+ Fu Zhang - csv tables 'accumulate' and 'range' ideas
87
+ Lee Fyock - suggested the Scheduler 'tag' feature.
88
+ Art Schumer - cron scheduler bug
89
+ ara.t.howard on the ruby talk ml pointed out a weakness in scheduler.
90
+ Tomek "Tomash" Stachewicz - scheduler feedback
91
+ Jon "Compensator" - first report of the "yamlextras" issue
92
+
93
+ (see the mailing list at : http://groups.google.com/group/openwferu-users )
94
+
95
+
96
+ = Last but not least
97
+
98
+ 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.
99
+
@@ -0,0 +1,21 @@
1
+
2
+ Copyright (c) 2001-2011, 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,88 @@
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
+ grab ruote
16
+
17
+ gem install ruote
18
+ gem install yajl-ruby
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
+ Then
27
+
28
+ require 'rubygems'
29
+ require 'ruote'
30
+ require 'ruote/storage/fs_storage'
31
+
32
+ # preparing the engine
33
+
34
+ engine = Ruote::Engine.new(
35
+ Ruote::Worker.new(
36
+ Ruote::FsStorage.new('ruote_work')))
37
+
38
+ # registering participants
39
+
40
+ engine.register_participant :alpha do |workitem|
41
+ workitem.fields['message'] = { 'text' => 'hello !', 'author' => 'Alice' }
42
+ end
43
+
44
+ engine.register_participant :bravo do |workitem|
45
+ puts "I received a message from #{workitem.fields['message']['author']}"
46
+ end
47
+
48
+ # defining a process
49
+
50
+ pdef = Ruote.process_definition :name => 'test' do
51
+ sequence do
52
+ participant :alpha
53
+ participant :bravo
54
+ end
55
+ end
56
+
57
+ # launching, creating a process instance
58
+
59
+ wfid = engine.launch(pdef)
60
+
61
+ engine.wait_for(wfid)
62
+ # blocks current thread until our process instance terminates
63
+
64
+ # => 'I received a message from Alice'
65
+
66
+
67
+ == test suite
68
+
69
+ see http://github.com/jmettraux/ruote/tree/master/test
70
+
71
+
72
+ == license
73
+
74
+ MIT
75
+
76
+
77
+ == links
78
+
79
+ * http://ruote.rubyforge.org
80
+ * http://github.com/jmettraux/ruote
81
+ * http://jmettraux.wordpress.com (blog)
82
+
83
+
84
+ == feedback
85
+
86
+ * mailing list : http://groups.google.com/group/openwferu-users
87
+ * irc : irc.freenode.net #ruote
88
+