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,78 @@
|
|
1
|
+
require 'core_extensions'
|
2
|
+
require 'filters/base_filters'
|
3
|
+
require 'filters/message_filters'
|
4
|
+
|
5
|
+
# Procs of this form can be used as filters inside include/exclude lists
|
6
|
+
rest_view = Proc.new {|name| name == 'abc' }
|
7
|
+
|
8
|
+
module Tracing
|
9
|
+
# abstract context filter
|
10
|
+
class MsgContextFilter
|
11
|
+
attr_accessor :options
|
12
|
+
|
13
|
+
def initialize(options)
|
14
|
+
@options = options
|
15
|
+
end
|
16
|
+
|
17
|
+
def allow?(msg, context)
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# abstract name filter
|
23
|
+
class NameFilter
|
24
|
+
attr_accessor :options
|
25
|
+
|
26
|
+
def initialize(options)
|
27
|
+
@options = options
|
28
|
+
end
|
29
|
+
|
30
|
+
# return boolean
|
31
|
+
def allow?(name)
|
32
|
+
true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class CustomNameFilter < NameFilter
|
37
|
+
def allow?(name)
|
38
|
+
name == options[:name]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
msg_filter = Tracing::MsgContextFilter.new '22'
|
44
|
+
|
45
|
+
name_filter = Tracing::CustomNameFilter.new('rapid')
|
46
|
+
|
47
|
+
var_rule_A = {
|
48
|
+
:name => 'var rule A',
|
49
|
+
:var_name => :template_path,
|
50
|
+
:var_rules => {
|
51
|
+
:include => [rest_view, name_filter],
|
52
|
+
:exclude => [/.*\/rapid_.*/],
|
53
|
+
:default => false
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
comp_var_rules_A = {
|
58
|
+
:name => 'test template_path',
|
59
|
+
:vars => [var_rule_A]
|
60
|
+
}
|
61
|
+
|
62
|
+
cls_name = "Alpha::Beta::Gamma"
|
63
|
+
name = "my_method"
|
64
|
+
my_instance_variables = {:template_path => 'taglibs/rapid_core.dryml'}
|
65
|
+
args = {:a => 7}
|
66
|
+
@context = {
|
67
|
+
:modules => cls_name.modules,
|
68
|
+
:class_name => cls_name.class_name,
|
69
|
+
:full_class_name => cls_name,
|
70
|
+
:method_name => name,
|
71
|
+
:args => args,
|
72
|
+
:block => false,
|
73
|
+
:vars => my_instance_variables # to carry @template_path etc.
|
74
|
+
}
|
75
|
+
|
76
|
+
var_filter = Tracing::InstanceVarFilter.new(var_rule_A)
|
77
|
+
|
78
|
+
puts var_filter.allow?("hello", @context)
|
@@ -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::XmlAppender.new(:tracer => :xml, :to_file => 'log_files/xml/traced.xml')
|
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
|
+
|
data/lib/test_xml_gen.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'ftools'
|
2
|
+
|
3
|
+
|
4
|
+
@begin = "<?xml version='1.0' encoding='UTF-8'?>\n<tracing>\n"
|
5
|
+
@end = "</tracing>"
|
6
|
+
|
7
|
+
File.open('text.xml', "w") do |file|
|
8
|
+
file.puts @begin
|
9
|
+
file.puts @end
|
10
|
+
end
|
11
|
+
#
|
12
|
+
# File.open('text.xml', "a+") do |file|
|
13
|
+
# file.seek(-@end.length, IO:SEEK_END)
|
14
|
+
# file.puts "hello world"
|
15
|
+
# end
|
16
|
+
|
17
|
+
|
18
|
+
# # # Create a new file and write to it
|
19
|
+
# File.open('test.rb', 'w+') do |f2|
|
20
|
+
# # use "\n" for two lines of text
|
21
|
+
# f2.puts "Created by Satish\nThank God!"
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# f = File.new("test.rb", "a+")
|
25
|
+
# #
|
26
|
+
# # # SEEK_CUR - Seeks to first integer number parameter plus current position
|
27
|
+
# # # SEEK_END - Seeks to first integer number parameter plus end of stream
|
28
|
+
# # # (you probably want a negative value for first integer number parameter)
|
29
|
+
# # # SEEK_SET - Seeks to the absolute location given by first integer number parameter
|
30
|
+
# # # :: is the scope operator - more on this later
|
31
|
+
# # f.seek(12, IO::SEEK_SET)
|
32
|
+
# # print f.readline
|
33
|
+
# str = "hello world</end>"
|
34
|
+
# f.seek(-6, IO::SEEK_END)
|
35
|
+
# f.puts str
|
36
|
+
# f.close
|
37
|
+
|
38
|
+
def gsub_file(path, regexp, *args, &block)
|
39
|
+
content = File.read(path).gsub(regexp, *args, &block)
|
40
|
+
File.open(path, 'wb') { |file| file.write(content) }
|
41
|
+
end
|
42
|
+
|
43
|
+
line = '</tracing>'
|
44
|
+
gsub_file 'text.xml', /(#{Regexp.escape(line)})/mi do |match|
|
45
|
+
"<line>hello</line>\n#{match}"
|
46
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'appenders/appender_registration'
|
2
|
+
require 'appenders/appender'
|
3
|
+
require 'appenders/base_appender'
|
4
|
+
require 'appenders/file_appender'
|
5
|
+
require 'appenders/logger_appender'
|
6
|
+
require 'appenders/stream_appender'
|
7
|
+
require 'appenders/xml_appender'
|
8
|
+
require 'appenders/html_appender'
|
9
|
+
require 'appenders/template_log_appender'
|
data/lib/trace_calls.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'trace_ext'
|
2
|
+
|
3
|
+
module Tracing
|
4
|
+
module TraceCalls
|
5
|
+
|
6
|
+
def self.included(klass)
|
7
|
+
suppress_tracing do
|
8
|
+
klass.instance_methods(false).each do |existing_method|
|
9
|
+
wrap(klass, existing_method)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
def klass.method_added(method) # note: nested definition
|
13
|
+
unless @trace_calls_internal
|
14
|
+
@trace_calls_internal = true
|
15
|
+
TraceCalls.wrap(self, method)
|
16
|
+
@trace_calls_internal = false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.suppress_tracing
|
22
|
+
Thread.current[:'suppress tracing'] = true
|
23
|
+
yield
|
24
|
+
ensure
|
25
|
+
Thread.current[:'suppress tracing'] = false
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.ok_to_trace?(name)
|
29
|
+
!Thread.current[:'suppress tracing']
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.wrap(klass, method)
|
33
|
+
klass.class_eval do
|
34
|
+
name = method.to_s
|
35
|
+
original_method = instance_method(name)
|
36
|
+
|
37
|
+
define_method(name) do |*args, &block|
|
38
|
+
cls_name = self.class.to_s
|
39
|
+
context = {
|
40
|
+
:modules => cls_name.modules,
|
41
|
+
:full_module_name => cls_name.modules.join("::"),
|
42
|
+
:class_name => cls_name.class_name,
|
43
|
+
:full_class_name => cls_name,
|
44
|
+
:method_name => name,
|
45
|
+
:args => args,
|
46
|
+
:block => block_given?,
|
47
|
+
:self => self,
|
48
|
+
:vars => self.instance_variables} # to carry @template_path etc.
|
49
|
+
context[:method_full_name] = method_full_name(context)
|
50
|
+
|
51
|
+
if TraceCalls.ok_to_trace?(name)
|
52
|
+
TraceCalls.suppress_tracing do
|
53
|
+
if trace_method?(context)
|
54
|
+
# puts "tracing before:" + context[:method_full_name]
|
55
|
+
handle_before_call(context)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
result = original_method.bind(self).call(*args, &block)
|
60
|
+
if TraceCalls.ok_to_trace?(name)
|
61
|
+
TraceCalls.suppress_tracing do
|
62
|
+
if trace_method?(context)
|
63
|
+
# puts "tracing after:" + context[:method_full_name]
|
64
|
+
context[:result] = result
|
65
|
+
handle_after_call(context)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
res = result
|
70
|
+
# if TraceCalls.ok_to_trace?(name)
|
71
|
+
# TraceCalls.suppress_tracing do
|
72
|
+
# if trace_method?(name)
|
73
|
+
# # method_stack.pop
|
74
|
+
# end
|
75
|
+
# end
|
76
|
+
# end
|
77
|
+
res
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
suppress_tracing do
|
83
|
+
include Tracing::TraceExt
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/trace_ext.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'templates/trace_output_handler'
|
2
|
+
require 'trace_filters'
|
3
|
+
require 'action_handler'
|
4
|
+
require 'trace_appenders'
|
5
|
+
|
6
|
+
module Tracing
|
7
|
+
module TraceExt
|
8
|
+
# include Tracing::Filter::Registration
|
9
|
+
include Tracing::Filter::Exec
|
10
|
+
|
11
|
+
class << self
|
12
|
+
include Tracing::Filter::Registration
|
13
|
+
include Tracing::ActionHandler::Registration
|
14
|
+
|
15
|
+
attr_accessor :final_yield_action
|
16
|
+
|
17
|
+
def configure(options)
|
18
|
+
# puts "Filters before config: " + Tracing::TraceExt.filters.inspect
|
19
|
+
|
20
|
+
register_filters(options[:filters])
|
21
|
+
|
22
|
+
# puts "Filters after config: " + Tracing::TraceExt.filters.inspect
|
23
|
+
|
24
|
+
register_action_handlers(options[:action_handlers] || options)
|
25
|
+
@final_yield_action = options[:final_yield] || :include
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def method_full_name(context)
|
31
|
+
"#{context[:class_name]}.#{context[:method_name]}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def trace_method?(context)
|
35
|
+
filters_allow?('', context)
|
36
|
+
end
|
37
|
+
|
38
|
+
def handle_before_call(context)
|
39
|
+
exec_action_handlers('BEGIN' , context)
|
40
|
+
end
|
41
|
+
|
42
|
+
def handle_after_call(context)
|
43
|
+
exec_action_handlers('END' , context)
|
44
|
+
end
|
45
|
+
|
46
|
+
def exec_action_handlers(txt, context)
|
47
|
+
_handlers = Tracing::TraceExt.action_handlers
|
48
|
+
|
49
|
+
# puts "exec_action_handlers:" + _handlers.inspect
|
50
|
+
return if !_handlers || !_handlers.kind_of?(Array)
|
51
|
+
# puts "each handler..."
|
52
|
+
_handlers.each do |handler|
|
53
|
+
handler.handle(txt, context)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{trace-util-adv}
|
8
|
+
s.version = "0.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Kristian Mandrup"]
|
12
|
+
s.date = %q{2009-10-28}
|
13
|
+
s.description = %q{
|
14
|
+
Configure tracing using context sensitive filters, appenders, output templates in a completely non-intrusive fashion.
|
15
|
+
Tracing can even be applied runtime as a response when certain conditions occur}
|
16
|
+
s.email = %q{kmandrup@gmail.com}
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"CHANGELOG",
|
25
|
+
"LICENSE",
|
26
|
+
"README.rdoc",
|
27
|
+
"Rakefile",
|
28
|
+
"VERSION",
|
29
|
+
"lib/README",
|
30
|
+
"lib/TODO.txt",
|
31
|
+
"lib/action_handler.rb",
|
32
|
+
"lib/appenders/appender.rb",
|
33
|
+
"lib/appenders/appender_registration.rb",
|
34
|
+
"lib/appenders/base_appender.rb",
|
35
|
+
"lib/appenders/file_appender.rb",
|
36
|
+
"lib/appenders/html_appender.rb",
|
37
|
+
"lib/appenders/logger_appender.rb",
|
38
|
+
"lib/appenders/stream_appender.rb",
|
39
|
+
"lib/appenders/template_log_appender.rb",
|
40
|
+
"lib/appenders/xml_appender.rb",
|
41
|
+
"lib/core_extensions.rb",
|
42
|
+
"lib/filters/base_filters.rb",
|
43
|
+
"lib/filters/composite_filters.rb",
|
44
|
+
"lib/filters/filter_factory.rb",
|
45
|
+
"lib/filters/message_filters.rb",
|
46
|
+
"lib/filters/tracing_filter.rb",
|
47
|
+
"lib/output_templates.rb",
|
48
|
+
"lib/rule_match.rb",
|
49
|
+
"lib/sample_filters.rb",
|
50
|
+
"lib/templates/base_template.rb",
|
51
|
+
"lib/templates/html_template.rb",
|
52
|
+
"lib/templates/string_template.rb",
|
53
|
+
"lib/templates/trace_output_handler.rb",
|
54
|
+
"lib/templates/xml_template.rb",
|
55
|
+
"lib/test_action_handler.rb",
|
56
|
+
"lib/test_appender.rb",
|
57
|
+
"lib/test_file_appender.rb",
|
58
|
+
"lib/test_filters.rb",
|
59
|
+
"lib/test_filters_chain.rb",
|
60
|
+
"lib/test_filters_create.rb",
|
61
|
+
"lib/test_html_appender.rb",
|
62
|
+
"lib/test_special_filters.rb",
|
63
|
+
"lib/test_xml_appender.rb",
|
64
|
+
"lib/test_xml_gen.rb",
|
65
|
+
"lib/trace-util-adv.rb",
|
66
|
+
"lib/trace_appenders.rb",
|
67
|
+
"lib/trace_calls.rb",
|
68
|
+
"lib/trace_ext.rb",
|
69
|
+
"lib/trace_filters.rb",
|
70
|
+
"spec/spec.opts",
|
71
|
+
"spec/spec_helper.rb",
|
72
|
+
"spec/trace-util-adv_spec.rb",
|
73
|
+
"trace-util-adv.gemspec"
|
74
|
+
]
|
75
|
+
s.homepage = %q{http://github.com/kristianmandrup/trace-util-adv}
|
76
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
77
|
+
s.require_paths = ["lib"]
|
78
|
+
s.rubygems_version = %q{1.3.5}
|
79
|
+
s.summary = %q{adds advancing tracing capability to your ruby code}
|
80
|
+
s.test_files = [
|
81
|
+
"spec/spec_helper.rb",
|
82
|
+
"spec/trace-util-adv_spec.rb"
|
83
|
+
]
|
84
|
+
|
85
|
+
if s.respond_to? :specification_version then
|
86
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
87
|
+
s.specification_version = 3
|
88
|
+
|
89
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
90
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
91
|
+
else
|
92
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
93
|
+
end
|
94
|
+
else
|
95
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|