ruote 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -1,204 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright (c) 2005-2011, 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/log/pretty'
|
26
|
-
|
27
|
-
|
28
|
-
module Ruote
|
29
|
-
|
30
|
-
class TestLogger
|
31
|
-
|
32
|
-
include PrettyLogging
|
33
|
-
|
34
|
-
attr_reader :seen
|
35
|
-
attr_reader :log
|
36
|
-
|
37
|
-
attr_accessor :noisy
|
38
|
-
|
39
|
-
def initialize(context)
|
40
|
-
|
41
|
-
@context = context
|
42
|
-
|
43
|
-
if @context.worker
|
44
|
-
#
|
45
|
-
# this is a worker context, DO log
|
46
|
-
#
|
47
|
-
@context.worker.subscribe(:all, self)
|
48
|
-
#else
|
49
|
-
#
|
50
|
-
# this is not a worker context, DO NOT log, but be ready to
|
51
|
-
# be queried
|
52
|
-
#
|
53
|
-
end
|
54
|
-
|
55
|
-
@seen = []
|
56
|
-
@log = []
|
57
|
-
@waiting = []
|
58
|
-
|
59
|
-
@count = -1
|
60
|
-
@color = 33
|
61
|
-
@noisy = false
|
62
|
-
end
|
63
|
-
|
64
|
-
def notify(msg)
|
65
|
-
|
66
|
-
puts(pretty_print(msg)) if @noisy
|
67
|
-
|
68
|
-
@seen << msg
|
69
|
-
@log << msg
|
70
|
-
|
71
|
-
check_waiting
|
72
|
-
end
|
73
|
-
|
74
|
-
# Blocks until one or more interests are satisfied.
|
75
|
-
#
|
76
|
-
# interests must be an array of interests. Please refer to
|
77
|
-
# Engine#wait_for documentation for allowed values of each interest.
|
78
|
-
#
|
79
|
-
# If multiple interests are given, wait_for blocks until
|
80
|
-
# all of the interests are satisfied.
|
81
|
-
#
|
82
|
-
# wait_for may only be used by one thread at a time. If one
|
83
|
-
# thread calls wait_for and later another thread calls wait_for
|
84
|
-
# while the first thread is waiting, the first thread's
|
85
|
-
# interests are lost and the first thread will never wake up.
|
86
|
-
#
|
87
|
-
def wait_for(interests)
|
88
|
-
|
89
|
-
@waiting << [ Thread.current, interests ]
|
90
|
-
|
91
|
-
check_waiting
|
92
|
-
|
93
|
-
Thread.stop if @waiting.find { |w| w.first == Thread.current }
|
94
|
-
|
95
|
-
# and when this thread gets woken up, go on and return __result__
|
96
|
-
|
97
|
-
Thread.current['__result__']
|
98
|
-
end
|
99
|
-
|
100
|
-
# Debug only : dumps all the seen events to STDOUTS
|
101
|
-
#
|
102
|
-
def dump
|
103
|
-
|
104
|
-
@seen.collect { |msg| pretty_print(msg) }.join("\n")
|
105
|
-
end
|
106
|
-
|
107
|
-
def color=(c)
|
108
|
-
|
109
|
-
@color = c
|
110
|
-
end
|
111
|
-
|
112
|
-
def self.pp(msg)
|
113
|
-
|
114
|
-
@logger ||= TestLogger.new(nil)
|
115
|
-
puts @logger.send(:pretty_print, msg)
|
116
|
-
end
|
117
|
-
|
118
|
-
protected
|
119
|
-
|
120
|
-
def check_waiting
|
121
|
-
|
122
|
-
return if @waiting.size < 1
|
123
|
-
|
124
|
-
while msg = @seen.shift
|
125
|
-
check_msg(msg)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def check_msg(msg)
|
130
|
-
|
131
|
-
wakeup = []
|
132
|
-
|
133
|
-
@waiting.each do |thread, interests|
|
134
|
-
|
135
|
-
wakeup << thread if matches(interests, msg)
|
136
|
-
end
|
137
|
-
|
138
|
-
@waiting.delete_if { |t, i| i.size < 1 }
|
139
|
-
|
140
|
-
wakeup.each do |thread|
|
141
|
-
|
142
|
-
thread['__result__'] = msg
|
143
|
-
thread.wakeup
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
FINAL_ACTIONS = %w[ terminated ceased error_intercepted ]
|
148
|
-
|
149
|
-
# Checks whether message msg matches any of interests being waited for.
|
150
|
-
#
|
151
|
-
# Some interests look for actions on particular workflows (e.g.,
|
152
|
-
# waiting for some workflow to finish). Other interests are not
|
153
|
-
# attached to any particular workflow (e.g., :inactive waits until
|
154
|
-
# the engine finishes processing all active and pending workflows)
|
155
|
-
# but are still satisfied when actions happen on workflows (e.g.,
|
156
|
-
# the last workflow being run finishes).
|
157
|
-
#
|
158
|
-
# Returns true if all interests being waited for have been satisfied,
|
159
|
-
# false otherwise.
|
160
|
-
#
|
161
|
-
def matches(interests, msg)
|
162
|
-
|
163
|
-
action = msg['action']
|
164
|
-
|
165
|
-
interests.each do |interest|
|
166
|
-
|
167
|
-
satisfied = case interest
|
168
|
-
|
169
|
-
when :inactive
|
170
|
-
|
171
|
-
(FINAL_ACTIONS.include?(action) && @context.worker.inactive?)
|
172
|
-
|
173
|
-
when :empty
|
174
|
-
|
175
|
-
(action == 'terminated' && @context.storage.empty?('expressions'))
|
176
|
-
|
177
|
-
when Symbol
|
178
|
-
|
179
|
-
(action == 'dispatch' && msg['participant_name'] == interest.to_s)
|
180
|
-
|
181
|
-
when Fixnum
|
182
|
-
|
183
|
-
interests.delete(interest)
|
184
|
-
|
185
|
-
if (interest > 1)
|
186
|
-
interests << (interest - 1)
|
187
|
-
false
|
188
|
-
else
|
189
|
-
true
|
190
|
-
end
|
191
|
-
|
192
|
-
else # wfid
|
193
|
-
|
194
|
-
(FINAL_ACTIONS.include?(action) && msg['wfid'] == interest)
|
195
|
-
end
|
196
|
-
|
197
|
-
interests.delete(interest) if satisfied
|
198
|
-
end
|
199
|
-
|
200
|
-
interests.size < 1
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
@@ -1,103 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# Copyright (c) 2005-2011, 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
|
-
# To get a YAML serializer :
|
30
|
-
#
|
31
|
-
# serializer = Serializer.new(:yaml)
|
32
|
-
#
|
33
|
-
# A marshal + base64 one :
|
34
|
-
#
|
35
|
-
# serializer = Serializer.new(:marshal64)
|
36
|
-
#
|
37
|
-
# A marshal only one :
|
38
|
-
#
|
39
|
-
# serializer = Serializer.new(:marshal)
|
40
|
-
#
|
41
|
-
# For the rest, it's the classical :
|
42
|
-
#
|
43
|
-
# data = serializer.encode(object)
|
44
|
-
#
|
45
|
-
# object = serializer.decode(data)
|
46
|
-
#
|
47
|
-
class Serializer
|
48
|
-
|
49
|
-
#--
|
50
|
-
# prepare / encode / decode lambda pairs
|
51
|
-
#++
|
52
|
-
|
53
|
-
# plain marshal serialization
|
54
|
-
#
|
55
|
-
MARSHAL = [
|
56
|
-
lambda { },
|
57
|
-
lambda { |o| Marshal.dump(o) },
|
58
|
-
lambda { |s| Marshal.load(s) }
|
59
|
-
]
|
60
|
-
|
61
|
-
# marshal serialization with base64 encoding
|
62
|
-
#
|
63
|
-
MARSHAL64 = [
|
64
|
-
lambda { require 'base64' },
|
65
|
-
lambda { |o| Base64.encode64(Marshal.dump(o)) },
|
66
|
-
lambda { |s| Marshal.load(Base64.decode64(s)) }
|
67
|
-
]
|
68
|
-
|
69
|
-
# YAML serialization
|
70
|
-
#
|
71
|
-
YAML = [
|
72
|
-
lambda { require 'yaml' },
|
73
|
-
lambda { |o| ::YAML.dump(o) },
|
74
|
-
lambda { |s| ::YAML.load(s) }
|
75
|
-
]
|
76
|
-
|
77
|
-
#JASH = ...
|
78
|
-
|
79
|
-
# The flavour map
|
80
|
-
#
|
81
|
-
FLAVOURS = {
|
82
|
-
:marshal => MARSHAL, :marshal64 => MARSHAL64, :yaml => YAML
|
83
|
-
}
|
84
|
-
|
85
|
-
def initialize(flavour)
|
86
|
-
|
87
|
-
@flavour = FLAVOURS[flavour] || MARSHAL64
|
88
|
-
|
89
|
-
@flavour[0].call # initializes the flavour
|
90
|
-
end
|
91
|
-
|
92
|
-
def encode(o)
|
93
|
-
|
94
|
-
@flavour[1].call(o)
|
95
|
-
end
|
96
|
-
|
97
|
-
def decode(s)
|
98
|
-
|
99
|
-
@flavour[2].call(s)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
data/phil.txt
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
|
2
|
-
persist then dispatch
|
3
|
-
|
4
|
-
==
|
5
|
-
|
6
|
-
concurrence (and concurrent-iterator) :
|
7
|
-
|
8
|
-
persist, then fire all children
|
9
|
-
prepare all children then fire them !!!
|
10
|
-
|
11
|
-
==
|
12
|
-
|
13
|
-
it can't be perfect, but there can be tools for fixing the consequences of those flaws.
|
14
|
-
|
@@ -1,31 +0,0 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# testing ruote
|
4
|
-
#
|
5
|
-
# Fri Dec 24 15:35:17 JST 2010
|
6
|
-
#
|
7
|
-
|
8
|
-
require File.join(File.dirname(__FILE__), 'base')
|
9
|
-
|
10
|
-
|
11
|
-
class EftLetTest < Test::Unit::TestCase
|
12
|
-
include FunctionalBase
|
13
|
-
|
14
|
-
def test_let
|
15
|
-
|
16
|
-
pdef = Ruote.process_definition do
|
17
|
-
set 'v:var' => 'val'
|
18
|
-
echo "out:${v:var}"
|
19
|
-
let do
|
20
|
-
set 'v:var' => 'val1'
|
21
|
-
echo "in:${v:var}"
|
22
|
-
end
|
23
|
-
echo "out:${v:var}"
|
24
|
-
end
|
25
|
-
|
26
|
-
#noisy
|
27
|
-
|
28
|
-
assert_trace %w[ out:val in:val1 out:val ], pdef
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
@@ -1,33 +0,0 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# testing ruote
|
4
|
-
#
|
5
|
-
# Thu Jul 16 16:11:57 JST 2009
|
6
|
-
#
|
7
|
-
|
8
|
-
require File.join(File.dirname(__FILE__), 'base')
|
9
|
-
|
10
|
-
|
11
|
-
class FtAliasTest < Test::Unit::TestCase
|
12
|
-
include FunctionalBase
|
13
|
-
|
14
|
-
def test_var_alias
|
15
|
-
|
16
|
-
pdef = Ruote.process_definition :name => 'def0' do
|
17
|
-
set :v => 'alpha', :val => 'bravo'
|
18
|
-
sequence do
|
19
|
-
alpha
|
20
|
-
bravo
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
alpha = @engine.register_participant :bravo do |workitem|
|
25
|
-
@tracer << "b:#{workitem.fields['params']['original_ref']}\n"
|
26
|
-
end
|
27
|
-
|
28
|
-
#noisy
|
29
|
-
|
30
|
-
assert_trace(%w[ b:alpha b: ], pdef)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
@@ -1,54 +0,0 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# testing ruote
|
4
|
-
#
|
5
|
-
# Sat Oct 23 14:22:15 JST 2010
|
6
|
-
#
|
7
|
-
|
8
|
-
require File.join(File.dirname(__FILE__), 'base')
|
9
|
-
|
10
|
-
|
11
|
-
class FtWfidGeneratorTest < Test::Unit::TestCase
|
12
|
-
include FunctionalBase
|
13
|
-
|
14
|
-
# an old test, brought back
|
15
|
-
#
|
16
|
-
def test_generate_unique_ids
|
17
|
-
|
18
|
-
n = 147
|
19
|
-
|
20
|
-
wfids = []
|
21
|
-
n.times { wfids << @engine.context.wfidgen.generate }
|
22
|
-
|
23
|
-
assert_equal n, wfids.uniq.size
|
24
|
-
end
|
25
|
-
|
26
|
-
# making a purge! doesn't incapacitate wfid generation
|
27
|
-
# (had a false alert when working with @hassox)
|
28
|
-
#
|
29
|
-
def test_generate_even_after_a_purge
|
30
|
-
|
31
|
-
assert_not_nil @engine.context.wfidgen.generate
|
32
|
-
|
33
|
-
@engine.storage.purge!
|
34
|
-
#@engine.context.wfidgen.instance_eval { @last = nil }
|
35
|
-
|
36
|
-
assert_not_nil @engine.context.wfidgen.generate
|
37
|
-
end
|
38
|
-
|
39
|
-
def test_generate_after_a_put_failed
|
40
|
-
|
41
|
-
assert_not_nil @engine.context.wfidgen.generate
|
42
|
-
|
43
|
-
@engine.context.wfidgen.instance_eval do
|
44
|
-
if @last['_rev'].is_a?(String)
|
45
|
-
@last['_rev'] = '1-cc9bc774f00b65ee28a6c0e4f26474de'
|
46
|
-
else # integer
|
47
|
-
@last['_rev'] = 123456789
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
assert_not_nil @engine.context.wfidgen.generate
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
data/test/unit/storage.rb
DELETED
@@ -1,403 +0,0 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
# testing ruote
|
4
|
-
#
|
5
|
-
# Mon Dec 14 15:03:13 JST 2009
|
6
|
-
#
|
7
|
-
|
8
|
-
require File.join(File.dirname(__FILE__), %w[ .. test_helper.rb ])
|
9
|
-
|
10
|
-
require_json
|
11
|
-
|
12
|
-
require File.join(File.dirname(__FILE__), %w[ .. functional storage_helper.rb ])
|
13
|
-
|
14
|
-
require 'ruote/fei'
|
15
|
-
require 'ruote/participant'
|
16
|
-
|
17
|
-
|
18
|
-
#
|
19
|
-
# note : using the 'errors' type, but this test is about generic storage, not
|
20
|
-
# about errors per se.
|
21
|
-
#
|
22
|
-
|
23
|
-
class UtStorage < Test::Unit::TestCase
|
24
|
-
|
25
|
-
def setup
|
26
|
-
|
27
|
-
@s = determine_storage({})
|
28
|
-
|
29
|
-
#@s.add_type('errors')
|
30
|
-
|
31
|
-
@s.purge_type!('errors')
|
32
|
-
@s.purge_type!('expressions')
|
33
|
-
@s.purge_type!('msgs')
|
34
|
-
@s.purge_type!('workitems')
|
35
|
-
|
36
|
-
@s.put(
|
37
|
-
'_id' => 'toto',
|
38
|
-
'type' => 'errors',
|
39
|
-
'message' => 'testing')
|
40
|
-
end
|
41
|
-
|
42
|
-
def teardown
|
43
|
-
|
44
|
-
@s.purge_type!('errors')
|
45
|
-
@s.purge_type!('expressions')
|
46
|
-
@s.purge_type!('msgs')
|
47
|
-
@s.purge_type!('workitems')
|
48
|
-
|
49
|
-
@s.shutdown
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_get_configuration
|
53
|
-
|
54
|
-
assert_not_nil @s.get_configuration('engine')
|
55
|
-
end
|
56
|
-
|
57
|
-
def test_get
|
58
|
-
|
59
|
-
h = @s.get('errors', 'toto')
|
60
|
-
|
61
|
-
assert_not_nil h['_rev']
|
62
|
-
|
63
|
-
h = @s.get('errors', 'nada')
|
64
|
-
|
65
|
-
assert_nil h
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_put
|
69
|
-
|
70
|
-
doc = {
|
71
|
-
'_id' => 'test_put', 'type' => 'errors', 'message' => 'testing (2)' }
|
72
|
-
|
73
|
-
@s.put(doc)
|
74
|
-
|
75
|
-
assert_nil doc['_rev']
|
76
|
-
|
77
|
-
h = @s.get('errors', 'test_put')
|
78
|
-
|
79
|
-
assert_not_nil h['_rev']
|
80
|
-
assert_not_nil h['put_at']
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_put_fail
|
84
|
-
|
85
|
-
r = @s.put('_id' => 'toto', 'type' => 'errors', 'message' => 'more')
|
86
|
-
|
87
|
-
assert_equal 'toto', r['_id']
|
88
|
-
assert_not_nil r['_rev']
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_put_update_rev
|
92
|
-
|
93
|
-
doc = { '_id' => 'tpur', 'type' => 'errors', 'message' => 'more' }
|
94
|
-
|
95
|
-
r = @s.put(doc, :update_rev => true)
|
96
|
-
|
97
|
-
assert_not_nil doc['_rev']
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_put_put_and_put
|
101
|
-
|
102
|
-
doc = { '_id' => 'whiskas', 'type' => 'errors', 'message' => 'miam' }
|
103
|
-
|
104
|
-
r = @s.put(doc)
|
105
|
-
doc = @s.get('errors', 'whiskas')
|
106
|
-
|
107
|
-
r = @s.put(doc)
|
108
|
-
assert_nil r
|
109
|
-
|
110
|
-
doc = @s.get('errors', 'whiskas')
|
111
|
-
|
112
|
-
assert_not_nil doc['put_at']
|
113
|
-
|
114
|
-
r = @s.put(doc)
|
115
|
-
assert_nil r
|
116
|
-
end
|
117
|
-
|
118
|
-
def test_put_update_rev_twice
|
119
|
-
|
120
|
-
doc = { '_id' => 'tpurt', 'type' => 'errors', 'message' => 'more' }
|
121
|
-
|
122
|
-
r = @s.put(doc, :update_rev => true)
|
123
|
-
assert_nil r
|
124
|
-
|
125
|
-
doc = { '_id' => 'tpurt', 'type' => 'errors', 'message' => 'more' }
|
126
|
-
|
127
|
-
r = @s.put(doc, :update_rev => true)
|
128
|
-
assert_not_nil r
|
129
|
-
end
|
130
|
-
|
131
|
-
def test_delete_fail
|
132
|
-
|
133
|
-
# missing _rev
|
134
|
-
|
135
|
-
assert_raise(ArgumentError) do
|
136
|
-
@s.delete('_id' => 'toto')
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
def test_delete
|
141
|
-
|
142
|
-
doc = @s.get('errors', 'toto')
|
143
|
-
|
144
|
-
r = @s.delete(doc)
|
145
|
-
|
146
|
-
assert_nil r
|
147
|
-
end
|
148
|
-
|
149
|
-
def test_delete_missing
|
150
|
-
|
151
|
-
r = @s.delete('_id' => 'x', '_rev' => '12-13231123132', 'type' => 'errors')
|
152
|
-
|
153
|
-
assert_equal true, r
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_keys_should_be_string
|
157
|
-
|
158
|
-
doc = { '_id' => 'h0', 'type' => 'errors', :m0 => :z, :m1 => [ :a, :b ] }
|
159
|
-
|
160
|
-
@s.put(doc)
|
161
|
-
|
162
|
-
doc = @s.get('errors', 'h0')
|
163
|
-
|
164
|
-
assert_equal 'z', doc['m0']
|
165
|
-
assert_equal %w[ a b ], doc['m1']
|
166
|
-
end
|
167
|
-
|
168
|
-
# Updating a gone document must result in a 'true' reply.
|
169
|
-
#
|
170
|
-
def test_put_gone
|
171
|
-
|
172
|
-
h = @s.get('errors', 'toto')
|
173
|
-
|
174
|
-
assert_nil @s.delete(h)
|
175
|
-
|
176
|
-
h['colour'] = 'blue'
|
177
|
-
|
178
|
-
assert_equal true, @s.put(h)
|
179
|
-
end
|
180
|
-
|
181
|
-
def test_purge_type
|
182
|
-
|
183
|
-
@s.purge_type!('errors')
|
184
|
-
|
185
|
-
assert_equal 0, @s.get_many('errors').size
|
186
|
-
end
|
187
|
-
|
188
|
-
def test_clear
|
189
|
-
|
190
|
-
@s.clear
|
191
|
-
|
192
|
-
assert_equal 0, @s.get_many('errors').size
|
193
|
-
end
|
194
|
-
|
195
|
-
#def test_purge
|
196
|
-
# @s.purge!
|
197
|
-
# assert_equal 0, @s.get_many('errors').size
|
198
|
-
#end
|
199
|
-
|
200
|
-
def test_ids
|
201
|
-
|
202
|
-
@s.put('_id' => 't_ids0', 'type' => 'errors', 'message' => 'testing')
|
203
|
-
@s.put('_id' => 't_ids1', 'type' => 'errors', 'message' => 'testing')
|
204
|
-
@s.put('_id' => 't_ids2', 'type' => 'errors', 'message' => 'testing')
|
205
|
-
|
206
|
-
assert_equal %w[ t_ids0 t_ids1 t_ids2 toto ], @s.ids('errors').sort
|
207
|
-
end
|
208
|
-
|
209
|
-
def test_get_many
|
210
|
-
|
211
|
-
30.times do |i|
|
212
|
-
@s.put(
|
213
|
-
'_id' => "xx!#{i}",
|
214
|
-
'type' => 'errors',
|
215
|
-
'wfid' => i.to_s,
|
216
|
-
'msg' => "whatever #{i}")
|
217
|
-
end
|
218
|
-
|
219
|
-
assert_equal 31, @s.get_many('errors').size
|
220
|
-
assert_equal 1, @s.get_many('errors', '7').size
|
221
|
-
assert_equal 1, @s.get_many('errors', /!7$/).size
|
222
|
-
assert_equal 30, @s.get_many('errors', /^xx!/).size
|
223
|
-
assert_equal 30, @s.get_many('errors', /x/).size
|
224
|
-
assert_equal 10, @s.get_many('errors', nil, :limit => 10).size
|
225
|
-
end
|
226
|
-
|
227
|
-
def test_get_many_options
|
228
|
-
|
229
|
-
load_30_errors
|
230
|
-
|
231
|
-
# limit
|
232
|
-
|
233
|
-
assert_equal 10, @s.get_many('errors', nil, :limit => 10).size
|
234
|
-
|
235
|
-
# count
|
236
|
-
|
237
|
-
assert_equal 31, @s.get_many('errors', nil, :count => true)
|
238
|
-
|
239
|
-
# skip and limit
|
240
|
-
|
241
|
-
assert_equal(
|
242
|
-
%w[ toto yy!00 yy!01 yy!02 ],
|
243
|
-
@s.get_many(
|
244
|
-
'errors', nil, :skip => 0, :limit => 4
|
245
|
-
).collect { |d| d['_id'] })
|
246
|
-
assert_equal(
|
247
|
-
%w[ yy!02 yy!03 yy!04 ],
|
248
|
-
@s.get_many(
|
249
|
-
'errors', nil, :skip => 3, :limit => 3
|
250
|
-
).collect { |d| d['_id'] })
|
251
|
-
|
252
|
-
# skip, limit and reverse
|
253
|
-
|
254
|
-
assert_equal(
|
255
|
-
%w[ yy!29 yy!28 yy!27 ],
|
256
|
-
@s.get_many(
|
257
|
-
'errors', nil, :skip => 0, :limit => 3, :descending => true
|
258
|
-
).collect { |d| d['_id'] })
|
259
|
-
assert_equal(
|
260
|
-
%w[ yy!29 yy!28 yy!27 ],
|
261
|
-
@s.get_many(
|
262
|
-
'errors', nil, :skip => 0, :limit => 3, :descending => true
|
263
|
-
).collect { |d| d['_id'] })
|
264
|
-
end
|
265
|
-
|
266
|
-
def test_dump
|
267
|
-
|
268
|
-
load_30_errors
|
269
|
-
|
270
|
-
assert @s.dump('errors').length > 0
|
271
|
-
end
|
272
|
-
|
273
|
-
def test_ids_and_errors
|
274
|
-
|
275
|
-
load_30_errors
|
276
|
-
|
277
|
-
assert_equal 31, @s.ids('errors').length
|
278
|
-
end
|
279
|
-
|
280
|
-
def test_ids_are_sorted
|
281
|
-
|
282
|
-
load_30_errors
|
283
|
-
|
284
|
-
assert_equal @s.ids('errors').sort, @s.ids('errors')
|
285
|
-
end
|
286
|
-
|
287
|
-
def test_reserve
|
288
|
-
|
289
|
-
taoe = Thread.abort_on_exception
|
290
|
-
Thread.abort_on_exception = true
|
291
|
-
|
292
|
-
reserved = []
|
293
|
-
threads = []
|
294
|
-
|
295
|
-
threads << Thread.new do
|
296
|
-
i = 0
|
297
|
-
loop do
|
298
|
-
@s.put_msg('launch', 'tree' => i)
|
299
|
-
i = i + 1
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
2.times do
|
304
|
-
|
305
|
-
threads << Thread.new do
|
306
|
-
loop do
|
307
|
-
msgs = @s.get_msgs
|
308
|
-
msgs[0, 100].each do |msg|
|
309
|
-
next if msg['tree'].nil?
|
310
|
-
next unless @s.reserve(msg)
|
311
|
-
if reserved.include?(msg['tree'])
|
312
|
-
puts "=" * 80
|
313
|
-
p [ :dbl, :r, msg['_rev'], :t, msg['tree'] ]
|
314
|
-
end
|
315
|
-
reserved << msg['tree']
|
316
|
-
sleep(rand * 0.01)
|
317
|
-
end
|
318
|
-
end
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
|
-
sleep 7
|
323
|
-
|
324
|
-
threads.each { |t| t.terminate }
|
325
|
-
|
326
|
-
Thread.abort_on_exception = taoe
|
327
|
-
|
328
|
-
assert_equal false, reserved.empty?
|
329
|
-
assert_equal reserved.size, reserved.uniq.size
|
330
|
-
end
|
331
|
-
|
332
|
-
def test_by_field
|
333
|
-
|
334
|
-
return unless @s.respond_to?(:by_field)
|
335
|
-
|
336
|
-
load_workitems
|
337
|
-
|
338
|
-
assert_equal 3, @s.by_field('workitems', 'place', 'kyouto').size
|
339
|
-
assert_equal 1, @s.by_field('workitems', 'place', 'sendai').size
|
340
|
-
assert_equal Hash, @s.by_field('workitems', 'place', 'sendai').first.class
|
341
|
-
end
|
342
|
-
|
343
|
-
def test_by_participant
|
344
|
-
|
345
|
-
return unless @s.respond_to?(:by_participant)
|
346
|
-
|
347
|
-
load_workitems
|
348
|
-
|
349
|
-
assert_equal 2, @s.by_participant('workitems', 'fujiwara', {}).size
|
350
|
-
assert_equal 1, @s.by_participant('workitems', 'shingen', {}).size
|
351
|
-
assert_equal Hash, @s.by_participant('workitems', 'shingen', {}).first.class
|
352
|
-
end
|
353
|
-
|
354
|
-
def test_query_workitems
|
355
|
-
|
356
|
-
return unless @s.respond_to?(:query_workitems)
|
357
|
-
|
358
|
-
load_workitems
|
359
|
-
|
360
|
-
assert_equal 3, @s.query_workitems('place' => 'kyouto').size
|
361
|
-
assert_equal 1, @s.query_workitems('place' => 'kyouto', 'at' => 'kamo').size
|
362
|
-
|
363
|
-
assert_equal(
|
364
|
-
Ruote::Workitem, @s.query_workitems('place' => 'kyouto').first.class)
|
365
|
-
end
|
366
|
-
|
367
|
-
protected
|
368
|
-
|
369
|
-
def load_30_errors
|
370
|
-
|
371
|
-
30.times do |i|
|
372
|
-
@s.put(
|
373
|
-
'_id' => sprintf("yy!%0.2d", i),
|
374
|
-
'type' => 'errors',
|
375
|
-
'msg' => "whatever #{i}")
|
376
|
-
end
|
377
|
-
end
|
378
|
-
|
379
|
-
def put_workitem(wfid, participant_name, fields)
|
380
|
-
|
381
|
-
@s.put(
|
382
|
-
'type' => 'workitems',
|
383
|
-
'_id' => "wi!0_0!12ff!#{wfid}",
|
384
|
-
'participant_name' => participant_name,
|
385
|
-
'wfid' => wfid,
|
386
|
-
'fields' => fields)
|
387
|
-
end
|
388
|
-
|
389
|
-
def load_workitems
|
390
|
-
|
391
|
-
put_workitem(
|
392
|
-
'20110218-nadanada', 'fujiwara', 'place' => 'kyouto')
|
393
|
-
put_workitem(
|
394
|
-
'20110218-nedenada', 'fujiwara', 'place' => 'kyouto', 'at' => 'kamo')
|
395
|
-
put_workitem(
|
396
|
-
'20110218-nadanodo', 'taira', 'place' => 'kyouto')
|
397
|
-
put_workitem(
|
398
|
-
'20110218-nodonada', 'date', 'place' => 'sendai')
|
399
|
-
put_workitem(
|
400
|
-
'20110218-nadanudu', 'shingen', 'place' => 'nagoya')
|
401
|
-
end
|
402
|
-
end
|
403
|
-
|