birling 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f4dc4f5818efaa56556172c346f84d65003945d4896b54b8a429f9efe04a79bc
4
- data.tar.gz: ab4735d6d76d9f00f02f68de2782c530a677f06d58f2e014534f22cfd7a4d5dd
3
+ metadata.gz: a2d34d601f2ff30378ab9b5e133d806978b9da61a64de3ac878b1ed10b04fd96
4
+ data.tar.gz: 363723fcff5a1ba4ba67ebfcd89619d4377087e780120c1ad0d37acf8cf28471
5
5
  SHA512:
6
- metadata.gz: 1dffa664260145c4c5c4c6f4bf0f9e76372f923615647182a131722075f41c9ad09f410344ba2c8f2b95a32ba735886fd06090651d572bbde6187dbddcf7f5f8
7
- data.tar.gz: 97c0654adf37b1046b75c896e0b10832a214dde9d9659430bf9eb8a5de2e11eece9d8c5d076db907713b17da7b76e66b9d4aaf2d4aa59160d6390e640979ed5b
6
+ metadata.gz: 1b5c2cb58a1a7130b66c1dfb67aaa9b48e2a843d72f32abbc95bfdb6c087a0d688a9c080f2ed33d3728d7abe93ac250e490d44019f23f9b3af7964321061d6f0
7
+ data.tar.gz: 73c01e0ad63f2c53350814b17342f489114255eab32f3f5ea49db0d20f6c5554e173fc21ba99b45624e0390a45200d677f3883dae6cd86821b85f6e992fc5c58
data/.travis.yml CHANGED
@@ -1,10 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
- - 2.0.0
5
- - 2.1.5
6
- - 2.2.0
7
- - 2.3.3
8
- - 2.4.2
3
+ - 2.4.10
4
+ - 2.5.8
5
+ - 2.6.6
6
+ - 2.7.2
7
+ - 3.0.0
9
8
  before_install:
10
9
  - export TZ=EST5EDT
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
data/birling.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: birling 0.2.2 ruby lib
5
+ # stub: birling 0.3.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "birling".freeze
9
- s.version = "0.2.2"
9
+ s.version = "0.3.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Scott Tadman".freeze]
14
- s.date = "2020-01-28"
14
+ s.date = "2021-02-17"
15
15
  s.description = "Mostly drop-in replacement for Logger with a more robust log rotation facility".freeze
16
16
  s.email = "github@tadman.ca".freeze
17
17
  s.extra_rdoc_files = [
@@ -38,7 +38,7 @@ Gem::Specification.new do |s|
38
38
  ]
39
39
  s.homepage = "http://github.com/postageapp/birling".freeze
40
40
  s.licenses = ["MIT".freeze]
41
- s.rubygems_version = "3.1.2".freeze
41
+ s.rubygems_version = "3.1.4".freeze
42
42
  s.summary = "Logger with simple log rotation system".freeze
43
43
 
44
44
  if s.respond_to? :specification_version then
@@ -1,6 +1,6 @@
1
1
  class Birling::Logger
2
2
  # == Constants ============================================================
3
-
3
+
4
4
  # These level constants are the same as the syslog system utility
5
5
  SEVERITY = {
6
6
  emergency: EMERGENCY = 0,
@@ -13,17 +13,17 @@ class Birling::Logger
13
13
  debug: DEBUG = 7,
14
14
  unknown: UNKNOWN = 999
15
15
  }.freeze
16
-
16
+
17
17
  DEFAULT_SEVERITY = UNKNOWN
18
18
 
19
19
  SEVERITY_LABEL = SEVERITY.invert.freeze
20
-
20
+
21
21
  PATH_TIME_DEFAULT = {
22
22
  hourly: '%Y%m%d%H'.freeze,
23
23
  daily: '%Y%m%d'.freeze,
24
24
  default: '%s'.freeze
25
25
  }.freeze
26
-
26
+
27
27
  # == Properties ===========================================================
28
28
 
29
29
  attr_reader :severity
@@ -38,9 +38,9 @@ class Birling::Logger
38
38
  attr_reader :retain_period
39
39
  attr_reader :period
40
40
  attr_reader :rotation_time
41
-
41
+
42
42
  # == Class Methods ========================================================
43
-
43
+
44
44
  def self.severity(value)
45
45
  case (value)
46
46
  when Symbol
@@ -53,7 +53,7 @@ class Birling::Logger
53
53
  DEFAULT_SEVERITY
54
54
  end
55
55
  end
56
-
56
+
57
57
  # == Instance Methods =====================================================
58
58
 
59
59
  # Use Birling.open(...) to create new instances.
@@ -84,50 +84,50 @@ class Birling::Logger
84
84
  when String
85
85
  @path = log
86
86
  end
87
-
87
+
88
88
  if (@path and @period)
89
89
  @rotation_time = self.next_rotation_time
90
-
90
+
91
91
  @path_time_format = (PATH_TIME_DEFAULT[@period] or PATH_TIME_DEFAULT[:default])
92
-
92
+
93
93
  @path_format ||=
94
94
  @path.sub(/\.(\w+)$/) do |s|
95
95
  '.' + @path_time_format + '.' + $1
96
96
  end
97
97
  end
98
-
98
+
99
99
  if (@path and !@log)
100
100
  self.log_open!
101
101
  end
102
-
102
+
103
103
  yield(self) if (block_given?)
104
104
  end
105
-
105
+
106
106
  # Sets the severity filter for logging. Any messages with a lower severity
107
107
  # will be ignored. Any invalid severity options will reset the severity
108
108
  # filter to defaults.
109
109
  def severity=(value)
110
110
  @severity = self.class.severity(value)
111
111
  end
112
-
112
+
113
113
  # Returns true if the log can be rotated, false otherwise.
114
114
  def can_rotate?
115
115
  !!@path
116
116
  end
117
-
117
+
118
118
  # Sets the retention interval for log files. Value should respond to to_i
119
119
  # and yield an integer value that's a positive number of seconds between
120
120
  # rotation operations.
121
121
  def retain=(value)
122
122
  @retain = value ? value.to_i : nil
123
-
123
+
124
124
  if (@retain_period and @retain_period <= 0)
125
125
  @retain_period = nil
126
126
  end
127
-
127
+
128
128
  @retain_period
129
129
  end
130
-
130
+
131
131
  # An IO compatible method for writing a message to the file. Only non-empty
132
132
  # messages are actually logged.
133
133
  def write(message)
@@ -148,12 +148,12 @@ class Birling::Logger
148
148
  # data will be written if the current log level is not sufficiently high.
149
149
  def log(level, message = nil, program = nil)
150
150
  return unless (@log)
151
-
151
+
152
152
  level = self.class.severity(level)
153
153
  program ||= @program
154
154
 
155
155
  self.check_log_rotation!
156
-
156
+
157
157
  @log.write(@formatter.call(level, @time_source.now, program, message))
158
158
  end
159
159
  alias_method :add, :log
@@ -167,12 +167,12 @@ class Birling::Logger
167
167
  # Writes to the log file regardless of log level.
168
168
  def <<(message)
169
169
  return unless (@log)
170
-
170
+
171
171
  self.check_log_rotation!
172
-
172
+
173
173
  @log.write(message)
174
174
  end
175
-
175
+
176
176
  # Each of the severity levels has an associated method name. For example:
177
177
  # * debug? - Returns true if the logging level is at least debug, false
178
178
  # otherwise.
@@ -182,14 +182,14 @@ class Birling::Logger
182
182
  define_method(:"#{name}?") do
183
183
  @severity >= level
184
184
  end
185
-
186
- define_method(name) do |message = nil, program = nil|
185
+
186
+ define_method(name) do |message = nil, program = nil, &block|
187
187
  return unless (@log and @severity >= level)
188
-
188
+
189
189
  program ||= @program
190
-
190
+
191
191
  if (!message and block_given?)
192
- message = yield
192
+ message = block.call
193
193
  end
194
194
 
195
195
  self.check_log_rotation!
@@ -201,11 +201,11 @@ class Birling::Logger
201
201
  # Closes the log.
202
202
  def close
203
203
  return unless (@log)
204
-
204
+
205
205
  @log.close
206
206
  @log = nil
207
207
  end
208
-
208
+
209
209
  # Returns true if the log is opened, false otherwise.
210
210
  def opened?
211
211
  !!@log
@@ -220,17 +220,17 @@ class Birling::Logger
220
220
  def create_time
221
221
  @log and @log.ctime
222
222
  end
223
-
223
+
224
224
  # Returns size of the log if opened, nil otherwise.
225
225
  def size
226
226
  @log and @log.size
227
227
  end
228
-
228
+
229
229
  # Returns the age of the log file in seconds if opened, nil otherwise.
230
230
  def age(relative_to = nil)
231
231
  @log and (relative_to || @time_source.now) - @log.ctime
232
232
  end
233
-
233
+
234
234
  protected
235
235
  def next_rotation_time
236
236
  case (@period)
@@ -244,21 +244,21 @@ protected
244
244
  nil
245
245
  end
246
246
  end
247
-
247
+
248
248
  def prune_logs!
249
249
  return unless (@path and (@retain_period or @retain_count))
250
-
250
+
251
251
  log_spec = @path.sub(/\.(\w+)$/, '*')
252
-
252
+
253
253
  logs = (Dir.glob(log_spec) - [ @path ]).collect do |p|
254
254
  stat = File.stat(p)
255
255
  create_time = (stat and stat.ctime or @time_source.now)
256
-
256
+
257
257
  [ p, create_time ]
258
258
  end.sort_by do |r|
259
259
  r[1] || @time_source.now
260
260
  end
261
-
261
+
262
262
  if (@retain_period)
263
263
  logs.reject! do |r|
264
264
  if (Time.now - r[1] > @retain_period)
@@ -266,23 +266,23 @@ protected
266
266
  end
267
267
  end
268
268
  end
269
-
269
+
270
270
  if (@retain_count)
271
271
  # The logs array is sorted from oldest to newest, so retaining the N
272
272
  # newest entries entails stripping them off the end with pop.
273
273
 
274
274
  logs.pop(@retain_count)
275
-
275
+
276
276
  FileUtils.rm_f(logs.collect { |r| r[0] })
277
277
  end
278
278
  end
279
-
279
+
280
280
  def check_log_rotation!
281
281
  return unless (@rotation_time)
282
-
282
+
283
283
  if (@time_source.now >= @rotation_time)
284
284
  self.log_open!
285
-
285
+
286
286
  @rotation_time = self.next_rotation_time
287
287
  end
288
288
  end
@@ -290,10 +290,10 @@ protected
290
290
  def log_open!
291
291
  if (@path_format)
292
292
  @current_path = @time_source.now.strftime(@path_format)
293
-
294
- @log = File.open(@current_path, 'a', @file_open_options)
293
+
294
+ @log = File.open(@current_path, 'a', **@file_open_options)
295
295
  @log.sync = true
296
-
296
+
297
297
  if (File.symlink?(@path))
298
298
  File.unlink(@path)
299
299
  end
@@ -301,12 +301,12 @@ protected
301
301
  unless (File.exist?(@path))
302
302
  File.symlink(@current_path, @path)
303
303
  end
304
-
304
+
305
305
  self.prune_logs!
306
306
  else
307
307
  @current_path = @path
308
-
309
- @log = File.open(@current_path, 'a', @file_open_options)
308
+
309
+ @log = File.open(@current_path, 'a', **@file_open_options)
310
310
 
311
311
  @log.sync = true
312
312
  end
@@ -1,30 +1,31 @@
1
- require File.expand_path('helper', File.dirname(__FILE__))
1
+ require File.expand_path('helper', __dir__)
2
+ require 'stringio'
2
3
 
3
4
  class TestBirlingLogger < Test::Unit::TestCase
4
5
  def test_defaults
5
6
  temp_path do |path|
6
7
  log = Birling::Logger.new(path)
7
-
8
+
8
9
  assert log
9
10
 
10
11
  assert log.opened?
11
12
  assert !log.closed?
12
13
  assert_equal 0, log.size
13
14
  assert Time.now >= log.create_time
14
-
15
+
15
16
  assert_equal Birling::Formatter, log.formatter
16
17
  assert_equal Time, log.time_source
17
18
  assert_equal nil, log.period
18
19
  end
19
20
  end
20
-
21
+
21
22
  def test_with_handle
22
23
  s = StringIO.new
23
-
24
+
24
25
  log = Birling::Logger.new(s)
25
-
26
+
26
27
  assert log.opened?
27
-
28
+
28
29
  assert_equal 0, log.size
29
30
  end
30
31
 
@@ -34,9 +35,9 @@ class TestBirlingLogger < Test::Unit::TestCase
34
35
  buffer = StringIO.new
35
36
 
36
37
  log = Birling::Logger.new(buffer, time_source: Time::Warped)
37
-
38
+
38
39
  assert log.opened?
39
-
40
+
40
41
  assert_equal 0, log.size
41
42
 
42
43
  $stdout = log
@@ -56,21 +57,21 @@ class TestBirlingLogger < Test::Unit::TestCase
56
57
  ensure
57
58
  $stdout = stdout
58
59
  end
59
-
60
+
60
61
  def test_formatter
61
62
  formatter_called = false
62
63
  formatter = lambda do |severity, time, program, message|
63
64
  formatter_called = true
64
65
  message
65
66
  end
66
-
67
+
67
68
  output = StringIO.new
68
69
  log = Birling::Logger.new(output, formatter: formatter)
69
-
70
+
70
71
  log.debug("Test")
71
-
72
+
72
73
  assert_equal true, formatter_called
73
-
74
+
74
75
  output.rewind
75
76
  assert_equal "Test", output.read
76
77
  end
@@ -78,44 +79,44 @@ class TestBirlingLogger < Test::Unit::TestCase
78
79
  def test_default_level
79
80
  temp_path do |path|
80
81
  log = Birling::Logger.new(path)
81
-
82
+
82
83
  assert log
83
84
 
84
85
  assert log.opened?
85
86
  assert !log.closed?
86
87
  assert_equal 0, log.size
87
-
88
+
88
89
  assert log.debug?
89
90
 
90
91
  log.debug("Test")
91
-
92
+
92
93
  current_size = log.size
93
94
  assert current_size > 0
94
95
  end
95
96
  end
96
-
97
+
97
98
  def test_direct_write
98
99
  output = StringIO.new
99
-
100
+
100
101
  log = Birling::Logger.new(output)
101
-
102
+
102
103
  log << "TEST"
103
-
104
+
104
105
  assert_equal "TEST", output.string
105
106
  end
106
-
107
+
107
108
  def test_level_filter
108
109
  output = StringIO.new
109
-
110
+
110
111
  log = Birling::Logger.new(
111
112
  output,
112
113
  formatter: lambda { |s, t, p, m| "#{m}\n" },
113
114
  severity: :info
114
115
  )
115
-
116
+
116
117
  log.debug("DEBUG")
117
118
  log.info("INFO")
118
-
119
+
119
120
  output.rewind
120
121
  assert_equal "INFO\n", output.read
121
122
  end
@@ -127,67 +128,67 @@ class TestBirlingLogger < Test::Unit::TestCase
127
128
  assert log.debug?
128
129
 
129
130
  log.debug("Test")
130
-
131
+
131
132
  current_size = log.size
132
133
  assert current_size > 0
133
-
134
+
134
135
  create_time = log.create_time
135
136
  assert create_time <= Time.now
136
-
137
+
137
138
  log.close
138
-
139
+
139
140
  log = Birling::Logger.new(path)
140
-
141
+
141
142
  assert_equal current_size, log.size
142
143
  assert_equal create_time, log.create_time
143
144
  end
144
145
  end
145
-
146
+
146
147
  def test_time_source
147
148
  temp_path do |path|
148
149
  frozen_time = Time.now
149
150
  Time::Warped.now = frozen_time
150
-
151
+
151
152
  logger = Birling::Logger.new(path, time_source: Time::Warped)
152
-
153
+
153
154
  assert_equal frozen_time, logger.time_source.now
154
155
  end
155
156
  end
156
-
157
+
157
158
  def test_cycling
158
159
  temp_path(:cycle) do |path|
159
160
  start = Time.now
160
161
  Time::Warped.now = start
161
162
  logger = Birling::Logger.new(path, period: 1, time_source: Time::Warped)
162
-
163
+
163
164
  assert_equal 1, logger.period
164
-
165
+
165
166
  current_path = logger.current_path
166
167
  assert_equal '%s', logger.path_time_format
167
-
168
+
168
169
  logger.debug("Test")
169
-
170
+
170
171
  Time::Warped.now += 1
171
-
172
+
172
173
  logger.debug("Test")
173
174
 
174
175
  assert_not_equal current_path, logger.current_path
175
-
176
+
176
177
  current_path = logger.current_path
177
178
 
178
179
  Time::Warped.now += 1
179
-
180
+
180
181
  logger.debug("Test")
181
-
182
+
182
183
  assert_not_equal current_path, logger.current_path
183
184
  end
184
185
  end
185
-
186
+
186
187
  def test_retain_count
187
188
  temp_path(:cycle) do |path|
188
189
  start = Time.now
189
190
  Time::Warped.now = start
190
-
191
+
191
192
  retain_count = 10
192
193
 
193
194
  logger = Birling::Logger.new(
@@ -204,23 +205,23 @@ class TestBirlingLogger < Test::Unit::TestCase
204
205
 
205
206
  logger.debug("Test")
206
207
  end
207
-
208
+
208
209
  assert_equal retain_count, Dir.glob(logger.path_format % '*').length
209
210
  end
210
211
  end
211
-
212
+
212
213
  def test_default_formatter
213
214
  temp_path(:cycle) do |path|
214
215
  logger = Birling::Logger.new(path)
215
-
216
+
216
217
  lines = 100
217
-
218
+
218
219
  lines.times do
219
220
  logger.debug("Test")
220
221
  end
221
-
222
+
222
223
  logger.close
223
-
224
+
224
225
  assert_equal lines, File.readlines(path).length
225
226
  end
226
227
  end
@@ -228,13 +229,13 @@ class TestBirlingLogger < Test::Unit::TestCase
228
229
  def test_retain_period
229
230
  temp_path(:cycle) do |path|
230
231
  retain_period = 3
231
-
232
+
232
233
  logger = Birling::Logger.new(
233
234
  path,
234
235
  period: 1,
235
236
  retain_period: retain_period
236
237
  )
237
-
238
+
238
239
  assert_equal true, File.exist?(path)
239
240
  assert_equal true, File.symlink?(path)
240
241
 
@@ -245,7 +246,7 @@ class TestBirlingLogger < Test::Unit::TestCase
245
246
  Time::Warped.now += 1
246
247
  logger.debug("Test")
247
248
  end
248
-
249
+
249
250
  assert_equal retain_period + 1, Dir.glob(logger.path_format % '*').length
250
251
  end
251
252
  end
@@ -257,6 +258,6 @@ class TestBirlingLogger < Test::Unit::TestCase
257
258
  invalid = (0..255).to_a.pack('C*')
258
259
 
259
260
  logger.debug(invalid)
260
- end
261
+ end
261
262
  end
262
263
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: birling
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Tadman
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-28 00:00:00.000000000 Z
11
+ date: 2021-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -81,7 +81,7 @@ homepage: http://github.com/postageapp/birling
81
81
  licenses:
82
82
  - MIT
83
83
  metadata: {}
84
- post_install_message:
84
+ post_install_message:
85
85
  rdoc_options: []
86
86
  require_paths:
87
87
  - lib
@@ -96,8 +96,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  requirements: []
99
- rubygems_version: 3.1.2
100
- signing_key:
99
+ rubygems_version: 3.1.4
100
+ signing_key:
101
101
  specification_version: 4
102
102
  summary: Logger with simple log rotation system
103
103
  test_files: []