yell 1.1.0 → 1.2.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.
@@ -64,11 +64,21 @@ module Yell #:nodoc:
64
64
  compile!( :write!, &block )
65
65
  end
66
66
 
67
+ # Define your open method with this helper.
68
+ #
69
+ # @example Open a file handle
70
+ # open do
71
+ # @stream = ::File.open( 'test.log', ::File::WRONLY|::File::APPEND|::File::CREAT )
72
+ # end
73
+ def open( &block )
74
+ compile!( :open!, &block )
75
+ end
76
+
67
77
  # Define your close method with this helper.
68
78
  #
69
79
  # @example Closing a file handle
70
80
  # close do
71
- # @file_handle.close
81
+ # @stream.close
72
82
  # end
73
83
  def close( &block )
74
84
  compile!( :close!, &block )
@@ -152,6 +162,17 @@ module Yell #:nodoc:
152
162
  close!
153
163
  end
154
164
 
165
+ # 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
+ def inspect
173
+ inspection = inspectables.inject( [] ) { |r, c| r << "#{c}: #{send(c).inspect}" }
174
+ "#<#{self.class.name} #{inspection * ', '}>"
175
+ end
155
176
 
156
177
  private
157
178
 
@@ -171,6 +192,14 @@ module Yell #:nodoc:
171
192
  # Not implemented
172
193
  end
173
194
 
195
+ # Perform the actual open.
196
+ #
197
+ # Adapter classes should provide their own implementation
198
+ # of this method.
199
+ def open!
200
+ # Not implemented
201
+ end
202
+
174
203
  # Perform the actual close.
175
204
  #
176
205
  # Adapter classes should provide their own implementation
@@ -191,6 +220,13 @@ module Yell #:nodoc:
191
220
  @level.nil? || @level.at?( event.level )
192
221
  end
193
222
 
223
+ # Get an array of inspected attributes for the adapter.
224
+ #
225
+ # @return [ String ] An array of pretty printed field values.
226
+ def inspectables
227
+ [ :level ]
228
+ end
229
+
194
230
  end
195
231
 
196
232
  end
@@ -174,6 +174,11 @@ module Yell #:nodoc:
174
174
  end
175
175
  end
176
176
 
177
+ # @override
178
+ def inspectables
179
+ super.concat [:date_pattern, :header, :keep, :symlink ]
180
+ end
181
+
177
182
  end
178
183
 
179
184
  register( :datefile, Yell::Adapters::Datefile )
@@ -9,32 +9,14 @@ module Yell #:nodoc:
9
9
 
10
10
  setup do |options|
11
11
  @filename = ::File.expand_path options.fetch(:filename, default_filename)
12
-
13
- # sync immediately to IO (or not)
14
- self.sync = options.fetch(:sync, true)
15
12
  end
16
13
 
17
-
18
- # Sets the “sync mode” to true or false.
19
- #
20
- # When true (default), every log event is immediately written to the file.
21
- # When false, the log event is buffered internally.
22
- attr_accessor :sync
23
-
24
-
25
- private
26
-
27
- # @overload Lazily open the file handle
28
- def stream
29
- synchronize { @stream or open! }
14
+ open do
15
+ @stream = ::File.open( @filename, ::File::WRONLY|::File::APPEND|::File::CREAT )
30
16
  end
31
17
 
32
- def open!
33
- @stream = ::File.open( @filename, ::File::WRONLY|::File::APPEND|::File::CREAT )
34
- @stream.sync = sync
35
18
 
36
- @stream
37
- end
19
+ private
38
20
 
39
21
  def default_filename #:nodoc:
40
22
  logdir = ::File.expand_path("log")
@@ -20,8 +20,14 @@ module Yell #:nodoc:
20
20
  setup do |options|
21
21
  @stream = nil
22
22
 
23
+ # colorize the log output (default: false)
23
24
  self.colors = options.fetch(:colors, false)
25
+
26
+ # format the log message (default: nil)
24
27
  self.format = options.fetch(:format, nil)
28
+
29
+ # sync immediately to IO (default: true)
30
+ self.sync = options.fetch(:sync, true)
25
31
  end
26
32
 
27
33
  write do |event|
@@ -35,7 +41,12 @@ module Yell #:nodoc:
35
41
  # add new line if there is none
36
42
  message << "\n" unless message[-1] == ?\n
37
43
 
38
- stream.write( message )
44
+ stream.syswrite( message )
45
+ end
46
+
47
+ open do
48
+ @stream.sync = self.sync if @stream.respond_to? :sync
49
+ @stream.flush if @stream.respond_to? :flush
39
50
  end
40
51
 
41
52
  close do
@@ -44,6 +55,12 @@ module Yell #:nodoc:
44
55
  end
45
56
 
46
57
 
58
+ # Sets the “sync mode” to true or false.
59
+ #
60
+ # When true (default), every log event is immediately written to the file.
61
+ # When false, the log event is buffered internally.
62
+ attr_accessor :sync
63
+
47
64
  # Sets colored output on or off (default off)
48
65
  #
49
66
  # @example Enable colors
@@ -67,8 +84,14 @@ module Yell #:nodoc:
67
84
  # Adapter classes should provide their own implementation
68
85
  # of this method.
69
86
  def stream
70
- raise 'Not implemented'
87
+ synchronize { open! if @stream.nil?; @stream }
88
+ end
89
+
90
+ # @override
91
+ def inspectables
92
+ super.concat [:format, :colors, :sync]
71
93
  end
94
+
72
95
  end
73
96
 
74
97
  end
@@ -5,22 +5,18 @@ module Yell #:nodoc:
5
5
 
6
6
  class Stdout < Yell::Adapters::Io
7
7
 
8
- private
9
-
10
- # @overload Lazily open the STDOUT stream
11
- def stream
12
- @stream ||= $stdout.clone
8
+ open do
9
+ @stream = $stdout.clone
13
10
  end
11
+
14
12
  end
15
13
 
16
14
  class Stderr < Yell::Adapters::Io
17
15
 
18
- private
19
-
20
- # @overload Lazily open the STDERR stream
21
- def stream
22
- @stream ||= $stderr.clone
16
+ open do
17
+ @stream = $stderr.clone
23
18
  end
19
+
24
20
  end
25
21
 
26
22
  register( :stdout, Yell::Adapters::Stdout )
@@ -1,5 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'erb'
3
4
  require 'yaml'
4
5
 
5
6
  module Yell #:nodoc:
@@ -9,7 +10,11 @@ module Yell #:nodoc:
9
10
  class Configuration
10
11
 
11
12
  def self.load!( file )
12
- YAML.load_file( file )[ Yell.env ] || {}
13
+ # parse through ERB
14
+ yaml = ERB.new(File.read(file)).result
15
+
16
+ # parse through YAML
17
+ YAML.load(yaml)[Yell.env] || {}
13
18
  end
14
19
 
15
20
  end
data/lib/yell/event.rb CHANGED
@@ -18,6 +18,7 @@ module Yell #:nodoc:
18
18
  # Prefetch those values (no need to do that on every new instance)
19
19
  @@hostname = Socket.gethostname rescue nil
20
20
  @@pid = Process.pid
21
+ @@progname = $0
21
22
 
22
23
  # Accessor to the log level
23
24
  attr_reader :level
@@ -47,16 +48,21 @@ module Yell #:nodoc:
47
48
  @method = nil
48
49
  end
49
50
 
50
- # Accessor to the pid
51
+ # Accessor to the hostname
51
52
  def hostname
52
53
  @@hostname
53
54
  end
54
55
 
55
- # Accessor to the hostname
56
+ # Accessor to the pid
56
57
  def pid
57
58
  @@pid
58
59
  end
59
60
 
61
+ # Accessor to the progname
62
+ def progname
63
+ @@progname
64
+ end
65
+
60
66
  # Accessor to filename the log event occured
61
67
  def file
62
68
  _caller! if @file.nil?
@@ -67,6 +67,7 @@ module Yell #:nodoc:
67
67
  "d" => "date(event.time)", # ISO8601 Timestamp
68
68
  "h" => "event.hostname", # Hostname
69
69
  "p" => "event.pid", # PID
70
+ "P" => "event.progname", # Progname
70
71
  "t" => "event.thread_id", # Thread ID
71
72
  "F" => "event.file", # Path with filename where the logger was called
72
73
  "f" => "File.basename(event.file)", # Filename where the loger was called
@@ -84,11 +85,21 @@ module Yell #:nodoc:
84
85
  # message formatting.
85
86
  def initialize( pattern = nil, date_pattern = nil )
86
87
  @pattern = pattern || Yell::DefaultFormat
87
- @date_pattern = date_pattern
88
+ @date_pattern = date_pattern || :iso8601
88
89
 
89
90
  define!
90
91
  end
91
92
 
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.
100
+ def inspect
101
+ "#<#{self.class.name} pattern: #{@pattern.inspect}, date_pattern: #{@date_pattern.inspect}>"
102
+ end
92
103
 
93
104
  private
94
105
 
@@ -120,7 +131,10 @@ module Yell #:nodoc:
120
131
  end
121
132
 
122
133
  def date( t )
123
- @date_pattern ? t.strftime( @date_pattern ) : t.iso8601
134
+ case @date_pattern
135
+ when String then t.strftime( @date_pattern )
136
+ else t.iso8601
137
+ end
124
138
  end
125
139
 
126
140
  def message( *messages )
@@ -129,14 +143,14 @@ module Yell #:nodoc:
129
143
 
130
144
  def to_message( m )
131
145
  case m
132
- when Hash
133
- m.map { |k,v| "#{k}: #{v}" }.join( ", " )
134
- when Exception
135
- backtrace = m.backtrace ? "\n\t#{m.backtrace.join("\n\t")}" : ""
136
-
137
- "%s: %s%s" % [m.class, m.message, backtrace]
138
- else
139
- m
146
+ when Hash
147
+ m.map { |k,v| "#{k}: #{v}" }.join( ", " )
148
+ when Exception
149
+ backtrace = m.backtrace ? "\n\t#{m.backtrace.join("\n\t")}" : ""
150
+
151
+ "%s: %s%s" % [m.class, m.message, backtrace]
152
+ else
153
+ m
140
154
  end
141
155
  end
142
156
 
data/lib/yell/level.rb CHANGED
@@ -138,6 +138,22 @@ 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.
148
+ def inspect
149
+ severities = Yell::Severities.each.with_index.inject( [] ) do |r, (l, i)|
150
+ r << l if @severities[i]
151
+ r
152
+ end
153
+
154
+ "#<#{self.class.name} severities: #{severities * ', '}>"
155
+ end
156
+
141
157
 
142
158
  private
143
159
 
data/lib/yell/logger.rb CHANGED
@@ -124,6 +124,16 @@ module Yell #:nodoc:
124
124
  EOS
125
125
  end
126
126
 
127
+ # Get a pretty string representation of the logger.
128
+ #
129
+ # @example Inspect the logger
130
+ # logger.inspect
131
+ #
132
+ # @return [String] The inspection string.
133
+ def inspect
134
+ inspection = inspectables.inject( [] ) { |r, c| r << "#{c}: #{send(c).inspect}" }
135
+ "#<#{self.class.name} #{inspection * ', '}, adapters: #{@adapters.map(&:inspect) * ', '}>"
136
+ end
127
137
 
128
138
  private
129
139
 
@@ -149,6 +159,13 @@ module Yell #:nodoc:
149
159
  @adapters.each { |a| a.write(event) }
150
160
  end
151
161
 
162
+ # Get an array of inspected attributes for the adapter.
163
+ #
164
+ # @return [ String ] An array of pretty printed field values.
165
+ def inspectables
166
+ [ :name, :level ]
167
+ end
168
+
152
169
  end
153
170
  end
154
171
 
data/lib/yell/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Yell #:nodoc:
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
5
5
 
6
6
  end
7
7
 
data/spec/spec_helper.rb CHANGED
@@ -14,10 +14,10 @@ RSpec.configure do |config|
14
14
 
15
15
  config.before do
16
16
  Yell::Repository.loggers.clear
17
+ Dir[ fixture_path + "/*.log" ].each { |f| File.delete f }
17
18
  end
18
19
 
19
20
  config.after do
20
- Dir[ fixture_path + "/*.log" ].each { |f| File.delete f }
21
21
  end
22
22
 
23
23
  private
@@ -40,12 +40,6 @@ describe Yell::Adapters::Io do
40
40
  end
41
41
  end
42
42
 
43
- context :stream do
44
- it "should raise" do
45
- lambda { Yell::Adapters::Io.new.send :stream }.should raise_error("Not implemented" )
46
- end
47
- end
48
-
49
43
  context :write do
50
44
  let( :event ) { Yell::Event.new(1, "Hello World") }
51
45
  let( :adapter ) { Yell::Adapters::Io.new }
@@ -63,7 +57,7 @@ describe Yell::Adapters::Io do
63
57
 
64
58
  it "should print formatted message to stream" do
65
59
  formatted = Yell::Formatter.new.format( event )
66
- mock( stream ).write( formatted << "\n" )
60
+ mock( stream ).syswrite( formatted << "\n" )
67
61
 
68
62
  adapter.write( event )
69
63
  end
@@ -70,4 +70,8 @@ describe Yell::Event do
70
70
  it { should == Process.pid }
71
71
  end
72
72
 
73
+ context :progname do
74
+ subject { event.progname }
75
+ it { should == $0 }
76
+ end
73
77
  end
@@ -14,37 +14,41 @@ describe Yell::Formatter do
14
14
 
15
15
  context "%m" do
16
16
  subject { "%m" }
17
- it { format.should == "Hello World!" }
17
+ it { format.should == event.messages.join(' ') }
18
18
  end
19
19
 
20
20
  context "%l" do
21
21
  subject { "%l" }
22
- it { format.should == "I" }
22
+ it { format.should == Yell::Severities[event.level][0,1] }
23
23
  end
24
24
 
25
25
  context "%L" do
26
26
  subject { "%L" }
27
- it { format.should == "INFO" }
27
+ it { format.should == Yell::Severities[event.level] }
28
28
  end
29
29
 
30
30
  context "%d" do
31
31
  subject { "%d" }
32
- it { format.should == time.iso8601 }
32
+ it { format.should == event.time.iso8601 }
33
33
  end
34
34
 
35
35
  context "%p" do
36
36
  subject { "%p" }
37
- it { format.should == Process.pid.to_s }
37
+ it { format.should == event.pid.to_s }
38
38
  end
39
39
 
40
+ context "%P" do
41
+ subject { "%P" }
42
+ it { format.should == event.progname }
43
+ end
40
44
  context "%t" do
41
45
  subject { "%t" }
42
- it { format.should == Thread.current.object_id.to_s }
46
+ it { format.should == event.thread_id.to_s }
43
47
  end
44
48
 
45
49
  context "%h" do
46
50
  subject { "%h" }
47
- it { format.should == Socket.gethostname }
51
+ it { format.should == event.hostname }
48
52
  end
49
53
 
50
54
  context "caller" do
@@ -148,8 +148,8 @@ describe Yell::Logger do
148
148
  factory = LoggerFactory.new
149
149
  factory.logger = logger
150
150
 
151
- mock( adapter.send(:stream) ).write( "#{__FILE__}, 7: foo\n" )
152
- mock( adapter.send(:stream) ).write( "#{__FILE__}, 11: bar\n" )
151
+ mock( adapter.send(:stream) ).syswrite( "#{__FILE__}, 7: foo\n" )
152
+ mock( adapter.send(:stream) ).syswrite( "#{__FILE__}, 11: bar\n" )
153
153
 
154
154
  factory.foo
155
155
  factory.bar
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.1.0
4
+ version: 1.2.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: 2012-10-03 00:00:00.000000000 Z
12
+ date: 2012-10-30 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
@@ -111,4 +111,3 @@ test_files:
111
111
  - spec/yell/logger_spec.rb
112
112
  - spec/yell/repository_spec.rb
113
113
  - spec/yell_spec.rb
114
- has_rdoc: