ruote 2.2.0 → 2.3.0
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.
- data/CHANGELOG.txt +166 -1
- data/CREDITS.txt +36 -17
- data/LICENSE.txt +1 -1
- data/README.rdoc +1 -7
- data/Rakefile +38 -29
- data/TODO.txt +93 -52
- data/lib/ruote-fs.rb +3 -0
- data/lib/ruote.rb +5 -1
- data/lib/ruote/context.rb +140 -35
- data/lib/ruote/dashboard.rb +1247 -0
- data/lib/ruote/{engine → dboard}/process_error.rb +22 -2
- data/lib/ruote/dboard/process_status.rb +587 -0
- data/lib/ruote/engine.rb +6 -871
- data/lib/ruote/exp/command.rb +7 -2
- data/lib/ruote/exp/commanded.rb +2 -2
- data/lib/ruote/exp/condition.rb +38 -13
- data/lib/ruote/exp/fe_add_branches.rb +1 -1
- data/lib/ruote/exp/fe_apply.rb +1 -1
- data/lib/ruote/exp/fe_await.rb +357 -0
- data/lib/ruote/exp/fe_cancel_process.rb +17 -3
- data/lib/ruote/exp/fe_command.rb +8 -4
- data/lib/ruote/exp/fe_concurrence.rb +218 -18
- data/lib/ruote/exp/fe_concurrent_iterator.rb +71 -10
- data/lib/ruote/exp/fe_cron.rb +3 -10
- data/lib/ruote/exp/fe_cursor.rb +14 -4
- data/lib/ruote/exp/fe_define.rb +3 -1
- data/lib/ruote/exp/fe_echo.rb +1 -1
- data/lib/ruote/exp/fe_equals.rb +1 -1
- data/lib/ruote/exp/fe_error.rb +1 -1
- data/lib/ruote/exp/fe_filter.rb +163 -4
- data/lib/ruote/exp/fe_forget.rb +21 -4
- data/lib/ruote/exp/fe_given.rb +1 -1
- data/lib/ruote/exp/fe_if.rb +1 -1
- data/lib/ruote/exp/fe_inc.rb +102 -35
- data/lib/ruote/exp/fe_iterator.rb +47 -12
- data/lib/ruote/exp/fe_listen.rb +96 -11
- data/lib/ruote/exp/fe_lose.rb +31 -4
- data/lib/ruote/exp/fe_noop.rb +1 -1
- data/lib/ruote/exp/fe_on_error.rb +109 -0
- data/lib/ruote/exp/fe_once.rb +10 -19
- data/lib/ruote/exp/fe_participant.rb +90 -28
- data/lib/ruote/exp/fe_read.rb +69 -0
- data/lib/ruote/exp/fe_redo.rb +3 -2
- data/lib/ruote/exp/fe_ref.rb +57 -27
- data/lib/ruote/exp/fe_registerp.rb +1 -3
- data/lib/ruote/exp/fe_reserve.rb +1 -1
- data/lib/ruote/exp/fe_restore.rb +6 -6
- data/lib/ruote/exp/fe_save.rb +12 -19
- data/lib/ruote/exp/fe_sequence.rb +38 -2
- data/lib/ruote/exp/fe_set.rb +143 -40
- data/lib/ruote/exp/{fe_let.rb → fe_stall.rb} +7 -38
- data/lib/ruote/exp/fe_subprocess.rb +8 -2
- data/lib/ruote/exp/fe_that.rb +1 -1
- data/lib/ruote/exp/fe_undo.rb +40 -4
- data/lib/ruote/exp/fe_unregisterp.rb +1 -3
- data/lib/ruote/exp/fe_wait.rb +12 -25
- data/lib/ruote/exp/{flowexpression.rb → flow_expression.rb} +375 -229
- data/lib/ruote/exp/iterator.rb +2 -2
- data/lib/ruote/exp/merge.rb +78 -17
- data/lib/ruote/exp/ro_attributes.rb +46 -36
- data/lib/ruote/exp/ro_filters.rb +34 -8
- data/lib/ruote/exp/ro_on_x.rb +431 -0
- data/lib/ruote/exp/ro_persist.rb +19 -7
- data/lib/ruote/exp/ro_timers.rb +123 -0
- data/lib/ruote/exp/ro_variables.rb +90 -29
- data/lib/ruote/fei.rb +57 -3
- data/lib/ruote/fs.rb +3 -0
- data/lib/ruote/id/mnemo_wfid_generator.rb +30 -7
- data/lib/ruote/id/wfid_generator.rb +17 -38
- data/lib/ruote/log/default_history.rb +23 -9
- data/lib/ruote/log/fancy_printing.rb +265 -0
- data/lib/ruote/log/storage_history.rb +23 -13
- data/lib/ruote/log/wait_logger.rb +224 -17
- data/lib/ruote/observer.rb +82 -0
- data/lib/ruote/part/block_participant.rb +65 -28
- data/lib/ruote/part/code_participant.rb +81 -0
- data/lib/ruote/part/engine_participant.rb +7 -2
- data/lib/ruote/part/local_participant.rb +221 -21
- data/lib/ruote/part/no_op_participant.rb +1 -1
- data/lib/ruote/part/null_participant.rb +1 -1
- data/lib/ruote/part/participant.rb +50 -0
- data/lib/ruote/part/rev_participant.rb +178 -0
- data/lib/ruote/part/smtp_participant.rb +2 -2
- data/lib/ruote/part/storage_participant.rb +228 -60
- data/lib/ruote/part/template.rb +1 -1
- data/lib/ruote/participant.rb +2 -0
- data/lib/ruote/reader.rb +205 -68
- data/lib/ruote/reader/json.rb +49 -0
- data/lib/ruote/reader/radial.rb +303 -0
- data/lib/ruote/reader/ruby_dsl.rb +44 -9
- data/lib/ruote/reader/xml.rb +11 -8
- data/lib/ruote/receiver/base.rb +98 -45
- data/lib/ruote/storage/base.rb +104 -35
- data/lib/ruote/storage/composite_storage.rb +50 -60
- data/lib/ruote/storage/fs_storage.rb +25 -34
- data/lib/ruote/storage/hash_storage.rb +38 -36
- data/lib/ruote/svc/dispatch_pool.rb +104 -35
- data/lib/ruote/svc/dollar_sub.rb +10 -8
- data/lib/ruote/svc/error_handler.rb +108 -52
- data/lib/ruote/svc/expression_map.rb +3 -3
- data/lib/ruote/svc/participant_list.rb +160 -55
- data/lib/ruote/svc/tracker.rb +31 -31
- data/lib/ruote/svc/treechecker.rb +28 -16
- data/lib/ruote/tree_dot.rb +1 -1
- data/lib/ruote/util/deep.rb +143 -0
- data/lib/ruote/util/filter.rb +125 -18
- data/lib/ruote/util/hashdot.rb +15 -13
- data/lib/ruote/util/look.rb +1 -1
- data/lib/ruote/util/lookup.rb +60 -22
- data/lib/ruote/util/misc.rb +63 -18
- data/lib/ruote/util/mpatch.rb +53 -0
- data/lib/ruote/util/ometa.rb +1 -2
- data/lib/ruote/util/process_observer.rb +177 -0
- data/lib/ruote/util/subprocess.rb +1 -1
- data/lib/ruote/util/time.rb +2 -2
- data/lib/ruote/util/tree.rb +64 -2
- data/lib/ruote/version.rb +3 -2
- data/lib/ruote/worker.rb +421 -92
- data/lib/ruote/workitem.rb +157 -22
- data/ruote.gemspec +15 -9
- data/test/bm/ci.rb +0 -2
- data/test/bm/ici.rb +0 -2
- data/test/bm/load_26c.rb +0 -3
- data/test/bm/mega.rb +0 -2
- data/test/functional/base.rb +57 -43
- data/test/functional/concurrent_base.rb +16 -13
- data/test/functional/ct_0_concurrence.rb +7 -11
- data/test/functional/ct_1_iterator.rb +9 -11
- data/test/functional/ct_2_cancel.rb +28 -17
- data/test/functional/eft_0_flow_expression.rb +35 -0
- data/test/functional/eft_10_cancel_process.rb +1 -1
- data/test/functional/eft_11_wait.rb +13 -13
- data/test/functional/eft_12_listen.rb +199 -66
- data/test/functional/eft_13_iterator.rb +95 -29
- data/test/functional/eft_14_cursor.rb +74 -24
- data/test/functional/eft_15_loop.rb +7 -7
- data/test/functional/eft_16_if.rb +1 -1
- data/test/functional/eft_17_equals.rb +1 -1
- data/test/functional/eft_18_concurrent_iterator.rb +156 -68
- data/test/functional/eft_19_reserve.rb +15 -15
- data/test/functional/eft_1_echo.rb +1 -1
- data/test/functional/eft_20_save.rb +51 -9
- data/test/functional/eft_21_restore.rb +1 -1
- data/test/functional/eft_22_noop.rb +1 -1
- data/test/functional/eft_23_apply.rb +1 -1
- data/test/functional/eft_24_add_branches.rb +7 -8
- data/test/functional/eft_25_command.rb +1 -1
- data/test/functional/eft_26_error.rb +11 -11
- data/test/functional/eft_27_inc.rb +111 -67
- data/test/functional/eft_28_once.rb +16 -16
- data/test/functional/eft_29_cron.rb +9 -9
- data/test/functional/eft_2_sequence.rb +23 -4
- data/test/functional/eft_30_ref.rb +36 -24
- data/test/functional/eft_31_registerp.rb +24 -24
- data/test/functional/eft_32_lose.rb +46 -20
- data/test/functional/eft_34_given.rb +1 -1
- data/test/functional/eft_35_filter.rb +161 -7
- data/test/functional/eft_36_read.rb +97 -0
- data/test/functional/{eft_0_process_definition.rb → eft_37_process_definition.rb} +4 -4
- data/test/functional/eft_38_on_error.rb +195 -0
- data/test/functional/eft_39_stall.rb +35 -0
- data/test/functional/eft_3_participant.rb +77 -22
- data/test/functional/eft_40_await.rb +297 -0
- data/test/functional/eft_4_set.rb +110 -11
- data/test/functional/eft_5_subprocess.rb +27 -5
- data/test/functional/eft_6_concurrence.rb +299 -60
- data/test/functional/eft_7_forget.rb +24 -22
- data/test/functional/eft_8_undo.rb +52 -15
- data/test/functional/eft_9_redo.rb +18 -20
- data/test/functional/ft_0_worker.rb +122 -13
- data/test/functional/ft_10_dollar.rb +77 -16
- data/test/functional/ft_11_recursion.rb +9 -9
- data/test/functional/ft_12_launchitem.rb +7 -9
- data/test/functional/ft_13_variables.rb +125 -22
- data/test/functional/ft_14_re_apply.rb +112 -56
- data/test/functional/ft_15_timeout.rb +64 -33
- data/test/functional/ft_16_participant_params.rb +59 -6
- data/test/functional/ft_17_conditional.rb +68 -2
- data/test/functional/ft_18_kill.rb +48 -30
- data/test/functional/ft_19_participant_code.rb +67 -0
- data/test/functional/ft_1_process_status.rb +222 -150
- data/test/functional/ft_20_storage_participant.rb +445 -44
- data/test/functional/ft_21_forget.rb +21 -26
- data/test/functional/ft_22_process_definitions.rb +8 -6
- data/test/functional/ft_23_load_defs.rb +29 -5
- data/test/functional/ft_24_block_participant.rb +199 -20
- data/test/functional/ft_25_receiver.rb +98 -46
- data/test/functional/ft_26_participant_rtimeout.rb +34 -26
- data/test/functional/ft_27_var_indirection.rb +40 -5
- data/test/functional/ft_28_null_noop_participants.rb +5 -5
- data/test/functional/ft_29_part_template.rb +2 -2
- data/test/functional/ft_2_errors.rb +106 -74
- data/test/functional/ft_30_smtp_participant.rb +7 -7
- data/test/functional/ft_31_part_blocking.rb +11 -11
- data/test/functional/ft_32_scope.rb +50 -0
- data/test/functional/ft_33_participant_subprocess_priority.rb +3 -3
- data/test/functional/ft_34_cursor_rewind.rb +14 -14
- data/test/functional/ft_35_add_service.rb +67 -9
- data/test/functional/ft_36_storage_history.rb +92 -24
- data/test/functional/ft_37_default_history.rb +35 -23
- data/test/functional/ft_38_participant_more.rb +189 -32
- data/test/functional/ft_39_wait_for.rb +25 -25
- data/test/functional/ft_3_participant_registration.rb +235 -107
- data/test/functional/ft_40_wait_logger.rb +105 -18
- data/test/functional/ft_41_participants.rb +13 -12
- data/test/functional/ft_42_storage_copy.rb +12 -12
- data/test/functional/ft_43_participant_on_reply.rb +85 -11
- data/test/functional/ft_44_var_participant.rb +5 -5
- data/test/functional/ft_45_participant_accept.rb +3 -3
- data/test/functional/ft_46_launch_single.rb +17 -17
- data/test/functional/ft_47_wfids.rb +41 -0
- data/test/functional/ft_48_lose.rb +19 -25
- data/test/functional/ft_49_engine_on_error.rb +54 -70
- data/test/functional/ft_4_cancel.rb +84 -26
- data/test/functional/ft_50_engine_config.rb +4 -4
- data/test/functional/ft_51_misc.rb +12 -12
- data/test/functional/ft_52_case.rb +17 -17
- data/test/functional/ft_53_engine_on_terminate.rb +18 -21
- data/test/functional/ft_54_patterns.rb +18 -16
- data/test/functional/ft_55_engine_participant.rb +55 -55
- data/test/functional/ft_56_filter_attribute.rb +90 -52
- data/test/functional/ft_57_rev_participant.rb +252 -0
- data/test/functional/ft_58_workitem.rb +150 -0
- data/test/functional/ft_59_pause.rb +329 -0
- data/test/functional/ft_5_on_error.rb +430 -77
- data/test/functional/ft_60_code_participant.rb +65 -0
- data/test/functional/ft_61_trailing_fields.rb +34 -0
- data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
- data/test/functional/ft_63_participants_221.rb +458 -0
- data/test/functional/ft_64_stash.rb +41 -0
- data/test/functional/ft_65_timers.rb +313 -0
- data/test/functional/ft_66_flank.rb +133 -0
- data/test/functional/ft_67_radial_misc.rb +34 -0
- data/test/functional/ft_68_reput.rb +72 -0
- data/test/functional/ft_69_worker_info.rb +56 -0
- data/test/functional/ft_6_on_cancel.rb +189 -36
- data/test/functional/ft_70_take_and_discard_attributes.rb +94 -0
- data/test/functional/ft_71_retries.rb +144 -0
- data/test/functional/ft_72_on_terminate.rb +60 -0
- data/test/functional/ft_73_raise_msg.rb +107 -0
- data/test/functional/ft_74_respark.rb +106 -0
- data/test/functional/ft_75_context.rb +66 -0
- data/test/functional/ft_76_observer.rb +53 -0
- data/test/functional/ft_77_process_observer.rb +157 -0
- data/test/functional/ft_78_part_participant.rb +37 -0
- data/test/functional/ft_7_tags.rb +238 -50
- data/test/functional/ft_8_participant_consumption.rb +27 -21
- data/test/functional/ft_9_subprocesses.rb +48 -18
- data/test/functional/restart_base.rb +4 -6
- data/test/functional/rt_0_wait.rb +10 -10
- data/test/functional/rt_1_listen.rb +6 -6
- data/test/functional/rt_2_errors.rb +12 -12
- data/test/functional/rt_3_once.rb +17 -12
- data/test/functional/rt_4_cron.rb +17 -17
- data/test/functional/rt_5_timeout.rb +13 -13
- data/test/functional/signals.rb +103 -0
- data/test/functional/storage.rb +730 -0
- data/test/functional/storage_helper.rb +48 -35
- data/test/functional/test.rb +6 -2
- data/test/misc/idle.rb +21 -0
- data/test/misc/light.rb +29 -0
- data/test/path_helper.rb +1 -1
- data/test/test.rb +2 -5
- data/test/test_helper.rb +13 -0
- data/test/unit/test.rb +1 -4
- data/test/unit/ut_0_ruby_reader.rb +25 -9
- data/test/unit/ut_10_participants.rb +47 -0
- data/test/unit/ut_11_lookup.rb +59 -2
- data/test/unit/ut_12_wait_logger.rb +123 -0
- data/test/unit/ut_14_is_uri.rb +1 -1
- data/test/unit/ut_15_util.rb +1 -1
- data/test/unit/ut_16_reader.rb +136 -14
- data/test/unit/ut_17_merge.rb +155 -0
- data/test/unit/ut_19_part_template.rb +1 -1
- data/test/unit/ut_1_fei.rb +11 -2
- data/test/unit/ut_20_composite_storage.rb +27 -1
- data/test/unit/{ut_21_participant_list.rb → ut_21_svc_participant_list.rb} +2 -3
- data/test/unit/ut_22_filter.rb +231 -10
- data/test/unit/ut_23_svc_tracker.rb +48 -0
- data/test/unit/ut_24_radial_reader.rb +458 -0
- data/test/unit/ut_25_process_status.rb +143 -0
- data/test/unit/ut_26_deep.rb +131 -0
- data/test/unit/ut_2_dashboard.rb +114 -0
- data/test/unit/ut_3_worker.rb +54 -0
- data/test/unit/ut_4_expmap.rb +1 -1
- data/test/unit/ut_5_tree.rb +23 -23
- data/test/unit/ut_6_condition.rb +71 -29
- data/test/unit/ut_7_workitem.rb +18 -4
- data/test/unit/ut_8_tree_to_dot.rb +1 -1
- data/test/unit/ut_9_xml_reader.rb +1 -1
- metadata +142 -63
- data/jruby_issue.txt +0 -32
- data/lib/ruote/engine/process_status.rb +0 -403
- data/lib/ruote/log/pretty.rb +0 -165
- data/lib/ruote/log/test_logger.rb +0 -204
- data/lib/ruote/util/serializer.rb +0 -103
- data/phil.txt +0 -14
- data/test/functional/eft_33_let.rb +0 -31
- data/test/functional/ft_19_alias.rb +0 -33
- data/test/functional/ft_47_wfid_generator.rb +0 -54
- data/test/unit/storage.rb +0 -403
- data/test/unit/storages.rb +0 -37
- data/test/unit/ut_13_serializer.rb +0 -65
- data/test/unit/ut_18_engine.rb +0 -47
- data/test/unit/ut_3_wait_logger.rb +0 -39
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
# furnished to do so, subject to the following conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
|
12
|
+
# all copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
20
|
+
# THE SOFTWARE.
|
|
21
|
+
#
|
|
22
|
+
# Made in Japan.
|
|
23
|
+
#++
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
module Ruote
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# TODO
|
|
30
|
+
#
|
|
31
|
+
class CodeParticipant
|
|
32
|
+
|
|
33
|
+
include LocalParticipant
|
|
34
|
+
|
|
35
|
+
attr_accessor :context
|
|
36
|
+
|
|
37
|
+
def initialize(opts)
|
|
38
|
+
|
|
39
|
+
@opts = opts
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def context=(con)
|
|
43
|
+
|
|
44
|
+
@context = con
|
|
45
|
+
|
|
46
|
+
@context.treechecker.code_check(@opts['code'])
|
|
47
|
+
|
|
48
|
+
instance_eval(@opts['code'])
|
|
49
|
+
|
|
50
|
+
#instance_eval do
|
|
51
|
+
# alias code_consume consume
|
|
52
|
+
# def consume(workitem)
|
|
53
|
+
# code_consume(workitem)
|
|
54
|
+
# rescue => e
|
|
55
|
+
# raise e
|
|
56
|
+
# end
|
|
57
|
+
# # what about doing that with other methods
|
|
58
|
+
#end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
protected
|
|
62
|
+
|
|
63
|
+
# def get_block(*keys)
|
|
64
|
+
#
|
|
65
|
+
# key = keys.find { |k| @opts[k] }
|
|
66
|
+
#
|
|
67
|
+
# return nil unless key
|
|
68
|
+
#
|
|
69
|
+
# block = @opts[key]
|
|
70
|
+
#
|
|
71
|
+
# @context.treechecker.block_check(block)
|
|
72
|
+
# # raises in case of 'security' violation
|
|
73
|
+
#
|
|
74
|
+
# #eval(block, @context.send(:binding))
|
|
75
|
+
# # doesn't work with ruby 1.9.2-p136
|
|
76
|
+
# eval(block, @context.instance_eval { binding })
|
|
77
|
+
# # works OK with ruby 1.8.7-249 and 1.9.2-p136
|
|
78
|
+
# end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -115,7 +115,12 @@ module Ruote
|
|
|
115
115
|
|
|
116
116
|
raise(ArgumentError.new("missing 'storage_class' parameter")) unless kl
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
args = opts['storage_args']
|
|
119
|
+
args = args.is_a?(Hash) ? [ args ] : Array(args)
|
|
120
|
+
args << {} unless args.last.is_a?(Hash)
|
|
121
|
+
args.last['preserve_configuration'] = true
|
|
122
|
+
|
|
123
|
+
@storage = Ruote.constantize(kl).new(*args)
|
|
119
124
|
end
|
|
120
125
|
|
|
121
126
|
def consume(workitem)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
#++
|
|
24
24
|
|
|
25
25
|
require 'ruote/receiver/base'
|
|
26
|
+
require 'ruote/svc/dispatch_pool'
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
module Ruote
|
|
@@ -38,10 +39,103 @@ module Ruote
|
|
|
38
39
|
module LocalParticipant
|
|
39
40
|
|
|
40
41
|
include ReceiverMixin
|
|
41
|
-
# the reply_to_engine method is there
|
|
42
42
|
|
|
43
|
+
# The engine context, it's a local participant so it knows about the
|
|
44
|
+
# context in which the engine operates...
|
|
45
|
+
#
|
|
43
46
|
attr_accessor :context
|
|
44
47
|
|
|
48
|
+
# Usually set right before a call to #on_workitem or #accept?
|
|
49
|
+
#
|
|
50
|
+
attr_writer :workitem
|
|
51
|
+
|
|
52
|
+
# Usually set right before a call to #on_cancel or #cancel
|
|
53
|
+
#
|
|
54
|
+
attr_writer :fei
|
|
55
|
+
|
|
56
|
+
# Usually set right before a call to #on_cancel or #cancel
|
|
57
|
+
#
|
|
58
|
+
attr_accessor :flavour
|
|
59
|
+
|
|
60
|
+
# Returns the current workitem if no fei is given.
|
|
61
|
+
# If a fei is given, it will return the applied workitem for that fei
|
|
62
|
+
# (if any).
|
|
63
|
+
#
|
|
64
|
+
# The optional fei is mostly here for backward compatibility (with 2.2.0)
|
|
65
|
+
#
|
|
66
|
+
def workitem(fei=nil)
|
|
67
|
+
|
|
68
|
+
return fetch_workitem(fei) if fei
|
|
69
|
+
|
|
70
|
+
@workitem ? @workitem : applied_workitem
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Returns the current fei (Ruote::FlowExpressionId).
|
|
74
|
+
#
|
|
75
|
+
def fei
|
|
76
|
+
|
|
77
|
+
@fei ? @fei : @workitem.fei
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Returns the Ruote::ParticipantExpression that corresponds with this
|
|
81
|
+
# participant.
|
|
82
|
+
#
|
|
83
|
+
# If a wi_or_fei arg is given, will return the corresponding
|
|
84
|
+
# flow expression. This arg is mostly here for backward compatibility.
|
|
85
|
+
#
|
|
86
|
+
def fexp(wi_or_fei=nil)
|
|
87
|
+
|
|
88
|
+
flow_expression(wi_or_fei || fei)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Returns the workitem as was applied when the Ruote::ParticipantExpression
|
|
92
|
+
# was reached.
|
|
93
|
+
#
|
|
94
|
+
# If the _fei arg is specified, it will return the corresponding applied
|
|
95
|
+
# workitem. This args is mostly here for backward compatibility.
|
|
96
|
+
#
|
|
97
|
+
def applied_workitem(_fei=nil)
|
|
98
|
+
|
|
99
|
+
fetch_workitem(_fei || fei)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Up until ruote 2.3.0, the participant name had to be fetched from the
|
|
103
|
+
# workitem. This is a shortcut, it lets you write participant code
|
|
104
|
+
# that look like
|
|
105
|
+
#
|
|
106
|
+
# def on_workitem
|
|
107
|
+
# (workitem.fields['supervisors'] || []) << participant_name
|
|
108
|
+
# reply
|
|
109
|
+
# end
|
|
110
|
+
#
|
|
111
|
+
def participant_name
|
|
112
|
+
|
|
113
|
+
workitem.participant_name
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# A shortcut for
|
|
117
|
+
#
|
|
118
|
+
# fexp.lookup_variable(key)
|
|
119
|
+
#
|
|
120
|
+
def lookup_variable(key)
|
|
121
|
+
|
|
122
|
+
fexp.lookup_variable(key)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Participant implementations call this method when their #on_workitem
|
|
126
|
+
# (#consume) methods are done and they want to hand back the workitem
|
|
127
|
+
# to the engine so that the flow can resume.
|
|
128
|
+
#
|
|
129
|
+
# the (wi=workitem) is mostly for backward compatibility (or for passing a
|
|
130
|
+
# totally different workitem to the engine).
|
|
131
|
+
#
|
|
132
|
+
def reply_to_engine(wi=workitem)
|
|
133
|
+
|
|
134
|
+
receive(wi)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
alias reply reply_to_engine
|
|
138
|
+
|
|
45
139
|
# Use this method to re_dispatch the workitem.
|
|
46
140
|
#
|
|
47
141
|
# It takes two options :in and :at for "later re_dispatch".
|
|
@@ -51,23 +145,28 @@ module Ruote
|
|
|
51
145
|
#
|
|
52
146
|
# Without one of those options, the method is a "reject".
|
|
53
147
|
#
|
|
54
|
-
def re_dispatch(
|
|
148
|
+
def re_dispatch(wi=nil, opts=nil)
|
|
149
|
+
|
|
150
|
+
wi, opts = [ nil, wi ] if wi.is_a?(Hash) && opts.nil?
|
|
151
|
+
wi ||= workitem()
|
|
152
|
+
opts ||= {}
|
|
153
|
+
|
|
154
|
+
wi.h['re_dispatch_count'] = wi.h['re_dispatch_count'].to_s.to_i + 1
|
|
55
155
|
|
|
56
156
|
msg = {
|
|
57
157
|
'action' => 'dispatch',
|
|
58
|
-
'fei' =>
|
|
59
|
-
'workitem' =>
|
|
60
|
-
'participant_name' =>
|
|
61
|
-
'rejected' => true
|
|
158
|
+
'fei' => wi.h.fei,
|
|
159
|
+
'workitem' => wi.h,
|
|
160
|
+
'participant_name' => wi.participant_name
|
|
62
161
|
}
|
|
63
162
|
|
|
64
163
|
if t = opts[:in] || opts[:at]
|
|
65
164
|
|
|
66
|
-
sched_id = @context.storage.put_schedule('at',
|
|
165
|
+
sched_id = @context.storage.put_schedule('at', wi.h.fei, t, msg)
|
|
67
166
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
167
|
+
exp = fexp(wi)
|
|
168
|
+
exp.h['re_dispatch_sched_id'] = sched_id
|
|
169
|
+
exp.try_persist
|
|
71
170
|
|
|
72
171
|
else
|
|
73
172
|
|
|
@@ -77,7 +176,7 @@ module Ruote
|
|
|
77
176
|
|
|
78
177
|
# Cancels the scheduled re_dispatch, if any.
|
|
79
178
|
#
|
|
80
|
-
# An example
|
|
179
|
+
# An example of 'retrying participant' :
|
|
81
180
|
#
|
|
82
181
|
# class RetryParticipant
|
|
83
182
|
# include Ruote::LocalParticipant
|
|
@@ -86,27 +185,24 @@ module Ruote
|
|
|
86
185
|
# @opts = opts
|
|
87
186
|
# end
|
|
88
187
|
#
|
|
89
|
-
# def
|
|
188
|
+
# def on_workitem
|
|
90
189
|
# begin
|
|
91
190
|
# do_the_job
|
|
92
|
-
# reply
|
|
191
|
+
# reply
|
|
93
192
|
# rescue
|
|
94
|
-
# re_dispatch(
|
|
193
|
+
# re_dispatch(:in => @opts['delay'] || '1s')
|
|
95
194
|
# end
|
|
96
195
|
# end
|
|
97
196
|
#
|
|
98
|
-
# def cancel
|
|
99
|
-
# unschedule_re_dispatch
|
|
197
|
+
# def cancel
|
|
198
|
+
# unschedule_re_dispatch
|
|
100
199
|
# end
|
|
101
200
|
# end
|
|
102
201
|
#
|
|
103
202
|
# Note how unschedule_re_dispatch is used in the cancel method. Warning,
|
|
104
203
|
# this example could loop forever...
|
|
105
204
|
#
|
|
106
|
-
def unschedule_re_dispatch(fei)
|
|
107
|
-
|
|
108
|
-
fexp = Ruote::Exp::FlowExpression.fetch(
|
|
109
|
-
@context, Ruote::FlowExpressionId.extract_h(fei))
|
|
205
|
+
def unschedule_re_dispatch(fei=nil)
|
|
110
206
|
|
|
111
207
|
if s = fexp.h['re_dispatch_sched_id']
|
|
112
208
|
@context.storage.delete_schedule(s)
|
|
@@ -133,6 +229,110 @@ module Ruote
|
|
|
133
229
|
# Well, here it is, use with care.
|
|
134
230
|
#
|
|
135
231
|
alias :reject :re_dispatch
|
|
232
|
+
|
|
233
|
+
#--
|
|
234
|
+
# test methods
|
|
235
|
+
# prefixed with an underscore
|
|
236
|
+
#++
|
|
237
|
+
|
|
238
|
+
# Test shortcut, alleviates the need to set the workitem before calling
|
|
239
|
+
# consume / on_workitem.
|
|
240
|
+
#
|
|
241
|
+
def _on_workitem(wi)
|
|
242
|
+
Ruote.participant_send(
|
|
243
|
+
self, [ :on_workitem, :consume ], 'workitem' => wi)
|
|
244
|
+
end
|
|
245
|
+
alias _consume _on_workitem
|
|
246
|
+
|
|
247
|
+
# Test shortcut, alleviates the need to set fei and flavour before calling
|
|
248
|
+
# cancel / on_consume.
|
|
249
|
+
#
|
|
250
|
+
def _on_cancel(fei, flavour)
|
|
251
|
+
Ruote.participant_send(
|
|
252
|
+
self, [ :on_cancel, :cancel ], 'fei' => fei, 'flavour' => flavour)
|
|
253
|
+
end
|
|
254
|
+
alias _cancel _on_cancel
|
|
255
|
+
|
|
256
|
+
# Test shortcut, alleviates the need to set the workitem before calling
|
|
257
|
+
# on_reply.
|
|
258
|
+
#
|
|
259
|
+
def _on_reply(wi)
|
|
260
|
+
Ruote.participant_send(self, :on_reply, 'workitem' => wi)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Test shortcut, alleviates the need to set the workitem before calling
|
|
264
|
+
# accept?
|
|
265
|
+
#
|
|
266
|
+
def _accept?(wi)
|
|
267
|
+
Ruote.participant_send(self, :accept?, 'workitem' => wi)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# Test shortcut, alleviates the need to set the workitem before calling
|
|
271
|
+
# dont_thread?, do_not_thread? or do_not_thread.
|
|
272
|
+
#
|
|
273
|
+
def _dont_thread?(wi)
|
|
274
|
+
Ruote.participant_send(
|
|
275
|
+
self,
|
|
276
|
+
[ :dont_thread?, :do_not_thread?, :do_not_thread ],
|
|
277
|
+
'workitem' => wi)
|
|
278
|
+
end
|
|
279
|
+
alias _do_not_thread _dont_thread?
|
|
280
|
+
alias _do_not_thread? _dont_thread?
|
|
281
|
+
|
|
282
|
+
# Test shortcut, alleviates the need to set the workitem before calling
|
|
283
|
+
# rtimeout.
|
|
284
|
+
#
|
|
285
|
+
def _rtimeout(wi)
|
|
286
|
+
Ruote.participant_send(self, :rtimeout, 'workitem' => wi)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Returns true if the underlying participant expression is 'gone' (probably
|
|
290
|
+
# cancelled somehow).
|
|
291
|
+
#
|
|
292
|
+
def is_gone?
|
|
293
|
+
|
|
294
|
+
fexp.nil?
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# Returns true if the underlying participant expression is gone or
|
|
298
|
+
# cancelling.
|
|
299
|
+
#
|
|
300
|
+
def is_cancelled?
|
|
301
|
+
|
|
302
|
+
if fe = fexp
|
|
303
|
+
return fe.h.state == 'cancelling'
|
|
304
|
+
else
|
|
305
|
+
true
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
alias is_canceled? is_cancelled?
|
|
310
|
+
|
|
311
|
+
protected
|
|
312
|
+
|
|
313
|
+
# Receivers and local participants share the #stash_put and #stash_get
|
|
314
|
+
# methods. The local participant has #put and #get which don't need
|
|
315
|
+
# an initial fei, thus #get and #put deal with the participant
|
|
316
|
+
# expression directly, whereas stash_put and stash_get can point at
|
|
317
|
+
# any expression.
|
|
318
|
+
#
|
|
319
|
+
# 'put' can be called as
|
|
320
|
+
#
|
|
321
|
+
# put('secret' => 'message', 'to' => 'embassy')
|
|
322
|
+
# # or
|
|
323
|
+
# put('secret', 'message')
|
|
324
|
+
#
|
|
325
|
+
def put(key, value=nil)
|
|
326
|
+
|
|
327
|
+
stash_put(fei, key, value)
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
# See #put
|
|
331
|
+
#
|
|
332
|
+
def get(key=nil)
|
|
333
|
+
|
|
334
|
+
stash_get(fei, key)
|
|
335
|
+
end
|
|
136
336
|
end
|
|
137
337
|
end
|
|
138
338
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
# furnished to do so, subject to the following conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
|
12
|
+
# all copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
20
|
+
# THE SOFTWARE.
|
|
21
|
+
#
|
|
22
|
+
# Made in Japan.
|
|
23
|
+
#++
|
|
24
|
+
|
|
25
|
+
require 'ruote/part/local_participant'
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
module Ruote
|
|
29
|
+
|
|
30
|
+
# A simple stub class for participants.
|
|
31
|
+
#
|
|
32
|
+
# Used mostly as in:
|
|
33
|
+
#
|
|
34
|
+
# class MyParticipant < Ruote::Participant
|
|
35
|
+
#
|
|
36
|
+
# def on_workitem
|
|
37
|
+
# workitem.fields['tag'] = 'kilroy was here'
|
|
38
|
+
# end
|
|
39
|
+
# end
|
|
40
|
+
#
|
|
41
|
+
class Participant
|
|
42
|
+
include LocalParticipant
|
|
43
|
+
|
|
44
|
+
# Empty default implementation.
|
|
45
|
+
#
|
|
46
|
+
def on_cancel
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|