fix issue with @seen in wait_logger on JRuby (thanks Mark Wotton)
Receiver#flunk accepts stacktrace as final argument
allow for “1x == 2x” (turn it into “‘1x’ == ‘2x’”) (== and !=)
fix parsing ‘2013-02-08T17:36:10Z’ (reported by Hartog de Mik)
pin ruote.gemspec to ruby_parser ~>2.3 and parslet 1.4.0
add Ruote.camelize
expose ‘history_max_size’ config option
Dashboard#get_trackers
Dashboard#remove_tracker(fei_sid_or_id, wfid)
:await attribute
let Ruote.deep_mutate mutate matching keys and their collection values
stop tripping on empty tags (“”)
jump to ‘x’ where x in “participant ‘x’” unlocked (thanks Tobias Neubert)
unlock on_error more (on_error: “retry * 3, pass” for example)
revise “$x” (literal dollars), now return nil instead of “$x” when missing
_auto_remove (and _alter) for trackers (pause on apply++)
pause on apply concept brought in
Dashboard#add_tracker
Dashboard#attach(fei, pdef)
participanton_error
pin ruote.gemspec to blankslate 2.1.2.4 (since blankslate 3.1 is out and Parslet wants ~> 2.1…)
FlowExpression#root(stubborn=false)
Dashboard#wait_for(‘action’ => ‘apply’, ‘name’ => ‘wait’)
past_tags: track variables
Workitem#launched_at and sub_wf_launched_at
Ruote.deep_delete and .deep_mutate
Ruote::Observer (a base classing for observing a ruote engine's activity)
Dashboard#respark(wfid, opts={})
StorageBase#dump: go with YAML
on_error: !immediate
“kill” expression (undo/cancel alias)
${tags}, ${tag} and ${full_tag}
StorageParticipant#flunk(workitem, err, *err_args)
ReceiverMixin#flunk(workitem, err, *err_args)
workitem: sub_wf_name and sub_wf_revision
new ‘raise’ msg for passing back errors to worker
participanton_apply
push/pop specialized aliases for inc/dec
inc/dec: ‘v:x’ => 2 shortcut
inc/dec: drop default ‘v:d’ and accept nested {in|de}crement
‘participant_in_variable_enabled’ switch
make re_apply use the applied workitem by default
${mnemo_id} (along with ${expid} and ${subid})
Dashboard#remove_process (idea Claudio Petasecca Donati)
re_dispatch bug fix (patch by Doug Bryant)
on_error/on_timeout: cancel/cando
Worker#handle_step_error(e, msg) enhancements
cancel “flavour” rebound
Dashboard#logger shortcut
:on_error => ‘raise’
:over_if bug fix (reported by Alex Wang)
:merge_type => ‘deep’ (idea Jim MarsBomber Li)
Dashboard#launch accepts :wfid “field”, custom wfid
kill_process expression (and on_error)
the “second take” (on_error, on_cancel)
Ruote.tree(&block) alias to Ruote.to_tree(&block)
added ‘tree’ entry to error doc and error msg
error handler $f:__error__: added ‘tree’ entry
wfid_generator: dropping the @last concept
wait_for(:x, :or_error) (thanks John Roberts)
concurrence over_if bug (thanks alexw668)
concurrence and citerator :remaining => ‘wait’ (idea Pedro Visintin)
set ‘v:x’ => ‘y’, :over => true/‘sub’
concurrence and citerator :count => -x (all but x)
“await” expression, successor to “listen”
root expression: past_tags variable
full tags
concurrence and citerator: :count => 0 (immediate reply)
iterator and concurrent-iterator: implicit sequence
iterator: stopped creating new variable scope
:vars_to_f common attribute
:scope => true forces a new variable scope
subprocess ‘field:x’ => ‘y’ (variables and now fields)
Dashboard#worklist (alias for Dashboard#storage_participant)
set: now accepting children (and behaving like a sequence)
[un]set: setting __result__
concurrence :wait_for => ‘alpha, bravo’ (idea Raphael Simon)
BlockParticipant: nicer multi blocks
Dashboard cancel and kill now accept options
StorageParticipant reserve and delegate
‘terminated/ceased’ msg: include root exp variables
Dashboard#worker_state (running/paused/stopped)
define :on_terminate => :regenerate
:on_error => ‘5m: retry * 3, 10m: retry’
:on_error => ‘5m: retry, 2m: retry, pass’
dsub for attribute keys as well
conf option: ‘worker_info_enabled’ (defaults to true, enabled)
Dashboard#register saves list in one batch (unless :clear => true)
DefaultHistory include Enumerable
Dashboard#wait_for(action_name) (dispatch, cancel, reply, …)
merged TestLogger into WaitLogger
:take and :discard common attributes
filter: ‘take’ and ‘discard’
Participant: on_cancel -> false prevents on_cancel reply
LocalParticipant is_gone? is_cancel[l]ed?
Dashboard#worker_info
msg: put_doc, low-level action
participant: rtimers, rtimeout and timers
lose and forget expressions: aligned ‘multi’ behaviour
concurrence and citerator: :merge_type => ‘ignore’
:timers error, redo/retry, undo/pass and commands
:timers common attribute
:flank common attribute
Storage#done(worker, msg) optional method
get_many :batch option (used by some storages for optimization)
‘stall’ expression (mostly for testing)
context and worker : subscription reworked
worker: ‘restless_worker’ option
Ruote::Dashboard (will slowly phase Ruote::Engine out)
:on_timeout => ‘rewind’, :on_timeout => ‘jump to alpha’
:on_error => ‘rewind’, :on_error => ‘jump to alpha’
dispatch_pool and context
participant params.__children__
on_error expression
concurrence :merge_type => ‘concat’ (vs ‘union’) (Thanks Julien France)
Workitem#re_dispatch_count
Engine#launch(pdef, fields, vars, root_stash)
Workitem #[] amd #[]= (lookup and set_field shortcuts)
LocalParticipant#lookup_variable(key)
LocalParticipant / Receiver : stash_get / stash_put
LocalParticipant implicit participant_name
LocalParticipant implicit workitem, fei, flavour and fexp
Participant on_workitem, dont_thread?, etc
FlowExpression root and root_id
dollar substitution in expression name as well
Engine#replay_at_error(err_or_fei_or_wi)
Engine#error(wi_or_fei)
storages: replace_engine_configuration(opts)
FsStorage: saving newer configuration (Thanks Nicholas Faiz)
ProcessStatus context: linking expression <-> error
ProcessStatus#root_workitem
ProcessStatus#leaves
filter ‘includes’ and ‘is’ (Thanks Nando Sola)
trailing fields (a Simone Carletti idea)
concurrence vs history issue fixed (Thanks Juris Galang)
unset and fields: made sure the field is removed (Thanks jpgilman)
sourcify, using to_raw_source from now on
filter expression and blocks
set ‘v:display’ => ‘echo’, aliasing of expressions
Reader.read(s): better error raised when failed to ‘parse’
:on_field => ‘my.nested.field’ now possible
[concurrent-]iterator :to => ‘v:x’ / ‘f:y’ / ‘y’
concurrence :merge_type => ‘union’
Reader.to_radial(tree)
Workitem#param_or_field(key) and field_or_param(key)
Workitem#param_text
ProcessError#deviations (cf filter and Ruote::ValidationError)
reworked (process definition) Reader
filter top-level ‘or’
filter field => ‘x|y’ (or on field names)
‘radial’ process definitions
fixed Tracker#add_tracker (2nd try) issue (Thanks Pedro Texeira)
Engine#register :on_workitem / :on_reply / …
set ‘v:participant’ => lambda { |wi| wi.fields = ‘y’ }
listen :to => :errors, :class => string / :message/:msg => string / regex
listen :to => :errors
dropped require ‘json’ and co from fs_storage (Thanks Torsten)
cursor : ‘reset’ command and :reset_if attribute
Engine#resume(wfid, :anyway => true) resumes any paused expression in a given process
Engine#pause(fei, :breakpoint => true) pauses only one expression (and not its children)
CompositeStorage#delete_schedule fix (Thanks Greg)
read ‘’|‘file’, :to => ‘f:a’ / :to => ‘v:b’
save :to => ‘f:a’ / :to => ‘v:b’
pause(fei/wfid), resume(fei/wfid)
participant list, multiple participants with same regex now ok, allowing for cascading participants (at consume and at on_error)
register block : fixed issue with lonely pname and block
register_participant : after/before/over
register block : now clearing by default
fixed issue with deep set and unset (Thanks Nando Sola)
improved conditional evaluation for dollar notation
register block : catchall and catch_all
Workitem wf_name and wf_revision
StorageParticipant :skip and :limit issues (Thanks Jan Topiński)
StorageParticipant proceed deprecates reply
fix for :if => ‘${a}’ when a like ‘456ab’ (Thanks John Le)
StorageParticipant :count => true uniformization (Thanks Jan Topiński)
StorageParticipant#by_fei (alias for #[])
Engine#participant(name) returns an instance of any participant
:filter => ‘participant_name’ (consume(wi) / filter(fields))
listen block and forget issue fixed (Thanks Nando Sola)
@msg always set in FlowExpression
aliased ‘cancel_process’ to ‘terminate’
Engine#leftovers (Thanks Iuri)
$x, $f:x and $v:y vs ${x}, ${f:x} and ${v:y} (literally)
:filter common attribute
Participant#do_not_thread : optional workitem parameter
filter expression
LocalParticipant / Receiver applied_workitem(fei)
using Sourcify to store block participant’s code as a string
CompositeStorage#delete bug fix (Thanks Claudio)
ParticipantList#register bug fix (Thanks ‘sandbox’)
StorageHistory#wfids and DefaultHistory#wfids
Engine#history -> DefaultHistory (keeping the last 1000 msgs)
‘citerator’ alias to ‘concurrent_iterator’
Participant#rtimeout(workitem) (optional)
moved Engine#workitem(fei) to ReceiverMixin
storagedelete_schedule ignoring nil schedule_id
Participant rtimeout instead of timeout
StorageParticipant making @options available
Engine#register, allowing block participants (Thanks Hery)
fixed Engine#launch_single relaunch issue (Thanks Gonzalo)
‘rset’, an alias for the ‘set’ expression (Thanks Rebo)
listen :to => /x/ or “/x/” required for regular expressions
engineon_terminate = participant_name / subprocess_name / tree
listen :to => ‘tagname’, :upon => ‘entering’ / ‘leaving’
Ruote::Parser becomes Ruote::Reader
:if => “${customer} in ${customer_list}”, :if => “4 in {4 => 5}”
Ruote::Workitem .from_json as_json
:on_error => redo/retry // undo/pass
given : a case/switch ruote equivalent
conditionals : “${x} is empty” and “${x} is null”
once expression (once, _when, as_soon_as)
let expression (a sequence with its own variable scope)
engine.ps(wfid=nil)
once : made sure child is cancelled as well
:if => ‘${f:a} and ${f:b}’
workitem.tags (workitem[‘__tags__’]
better participant initialization (Thanks Neil Pennell)
Engine cancel and kill (expression or process, whichever)
subid (sub_wfid) for every expression
undo and redo : more robust (broken tags)
cursor : giving a sub_wfid to children (play nice with :forget)
Ruote.is_tree?(o) .is_definition_tree?(o) consolidated
engineon_error = [] registering error notifications and the like
engineconfiguration(key) (counterpart to engineconfigure(key, value))
implemented the :lose attribute
implemented the ‘lose’ expression
fixed issue with “over” (Thanks Daniel ‘hassox’ Neighman)
fixed issue with workitem.command = ‘jump to x’ (Thanks Fix Peña)
fixed issue with ProcessStatus#position and errors in ParticipantExpression (Thanks Eric Smith)
‘registerp’ and ‘unregisterp’ expressions
${r:xxx} when ruby_eval_allowed == false now raises an error
Engine#process broken with process where schedule count > 1 (Thanks David)
Engine#launch_single for 1! instance processes (Thanks Eric)
Workitem#command and command= helpers
ProcessError#workitem helper
fetch_flow_expression made public and aliased to fexp
${r:workitem_field} (idea: Nathan Stults)
made Ruote.dsub a service : @context.dollar_sub.s(…) (idea: Nathan Stults)
moved simpler services to ruote/svc/
using BlankSlate for ruby process definitions
Engine.new(worker, :join => true) will let the worker run in the current thread (and not return)
StorageParticipant#query(:count => true)
storage.get_many(type, keys, :descending => true)
engine.processes(:skip => 50, limit => 50)
listen expression : using lwfid instead of wfid (storage change)
fixed issue when re-applying root expressions (Thanks Brett)
storage_participant.query using :skip and :limit
engine.schedules() and ProcessStatus#schedules
differentiating on_re_apply from on_cancel (process gardening)
engine.participant_list= more tolerant about its input
engine.process(wfid).stored_workitems
engine.process(wfid).workitems and .position
engine.process(wfid).last_active
engine.errors(wfid=nil) now returns array of ProcessError instances
engine.register { block } (Torsten)
participant.accept?(workitem)
‘ref’ expression (pointing to participants or subprocesses)
engine.process_wfids (list process instance wfids)
set ‘v:alpha’ => [ ‘MyParticipant’, { ‘flavour’ => ‘vanilla’ }] participants registered as variables (just for that process instance)
engine.participant_list and .participant_list=
engine.register_participant ‘al’, ‘AlParticipant’, :require_path => ‘pa/th’
engine.register_participant ‘al’, ‘AlParticipant’, :load_path => ‘pa/th’
engine.register for .[un]register_participant
engine.noisy = true (a shortcut)
engine.storage_participant (a shortcut)
removed direct dependency on rufus-lru
WaitLogger : a transient @seen (Thanks Kaspar)
error_handler : more error catching
storagecopy_to(other_storage) item by item implementation
Engine#wait_for OK with multiple threads
ExpressionMap now loads all expressions in Ruote::Exp |
namespace |
‘error_intercepted’ msg now features error_class, _message and _backtrace (RM)
Engine#join and Worker#join
workitem.error now includes error’s backtrace (contributed by Rich Meyers)
storagecopy_to(other_storage) implemented
launch moved from Engine to ReceiverMixin
participants without initialize(opts) are now allowed
engine.wait_for(:inactive)
engine.wait_for(*interests) unlocked
engine.wait_for(:empty)
fixed issue with participant ‘x’ and :on_error. Thanks Oleg.
receiver : reply and reply_to_engine : from aliases to wrappers
Ruote::StorageParticipant more flexibility for method args
Ruote::FlowExpressionId .extract_h and .extract
dropped fs_history (storage_history is better)
parser to_xml _if ‘x == b’ –> <if test=“x == b”>
workitem.sid shortcut for workitem.fei.to_storage_id
workitem.wfid shorcut for workitem.fei.wfid
new error_handler service
Receiver.new(x), x can be worker, engine, context or storage
Participant#on_reply(workitem) manipulating workitems when they come back
set ‘${v:customers.0.name}’ => ‘x’ now OK, was limited to fields. Thanks Oleg
LocalParticipant#put(fei, hash) get(fei, key) for stashing info
LocalParticipant#re_dispatch(wi, opts)
bug in HashStorage, apply over apply didn’t raise a persist error. Fixed.
keeping track of workitem fields as they were right before a participant error
Workitem.error holds the error when on_error. Thanks Oleg.
Workitem#error and Workitem#timed_out shortcuts
participant :on_error => ‘x’ broken. Fixed. Thanks Oleg.
Engine#workitem(fei) for advanced users
LocalParticipant : added a reject(workitem) method
participant exp : dispatched = true set right after dispatch
made participant.cancel occur asynchronously (as should be)
lookup_variable : making sure not to break when the parent exp is gone
workitem.fields is now set
participantschedule_timeout workaround for issue with JRuby 1.4.0 (1.8.7)
implemented Ruote::CompositeStorage
leveraging rufus-cloche 0.1.16 and the ‘cloche_nolock’ option (FsStorage)
SmtpParticipant and ruote/part/template.rb reorganization
StorageParticipant when returned by engineregister was unusable. Fixed.
string keys for SmtpParticipant. Thanks Gonzalo
fixed every(‘10m’) bug. Thanks Gonzalo Suarez
Ruote::FlowExpressionId.from_id(s) more permissive
concurrence (and concurrent-iterator) :merge_type => :stack
now works on WinXP, Ruby 1.8.7
reformed msgs ids and adapted Ruote::StorageHistory
engine.register_participant(x, Ruote::StorageParticipant) now returning a instance of the participant, for easy query
StorageParticipant, added query(criteria), thanks Torsten and Brett
Ruote::Workitem lookup('deep.field') and set_field('deep.field') are back
Ruote::Workitem added == and hash (list.uniq friendly), thanks Brett
Engine#configure(key, value), thanks Torsten
Ruote.to_tree (lightweight version of Ruote.process_definition)
ParticipantList#names, thanks Kenneth
welcoming ruote-dm (datamapper persistency)
Engine#re_apply(fei, opts) where opts in [ :tree, :fields, :merge_in_fields ]
fixed issue about StorageParticipant#update, thanks Torsten
fixed StorageParticipant a to b flow, fix by Torsten
fixed StorageParticipant#cancel
dollar : made sure of ${fei} and ${wfid}
implemented ProcessStatus#to_dot
if a participant implementation cancel method returns false, reply_to_parent will not get called
changes about errors without [stored] expressions, they now appear in process statuses
EngineParticipant implemented
‘ruby_eval_allowed’ instead of :ruby_eval_allowed
${v:customer.address.1} deep trick now ok (as it was ok for fields)
added d() to the $ notation : echo “${r: d(‘f:toto’) }”
Engine#kill_process(wfid) can cure errored participant expressions
made sure ${r:wi} and ${r:workitem} is and instance of Ruote::Workitem
implemented StorageParticipant#by_field
implemented StorageHistory
using yyyy-mm-dd instead of yyyy/mm/dd for Ruote.time_to_utc_s(t)
implemented Storage#purge_type!(t)
Engine#add_service now returning just bound service
fixed issue with Rufus.is_cron_string (thanks Torsten)
fixed issue with FlowExpression#cancel (Kenneth)
fixed issue when initializing engine without worker. Thanks Matt Nichols.
Generated with the Darkfish Rdoc Generator 2.