yell 1.4.0 → 2.2.2

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -2
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +16 -13
  5. data/Gemfile +15 -8
  6. data/LICENSE.txt +1 -1
  7. data/README.md +10 -3
  8. data/Rakefile +1 -3
  9. data/examples/002.1-log-level-basics.rb +2 -2
  10. data/examples/002.2-log-level-on-certain-severities-only.rb +5 -4
  11. data/examples/002.3-log-level-within-range.rb +7 -5
  12. data/examples/003.1-formatting-DefaultFormat.rb +3 -3
  13. data/examples/003.2-formatting-BasicFormat.rb +3 -3
  14. data/examples/003.3-formatting-ExtendedFormat.rb +3 -3
  15. data/examples/003.4-formatting-on-your-own.rb +3 -3
  16. data/examples/004.1-colorizing-the-log-output.rb +3 -3
  17. data/examples/005.1-repository.rb +3 -3
  18. data/examples/006.1-the-loggable-module.rb +2 -2
  19. data/examples/006.2-the-loggable-module-with-inheritance.rb +2 -2
  20. data/lib/core_ext/logger.rb +17 -0
  21. data/lib/yell/adapters/base.rb +17 -22
  22. data/lib/yell/adapters/datefile.rb +23 -22
  23. data/lib/yell/adapters/file.rb +3 -7
  24. data/lib/yell/adapters/io.rb +9 -15
  25. data/lib/yell/adapters/streams.rb +0 -5
  26. data/lib/yell/adapters.rb +41 -10
  27. data/lib/yell/configuration.rb +2 -4
  28. data/lib/yell/event.rb +46 -10
  29. data/lib/yell/formatter.rb +134 -54
  30. data/lib/yell/helpers/{adapters.rb → adapter.rb} +7 -17
  31. data/lib/yell/helpers/base.rb +0 -1
  32. data/lib/yell/helpers/formatter.rb +8 -8
  33. data/lib/yell/helpers/level.rb +7 -4
  34. data/lib/yell/helpers/silencer.rb +3 -5
  35. data/lib/yell/helpers/tracer.rb +6 -7
  36. data/lib/yell/level.rb +19 -16
  37. data/lib/yell/loggable.rb +11 -7
  38. data/lib/yell/logger.rb +47 -68
  39. data/lib/yell/repository.rb +3 -5
  40. data/lib/yell/silencer.rb +30 -14
  41. data/lib/yell/version.rb +1 -4
  42. data/lib/yell.rb +29 -11
  43. data/yell.gemspec +22 -15
  44. metadata +19 -50
  45. data/spec/fixtures/yell.yml +0 -7
  46. data/spec/spec_helper.rb +0 -50
  47. data/spec/threaded/yell_spec.rb +0 -100
  48. data/spec/yell/adapters/base_spec.rb +0 -43
  49. data/spec/yell/adapters/datefile_spec.rb +0 -168
  50. data/spec/yell/adapters/file_spec.rb +0 -75
  51. data/spec/yell/adapters/io_spec.rb +0 -72
  52. data/spec/yell/adapters/streams_spec.rb +0 -26
  53. data/spec/yell/adapters_spec.rb +0 -45
  54. data/spec/yell/configuration_spec.rb +0 -36
  55. data/spec/yell/event_spec.rb +0 -97
  56. data/spec/yell/formatter_spec.rb +0 -136
  57. data/spec/yell/level_spec.rb +0 -200
  58. data/spec/yell/loggable_spec.rb +0 -20
  59. data/spec/yell/logger_spec.rb +0 -263
  60. data/spec/yell/repository_spec.rb +0 -70
  61. data/spec/yell/silencer_spec.rb +0 -49
  62. data/spec/yell_spec.rb +0 -102
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  module Yell #:nodoc:
3
2
  module Helpers #:nodoc:
4
3
  module Level
@@ -10,18 +9,22 @@ module Yell #:nodoc:
10
9
  #
11
10
  # @param [String, Symbol, Integer] severity The minimum log level
12
11
  def level=( severity )
13
- @level.set(severity)
12
+ @__level__ = case severity
13
+ when Yell::Level then severity
14
+ else Yell::Level.new(severity)
15
+ end
14
16
  end
15
17
 
16
18
  # @private
17
19
  def level
18
- @level
20
+ @__level__
19
21
  end
20
22
 
23
+
21
24
  private
22
25
 
23
26
  def reset!
24
- @level = Yell::Level.new
27
+ @__level__ = Yell::Level.new
25
28
 
26
29
  super
27
30
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  module Yell #:nodoc:
3
2
  module Helpers #:nodoc:
4
3
  module Silencer
@@ -8,22 +7,21 @@ module Yell #:nodoc:
8
7
  silencer.add(*patterns)
9
8
  end
10
9
 
11
- # @private
12
10
  def silencer
13
- @silencer
11
+ @__silencer__
14
12
  end
15
13
 
16
14
 
17
15
  private
18
16
 
19
17
  def reset!
20
- @silencer = Yell::Silencer.new
18
+ @__silencer__ = Yell::Silencer.new
21
19
 
22
20
  super
23
21
  end
24
22
 
25
23
  def silence!( *messages )
26
- silencer.silence!(*messages) if silencer.silence?
24
+ @__silencer__.silence!(*messages) if silencer.silence?
27
25
  end
28
26
 
29
27
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  module Yell #:nodoc:
3
2
  module Helpers #:nodoc:
4
3
  module Tracer #:nodoc:
@@ -18,22 +17,22 @@ module Yell #:nodoc:
18
17
  #
19
18
  # @return [Yell::Level] a level representation of the tracer
20
19
  def trace=( severity )
21
- case severity
22
- when false then @tracer.set("gt.#{Yell::Severities.last}")
23
- else @tracer.set(severity)
20
+ @__trace__ = case severity
21
+ when Yell::Level then severity
22
+ when false then Yell::Level.new("gt.#{Yell::Severities.last}")
23
+ else Yell::Level.new(severity)
24
24
  end
25
25
  end
26
26
 
27
- # @private
28
27
  def trace
29
- @tracer
28
+ @__trace__
30
29
  end
31
30
 
32
31
 
33
32
  private
34
33
 
35
34
  def reset!
36
- @tracer = Yell::Level.new
35
+ @__trace__ = Yell::Level.new('gte.error')
37
36
 
38
37
  super
39
38
  end
data/lib/yell/level.rb CHANGED
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Yell #:nodoc:
4
2
 
5
3
  # The +Level+ class handles the severities for you in order to determine
@@ -23,6 +21,7 @@ module Yell #:nodoc:
23
21
  # @example Set at :info only
24
22
  # Yell::Level.new.at(:info)
25
23
  class Level
24
+ include Comparable
26
25
 
27
26
  InterpretRegexp = /(at|gt|gte|lt|lte)?\.?(#{Yell::Severities.join('|')})/i
28
27
 
@@ -42,7 +41,8 @@ module Yell #:nodoc:
42
41
  #
43
42
  # @param [Integer,String,Symbol,Array,Range,nil] severity The severity for the level.
44
43
  def initialize( *severities )
45
- set( *severities )
44
+ @tainted = false
45
+ set(*severities)
46
46
  end
47
47
 
48
48
  # Set the severity to the given format
@@ -51,10 +51,10 @@ module Yell #:nodoc:
51
51
  severity = severities.length > 1 ? severities : severities.first
52
52
 
53
53
  case severity
54
- when Array then at( *severity )
55
- when Range then gte( severity.first ).lte( severity.last )
56
- when Integer, Symbol then gte( severity )
57
- when String then interpret( severity )
54
+ when Array then at(*severity)
55
+ when Range then gte(severity.first).lte(severity.last)
56
+ when String then interpret(severity)
57
+ when Integer, Symbol then gte(severity)
58
58
  when Yell::Level then @severities = severity.severities
59
59
  end
60
60
  end
@@ -67,7 +67,7 @@ module Yell #:nodoc:
67
67
  #
68
68
  # @return [Boolean] tru or false
69
69
  def at?( severity )
70
- index = index_from( severity )
70
+ index = index_from(severity)
71
71
 
72
72
  index.nil? ? false : @severities[index]
73
73
  end
@@ -146,8 +146,12 @@ module Yell #:nodoc:
146
146
 
147
147
  # @private
148
148
  def ==(other)
149
- return super unless other.respond_to?(:severities)
150
- severities == other.severities
149
+ other.respond_to?(:severities) ? severities == other.severities : super
150
+ end
151
+
152
+ # @private
153
+ def <=>( other )
154
+ other.is_a?(Numeric) ? to_i <=> other : super
151
155
  end
152
156
 
153
157
 
@@ -162,7 +166,7 @@ module Yell #:nodoc:
162
166
  end
163
167
 
164
168
  def calculate!( modifier, severity )
165
- index = index_from( severity )
169
+ index = index_from(severity)
166
170
  return if index.nil?
167
171
 
168
172
  case modifier
@@ -173,14 +177,13 @@ module Yell #:nodoc:
173
177
  else set!( index ) # :==
174
178
  end
175
179
 
176
- taint unless tainted?
180
+ @tainted = true unless @tainted
177
181
  end
178
182
 
179
183
  def index_from( severity )
180
184
  case severity
181
- when Integer then severity
182
- when String, Symbol then Yell::Severities.index( severity.to_s.upcase )
183
- else nil
185
+ when String, Symbol then Yell::Severities.index(severity.to_s.upcase)
186
+ else Integer(severity)
184
187
  end
185
188
  end
186
189
 
@@ -201,7 +204,7 @@ module Yell #:nodoc:
201
204
  end
202
205
 
203
206
  def set!( index, val = true )
204
- @severities.map! { false } unless tainted?
207
+ @severities.map! { false } unless @tainted
205
208
 
206
209
  @severities[index] = val
207
210
  end
data/lib/yell/loggable.rb CHANGED
@@ -1,7 +1,4 @@
1
- # encoding: utf-8
2
-
3
1
  module Yell #:nodoc:
4
-
5
2
  # Include this module to add a logger to any class.
6
3
  #
7
4
  # When including this module, your class will have a :logger instance method
@@ -9,7 +6,7 @@ module Yell #:nodoc:
9
6
  # provide it with the name of your class.
10
7
  #
11
8
  # @example
12
- # Yell.new :stdout, :name => 'Foo'
9
+ # Yell.new :stdout, name: 'Foo'
13
10
  #
14
11
  # class Foo
15
12
  # include Yell::Loggable
@@ -17,11 +14,18 @@ module Yell #:nodoc:
17
14
  #
18
15
  # Foo.new.logger.info "Hello World"
19
16
  module Loggable
17
+ def self.included(base)
18
+ base.extend(ClassMethods)
19
+ end
20
20
 
21
- def logger
22
- Yell[ self.class ]
21
+ module ClassMethods
22
+ def logger
23
+ Yell[self]
24
+ end
23
25
  end
24
26
 
27
+ def logger
28
+ self.class.logger
29
+ end
25
30
  end
26
31
  end
27
-
data/lib/yell/logger.rb CHANGED
@@ -1,44 +1,15 @@
1
- # encoding: utf-8
2
-
3
1
  require 'pathname'
4
2
 
5
- # TODO: DSL improvements
6
- #
7
- # Initlalize an empty logger
8
- # logger = Yell.new(adapters: false)
9
- # logger.adapters.add :stdout
10
- #
11
- # Or shorthand for adapters.add
12
- # logger.add :stdout
13
- #
14
- # Or with a block
15
- # logger = Yell.new do |l|
16
- # l.add :stdout
17
- # l.add :stderr
18
- # end
19
- #
20
- # logger = Yell.new do |l|
21
- # l.adapters.add :stdout
22
- # l.adapters.add :stderr
23
- # end
24
- #
25
- #
26
- # Define Silencers
27
- # logger = Yell.new do |l|
28
- # l.silence /password/
29
- # end
30
- #
31
3
  module Yell #:nodoc:
32
-
33
4
  # The +Yell::Logger+ is your entrypoint. Anything onwards is derived from here.
34
5
  #
35
- # A +Yell::Logger+ instance holds all your adapters and sends the log events
6
+ # A +Yell::Logger+ instance holds all your adapters and sends the log events
36
7
  # to them if applicable. There are multiple ways of how to create a new logger.
37
8
  class Logger
38
9
  include Yell::Helpers::Base
39
10
  include Yell::Helpers::Level
40
11
  include Yell::Helpers::Formatter
41
- include Yell::Helpers::Adapters
12
+ include Yell::Helpers::Adapter
42
13
  include Yell::Helpers::Tracer
43
14
  include Yell::Helpers::Silencer
44
15
 
@@ -55,38 +26,40 @@ module Yell #:nodoc:
55
26
  # Yell::Logger.new :datefile, 'development.log'
56
27
  #
57
28
  # @example Setting the log level
58
- # Yell::Logger.new :level => :warn
29
+ # Yell::Logger.new level: :warn
59
30
  #
60
31
  # Yell::Logger.new do |l|
61
32
  # l.level = :warn
62
33
  # end
63
34
  #
64
35
  # @example Combined settings
65
- # Yell::Logger.new 'development.log', :level => :warn
36
+ # Yell::Logger.new 'development.log', level: :warn
66
37
  #
67
38
  # Yell::Logger.new :datefile, 'development.log' do |l|
68
39
  # l.level = :info
69
40
  # end
70
41
  def initialize( *args, &block )
71
- reset!
72
-
73
42
  # extract options
74
43
  @options = args.last.is_a?(Hash) ? args.pop : {}
75
44
 
76
- # adapters may be passed in the options
77
- extract!(@options)
78
-
79
45
  # check if filename was given as argument and put it into the @options
80
46
  if [String, Pathname].include?(args.last.class)
81
47
  @options[:filename] = args.pop unless @options[:filename]
82
48
  end
83
49
 
84
- self.level = @options.fetch(:level, 0) # debug by defauly
85
- self.name = @options.fetch(:name, nil) # no name by default
86
- self.trace = @options.fetch(:trace, :error) # trace from :error level onwards
50
+ reset!
51
+
52
+ # FIXME: :format is deprecated in future versions --R
53
+ self.formatter = Yell.__fetch__(@options, :format, :formatter)
54
+ self.level = Yell.__fetch__(@options, :level, :default => 0)
55
+ self.name = Yell.__fetch__(@options, :name)
56
+ self.trace = Yell.__fetch__(@options, :trace, default: :error)
87
57
 
88
58
  # silencer
89
- self.silence(*@options[:silence])
59
+ self.silence(*Yell.__fetch__(@options, :silence, default: []))
60
+
61
+ # adapters may be passed in the options
62
+ extract!(*Yell.__fetch__(@options, :adapters, default: []))
90
63
 
91
64
  # extract adapter
92
65
  self.adapter(args.pop) if args.any?
@@ -104,12 +77,25 @@ module Yell #:nodoc:
104
77
  #
105
78
  # @return [String] The logger's name
106
79
  def name=( val )
107
- @name = val
108
- Yell::Repository[@name] = self if @name
80
+ Yell::Repository[val] = self if val
81
+ @name = val.nil? ? "<#{self.class.name}##{object_id}>": val
109
82
 
110
83
  @name
111
84
  end
112
85
 
86
+ # Somewhat backwards compatible method (not fully though)
87
+ def add( options, *messages, &block )
88
+ return false unless level.at?(options)
89
+
90
+ messages = messages
91
+ messages << block.call unless block.nil?
92
+ messages = silencer.call(*messages)
93
+ return false if messages.empty?
94
+
95
+ event = Yell::Event.new(self, options, *messages)
96
+ write(event)
97
+ end
98
+
113
99
  # Creates instance methods for every log level:
114
100
  # `debug` and `debug?`
115
101
  # `info` and `info?`
@@ -119,18 +105,12 @@ module Yell #:nodoc:
119
105
  Yell::Severities.each_with_index do |s, index|
120
106
  name = s.downcase
121
107
 
122
- class_eval <<-EOS, __FILE__, __LINE__
108
+ class_eval <<-EOS, __FILE__, __LINE__ + index
123
109
  def #{name}?; level.at?(#{index}); end # def info?; level.at?(1); end
124
110
  #
125
111
  def #{name}( *m, &b ) # def info( *m, &b )
126
- return false unless #{name}? # return false unless info?
127
- #
128
- m = silencer.silence(*m) if silencer.silence? # m = silencer.silence(*m) if silencer.silence?
129
- return false if m.empty? # return false if m.empty?
130
- #
131
- event = Yell::Event.new(self, #{index}, *m, &b) # event = Yell::Event.new(self, 1, *m, &b)
132
- write(event) # write(event)
133
- true # true
112
+ options = Yell::Event::Options.new(#{index}, 1)
113
+ add(options, *m, &b) # add(Yell::Event::Options.new(1, 1), *m, &b)
134
114
  end # end
135
115
  EOS
136
116
  end
@@ -138,14 +118,18 @@ module Yell #:nodoc:
138
118
  # Get a pretty string representation of the logger.
139
119
  def inspect
140
120
  inspection = inspectables.map { |m| "#{m}: #{send(m).inspect}" }
141
- "#<#{self.class.name} #{inspection * ', '}, adapters: #{adapters.map(&:inspect) * ', '}>"
121
+ "#<#{self.class.name} #{inspection * ', '}>"
142
122
  end
143
123
 
144
124
  # @private
145
125
  def close
146
- @adapters.each(&:close)
126
+ adapters.close
147
127
  end
148
128
 
129
+ # @private
130
+ def write( event )
131
+ adapters.write(event)
132
+ end
149
133
 
150
134
  private
151
135
 
@@ -153,29 +137,24 @@ module Yell #:nodoc:
153
137
  # multiple variations:
154
138
  #
155
139
  # @example
156
- # options = { :adapters => [:stdout, :stderr] }
140
+ # extract!(:stdout, :stderr)
157
141
  #
158
142
  # @example
159
- # options = { :adapters => [:stdout => {:level => :info}, :stderr => {:level => :error}]
160
- def extract!( opts )
161
- ( opts.delete(:adapters) || [] ).each do |a|
162
- case a
163
- when String, Symbol then adapter( a )
164
- else a.each { |n, o| adapter( n, o || {} ) }
143
+ # extract!(stdout: {level: :info}, stderr: {level: :error})
144
+ def extract!( *list )
145
+ list.each do |a|
146
+ if a.is_a?(Hash)
147
+ a.each { |t, o| adapter(t, o) }
148
+ else
149
+ adapter(a)
165
150
  end
166
151
  end
167
152
  end
168
153
 
169
- # Cycles all the adapters and writes the message
170
- def write( event )
171
- adapters.each { |a| a.write(event) }
172
- end
173
-
174
154
  # Get an array of inspected attributes for the adapter.
175
155
  def inspectables
176
156
  [:name] | super
177
157
  end
178
-
179
158
  end
180
159
  end
181
160
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'monitor'
4
2
  require "singleton"
5
3
 
@@ -35,7 +33,7 @@ module Yell #:nodoc:
35
33
  # @raise [Yell::LoggerNotFound] Raised when repository does not have that key
36
34
  # @return [Yell::Logger] The logger instance
37
35
  def self.[]( name )
38
- synchronize { instance.fetch(name) or raise Yell::LoggerNotFound.new(name) }
36
+ synchronize { instance.__fetch__(name) or raise Yell::LoggerNotFound.new(name) }
39
37
  end
40
38
 
41
39
  # Get the list of all loggers in the repository
@@ -57,11 +55,11 @@ module Yell #:nodoc:
57
55
  # If the logger could not be found and has a superclass, it
58
56
  # will attempt to look there. This is important for the
59
57
  # Yell::Loggable module.
60
- def fetch( name )
58
+ def __fetch__( name )
61
59
  logger = loggers[name] || loggers[name.to_s]
62
60
 
63
61
  if logger.nil? && name.respond_to?(:superclass)
64
- return fetch(name.superclass)
62
+ return __fetch__(name.superclass)
65
63
  end
66
64
 
67
65
  logger
data/lib/yell/silencer.rb CHANGED
@@ -1,9 +1,17 @@
1
- # encoding: utf-8
2
1
  module Yell #:nodoc:
3
2
 
4
3
  # The +Yell::Silencer+ is your handly helper for stiping out unwanted log messages.
5
4
  class Silencer
6
5
 
6
+ class PresetNotFound < StandardError
7
+ def message; "Could not find a preset for #{super.inspect}"; end
8
+ end
9
+
10
+ Presets = {
11
+ :assets => [/\AStarted GET "\/assets/, /\AServed asset/, /\A\s*\z/] # for Rails
12
+ }
13
+
14
+
7
15
  def initialize( *patterns )
8
16
  @patterns = patterns.dup
9
17
  end
@@ -17,27 +25,24 @@ module Yell #:nodoc:
17
25
  # @example Add regular expressions
18
26
  # add( /password/ )
19
27
  #
20
- # @return [Array] All set patterns
28
+ # @return [self] The silencer instance
21
29
  def add( *patterns )
22
- @patterns = @patterns | patterns.compact
30
+ patterns.each { |pattern| add!(pattern) }
31
+
32
+ self
23
33
  end
24
34
 
25
35
  # Clears out all the messages that would match any defined pattern
26
36
  #
27
37
  # @example
28
- # silence('username', 'password')
38
+ # call(['username', 'password'])
29
39
  # #=> ['username]
30
40
  #
31
- # @return [Array<String>] The remaining messages
32
- def silence( *messages )
33
- messages.reject { |m| matches?(m) }
34
- end
41
+ # @return [Array] The remaining messages
42
+ def call( *messages )
43
+ return messages if @patterns.empty?
35
44
 
36
- # Anything to silence at all?
37
- #
38
- # @return [Boolean] true or false
39
- def silence?
40
- @patterns.any?
45
+ messages.reject { |m| matches?(m) }
41
46
  end
42
47
 
43
48
  # Get a pretty string
@@ -53,6 +58,17 @@ module Yell #:nodoc:
53
58
 
54
59
  private
55
60
 
61
+ def add!( pattern )
62
+ @patterns = @patterns | fetch(pattern)
63
+ end
64
+
65
+ def fetch( pattern )
66
+ case pattern
67
+ when Symbol then Presets[pattern] or raise PresetNotFound.new(pattern)
68
+ else [pattern]
69
+ end
70
+ end
71
+
56
72
  # Check if the provided message matches any of the defined patterns.
57
73
  #
58
74
  # @example
@@ -61,7 +77,7 @@ module Yell #:nodoc:
61
77
  #
62
78
  # @return [Boolean] true or false
63
79
  def matches?( message )
64
- @patterns.any? { |pattern| message.match(pattern) }
80
+ @patterns.any? { |pattern| message.respond_to?(:match) && message.match(pattern) }
65
81
  end
66
82
 
67
83
  end
data/lib/yell/version.rb CHANGED
@@ -1,7 +1,4 @@
1
- # encoding: utf-8
2
-
3
1
  module Yell #:nodoc:
4
- VERSION = "1.4.0"
5
-
2
+ VERSION = "2.2.2"
6
3
  end
7
4
 
data/lib/yell.rb CHANGED
@@ -1,6 +1,4 @@
1
- # encoding: utf-8
2
-
3
- # Copyright (c) 2011-2013 Rudolf Schmidt
1
+ # Copyright (c) 2011-2014 Rudolf Schmidt
4
2
  #
5
3
  # Permission is hereby granted, free of charge, to any person obtaining
6
4
  # a copy of this software and associated documentation files (the
@@ -22,7 +20,6 @@
22
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
21
 
24
22
  module Yell #:nodoc:
25
-
26
23
  # Holds all Yell severities
27
24
  Severities = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL', 'UNKNOWN'].freeze
28
25
 
@@ -60,8 +57,8 @@ module Yell #:nodoc:
60
57
  # Shortcut to Yell::Fomatter.new
61
58
  #
62
59
  # @return [Yell::Formatter] A Yell::Formatter instance
63
- def format( pattern, date_pattern = nil )
64
- Yell::Formatter.new(pattern, date_pattern)
60
+ def format( pattern = nil, date_pattern = nil, &block )
61
+ Yell::Formatter.new(pattern, date_pattern, &block)
65
62
  end
66
63
 
67
64
  # Loads a config from a YAML file
@@ -71,6 +68,11 @@ module Yell #:nodoc:
71
68
  Yell.new Yell::Configuration.load!(file)
72
69
  end
73
70
 
71
+ # Shortcut to Yell::Adapters.register
72
+ def register( name, klass )
73
+ Yell::Adapters.register(name, klass)
74
+ end
75
+
74
76
  # @private
75
77
  def env
76
78
  return ENV['YELL_ENV'] if ENV.key? 'YELL_ENV'
@@ -85,27 +87,34 @@ module Yell #:nodoc:
85
87
  end
86
88
 
87
89
  # @private
88
- def _deprecate( version, message, options = {} )
90
+ def __deprecate__( version, message, options = {} ) #:nodoc:
89
91
  messages = ["Deprecation Warning (since v#{version}): #{message}" ]
90
92
  messages << " before: #{options[:before]}" if options[:before]
91
93
  messages << " after: #{options[:after]}" if options[:after]
92
94
 
93
- _warn(*messages)
95
+ __warn__(*messages)
94
96
  end
95
97
 
96
98
  # @private
97
- def _warn( *messages )
99
+ def __warn__( *messages ) #:nodoc:
98
100
  $stderr.puts "[Yell] " + messages.join("\n")
99
101
  rescue Exception => e
100
102
  # do nothing
101
103
  end
102
- end
103
104
 
105
+ # @private
106
+ def __fetch__( hash, *args )
107
+ options = args.last.is_a?(Hash) ? args.pop : {}
108
+ value = args.map { |key| hash.fetch(key.to_sym, hash[key.to_s]) }.compact.first
109
+
110
+ value.nil? ? options[:default] : value
111
+ end
112
+ end
104
113
  end
105
114
 
106
115
  # helpers
107
116
  require File.dirname(__FILE__) + '/yell/helpers/base'
108
- require File.dirname(__FILE__) + '/yell/helpers/adapters'
117
+ require File.dirname(__FILE__) + '/yell/helpers/adapter'
109
118
  require File.dirname(__FILE__) + '/yell/helpers/formatter'
110
119
  require File.dirname(__FILE__) + '/yell/helpers/level'
111
120
  require File.dirname(__FILE__) + '/yell/helpers/tracer'
@@ -124,3 +133,12 @@ require File.dirname(__FILE__) + '/yell/logger'
124
133
  # modules
125
134
  require File.dirname(__FILE__) + '/yell/loggable'
126
135
 
136
+ # core extensions
137
+ require File.dirname(__FILE__) + '/core_ext/logger'
138
+
139
+ # register known adapters
140
+ Yell.register :null, Yell::Adapters::Base # adapter that does nothing (for convenience only)
141
+ Yell.register :file, Yell::Adapters::File
142
+ Yell.register :datefile, Yell::Adapters::Datefile
143
+ Yell.register :stdout, Yell::Adapters::Stdout
144
+ Yell.register :stderr, Yell::Adapters::Stderr