cogger 0.6.0 → 0.7.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.
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cogger
4
+ module Formatters
5
+ # Formats by color.
6
+ class Color
7
+ TEMPLATE = "%<message:dynamic>s"
8
+
9
+ def initialize template = TEMPLATE, processor: Processors::Color.new
10
+ @template = template
11
+ @processor = processor
12
+ end
13
+
14
+ def call(*entry)
15
+ updated_template, attributes = processor.call(template, *entry)
16
+ "#{format(updated_template, **attributes)}\n"
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :template, :processor
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cogger
4
+ module Formatters
5
+ # Formats fatal crashes.
6
+ class Crash
7
+ TEMPLATE = <<~CONTENT
8
+ <dynamic>[%<id>s] [%<severity>s] [%<at>s] Crash!
9
+ %<message>s
10
+ %<error_message>s (%<error_class>s)
11
+ %<backtrace>s</dynamic>
12
+ CONTENT
13
+
14
+ def initialize template = TEMPLATE, processor: Processors::Color.new
15
+ @template = template
16
+ @processor = processor
17
+ end
18
+
19
+ def call(*entry)
20
+ updated_template, attributes = processor.call(template, *entry)
21
+ attributes[:backtrace] = %( #{attributes[:backtrace].join "\n "})
22
+ "#{format(updated_template, **attributes)}\n"
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :template, :processor
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module Cogger
6
+ module Formatters
7
+ # Formats as JSON output.
8
+ class JSON
9
+ TEMPLATE = "%<id>s %<severity>s %<at>s %<message>s"
10
+
11
+ def initialize template = TEMPLATE,
12
+ parser: Parsers::Individual.new,
13
+ sanitizer: Kit::Sanitizer.new
14
+ @template = template
15
+ @parser = parser
16
+ @sanitizer = sanitizer
17
+ end
18
+
19
+ def call(*entry)
20
+ positions = parser.call(template).last.keys
21
+ attributes = sanitizer.call(*entry)
22
+ "#{attributes.slice(*positions).merge!(attributes.except(*positions)).to_json}\n"
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :template, :parser, :sanitizer
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cogger
4
+ module Formatters
5
+ module Kit
6
+ # Transform color based on dynamic (severity) or standard color preference.
7
+ Colorizer = lambda do |value, attributes|
8
+ value == "dynamic" ? attributes[:severity].downcase : value
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cogger
4
+ module Formatters
5
+ module Kit
6
+ # Transforms a positional log entry into a hash entry for template parsing and formatting.
7
+ class Sanitizer
8
+ def initialize filters: Cogger.filters
9
+ @filters = filters
10
+ end
11
+
12
+ # :reek:FeatureEnvy
13
+ def call(*entry)
14
+ severity, at, id, message = entry
15
+
16
+ attributes = if message.is_a? Hash
17
+ {id:, severity:, at:, **message.except(:id, :severity, :at)}
18
+ else
19
+ {id:, severity:, at:, message:}
20
+ end
21
+
22
+ filter attributes
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :filters
28
+
29
+ # :reek:FeatureEnvy
30
+ def filter attributes
31
+ filters.each { |key| attributes[key] = "[FILTERED]" if attributes.key? key }
32
+ attributes
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cogger
4
+ module Formatters
5
+ module Parsers
6
+ # Dynamically extracts the universal or individual template attributes for log entry parsing.
7
+ class Dynamic
8
+ # Order matters.
9
+ DELEGATES = [Universal.new, Individual.new].freeze
10
+
11
+ def initialize delegates: DELEGATES
12
+ @delegates = delegates
13
+ end
14
+
15
+ def call(template) = parse(template) || template
16
+
17
+ private
18
+
19
+ attr_reader :delegates
20
+
21
+ def parse template
22
+ delegates.find do |delegate|
23
+ result = delegate.call template
24
+ break result unless result == template
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cogger
4
+ module Formatters
5
+ module Parsers
6
+ # Sanitizes and extracts individual directives from a template.
7
+ class Individual
8
+ # rubocop:todo Lint/MixedRegexpCaptureTypes
9
+ PATTERN = /
10
+ % # Strict reference syntax.
11
+ (?<flag>[\s#+-0*])? # Optional flag.
12
+ (?<width>\d+)? # Optional width.
13
+ \.? # Optional precision delimiter.
14
+ (?<precision>\d+)? # Optional precision value.
15
+ < # Reference start.
16
+ ( # Conditional start.
17
+ (?<key>\w+) # Key.
18
+ : # Directive delimiter.
19
+ (?<directive>\w+) # Value.
20
+ | # Conditional.
21
+ (?<key>\w+) # Key.
22
+ ) # Conditional end.
23
+ > # Reference end.
24
+ (?<specifier>[ABEGXabcdefgiopsux]) # Specifier.
25
+ /mx
26
+ # rubocop:enable Lint/MixedRegexpCaptureTypes
27
+
28
+ def initialize pattern: PATTERN
29
+ @pattern = pattern
30
+ end
31
+
32
+ def call template
33
+ return template unless template.match? pattern
34
+
35
+ attributes = {}
36
+ template = sanitize_and_extract template, attributes
37
+ [template, attributes]
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :pattern
43
+
44
+ # :reek:FeatureEnvy
45
+ # :reek:TooManyStatements
46
+ def sanitize_and_extract template, attributes
47
+ template.dup.gsub pattern do
48
+ captures = Regexp.last_match.named_captures
49
+ attributes[captures["key"].to_sym] = captures["directive"]
50
+
51
+ captures.reduce(+"%") do |body, (key, value)|
52
+ next body if key == "directive"
53
+
54
+ body.concat key == "key" ? "<#{value}>" : value.to_s
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cogger
4
+ module Formatters
5
+ module Parsers
6
+ # Sanitizes and extracts the universal directive a template.
7
+ class Universal
8
+ # rubocop:todo Lint/MixedRegexpCaptureTypes
9
+ PATTERN = %r(
10
+ ( # Conditional start.
11
+ \A # Search start.
12
+ < # Tag start.
13
+ (?<directive>\w+) # Directive.
14
+ > # Tag end.
15
+ | # Conditional pipe.
16
+ < # Tag start.
17
+ / # Tag close.
18
+ (?<directive>\w+) # Directive.
19
+ > # Tag end.
20
+ \Z # Search end.
21
+ ) # Conditional end.
22
+ )mx
23
+ # rubocop:enable Lint/MixedRegexpCaptureTypes
24
+
25
+ KEY = "directive"
26
+
27
+ def initialize pattern: PATTERN, key: KEY
28
+ @pattern = pattern
29
+ @key = key
30
+ end
31
+
32
+ def call template
33
+ return template unless template.match? pattern
34
+
35
+ [template.gsub(pattern, ""), template.match(pattern)[key]]
36
+ end
37
+
38
+ private
39
+
40
+ attr_reader :pattern, :key
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tone"
4
+
5
+ module Cogger
6
+ module Formatters
7
+ module Processors
8
+ # Processes emojis and colors.
9
+ class Color
10
+ def initialize parser: Parsers::Dynamic.new,
11
+ kit: {sanitizer: Kit::Sanitizer.new, colorizer: Kit::Colorizer},
12
+ registry: Cogger
13
+ @parser = parser
14
+ @kit = kit
15
+ @registry = registry
16
+ end
17
+
18
+ def call(template, *entry)
19
+ attributes = sanitizer.call(*entry)
20
+
21
+ case parser.call template
22
+ in [String => body, String => style] then universal body, style, **attributes
23
+ in [String => body, Hash => styles] then individual body, attributes, styles
24
+ else [template, {}]
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :parser, :kit, :registry
31
+
32
+ def universal body, style, **attributes
33
+ [registry.color[body, colorizer.call(style, attributes)], attributes]
34
+ end
35
+
36
+ def individual body, attributes, styles
37
+ attributes = attributes.each.with_object({}) do |(key, value), collection|
38
+ collection[key] = registry.color[value, colorizer.call(styles[key], attributes)]
39
+ end
40
+
41
+ emojify attributes, styles
42
+ [body, attributes]
43
+ end
44
+
45
+ def emojify attributes, styles
46
+ style = styles[:emoji]
47
+
48
+ return unless style
49
+
50
+ attributes[:emoji] = registry.get_emoji colorizer.call(style, attributes)
51
+ end
52
+
53
+ def sanitizer = kit.fetch :sanitizer
54
+
55
+ def colorizer = kit.fetch :colorizer
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cogger
4
+ module Formatters
5
+ # Formats simple templates that require no additional processing.
6
+ class Simple
7
+ TEMPLATE = "%<message>s"
8
+
9
+ def initialize template = TEMPLATE, sanitizer: Kit::Sanitizer.new
10
+ @template = template
11
+ @sanitizer = sanitizer
12
+ end
13
+
14
+ def call(*entry) = "#{format template, sanitizer.call(*entry)}\n"
15
+
16
+ private
17
+
18
+ attr_reader :template, :sanitizer
19
+ end
20
+ end
21
+ end
data/lib/cogger/hub.rb ADDED
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "logger"
4
+
5
+ module Cogger
6
+ # Loads configuration and simultaneously sends messages to multiple streams.
7
+ class Hub
8
+ def initialize(registry: Cogger, model: Configuration.new, **attributes)
9
+ @registry = registry
10
+ @configuration = model.with(**transform(attributes))
11
+ @mutex = Mutex.new
12
+ @streams = [configuration.to_logger]
13
+ end
14
+
15
+ def add_stream **attributes
16
+ attributes[:id] = configuration.id
17
+ streams.append configuration.with(**transform(attributes)).to_logger
18
+ self
19
+ end
20
+
21
+ def debug(...) = log(__method__, ...)
22
+
23
+ def info(...) = log(__method__, ...)
24
+
25
+ def warn(...) = log(__method__, ...)
26
+
27
+ def error(...) = log(__method__, ...)
28
+
29
+ def fatal(...) = log(__method__, ...)
30
+
31
+ def unknown(...) = log(__method__, ...)
32
+
33
+ alias any unknown
34
+
35
+ def inspect
36
+ %(#<#{self.class} #{configuration.inspect.delete_prefix! "#<Cogger::Configuration "})
37
+ end
38
+
39
+ private
40
+
41
+ attr_reader :registry, :configuration, :mutex, :streams
42
+
43
+ # :reek:FeatureEnvy
44
+ # :reek:TooManyStatements
45
+ def transform attributes
46
+ value = attributes[:formatter]
47
+
48
+ return attributes unless value.is_a?(Symbol) || value.is_a?(String)
49
+
50
+ formatter, template = registry.get_formatter value
51
+ attributes[:formatter] = template ? formatter.new(template) : formatter.new
52
+ attributes
53
+ end
54
+
55
+ # :reek:TooManyStatements
56
+ def log(severity, message = nil, &)
57
+ mutex.synchronize { streams.each { |logger| logger.public_send(severity, message, &) } }
58
+ true
59
+ rescue StandardError => error
60
+ configuration.with(id: "Cogger", io: $stdout, formatter: Formatters::Crash.new)
61
+ .to_logger
62
+ .fatal message:,
63
+ error_message: error.message,
64
+ error_class: error.class,
65
+ backtrace: error.backtrace
66
+ true
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+
5
+ # Provides a function for computing the default program name based on current file.
6
+ module Cogger
7
+ Program = lambda do |name = $PROGRAM_NAME|
8
+ Pathname(name).then { |path| path.basename(path.extname).to_s }
9
+ end
10
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "tone"
4
+
5
+ module Cogger
6
+ # Provides a global regsitry for global configuration.
7
+ module Registry
8
+ def self.extended target
9
+ target.add_alias(:debug, :white)
10
+ .add_alias(:info, :green)
11
+ .add_alias(:warn, :yellow)
12
+ .add_alias(:error, :red)
13
+ .add_alias(:fatal, *%i[bold white on_red])
14
+ .add_alias(:unknown, *%i[bold white])
15
+ .add_alias(:any, *%i[bold white])
16
+ .add_emoji(:debug, "🔎")
17
+ .add_emoji(:info, "🟢")
18
+ .add_emoji(:warn, "⚠️ ")
19
+ .add_emoji(:error, "🛑")
20
+ .add_emoji(:fatal, "🔥")
21
+ .add_filter(:_csrf)
22
+ .add_filter(:password)
23
+ .add_filter(:password_confirmation)
24
+ .add_formatter(:color, Cogger::Formatters::Color)
25
+ .add_formatter(
26
+ :detail,
27
+ Cogger::Formatters::Simple,
28
+ "[%<id>s] [%<severity>s] [%<at>s] %<message>s"
29
+ )
30
+ .add_formatter(
31
+ :emoji,
32
+ Cogger::Formatters::Color,
33
+ "%<emoji:dynamic>s %<message:dynamic>s"
34
+ )
35
+ .add_formatter(:json, Cogger::Formatters::JSON)
36
+ .add_formatter(:simple, Cogger::Formatters::Simple)
37
+ .add_formatter :rack,
38
+ Cogger::Formatters::Simple,
39
+ "[%<id>s] [%<severity>s] [%<at>s] %<verb>s %<status>s %<duration>s " \
40
+ "%<ip>s %<path>s %<length>s %<params>s"
41
+ end
42
+
43
+ def add_alias(key, *styles)
44
+ color.add_alias(key, *styles)
45
+ self
46
+ end
47
+
48
+ def aliases = color.aliases
49
+
50
+ def add_emoji key, value
51
+ emojis[key.to_sym] = value
52
+ self
53
+ end
54
+
55
+ def get_emoji(key) = emojis[key.to_sym]
56
+
57
+ def emojis = @emojis ||= {}
58
+
59
+ def add_filter key
60
+ filters.add key.to_sym
61
+ self
62
+ end
63
+
64
+ def filters = @filters ||= Set.new
65
+
66
+ def add_formatter key, formatter, template = nil
67
+ formatters[key.to_sym] = [formatter, template]
68
+ self
69
+ end
70
+
71
+ def get_formatter(key) = formatters[key.to_sym]
72
+
73
+ def formatters = @formatters ||= {}
74
+
75
+ def color = @color ||= Tone.new
76
+
77
+ def defaults = {emojis: emojis.dup, formatters: formatters.dup}
78
+ end
79
+ end
data/lib/cogger.rb CHANGED
@@ -2,9 +2,19 @@
2
2
 
3
3
  require "zeitwerk"
4
4
 
5
- Zeitwerk::Loader.for_gem.setup
5
+ Zeitwerk::Loader.for_gem.then do |loader|
6
+ loader.inflector.inflect "json" => "JSON"
7
+ loader.setup
8
+ end
6
9
 
7
10
  # Main namespace.
8
11
  module Cogger
9
- def self.init(...) = Client.new(...)
12
+ extend Registry
13
+
14
+ def self.init(...)
15
+ warn "#{self}##{__method__} is deprecated, use `.new` instead.", category: :deprecated
16
+ Client.new(...)
17
+ end
18
+
19
+ def self.new(...) = Hub.new(...)
10
20
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cogger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -10,56 +10,47 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDdjCCAl6gAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZicm9v
13
+ MIIEeDCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZicm9v
14
14
  a2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQBGRYC
15
- aW8wHhcNMjMwMzIyMDI1MDUzWhcNMjQwMzIxMDI1MDUzWjBBMQ8wDQYDVQQDDAZi
15
+ aW8wHhcNMjMwMzIyMTYxNDQxWhcNMjUwMzIxMTYxNDQxWjBBMQ8wDQYDVQQDDAZi
16
16
  cm9va2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQB
17
- GRYCaW8wggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAwggEIAoIBAQDN48o0vC52F2Tm
18
- +GVuhHer6sZx58nshIUHVXbD/4y5Xd798rmAtPMlwFEyvvx68wqvS+Wv96T7FckJ
19
- 1GxNDo7Sr9qtX/ZuFtGXuR9XLiffHB9OS/66XsbGEa3JbhWzvM3wEvGbI/mmzuCC
20
- lWhcu4fsGYSwBtDdu1sXXDBzw2fPvQMSUg1pTczZritU2loGIk13u2Swic1b1t+g
21
- M90d9DIWUruyMvXvTlWwmgR5TJJBWmdN28r1AeK+CK4JuKtcmrbVRm5pJu/NCEVY
22
- GK2pW2GNyH/Uhr3GURG/62CTZajgasAPCMRA6fDF3qMC5x7k8VIBHHI4C9Q+ZxMZ
23
- bf2f5LDFAgEjo3sweTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU
24
- o8O4DUt12YAn26VApVf0Ay2LPaQwHwYDVR0RBBgwFoEUYnJvb2tlQGFsY2hlbWlz
25
- dHMuaW8wHwYDVR0SBBgwFoEUYnJvb2tlQGFsY2hlbWlzdHMuaW8wDQYJKoZIhvcN
26
- AQELBQADggEBAMu9b3FOh7yAIsUwpdqRaUbqNcLkfdHOO6siBKjQmyNwXwuNsL3K
27
- jrlf1cZjK4k7pfLnDQOh2y519gjYI5a89BO1y/kHIa+2gxYOcBYFnxwhYkeCElw7
28
- M7IF60Kx1oA+CAnHKQiZhYza3oPqq+HnXEIaQ1yotEEGFPexrVjPT3tswNkt0MUh
29
- 3VkmTWI8jdDdgVWe6VYA/SbV66QKMfjo6FhQOAg3r/j61p8ZrYSif9jupwwR/vPW
30
- PeEy3IGK1LEEwzEikz3Q0ebJHITVsm7UFiyrOn2Wk2Omh33+G65HC/cXRK8h1bLM
31
- mBOOp3pATPxRweMKsY4hosuFEwweI8Btwaw=
17
+ GRYCaW8wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCro8tj5/E1Hg88
18
+ f4qfiwPVd2zJQHvdYt4GHVvuHRRgx4HGhJuNp+4BId08RBn7V6V1MW6MY3kezRBs
19
+ M+7QOQ4b1xNLTvY7FYQB1wGK5a4x7TTokDrPYQxDB2jmsdDYCzVbIMrAvUfcecRi
20
+ khyGZCdByiiCl4fKv77P12tTT+NfsvXkLt/AYCGwjOUyGKTQ01Z6eC09T27GayPH
21
+ QQvIkakyFgcJtzSyGzs8bzK5q9u7wQ12MNTjJoXzW69lqp0oNvDylu81EiSUb5S6
22
+ QzzPxZBiRB1sgtbt1gUbVI262ZDq1gR+HxPFmp+Cgt7ZLIJZAtesQvtcMzseXpfn
23
+ hpmm0Sw22KGhRAy/mqHBRhDl5HqS1SJp2Ko3lcnpXeFResp0HNlt8NSu13vhC08j
24
+ GUHU9MyIXbFOsnp3K3ADrAVjPWop8EZkmUR3MV/CUm00w2cZHCSGiXl1KMpiVKvk
25
+ Ywr1gd2ZME4QLSo+EXUtLxDUa/W3xnBS8dBOuMMz02FPWYr3PN8CAwEAAaN7MHkw
26
+ CQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFAFgmv0tYMZnItuPycSM
27
+ F5wykJEVMB8GA1UdEQQYMBaBFGJyb29rZUBhbGNoZW1pc3RzLmlvMB8GA1UdEgQY
28
+ MBaBFGJyb29rZUBhbGNoZW1pc3RzLmlvMA0GCSqGSIb3DQEBCwUAA4IBgQAX+EGY
29
+ 9RLYGxF1VLZz+G1ACQc4uyrCB6kXwI06kzUa5dF9tPXqTX9ffnz3/W8ck2IQhKzu
30
+ MKO2FVijzbDWTsZeZGglS4E+4Jxpau1lU9HhOIcKolv6LeC6UdALTFudY+GLb8Xw
31
+ REXgaJkjzzhkUSILmEnRwEbY08dVSl7ZAaxVI679vfI2yapLlIwpbBgmQTiTvPr3
32
+ qyyLUno9flYEOv9fmGHunSrM+gE0/0niGTXa5GgXBXYGS2he4LQGgSBfGp/cTwMU
33
+ rDKJRcusZ12lNBeDfgqACz/BBJF8FLodgk6rGMRZz7+ZmjjHEmpG5bQpR6Q2BuWL
34
+ XMtYk/QzaWuhiR7pWjiF8jbdd7RO6or0ohq7iFkokz/5xrtQ/vPzU2RQ3Qc6YaKw
35
+ 3n5C8/6Zh9DYTkpcwPSuIfAga6wf4nXc9m6JAw8AuMLaiWN/r/2s4zJsUHYERJEu
36
+ gZGm4JqtuSg8pYjPeIJxS960owq+SfuC+jxqmRA54BisFCv/0VOJi7tiJVY=
32
37
  -----END CERTIFICATE-----
33
- date: 2023-03-22 00:00:00.000000000 Z
38
+ date: 2023-04-10 00:00:00.000000000 Z
34
39
  dependencies:
35
40
  - !ruby/object:Gem::Dependency
36
- name: pastel
41
+ name: tone
37
42
  requirement: !ruby/object:Gem::Requirement
38
43
  requirements:
39
44
  - - "~>"
40
45
  - !ruby/object:Gem::Version
41
- version: '0.8'
46
+ version: '0.1'
42
47
  type: :runtime
43
48
  prerelease: false
44
49
  version_requirements: !ruby/object:Gem::Requirement
45
50
  requirements:
46
51
  - - "~>"
47
52
  - !ruby/object:Gem::Version
48
- version: '0.8'
49
- - !ruby/object:Gem::Dependency
50
- name: refinements
51
- requirement: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - "~>"
54
- - !ruby/object:Gem::Version
55
- version: '10.0'
56
- type: :runtime
57
- prerelease: false
58
- version_requirements: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - "~>"
61
- - !ruby/object:Gem::Version
62
- version: '10.0'
53
+ version: '0.1'
63
54
  - !ruby/object:Gem::Dependency
64
55
  name: zeitwerk
65
56
  requirement: !ruby/object:Gem::Requirement
@@ -88,7 +79,20 @@ files:
88
79
  - cogger.gemspec
89
80
  - lib/cogger.rb
90
81
  - lib/cogger/client.rb
91
- - lib/cogger/color.rb
82
+ - lib/cogger/configuration.rb
83
+ - lib/cogger/formatters/color.rb
84
+ - lib/cogger/formatters/crash.rb
85
+ - lib/cogger/formatters/json.rb
86
+ - lib/cogger/formatters/kit/colorizer.rb
87
+ - lib/cogger/formatters/kit/sanitizer.rb
88
+ - lib/cogger/formatters/parsers/dynamic.rb
89
+ - lib/cogger/formatters/parsers/individual.rb
90
+ - lib/cogger/formatters/parsers/universal.rb
91
+ - lib/cogger/formatters/processors/color.rb
92
+ - lib/cogger/formatters/simple.rb
93
+ - lib/cogger/hub.rb
94
+ - lib/cogger/program.rb
95
+ - lib/cogger/registry.rb
92
96
  homepage: https://alchemists.io/projects/cogger
93
97
  licenses:
94
98
  - Hippocratic-2.1
@@ -115,8 +119,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
119
  - !ruby/object:Gem::Version
116
120
  version: '0'
117
121
  requirements: []
118
- rubygems_version: 3.4.8
122
+ rubygems_version: 3.4.10
119
123
  signing_key:
120
124
  specification_version: 4
121
- summary: Decorates native logging with colorized output.
125
+ summary: A customizable logger.
122
126
  test_files: []
metadata.gz.sig CHANGED
Binary file