unify the ProcessObserver on "info"

not "opts", not "options", not "data", not "fields", but "info".
harmonize ft_77_process_observer.rb
prevent ProcessObserver from munching action names

it was turning "cancel_expression" and "cancel_process" into "cancel"...
reconstitute workitem for ProcessObserver on_error

on_error_intercepted
make assert_trace more resilient

empty trace in case of error
add license (MIT) to gemspec
replace HashDot by HashWrapper
use Struct in lieu of OpenStruct
Added support for on_pre_[action] methods to Ruote::ProcessObserver
Merge pull request #89 from riverock/process_observer_pre_support

add support for on_pre_[action] methods to Ruote::ProcessObserver
add Denis to the contributors list
comment out debug helper
ensure StorageParticipant#workitem gets updated wi

in reply to https://groups.google.com/forum/#!topic/openwferu-users/J2LfW2Bk6Hk
allow multiple calls to StorageParticipant#update
Rework the Tracer class to fix wrong constructor on Ruby 2.0
Fix rufus-scheduler ~> 2.0.16 as ruote depends on Rufus.parse_time_string
Fix error fixtures to include the wfid into the fei
Fix crash when multiple participants reply concurrently to their parent - @jmettraux can you please comment?

Given this workflow definition:

    Ruote.process_definition do
      alpha

      concurrence do
        part_1
        part_2
        ...
        part_12
      end

      bravo

    end

And the ruote-couch storage (either your or our ifad/ fork, it doesn't matter),

there are two incarnations of this crash, this is the first, happening when canceling the process while in the "concurrence" block:

    #<NoMethodError: undefined method `h=' for #<Ruote::Exp::SequenceExpression:0xd50b77c>>

    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/ro_persist.rb:157:in `do_p'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/ro_persist.rb:108:in `do_persist'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:1083:in `leave_tag'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:562:in `do_reply_to_parent'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:472:in `reply_to_parent'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:641:in `do_reply'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:350:in `do'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:340:in `do_action'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/worker.rb:392:in `process'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/worker.rb:210:in `process_msgs'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/worker.rb:258:in `step'
    /home/vjt/.rvm/gems/ruby-2.0.0-p247@scriptoria/bundler/gems/ruote-7a26fdeaa362/lib/ruote/worker.rb:109:in `run'
    ./script/ruote_worker:21:in `block in <main>'
    /home/vjt/code/scriptoria/script/service:108:in `instance_eval'
    /home/vjt/code/scriptoria/script/service:108:in `boot!'
    /home/vjt/code/scriptoria/script/service:38:in `initialize'
    ./script/ruote_worker:12:in `new'
    ./script/ruote_worker:12:in `<main>'

and this is the second one, instead happening when entering the concurrence block:

    #<NoMethodError: undefined method `h=' for #<Ruote::Exp::ParticipantExpression:0xb488a720>>

    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/ro_persist.rb:157:in `do_p'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/ro_persist.rb:115:in `do_unpersist'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:564:in `do_reply_to_parent'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:472:in `reply_to_parent'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/fe_participant.rb:209:in `reply_to_parent'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:660:in `reply'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/fe_participant.rb:202:in `reply'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:648:in `do_reply'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:350:in `do'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/exp/flow_expression.rb:340:in `do_action'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/worker.rb:392:in `process'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/worker.rb:210:in `process_msgs'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/worker.rb:258:in `step'
    /home/amedeo/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/bundler/gems/ruote-7a26fdeaa362/lib/ruote/worker.rb:109:in `run'
    ./script/ruote_worker:21:in `block in <main>'
    /home/amedeo/projects/scriptoria/script/service:108:in `instance_eval'
    /home/amedeo/projects/scriptoria/script/service:108:in `boot!'
    /home/amedeo/projects/scriptoria/script/service:38:in `initialize'
    ./script/ruote_worker:12:in `new'
    ./script/ruote_worker:12:in `<main>'

What do you think?

Thanks!

cc: @amedeo

~Marcello
upgrade to rufus-scheduler >= 3.0.0
tune testing and fancy printing