twiglet 3.7.2 → 3.9.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fdfe6db753dcf115b7965ff0cfd9682e23694b43765fd69cdd64986e7fc51d41
4
- data.tar.gz: fb110c32f6b4556efd1eb3f4ff673ca7b2e975008973ad296445389d2372a8c8
3
+ metadata.gz: 24bb01ca290d4e49c2a38e69a0566bcb0e06d38e5c1daa120abb90c2a88c1826
4
+ data.tar.gz: 00e825a9ae2164604a36b54811bf659321bc5bb1bf96afc198399c890058004a
5
5
  SHA512:
6
- metadata.gz: 7d0add22464cd885a861d2d7c5e85d7b7e2a444cb4516c26c261ea9992b1e2988a2a7e47d17d4d123d8131b34198af2d084350c2aa7262b44db513fccc33ea11
7
- data.tar.gz: d9772fd14f86d73b17c25a0b4f469b1ff9248ecba733d0d09d31be1d6c6c69c01a2e4d8e1152d68b2b8fce57f1acb13745ae45d5069846df38119663ea8262ae
6
+ metadata.gz: 8992a36124f946eb46fc63fd432d5ae1c5359101572a759eea3a70bb7d1b5d3ccadc9d76a075b42222906f6eb2a4c03de273b967a4e7bb8d977ec9f2a2095954
7
+ data.tar.gz: bfd2479a25d3d2f5212721941bd2400ad6179080f65a913efa4256c7ca7304e8042efc9ca50f294e19d5157e4d640e2c03e97c45891320ea445ef32792eaaa88
data/.rubocop.yml CHANGED
@@ -2,11 +2,8 @@ inherit_gem:
2
2
  simplycop: .simplycop.yml
3
3
 
4
4
  AllCops:
5
- TargetRubyVersion: 2.6
6
- Rails:
7
- Enabled: false
8
- Documentation:
9
- Enabled: false
5
+ TargetRubyVersion: 3.0
6
+
10
7
  Metrics/BlockLength:
11
8
  Max: 250
12
9
  Metrics/AbcSize:
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.1.2
1
+ 3.2.2
@@ -10,7 +10,7 @@ module HashExtensions
10
10
  end
11
11
 
12
12
  def deep_merge(hash_to_merge)
13
- merger = proc { |_, val1, val2| val1.is_a?(Hash) && val2.is_a?(Hash) ? val1.merge(val2, &merger) : val2 }
13
+ merger = proc { |_, val_1, val_2| val_1.is_a?(Hash) && val_2.is_a?(Hash) ? val_1.merge(val_2, &merger) : val_2 }
14
14
  merge(hash_to_merge, &merger)
15
15
  end
16
16
 
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Twiglet
4
+ class ErrorSerialiser
5
+ def serialise_error(error)
6
+ error_fields = {
7
+ error: {
8
+ type: error.class.to_s,
9
+ message: error.message
10
+ }
11
+ }
12
+ add_stack_trace(error_fields, error)
13
+ end
14
+
15
+ private
16
+
17
+ def add_stack_trace(hash_to_add_to, error)
18
+ hash_to_add_to[:error][:stack_trace] = error.backtrace if error.backtrace
19
+ hash_to_add_to
20
+ end
21
+ end
22
+ end
@@ -6,11 +6,13 @@ module Twiglet
6
6
  class Formatter < ::Logger::Formatter
7
7
  Hash.include HashExtensions
8
8
 
9
- def initialize(service_name,
10
- validator:,
11
- default_properties: {},
12
- context_provider: nil,
13
- now: -> { Time.now.utc })
9
+ def initialize(
10
+ service_name,
11
+ validator:,
12
+ default_properties: {},
13
+ context_provider: nil,
14
+ now: -> { Time.now.utc }
15
+ )
14
16
  @service_name = service_name
15
17
  @now = now
16
18
  @default_properties = default_properties
@@ -34,7 +36,7 @@ module Twiglet
34
36
  ecs: {
35
37
  version: '1.5.0'
36
38
  },
37
- "@timestamp": @now.call.iso8601(3),
39
+ '@timestamp': @now.call.iso8601(3),
38
40
  service: {
39
41
  name: @service_name
40
42
  },
@@ -6,6 +6,7 @@ require_relative 'formatter'
6
6
  require_relative '../hash_extensions'
7
7
  require_relative 'message'
8
8
  require_relative 'validator'
9
+ require_relative 'error_serialiser'
9
10
 
10
11
  module Twiglet
11
12
  class Logger < ::Logger
@@ -87,19 +88,9 @@ module Twiglet
87
88
  private
88
89
 
89
90
  def error_message(error, message = nil)
90
- error_fields = {
91
- error: {
92
- type: error.class.to_s,
93
- message: error.message
94
- }
95
- }
96
- add_stack_trace(error_fields, error)
91
+ error_hash = Twiglet::ErrorSerialiser.new.serialise_error(error)
97
92
  message = error.message if message.nil? || message.empty?
98
- Message.new(message).merge(error_fields)
99
- end
100
-
101
- def add_stack_trace(hash_to_add_to, error)
102
- hash_to_add_to[:error][:stack_trace] = error.backtrace if error.backtrace
93
+ Message.new(message).merge(error_hash)
103
94
  end
104
95
  end
105
96
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Twiglet
4
- VERSION = '3.7.2'
4
+ VERSION = '3.9.0'
5
5
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
4
+ require 'minitest/mock'
5
+ require_relative '../lib/twiglet/error_serialiser'
6
+
7
+ describe Twiglet::ErrorSerialiser do
8
+ describe 'logging an exception' do
9
+ it 'should log an error with backtrace' do
10
+ 1 / 0
11
+ rescue StandardError => e
12
+ error_hash = Twiglet::ErrorSerialiser.new.serialise_error(e)
13
+ assert_equal 'divided by 0', error_hash[:error][:message]
14
+ assert_equal 'ZeroDivisionError', error_hash[:error][:type]
15
+ assert_match 'test/error_serialiser_test.rb', error_hash[:error][:stack_trace].first
16
+ end
17
+ end
18
+ end
@@ -17,7 +17,7 @@ describe HashExtensions do
17
17
  log: {
18
18
  level: 'error'
19
19
  },
20
- "@timestamp": '2020-05-09T15:13:20.736Z'
20
+ '@timestamp': '2020-05-09T15:13:20.736Z'
21
21
  }
22
22
 
23
23
  expected = actual.to_nested
@@ -26,8 +26,8 @@ describe HashExtensions do
26
26
 
27
27
  it 'should convert keys with . into nested objects' do
28
28
  actual = {
29
- "service.name": 'petshop',
30
- "log.level": 'error'
29
+ 'service.name': 'petshop',
30
+ 'log.level': 'error'
31
31
  }
32
32
 
33
33
  nested = actual.to_nested
@@ -38,10 +38,10 @@ describe HashExtensions do
38
38
 
39
39
  it 'should group nested objects' do
40
40
  actual = {
41
- "service.name": 'petshop',
42
- "service.id": 'ps001',
43
- "service.version": '0.9.1',
44
- "log.level": 'error'
41
+ 'service.name': 'petshop',
42
+ 'service.id': 'ps001',
43
+ 'service.version': '0.9.1',
44
+ 'log.level': 'error'
45
45
  }
46
46
 
47
47
  nested = actual.to_nested
@@ -54,10 +54,10 @@ describe HashExtensions do
54
54
 
55
55
  it 'should cope with more than two levels' do
56
56
  actual = {
57
- "http.request.method": 'get',
58
- "http.request.body.bytes": 112,
59
- "http.response.bytes": 1564,
60
- "http.response.status_code": 200
57
+ 'http.request.method': 'get',
58
+ 'http.request.body.bytes': 112,
59
+ 'http.response.bytes': 1564,
60
+ 'http.response.status_code': 200
61
61
  }
62
62
 
63
63
  nested = actual.to_nested
data/test/logger_test.rb CHANGED
@@ -34,8 +34,19 @@ describe Twiglet::Logger do
34
34
 
35
35
  it 'conforms to the standard Ruby Logger API' do
36
36
  [
37
- :debug, :debug?, :info, :info?, :warn, :warn?, :fatal, :fatal?, :error, :error?,
38
- :level, :level=, :sev_threshold=
37
+ :debug,
38
+ :debug?,
39
+ :info,
40
+ :info?,
41
+ :warn,
42
+ :warn?,
43
+ :fatal,
44
+ :fatal?,
45
+ :error,
46
+ :error?,
47
+ :level,
48
+ :level=,
49
+ :sev_threshold=
39
50
  ].each do |call|
40
51
  assert @logger.respond_to?(call), "Logger does not respond to #{call}"
41
52
  end
@@ -63,7 +74,7 @@ describe Twiglet::Logger do
63
74
  ecs: {
64
75
  version: '1.5.0'
65
76
  },
66
- "@timestamp": '2020-05-11T15:01:01.000Z',
77
+ '@timestamp': '2020-05-11T15:01:01.000Z',
67
78
  service: {
68
79
  name: 'petshop'
69
80
  },
@@ -269,19 +280,19 @@ describe Twiglet::Logger do
269
280
  @logger.info({ message: 'there' })
270
281
 
271
282
  expected_output =
272
- '{"ecs":{"version":"1.5.0"},"@timestamp":"2020-05-11T15:01:01.000Z",'\
273
- '"service":{"name":"petshop"},"log":{"level":"debug"},"message":"hi"}'\
274
- "\n"\
275
- '{"ecs":{"version":"1.5.0"},"@timestamp":"2020-05-11T15:01:01.000Z",'\
276
- '"service":{"name":"petshop"},"log":{"level":"info"},"message":"there"}'\
277
- "\n"\
283
+ '{"ecs":{"version":"1.5.0"},"@timestamp":"2020-05-11T15:01:01.000Z",' \
284
+ '"service":{"name":"petshop"},"log":{"level":"debug"},"message":"hi"}' \
285
+ "\n" \
286
+ '{"ecs":{"version":"1.5.0"},"@timestamp":"2020-05-11T15:01:01.000Z",' \
287
+ '"service":{"name":"petshop"},"log":{"level":"info"},"message":"there"}' \
288
+ "\n" \
278
289
 
279
290
  assert_equal expected_output, @buffer.string
280
291
  end
281
292
 
282
293
  it 'should work with mixed string and symbol properties' do
283
294
  log = {
284
- "trace.id": '1c8a5fb2-fecd-44d8-92a4-449eb2ce4dcb'
295
+ 'trace.id': '1c8a5fb2-fecd-44d8-92a4-449eb2ce4dcb'
285
296
  }
286
297
  event = {}
287
298
  log['event'] = event
@@ -404,7 +415,7 @@ describe Twiglet::Logger do
404
415
  ecs: {
405
416
  version: '1.5.0'
406
417
  },
407
- "@timestamp": '2020-05-11T15:01:01.000Z',
418
+ '@timestamp': '2020-05-11T15:01:01.000Z',
408
419
  service: {
409
420
  name: 'petshop'
410
421
  },
@@ -460,11 +471,11 @@ describe Twiglet::Logger do
460
471
  it 'should be able to convert dotted keys to nested objects' do
461
472
  @logger.debug(
462
473
  {
463
- "trace.id": '1c8a5fb2-fecd-44d8-92a4-449eb2ce4dcb',
474
+ 'trace.id': '1c8a5fb2-fecd-44d8-92a4-449eb2ce4dcb',
464
475
  message: 'customer bought a dog',
465
- "pet.name": 'Barker',
466
- "pet.species": 'dog',
467
- "pet.breed": 'Bitsa'
476
+ 'pet.name': 'Barker',
477
+ 'pet.species': 'dog',
478
+ 'pet.breed': 'Bitsa'
468
479
  }
469
480
  )
470
481
  log = read_json(@buffer)
@@ -479,10 +490,10 @@ describe Twiglet::Logger do
479
490
  it 'should be able to mix dotted keys and nested objects' do
480
491
  @logger.debug(
481
492
  {
482
- "trace.id": '1c8a5fb2-fecd-44d8-92a4-449eb2ce4dcb',
493
+ 'trace.id': '1c8a5fb2-fecd-44d8-92a4-449eb2ce4dcb',
483
494
  message: 'customer bought a dog',
484
495
  pet: { name: 'Barker', breed: 'Bitsa' },
485
- "pet.species": 'dog'
496
+ 'pet.species': 'dog'
486
497
  }
487
498
  )
488
499
  log = read_json(@buffer)
data/twiglet.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
  gem.files = `git ls-files`.split("\n")
18
18
 
19
19
  gem.require_paths = ['lib']
20
- gem.required_ruby_version = '>= 2.6'
20
+ gem.required_ruby_version = '>= 3.0'
21
21
 
22
22
  gem.license = 'Copyright SimplyBusiness'
23
23
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twiglet
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.2
4
+ version: 3.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simply Business
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-11 00:00:00.000000000 Z
11
+ date: 2023-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json-schema
@@ -113,6 +113,7 @@ files:
113
113
  - examples/rack/request_logger.rb
114
114
  - examples/rack/request_logger_test.rb
115
115
  - lib/hash_extensions.rb
116
+ - lib/twiglet/error_serialiser.rb
116
117
  - lib/twiglet/formatter.rb
117
118
  - lib/twiglet/logger.rb
118
119
  - lib/twiglet/message.rb
@@ -120,6 +121,7 @@ files:
120
121
  - lib/twiglet/validator.rb
121
122
  - lib/twiglet/version.rb
122
123
  - mkdocs.yml
124
+ - test/error_serialiser_test.rb
123
125
  - test/formatter_test.rb
124
126
  - test/hash_extensions_test.rb
125
127
  - test/logger_test.rb
@@ -139,14 +141,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
139
141
  requirements:
140
142
  - - ">="
141
143
  - !ruby/object:Gem::Version
142
- version: '2.6'
144
+ version: '3.0'
143
145
  required_rubygems_version: !ruby/object:Gem::Requirement
144
146
  requirements:
145
147
  - - ">="
146
148
  - !ruby/object:Gem::Version
147
149
  version: '0'
148
150
  requirements: []
149
- rubygems_version: 3.3.7
151
+ rubygems_version: 3.4.10
150
152
  signing_key:
151
153
  specification_version: 4
152
154
  summary: Twiglet