trace-util-adv 0.1.1 → 0.2.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 +7 -0
- data/VERSION +1 -1
- data/lib/README +87 -0
- data/lib/TODO.txt +12 -0
- data/lib/action_handler.rb +99 -0
- data/lib/appenders/appender.rb +97 -0
- data/lib/appenders/appender_registration.rb +16 -0
- data/lib/appenders/base_appender.rb +82 -0
- data/lib/appenders/file_appender.rb +72 -0
- data/lib/appenders/html_appender.rb +94 -0
- data/lib/appenders/logger_appender.rb +84 -0
- data/lib/appenders/stream_appender.rb +37 -0
- data/lib/appenders/template_log_appender.rb +28 -0
- data/lib/appenders/xml_appender.rb +75 -0
- data/lib/core_extensions.rb +101 -0
- data/lib/filters/base_filters.rb +178 -0
- data/lib/filters/composite_filters.rb +71 -0
- data/lib/filters/filter_factory.rb +17 -0
- data/lib/filters/message_filters.rb +35 -0
- data/lib/filters/tracing_filter.rb +88 -0
- data/lib/output_templates.rb +5 -0
- data/lib/rule_match.rb +38 -0
- data/lib/sample_filters.rb +95 -0
- data/lib/templates/base_template.rb +21 -0
- data/lib/templates/html_template.rb +48 -0
- data/lib/templates/string_template.rb +30 -0
- data/lib/templates/trace_output_handler.rb +47 -0
- data/lib/templates/xml_template.rb +36 -0
- data/lib/test_action_handler.rb +34 -0
- data/lib/test_appender.rb +29 -0
- data/lib/test_file_appender.rb +32 -0
- data/lib/test_filters.rb +112 -0
- data/lib/test_filters_chain.rb +100 -0
- data/lib/test_filters_create.rb +28 -0
- data/lib/test_html_appender.rb +66 -0
- data/lib/test_special_filters.rb +78 -0
- data/lib/test_xml_appender.rb +66 -0
- data/lib/test_xml_gen.rb +46 -0
- data/lib/trace_appenders.rb +9 -0
- data/lib/trace_calls.rb +86 -0
- data/lib/trace_ext.rb +57 -0
- data/lib/trace_filters.rb +4 -0
- data/trace-util-adv.gemspec +98 -0
- metadata +44 -2
@@ -0,0 +1,47 @@
|
|
1
|
+
module Tracing
|
2
|
+
module OutputHandler
|
3
|
+
|
4
|
+
# TODO: refactor (duplicate of appender method)
|
5
|
+
def method_stack
|
6
|
+
@method_stack ||= []
|
7
|
+
end
|
8
|
+
|
9
|
+
# override to increase # of spaces for each indenation level!
|
10
|
+
def space_count
|
11
|
+
1
|
12
|
+
end
|
13
|
+
|
14
|
+
# calculate indentation level, based on method stack level (# of nested method calls)
|
15
|
+
def indentation
|
16
|
+
s = ""
|
17
|
+
lv = method_stack.empty? ? 0 : method_stack.size-1
|
18
|
+
lv.times { s << (" " * space_count) }
|
19
|
+
s
|
20
|
+
end
|
21
|
+
|
22
|
+
def output(template, context)
|
23
|
+
# get spaces to indent each line
|
24
|
+
spaces = indentation
|
25
|
+
|
26
|
+
# modify template, inserting indentation
|
27
|
+
lines = template.split("\n")
|
28
|
+
lines.map!{|line| spaces + line + "\n"}
|
29
|
+
template = lines.join
|
30
|
+
|
31
|
+
# send modified template to output handler with context
|
32
|
+
output_handler(template, context)
|
33
|
+
end
|
34
|
+
|
35
|
+
# default output action: put string to STDOUT
|
36
|
+
# override this to customize trace handling
|
37
|
+
def output_handler(template, context)
|
38
|
+
# create new erb template
|
39
|
+
erb_template = ERB.new template
|
40
|
+
|
41
|
+
# evaluate erb template for output using context
|
42
|
+
str_res = erb_template.result(binding)
|
43
|
+
# send final output to action handlers for further processing...
|
44
|
+
# action_handlers(str_res, context)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Tracing
|
2
|
+
module OutputTemplate
|
3
|
+
class XmlTrace < BaseTrace
|
4
|
+
def before_template(context)
|
5
|
+
template = <<-EOF
|
6
|
+
<method name="<%= context[:method_full_name] %>">
|
7
|
+
<modules><%= context[:full_module_name] %></modules>
|
8
|
+
<class><%= context[:class_name].join(',') %></class>
|
9
|
+
<args><%= context[:args].inspect %></args>
|
10
|
+
#block#
|
11
|
+
EOF
|
12
|
+
end
|
13
|
+
|
14
|
+
def before_block_template
|
15
|
+
template = <<-EOF
|
16
|
+
<block-arg>true</block-arg>
|
17
|
+
EOF
|
18
|
+
end
|
19
|
+
|
20
|
+
def end_template(context)
|
21
|
+
template = <<-EOF
|
22
|
+
<result><%= context[:result] %></result>
|
23
|
+
</method>
|
24
|
+
EOF
|
25
|
+
end
|
26
|
+
|
27
|
+
# override
|
28
|
+
def handle_before_call(context)
|
29
|
+
template = before_template(context)
|
30
|
+
block_replace = context[:block] ? before_block_template : ""
|
31
|
+
template.gsub!(/#block#/, block_replace)
|
32
|
+
output(template, context)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "core_extensions"
|
2
|
+
require "trace_calls"
|
3
|
+
require "sample_filters"
|
4
|
+
require "rubygems"
|
5
|
+
require "duration"
|
6
|
+
require "test/unit"
|
7
|
+
|
8
|
+
class TestFilter < Test::Unit::TestCase
|
9
|
+
|
10
|
+
attr_reader :ah1, :filters
|
11
|
+
|
12
|
+
def setup
|
13
|
+
# tla1 = Tracing::TemplateLogAppender.new(:options => {:overwrite => false, :time_limit => 2.minutes}, :tracer => :string)
|
14
|
+
# action handler is configured with a set of filters and a set of appenders
|
15
|
+
# the appenders are called in turn if log statement passes all filters!
|
16
|
+
# @ah1 = Tracing::ActionHandler.new(:filters => @filters = Module_filter_A)
|
17
|
+
|
18
|
+
appender_options = {:options => {:overwrite => false, :time_limit => 2.minutes}, :type => :logger, :tracer => :string}
|
19
|
+
# @ah2 = Tracing::ActionHandler.new(:filters => @filters = [Module_filter_A, Method_filter_A], :appenders => appender_options)
|
20
|
+
|
21
|
+
@ah3 = Tracing::ActionHandler.new(:filters => @filters = [Module_filter_A, Method_filter_A], :appenders => :logger)
|
22
|
+
end
|
23
|
+
|
24
|
+
def teardown
|
25
|
+
## Nothing really
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_filter
|
29
|
+
puts "ActionHandler:" + @ah3.inspect
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "core_extensions"
|
2
|
+
require "trace_calls"
|
3
|
+
require "sample_filters"
|
4
|
+
require "rubygems"
|
5
|
+
require "duration"
|
6
|
+
require "test/unit"
|
7
|
+
|
8
|
+
class TestFilter < Test::Unit::TestCase
|
9
|
+
|
10
|
+
attr_reader :ah1, :filters
|
11
|
+
|
12
|
+
def setup
|
13
|
+
# Tracing::Appender.register_default_mappings
|
14
|
+
|
15
|
+
# test all the ways an appender can be initialized!
|
16
|
+
@ah1 = Tracing::LoggerAppender.new(:tracer => :html)
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
## Nothing really
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_filter
|
24
|
+
puts @ah1.inspect
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "core_extensions"
|
2
|
+
require "trace_calls"
|
3
|
+
require "sample_filters"
|
4
|
+
require "rubygems"
|
5
|
+
require "duration"
|
6
|
+
require "test/unit"
|
7
|
+
|
8
|
+
class TestFilter < Test::Unit::TestCase
|
9
|
+
|
10
|
+
attr_reader :ah1, :filters
|
11
|
+
|
12
|
+
def setup
|
13
|
+
# Tracing::Appender.register_default_mappings
|
14
|
+
@file = 'test.txt'
|
15
|
+
|
16
|
+
# test all the ways an appender can be initialized!
|
17
|
+
@file_appender = Tracing::FileAppender.new({:overwrite => true, :to_file => @file})
|
18
|
+
end
|
19
|
+
|
20
|
+
def teardown
|
21
|
+
## Nothing really
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_filter
|
25
|
+
@file_appender.write_file(@file, "Hello World")
|
26
|
+
marker_txt = 'World'
|
27
|
+
@file_appender.insert_into_file(@file, 'My old ', marker_txt)
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
end
|
32
|
+
|
data/lib/test_filters.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require "core_extensions"
|
2
|
+
require "trace_calls"
|
3
|
+
require "output_templates"
|
4
|
+
require "sample_filters"
|
5
|
+
require "rubygems"
|
6
|
+
require "duration"
|
7
|
+
require "test/unit"
|
8
|
+
|
9
|
+
# configure use of TraceExt
|
10
|
+
module Me
|
11
|
+
class My
|
12
|
+
|
13
|
+
def hello
|
14
|
+
puts "Hello cruel World!"
|
15
|
+
end
|
16
|
+
|
17
|
+
def hi_there
|
18
|
+
puts "Hello cruel World!"
|
19
|
+
end
|
20
|
+
|
21
|
+
def blip
|
22
|
+
puts "Blip!"
|
23
|
+
end
|
24
|
+
|
25
|
+
def blap
|
26
|
+
puts "Blap!"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Method_filter_hello = {
|
33
|
+
:name => 'my methods',
|
34
|
+
:method_rules => [{
|
35
|
+
# id of method rule set
|
36
|
+
:name => 'my_methods',
|
37
|
+
:include => [/hi.*/, 'blip', 'blap'],
|
38
|
+
:exclude => ['hello'],
|
39
|
+
:default => false
|
40
|
+
}]
|
41
|
+
}
|
42
|
+
|
43
|
+
|
44
|
+
class TestFilter < Test::Unit::TestCase
|
45
|
+
|
46
|
+
attr_reader :ah1, :filters
|
47
|
+
|
48
|
+
def setup
|
49
|
+
# module filter is created (see sample filters)
|
50
|
+
# @module_filter = Tracing::ModuleFilter.new(Module_filter_A)
|
51
|
+
|
52
|
+
# Appender is configured with some appender options and a Tracer
|
53
|
+
# string_tracer = Tracing::OutputTemplate::StringTrace.new
|
54
|
+
# template_log_options = {:options => {:overwrite => false, :time_limit => 2.minutes}, :tracer => string_tracer}
|
55
|
+
# tla1 = Tracing::TemplateLogAppender.new(:options => {:overwrite => false, :time_limit => 2.minutes}, :tracer => :string)
|
56
|
+
|
57
|
+
# action handler is configured with a set of filters and a set of appenders
|
58
|
+
# the appenders are called in turn if log statement passes all filters!
|
59
|
+
@ah1 = Tracing::ActionHandler.new(:filters => @filters = [Module_filter_A, Method_filter_A], :appenders => :logger)
|
60
|
+
|
61
|
+
appender_options = {:options => {:overwrite => false, :time_limit => 2.minutes}, :type => :logger, :tracer => :string}
|
62
|
+
|
63
|
+
# @ah2 = Tracing::ActionHandler.new(:filters => @filters = [Module_filter_A, Method_filter_A], :appenders => appender_options)
|
64
|
+
|
65
|
+
# TraceExt is configured with a set of action handlers
|
66
|
+
# on any method call the set of action handlers are called if all initial filters are passed
|
67
|
+
# Tracing::TraceExt.register_action_handlers([ah1])
|
68
|
+
end
|
69
|
+
|
70
|
+
def teardown
|
71
|
+
## Nothing really
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_filter
|
75
|
+
# module_filter = Tracing::ModuleFilter.new(Module_filter_A)
|
76
|
+
|
77
|
+
# TraceExt can be configured with a set of 'initial' filters, that determine if the method should have theaspects applied at all
|
78
|
+
# Tracing::TraceExt.register_filters([module_filter])
|
79
|
+
# , :filters => Class_filter_A
|
80
|
+
# Tracing::TraceExt.configure(:action_handlers => [ah1])
|
81
|
+
# Tracing::TraceExt.configure(:appenders => :logger)
|
82
|
+
|
83
|
+
dryml_classes_to_trace = [ 'My']
|
84
|
+
|
85
|
+
dryml_classes_to_trace.each do |cls|
|
86
|
+
str = "Me::#{cls}.class_eval { include Tracing::TraceCalls }"
|
87
|
+
puts str
|
88
|
+
eval str
|
89
|
+
end
|
90
|
+
|
91
|
+
# Me::My.class_eval { include Tracing::TraceCalls }
|
92
|
+
|
93
|
+
Tracing::HtmlAppender.default_path = 'log_files/html'
|
94
|
+
|
95
|
+
# Tracing::TraceExt.configure(:appenders => {:type => :html, :to_file => 'log_files/html/traced.html'})
|
96
|
+
Tracing::TraceExt.configure(:type => :html, :to_file => 'traced4.html', :filters => Method_filter_hello)
|
97
|
+
|
98
|
+
# Tracing::TraceExt.configure(:filters => Class_filter_A)
|
99
|
+
#
|
100
|
+
my = Me::My.new
|
101
|
+
my.hello
|
102
|
+
my.hi_there
|
103
|
+
my.blip
|
104
|
+
my.blap
|
105
|
+
|
106
|
+
|
107
|
+
# my.action_handlers(['a', 'b'], context)
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
end
|
112
|
+
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require "core_extensions"
|
2
|
+
require "trace_calls"
|
3
|
+
require "output_templates"
|
4
|
+
require "rubygems"
|
5
|
+
require "duration"
|
6
|
+
require "test/unit"
|
7
|
+
|
8
|
+
# configure use of TraceExt
|
9
|
+
module Me
|
10
|
+
class My
|
11
|
+
|
12
|
+
def hello
|
13
|
+
puts "Hello World!"
|
14
|
+
end
|
15
|
+
|
16
|
+
def hi_there
|
17
|
+
puts "Hi there!"
|
18
|
+
end
|
19
|
+
|
20
|
+
def blip
|
21
|
+
puts "Blip!"
|
22
|
+
end
|
23
|
+
|
24
|
+
def blap
|
25
|
+
puts "Blap!"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Method_filter_A = {
|
32
|
+
:name => 'my methods',
|
33
|
+
:method_rules => [{
|
34
|
+
# id of method rule set
|
35
|
+
:name => 'my_methods',
|
36
|
+
:include => [/hi.*/],
|
37
|
+
:exclude => ['hello'],
|
38
|
+
:default => :yield
|
39
|
+
}]
|
40
|
+
}
|
41
|
+
|
42
|
+
# Method_filter_B = {
|
43
|
+
# :name => 'my methods',
|
44
|
+
# :method_rules => [{
|
45
|
+
# # id of method rule set
|
46
|
+
# :name => 'my_methods',
|
47
|
+
# :include => ['blip', 'blop'],
|
48
|
+
# :default => :yield
|
49
|
+
# }]
|
50
|
+
# }
|
51
|
+
|
52
|
+
|
53
|
+
class TestFilter < Test::Unit::TestCase
|
54
|
+
|
55
|
+
attr_reader :ah1, :filters
|
56
|
+
|
57
|
+
def setup
|
58
|
+
end
|
59
|
+
|
60
|
+
def teardown
|
61
|
+
## Nothing really
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_filter
|
65
|
+
# Tracing::TraceExt.configure(:appenders => :logger, :filters => [Method_filter_A, Method_filter_B])
|
66
|
+
Me::My.class_eval { include Tracing::TraceCalls }
|
67
|
+
|
68
|
+
Tracing::HtmlAppender.default_path = 'log_files/html'
|
69
|
+
|
70
|
+
names_A = %w{blip blop}
|
71
|
+
names_B = "blip blop"
|
72
|
+
names_C = "blip, blop"
|
73
|
+
|
74
|
+
bfil = {:xmethod_filter => names_B}
|
75
|
+
|
76
|
+
# method_filter_A = Tracing::Filter.create_filter({:imethod_filter => names_A})
|
77
|
+
method_filter_B = Tracing::Filter.create_filter(bfil)
|
78
|
+
# method_filter_C = Tracing::Filter.create_filter({:imethod_filter => names_C})
|
79
|
+
|
80
|
+
# Tracing::TraceExt.configure(:appenders => {:type => :html, :to_file => 'log_files/html/traced.html'})
|
81
|
+
meth_filter_A = {:imethod_filter => names_A}
|
82
|
+
|
83
|
+
puts "mf B: " + method_filter_B.inspect
|
84
|
+
|
85
|
+
Tracing::TraceExt.configure(:appenders => {:type => :html, :to_file => 'traced4.html'}, :filters => [meth_filter_A], :final_yield => :exclude)
|
86
|
+
|
87
|
+
puts "Handlers configured:" + Tracing::TraceExt.action_handlers.inspect
|
88
|
+
|
89
|
+
#
|
90
|
+
my = Me::My.new
|
91
|
+
my.hello
|
92
|
+
my.hi_there
|
93
|
+
my.blip
|
94
|
+
my.blap
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
end
|
100
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "core_extensions"
|
2
|
+
require "trace_calls"
|
3
|
+
require "output_templates"
|
4
|
+
require "rubygems"
|
5
|
+
require "duration"
|
6
|
+
require "test/unit"
|
7
|
+
|
8
|
+
class TestFilter < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
## Nothing really
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_filter_create
|
15
|
+
|
16
|
+
names = %w{blip blop}
|
17
|
+
puts "create include method filter, names: #{names}"
|
18
|
+
method_filter_B = Tracing::Filter.create_filter({:imethod_filter => names})
|
19
|
+
|
20
|
+
f = Tracing::BaseFilter.create_filter(method_filter_B)
|
21
|
+
|
22
|
+
puts method_filter_B.inspect
|
23
|
+
puts f.inspect
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "core_extensions"
|
2
|
+
require "trace_calls"
|
3
|
+
require "output_templates"
|
4
|
+
require "sample_filters"
|
5
|
+
require "rubygems"
|
6
|
+
require "duration"
|
7
|
+
require "test/unit"
|
8
|
+
|
9
|
+
class TestFilter < Test::Unit::TestCase
|
10
|
+
|
11
|
+
attr_reader :ah1, :filters
|
12
|
+
|
13
|
+
def setup
|
14
|
+
# Tracing::Appender.register_default_mappings
|
15
|
+
|
16
|
+
# test all the ways an appender can be initialized!
|
17
|
+
@ah1 = Tracing::HtmlAppender.new(:tracer => :html, :to_file => 'log_files/html/traced.html')
|
18
|
+
end
|
19
|
+
|
20
|
+
def teardown
|
21
|
+
## Nothing really
|
22
|
+
end
|
23
|
+
|
24
|
+
def method_full_name(context)
|
25
|
+
"#{context[:class_name]}.#{context[:method_name]}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_filter
|
29
|
+
cls_name = "Alpha::Beta::Gamma"
|
30
|
+
name = "my_method"
|
31
|
+
my_instance_variables = {:template_path => 'taglibs/rapid_core.dryml'}
|
32
|
+
args = {:a => 7}
|
33
|
+
@context = {
|
34
|
+
:modules => cls_name.modules,
|
35
|
+
:class_name => cls_name.class_name,
|
36
|
+
:full_class_name => cls_name,
|
37
|
+
:method_name => name,
|
38
|
+
:args => args,
|
39
|
+
:block => false,
|
40
|
+
:vars => my_instance_variables # to carry @template_path etc.
|
41
|
+
}
|
42
|
+
@context[:method_full_name] = method_full_name(@context)
|
43
|
+
|
44
|
+
@ah1.allow_append("BEGIN #{name}", @context)
|
45
|
+
|
46
|
+
name = "my_other_method"
|
47
|
+
|
48
|
+
@context[:method_name] = name
|
49
|
+
@context[:method_full_name] = method_full_name(@context)
|
50
|
+
|
51
|
+
@ah1.allow_append("BEGIN #{name}", @context)
|
52
|
+
|
53
|
+
@context[:result] = "32"
|
54
|
+
@ah1.allow_append("END #{name}", @context)
|
55
|
+
|
56
|
+
name = "my_method"
|
57
|
+
@context[:method_name] = name
|
58
|
+
@context[:method_full_name] = method_full_name(@context)
|
59
|
+
|
60
|
+
@context[:result] = "27"
|
61
|
+
@ah1.allow_append("END #{name}", @context)
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
end
|
66
|
+
|