ruote-maestrodev 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
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
+