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,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
+