trace-util-adv 0.2.3 → 0.2.4

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.
Files changed (114) hide show
  1. data/Advanced TraceUtils tutorial.pdf +0 -0
  2. data/CHANGELOG +4 -8
  3. data/{lib/TODO.txt → TODO.txt} +8 -0
  4. data/VERSION +1 -1
  5. data/lib/action_handler/action_handler.rb +40 -0
  6. data/lib/{action_handler.rb → action_handler/action_handler_registration.rb} +3 -41
  7. data/lib/appenders/appender.rb +1 -13
  8. data/lib/appenders/appender_mappings.rb +13 -0
  9. data/lib/appenders/base_appender.rb +2 -11
  10. data/lib/appenders/file_appender.rb +21 -13
  11. data/lib/appenders/include.rb +4 -0
  12. data/lib/appenders/types/README-NOTE.txt +2 -0
  13. data/lib/appenders/{html_appender.rb → types/html_appender.rb} +4 -20
  14. data/lib/appenders/{logger_appender.rb → types/logger_appender.rb} +0 -0
  15. data/lib/appenders/{stream_appender.rb → types/stream_appender.rb} +0 -0
  16. data/lib/appenders/{template_log_appender.rb → types/template_log_appender.rb} +0 -0
  17. data/lib/appenders/{xml_appender.rb → types/xml_appender.rb} +1 -1
  18. data/lib/extensions/array_extensions.rb +42 -0
  19. data/lib/extensions/hash_extensions.rb +181 -0
  20. data/lib/extensions/hash_rule_extensions.rb +50 -0
  21. data/lib/extensions/include.rb +1 -0
  22. data/lib/extensions/nilclass_extensions.rb +10 -0
  23. data/lib/extensions/object_extensions.rb +19 -0
  24. data/lib/extensions/string_extensions.rb +35 -0
  25. data/lib/extensions/symbol_extensions.rb +30 -0
  26. data/lib/filters/composite/composite_class_filter.rb +25 -0
  27. data/lib/filters/composite/composite_module_filter.rb +53 -0
  28. data/lib/filters/executor/filter_exec.rb +74 -0
  29. data/lib/filters/filter.rb +43 -0
  30. data/lib/filters/filter_factory.rb +1 -1
  31. data/lib/filters/filter_mappings.rb +36 -0
  32. data/lib/filters/{tracing_filter.rb → filter_registration.rb} +6 -49
  33. data/lib/filters/filter_use.rb +10 -0
  34. data/lib/filters/include.rb +8 -0
  35. data/lib/filters/list/README-NOTE.txt +1 -0
  36. data/lib/filters/list/list_instance_var_filter.rb +27 -0
  37. data/lib/filters/{message_filters.rb → msg_context/message_context_filters.rb} +3 -12
  38. data/lib/filters/simple/argument_filter.rb +24 -0
  39. data/lib/filters/simple/class_filter.rb +15 -0
  40. data/lib/filters/simple/instance_var_filter.rb +25 -0
  41. data/lib/filters/simple/method_filter.rb +17 -0
  42. data/lib/filters/simple/module_filter.rb +14 -0
  43. data/lib/{templates/trace_output_handler.rb → output_handler/output_handler.rb} +0 -0
  44. data/lib/rules/rule_mappings.rb +10 -0
  45. data/lib/{rule_match.rb → rules/rule_match.rb} +5 -3
  46. data/lib/targets/README-NOTE.txt +2 -0
  47. data/lib/targets/file_target.rb +65 -0
  48. data/lib/targets/stream_target.rb +9 -0
  49. data/lib/targets/string_target.rb +9 -0
  50. data/lib/templates/base_template.rb +3 -2
  51. data/lib/templates/html_template.rb +1 -2
  52. data/lib/templates/include.rb +2 -0
  53. data/lib/templates/string_template.rb +24 -25
  54. data/lib/templates/template_mappings.rb +10 -0
  55. data/lib/templates/xml_template.rb +28 -29
  56. data/lib/trace-util-adv.rb +24 -4
  57. data/lib/{trace_calls.rb → trace_calls/trace_calls.rb} +0 -0
  58. data/lib/trace_calls/trace_configuration.rb +29 -0
  59. data/lib/{trace_ext.rb → trace_calls/trace_ext.rb} +10 -9
  60. data/test/{test_action_handler.rb → action_handler/test_action_handler.rb} +1 -5
  61. data/test/action_handler/test_create_action_handler.rb +31 -0
  62. data/test/appenders/test_appender_filters.rb +0 -0
  63. data/test/appenders/test_appender_tracers.rb +56 -0
  64. data/test/appenders/test_create_appender.rb +49 -0
  65. data/test/{test_html_appender.rb → appenders/test_html_appender.rb} +3 -7
  66. data/test/appenders/test_stream_appender.rb +41 -0
  67. data/test/appenders/test_template_log_appender.rb +18 -0
  68. data/test/{test_xml_appender.rb → appenders/test_xml_appender.rb} +0 -0
  69. data/test/extensions/test_filters_creation.rb +36 -0
  70. data/test/extensions/test_hash_extensions.rb +208 -0
  71. data/test/extensions/test_hash_filter_extensions.rb +65 -0
  72. data/test/extensions/test_set_context.rb +94 -0
  73. data/test/extensions/test_string_extensions.rb +55 -0
  74. data/test/extensions/test_symbol_extensions.rb +35 -0
  75. data/test/{test_filters_chain.rb → filters/chain/test_filters_chain.rb} +2 -1
  76. data/test/filters/composite/test_composite_class_filter.rb +78 -0
  77. data/test/filters/composite/test_composite_module_filter.rb +82 -0
  78. data/test/filters/composite/test_composite_var_filter.rb +103 -0
  79. data/test/filters/executor/test_filter_exec.rb +80 -0
  80. data/test/filters/msg_context/test_custom_filters.rb +54 -0
  81. data/test/filters/simple/test_base_filter.rb +56 -0
  82. data/test/filters/simple/test_class_filter.rb +75 -0
  83. data/test/filters/simple/test_instancevar_filter.rb +82 -0
  84. data/test/filters/simple/test_method_filter.rb +77 -0
  85. data/test/filters/simple/test_module_filter.rb +63 -0
  86. data/test/samples/include.rb +1 -0
  87. data/test/samples/sample_classes.rb +23 -0
  88. data/test/samples/sample_composite_filters.rb +50 -0
  89. data/test/samples/sample_filters.rb +58 -0
  90. data/test/sandbox/matcher.rb +7 -0
  91. data/test/sandbox/sandbox.rb +25 -0
  92. data/test/{test_xml_gen.rb → sandbox/test_xml_gen.rb} +0 -0
  93. data/test/trace_calls/test_configure_.rb +70 -0
  94. data/test/trace_calls/tracing/test_html_tracing.rb +20 -0
  95. data/test/trace_calls/tracing/test_logger_tracing.rb +18 -0
  96. data/test/trace_calls/tracing/test_stream_tracing.rb +17 -0
  97. data/test/trace_calls/tracing/test_teamplate_log_tracing.rb +18 -0
  98. data/test/trace_calls/tracing/test_xml_tracing.rb +18 -0
  99. data/test/tracers/test_create_tracers.rb +46 -0
  100. data/test/tracers/test_exec_tracers.rb +11 -0
  101. data/trace-util-adv.gemspec +91 -32
  102. metadata +91 -32
  103. data/lib/core_extensions.rb +0 -101
  104. data/lib/filters/base_filters.rb +0 -178
  105. data/lib/filters/composite_filters.rb +0 -71
  106. data/lib/output_templates.rb +0 -5
  107. data/lib/sample_filters.rb +0 -97
  108. data/lib/trace_appenders.rb +0 -9
  109. data/lib/trace_filters.rb +0 -4
  110. data/test/test_appender.rb +0 -29
  111. data/test/test_file_appender.rb +0 -32
  112. data/test/test_filters.rb +0 -112
  113. data/test/test_filters_create.rb +0 -28
  114. data/test/test_special_filters.rb +0 -78
@@ -0,0 +1,25 @@
1
+ module Tracing
2
+ class CompositeClassFilter < BaseFilter
3
+ def initialize(options)
4
+ super(options)
5
+ @rules = options || {}
6
+ end
7
+
8
+ # filter on class names and then methods within those classes
9
+ def allow_action(msg, context)
10
+ # class name of context
11
+ class_name = context[:class_name]
12
+ action = rules[:default] || :yield
13
+ rules[:classes].each do |clazz|
14
+ names=clazz[:names]
15
+ class_name_match = names.matches_any?(class_name)
16
+ next if !class_name_match
17
+ # if name matches rule
18
+ method_filter = MethodFilter.new(clazz)
19
+ action = method_filter.allow_action(msg, context)
20
+ return action if (action == :include || action == :exclude)
21
+ end
22
+ return action
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,53 @@
1
+ module Tracing
2
+ class CompositeModuleFilter < BaseFilter
3
+ def initialize(options)
4
+ super(options)
5
+ @rules = options || {}
6
+ end
7
+
8
+ # filter on module names and then on class names and methods within those modules
9
+ def allow_action(msg, context)
10
+ modules_name = context[:full_modules_name]
11
+ action = rules[:default] || :yield
12
+ # puts "modules_name: #{modules_name}"
13
+ rules[:modules].each do |_module|
14
+ # get names of modules to match
15
+ names = _module[:names]
16
+ class_rules = _module[:class_rules]
17
+ classes = _module[:classes]
18
+ method_rules =_module[:method_rules]
19
+
20
+ class_name = context[:class_name]
21
+ method_name = context[:method_name]
22
+
23
+ # puts "module names to match: #{names}"
24
+ # puts "context class_name: #{class_name}"
25
+ # puts "context method_name: #{method_name}"
26
+
27
+ # test if current module name matches any of the module names for this rule
28
+ next if !names.matches_any?(modules_name)
29
+ # if name matches rule
30
+ if classes && !class_name.blank?
31
+ # puts "CC filter"
32
+ composite_class_filter = CompositeClassFilter.new(_module)
33
+ action = composite_class_filter.allow_action(msg, context)
34
+ return action if (action == :include || action == :exclude)
35
+ end
36
+ if class_rules && !class_name.blank?
37
+ # puts "class filter"
38
+ class_filter = ClassFilter.new(_module)
39
+ action = class_filter.allow_action(msg, context)
40
+ return action if (action == :include || action == :exclude)
41
+ end
42
+ if method_rules && !method_name.blank?
43
+ # puts "method filter"
44
+ method_filter = MethodFilter.new(_module)
45
+ action = method_filter.allow_action(msg, context)
46
+ return action if (action == :include || action == :exclude)
47
+ end
48
+ end
49
+ # puts "action: #{action}"
50
+ return action
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,74 @@
1
+ module Tracing
2
+ module Filter
3
+ # enable execution of filters
4
+ class Executor
5
+ attr_accessor :filters, :final_yield_action
6
+
7
+ def initialize(options)
8
+ @final_yield_action = options[:final_yield_action] || :exclude
9
+ @filters ||= []
10
+ _filters = options.filters
11
+ # puts "filters exec: #{_filters.inspect}"
12
+ @filters.add(_filters)
13
+ end
14
+
15
+ # determine if message and context should pass through filter chain
16
+ # return:
17
+ # - true to allow
18
+ # - false to disallow
19
+ def filters_allow?(msg, context)
20
+ # puts "method: filters_allow?"
21
+
22
+ # default allow return value
23
+ allow = (final_yield_action == :exclude ? false : true)
24
+
25
+ # puts "default allow: #{allow}"
26
+ # puts "filters: #{@filters}"
27
+
28
+ return allow if @filters.blank?
29
+
30
+ @filters.each do |_filter|
31
+ # apply filter
32
+ if _filter
33
+ res = _filter.allow_action(msg, context)
34
+ # puts "res: #{res}"
35
+
36
+ if (res == :include_and_yield)
37
+ allow = true
38
+ end
39
+
40
+ if (res == :exclude_and_yield)
41
+ allow = false
42
+ end
43
+
44
+ if (res == :include)
45
+ # puts "included - break"
46
+ allow = true
47
+ break
48
+ end
49
+
50
+ if (res == :exclude)
51
+ # puts "excluded - break"
52
+ allow = false
53
+ break
54
+ end
55
+ # puts "yielding..."
56
+ end
57
+ end
58
+ # puts "filters_allow?: #{allow}"
59
+ return allow
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+
66
+ module Tracing
67
+ module Filter
68
+ module ExecUse
69
+ # set to instance of Tracing::Filter:Exec
70
+ attr_accessor :filter_executor
71
+ end
72
+ end
73
+ end
74
+
@@ -0,0 +1,43 @@
1
+ module Tracing
2
+
3
+ # interface (abstract class)
4
+ # instances of this form can be used as filters inside include/exclude lists
5
+ class NameFilter
6
+ # return boolean
7
+ def allow?(name)
8
+ true
9
+ end
10
+ end
11
+
12
+
13
+ # abstract filter
14
+ class BaseFilter
15
+ attr_reader :name
16
+ attr_accessor :rules
17
+
18
+ class << self
19
+ attr_accessor :filters
20
+
21
+ # register symbol => filter mappings
22
+ def register_filters(hash)
23
+ @filters ||= {}
24
+ filters.merge!(hash)
25
+ end
26
+
27
+ # array of symbols
28
+ # [:special_filter, :stream_filter]
29
+ def unregister_filters(hash)
30
+ @filters ||= {}
31
+ filters.reject!{|key, value| hash.include? key}
32
+ end
33
+ end
34
+
35
+ def initialize(options = {})
36
+ @name = options[:name] || "Unknown filter"
37
+ end
38
+
39
+ def name_allow_action(name)
40
+ res = rules.rules_allow_action(name)
41
+ end
42
+ end
43
+ end
@@ -4,7 +4,7 @@ module Tracing::Filter
4
4
 
5
5
  def self.create_filter(name_hash)
6
6
  # puts "TRY create_filter: " + name_hash.inspect
7
- [:module_filter, :class_filter, :method_filter].each do |symbol|
7
+ [:module_filter, :class_filter, :method_filter, :vars_filter].each do |symbol|
8
8
  # puts "symbol:" + symbol.to_s
9
9
  res = name_hash.try_create_filter(symbol)
10
10
  # puts "Filter created:" + res.inspect
@@ -0,0 +1,36 @@
1
+ module FilterMappings
2
+
3
+ def self.rules_map
4
+ {
5
+ :module_rules => :module_filter,
6
+ :class_rules => :class_filter,
7
+ :method_rules => :method_filter,
8
+ :var_rules => :vars_filter,
9
+ :modules => :composite_module_filter,
10
+ :classes => :composite_class_filter,
11
+ :vars => :composite_vars_filter
12
+ }
13
+ end
14
+
15
+ def self.convenience_map
16
+ {
17
+ :module => :module_filter,
18
+ :class => :class_filter,
19
+ :method => :method_filter,
20
+ :variable => :vars_filter,
21
+ }
22
+ end
23
+
24
+
25
+ def self.defaults
26
+ {
27
+ :module_filter => Tracing::ModuleFilter,
28
+ :class_filter => Tracing::ClassFilter,
29
+ :method_filter => Tracing::MethodFilter,
30
+ :vars_filter => Tracing::InstanceVarFilter,
31
+ :composite_module_filter => Tracing::CompositeModuleFilter,
32
+ :composite_class_filter => Tracing::CompositeClassFilter,
33
+ :composite_vars_filter => Tracing::CompositeInstanceVarFilter
34
+ }
35
+ end
36
+ end
@@ -24,6 +24,11 @@ module Tracing
24
24
 
25
25
  def register_filters(reg_filters)
26
26
  @filters ||= []
27
+ @filters.add(reg_filters.filters)
28
+ end
29
+
30
+ def _register_filters(reg_filters)
31
+ @filters ||= []
27
32
 
28
33
  # puts "Register filters, using: #{reg_filters.inspect}"
29
34
  new_filters = create_filters(reg_filters)
@@ -44,53 +49,5 @@ module Tracing
44
49
  end
45
50
 
46
51
  end
47
-
48
- # enable execution of filters
49
- module Exec
50
- def filters_allow?(msg, context)
51
- # puts "method: filters_allow?"
52
-
53
- @filters ||= Tracing::TraceExt.filters
54
- return true if !@filters && !@filters.kind_of?(Array)
55
-
56
- # default allow return value
57
- allow = true
58
- allow = false if (Tracing::TraceExt.final_yield_action == :exclude)
59
-
60
- @filters.each do |_filter|
61
- # apply filter
62
- if _filter
63
- res = _filter.allow_action(msg, context)
64
- # puts "res: #{res}"
65
-
66
- if (res == :include_and_yield)
67
- allow = true
68
- end
69
-
70
- if (res == :exclude_and_yield)
71
- allow = false
72
- end
73
-
74
- if (res == :include)
75
- # puts "included - break"
76
- allow = true
77
- break
78
- end
79
-
80
- if (res == :exclude)
81
- # puts "excluded - break"
82
- allow = false
83
- break
84
- end
85
-
86
- # puts "yielding..."
87
-
88
- end
89
- end
90
- # puts "filters_allow?: #{allow}"
91
- return allow
92
- end
93
- end
94
52
  end
95
- end
96
-
53
+ end
@@ -0,0 +1,10 @@
1
+ # include this on any class that should have filter functionality available
2
+ # for tracing, this is used on TraceExt, ActionHandler, Appender
3
+ module Tracing
4
+ module FilterUse
5
+ include Tracing::Filter::Registration
6
+ include Tracing::Filter::ExecUse
7
+
8
+ attr_accessor :filters
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ dir = 'filters/'
2
+ require dir + 'filter'
3
+ include_folder_rec(dir + 'simple')
4
+ include_folder_rec(dir + 'composite')
5
+ include_folder_rec(dir + 'list')
6
+ include_folder_rec(dir + 'msg_context')
7
+ include_folder_rec(dir + 'executor')
8
+ include_folder(dir)
@@ -0,0 +1 @@
1
+ Not sure how useful specific list filters (limited to a single kind of filter) are, since you can always just create a list of various kinds of filters.
@@ -0,0 +1,27 @@
1
+ module Tracing
2
+ class ListInstanceVarFilter < BaseFilter
3
+ def initialize(options)
4
+ super(options)
5
+ @rules = options || {}
6
+ end
7
+
8
+ def allow_action(msg, context)
9
+ action = rules[:default] || :yield
10
+ var_rules = rules[:vars]
11
+ # puts "var rules: #{var_rules.inspect}"
12
+ # puts "var_rules size: #{var_rules.size}"
13
+ # puts "context: #{context.inspect}"
14
+ var_rules.each do |var_rule|
15
+ # puts "var rule: #{var_rule.inspect}"
16
+ options = {}
17
+ options[:var_rules] = var_rule[:var_rules]
18
+ options[:var_name] = var_rule[:name]
19
+
20
+ var_filter = InstanceVarFilter.new(options)
21
+ action = var_filter.allow_action(msg, context)
22
+ return action if (action == :include || action == :exclude)
23
+ end
24
+ return action
25
+ end
26
+ end
27
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  # interface class
4
4
  module Tracing
5
- class MsgFilter
5
+ class MsgContextFilter
6
6
  def initialize(options)
7
7
  @options = options
8
8
  end
@@ -13,7 +13,7 @@ module Tracing
13
13
  end
14
14
 
15
15
  # example of specific filter on instance variable
16
- class RangeFilter < MsgFilter
16
+ class InstanceVarRangeFilter < MsgContextFilter
17
17
  def name_allow_action(msg, context)
18
18
  obj = context[:self]
19
19
  var = obj.instance_variable_get @options[:var]
@@ -21,16 +21,7 @@ module Tracing
21
21
  return :yield
22
22
  end
23
23
  end
24
-
25
- # interface (abstract class)
26
- # instances of this form can be used as filters inside include/exclude lists
27
- class NameFilter
28
- # return boolean
29
- def allow?(name)
30
- true
31
- end
32
- end
33
24
  end
34
25
 
35
26
  # custom filter
36
- my_msg_filter = Tracing::RangeFilter.new({:range => 0..10, :var => :rating})
27
+ my_msg_filter = Tracing::InstanceVarRangeFilter.new({:range => 0..10, :var => :rating})
@@ -0,0 +1,24 @@
1
+ module Tracing
2
+ # filter on instance variables
3
+ class ArgumentFilter < BaseFilter
4
+ attr_accessor :var_name
5
+
6
+ def initialize(options)
7
+ super(options)
8
+ @rules = options[:arg_rules] || {}
9
+ @var_name = options[:arg_name]
10
+ end
11
+
12
+ def allow_action(msg, context)
13
+ obj = context[:args]
14
+ if var_name.kind_of?(Symbol) || var_name.kind_of?(String)
15
+ key = var_name.to_sym
16
+ if obj.has_key? key
17
+ value = obj[key]
18
+ return name_allow_action(value)
19
+ end
20
+ end
21
+ :yield
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ module Tracing
2
+ # filter on class name
3
+ class ClassFilter < BaseFilter
4
+ def initialize(options)
5
+ super(options)
6
+ @rules = options[:class_rules] || {}
7
+ end
8
+
9
+ def allow_action(msg, context)
10
+ name = context[:class_name]
11
+ # puts "class_name: #{name}"
12
+ allow = name_allow_action(name)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ module Tracing
2
+ # filter on instance variables
3
+ class InstanceVarFilter < BaseFilter
4
+ attr_accessor :var_name
5
+
6
+ def initialize(options)
7
+ super(options)
8
+ # puts "create inst.var filter: #{options.inspect}"
9
+ @rules = options[:var_rules] || {}
10
+ @var_name = options[:var_name]
11
+ end
12
+
13
+ def allow_action(msg, context)
14
+ # puts "InstanceVarFilter.allow_action"
15
+ obj = context[:self]
16
+ # puts "var_name: #{var_name}"
17
+ if var_name.kind_of?(Symbol) || var_name.kind_of?(String)
18
+ value = obj.instance_variable_get("@#{var_name}")
19
+ # puts "value: #{value}"
20
+ return name_allow_action(value)
21
+ end
22
+ :yield
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ module Tracing
2
+ # filter on method
3
+ class MethodFilter < BaseFilter
4
+ def initialize(options)
5
+ super(options)
6
+ # puts "Method filter options: #{options.inspect}"
7
+ # puts "use :method_rules or :method_filter"
8
+ @rules = options[:method_rules] || options[:method_filter] || {}
9
+ end
10
+
11
+ def allow_action(msg, context)
12
+ name = context[:method_name]
13
+ # puts "allow name?: #{name}"
14
+ allow = name_allow_action(name)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ module Tracing
2
+ # filter on module
3
+ class ModuleFilter < BaseFilter
4
+ def initialize(options)
5
+ super(options)
6
+ @rules = options[:module_rules] || {}
7
+ end
8
+
9
+ def allow_action(msg, context)
10
+ name = context[:full_modules_name]
11
+ allow = name_allow_action(name)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,10 @@
1
+ module RuleMappings
2
+ def self.prefix_map
3
+ {
4
+ :i => :include,
5
+ :x => :exclude,
6
+ :iy => :include_and_yield,
7
+ :xy => :exclude_and_yield
8
+ }
9
+ end
10
+ end
@@ -3,13 +3,15 @@ module Tracing
3
3
  class RuleTypeError < RuntimeError; end
4
4
 
5
5
  def matches_any?(name)
6
- # puts "matches any: #{name}"
6
+ puts "matches any: #{name.inspect}"
7
7
  self.any? do |rule|
8
+ puts "rule:" + rule.inspect
9
+ puts "against:" + name.inspect
8
10
  if rule.kind_of? Regexp
9
11
  # match return position of match, or nil if no match
10
12
  # here converted into boolean result
11
- match = (name =~ rule)
12
- # puts "matches regexp #{rule}: #{match}"
13
+ match = !(name =~ rule).nil?
14
+ puts "match: #{match}"
13
15
  match
14
16
  elsif rule.kind_of? String
15
17
  match = (name == rule)
@@ -0,0 +1,2 @@
1
+ Each Appender should be set up with a target.
2
+ A Html appender shouldn't have to output to a file fx.
@@ -0,0 +1,65 @@
1
+ module Tracing
2
+ class FileTarget
3
+ include Tracing::DefaultPath
4
+ class << self
5
+ include Tracing::DefaultPath
6
+ end
7
+
8
+ def append(txt, context)
9
+ file = get_file(context)
10
+ write_file(file, txt)
11
+ end
12
+
13
+ # file
14
+ def write_file(file, txt)
15
+ file = file_path(file)
16
+
17
+ write_mode = mode(file)
18
+ File.open(file, write_mode) do |f|
19
+ f.puts txt
20
+ end
21
+ end
22
+
23
+ def create_initial_file(file)
24
+ end
25
+
26
+ def insert_into_file(file, txt, marker_txt)
27
+ line = marker_txt
28
+
29
+ file = file_path(file)
30
+
31
+ if !File.exist?(file)
32
+ create_initial_file(file)
33
+ end
34
+
35
+ gsub_file file, /(#{Regexp.escape(line)})/mi do |match|
36
+ "#{txt}\n#{match}"
37
+ end
38
+ end
39
+
40
+ # helper for deciding file "write mode"
41
+ def is_old_file?(file)
42
+ File.new(file).mtime < (Time.now - time_limit)
43
+ end
44
+
45
+ def file_path(file)
46
+ def_path = default_path || self.class.default_path
47
+ file = File.join(def_path, file) if self.class.default_path
48
+ end
49
+
50
+ protected
51
+ def gsub_file(path, regexp, *args, &block)
52
+ content = File.read(path).gsub(regexp, *args, &block)
53
+ File.open(path, 'wb') { |file| file.write(content) }
54
+ end
55
+
56
+ # default file "write mode"
57
+ def mode(file)
58
+ if !options[:overwrite] && File.exist?(file) && !is_old_file?(file)
59
+ "a+"
60
+ else
61
+ "w+"
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,9 @@
1
+ module Tracing
2
+ class StreamTarget
3
+ attr_accessor :stream
4
+
5
+ def append(txt, context)
6
+ @stream << txt
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Tracing
2
+ class StringTarget
3
+ attr_accessor :text
4
+
5
+ def append(txt, context)
6
+ @text << txt
7
+ end
8
+ end
9
+ end
@@ -1,6 +1,7 @@
1
+ require 'templates/trace_output_handler'
2
+
1
3
  module Tracing
2
- module OutputTemplate
3
- class BaseTrace
4
+ class BaseTemplate
4
5
  include Tracing::OutputHandler
5
6
 
6
7
  def handle_after_call(context)
@@ -1,6 +1,5 @@
1
1
  module Tracing
2
- module OutputTemplate
3
- class HtmlTrace < BaseTrace
2
+ class HtmlTemplate < BaseTemplate
4
3
 
5
4
  def before_template(context)
6
5
  # method_name = context[:method_full_name]
@@ -0,0 +1,2 @@
1
+ require 'erb'
2
+ Dir.glob(File.join(File.dirname(__FILE__), '**/*.rb')).each {|f| require f }