debuglog 1.0.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/README ADDED
@@ -0,0 +1,38 @@
1
+ debuglog: zero-conf debug.log file for simple and hassle-free debugging
2
+
3
+ Synopsis
4
+
5
+ Debuglog gives you debug, trace and time methods that write their output to
6
+ the file ./debug.log.
7
+
8
+ require 'debuglog' # or require 'debuglog/auto'
9
+
10
+ debug "Message..."
11
+ trace :x, binding
12
+ time('Task') { action }
13
+
14
+ You can change the names of the methods and the filename.
15
+
16
+ require 'debuglog/manual'
17
+
18
+ DebugLog.configure(
19
+ :debug => :my_debug,
20
+ :trace => :my_trace,
21
+ :time => :my_time,
22
+ :filename => 'log/xyz.log'
23
+ )
24
+
25
+ my_debug "Message..."
26
+ my_trace :x, binding
27
+ my_time('Task') { action }
28
+
29
+ In either case, the log file will look something like this:
30
+
31
+ DebugLog -- 2010-07-25 18:58:22 +1000
32
+ -------------------------------------
33
+ [00.3] Message...
34
+ [00.5] x == 5
35
+ [00.6] Task: 1.0831 sec
36
+
37
+
38
+ See http://gsinclair.github.com/debuglog.html for full details.
@@ -0,0 +1,262 @@
1
+ ---
2
+ layout: default
3
+ title: Debuglog
4
+ ---
5
+
6
+ # Debuglog -- a zero-conf debug.log file
7
+
8
+ **Status: awaiting release (July 2010)**
9
+
10
+ * This will be replaced by a table of contents
11
+ {:toc}
12
+
13
+
14
+ ## Synopsis
15
+
16
+ Debuglog gives you `debug`, `trace` and `time` methods that write their output
17
+ to the file `./debug.log`.
18
+
19
+ {% highlight ruby %}
20
+
21
+ require 'debuglog' # or require 'debuglog/auto'
22
+
23
+ debug "Message..."
24
+ trace :x, binding
25
+ time('Task') { action }
26
+
27
+ {% endhighlight %}
28
+
29
+ You can change the names of the methods and the filename.
30
+
31
+ {% highlight ruby %}
32
+
33
+ require 'debuglog/manual'
34
+
35
+ DebugLog.configure(
36
+ :debug => :my_debug,
37
+ :trace => :my_trace,
38
+ :time => :my_time,
39
+ :filename => 'log/xyz.log'
40
+ )
41
+
42
+ my_debug "Message..."
43
+ my_trace :x, binding
44
+ my_time('Task') { action }
45
+
46
+ {% endhighlight %}
47
+
48
+ In either case, the log file will look something like this:
49
+
50
+ DebugLog -- 2010-07-25 18:58:22 +1000
51
+ -------------------------------------
52
+ [00.3] Message...
53
+ [00.5] x == 5
54
+ [00.6] Task: 1.0831 sec
55
+
56
+ The `[00.3]` etc. is the number of seconds (rounded) since the program started
57
+ (well, since `require 'debuglog'`, anyway).
58
+
59
+ More nuanced configuration is possible; see [Configuration](#Configuration).
60
+
61
+ ### Installation
62
+
63
+ $ [sudo] gem install debuglog
64
+
65
+ Source code is hosted on Github. See [Project details](#project_details).
66
+
67
+
68
+ ## Description
69
+
70
+ Debuglog allows you easy access to a log file named `debug.log` in the current
71
+ directory. In that file, you can record:
72
+ * arbitrary messages with `debug`
73
+ * the value of variables with `trace`
74
+ * the time taken to execute some code with `time`
75
+
76
+ Of course, any or all of those methods names might be used by another library or
77
+ by your own code. You can choose different method names and a different
78
+ filename; see [Configuration](#Configuration). Debuglog will raise an
79
+ exception (`DebugLog::Error`) if it detects a method clash.
80
+
81
+ ### `debug`
82
+
83
+ The `debug` method is straightforward. It calls `to_s` on its argument(s) and
84
+ writes them to the log file.
85
+
86
+ [col]: http://gsinclair.github.com/col.html
87
+
88
+ ### `trace`
89
+
90
+ `trace` requires you to pass the binding with the `binding` method. The two
91
+ following lines are equivalent:
92
+
93
+ {% highlight ruby %}
94
+
95
+ trace :radius, binding
96
+ debug "radius == #{radius.pretty_inspect}"
97
+
98
+ {% endhighlight %}
99
+
100
+ > Tip: You may choose to `alias _b binding` for convenience; DebugLog doesn't do that
101
+ > for you.
102
+
103
+ If you want the output truncated, pass an integer argument:
104
+
105
+ {% highlight ruby %}
106
+
107
+ trace :text, binding, 30
108
+
109
+ {% endhighlight %}
110
+
111
+ ### `time`
112
+
113
+ `time` calculates the amount of time taken to execute the code in the block
114
+ given and records it in the log file.
115
+
116
+ {% highlight ruby %}
117
+
118
+ time("Process configuration file") { @options = parse_config }
119
+
120
+ {% endhighlight %}
121
+
122
+ It requires a single string (`#to_s`) argument and a block.
123
+
124
+ ### Notes
125
+
126
+ `Debuglog` is a synonym for `DebugLog`, so you don't have to trouble yourself to
127
+ remember the capitalisation.
128
+
129
+ The text written to the log file has some nice touches:
130
+ * Multi-line output is indented correctly.
131
+ * `-------` is inserted each time an extra second of running time has elapsed.
132
+ This gives you a quick visual indication of how much logfile activity is
133
+ taking place. If more than one second has elapsed since the last log item,
134
+ something like `------- (3 sec)` is emitted.
135
+
136
+
137
+ ## Configuration
138
+
139
+ The [Synopsis](#synopsis) gave a good example of configuration:
140
+
141
+ {% highlight ruby %}
142
+
143
+ require 'debuglog/manual'
144
+
145
+ DebugLog.configure(
146
+ :debug => :my_debug,
147
+ :trace => :my_trace,
148
+ :time => :my_time,
149
+ :filename => 'log/xyz.log'
150
+ )
151
+
152
+ {% endhighlight %}
153
+
154
+ This changes the names of the methods that Debuglog defines. The motivation for
155
+ that, of course, is another library or your own code defining methods of those
156
+ names. Debuglog will raise an exception (`DebugLog::Error`) if it detects a
157
+ method name clash. (Of course, you might load the other library _after_
158
+ Debuglog, in which case it won't detect the clash.) This precaution is taken
159
+ because they are common method names at the top-level, and it's just not right
160
+ for a debugging library to _cause_ bugs.
161
+
162
+ If you omit a method name from the configuration, that method will not be
163
+ defined. The following code defines the method `d` instead of `debug`, but does
164
+ _not_ define `trace` or `time`. The standard filename `debug.log` is used.
165
+
166
+ {% highlight ruby %}
167
+
168
+ DebugLog.configure(
169
+ :debug => :d,
170
+ )
171
+
172
+ {% endhighlight %}
173
+
174
+ If you want to change one or two methods but leave the rest as standard, simply
175
+ do:
176
+
177
+ {% highlight ruby %}
178
+
179
+ DebugLog.configure(
180
+ :debug => :d,
181
+ :trace => :trace,
182
+ :time => :time
183
+ )
184
+
185
+ {% endhighlight %}
186
+
187
+ Once you have called `DebugLog.configure`, any further calls to it will be
188
+ ignored with a message on STDERR. That includes this case:
189
+
190
+ {% highlight ruby %}
191
+
192
+ require 'debuglog' # should be 'debuglog/manual'
193
+
194
+ DebugLog.configure(...)
195
+
196
+ {% endhighlight %}
197
+
198
+ The code `require 'debuglog` is equivalent to the following code, meaning
199
+ your one shot at calling `configure` has been taken.
200
+
201
+ {% highlight ruby %}
202
+
203
+ require 'debuglog/manual'
204
+
205
+ DebugLog.configure(
206
+ :debug => :debug,
207
+ :trace => :trace,
208
+ :time => :time,
209
+ :file => 'debug.log'
210
+ )
211
+
212
+ {% endhighlight %}
213
+
214
+ Final note: if you specify a file that is not writable, an error
215
+ (`DebugLog::Error`) will be raised.
216
+
217
+
218
+ ## Endnotes
219
+
220
+ ### Motivation
221
+
222
+ Debugging to a log file is very useful, even if your program doesn't do
223
+ "logging" as such. Ages ago I released `dev-utils/debug` which did this and
224
+ intended to do more. That's outdated now, only working on 1.8, so a revisit was
225
+ worthwhile with a better name. (If anyone wants the old name for something
226
+ else, they're welcome to it.)
227
+
228
+ ### Dependencies and requirements
229
+
230
+ Debuglog does not depend on any other libraries and works in Ruby 1.8 and Ruby
231
+ 1.9.
232
+
233
+ Unit tests are implemented in [Attest](http://gsinclair.github.com/attest.html).
234
+
235
+ ### Project details
236
+
237
+ * Author: Gavin Sinclair (user name: `gsinclair`; mail server: `gmail.com`)
238
+ * Date: July 2010
239
+ * Licence: MIT licence
240
+ * Project homepage: [http://gsinclair.github.com/debuglog.html][home]
241
+ * Source code: [http://github.com/gsinclair/debuglog][code]
242
+ * Documentation: (project homepage)
243
+
244
+ [home]: http://gsinclair.github.com/debuglog.html
245
+ [code]: http://github.com/gsinclair/debuglog
246
+
247
+ ### Possible future enhancements
248
+
249
+ Color. For instance, `debug "!! Object pool overloaded"` could print the
250
+ message (minus the exclamation marks) in red. Traces could be in yellow. Times
251
+ could be in dark cyan, etc.
252
+
253
+ Further to the above: symbol arguments to `debug` could provide some color
254
+ using the `Col` library. E.g. `debug "blah...", :yb` for yellow bold.
255
+
256
+ Method to turn it off and on: `DebugLog.off` and `DebugLog.on` or something.
257
+
258
+ Indenting via `DebugLog.indent` and `DebugLog.outdent`.
259
+
260
+ Options for `trace` output: `p` for `:inspect`; `y` for `:to_yaml` etc. I
261
+ don't see why the current `:pretty_inspect` would ever be insufficient, but of
262
+ course there may be cases.
@@ -0,0 +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'
@@ -0,0 +1,2 @@
1
+ require 'debuglog/manual'
2
+ DebugLog.autoconfigure
@@ -0,0 +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
@@ -0,0 +1,14 @@
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
+ }
@@ -0,0 +1,66 @@
1
+ D "Debuglog auto configuration" do
2
+ D.<< {
3
+ DebugLog.send :wipe_slate_clean_for_testing
4
+ DebugLog.autoconfigure
5
+ }
6
+
7
+ D "Debuglog and DebugLog are the same thing" do
8
+ Id Debuglog, DebugLog
9
+ end
10
+ D "Methods are defined in Kernel" do
11
+ kernel_methods = Kernel.instance_methods
12
+ T { kernel_methods.include? :debug }
13
+ T { kernel_methods.include? :trace }
14
+ T { kernel_methods.include? :time }
15
+ end
16
+ D "debug" do
17
+ debug "abc123"
18
+ T :debuglog, /abc123/, "debug.log"
19
+ debug -189
20
+ T :debuglog, /-189/, "debug.log"
21
+ D "multiple arguments" do
22
+ x = 5
23
+ debug "The value of x is ", x, "!"
24
+ T :debuglog, /The value of x is 5!/, "debug.log"
25
+ end
26
+ D "multi-line text" do
27
+ text = "I must go down to the seas again\nTo the lonely sea and the sky\nAnd all I want is a tall ship\nAnd a star to steer her by\n -- John Masefield"
28
+ debug text
29
+ log_text_lines = File.read("debug.log").split("\n").last(5)
30
+ # The text in the log file should be indented to look good.
31
+ Mt log_text_lines.shift, /\[\d\d\.\d\] I must go down to the seas again$/
32
+ Eq log_text_lines.shift, " To the lonely sea and the sky"
33
+ Eq log_text_lines.shift, " And all I want is a tall ship"
34
+ Eq log_text_lines.shift, " And a star to steer her by"
35
+ Eq log_text_lines.shift, " -- John Masefield"
36
+ end
37
+ end
38
+ D "trace" do
39
+ D "array" do
40
+ foo = [1,2,3]
41
+ trace :foo, binding
42
+ T :debuglog, /foo == \[1, 2, 3\]/, "debug.log"
43
+ end
44
+ D "string" do
45
+ str = "blah"
46
+ trace :str, binding
47
+ T :debuglog, /str == "blah"/, "debug.log"
48
+ end
49
+ D "truncate output" do
50
+ str = "x" * 100
51
+ trace :str, binding, 30
52
+ T :debuglog, /str == "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\.\.\./, "debug.log"
53
+ end
54
+ D "different formats" do
55
+ # not really interested in this feature at the moment
56
+ end
57
+ end
58
+ D "time" do
59
+ time('sum to 10') { 1+2+3+4+5+6+7+8+9+10 }
60
+ T :debuglog, /sum to 10: .* sec/, "debug.log"
61
+ D "return value of block is accessible" do
62
+ sum = time('sum') { 1 + 1 }
63
+ Eq sum, 2
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,39 @@
1
+ D "DebugLog manual configuration (successful)" do
2
+ D.< { DebugLog.send :wipe_slate_clean_for_testing }
3
+
4
+ D ":debug => :my_debug, :filename => 'xyz.txt'" do
5
+ Debuglog.configure(:debug => :my_debug, :filename => 'xyz.txt')
6
+ D "my_debug method works" do
7
+ my_debug "abc123"
8
+ T :debuglog, /abc123/, "xyz.txt"
9
+ end
10
+ D "debug, trace and time methods are not defined" do
11
+ E(NoMethodError) { debug "abc123" }
12
+ E(NoMethodError) { trace :x, binding }
13
+ E(NoMethodError) { time('task') { :foo } }
14
+ end
15
+ end
16
+
17
+ D ":trace => :my_trace, :time => :my_time" do
18
+ Debuglog.configure(:trace => :my_trace, :time => :my_time)
19
+ D "my_trace and my_time methods work" do
20
+ foo = :chorus
21
+ my_trace "foo", binding
22
+ xT :debuglog, /foo == :chorus/, "debug.log"
23
+ my_time('blah') { :dotdotdot }
24
+ T :debuglog, /blah: .* sec/, "debug.log"
25
+ end
26
+ D "debug method not defined" do
27
+ E(NoMethodError) { debug "..." }
28
+ end
29
+ end
30
+
31
+ D "empty configuration" do
32
+ Debuglog.configure({})
33
+ D "debug, trace and time methods don't work" do
34
+ E(NoMethodError) { debug "abc123" }
35
+ E(NoMethodError) { trace :x, binding }
36
+ E(NoMethodError) { time('task') { :foo } }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,27 @@
1
+ D "DebugLog manual configuration (unsuccessful)" do
2
+ D.< { DebugLog.send :wipe_slate_clean_for_testing }
3
+
4
+ D "clash with existing :debug method" do
5
+ def Kernel.debug() :foo end
6
+ E(DebugLog::Error) { DebugLog.autoconfigure }
7
+ end
8
+
9
+ D "clash with custom methods" do
10
+ def Kernel.my_debug() :foo end
11
+ def Kernel.my_trace() :foo end
12
+ def Kernel.my_time() :foo end
13
+ E(DebugLog::Error) { DebugLog.configure(:debug => :my_debug) }
14
+ E(DebugLog::Error) { DebugLog.configure(:trace => :my_trace) }
15
+ E(DebugLog::Error) { DebugLog.configure(:time => :my_time) }
16
+ end
17
+
18
+ D "calling methods without having configured -> error" do
19
+ # At this point DebugLog is not configured.
20
+ E(NameError) { debug }
21
+ E(DebugLog::Error) { DebugLog.call_method(:debug, "...") }
22
+ end
23
+
24
+ D "specifying unwritable log file -> error" do
25
+ E(DebugLog::Error) { DebugLog.configure(:filename => '/fodsfw/fgsg/e/debug.log') }
26
+ end
27
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: debuglog
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 0
9
+ version: 1.0.0
10
+ platform: ruby
11
+ authors:
12
+ - Gavin Sinclair
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-12-12 00:00:00 +11:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: " require 'debuglog' and record debugging information (including variable traces\n and timing information) to the file debug.log -- cheap and easy.\n"
22
+ email: gsinclair@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - lib/debuglog/auto.rb
31
+ - lib/debuglog/manual.rb
32
+ - lib/debuglog.rb
33
+ - README
34
+ - test/_setup.rb
35
+ - test/debuglog-auto.rb
36
+ - test/debuglog-manual-1.rb
37
+ - test/debuglog-manual-2.rb
38
+ - doc/debuglog.markdown
39
+ has_rdoc: true
40
+ homepage: http://gsinclair.github.com/debuglog.html
41
+ licenses: []
42
+
43
+ post_install_message:
44
+ rdoc_options: []
45
+
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ version: "0"
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ requirements: []
65
+
66
+ rubyforge_project:
67
+ rubygems_version: 1.3.7
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: Zero-conf debug.log file with 'debug', 'trace' and 'time' methods
71
+ test_files:
72
+ - test/_setup.rb
73
+ - test/debuglog-auto.rb
74
+ - test/debuglog-manual-1.rb
75
+ - test/debuglog-manual-2.rb