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
|
@@ -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
|
-
|