debuglog 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,24 @@
1
+ require 'debuglog'
2
+
3
+ debug "Starting example program"
4
+ x = 6
5
+ trace :x, binding
6
+ trace "ENV['rvm_bin_path']", binding
7
+
8
+ debug "Environment variables containing PATH"
9
+ keys = ENV.keys.grep /PATH/
10
+ keys.each do |key|
11
+ trace " ENV[#{key.inspect}]", binding, 40
12
+ end
13
+
14
+ debug "(end of list)"
15
+
16
+ t = time('sleep 3.52') { sleep 3.52 }
17
+ debug "Time actually slept (rounded): #{t}"
18
+
19
+ debug ""
20
+ debug "Multi-\nline\ntext\n with an indented (3 spaces) final line"
21
+ debug ""
22
+ debug "Display large array/hash with pp"
23
+ hash = ENV.select { |k,v| k =~ /PATH/ }
24
+ trace :hash, binding
@@ -1,17 +1,17 @@
1
- #
2
- # Usage:
3
- #
4
- # require 'debuglog'
5
- # debug "..." # -> writes "..." to 'debug.log'
6
- #
7
- # Note: +debug+ is the _default_ method name. You can set a different one like
8
- # this:
9
- #
10
- # require 'debuglog/manual'
11
- # DebugLog.configure(...) # todo: complete
12
- # dbg "..." # -> writes "..." to 'debug.log'
13
- #
14
- # If +debug+ (or the name you choose manually) is the name of an existing
15
- # method, it will _not_ be overwritten.
16
-
17
- require 'debuglog/auto'
1
+ #
2
+ # Usage:
3
+ #
4
+ # require 'debuglog'
5
+ # debug "..." # -> writes "..." to 'debug.log'
6
+ #
7
+ # Note: +debug+ is the _default_ method name. You can set a different one like
8
+ # this:
9
+ #
10
+ # require 'debuglog/manual'
11
+ # DebugLog.configure(...) # todo: complete
12
+ # dbg "..." # -> writes "..." to 'debug.log'
13
+ #
14
+ # If +debug+ (or the name you choose manually) is the name of an existing
15
+ # method, it will _not_ be overwritten.
16
+
17
+ require 'debuglog/auto'
@@ -1,2 +1,2 @@
1
- require 'debuglog/manual'
2
- DebugLog.autoconfigure
1
+ require 'debuglog/manual'
2
+ DebugLog.autoconfigure
@@ -1,177 +1,177 @@
1
- #
2
- # require 'debuglog/manual'
3
- #
4
- # DebugLog.configure(:debug => :dbg)
5
- # dbg "..." # -> writes "..." to file 'debug.log'
6
- #
7
-
8
- class DebugLog
9
-
10
- @@instance = nil
11
-
12
- DEFAULT_CONFIGURATION = {
13
- :debug => :debug,
14
- :trace => :trace,
15
- :time => :time,
16
- :file => 'debug.log'
17
- }
18
-
19
- class Error < StandardError; end
20
-
21
- def DebugLog.err(string)
22
- raise ::DebugLog::Error, "DebugLog error -- #{string}"
23
- end
24
-
25
- def DebugLog.configure(hash)
26
- if @@instance.nil?
27
- @@instance = DebugLog.new(hash)
28
- else
29
- err("DebugLog already configured") # todo: replace
30
- end
31
- end
32
-
33
- def DebugLog.autoconfigure
34
- configure(DEFAULT_CONFIGURATION)
35
- end
36
-
37
- def initialize(config)
38
- @kernel_methods_defined = []
39
- _create_kernel_method(config[:debug], :debug)
40
- _create_kernel_method(config[:trace], :trace)
41
- _create_kernel_method(config[:time], :time)
42
- @filename = config[:filename] || 'debug.log'
43
- begin
44
- @fh = File.open(@filename, 'w')
45
- rescue => e
46
- raise DebugLog::Error, "#{e.class} (#{e.message})"
47
- end
48
- @fh.sync = true
49
- @start_time = Time.now
50
- header = "DebugLog -- #{@start_time}"
51
- @fh.puts header
52
- @fh.puts('-' * header.length)
53
- end
54
-
55
- def debug(*args)
56
- string = args.map { |x| x.to_s }.join
57
- _write(string)
58
- end
59
-
60
- def trace(expr, _binding, *options)
61
- value = eval expr, _binding
62
- require 'pp'
63
- formatter = :pretty_inspect
64
- ## if (m = options.find { |o| o.is_a? Symbol })
65
- ## case m
66
- ## when :p then :inspect
67
- ## when :s, :to_s then :to_s
68
- ## when :pp then (require 'pp'; :pretty_inspect)
69
- ## when :yaml then (require 'yaml'; :to_yaml)
70
- ## when :ap then (require 'ap'; :ap)
71
- ## else then :inspect
72
- ## end
73
- ## else
74
- ## :inspect
75
- ## end
76
- value = value.send(formatter)
77
- if (n = options.find { |o| o.is_a? Integer })
78
- value = value[0...n] + "..."
79
- end
80
- message =
81
- if value.index("\n")
82
- value = value.gsub(/^/, ' ')
83
- "#{expr} ==\n#{value}"
84
- else
85
- "#{expr} == #{value}"
86
- end
87
- _write(message)
88
- end
89
-
90
- def time(task, &block)
91
- result = nil
92
- message =
93
- if block.nil?
94
- "*** Debuglog.task: block required (#{caller[0]}) ***"
95
- else
96
- t = Time.now
97
- result = block.call
98
- t = sprintf "%.3f", (Time.now - t)
99
- "#{task}: #{t} sec"
100
- end
101
- _write(message)
102
- result
103
- end
104
-
105
- def _write(message)
106
- time = (Time.now - @start_time)
107
- if time.to_i != @time.to_i
108
- elapsed = time.to_i - @time.to_i
109
- if elapsed > 1
110
- @fh.puts "------- (#{elapsed} sec)"
111
- else
112
- @fh.puts "-------"
113
- end
114
- end
115
- @time = time
116
- time = sprintf "%04.1f", time.to_f
117
- if message.index("\n")
118
- lines = message.split("\n")
119
- @fh.puts "[#{time}] #{lines.shift}"
120
- indent = " " * (time.size+3)
121
- lines.each do |line| @fh.puts "#{indent}#{line}" end
122
- else
123
- text = "[#{time}] #{message}"
124
- @fh.puts(text)
125
- end
126
- end
127
-
128
- def _create_kernel_method(name, target)
129
- if name.nil?
130
- return
131
- elsif Kernel.respond_to? name
132
- DebugLog.err "DebugLog: Method clash in Kernel: #{name.inspect}"
133
- else
134
- Kernel.module_eval %{
135
- def #{name}(*args, &block)
136
- DebugLog.call_method(:#{target}, *args, &block)
137
- end
138
- }, __FILE__, __LINE__ - 4
139
- @kernel_methods_defined << name
140
- end
141
- end
142
-
143
- DEBUG_METHODS = [:debug, :trace, :time]
144
- def DebugLog.call_method(name, *args, &block)
145
- if DEBUG_METHODS.include? name
146
- if @@instance
147
- @@instance.send(name, *args, &block)
148
- else
149
- err %{
150
- ~ DebugLog is not configured. You can:
151
- ~ * require 'debuglog/auto' or call DebugLog.autoconfigure; or
152
- ~ * call DebugLog.configure(...) to configure it manually
153
- }.strip.gsub(/^\s+~ /, '')
154
- end
155
- else
156
- err "illegitimate method called: #{name}"
157
- end
158
- end
159
-
160
- def terminate # For testing
161
- @fh.close unless @fh.closed?
162
- @kernel_methods_defined.each do |m|
163
- Kernel.send(:remove_method, m)
164
- end
165
- end
166
- private :terminate
167
-
168
- def DebugLog.wipe_slate_clean_for_testing
169
- if @@instance
170
- @@instance.send(:terminate)
171
- @@instance = nil
172
- end
173
- end
174
-
175
- end # class DebugLog
176
-
177
- Debuglog = DebugLog
1
+ #
2
+ # require 'debuglog/manual'
3
+ #
4
+ # DebugLog.configure(:debug => :dbg)
5
+ # dbg "..." # -> writes "..." to file 'debug.log'
6
+ #
7
+
8
+ class DebugLog
9
+
10
+ @@instance = nil
11
+
12
+ DEFAULT_CONFIGURATION = {
13
+ :debug => :debug,
14
+ :trace => :trace,
15
+ :time => :time,
16
+ :file => 'debug.log'
17
+ }
18
+
19
+ class Error < StandardError; end
20
+
21
+ def DebugLog.err(string)
22
+ raise ::DebugLog::Error, "DebugLog error -- #{string}"
23
+ end
24
+
25
+ def DebugLog.configure(hash)
26
+ if @@instance.nil?
27
+ @@instance = DebugLog.new(hash)
28
+ else
29
+ err("DebugLog already configured") # todo: replace
30
+ end
31
+ end
32
+
33
+ def DebugLog.autoconfigure
34
+ configure(DEFAULT_CONFIGURATION)
35
+ end
36
+
37
+ def initialize(config)
38
+ @kernel_methods_defined = []
39
+ _create_kernel_method(config[:debug], :debug)
40
+ _create_kernel_method(config[:trace], :trace)
41
+ _create_kernel_method(config[:time], :time)
42
+ @filename = config[:filename] || 'debug.log'
43
+ begin
44
+ @fh = File.open(@filename, 'w')
45
+ rescue => e
46
+ raise DebugLog::Error, "#{e.class} (#{e.message})"
47
+ end
48
+ @fh.sync = true
49
+ @start_time = Time.now
50
+ header = "DebugLog -- #{@start_time}"
51
+ @fh.puts header
52
+ @fh.puts('-' * header.length)
53
+ end
54
+
55
+ def debug(*args)
56
+ string = args.map { |x| x.to_s }.join
57
+ _write(string)
58
+ end
59
+
60
+ def trace(expr, _binding, *options)
61
+ value = eval expr.to_s, _binding
62
+ require 'pp'
63
+ formatter = :pretty_inspect
64
+ ## if (m = options.find { |o| o.is_a? Symbol })
65
+ ## case m
66
+ ## when :p then :inspect
67
+ ## when :s, :to_s then :to_s
68
+ ## when :pp then (require 'pp'; :pretty_inspect)
69
+ ## when :yaml then (require 'yaml'; :to_yaml)
70
+ ## when :ap then (require 'ap'; :ap)
71
+ ## else then :inspect
72
+ ## end
73
+ ## else
74
+ ## :inspect
75
+ ## end
76
+ value = value.send(formatter).strip
77
+ if (n = options.find { |o| o.is_a? Integer })
78
+ value = value[0...n] + "..." if value.length > n
79
+ end
80
+ message =
81
+ if value.index("\n")
82
+ value = value.gsub(/^/, ' ')
83
+ "#{expr} ==\n#{value}"
84
+ else
85
+ "#{expr} == #{value}"
86
+ end
87
+ _write(message)
88
+ end
89
+
90
+ def time(task, &block)
91
+ result = nil
92
+ message =
93
+ if block.nil?
94
+ "*** Debuglog.task: block required (#{caller[0]}) ***"
95
+ else
96
+ t = Time.now
97
+ result = block.call
98
+ t = sprintf "%.3f", (Time.now - t)
99
+ "#{task}: #{t} sec"
100
+ end
101
+ _write(message)
102
+ result
103
+ end
104
+
105
+ def _write(message)
106
+ time = (Time.now - @start_time)
107
+ if time.to_i != @time.to_i
108
+ elapsed = time.to_i - @time.to_i
109
+ if elapsed > 1
110
+ @fh.puts "------- (#{elapsed} sec)"
111
+ else
112
+ @fh.puts "-------"
113
+ end
114
+ end
115
+ @time = time
116
+ time = sprintf "%04.1f", time.to_f
117
+ if message.index("\n")
118
+ lines = message.split("\n")
119
+ @fh.puts "[#{time}] #{lines.shift}"
120
+ indent = " " * (time.size+3)
121
+ lines.each do |line| @fh.puts "#{indent}#{line}" end
122
+ else
123
+ text = "[#{time}] #{message}"
124
+ @fh.puts(text)
125
+ end
126
+ end
127
+
128
+ def _create_kernel_method(name, target)
129
+ if name.nil?
130
+ return
131
+ elsif Kernel.respond_to? name
132
+ DebugLog.err "DebugLog: Method clash in Kernel: #{name.inspect}"
133
+ else
134
+ Kernel.module_eval %{
135
+ def #{name}(*args, &block)
136
+ DebugLog.call_method(:#{target}, *args, &block)
137
+ end
138
+ }, __FILE__, __LINE__ - 4
139
+ @kernel_methods_defined << name
140
+ end
141
+ end
142
+
143
+ DEBUG_METHODS = [:debug, :trace, :time]
144
+ def DebugLog.call_method(name, *args, &block)
145
+ if DEBUG_METHODS.include? name
146
+ if @@instance
147
+ @@instance.send(name, *args, &block)
148
+ else
149
+ err %{
150
+ ~ DebugLog is not configured. You can:
151
+ ~ * require 'debuglog/auto' or call DebugLog.autoconfigure; or
152
+ ~ * call DebugLog.configure(...) to configure it manually
153
+ }.strip.gsub(/^\s+~ /, '')
154
+ end
155
+ else
156
+ err "illegitimate method called: #{name}"
157
+ end
158
+ end
159
+
160
+ def terminate # For testing
161
+ @fh.close unless @fh.closed?
162
+ @kernel_methods_defined.each do |m|
163
+ Kernel.send(:remove_method, m)
164
+ end
165
+ end
166
+ private :terminate
167
+
168
+ def DebugLog.wipe_slate_clean_for_testing
169
+ if @@instance
170
+ @@instance.send(:terminate)
171
+ @@instance = nil
172
+ end
173
+ end
174
+
175
+ end # class DebugLog
176
+
177
+ Debuglog = DebugLog
@@ -0,0 +1,3 @@
1
+ module DebugLog
2
+ VERSION = "1.0.1"
3
+ end
@@ -1,14 +1,13 @@
1
- require 'debuglog'
2
- require 'ruby-debug'
3
-
4
- Attest.custom :debuglog, {
5
- :description => "Last line of log file",
6
- :parameters => [ [:regex, Regexp], [:filename, String] ],
7
- :run => proc {
8
- file_data = File.read(filename)
9
- test('file exists') { N! file_data }
10
- test('file has data in it') { file_data.size > 0 }
11
- last_line = file_data.split("\n").last
12
- test('match') { Mt last_line, regex }
13
- }
14
- }
1
+ require 'debuglog'
2
+
3
+ Whitestone.custom :debuglog, {
4
+ :description => "Last line of log file",
5
+ :parameters => [ [:regex, Regexp], [:filename, String] ],
6
+ :run => proc {
7
+ file_data = File.read(filename)
8
+ test('file exists') { N! file_data }
9
+ test('file has data in it') { file_data.size > 0 }
10
+ last_line = file_data.split("\n").last
11
+ test('match') { Mt last_line, regex }
12
+ }
13
+ }