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,108 @@
1
+
2
+ $:.unshift('.') # 1.9.2
3
+
4
+ require 'rubygems'
5
+ require 'rubygems/user_interaction' if Gem::RubyGemsVersion == '1.5.0'
6
+
7
+ require 'rake'
8
+ require 'rake/clean'
9
+ require 'rake/rdoctask'
10
+
11
+
12
+ #
13
+ # clean
14
+
15
+ CLEAN.include('pkg', 'rdoc', 'ruote_work', 'ruote_data')
16
+
17
+
18
+ #
19
+ # test
20
+
21
+ task :test do
22
+
23
+ sh 'ruby -I. test/unit/test.rb'
24
+ sh 'ruby -I. test/functional/test.rb'
25
+ end
26
+
27
+ task :default => [ :test ]
28
+
29
+
30
+ #
31
+ # gem
32
+
33
+ GEMSPEC_FILE = Dir['*.gemspec'].first
34
+ GEMSPEC = eval(File.read(GEMSPEC_FILE))
35
+ GEMSPEC.validate
36
+
37
+
38
+ desc %{
39
+ builds the gem and places it in pkg/
40
+ }
41
+ task :build do
42
+
43
+ sh "gem build #{GEMSPEC_FILE}"
44
+ sh "mkdir pkg" rescue nil
45
+ sh "mv #{GEMSPEC.name}-#{GEMSPEC.version}.gem pkg/"
46
+ end
47
+
48
+ desc %{
49
+ builds the gem and pushes it to rubygems.org
50
+ }
51
+ task :push => :build do
52
+
53
+ sh "gem push pkg/#{GEMSPEC.name}-#{GEMSPEC.version}.gem"
54
+ end
55
+
56
+
57
+ #
58
+ # rdoc
59
+ #
60
+ # make sure to have rdoc 2.5.x to run that
61
+
62
+ Rake::RDocTask.new do |rd|
63
+
64
+ rd.main = 'README.rdoc'
65
+ rd.rdoc_dir = 'rdoc'
66
+
67
+ rd.rdoc_files.include(
68
+ 'README.rdoc', 'CHANGELOG.txt', 'CREDITS.txt', 'lib/**/*.rb')
69
+
70
+ rd.title = "#{GEMSPEC.name} #{GEMSPEC.version}"
71
+ end
72
+
73
+
74
+ #
75
+ # upload_rdoc
76
+
77
+ desc %{
78
+ upload the rdoc to rubyforge
79
+ }
80
+ task :upload_rdoc => [ :clean, :rdoc ] do
81
+
82
+ account = 'jmettraux@rubyforge.org'
83
+ webdir = '/var/www/gforge-projects/ruote'
84
+
85
+ sh "rsync -azv -e ssh rdoc #{account}:#{webdir}/"
86
+ end
87
+
88
+
89
+ desc %{
90
+ attempt at detecting test methods with the same name
91
+ }
92
+ task :doublons do
93
+
94
+ lines = `grep -r " def test_" test/ | sort`.split("\n")
95
+ lines.inject(nil) do |previous, line|
96
+ puts line if line == previous
97
+ line
98
+ end
99
+
100
+ lines = `grep -r "TestCase" test/`.split("\n")
101
+ lines = lines.collect { |line| [ line, line.split(/\.rb:/).last ] }
102
+ lines = lines.sort_by { |line, klass| klass }
103
+ lines.inject(nil) do |previous, (line, klass)|
104
+ puts klass if line == previous
105
+ line
106
+ end
107
+ end
108
+
@@ -0,0 +1,488 @@
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] Jason Allen's check about concurrence
83
+ [x] on_cancel => 'error' NO
84
+ [o] event on [un]setting variable
85
+ [o] condition : != ~= >= ....
86
+ [o] fs_participant
87
+ [o] participant : do thread (and do_not_thread)
88
+ [o] add test for error replay in participant
89
+ [o] forget : participant ? subprocess ? everybody
90
+ [o] Ruote.VERSION = "2.0.0" for Kenneth
91
+ [o] on_timeout => 'part|sub' (idea by hassox)
92
+ [o] on_timeout => 'error' (idea by hassox)
93
+ [o] exp : concurrent-iterator < concurrence
94
+ [o] exp : reserve
95
+ [o] exp : unset
96
+ [o] exp : save
97
+ [o] exp : restore (and its set-fields alias)
98
+ [o] participant : if EM is present use next_ or defer instead of Thread.new
99
+ [o] XML process definitions
100
+ [o] remote process definitions
101
+ [o] json process definitions
102
+ [o] check nested ${f:a.b.c}
103
+ [o] test : participant in error timeout (error should cancel timeout)
104
+ [o] nested set wi.fields['a.b.0'] = x
105
+ [o] nested save wi.fields['a.b.0'] = x
106
+ [o] parser.rb : test security check
107
+ [o] add Ruote::Launchitem
108
+ [o] participant#cancel pass flavour as well nil|:kill|:timeout
109
+ [o] BlockParticipant : |workitem, fexp|
110
+ [o] listeners
111
+ [o] engine.wait_for
112
+ [o] func tests : wire assert_no_errors back in
113
+ [o] timeout set by participant [implementation]
114
+ [o] test for wfids of errors in subprocesses !
115
+ [o] Ruote::Exp:: namespace for expressions
116
+ [o] exp : apply (ex-eval)
117
+ [o] apply : attributes to variables
118
+ [o] subprocess : attributes to variables
119
+ [o] concurrent_iterator :times => X
120
+ [o] iterator defaults to :to_v => 'i'
121
+ [o] concurrent_iterator defaults to :to_v => 'i'
122
+ [o] set "f:x" => "blah"; set "v:y" => [ 1, 2 ] (defaults to f:)
123
+ [o] subprocess :ref => uri
124
+ [o] participants : pass the &block under the option :block
125
+ [o] concurrence : :over_unless
126
+ [x] engine#register_subprocess (replaced by engine#variables)
127
+ [x] switch to JSON friendly pers format for flow expressions
128
+ [o] switch to JSON friendly pers format for workitems
129
+ [o] rewind :ref => 'tag_of_cursor_exp' (direct) :tag oriented.
130
+ [o] exp : error
131
+ [o] wait 0.500 / wait 60
132
+ [x] exp : reval : not needed, participants are here
133
+ [o] exp : inc ? if target is array, becomes append (not cons)
134
+ [o] exp : dec ? if target is array, then pop (not car)
135
+ [o] _if '${f:x} == ${f:y}'
136
+ [x] equals : equals "v:v" => "true" NO => evokes assignment
137
+ [x] if : _if "v:v" => "true" ? NO => evokes assignement
138
+ [x] deferred apply technique / not OK, with EM and next_tick / pro
139
+ [o] reserve : perhaps it's better to have an atomic get and set variable...
140
+ [o] clean up lookup_var/set_var into locate_var/lookup_var/set_var
141
+ [x] Sun Hao's up-to-date-tree idea ${f:participant_name} ps#resolved_tree
142
+ [o] error : when an error expression is cancelled, should the err get remove
143
+ from the process status ? yes.
144
+ [o] file logger / history service
145
+ [o] engine.process_history(wfid)
146
+ [o] add_branch :times/:branches
147
+ [o] cursor : :break_if / :break_unless
148
+ [o] exp : when (exploit :var :set event, or frequency)
149
+ [o] when : restart test
150
+ [o] when : cron frequency
151
+ [o] let listeners accept launchitems
152
+ [o] exp : cron
153
+ [o] exp : every
154
+ [o] write rt test for 'timeout'
155
+ [o] undo exp : alias to 'cancel'
156
+ [o] Andrew's at for timeouts (Chronic maybe)
157
+ [x] timeout :at and :after (timeout expression vanished)
158
+ [x] listen : should it forget its triggered children ? yes
159
+ [o] limit the number of msgs returned
160
+ [o] should redo/undo follow the example of command and add_branches ?
161
+ everything through reply (receive)
162
+ should re_apply not touch the state of its expression ?
163
+ [o] test undo when cancelling parent expression
164
+ [o] issue with :unless => '${f:index} == 2000'
165
+ [o] implement Engine#reply (Engine simply has to include ReceiverMixin
166
+ [o] listeners X receivers
167
+ [o] add_service(name, path, klass, opts={}) opts local to services (really?)
168
+ [o] add_branches : pass message to concurrent_iterator like a command expression
169
+ [o] clean up persists present in #apply
170
+ [o] maybe cancel should have a safely / redo_reply thing
171
+ [o] implement Storage#clear!(type)
172
+ [o] ruote/util/time.rb utc_to_s 'YYYY/MM/DD' --> 'YYYY-MM-DD' (regex friendly)
173
+ [x] store participant bytecode/AST ?
174
+ [o] ${r:puts(d("f:nada"))}
175
+ [o] :ruby_eval_allowed vs 'ruby_eval_allowed'
176
+ [o] check : what if a reply on a concurrence wants to save, whereas the
177
+ concurrence terminated (got removed) meanwhile ?
178
+ the reply returns true...
179
+ [o] implement StorageHistory
180
+ [x] nuke FsHistory ? keep
181
+ [o] EngineParticipant
182
+ [x] expstorage.to_dot
183
+ [o] process_status.to_dot
184
+ [o] EngineParticipant : don't wait in case of forget (reply could NEVER come !)
185
+ [x] align :forget behaviour on EngineParticipant forget... OK as it is
186
+ [o] engine.re_apply(fei, wi) (thanks Torsten)... :wi => x, :tree => y...
187
+ [o] ruote-dm 2.1
188
+ [o] :tree => Ruote.to_tree { participant 'alpha' }
189
+ [o] implement == eql? hash for workitem
190
+ [o] StorageParticipant#query(wfid, participant_name, {fields})
191
+ [x] break fs_history, prepare for dm_history
192
+ [o] part = engine.register_participant :alpha, StorageParticipant should work...
193
+ [o] concurrence :merge_type => 'stack'
194
+ [o] CompositeStorage.new('msgs' => AmqpStorage.new(''), ...)
195
+ [x] let the storage participant leverage Ruote::FlowExpressionId.from_id(s)
196
+ [o] Andrew's technique http://groups.google.com/group/openwferu-users/browse_thread/thread/c2aa4b53d1664d45/8523a1a5ee98fd71
197
+ [o] Avishai : LocalParticipant : repost dispatch message
198
+ [o] Rdoc Ruote::Engine.register_participant -> passing a block to a participant
199
+ and perhaps also on
200
+ http://ruote.rubyforge.org/implementing_participants.html (Avish)
201
+ [o] wrap workitem in process error ? for on_error consumption (thanks Oleg)
202
+ doing workitem.fields['__error__'] = [ fei, time, error_message ]
203
+ [o] HashStorage should emit 'init persist fail' messages as well !
204
+ [o] Oleg's idea about participant on_reply
205
+ http://groups.google.com/group/openwferu-users/browse_thread/thread/2e6a95708c10847b
206
+ on_reply should be done in the receive action, not in Receiver
207
+ thus, in the ParticipantExpression
208
+ [x] exp : step (jump to cursor tag ?) : there is already the jump expression
209
+ [x] auto-participant re-apply
210
+ [o] receiver should be OK with a storage or a context
211
+ [x] Avishai : Worker : hook for rejecting the dispatch message
212
+ [o] receiver / local participant : reply/forward/proceed/... mess : fix
213
+ [o] storage participant : accept string for fei
214
+ [o] => Ruote::FlowExpressionId.extract(x)
215
+ [o] fei : place engine id in fei.to_storage_id (and back)
216
+ [o] wait_for(:inactive) blocks until worker is inactive
217
+ [o] storage0.copy_to(storage1) / migrate_to as requested by Matt Nichols
218
+ [o] check if rufus-lru is still needed
219
+ [o] storage migration : eats all the memory :(
220
+ [x] remove dependency on rufus-scheduler
221
+ [o] engine.storage_participant
222
+ [o] engine.noisy = true shortcut
223
+ [o] (ft_27) set "v:mypart" => [ 'MyParticipant', {} ]
224
+ binding a participant on the fly (just for this process)
225
+ [o] participant timeout as an instance method
226
+ [o] engine.process_wfids (lighter than engine.processes)
227
+ [o] storage.get_many(x, y, :descending => true) ?
228
+ [o] storage_participant.query : use skip and limit
229
+ [o] engine.processes use skip and limit
230
+ [o] engine.errors use skip and limit
231
+ [o] ParticipantEntry is a bit brittle when editing engine.participant_list
232
+ [o] use blank slate for process definition
233
+ [o] lib/ruote/svc for treechecker, error_handler and co (tree_checker)
234
+ [o] part/template.rb, use Rufus::Json.pretty_encode
235
+ [o] storage.clear OR storage.purge! OR both (cf discussion with marc_lee) !!
236
+ [o] Nathan : throw error on ${ruby:...} when ruby_eval_allowed is not set
237
+ [o] engine.kill and engine.cancel should accept fei, fexp or wfid
238
+ [o] participant params['tags'] = [ a, b, c ] ? costly (x expressions to read)
239
+ but passing them in the workitem could be fun
240
+ field['__tags__'] ?
241
+ [x] use treetop for more complex "${f:x} AND ${f:y}" ?
242
+ (systems like Rails require it anyway)
243
+ NO : using ruby_parser instead
244
+ [o] TreeChecker : exclude_fvccall :at_exit
245
+ [o] _if '${f:x} == ${f:y} || ${f:x} == ${f:z}'
246
+ [x] beanstalk [as a] workqueue ?
247
+ [o] tree.to_xml (require builder ?)
248
+ [o] tree.to_ruby
249
+ [o] __command__ + tag (rewind that cursor there, not the current one)
250
+ [o] rewind 'x' where x is a tagname (command x)
251
+ [o] solve the ps#root_expression_for(fei) dilemma
252
+ [x] condition : "${f:x} [is] empty" / this one is hard
253
+ [o] when : add test for cancelling when child has been triggered / is running
254
+ [o] engine.ps(wfid)
255
+ [x] alias "when" to "whenever" ?
256
+ [x] alias "when" to "on" / "upon"
257
+ [o] alias "when" to "once" "once x == y do"
258
+ [o] condition : "${'x} [is] empty" since ${array} => "[]"
259
+ [x] simple worker hooks ? (as discussed with @hassox)
260
+ on_terminate... ? only works in the same process as the worker
261
+ only for tests...
262
+ [o] on_error => retry / pass
263
+ [o] workitem : #as_json and #from_json
264
+ since ruote depends on rufus-json...
265
+ [x] engine.on_error = 'participant_name' // 'subprocess_name'
266
+ done at : http://github.com/jmettraux/ruote/commit/50292d954ff877f1f6615022216f346a7001b483
267
+ `--> reverting that for now, too dangerous
268
+ [o] process_count and error_count ? (processes(:count => true))
269
+ [o] exp : case (is it necessary ?) (guards ?) (hard for ruote-fluo)
270
+ [o] exp : lose
271
+ [o] conditional : rprefix ! ${r:x} is perhaps sufficient
272
+ [o] implement kill_process! (kill_expression! ?)
273
+ [o] /!\ resurrect CI
274
+ [o] user3 :rif => "!wi.fields['approvers'].include?('user3')" : 'in' operator
275
+ "${customer} in [ 1, 2, 3 ]"
276
+ "${customer} in { 'x' => 1 }"
277
+ [o] rename 'parser' to 'reader'
278
+ [o] ft_42 : maybe require storage to output ids already sorted
279
+ [o] Participant#rtimeout(workitem=nil)
280
+ [o] alias concurrent-iterator to citerator
281
+ [o] like we have a default WaitLogger, why not have a default HistoryLogger ?
282
+ so that context.history always returns something...
283
+ the default history would be storage based but with LRU turned on
284
+ for the HashStorage one...
285
+ like WaitLogger only remembers 147 msgs...
286
+ [o] StorageHistory : add a method to list all wfids (for by_wfid)
287
+ [o] DefaultHistory : add a method to list all wfids (for by_wfid)
288
+ [x] issue with ruote-kit and inpa participants...
289
+ [x] .nil? .empty? .set? for "${x}.nil?"
290
+ [o] BlockParticipant : proc.to_source thanks to sourcify
291
+ [o] register :overwrite { ... } ? (wipes all the participants)
292
+ [o] pause engine
293
+ [o] pause process instance
294
+ [o] filter : blank? equivalent (maybe it already exists)
295
+
296
+ [ ] exp : at expression ? comparable to cron
297
+ [x] exp : exp (restricted form of eval ?) (is it apply ?)
298
+ [x] exp : filter
299
+ [x] exp : filter-definition
300
+ [x] exp : parameter
301
+ [ ] exp : log : or could it be a participant ?
302
+
303
+ [ ] exp : defined (not really necessary)
304
+ [ ] exp : quote (not really necessary)
305
+ [ ] exp : field / attribute (not really necessary)
306
+ [ ] exp : variable (not really necessary)
307
+
308
+ [ ] define without name (__result__)
309
+
310
+ [ ] participant dispatch thread throttling ?
311
+
312
+ [ ] tailcall
313
+ [ ] subprocesses participants (alias ?)
314
+
315
+ [ ] recursion : should cope with modified trees 'main' => :tree ??
316
+
317
+ [ ] set :var => 'y' { '2342342' }
318
+
319
+ [ ] file/fs_listener [example] ?
320
+
321
+ [ ] concurrence / concurrent_iterator : merge plugin ?
322
+ use participant for that ?
323
+
324
+ [ ] restore : implement merge strategies
325
+
326
+ [ ] one file, no multi-process, persistence ? LateHashStorage ?
327
+
328
+ [ ] apply : ruby or xml (instead of just ast) ?
329
+
330
+ [ ] unify ruote/util/json and ruote/util/serializer
331
+
332
+ [ ] history.to_tree ?
333
+
334
+ [ ] Ruote.process_definition ... Ruote.method_missing or sequence ?
335
+
336
+ [ ] concurrence / concurrent_iterator : merge_type => 'discard' / 'ignore'
337
+ keep track of the first "process sub id" ?
338
+
339
+ [ ] @children diff/undiff idea ?
340
+
341
+ [ ] :on_timeout => :rewind (break, jump to x)...
342
+ [ ] :on_error => :rewind (break, jump to x)...
343
+
344
+ [o] cursor : 'reset' command ?
345
+ [ ] cursor : 'restart' alias for 'reset' ?
346
+ [ ] repeat : have a counter in a variable (:to => x maybe) (subprocessid ?)
347
+
348
+ [ ] engine.cancel_forgotten_children(wfid) ?
349
+
350
+ [ ] port subprocess on_cancel test from ruote 0.9 http://groups.google.com/group/openwferu-users/t/75f02bdadf7b93eb
351
+
352
+ [ ] double-check on_cancel rewrite (ft_1_process_status)
353
+
354
+ [ ] verify get_last/get_raw logic, no + 0.0001...
355
+ [x] spare 1 get_msg by caching msg (but keep 'deleting')
356
+ [ ] [un]set_var : via message ? should be ok like that... Not much traffic there
357
+
358
+ [ ] empty iterator or concurrent-iterator, log ? crash ? empty while...
359
+
360
+ [ ] remove abort_on_exception=true
361
+
362
+ [ ] shell ? irb ? Shell.new(storage)
363
+ [ ] focus on fulldup or json.dup (via fulldup ?)
364
+
365
+ [ ] should __error__ contain the tree ?
366
+ [ ] engine.on_cancel = 'participant_name' // 'subprocess_name'
367
+ bof
368
+
369
+ [ ] participant :ref => '${f:nada}', :or => 'xyz'
370
+ (look at OpenWFE manual, this feature already existed in there)
371
+ http://www.openwfe.org/manual/ch06s02.html#expression_participant
372
+ else-ref... list of participants...
373
+ ref="alpha && bravo", ref="alpha||bravo" (|| parallel :( )
374
+
375
+ [ ] LocalParticipant def consume; handle; reply; end
376
+
377
+ [ ] find better solution than "get all schedules"
378
+
379
+ [ ] worker : minuteman, make it cron triggerable
380
+ trap SIGUSR1 or USR2
381
+ maybe it's expensive to fire a [worker] process each minute
382
+ have to write the $$ (pid) somewhere for cron to pick it up
383
+
384
+ [ ] toto :task => 'maw the lawn', :within => '3d'
385
+ alias to timeout
386
+ [ ] "business days" plugin
387
+ [ ] participant 'toto', :while => '${not_good}' (really ?)
388
+
389
+ [ ] re_apply_stalled
390
+ http://groups.google.com/group/openwferu-users/browse_thread/thread/ff29f26d6b5fd135
391
+
392
+ [ ] engine.purge (arts style : worker.@msgs = [])
393
+
394
+ [ ] http://ruote.rubyforge.org/irclogs/ruote_2010-07-07.txt
395
+ configuration issue
396
+ maybe fail with a good error message when registering service...
397
+
398
+ [ ] engine.register_from_dir() have a way to re-evaluate the dir
399
+ [o] OR remove engine.register_from_dir()
400
+ [o] AND provide a better register &block
401
+ [o] provide a mean for a participant to reject a workitem (intra plist)
402
+ on_reply and now filter ?
403
+
404
+ [ ] StorageParticipant#by_store[_name]
405
+ maybe : reform the store_name system !
406
+
407
+ [ ] a run of ruby -w
408
+
409
+ [x] cursor : previous_command field ? not really necessary with :break_if => x
410
+
411
+ [ ] storage_participant.by_participant([ a, b, c, d ], opts)
412
+ storage_participant.by_participant(a, b, c, d, opts) too
413
+ leverage things like
414
+ http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options
415
+ 2.1.12
416
+
417
+ [ ] receiver/base.rb : fexp.lookup_variable --> lookup_variable ?
418
+
419
+ [ ] engine/receiver #reply(workitem or fexp or fei) ?
420
+ [ ] workitem : short constructor, cf http://groups.google.com/group/openwferu-users/browse_thread/thread/c52d207d85e4b93e
421
+ [ ] engine.force_reply_to_parent(fei) ?
422
+ but, this is a cancel_expression(fei)
423
+
424
+ [ ] concurrence : add_child ?
425
+ How would that impact concurrent_iterator's add_branches ?
426
+ [ ] detach / attach segments of processes
427
+ [x] clone process ? (could be used by {de|at}tach)
428
+ what about participants ?
429
+
430
+ [ ] console for InformatiQ / console or dashboard or tool ?
431
+ [ ] pooltool.ru : there are already storage copy methods
432
+
433
+ [o] doc : enhance doc on conditional (and, empty, null, ...)
434
+ [o] doc : document engine.on_{error|terminate}
435
+ [o] doc : document on_error = retry and on_error = pass
436
+ [ ] doc : add piece of doc about running workers on their own
437
+
438
+ [o] listen to errors {in|out}
439
+ well... there is already on_error...
440
+ but on_error is for nested stuff...
441
+ [o] listen to tags {entering|leaving}
442
+ [x] listen to launch/terminate, listen :process => :x, :upon => 'launching'
443
+ you can now set :tag on a subprocess' define
444
+ [ ] listen to [un]set variable (the events are already in there)
445
+ not really necessary... there is already 'once' (when)
446
+ [o] listen condition ? :when => '${x} == y', :constraint, :only, ...
447
+ it's :where and it's not documented :-( but it's tested :-)
448
+ [o] engine#on_terminate, similar to on_error
449
+ [o] let engine#on_error use svc/tracker.rb instead of 'notifications'
450
+ [ ] process supervise other process, listen...
451
+ launch a process with a designed 'supervisor' ?
452
+ listen to termination, listen to error, for a given process ?
453
+
454
+ [ ] ruote cheatsheet
455
+ [ ] ruote slides
456
+
457
+ [x] ci : ruote-amqp
458
+ [ ] ci : ruote-mongodb
459
+ [ ] ci : jruby
460
+
461
+ [ ] StorageParticipant#proceed : raise if workitem not found ?
462
+ [ ] StorageParticipant#proceed : accept fei ?
463
+ [ ] Engine#reply(wi), should remove from storage...
464
+
465
+ [ ] eft_18 weak with jruby-1.5.1 and 1.5.6
466
+
467
+ [ ] participant : consume/cancel/accept?/on_reply without params
468
+
469
+ [ ] worker identification/registration
470
+ http://groups.google.com/group/openwferu-users/browse_thread/thread/c51b94fb8bb685da
471
+ [ ] worker shutdown initiated by engine (same thread)
472
+
473
+ [ ] wait_for(:participant) what about 'dispatched' instead of 'dispatch' ?
474
+
475
+ [ ] expression :concurrent => true idea (reply immediately, cancellable)
476
+
477
+ [ ] @engine.context['trust_block_participants'] = true
478
+ [ ] @engine.context['trust_code_participants'] = true
479
+ [ ] @engine.register(x, :trusted => true, &block)
480
+ [ ] security service ? context['x'] but then, more advanced behaviours
481
+
482
+ [o] register :toto, :accept? => lambda { |workitem| ... }
483
+ [o] register :toto, :do_not_thread => lambda { |workitem| ... }
484
+
485
+ [x] investigate 1.9's json
486
+ [ ] Parslet for conditions ?
487
+ [ ] enhance radial/Parslet error messages (cf Raphael)
488
+