yell 1.4.0 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
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,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Yell #:nodoc:
4
2
  module Adapters #:nodoc:
5
3
 
@@ -11,14 +9,14 @@ module Yell #:nodoc:
11
9
 
12
10
  # @overload setup!( options )
13
11
  def setup!( options )
14
- @filename = ::File.expand_path options.fetch(:filename, default_filename)
12
+ @filename = ::File.expand_path(Yell.__fetch__(options, :filename, default: default_filename))
15
13
 
16
14
  super
17
15
  end
18
16
 
19
17
  # @overload open!
20
18
  def open!
21
- @stream = ::File.open( @filename, ::File::WRONLY|::File::APPEND|::File::CREAT )
19
+ @stream = ::File.open(@filename, ::File::WRONLY|::File::APPEND|::File::CREAT)
22
20
 
23
21
  super
24
22
  end
@@ -26,13 +24,11 @@ module Yell #:nodoc:
26
24
  def default_filename #:nodoc:
27
25
  logdir = ::File.expand_path("log")
28
26
 
29
- ::File.expand_path ::File.directory?(logdir) ? "#{logdir}/#{Yell.env}.log" : "#{Yell.env}.log"
27
+ ::File.expand_path(::File.directory?(logdir) ? "#{logdir}/#{Yell.env}.log" : "#{Yell.env}.log")
30
28
  end
31
29
 
32
30
  end
33
31
 
34
- register( :file, Yell::Adapters::File )
35
-
36
32
  end
37
33
  end
38
34
 
@@ -1,8 +1,5 @@
1
- # encoding: utf-8
2
-
3
1
  module Yell #:nodoc:
4
2
  module Adapters #:nodoc:
5
-
6
3
  class Io < Yell::Adapters::Base
7
4
  include Yell::Helpers::Formatter
8
5
 
@@ -45,39 +42,38 @@ module Yell #:nodoc:
45
42
  def setup!( options )
46
43
  @stream = nil
47
44
 
48
- self.colors = options.fetch(:colors, false)
49
- self.format = options.fetch(:format, nil)
50
- self.sync = options.fetch(:sync, true)
45
+ self.colors = Yell.__fetch__(options, :colors, default: false)
46
+ self.formatter = Yell.__fetch__(options, :format, :formatter)
47
+ self.sync = Yell.__fetch__(options, :sync, default: true)
51
48
 
52
49
  super
53
50
  end
54
51
 
55
52
  # @overload write!( event )
56
53
  def write!( event )
57
- message = format.format(event)
54
+ message = formatter.call(event)
58
55
 
59
56
  # colorize if applicable
60
57
  if colors and color = TTYColors[event.level]
61
58
  message = color + message + TTYColors[-1]
62
59
  end
63
60
 
64
- message << "\n" unless message[-1] == ?\n
65
- stream.syswrite( message )
61
+ stream.syswrite(message)
66
62
 
67
63
  super
68
64
  end
69
65
 
70
66
  # @overload open!
71
67
  def open!
72
- @stream.sync = self.sync if @stream.respond_to? :sync
73
- @stream.flush if @stream.respond_to? :flush
68
+ @stream.sync = self.sync if @stream.respond_to?(:sync)
69
+ @stream.flush if @stream.respond_to?(:flush)
74
70
 
75
71
  super
76
72
  end
77
73
 
78
74
  # @overload close!
79
75
  def close!
80
- @stream.close if @stream.respond_to? :close
76
+ @stream.close if @stream.respond_to?(:close)
81
77
  @stream = nil
82
78
 
83
79
  super
@@ -93,11 +89,9 @@ module Yell #:nodoc:
93
89
 
94
90
  # @overload inspectables
95
91
  def inspectables
96
- super.concat [:format, :colors, :sync]
92
+ super.concat [:formatter, :colors, :sync]
97
93
  end
98
-
99
94
  end
100
-
101
95
  end
102
96
  end
103
97
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Yell #:nodoc:
4
2
  module Adapters #:nodoc:
5
3
 
@@ -27,9 +25,6 @@ module Yell #:nodoc:
27
25
 
28
26
  end
29
27
 
30
- register( :stdout, Yell::Adapters::Stdout )
31
- register( :stderr, Yell::Adapters::Stderr )
32
-
33
28
  end
34
29
  end
35
30
 
data/lib/yell/adapters.rb CHANGED
@@ -1,6 +1,4 @@
1
- # encoding: utf-8
2
1
  module Yell #:nodoc:
3
-
4
2
  # AdapterNotFound is raised whenever you want to instantiate an
5
3
  # adapter that does not exist.
6
4
  class AdapterNotFound < StandardError; end
@@ -9,6 +7,41 @@ module Yell #:nodoc:
9
7
  # the logger. You should not have to call the corresponding classes
10
8
  # directly.
11
9
  module Adapters
10
+ class Collection
11
+ def initialize( options = {} )
12
+ @options = options
13
+ @collection = []
14
+ end
15
+
16
+ def add( type = :file, *args, &block )
17
+ options = [@options, *args].inject(Hash.new) do |h, c|
18
+ h.merge( [String, Pathname].include?(c.class) ? {:filename => c} : c )
19
+ end
20
+
21
+ # remove possible :null adapters
22
+ @collection.shift if @collection.first.instance_of?(Yell::Adapters::Base)
23
+
24
+ new_adapter = Yell::Adapters.new(type, options, &block)
25
+ @collection.push(new_adapter)
26
+
27
+ new_adapter
28
+ end
29
+
30
+ def empty?
31
+ @collection.empty?
32
+ end
33
+
34
+ # @private
35
+ def write( event )
36
+ @collection.each { |c| c.write(event) }
37
+ true
38
+ end
39
+
40
+ # @private
41
+ def close
42
+ @collection.each { |c| c.close }
43
+ end
44
+ end
12
45
 
13
46
  # holds the list of known adapters
14
47
  @adapters = {}
@@ -18,27 +51,25 @@ module Yell #:nodoc:
18
51
  # @example
19
52
  # Yell::Adapters.register( :myadapter, MyAdapter )
20
53
  def self.register( name, klass )
21
- @adapters[name] = klass
54
+ @adapters[name.to_sym] = klass
22
55
  end
23
56
 
24
57
  # Returns an instance of the given processor type.
25
58
  #
26
59
  # @example A simple file adapter
27
60
  # Yell::Adapters.new( :file )
28
- def self.new( name, options = {}, &block )
29
- return name if name.is_a?(Yell::Adapters::Base)
61
+ def self.new( type, options = {}, &block )
62
+ return type if type.is_a?(Yell::Adapters::Base)
30
63
 
31
- adapter = case name
64
+ adapter = case type
32
65
  when STDOUT then @adapters[:stdout]
33
66
  when STDERR then @adapters[:stderr]
34
- else @adapters[name]
67
+ else @adapters[type.to_sym]
35
68
  end
36
69
 
37
- raise AdapterNotFound.new(name) if adapter.nil?
38
-
70
+ raise AdapterNotFound.new(type) if adapter.nil?
39
71
  adapter.new(options, &block)
40
72
  end
41
-
42
73
  end
43
74
  end
44
75
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'erb'
4
2
  require 'yaml'
5
3
 
@@ -13,8 +11,8 @@ module Yell #:nodoc:
13
11
  yaml = YAML.load( ERB.new(File.read(file)).result )
14
12
 
15
13
  # in case we have ActiveSupport
16
- if yaml.respond_to?(:with_indifference_access)
17
- yaml = yaml.with_indifferent_access
14
+ if defined?(ActiveSupport::HashWithIndifferentAccess)
15
+ yaml = ActiveSupport::HashWithIndifferentAccess.new(yaml)
18
16
  end
19
17
 
20
18
  yaml[Yell.env] || {}
data/lib/yell/event.rb CHANGED
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  require 'time'
4
2
  require 'socket'
5
3
 
@@ -14,6 +12,26 @@ module Yell #:nodoc:
14
12
  # jruby and rubinius seem to have a different caller
15
13
  CallerIndex = defined?(RUBY_ENGINE) && ["rbx", "jruby"].include?(RUBY_ENGINE) ? 1 : 2
16
14
 
15
+
16
+ class Options
17
+ include Comparable
18
+
19
+ attr_reader :severity
20
+ attr_reader :caller_offset
21
+
22
+ def initialize( severity, caller_offset )
23
+ @severity = severity
24
+ @caller_offset = caller_offset
25
+ end
26
+
27
+ def <=>( other )
28
+ @severity <=> other
29
+ end
30
+
31
+ alias :to_i :severity
32
+ alias :to_int :severity
33
+ end
34
+
17
35
  # Prefetch those values (no need to do that on every new instance)
18
36
  @@hostname = Socket.gethostname rescue nil
19
37
  @@progname = $0
@@ -21,23 +39,27 @@ module Yell #:nodoc:
21
39
  # Accessor to the log level
22
40
  attr_reader :level
23
41
 
24
- # Accessor to the log messages
42
+ # Accessor to the log message
25
43
  attr_reader :messages
26
44
 
27
45
  # Accessor to the time the log event occured
28
46
  attr_reader :time
29
47
 
48
+ # Accessor to the logger's name
49
+ attr_reader :name
50
+
51
+
52
+ def initialize( logger, options, *messages)
53
+ @time = Time.now
54
+ @name = logger.name
30
55
 
31
- def initialize(logger, level, *messages, &block)
32
- @time = Time.now
33
- @level = level
56
+ extract!(options)
34
57
 
35
58
  @messages = messages
36
- @messages << block.call if block
37
59
 
38
- @caller = logger.trace.at?(level) ? caller[CallerIndex].to_s : ''
39
- @file = nil
40
- @line = nil
60
+ @caller = logger.trace.at?(level) ? caller[caller_index].to_s : ''
61
+ @file = nil
62
+ @line = nil
41
63
  @method = nil
42
64
 
43
65
  @pid = nil
@@ -81,6 +103,20 @@ module Yell #:nodoc:
81
103
 
82
104
  private
83
105
 
106
+ def extract!( options )
107
+ if options.is_a?(Yell::Event::Options)
108
+ @level = options.severity
109
+ @caller_offset = options.caller_offset
110
+ else
111
+ @level = options
112
+ @caller_offset = 0
113
+ end
114
+ end
115
+
116
+ def caller_index
117
+ CallerIndex + @caller_offset
118
+ end
119
+
84
120
  def backtrace!
85
121
  if m = CallerRegexp.match(@caller)
86
122
  @file, @line, @method = m[1..-1]
@@ -1,12 +1,19 @@
1
- # encoding: utf-8
2
1
  require 'time'
3
2
 
3
+ # TODO: Register custom formats
4
+ #
5
+ # @example The Yell default fomat
6
+ # Yell::Formatter.register(:default)
7
+ #
8
+ # @example The Ruby standard logger format
9
+ # Yell::Formatter.register(:stdlogger, "%l, [%d #%p] %5L -- : %m", "%Y-%m-%dT%H:%M:%S.%6N")
10
+ #
4
11
  module Yell #:nodoc:
5
12
 
6
13
  # No format on the log message
7
14
  #
8
15
  # @example
9
- # logger = Yell.new STDOUT, :format => false
16
+ # logger = Yell.new STDOUT, format: false
10
17
  # logger.info "Hello World!"
11
18
  # #=> "Hello World!"
12
19
  NoFormat = "%m"
@@ -14,7 +21,7 @@ module Yell #:nodoc:
14
21
  # Default Format
15
22
  #
16
23
  # @example
17
- # logger = Yell.new STDOUT, :format => Yell::DefaultFormat
24
+ # logger = Yell.new STDOUT, format: Yell::DefaultFormat
18
25
  # logger.info "Hello World!"
19
26
  # #=> "2012-02-29T09:30:00+01:00 [ INFO] 65784 : Hello World!"
20
27
  # # ^ ^ ^ ^
@@ -24,7 +31,7 @@ module Yell #:nodoc:
24
31
  # Basic Format
25
32
  #
26
33
  # @example
27
- # logger = Yell.new STDOUT, :format => Yell::BasicFormat
34
+ # logger = Yell.new STDOUT, format: Yell::BasicFormat
28
35
  # logger.info "Hello World!"
29
36
  # #=> "I, 2012-02-29T09:30:00+01:00 : Hello World!"
30
37
  # # ^ ^ ^
@@ -35,7 +42,7 @@ module Yell #:nodoc:
35
42
  # Extended Format
36
43
  #
37
44
  # @example
38
- # logger = Yell.new STDOUT, :format => Yell::ExtendedFormat
45
+ # logger = Yell.new STDOUT, format: Yell::ExtendedFormat
39
46
  # logger.info "Hello World!"
40
47
  # #=> "2012-02-29T09:30:00+01:00 [ INFO] 65784 localhost : Hello World!"
41
48
  # # ^ ^ ^ ^ ^
@@ -47,8 +54,8 @@ module Yell #:nodoc:
47
54
  class Formatter
48
55
 
49
56
  Table = {
50
- "m" => "message(*event.messages)", # Message
51
- "l" => "level(event.level)[0,1]", # Level (short), e.g.'I', 'W'
57
+ "m" => "message(event.messages)", # Message
58
+ "l" => "level(event.level, 1)", # Level (short), e.g.'I', 'W'
52
59
  "L" => "level(event.level)", # Level, e.g. 'INFO', 'WARN'
53
60
  "d" => "date(event.time)", # ISO8601 Timestamp
54
61
  "h" => "event.hostname", # Hostname
@@ -58,23 +65,54 @@ module Yell #:nodoc:
58
65
  "F" => "event.file", # Path with filename where the logger was called
59
66
  "f" => "File.basename(event.file)", # Filename where the loger was called
60
67
  "M" => "event.method", # Method name where the logger was called
61
- "n" => "event.line" # Line where the logger was called
68
+ "n" => "event.line", # Line where the logger was called
69
+ "N" => "event.name" # Name of the logger
62
70
  }
63
71
 
64
- Matcher = /([^%]*)(%\d*)?(#{Table.keys.join('|')})?(.*)/
72
+ # For standard formatted backwards compatibility
73
+ LegacyTable = Hash[ Table.keys.map { |k| [k, 'noop'] } ].merge(
74
+ 'm' => 'message(msg)',
75
+ 'l' => 'level(event, 1)',
76
+ 'L' => 'level(event)',
77
+ 'd' => 'date(time)',
78
+ "p" => "$$",
79
+ 'P' => 'progname'
80
+ )
81
+
82
+ PatternMatcher = /([^%]*)(%\d*)?(#{Table.keys.join('|')})?(.*)/m
83
+
84
+
85
+ attr_reader :pattern, :date_pattern
65
86
 
66
87
 
67
88
  # Initializes a new +Yell::Formatter+.
68
89
  #
69
- # Upon initialization it defines a format method. `format` takes
70
- # a {Yell::Event} instance as agument in order to apply for desired log
90
+ # Upon initialization it defines a format method. `format` takes
91
+ # a {Yell::Event} instance as agument in order to apply for desired log
71
92
  # message formatting.
72
- def initialize( pattern = nil, date_pattern = nil )
73
- @pattern = pattern || Yell::DefaultFormat
74
- @date_pattern = date_pattern || :iso8601
93
+ #
94
+ # @example Blank formatter
95
+ # Formatter.new
96
+ #
97
+ # @example Formatter with a message pattern
98
+ # Formatter.new("%d [%5L] %p : %m")
99
+ #
100
+ # @example Formatter with a message and date pattern
101
+ # Formatter.new("%d [%5L] %p : %m", "%D %H:%M:%S.%L")
102
+ #
103
+ # @example Formatter with a message modifier
104
+ # Formatter.new do |f|
105
+ # f.modify(Hash) { |h| "Hash: #{h.inspect}" }
106
+ # end
107
+ def initialize( *args, &block )
108
+ builder = Builder.new(*args, &block)
109
+
110
+ @pattern = builder.pattern
111
+ @date_pattern = builder.date_pattern
112
+ @modifier = builder.modifier
75
113
 
76
114
  define_date_method!
77
- define_format_method!
115
+ define_call_method!
78
116
  end
79
117
 
80
118
  # Get a pretty string
@@ -85,75 +123,117 @@ module Yell #:nodoc:
85
123
 
86
124
  private
87
125
 
126
+ # Message modifier class to allow different modifiers for different requirements.
127
+ class Modifier
128
+ def initialize
129
+ @repository = {}
130
+ end
131
+
132
+ def set( key, &block )
133
+ @repository.merge!(key => block)
134
+ end
135
+
136
+ def call( message )
137
+ case
138
+ when mod = @repository[message.class] || @repository[message.class.to_s]
139
+ mod.call(message)
140
+ when message.is_a?(Array)
141
+ message.map { |m| call(m) }.join(" ")
142
+ when message.is_a?(Hash)
143
+ message.map { |k, v| "#{k}: #{v}" }.join(", ")
144
+ when message.is_a?(Exception)
145
+ backtrace = message.backtrace ? "\n\t#{message.backtrace.join("\n\t")}" : ""
146
+ sprintf("%s: %s%s", message.class, message.message, backtrace)
147
+ else
148
+ message
149
+ end
150
+ end
151
+ end
152
+
153
+ # Builder class to allow setters that won't be accessible once
154
+ # transferred to the Formatter
155
+ class Builder
156
+ attr_accessor :pattern, :date_pattern
157
+ attr_reader :modifier
158
+
159
+ def initialize( pattern = nil, date_pattern = nil, &block )
160
+ @modifier = Modifier.new
161
+
162
+ @pattern = case pattern
163
+ when false then Yell::NoFormat
164
+ when nil then Yell::DefaultFormat
165
+ else pattern
166
+ end.dup
167
+
168
+ @pattern << "\n" unless @pattern[-1] == ?\n # add newline if not present
169
+ @date_pattern = date_pattern || :iso8601
170
+
171
+ block.call(self) if block
172
+ end
173
+
174
+ def modify( key, &block )
175
+ modifier.set(key, &block)
176
+ end
177
+ end
178
+
88
179
  def define_date_method!
89
180
  buf = case @date_pattern
90
181
  when String then "t.strftime(@date_pattern)"
91
182
  when Symbol then respond_to?(@date_pattern, true) ? "#{@date_pattern}(t)" : "t.#{@date_pattern}"
92
- else "iso8601(t)"
183
+ else t.iso8601
93
184
  end
94
185
 
95
- instance_eval %-
96
- def date( t )
186
+ # define the method
187
+ instance_eval <<-METHOD, __FILE__, __LINE__
188
+ def date(t = Time.now)
97
189
  #{buf}
98
190
  end
99
- -
191
+ METHOD
192
+ end
193
+
194
+ # define a standard +Logger+ backwards compatible #call method for the formatter
195
+ def define_call_method!
196
+ instance_eval <<-METHOD, __FILE__, __LINE__
197
+ def call(event, time = nil, progname = nil, msg = nil)
198
+ event.is_a?(Yell::Event) ? #{to_sprintf(Table)} : #{to_sprintf(LegacyTable)}
199
+ end
200
+ METHOD
100
201
  end
101
202
 
102
- def define_format_method!
203
+ def to_sprintf( table )
103
204
  buff, args, _pattern = "", [], @pattern.dup
104
205
 
105
206
  while true
106
- match = Matcher.match(_pattern)
207
+ match = PatternMatcher.match(_pattern)
107
208
 
108
209
  buff << match[1] unless match[1].empty?
109
210
  break if match[2].nil?
110
211
 
111
212
  buff << match[2] + 's'
112
- args << Table[ match[3] ]
213
+ args << table[ match[3] ]
113
214
 
114
215
  _pattern = match[4]
115
216
  end
116
217
 
117
- instance_eval <<-EOS, __FILE__, __LINE__
118
- def format( event )
119
- sprintf("#{buff}", #{args.join(',')})
120
- end
121
- EOS
218
+ %Q{sprintf("#{buff.gsub(/"/, '\"')}", #{args.join(', ')})}
122
219
  end
123
220
 
124
- # The iso8601 implementation of the standard Time library is more than
125
- # twice as slow compared to using strftime. So, we just implement
126
- # it ourselves --R
127
- def iso8601( t )
128
- zone = if t.utc?
129
- "-00:00"
130
- else
131
- offset = t.utc_offset
132
- sign = offset < 0 ? '-' : '+'
133
- sprintf('%s%02d:%02d', sign, *(offset.abs/60).divmod(60))
221
+ def level( sev, length = nil )
222
+ severity = case sev
223
+ when Integer then Yell::Severities[sev] || 'ANY'
224
+ else sev
134
225
  end
135
226
 
136
- t.strftime("%Y-%m-%dT%H:%M:%S#{zone}")
137
- end
138
-
139
- def level( l )
140
- Yell::Severities[ l ]
227
+ length.nil? ? severity : severity[0, length]
141
228
  end
142
229
 
143
- def message( *messages )
144
- messages.map { |m| to_message(m) }.join(" ")
230
+ def message( messages )
231
+ @modifier.call(messages.is_a?(Array) && messages.size == 1 ? messages.first : messages)
145
232
  end
146
233
 
147
- def to_message( m )
148
- case m
149
- when Hash
150
- m.map { |k,v| "#{k}: #{v}" }.join( ", " )
151
- when Exception
152
- backtrace = m.backtrace ? "\n\t#{m.backtrace.join("\n\t")}" : ""
153
- sprintf("%s: %s%s", m.class, m.message, backtrace)
154
- else
155
- m
156
- end
234
+ # do nothing
235
+ def noop
236
+ ''
157
237
  end
158
238
 
159
239
  end
@@ -1,8 +1,6 @@
1
- # encoding: utf-8
2
1
  module Yell #:nodoc:
3
2
  module Helpers #:nodoc:
4
- module Adapters #:nodoc:
5
-
3
+ module Adapter #:nodoc:
6
4
  # Define an adapter to be used for logging.
7
5
  #
8
6
  # @example Standard adapter
@@ -12,40 +10,32 @@ module Yell #:nodoc:
12
10
  # adapter :file, 'development.log'
13
11
  #
14
12
  # # Alternative notation for filename in options
15
- # adapter :file, :filename => 'developent.log'
13
+ # adapter :file, filename: 'developent.log'
16
14
  #
17
15
  # @example Standard adapter with filename and additional options
18
- # adapter :file, 'development.log', :level => :warn
16
+ # adapter :file, 'development.log', level: :warn
19
17
  #
20
18
  # @example Set the adapter directly from an adapter instance
21
- # adapter( Yell::Adapter::File.new )
19
+ # adapter Yell::Adapter::File.new
22
20
  #
23
21
  # @param [Symbol] type The type of the adapter, may be `:file` or `:datefile` (default `:file`)
24
22
  # @return [Yell::Adapter] The instance
25
23
  # @raise [Yell::NoSuchAdapter] Will be thrown when the adapter is not defined
26
24
  def adapter( type = :file, *args, &block )
27
- options = [@options, *args].inject( Hash.new ) do |h, c|
28
- h.merge( [String, Pathname].include?(c.class) ? {:filename => c} : c )
29
- end
30
-
31
- @adapters << Yell::Adapters.new(type, options, &block)
25
+ adapters.add(type, *args, &block)
32
26
  end
33
27
 
34
- # @private
35
28
  def adapters
36
- @adapters
29
+ @__adapters__
37
30
  end
38
31
 
39
-
40
32
  private
41
33
 
42
34
  def reset!
43
- @adapters = []
35
+ @__adapters__ = Yell::Adapters::Collection.new(@options)
44
36
 
45
37
  super
46
38
  end
47
-
48
39
  end
49
40
  end
50
41
  end
51
-
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  module Yell #:nodoc:
3
2
  module Helpers #:nodoc:
4
3
  module Base #:nodoc:
@@ -1,26 +1,26 @@
1
- # encoding: utf-8
2
1
  module Yell #:nodoc:
3
2
  module Helpers #:nodoc:
4
3
  module Formatter #:nodoc:
5
4
 
6
5
  # Set the format for your message.
7
- def format=( pattern )
8
- @formatter = case pattern
6
+ def formatter=( pattern )
7
+ @__formatter__ = case pattern
9
8
  when Yell::Formatter then pattern
10
- when false then Yell::Formatter.new(Yell::NoFormat)
11
9
  else Yell::Formatter.new(*pattern)
12
10
  end
13
11
  end
12
+ alias :format= :formatter=
14
13
 
15
- # @private
16
- def format
17
- @formatter
14
+ def formatter
15
+ @__formatter__
18
16
  end
17
+ alias :format :formatter
18
+
19
19
 
20
20
  private
21
21
 
22
22
  def reset!
23
- @formatter = Yell::Formatter.new
23
+ @__formatter__ = Yell::Formatter.new
24
24
 
25
25
  super
26
26
  end