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
data/lib/ruote/fs.rb
ADDED
|
@@ -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
|
|
@@ -22,21 +22,44 @@
|
|
|
22
22
|
# Made in Japan.
|
|
23
23
|
#++
|
|
24
24
|
|
|
25
|
-
require '
|
|
26
|
-
require '
|
|
25
|
+
require 'digest/md5'
|
|
26
|
+
require 'rufus/mnemo'
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
module Ruote
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
#
|
|
32
|
+
# The default wfid generator.
|
|
33
|
+
#
|
|
34
|
+
class MnemoWfidGenerator
|
|
35
|
+
|
|
36
|
+
def initialize(context)
|
|
37
|
+
|
|
38
|
+
@context = context
|
|
39
|
+
|
|
40
|
+
@here = "#{Ruote.local_ip}!#{Process.pid}"
|
|
41
|
+
@counter = 0
|
|
42
|
+
#@mutex = Mutex.new
|
|
43
|
+
end
|
|
32
44
|
|
|
33
45
|
def generate
|
|
34
46
|
|
|
35
|
-
|
|
47
|
+
t = Time.now.utc
|
|
48
|
+
time = t.strftime('%Y%m%d-%H%M')
|
|
49
|
+
ms = t.to_f % 60.0
|
|
50
|
+
|
|
51
|
+
#c = @mutex.synchronize { @counter = (@counter + 1) % 100_000 }
|
|
52
|
+
@counter = (@counter + 1) % 100_000
|
|
53
|
+
#
|
|
54
|
+
# no need to worry about skipping a beat, no mutex.
|
|
55
|
+
|
|
56
|
+
s = "#{ms}!#{Thread.current.object_id}!#{@here}!#{@counter}"
|
|
57
|
+
s = Digest::MD5.hexdigest(s)
|
|
36
58
|
|
|
37
|
-
|
|
59
|
+
x = Rufus::Mnemo.from_i(s[0, 6].to_i(16))
|
|
60
|
+
y = Rufus::Mnemo.from_i(s[6, 6].to_i(16))
|
|
38
61
|
|
|
39
|
-
"#{
|
|
62
|
+
"#{time}-#{x}-#{y}"
|
|
40
63
|
end
|
|
41
64
|
end
|
|
42
65
|
end
|
|
@@ -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
|
|
@@ -22,59 +22,38 @@
|
|
|
22
22
|
# Made in Japan.
|
|
23
23
|
#++
|
|
24
24
|
|
|
25
|
+
require 'digest/md5'
|
|
26
|
+
|
|
25
27
|
|
|
26
28
|
module Ruote
|
|
27
29
|
|
|
30
|
+
#
|
|
31
|
+
# An example of wfid generator.
|
|
32
|
+
#
|
|
28
33
|
class WfidGenerator
|
|
29
34
|
|
|
30
35
|
def initialize(context)
|
|
31
36
|
|
|
32
37
|
@context = context
|
|
33
38
|
|
|
34
|
-
@
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
@here = "#{Ruote.local_ip}!#{Process.pid}"
|
|
40
|
+
@counter = 0
|
|
41
|
+
#@mutex = Mutex.new
|
|
37
42
|
end
|
|
38
43
|
|
|
39
44
|
def generate
|
|
40
45
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
protected
|
|
47
|
-
|
|
48
|
-
def get_raw
|
|
49
|
-
|
|
50
|
-
lraw = @last['raw'] + 0.01
|
|
51
|
-
|
|
52
|
-
raw = Time.now.utc
|
|
53
|
-
raw = raw + 0.01 while raw.to_f <= lraw
|
|
54
|
-
|
|
55
|
-
@last['raw'] = raw.to_f
|
|
56
|
-
|
|
57
|
-
last = @context.storage.put(@last, :update_rev => true)
|
|
46
|
+
t = Time.now.utc
|
|
47
|
+
time = t.strftime('%Y%m%d-%H%M%S')
|
|
48
|
+
ms = t.to_f % 1.0
|
|
58
49
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
# 'last' is gone, have to put new one
|
|
62
|
-
@last.delete('_rev')
|
|
63
|
-
get_raw
|
|
50
|
+
#c = @mutex.synchronize { @counter = (@counter + 1) % 10_000 }
|
|
51
|
+
c = @counter = (@counter + 1) % 10_000
|
|
64
52
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
# put failed, have to re-ask
|
|
68
|
-
#
|
|
69
|
-
@last = last
|
|
70
|
-
get_raw
|
|
53
|
+
x = "#{ms}!#{Thread.current.object_id}!#{@here}!#{c}"
|
|
54
|
+
x = Digest::MD5.hexdigest(x)
|
|
71
55
|
|
|
72
|
-
|
|
73
|
-
#
|
|
74
|
-
# put successful, we can build a new wfid
|
|
75
|
-
#
|
|
76
|
-
raw
|
|
77
|
-
end
|
|
56
|
+
"#{time}-#{x}"
|
|
78
57
|
end
|
|
79
58
|
end
|
|
80
59
|
end
|
|
@@ -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
|
|
@@ -29,11 +29,21 @@ module Ruote
|
|
|
29
29
|
# A default history implementation, only keeps the most recent stuff
|
|
30
30
|
# in memory.
|
|
31
31
|
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
32
|
+
# This class includes Enumerable.
|
|
33
|
+
#
|
|
34
|
+
# NOTE:
|
|
35
|
+
#
|
|
36
|
+
# this default history is worthless when there are multiple workers.
|
|
37
|
+
# It only keeps track of the msgs processed by the worker in the same
|
|
38
|
+
# context. Msgs processed by other workers (in different Ruby runtimes) are
|
|
39
|
+
# not seen (they are tracked by the DefaultHistory next to those workers).
|
|
40
|
+
#
|
|
41
|
+
# By default, this history keeps track of the latest 1'000 msgs.
|
|
34
42
|
#
|
|
35
43
|
class DefaultHistory
|
|
36
44
|
|
|
45
|
+
include Enumerable
|
|
46
|
+
|
|
37
47
|
DATE_REGEX = /!(\d{4}-\d{2}-\d{2})!/
|
|
38
48
|
DEFAULT_MAX_SIZE = 1000
|
|
39
49
|
|
|
@@ -43,9 +53,6 @@ module Ruote
|
|
|
43
53
|
@options = options
|
|
44
54
|
|
|
45
55
|
@history = []
|
|
46
|
-
|
|
47
|
-
@context.worker.subscribe(:all, self) if @context.worker
|
|
48
|
-
# only care about logging if there is a worker present
|
|
49
56
|
end
|
|
50
57
|
|
|
51
58
|
# Returns all the msgs (events), most recent one is last.
|
|
@@ -55,6 +62,13 @@ module Ruote
|
|
|
55
62
|
@history
|
|
56
63
|
end
|
|
57
64
|
|
|
65
|
+
# Enabling Enumerable...
|
|
66
|
+
#
|
|
67
|
+
def each(&block)
|
|
68
|
+
|
|
69
|
+
@history.each(&block)
|
|
70
|
+
end
|
|
71
|
+
|
|
58
72
|
# Returns all the wfids for which some piece of history is kept.
|
|
59
73
|
#
|
|
60
74
|
def wfids
|
|
@@ -103,10 +117,10 @@ module Ruote
|
|
|
103
117
|
@history.clear
|
|
104
118
|
end
|
|
105
119
|
|
|
106
|
-
# This is
|
|
107
|
-
# are
|
|
120
|
+
# This method is called by the worker via the context. Successfully
|
|
121
|
+
# processed msgs are passed here.
|
|
108
122
|
#
|
|
109
|
-
def
|
|
123
|
+
def on_msg(msg)
|
|
110
124
|
|
|
111
125
|
msg = Ruote.fulldup(msg)
|
|
112
126
|
msg['seen_at'] = Ruote.now_to_utc_s
|
|
@@ -0,0 +1,265 @@
|
|
|
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
|
+
class Ruote::WaitLogger
|
|
27
|
+
|
|
28
|
+
# fancy msg logic
|
|
29
|
+
|
|
30
|
+
protected
|
|
31
|
+
|
|
32
|
+
#--
|
|
33
|
+
# <ESC>[{attr1};...;{attrn}m
|
|
34
|
+
#
|
|
35
|
+
# 0 Reset all attributes
|
|
36
|
+
# 1 Bright
|
|
37
|
+
# 2 Dim
|
|
38
|
+
# 4 Underscore
|
|
39
|
+
# 5 Blink
|
|
40
|
+
# 7 Reverse
|
|
41
|
+
# 8 Hidden
|
|
42
|
+
#
|
|
43
|
+
# Foreground Colours
|
|
44
|
+
# 30 Black
|
|
45
|
+
# 31 Red
|
|
46
|
+
# 32 Green
|
|
47
|
+
# 33 Yellow
|
|
48
|
+
# 34 Blue
|
|
49
|
+
# 35 Magenta
|
|
50
|
+
# 36 Cyan
|
|
51
|
+
# 37 White
|
|
52
|
+
#
|
|
53
|
+
# Background Colours
|
|
54
|
+
# 40 Black
|
|
55
|
+
# 41 Red
|
|
56
|
+
# 42 Green
|
|
57
|
+
# 43 Yellow
|
|
58
|
+
# 44 Blue
|
|
59
|
+
# 45 Magenta
|
|
60
|
+
# 46 Cyan
|
|
61
|
+
# 47 White
|
|
62
|
+
#++
|
|
63
|
+
|
|
64
|
+
def color(mod, s, clear=false)
|
|
65
|
+
|
|
66
|
+
return s if Ruote::WIN
|
|
67
|
+
return s unless STDOUT.tty?
|
|
68
|
+
|
|
69
|
+
"[#{mod}m#{s}[0m#{clear ? '' : "[#{@color}m"}"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def fei_to_s(fei, wfid)
|
|
73
|
+
[
|
|
74
|
+
fei['expid'],
|
|
75
|
+
fei['subid'][0, 5] + '...',
|
|
76
|
+
fei['wfid'] != wfid ? fei['wfid'] : ''
|
|
77
|
+
].join('!')
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def insp(o, opts={})
|
|
81
|
+
|
|
82
|
+
case o
|
|
83
|
+
when nil
|
|
84
|
+
'nil'
|
|
85
|
+
when Hash
|
|
86
|
+
trim = opts[:trim] || []
|
|
87
|
+
'{' +
|
|
88
|
+
o.reject { |k, v|
|
|
89
|
+
v.nil? && trim.include?(k.to_s)
|
|
90
|
+
}.collect { |k, v|
|
|
91
|
+
"#{k}: #{insp(v)}"
|
|
92
|
+
}.join(', ') +
|
|
93
|
+
'}'
|
|
94
|
+
when Array
|
|
95
|
+
'[' + o.collect { |e| insp(e) }.join(', ') + ']'
|
|
96
|
+
when String
|
|
97
|
+
o.match(/\s/) ? o.inspect : o
|
|
98
|
+
else
|
|
99
|
+
o.inspect
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def radial_tree(msg)
|
|
104
|
+
|
|
105
|
+
_, t = Ruote::Exp::DefineExpression.reorganize(msg['tree'])
|
|
106
|
+
|
|
107
|
+
Ruote::Reader.to_expid_radial(t).split("\n").inject('') do |s, l|
|
|
108
|
+
m = l.match(/^(\s*[0-9_]+)(.+)$/)
|
|
109
|
+
s << "\n "
|
|
110
|
+
s << color(33, m[1])
|
|
111
|
+
s << color(32, m[2])
|
|
112
|
+
s
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def fancy_print(msg, noisy=true)
|
|
117
|
+
|
|
118
|
+
@count = (@count + 1) % 10
|
|
119
|
+
|
|
120
|
+
ei = [
|
|
121
|
+
self.object_id.to_s[-2..-1],
|
|
122
|
+
Thread.current['worker_name'].to_s[0, 2]
|
|
123
|
+
].join(':')
|
|
124
|
+
|
|
125
|
+
fei = msg['fei']
|
|
126
|
+
depth = fei ? fei['expid'].split('_').size : 0
|
|
127
|
+
|
|
128
|
+
i = fei ?
|
|
129
|
+
[ fei['wfid'], (fei['subid'] || '')[0, 5], fei['expid'] ].join(' ') :
|
|
130
|
+
msg['wfid']
|
|
131
|
+
wfid = fei ? fei['wfid'] : msg['wfid']
|
|
132
|
+
|
|
133
|
+
rest = msg.dup
|
|
134
|
+
%w[
|
|
135
|
+
_id put_at _rev
|
|
136
|
+
type action
|
|
137
|
+
fei wfid variables
|
|
138
|
+
].each { |k| rest.delete(k) }
|
|
139
|
+
|
|
140
|
+
if v = rest['parent_id']
|
|
141
|
+
rest['parent_id'] = fei_to_s(v, wfid)
|
|
142
|
+
end
|
|
143
|
+
if v = rest.delete('workitem')
|
|
144
|
+
rest[:wi] = [
|
|
145
|
+
v['fei'] ? fei_to_s(v['fei'], wfid) : nil,
|
|
146
|
+
v['fields'].size ]
|
|
147
|
+
end
|
|
148
|
+
if v = rest.delete('supplanted')
|
|
149
|
+
rest[:supplanted] = '...'
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
#if t = rest.delete('tree')
|
|
153
|
+
# rest[:t] = color(37, t.inspect, true)
|
|
154
|
+
#end
|
|
155
|
+
|
|
156
|
+
{ 'tree' => :t, 'parent_id' => :pi }.each do |k0, k1|
|
|
157
|
+
if v = rest.delete(k0)
|
|
158
|
+
rest[k1] = v
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
#rest.delete(:t) if fei.nil? && msg['action'] == 'launch'
|
|
163
|
+
#
|
|
164
|
+
# don't do that since the radial display is reorganized and this
|
|
165
|
+
# tree is not.
|
|
166
|
+
|
|
167
|
+
if v = rest.delete('participant')
|
|
168
|
+
rest['part'] = v.first == 'Ruote::BlockParticipant' ? v.first : v
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
act = msg['action'][0, 2]
|
|
172
|
+
act = case msg['action']
|
|
173
|
+
when 'receive' then 'rc'
|
|
174
|
+
when 'dispatched' then 'dd'
|
|
175
|
+
when 'dispatch_cancel' then 'dc'
|
|
176
|
+
when 'dispatch_pause' then 'dp'
|
|
177
|
+
when 'dispatch_resume' then 'dr'
|
|
178
|
+
when 'pause', 'pause_process' then 'pz'
|
|
179
|
+
when 'resume', 'resume_process' then 'rz'
|
|
180
|
+
when 'regenerate' then 'rg'
|
|
181
|
+
when 'reput' then 'rp'
|
|
182
|
+
when 'respark' then 'sk'
|
|
183
|
+
else act
|
|
184
|
+
end
|
|
185
|
+
act = case act
|
|
186
|
+
when 'la', 'rg', 'sk' then color('4;32', act)
|
|
187
|
+
when 'te' then color('4;31', act)
|
|
188
|
+
when 'ce' then color('31', act)
|
|
189
|
+
when 'ca' then color('31', act)
|
|
190
|
+
when 'dc' then color('4;31', act)
|
|
191
|
+
when 'pz' then color('4;31', act)
|
|
192
|
+
when 'rz' then color('4;32', act)
|
|
193
|
+
when 'dp' then color('4;31', act)
|
|
194
|
+
when 'dr' then color('4;32', act)
|
|
195
|
+
when 'rp' then color('32', act)
|
|
196
|
+
when 'er', 'ra' then color('31', act)
|
|
197
|
+
when 'di', 'dd', 'rc' then color('4;33', act)
|
|
198
|
+
else act
|
|
199
|
+
end
|
|
200
|
+
unless ACTIONS.include?(msg['action'])
|
|
201
|
+
rest['action'] = msg['action']
|
|
202
|
+
act = color('36', msg['action'][0, 2])
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
tm = Time.now
|
|
206
|
+
tm = tm.strftime('%M:%S.') + ('%03d' % ((tm.to_f % 1.0) * 1000.0).to_i)
|
|
207
|
+
tm = color(37, tm, false)
|
|
208
|
+
|
|
209
|
+
s = if %w[ error_intercepted raise ].include?(msg['action'])
|
|
210
|
+
#
|
|
211
|
+
# display backtraces
|
|
212
|
+
|
|
213
|
+
rst = insp(
|
|
214
|
+
rest.reject { |k, v| %w[ error msg ].include?(k) },
|
|
215
|
+
:trim => %[ updated_tree ])[1..-2]
|
|
216
|
+
|
|
217
|
+
tail = []
|
|
218
|
+
tail << " #{wfid} * class: #{rest['error']['class']}"
|
|
219
|
+
tail << " #{wfid} * msg: #{rest['error']['message']}"
|
|
220
|
+
|
|
221
|
+
trace = rest['error']['trace']
|
|
222
|
+
trace = trace[0, 2] + [ '...' ] if msg['action'] == 'raise'
|
|
223
|
+
|
|
224
|
+
trace.each { |line| tail << " #{wfid} #{line}" }
|
|
225
|
+
|
|
226
|
+
color(
|
|
227
|
+
@color,
|
|
228
|
+
"#{@count} #{tm} #{ei} #{' ' * depth}#{act} * #{i} #{rst}",
|
|
229
|
+
true
|
|
230
|
+
) +
|
|
231
|
+
"\n" +
|
|
232
|
+
color(
|
|
233
|
+
@color,
|
|
234
|
+
tail.join("\n"),
|
|
235
|
+
true)
|
|
236
|
+
|
|
237
|
+
else
|
|
238
|
+
#
|
|
239
|
+
# regular "lines"
|
|
240
|
+
|
|
241
|
+
pa = if %w[ receive dispatch dispatch_cancel ].include?(msg['action'])
|
|
242
|
+
color('34', rest.delete('participant_name')) + ' '
|
|
243
|
+
else
|
|
244
|
+
''
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
rest = insp(rest, :trim => %[ updated_tree ])[1..-2]
|
|
248
|
+
|
|
249
|
+
color(
|
|
250
|
+
@color,
|
|
251
|
+
"#{@count} #{tm} #{ei} #{' ' * depth}#{act} * #{i} #{pa}#{rest}",
|
|
252
|
+
true)
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
s << radial_tree(msg) if fei.nil? && msg['action'] == 'launch'
|
|
256
|
+
|
|
257
|
+
s
|
|
258
|
+
|
|
259
|
+
rescue => e
|
|
260
|
+
"* fancy_print fail\n" +
|
|
261
|
+
"** msg: #{msg.inspect}\n" +
|
|
262
|
+
"** err: #{e.to_s} / #{e.backtrace.first}"
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|