TODO.txt in ruote-2.1.11 vs TODO.txt in ruote-2.2.0

- old
+ new

@@ -77,11 +77,10 @@ [o] engine.processes() [o] kill_process != cancel_process (need a way to not trigger on_cancel) [o] pdef.to_dot (a beginning) [o] @in_cancel, @in_error --> @state (active|cancelling|killing) [o] wait -[o] listen [o] Jason Allen's check about concurrence [x] on_cancel => 'error' NO [o] event on [un]setting variable [o] condition : != ~= >= .... [o] fs_participant @@ -232,56 +231,95 @@ [o] ParticipantEntry is a bit brittle when editing engine.participant_list [o] use blank slate for process definition [o] lib/ruote/svc for treechecker, error_handler and co (tree_checker) [o] part/template.rb, use Rufus::Json.pretty_encode [o] storage.clear OR storage.purge! OR both (cf discussion with marc_lee) !! +[o] Nathan : throw error on ${ruby:...} when ruby_eval_allowed is not set +[o] engine.kill and engine.cancel should accept fei, fexp or wfid +[o] participant params['tags'] = [ a, b, c ] ? costly (x expressions to read) + but passing them in the workitem could be fun + field['__tags__'] ? +[x] use treetop for more complex "${f:x} AND ${f:y}" ? + (systems like Rails require it anyway) + NO : using ruby_parser instead +[o] TreeChecker : exclude_fvccall :at_exit +[o] _if '${f:x} == ${f:y} || ${f:x} == ${f:z}' +[x] beanstalk [as a] workqueue ? +[o] tree.to_xml (require builder ?) +[o] tree.to_ruby +[o] __command__ + tag (rewind that cursor there, not the current one) +[o] rewind 'x' where x is a tagname (command x) +[o] solve the ps#root_expression_for(fei) dilemma +[x] condition : "${f:x} [is] empty" / this one is hard +[o] when : add test for cancelling when child has been triggered / is running +[o] engine.ps(wfid) +[x] alias "when" to "whenever" ? +[x] alias "when" to "on" / "upon" +[o] alias "when" to "once" "once x == y do" +[o] condition : "${'x} [is] empty" since ${array} => "[]" +[x] simple worker hooks ? (as discussed with @hassox) + on_terminate... ? only works in the same process as the worker + only for tests... +[o] on_error => retry / pass +[o] workitem : #as_json and #from_json + since ruote depends on rufus-json... +[x] engine.on_error = 'participant_name' // 'subprocess_name' + done at : http://github.com/jmettraux/ruote/commit/50292d954ff877f1f6615022216f346a7001b483 + `--> reverting that for now, too dangerous +[o] process_count and error_count ? (processes(:count => true)) +[o] exp : case (is it necessary ?) (guards ?) (hard for ruote-fluo) +[o] exp : lose +[o] conditional : rprefix ! ${r:x} is perhaps sufficient +[o] implement kill_process! (kill_expression! ?) +[o] /!\ resurrect CI +[o] user3 :rif => "!wi.fields['approvers'].include?('user3')" : 'in' operator + "${customer} in [ 1, 2, 3 ]" + "${customer} in { 'x' => 1 }" +[o] rename 'parser' to 'reader' +[o] ft_42 : maybe require storage to output ids already sorted +[o] Participant#rtimeout(workitem=nil) +[o] alias concurrent-iterator to citerator +[o] like we have a default WaitLogger, why not have a default HistoryLogger ? + so that context.history always returns something... + the default history would be storage based but with LRU turned on + for the HashStorage one... + like WaitLogger only remembers 147 msgs... +[o] StorageHistory : add a method to list all wfids (for by_wfid) +[o] DefaultHistory : add a method to list all wfids (for by_wfid) +[x] issue with ruote-kit and inpa participants... +[x] .nil? .empty? .set? for "${x}.nil?" -[ ] exp : exp (restricted form of eval ?) -[ ] exp : case (is it necessary ?) -[ ] exp : filter -[ ] exp : filter-definition -[x] exp : lose ? +[ ] exp : exp (restricted form of eval ?) (is it apply ?) +[x] exp : filter +[x] exp : filter-definition [x] exp : parameter [ ] exp : log : or could it be a participant ? [ ] exp : defined (not really necessary) [ ] exp : quote (not really necessary) [ ] exp : field / attribute (not really necessary) [ ] exp : variable (not really necessary) -[ ] conditional : rprefix ! ${r:x} is perhaps sufficient - [ ] define without name (__result__) -[ ] pooltool.ru - [ ] participant dispatch thread throttling ? [ ] tailcall [ ] subprocesses participants (alias ?) -[ ] __command__ + tag (rewind that cursor there, not the current one) - -[ ] beanstalk [as a] workqueue ? - [ ] recursion : should cope with modified trees 'main' => :tree ?? -[ ] user3 :rif => "!wi.fields['approvers'].include?('user3')" : 'in' operator - [ ] set :var => 'y' { '2342342' } [ ] pause engine [ ] pause process instance | would it mean something like placing a paused list in the storage and fetching it all the time ? [ ] file/fs_listener [example] ? -[ ] tree.to_xml (require builder ?) -[ ] tree.to_rb - [ ] concurrence / concurrent_iterator : merge plugin ? use participant for that ? [ ] restore : implement merge strategies @@ -298,110 +336,144 @@ [ ] concurrence / concurrent_iterator : merge_type => 'discard' / 'ignore' keep track of the first "process sub id" ? [ ] @children diff/undiff idea ? -[ ] write doc about engine options (multi-process !) -[ ] _if '${f:x} == ${f:y} || ${f:x} == ${f:z}' - -[ ] document the dollar notation / substitution / extrapolation - -[ ] condition : "${f:x} [is] empty" / this one is hard - -[ ] ruote/exp/fe_set.rb:147: warning: already initialized constant PREFIX_REGEX - -[ ] implement kill_process! (kill_expression! ?) - -[ ] engine.force_reply_to_parent(fei) ? - [ ] :on_timeout => :rewind (break, jump to x)... -[ ] rewind 'x' where x is a tagname (command x) +[ ] :on_error => :rewind (break, jump to x)... [ ] repeat : have a counter in a variable (:to => x maybe) (subprocessid ?) -[ ] when : add test for cancelling when child has been triggered / is running - [ ] engine.cancel_forgotten_children(wfid) ? [ ] port subprocess on_cancel test from ruote 0.9 http://groups.google.com/group/openwferu-users/t/75f02bdadf7b93eb [ ] double-check on_cancel rewrite (ft_1_process_status) [ ] verify get_last/get_raw logic, no + 0.0001... -[ ] case exp : smarter one ? [ ] spare 1 get_msg by caching msg (but keep 'deleting') [ ] [un]set_var : via message ? should be ok like that... Not much traffic there [ ] empty iterator or concurrent-iterator, log ? crash ? empty while... -[ ] at expression ? [ ] remove abort_on_exception=true [ ] shell ? irb ? Shell.new(storage) [ ] focus on fulldup or json.dup (via fulldup ?) -[ ] listen to participants/errors/tags {in|out} - -[x] engine.on_error = 'participant_name' // 'subprocess_name' - done at : http://github.com/jmettraux/ruote/commit/50292d954ff877f1f6615022216f346a7001b483 - `--> reverting that for now, too dangerous - -[ ] should __error__ contain the tree ? +[ ] should __error__ contain the tree ? [ ] engine.on_cancel = 'participant_name' // 'subprocess_name' + bof -[ ] "business days" plugin - -[ ] issue with ruote-kit and inpa participants... - [ ] participant :ref => '${f:nada}', :or => 'xyz' (look at OpenWFE manual, this feature already existed in there) http://www.openwfe.org/manual/ch06s02.html#expression_participant else-ref... list of participants... ref="alpha && bravo", ref="alpha||bravo" (|| parallel :( ) [ ] LocalParticipant def consume; handle; reply; end -[ ] lib/ruote/part/participant_list.rb l176 better error message ! - [ ] find better solution than "get all schedules" [ ] worker : minuteman, make it cron triggerable trap SIGUSR1 or USR2 maybe it's expensive to fire a [worker] process each minute have to write the $$ (pid) somewhere for cron to pick it up -[ ] detach / attach segments of processes -[ ] clone process ? (could be used by {de|at}tach) - -[ ] dollar.rb ${timestamp} ? - [ ] toto :task => 'maw the lawn', :within => '3d' + alias to timeout +[ ] "business days" plugin +[ ] participant 'toto', :while => '${not_good}' (really ?) -[ ] solve the ps#root_expression_for(fei) dilemma - [ ] re_apply_stalled http://groups.google.com/group/openwferu-users/browse_thread/thread/ff29f26d6b5fd135 [ ] engine.purge (arts style : worker.@msgs = []) [ ] http://ruote.rubyforge.org/irclogs/ruote_2010-07-07.txt configuration issue maybe fail with a good error message when registering service... -[ ] participant 'toto', :while => '${not_good}' (really ?) - [ ] engine.register_from_dir() have a way to re-evaluate the dir [o] OR remove engine.register_from_dir() [o] AND provide a better register &block [o] provide a mean for a participant to reject a workitem (intra plist) on_reply and now filter ? -[ ] rw : upgrade [register_]participant documentation - [ ] StorageParticipant#by_store[_name] maybe : reform the store_name system ! -[ ] rename 'parser' to 'reader' +[ ] a run of ruby -w -[ ] process_count and error_count ? (processes(:count => true)) -[ ] engine.ps(wfid) (shortcut ?) +[x] cursor : previous_command field ? not really necessary with :break_if => x + +[ ] register :overwrite { ... } ? (wipes all the participants) + +[ ] storage_participant.by_participant([ a, b, c, d ], opts) + storage_participant.by_participant(a, b, c, d, opts) too + leverage things like + http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options + 2.1.12 + +[ ] receiver/base.rb : fexp.lookup_variable --> lookup_variable ? + +[ ] engine/receiver #reply(workitem or fexp or fei) ? +[ ] workitem : short constructor, cf http://groups.google.com/group/openwferu-users/browse_thread/thread/c52d207d85e4b93e +[ ] engine.force_reply_to_parent(fei) ? + but, this is a cancel_expression(fei) + +[ ] at expression ? :names :wait, :at + +[ ] concurrence : add_child ? + How would that impact concurrent_iterator's add_branches ? +[ ] detach / attach segments of processes +[ ] clone process ? (could be used by {de|at}tach) + +[ ] console for InformatiQ / console or dashboard or tool ? +[ ] pooltool.ru : there are already storage copy methods + +[ ] BlockParticipant : proc.to_source thanks to sourcify + +[o] doc : enhance doc on conditional (and, empty, null, ...) +[o] doc : document engine.on_{error|terminate} +[o] doc : document on_error = retry and on_error = pass +[ ] doc : add piece of doc about running workers on their own + +[ ] listen to errors {in|out} + well... there is already on_error... + but on_error is for nested stuff... +[o] listen to tags {entering|leaving} +[x] listen to launch/terminate, listen :process => :x, :upon => 'launching' + you can now set :tag on a subprocess' define +[ ] listen to [un]set variable (the events are already in there) + not really necessary... there is already 'once' (when) +[o] listen condition ? :when => '${x} == y', :constraint, :only, ... + it's :where and it's not documented :-( but it's tested :-) +[o] engine#on_terminate, similar to on_error +[o] let engine#on_error use svc/tracker.rb instead of 'notifications' + +[ ] ruote cheatsheet +[ ] ruote slides + +[ ] process supervise other process, listen... + launch a process with a designed 'supervisor' ? + +[x] ci : ruote-amqp +[ ] ci : ruote-mongodb +[ ] ci : jruby + +[ ] StorageParticipant#reply : raise if workitem not found ? +[ ] StorageParticipant#reply : accept fei ? +[ ] Engine#reply(wi), should remove from storage... + +[ ] eft_18 weak with jruby-1.5.1 and 1.5.6 + +[ ] participant : consume/cancel/accept?/on_reply without params + +[ ] worker identification/registration + http://groups.google.com/group/openwferu-users/browse_thread/thread/c51b94fb8bb685da +[ ] worker shutdown initiated by engine (same thread) + +[ ] wait_for(:participant) what about 'dispatched' instead of 'dispatch' ? + +[ ] expression :concurrent => true idea (reply immediately, cancellable)