yell 1.2.3 → 1.3.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/LICENSE.txt +1 -1
- data/lib/yell.rb +8 -5
- data/lib/yell/adapters/base.rb +3 -9
- data/lib/yell/event.rb +18 -19
- data/lib/yell/formatter.rb +33 -17
- data/lib/yell/level.rb +1 -7
- data/lib/yell/logger.rb +70 -42
- data/lib/yell/version.rb +1 -1
- data/spec/yell/adapters/base_spec.rb +8 -7
- data/spec/yell/adapters/datefile_spec.rb +17 -14
- data/spec/yell/adapters/file_spec.rb +10 -9
- data/spec/yell/adapters/io_spec.rb +9 -8
- data/spec/yell/adapters_spec.rb +3 -3
- data/spec/yell/configuration_spec.rb +7 -7
- data/spec/yell/event_spec.rb +25 -25
- data/spec/yell/formatter_spec.rb +10 -9
- data/spec/yell/level_spec.rb +7 -7
- data/spec/yell/logger_spec.rb +56 -31
- data/spec/yell/repository_spec.rb +5 -5
- metadata +3 -3
data/LICENSE.txt
CHANGED
data/lib/yell.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
# Copyright (c) 2011-
|
3
|
+
# Copyright (c) 2011-2013 Rudolf Schmidt
|
4
4
|
#
|
5
5
|
# Permission is hereby granted, free of charge, to any person obtaining
|
6
6
|
# a copy of this software and associated documentation files (the
|
@@ -71,7 +71,8 @@ module Yell #:nodoc:
|
|
71
71
|
Yell.new Yell::Configuration.load!(file)
|
72
72
|
end
|
73
73
|
|
74
|
-
|
74
|
+
# @private
|
75
|
+
def env
|
75
76
|
return ENV['YELL_ENV'] if ENV.key? 'YELL_ENV'
|
76
77
|
return ENV['RACK_ENV'] if ENV.key? 'RACK_ENV'
|
77
78
|
return ENV['RAILS_ENV'] if ENV.key? 'RAILS_ENV'
|
@@ -83,7 +84,8 @@ module Yell #:nodoc:
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
86
|
-
|
87
|
+
# @private
|
88
|
+
def _deprecate( version, message, options = {} )
|
87
89
|
messages = ["Deprecation Warning (since v#{version}): #{message}" ]
|
88
90
|
messages << " before: #{options[:before]}" if options[:before]
|
89
91
|
messages << " after: #{options[:after]}" if options[:after]
|
@@ -91,9 +93,10 @@ module Yell #:nodoc:
|
|
91
93
|
_warn( *messages )
|
92
94
|
end
|
93
95
|
|
94
|
-
|
96
|
+
# @private
|
97
|
+
def _warn( *messages )
|
95
98
|
$stderr.puts "[Yell] " + messages.join( "\n" )
|
96
|
-
rescue
|
99
|
+
rescue Exception
|
97
100
|
# do nothing
|
98
101
|
end
|
99
102
|
end
|
data/lib/yell/adapters/base.rb
CHANGED
@@ -138,7 +138,9 @@ module Yell #:nodoc:
|
|
138
138
|
super() # init the monitor superclass
|
139
139
|
|
140
140
|
setup!(options)
|
141
|
-
|
141
|
+
|
142
|
+
# eval the given block
|
143
|
+
block.arity > 0 ? block.call(self) : instance_eval(&block) if block_given?
|
142
144
|
end
|
143
145
|
|
144
146
|
# The main method for calling the adapter.
|
@@ -163,12 +165,6 @@ module Yell #:nodoc:
|
|
163
165
|
end
|
164
166
|
|
165
167
|
# Get a pretty string representation of the adapter, including
|
166
|
-
# the inspectable attributes.
|
167
|
-
#
|
168
|
-
# @example Inspect the formatter.
|
169
|
-
# adapter.inspect
|
170
|
-
#
|
171
|
-
# @return [String] The inspection string.
|
172
168
|
def inspect
|
173
169
|
inspection = inspectables.inject( [] ) { |r, c| r << "#{c}: #{send(c).inspect}" }
|
174
170
|
"#<#{self.class.name} #{inspection * ', '}>"
|
@@ -221,8 +217,6 @@ module Yell #:nodoc:
|
|
221
217
|
end
|
222
218
|
|
223
219
|
# Get an array of inspected attributes for the adapter.
|
224
|
-
#
|
225
|
-
# @return [ String ] An array of pretty printed field values.
|
226
220
|
def inspectables
|
227
221
|
[ :level ]
|
228
222
|
end
|
data/lib/yell/event.rb
CHANGED
@@ -5,7 +5,6 @@ require 'socket'
|
|
5
5
|
|
6
6
|
module Yell #:nodoc:
|
7
7
|
|
8
|
-
#
|
9
8
|
# Yell::Event.new( :info, 'Hello World', { :scope => 'Application' } )
|
10
9
|
# #=> Hello World scope: Application
|
11
10
|
class Event
|
@@ -19,9 +18,6 @@ module Yell #:nodoc:
|
|
19
18
|
@@hostname = Socket.gethostname rescue nil
|
20
19
|
@@progname = $0
|
21
20
|
|
22
|
-
# Accessor to the pid
|
23
|
-
attr_reader :pid
|
24
|
-
|
25
21
|
# Accessor to the log level
|
26
22
|
attr_reader :level
|
27
23
|
|
@@ -31,24 +27,20 @@ module Yell #:nodoc:
|
|
31
27
|
# Accessor to the time the log event occured
|
32
28
|
attr_reader :time
|
33
29
|
|
34
|
-
# Accessor to the current tread_id
|
35
|
-
attr_reader :thread_id
|
36
|
-
|
37
30
|
|
38
|
-
def initialize( level, *messages, &block
|
39
|
-
@pid = Process.pid
|
31
|
+
def initialize(logger, level, *messages, &block)
|
40
32
|
@time = Time.now
|
41
33
|
@level = level
|
42
34
|
|
43
35
|
@messages = messages
|
44
36
|
@messages << block.call if block
|
45
37
|
|
46
|
-
@
|
47
|
-
|
48
|
-
@caller = caller[CallerIndex].to_s
|
38
|
+
@caller = logger.trace.at?(level) ? caller[CallerIndex].to_s : ''
|
49
39
|
@file = nil
|
50
40
|
@line = nil
|
51
41
|
@method = nil
|
42
|
+
|
43
|
+
@pid = nil
|
52
44
|
end
|
53
45
|
|
54
46
|
# Accessor to the hostname
|
@@ -61,29 +53,36 @@ module Yell #:nodoc:
|
|
61
53
|
@@progname
|
62
54
|
end
|
63
55
|
|
56
|
+
# Accessor to the PID
|
57
|
+
def pid
|
58
|
+
Process.pid
|
59
|
+
end
|
60
|
+
|
61
|
+
# Accessor to the thread's id
|
62
|
+
def thread_id
|
63
|
+
Thread.current.object_id
|
64
|
+
end
|
65
|
+
|
64
66
|
# Accessor to filename the log event occured
|
65
67
|
def file
|
66
|
-
_caller
|
67
|
-
@file
|
68
|
+
@file || (_caller!; @file)
|
68
69
|
end
|
69
70
|
|
70
71
|
# Accessor to the line the log event occured
|
71
72
|
def line
|
72
|
-
_caller
|
73
|
-
@line
|
73
|
+
@line || (_caller!; @line)
|
74
74
|
end
|
75
75
|
|
76
76
|
# Accessor to the method the log event occured
|
77
77
|
def method
|
78
|
-
_caller
|
79
|
-
@method
|
78
|
+
@method || (_caller!; @method)
|
80
79
|
end
|
81
80
|
|
82
81
|
|
83
82
|
private
|
84
83
|
|
85
84
|
def _caller!
|
86
|
-
if m = CallerRegexp.match(
|
85
|
+
if m = CallerRegexp.match(@caller)
|
87
86
|
@file, @line, @method = m[1..-1]
|
88
87
|
else
|
89
88
|
@file, @line, @method = ['', '', '']
|
data/lib/yell/formatter.rb
CHANGED
@@ -87,24 +87,33 @@ module Yell #:nodoc:
|
|
87
87
|
@pattern = pattern || Yell::DefaultFormat
|
88
88
|
@date_pattern = date_pattern || :iso8601
|
89
89
|
|
90
|
-
|
90
|
+
define_date_method!
|
91
|
+
define_format_method!
|
91
92
|
end
|
92
93
|
|
93
|
-
# Get a pretty string representation of the formatter, including
|
94
|
-
# the pattern and date pattern.
|
95
|
-
#
|
96
|
-
# @example Inspect the formatter.
|
97
|
-
# formatter.inspect
|
98
|
-
#
|
99
|
-
# @return [String] The inspection string.
|
94
|
+
# Get a pretty string representation of the formatter, including the pattern and date pattern.
|
100
95
|
def inspect
|
101
96
|
"#<#{self.class.name} pattern: #{@pattern.inspect}, date_pattern: #{@date_pattern.inspect}>"
|
102
97
|
end
|
103
98
|
|
99
|
+
|
104
100
|
private
|
105
101
|
|
106
|
-
|
107
|
-
|
102
|
+
def define_date_method!
|
103
|
+
buf = case @date_pattern
|
104
|
+
when String then "t.strftime(@date_pattern)"
|
105
|
+
when Symbol then respond_to?(@date_pattern, true) ? "#{@date_pattern}(t)" : "t.#{@date_pattern}"
|
106
|
+
else "iso8601(t)"
|
107
|
+
end
|
108
|
+
|
109
|
+
instance_eval %-
|
110
|
+
def date( t )
|
111
|
+
#{buf}
|
112
|
+
end
|
113
|
+
-
|
114
|
+
end
|
115
|
+
|
116
|
+
def define_format_method!
|
108
117
|
buff, args, _pattern = "", [], @pattern.dup
|
109
118
|
|
110
119
|
while true
|
@@ -126,15 +135,22 @@ module Yell #:nodoc:
|
|
126
135
|
-
|
127
136
|
end
|
128
137
|
|
129
|
-
|
130
|
-
|
138
|
+
# The iso8601 implementation of the standard Time library is more than
|
139
|
+
# twice as slow than using strftime. So, we just implement it ourselves.
|
140
|
+
def iso8601( t )
|
141
|
+
zone = if t.utc?
|
142
|
+
"-00:00"
|
143
|
+
else
|
144
|
+
offset = t.utc_offset
|
145
|
+
sign = offset < 0 ? '-' : '+'
|
146
|
+
sprintf('%s%02d:%02d', sign, *(offset.abs/60).divmod(60))
|
147
|
+
end
|
148
|
+
|
149
|
+
t.strftime("%Y-%m-%dT%H:%M:%S#{zone}")
|
131
150
|
end
|
132
151
|
|
133
|
-
def
|
134
|
-
|
135
|
-
when String then t.strftime( @date_pattern )
|
136
|
-
else t.iso8601
|
137
|
-
end
|
152
|
+
def level( l )
|
153
|
+
Yell::Severities[ l ]
|
138
154
|
end
|
139
155
|
|
140
156
|
def message( *messages )
|
data/lib/yell/level.rb
CHANGED
@@ -138,13 +138,7 @@ module Yell #:nodoc:
|
|
138
138
|
end
|
139
139
|
alias :to_int :to_i
|
140
140
|
|
141
|
-
# Get a pretty string representation of the level, including the
|
142
|
-
# severities.
|
143
|
-
#
|
144
|
-
# @example Inspect the level.
|
145
|
-
# level.inspect
|
146
|
-
#
|
147
|
-
# @return [String] The inspection string.
|
141
|
+
# Get a pretty string representation of the level, including the severities.
|
148
142
|
def inspect
|
149
143
|
severities = Yell::Severities.each.with_index.inject( [] ) do |r, (l, i)|
|
150
144
|
r << l if @severities[i]
|
data/lib/yell/logger.rb
CHANGED
@@ -14,6 +14,9 @@ module Yell #:nodoc:
|
|
14
14
|
# The name of the logger instance
|
15
15
|
attr_reader :name
|
16
16
|
|
17
|
+
# Stacktrace or not
|
18
|
+
attr_reader :trace
|
19
|
+
|
17
20
|
# Initialize a new Logger
|
18
21
|
#
|
19
22
|
# @example A standard file logger
|
@@ -36,34 +39,67 @@ module Yell #:nodoc:
|
|
36
39
|
# Yell::Logger.new :datefile, 'development.log' do |l|
|
37
40
|
# l.level = :info
|
38
41
|
# end
|
39
|
-
def initialize( *args )
|
42
|
+
def initialize( *args, &block )
|
40
43
|
@adapters = []
|
41
44
|
|
42
45
|
# extract options
|
43
46
|
@options = args.last.is_a?(Hash) ? args.pop : {}
|
44
47
|
|
45
48
|
# adapters may be passed in the options
|
46
|
-
|
49
|
+
extract!(@options)
|
47
50
|
|
48
51
|
# check if filename was given as argument and put it into the @options
|
49
52
|
if [String, Pathname].include?(args.last.class)
|
50
53
|
@options[:filename] = args.pop unless @options[:filename]
|
51
54
|
end
|
52
55
|
|
53
|
-
|
54
|
-
self.
|
55
|
-
|
56
|
-
# set the loggeer's name
|
57
|
-
self.name = @options[:name] if @options[:name]
|
56
|
+
self.level = @options.fetch(:level, 0) # debug by defauly
|
57
|
+
self.name = @options.fetch(:name, nil) # no name by default
|
58
|
+
self.trace = @options.fetch(:trace, :error) # trace from :error level onwards
|
58
59
|
|
59
60
|
# extract adapter
|
60
|
-
self.adapter
|
61
|
+
self.adapter(args.pop) if args.any?
|
61
62
|
|
62
63
|
# eval the given block
|
63
|
-
|
64
|
+
block.arity > 0 ? block.call(self) : instance_eval(&block) if block_given?
|
64
65
|
|
65
66
|
# default adapter when none defined
|
66
|
-
self.adapter
|
67
|
+
self.adapter(:file) if @adapters.empty?
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# Set the name of a logger. When providing a name, the logger will
|
72
|
+
# automatically be added to the Yell::Repository.
|
73
|
+
#
|
74
|
+
# @return [String] The logger's name
|
75
|
+
def name=( val )
|
76
|
+
@name = val
|
77
|
+
Yell::Repository[@name] = self if @name
|
78
|
+
|
79
|
+
@name
|
80
|
+
end
|
81
|
+
|
82
|
+
# Set whether the logger should allow tracing or not. The trace option
|
83
|
+
# will tell the logger when to provider caller information.
|
84
|
+
#
|
85
|
+
# @example No tracing at all
|
86
|
+
# trace = false
|
87
|
+
#
|
88
|
+
# @example Trace every time
|
89
|
+
# race = true
|
90
|
+
#
|
91
|
+
# @example Trace from the error level onwards
|
92
|
+
# trace = :error
|
93
|
+
# trace = 'gte.error'
|
94
|
+
#
|
95
|
+
# @return [Yell::Level] a level representation of the tracer
|
96
|
+
def trace=( severity )
|
97
|
+
@trace = case severity
|
98
|
+
when true then Yell::Level.new
|
99
|
+
when false then Yell::Level.new( "gt.#{Yell::Severities.last}" )
|
100
|
+
when Yell::Level then severity
|
101
|
+
else Yell::Level.new( severity )
|
102
|
+
end
|
67
103
|
end
|
68
104
|
|
69
105
|
# Define an adapter to be used for logging.
|
@@ -84,9 +120,7 @@ module Yell #:nodoc:
|
|
84
120
|
# adapter( Yell::Adapter::File.new )
|
85
121
|
#
|
86
122
|
# @param [Symbol] type The type of the adapter, may be `:file` or `:datefile` (default `:file`)
|
87
|
-
#
|
88
123
|
# @return [Yell::Adapter] The instance
|
89
|
-
#
|
90
124
|
# @raise [Yell::NoSuchAdapter] Will be thrown when the adapter is not defined
|
91
125
|
def adapter( type = :file, *args, &block )
|
92
126
|
options = [@options, *args].inject( Hash.new ) do |h, c|
|
@@ -96,15 +130,6 @@ module Yell #:nodoc:
|
|
96
130
|
@adapters << Yell::Adapters.new( type, options, &block )
|
97
131
|
end
|
98
132
|
|
99
|
-
def name=( val )
|
100
|
-
Yell::Repository[val] = self
|
101
|
-
end
|
102
|
-
|
103
|
-
# Convenience method for resetting all adapters of the Logger.
|
104
|
-
def close
|
105
|
-
@adapters.each(&:close)
|
106
|
-
end
|
107
|
-
|
108
133
|
# Creates instance methods for every log level:
|
109
134
|
# `debug` and `debug?`
|
110
135
|
# `info` and `info?`
|
@@ -115,31 +140,36 @@ module Yell #:nodoc:
|
|
115
140
|
name = s.downcase
|
116
141
|
|
117
142
|
class_eval <<-EOS, __FILE__, __LINE__
|
118
|
-
def #{name}?; @level.at?(#{index}); end
|
119
|
-
|
120
|
-
def #{name}( *m, &b )
|
121
|
-
return false unless #{name}?
|
122
|
-
write Yell::Event.new(#{index}, *m, &b) # write Yell::Event.new(1, *m, &b)
|
123
|
-
|
124
|
-
true
|
125
|
-
end
|
143
|
+
def #{name}?; @level.at?(#{index}); end # def info?; @level.at?(1); end
|
144
|
+
#
|
145
|
+
def #{name}( *m, &b ) # def info( *m, &b )
|
146
|
+
return false unless #{name}? # return false unless info?
|
147
|
+
write Yell::Event.new(self, #{index}, *m, &b) # write Yell::Event.new(self, 1, *m, &b)
|
148
|
+
#
|
149
|
+
true # true
|
150
|
+
end # end
|
126
151
|
EOS
|
127
152
|
end
|
128
153
|
|
129
154
|
# Get a pretty string representation of the logger.
|
130
|
-
#
|
131
|
-
# @example Inspect the logger
|
132
|
-
# logger.inspect
|
133
|
-
#
|
134
|
-
# @return [String] The inspection string.
|
135
155
|
def inspect
|
136
156
|
inspection = inspectables.inject( [] ) { |r, c| r << "#{c}: #{send(c).inspect}" }
|
137
157
|
"#<#{self.class.name} #{inspection * ', '}, adapters: #{@adapters.map(&:inspect) * ', '}>"
|
138
158
|
end
|
139
159
|
|
160
|
+
# @private
|
161
|
+
def close
|
162
|
+
@adapters.each(&:close)
|
163
|
+
end
|
164
|
+
|
165
|
+
# @private
|
166
|
+
def adapters
|
167
|
+
@adapters
|
168
|
+
end
|
169
|
+
|
140
170
|
private
|
141
171
|
|
142
|
-
# The :adapters key may be passed to the options hash. It may appear in
|
172
|
+
# The :adapters key may be passed to the options hash. It may appear in
|
143
173
|
# multiple variations:
|
144
174
|
#
|
145
175
|
# @example
|
@@ -147,11 +177,11 @@ module Yell #:nodoc:
|
|
147
177
|
#
|
148
178
|
# @example
|
149
179
|
# options = { :adapters => [:stdout => {:level => :info}, :stderr => {:level => :error}]
|
150
|
-
def
|
151
|
-
( opts.delete(
|
180
|
+
def extract!( opts )
|
181
|
+
( opts.delete(:adapters) || [] ).each do |a|
|
152
182
|
case a
|
153
|
-
|
154
|
-
|
183
|
+
when String, Symbol then adapter( a )
|
184
|
+
else a.each { |n, o| adapter( n, o || {} ) }
|
155
185
|
end
|
156
186
|
end
|
157
187
|
end
|
@@ -162,10 +192,8 @@ module Yell #:nodoc:
|
|
162
192
|
end
|
163
193
|
|
164
194
|
# Get an array of inspected attributes for the adapter.
|
165
|
-
#
|
166
|
-
# @return [ String ] An array of pretty printed field values.
|
167
195
|
def inspectables
|
168
|
-
[ :name, :level ]
|
196
|
+
[ :name, :level, :trace ]
|
169
197
|
end
|
170
198
|
|
171
199
|
end
|
data/lib/yell/version.rb
CHANGED
@@ -10,7 +10,7 @@ describe Yell::Adapters::Base do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should set the level" do
|
13
|
-
Yell::Adapters::Base.new
|
13
|
+
Yell::Adapters::Base.new(:level => :info)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -23,23 +23,24 @@ describe Yell::Adapters::Base do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it "should set the level" do
|
26
|
-
Yell::Adapters::Base.new
|
26
|
+
Yell::Adapters::Base.new(:level => :info)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
context :options do
|
32
|
-
let(
|
33
|
-
let(
|
32
|
+
let(:options) { {:my => :options} }
|
33
|
+
let(:adapter) { Yell::Adapters::Base.new(options) }
|
34
34
|
|
35
35
|
it { options.should == options }
|
36
36
|
end
|
37
37
|
|
38
38
|
context :write do
|
39
|
-
|
39
|
+
let(:logger) { Yell::Logger.new }
|
40
|
+
subject { Yell::Adapters::Base.new(:level => 1) }
|
40
41
|
|
41
42
|
it "should delegate :event to :write!" do
|
42
|
-
event = Yell::Event.new( 1, "Hello World!" )
|
43
|
+
event = Yell::Event.new( logger, 1, "Hello World!" )
|
43
44
|
|
44
45
|
mock( subject ).write!( event )
|
45
46
|
|
@@ -47,7 +48,7 @@ describe Yell::Adapters::Base do
|
|
47
48
|
end
|
48
49
|
|
49
50
|
it "should not write when event does not have the right level" do
|
50
|
-
event = Yell::Event.new( 0, "Hello World!" )
|
51
|
+
event = Yell::Event.new( logger, 0, "Hello World!" )
|
51
52
|
|
52
53
|
dont_allow( subject ).write!( event )
|
53
54
|
|
@@ -1,15 +1,18 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Yell::Adapters::Datefile do
|
4
|
-
let(
|
5
|
-
let(
|
4
|
+
let(:logger) { Yell::Logger.new }
|
5
|
+
let(:filename) { fixture_path + '/test.log' }
|
6
|
+
let(:event) { Yell::Event.new(logger, 1, "Hello World") }
|
6
7
|
|
7
8
|
before do
|
8
9
|
Timecop.freeze( Time.now )
|
9
10
|
end
|
10
11
|
|
12
|
+
it { should be_kind_of Yell::Adapters::File }
|
13
|
+
|
11
14
|
describe :filename do
|
12
|
-
let(
|
15
|
+
let(:adapter) { Yell::Adapters::Datefile.new(:filename => filename, :symlink => false) }
|
13
16
|
|
14
17
|
it "should be replaced with date_pattern" do
|
15
18
|
adapter.write( event )
|
@@ -21,12 +24,12 @@ describe Yell::Adapters::Datefile do
|
|
21
24
|
mock( File ).open( datefile_filename, anything ) { File.new('/dev/null', 'w') }
|
22
25
|
|
23
26
|
adapter.write( event )
|
24
|
-
Timecop.freeze( Time.now + 10 ) { adapter.write(
|
27
|
+
Timecop.freeze( Time.now + 10 ) { adapter.write(event) }
|
25
28
|
end
|
26
29
|
|
27
30
|
context "rollover" do
|
28
|
-
let(
|
29
|
-
let(
|
31
|
+
let(:tomorrow) { Time.now + 86400 }
|
32
|
+
let(:tomorrow_datefile_filename) { fixture_path + "/test.#{tomorrow.strftime(Yell::Adapters::Datefile::DefaultDatePattern)}.log" }
|
30
33
|
|
31
34
|
it "should rotate when date has passed" do
|
32
35
|
mock( File ).open( datefile_filename, anything ) { File.new('/dev/null', 'w') }
|
@@ -41,7 +44,7 @@ describe Yell::Adapters::Datefile do
|
|
41
44
|
end
|
42
45
|
|
43
46
|
describe :keep do
|
44
|
-
let(
|
47
|
+
let(:adapter) { Yell::Adapters::Datefile.new(:keep => 2, :filename => filename, :symlink => false, :date_pattern => "%M") }
|
45
48
|
|
46
49
|
it "should keep the specified number or files upon rollover" do
|
47
50
|
adapter.write( event )
|
@@ -60,17 +63,17 @@ describe Yell::Adapters::Datefile do
|
|
60
63
|
end
|
61
64
|
|
62
65
|
describe :symlink do
|
63
|
-
let(
|
66
|
+
let(:time) { Time.now }
|
64
67
|
before { Timecop.freeze(time) }
|
65
68
|
|
66
69
|
context "default (true)" do
|
67
|
-
let(
|
70
|
+
let(:adapter) { Yell::Adapters::Datefile.new(:filename => filename, :date_pattern => "%M") }
|
68
71
|
|
69
72
|
it "should create the sylink the original filename" do
|
70
73
|
adapter.write( event )
|
71
74
|
|
72
75
|
File.symlink?( filename ).should be_true
|
73
|
-
File.readlink( filename ).should == datefile_filename(
|
76
|
+
File.readlink( filename ).should == datefile_filename(adapter.date_pattern)
|
74
77
|
end
|
75
78
|
|
76
79
|
it "should symlink upon rollover" do
|
@@ -80,13 +83,13 @@ describe Yell::Adapters::Datefile do
|
|
80
83
|
adapter.write( event )
|
81
84
|
|
82
85
|
File.symlink?( filename ).should be_true
|
83
|
-
File.readlink( filename ).should == datefile_filename(
|
86
|
+
File.readlink( filename ).should == datefile_filename(adapter.date_pattern)
|
84
87
|
end
|
85
88
|
end
|
86
89
|
end
|
87
90
|
|
88
91
|
context "when set to false" do
|
89
|
-
let(
|
92
|
+
let(:adapter) { Yell::Adapters::Datefile.new(:symlink => false, :filename => filename, :date_pattern => "%M") }
|
90
93
|
|
91
94
|
it "should not create the sylink the original filename" do
|
92
95
|
adapter.write( event )
|
@@ -97,8 +100,8 @@ describe Yell::Adapters::Datefile do
|
|
97
100
|
end
|
98
101
|
|
99
102
|
describe :header do
|
100
|
-
let(
|
101
|
-
let(
|
103
|
+
let(:adapter) { Yell::Adapters::Datefile.new(:filename => filename) }
|
104
|
+
let(:header) { File.open(datefile_filename, &:readline) }
|
102
105
|
|
103
106
|
before do
|
104
107
|
adapter.format = "%m" # easier to parse
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Yell::Adapters::File do
|
4
|
-
let(
|
4
|
+
let(:devnull) { File.new('/dev/null', 'w') }
|
5
5
|
|
6
6
|
before do
|
7
7
|
stub( File ).open( anything, anything ) { devnull }
|
@@ -16,11 +16,12 @@ describe Yell::Adapters::File do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
context :write do
|
19
|
-
let(
|
19
|
+
let(:logger) { Yell::Logger.new }
|
20
|
+
let(:event) { Yell::Event.new(logger, 1, "Hello World") }
|
20
21
|
|
21
22
|
context "default filename" do
|
22
|
-
let(
|
23
|
-
let(
|
23
|
+
let(:filename) { File.expand_path "#{Yell.env}.log" }
|
24
|
+
let(:adapter) { Yell::Adapters::File.new }
|
24
25
|
|
25
26
|
it "should print to file" do
|
26
27
|
mock( File ).open( filename, File::WRONLY|File::APPEND|File::CREAT ) { devnull }
|
@@ -30,8 +31,8 @@ describe Yell::Adapters::File do
|
|
30
31
|
end
|
31
32
|
|
32
33
|
context "with given :filename" do
|
33
|
-
let(
|
34
|
-
let(
|
34
|
+
let(:filename) { fixture_path + '/filename.log' }
|
35
|
+
let(:adapter) { Yell::Adapters::File.new( :filename => filename ) }
|
35
36
|
|
36
37
|
it "should print to file" do
|
37
38
|
mock( File ).open( filename, File::WRONLY|File::APPEND|File::CREAT ) { devnull }
|
@@ -41,8 +42,8 @@ describe Yell::Adapters::File do
|
|
41
42
|
end
|
42
43
|
|
43
44
|
context "with given :pathname" do
|
44
|
-
let(
|
45
|
-
let(
|
45
|
+
let(:pathname) { Pathname.new(fixture_path).join('filename.log') }
|
46
|
+
let(:adapter) { Yell::Adapters::File.new( :filename => pathname ) }
|
46
47
|
|
47
48
|
it "should accept pathanme as filename" do
|
48
49
|
mock( File ).open( pathname.to_s, File::WRONLY|File::APPEND|File::CREAT ) { devnull }
|
@@ -52,7 +53,7 @@ describe Yell::Adapters::File do
|
|
52
53
|
end
|
53
54
|
|
54
55
|
context :sync do
|
55
|
-
let(
|
56
|
+
let(:adapter) { Yell::Adapters::File.new }
|
56
57
|
|
57
58
|
it "should sync by default" do
|
58
59
|
mock( devnull ).sync=( true )
|
@@ -8,14 +8,14 @@ describe Yell::Adapters::Io do
|
|
8
8
|
it "should set default :format" do
|
9
9
|
adapter = Yell::Adapters::Io.new
|
10
10
|
|
11
|
-
adapter.format.should be_kind_of
|
11
|
+
adapter.format.should be_kind_of(Yell::Formatter)
|
12
12
|
end
|
13
13
|
|
14
14
|
context :level do
|
15
|
-
let(
|
15
|
+
let(:level) { Yell::Level.new(:warn) }
|
16
16
|
|
17
17
|
it "should set the level" do
|
18
|
-
adapter = Yell::Adapters::Io.new
|
18
|
+
adapter = Yell::Adapters::Io.new(:level => level)
|
19
19
|
adapter.level.should == level
|
20
20
|
end
|
21
21
|
|
@@ -26,10 +26,10 @@ describe Yell::Adapters::Io do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
context :format do
|
29
|
-
let(
|
29
|
+
let(:format) { Yell::Formatter.new }
|
30
30
|
|
31
31
|
it "should set the level" do
|
32
|
-
adapter = Yell::Adapters::Io.new
|
32
|
+
adapter = Yell::Adapters::Io.new(:format => format)
|
33
33
|
adapter.format.should == format
|
34
34
|
end
|
35
35
|
|
@@ -41,9 +41,10 @@ describe Yell::Adapters::Io do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
context :write do
|
44
|
-
let(
|
45
|
-
let(
|
46
|
-
let(
|
44
|
+
let(:logger) { Yell::Logger.new }
|
45
|
+
let(:event) { Yell::Event.new(logger, 1, "Hello World") }
|
46
|
+
let(:adapter) { Yell::Adapters::Io.new }
|
47
|
+
let(:stream) { File.new('/dev/null', 'w') }
|
47
48
|
|
48
49
|
before do
|
49
50
|
stub( adapter ).stream { stream }
|
data/spec/yell/adapters_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe Yell::Adapters do
|
|
4
4
|
|
5
5
|
context :new do
|
6
6
|
context "given a Yell::Adapters::Base ancestor" do
|
7
|
-
let(
|
7
|
+
let(:stdout) { Yell::Adapters::Stdout.new }
|
8
8
|
|
9
9
|
it "should return the instance" do
|
10
10
|
Yell::Adapters.new( stdout ).should == stdout
|
@@ -35,8 +35,8 @@ describe Yell::Adapters do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
context :register do
|
38
|
-
let(
|
39
|
-
let(
|
38
|
+
let(:name) { :test }
|
39
|
+
let(:klass) { mock }
|
40
40
|
|
41
41
|
before { Yell::Adapters.register( name, klass ) }
|
42
42
|
|
@@ -3,14 +3,14 @@ require 'spec_helper'
|
|
3
3
|
describe Yell::Configuration do
|
4
4
|
|
5
5
|
describe ":load!" do
|
6
|
-
let(
|
7
|
-
let(
|
6
|
+
let(:file) { fixture_path + '/yell.yml' }
|
7
|
+
let(:config) { Yell::Configuration.load!(file) }
|
8
8
|
|
9
9
|
subject { config }
|
10
10
|
|
11
|
-
it { should be_kind_of
|
12
|
-
it { should have_key
|
13
|
-
it { should have_key
|
11
|
+
it { should be_kind_of(Hash) }
|
12
|
+
it { should have_key(:level) }
|
13
|
+
it { should have_key(:adapters) }
|
14
14
|
|
15
15
|
context :level do
|
16
16
|
subject { config[:level] }
|
@@ -21,13 +21,13 @@ describe Yell::Configuration do
|
|
21
21
|
context :adapters do
|
22
22
|
subject { config[:adapters] }
|
23
23
|
|
24
|
-
it { should be_kind_of
|
24
|
+
it { should be_kind_of(Array) }
|
25
25
|
|
26
26
|
# stdout
|
27
27
|
it { subject.first.should == :stdout }
|
28
28
|
|
29
29
|
# stderr
|
30
|
-
it { subject.last.should be_kind_of
|
30
|
+
it { subject.last.should be_kind_of(Hash) }
|
31
31
|
it { subject.last.should == { :stderr => {:level => 'gte.error'} } }
|
32
32
|
end
|
33
33
|
end
|
data/spec/yell/event_spec.rb
CHANGED
@@ -4,39 +4,21 @@ require 'spec_helper'
|
|
4
4
|
# the logger methods, we need to divert here in order to get
|
5
5
|
# the correct caller.
|
6
6
|
class EventFactory
|
7
|
-
def self.event( level, message
|
8
|
-
self._event( level, message
|
7
|
+
def self.event(logger, level, message)
|
8
|
+
self._event(logger, level, message)
|
9
9
|
end
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
def self._event( level, message
|
14
|
-
Yell::Event.new level, message
|
13
|
+
def self._event(logger, level, message)
|
14
|
+
Yell::Event.new(logger, level, message)
|
15
15
|
end
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
19
|
describe Yell::Event do
|
20
|
-
let(:
|
21
|
-
|
22
|
-
context :caller do
|
23
|
-
let( :event ) { EventFactory.event 1, "Hello World" }
|
24
|
-
|
25
|
-
context :file do
|
26
|
-
subject { event.file }
|
27
|
-
it { should == __FILE__ }
|
28
|
-
end
|
29
|
-
|
30
|
-
context :line do
|
31
|
-
subject { event.line }
|
32
|
-
it { should == "8" }
|
33
|
-
end
|
34
|
-
|
35
|
-
context :method do
|
36
|
-
subject { event.method }
|
37
|
-
it { should == 'event' }
|
38
|
-
end
|
39
|
-
end
|
20
|
+
let(:logger) { Yell::Logger.new(:trace => true) }
|
21
|
+
let(:event) { Yell::Event.new(logger, 1, 'Hello World!') }
|
40
22
|
|
41
23
|
context :level do
|
42
24
|
subject { event.level }
|
@@ -77,7 +59,7 @@ describe Yell::Event do
|
|
77
59
|
read, write = IO.pipe
|
78
60
|
|
79
61
|
@pid = Process.fork do
|
80
|
-
event = Yell::Event.new 1, 'Hello World!'
|
62
|
+
event = Yell::Event.new(logger, 1, 'Hello World!')
|
81
63
|
write.puts event.pid
|
82
64
|
end
|
83
65
|
Process.wait
|
@@ -96,4 +78,22 @@ describe Yell::Event do
|
|
96
78
|
it { should == $0 }
|
97
79
|
end
|
98
80
|
|
81
|
+
context :caller do
|
82
|
+
subject { EventFactory.event(logger, 1, "Hello World") }
|
83
|
+
|
84
|
+
context "with trace" do
|
85
|
+
its(:file) { should == __FILE__ }
|
86
|
+
its(:line) { should == "8" }
|
87
|
+
its(:method) { should == "event" }
|
88
|
+
end
|
89
|
+
|
90
|
+
context "without trace" do
|
91
|
+
before { logger.trace = false }
|
92
|
+
|
93
|
+
its(:file) { should == "" }
|
94
|
+
its(:line) { should == "" }
|
95
|
+
its(:method) { should == "" }
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
99
|
end
|
data/spec/yell/formatter_spec.rb
CHANGED
@@ -2,11 +2,12 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Yell::Formatter do
|
4
4
|
|
5
|
-
let(
|
6
|
-
let(
|
7
|
-
let(
|
5
|
+
let(:logger) { Yell::Logger.new }
|
6
|
+
let(:formatter) { Yell::Formatter.new(subject) }
|
7
|
+
let(:event) { Yell::Event.new(logger, 1, 'Hello World!') }
|
8
|
+
let(:time) { Time.now }
|
8
9
|
|
9
|
-
let(
|
10
|
+
let(:format) { formatter.format(event) }
|
10
11
|
|
11
12
|
before do
|
12
13
|
Timecop.freeze( time )
|
@@ -52,7 +53,7 @@ describe Yell::Formatter do
|
|
52
53
|
end
|
53
54
|
|
54
55
|
context "caller" do
|
55
|
-
let(
|
56
|
+
let(:_caller) { [nil, nil, "/path/to/file.rb:123:in `test_method'"] }
|
56
57
|
|
57
58
|
before do
|
58
59
|
any_instance_of( Yell::Event ) do |e|
|
@@ -104,8 +105,8 @@ describe Yell::Formatter do
|
|
104
105
|
end
|
105
106
|
|
106
107
|
context "Exceptions" do
|
107
|
-
let(
|
108
|
-
let(
|
108
|
+
let(:exception) { StandardError.new( "This is an Exception" ) }
|
109
|
+
let(:event) { Yell::Event.new(logger, 1, exception) }
|
109
110
|
|
110
111
|
subject { "%m" }
|
111
112
|
|
@@ -117,8 +118,8 @@ describe Yell::Formatter do
|
|
117
118
|
end
|
118
119
|
|
119
120
|
context "Hashes" do
|
120
|
-
let(
|
121
|
-
let(
|
121
|
+
let(:hash) { { :test => 'message' } }
|
122
|
+
let(:event) { Yell::Event.new(logger, 1, hash) }
|
122
123
|
|
123
124
|
subject { "%m" }
|
124
125
|
|
data/spec/yell/level_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Yell::Level do
|
4
4
|
|
5
5
|
context "default" do
|
6
|
-
let(
|
6
|
+
let(:level) { Yell::Level.new }
|
7
7
|
|
8
8
|
it { level.at?(:debug).should be_true }
|
9
9
|
it { level.at?(:info).should be_true }
|
@@ -13,7 +13,7 @@ describe Yell::Level do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
context "given a Symbol" do
|
16
|
-
let(
|
16
|
+
let(:level) { Yell::Level.new(subject) }
|
17
17
|
|
18
18
|
context :debug do
|
19
19
|
subject { :debug }
|
@@ -67,7 +67,7 @@ describe Yell::Level do
|
|
67
67
|
end
|
68
68
|
|
69
69
|
context "given a String" do
|
70
|
-
let(
|
70
|
+
let(:level) { Yell::Level.new(subject) }
|
71
71
|
|
72
72
|
context "basic string" do
|
73
73
|
subject { 'error' }
|
@@ -131,7 +131,7 @@ describe Yell::Level do
|
|
131
131
|
end
|
132
132
|
|
133
133
|
context "given an Array" do
|
134
|
-
let(
|
134
|
+
let(:level) { Yell::Level.new( [:debug, :warn, :fatal] ) }
|
135
135
|
|
136
136
|
it { level.at?(:debug).should be_true }
|
137
137
|
it { level.at?(:info).should be_false }
|
@@ -141,7 +141,7 @@ describe Yell::Level do
|
|
141
141
|
end
|
142
142
|
|
143
143
|
context "given a Range" do
|
144
|
-
let(
|
144
|
+
let(:level) { Yell::Level.new( (1..3) ) }
|
145
145
|
|
146
146
|
it { level.at?(:debug).should be_false }
|
147
147
|
it { level.at?(:info).should be_true }
|
@@ -151,7 +151,7 @@ describe Yell::Level do
|
|
151
151
|
end
|
152
152
|
|
153
153
|
context "given a Yell::Level instance" do
|
154
|
-
let(
|
154
|
+
let(:level) { Yell::Level.new(:warn) }
|
155
155
|
|
156
156
|
it { level.at?(:debug).should be_false }
|
157
157
|
it { level.at?(:info).should be_false }
|
@@ -161,7 +161,7 @@ describe Yell::Level do
|
|
161
161
|
end
|
162
162
|
|
163
163
|
context "backwards compatibility" do
|
164
|
-
let(
|
164
|
+
let(:level) { Yell::Level.new :warn }
|
165
165
|
|
166
166
|
it { level.to_i.should == 2 }
|
167
167
|
it { Integer(level).should == 2 }
|
data/spec/yell/logger_spec.rb
CHANGED
@@ -13,10 +13,12 @@ class LoggerFactory
|
|
13
13
|
end
|
14
14
|
|
15
15
|
describe Yell::Logger do
|
16
|
-
let(
|
16
|
+
let(:filename) { fixture_path + '/logger.log' }
|
17
17
|
|
18
18
|
context "a Logger instance" do
|
19
|
-
let(
|
19
|
+
let(:logger) { Yell::Logger.new }
|
20
|
+
|
21
|
+
its(:name) { should be_nil }
|
20
22
|
|
21
23
|
context "log methods" do
|
22
24
|
subject { logger }
|
@@ -41,23 +43,43 @@ describe Yell::Logger do
|
|
41
43
|
end
|
42
44
|
|
43
45
|
context "default adapter" do
|
44
|
-
let(
|
46
|
+
let(:adapters) { logger.instance_variable_get(:@adapters) }
|
45
47
|
|
46
48
|
it { adapters.size.should == 1 }
|
47
|
-
it { adapters.first.should be_kind_of
|
49
|
+
it { adapters.first.should be_kind_of(Yell::Adapters::File) }
|
50
|
+
end
|
51
|
+
|
52
|
+
context "default :level" do
|
53
|
+
subject { logger.level }
|
54
|
+
|
55
|
+
it { should be_instance_of(Yell::Level) }
|
56
|
+
its(:severities) { should == [true, true, true, true, true, true] }
|
57
|
+
end
|
58
|
+
|
59
|
+
context "default :trace" do
|
60
|
+
subject { logger.trace }
|
61
|
+
|
62
|
+
it { should be_instance_of(Yell::Level) }
|
63
|
+
its(:severities) { should == [false, false, false, true, true, true] } # from error onwards
|
48
64
|
end
|
49
65
|
end
|
50
66
|
|
51
67
|
context "initialize with a :name" do
|
52
|
-
let(
|
68
|
+
let(:name) { 'test' }
|
69
|
+
let!(:logger) { Yell.new(:name => name) }
|
53
70
|
|
54
|
-
it "should
|
55
|
-
logger
|
71
|
+
it "should set the logger's name" do
|
72
|
+
logger.name.should == name
|
73
|
+
end
|
56
74
|
|
75
|
+
it "should be added to the repository" do
|
57
76
|
Yell::Repository[name].should == logger
|
58
77
|
end
|
59
78
|
end
|
60
79
|
|
80
|
+
context "initialize with :trace" do
|
81
|
+
end
|
82
|
+
|
61
83
|
context "initialize with a :filename" do
|
62
84
|
it "should call adapter with :file" do
|
63
85
|
mock.proxy( Yell::Adapters::File ).new( :filename => 'test.log' )
|
@@ -103,36 +125,39 @@ describe Yell::Logger do
|
|
103
125
|
end
|
104
126
|
|
105
127
|
context "initialize with a block" do
|
106
|
-
let(
|
107
|
-
let(
|
128
|
+
let(:level) { Yell::Level.new :error }
|
129
|
+
let(:stdout) { Yell::Adapters::Stdout.new }
|
130
|
+
let(:adapters) { loggr.instance_variable_get(:@adapters) }
|
108
131
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
l.adapter adapter
|
132
|
+
context "with arity" do
|
133
|
+
subject do
|
134
|
+
Yell::Logger.new(:level => level) { |l| l.adapter(:stdout) }
|
113
135
|
end
|
114
|
-
end
|
115
136
|
|
116
|
-
|
117
|
-
|
137
|
+
its(:level) { should == level }
|
138
|
+
its('adapters.size') { should == 1 }
|
139
|
+
its('adapters.first') { should be_instance_of(Yell::Adapters::Stdout) }
|
118
140
|
end
|
119
141
|
|
120
|
-
|
121
|
-
|
142
|
+
context "without arity" do
|
143
|
+
subject do
|
144
|
+
Yell::Logger.new(:level => level) { adapter(:stdout) }
|
145
|
+
end
|
122
146
|
|
123
|
-
|
124
|
-
adapters.
|
147
|
+
its(:level) { should == level }
|
148
|
+
its('adapters.size') { should == 1 }
|
149
|
+
its('adapters.first') { should be_instance_of(Yell::Adapters::Stdout) }
|
125
150
|
end
|
126
151
|
end
|
127
152
|
|
128
153
|
context "initialize with :adapters option" do
|
129
|
-
let(
|
154
|
+
let(:logger) do
|
130
155
|
Yell::Logger.new :adapters => [ :stdout, { :stderr => {:level => :error} } ]
|
131
156
|
end
|
132
157
|
|
133
|
-
let(
|
134
|
-
let(
|
135
|
-
let(
|
158
|
+
let(:adapters) { logger.instance_variable_get :@adapters }
|
159
|
+
let(:stdout) { adapters.first }
|
160
|
+
let(:stderr) { adapters.last }
|
136
161
|
|
137
162
|
it "should define those adapters" do
|
138
163
|
adapters.size.should == 2
|
@@ -149,24 +174,24 @@ describe Yell::Logger do
|
|
149
174
|
end
|
150
175
|
|
151
176
|
context "caller's :file, :line and :method" do
|
152
|
-
let(
|
153
|
-
let(
|
177
|
+
let(:stdout) { Yell::Adapters::Stdout.new(:format => "%F, %n: %M") }
|
178
|
+
let(:logger) { Yell::Logger.new(:trace => true) { |l| l.adapter(stdout) } }
|
154
179
|
|
155
180
|
it "should write correctly" do
|
156
181
|
factory = LoggerFactory.new
|
157
182
|
factory.logger = logger
|
158
183
|
|
159
|
-
mock(
|
160
|
-
mock(
|
184
|
+
mock( stdout.send(:stream) ).syswrite( "#{__FILE__}, 7: foo\n" )
|
185
|
+
mock( stdout.send(:stream) ).syswrite( "#{__FILE__}, 11: bar\n" )
|
161
186
|
|
162
187
|
factory.foo
|
163
188
|
factory.bar
|
164
189
|
end
|
165
190
|
end
|
166
191
|
|
167
|
-
context "logging" do
|
168
|
-
let(
|
169
|
-
let(
|
192
|
+
context "logging in general" do
|
193
|
+
let(:logger) { Yell::Logger.new(filename, :format => "%m") }
|
194
|
+
let(:line) { File.open(filename, &:readline) }
|
170
195
|
|
171
196
|
it "should output a single message" do
|
172
197
|
logger.info "Hello World"
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Yell::Repository do
|
4
|
-
let(
|
5
|
-
let(
|
4
|
+
let(:name) { 'test' }
|
5
|
+
let(:logger) { Yell.new :stdout }
|
6
6
|
|
7
7
|
subject { Yell::Repository[name] }
|
8
8
|
|
@@ -56,8 +56,8 @@ describe Yell::Repository do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
context "[]= with a named logger of other name" do
|
59
|
-
let(
|
60
|
-
let(
|
59
|
+
let(:other) { 'other' }
|
60
|
+
let(:logger) { Yell.new :stdout, :name => other }
|
61
61
|
|
62
62
|
before do
|
63
63
|
Yell::Repository[ name ] = logger
|
@@ -70,7 +70,7 @@ describe Yell::Repository do
|
|
70
70
|
end
|
71
71
|
|
72
72
|
context "loggers" do
|
73
|
-
let(
|
73
|
+
let(:loggers) { { name => logger } }
|
74
74
|
|
75
75
|
subject { Yell::Repository.loggers }
|
76
76
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yell
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-02-20 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Yell - Your Extensible Logging Library. Define multiple adapters, various
|
15
15
|
log level combinations or message formatting options like you've never done before
|
@@ -89,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
89
89
|
version: '0'
|
90
90
|
requirements: []
|
91
91
|
rubyforge_project: yell
|
92
|
-
rubygems_version: 1.8.
|
92
|
+
rubygems_version: 1.8.25
|
93
93
|
signing_key:
|
94
94
|
specification_version: 3
|
95
95
|
summary: Yell - Your Extensible Logging Library
|