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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.adoc +338 -99
- data/cogger.gemspec +3 -4
- data/lib/cogger/client.rb +3 -2
- data/lib/cogger/configuration.rb +48 -0
- data/lib/cogger/formatters/color.rb +24 -0
- data/lib/cogger/formatters/crash.rb +30 -0
- data/lib/cogger/formatters/json.rb +30 -0
- data/lib/cogger/formatters/kit/colorizer.rb +12 -0
- data/lib/cogger/formatters/kit/sanitizer.rb +37 -0
- data/lib/cogger/formatters/parsers/dynamic.rb +30 -0
- data/lib/cogger/formatters/parsers/individual.rb +61 -0
- data/lib/cogger/formatters/parsers/universal.rb +44 -0
- data/lib/cogger/formatters/processors/color.rb +59 -0
- data/lib/cogger/formatters/simple.rb +21 -0
- data/lib/cogger/hub.rb +69 -0
- data/lib/cogger/program.rb +10 -0
- data/lib/cogger/registry.rb +79 -0
- data/lib/cogger.rb +12 -2
- data.tar.gz.sig +0 -0
- metadata +43 -39
- metadata.gz.sig +0 -0
- data/lib/cogger/color.rb +0 -43
@@ -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.
|
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
|
-
|
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.
|
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
|
-
|
13
|
+
MIIEeDCCAuCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBBMQ8wDQYDVQQDDAZicm9v
|
14
14
|
a2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQBGRYC
|
15
|
-
|
15
|
+
aW8wHhcNMjMwMzIyMTYxNDQxWhcNMjUwMzIxMTYxNDQxWjBBMQ8wDQYDVQQDDAZi
|
16
16
|
cm9va2UxGjAYBgoJkiaJk/IsZAEZFgphbGNoZW1pc3RzMRIwEAYKCZImiZPyLGQB
|
17
|
-
|
18
|
-
+
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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-
|
38
|
+
date: 2023-04-10 00:00:00.000000000 Z
|
34
39
|
dependencies:
|
35
40
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
41
|
+
name: tone
|
37
42
|
requirement: !ruby/object:Gem::Requirement
|
38
43
|
requirements:
|
39
44
|
- - "~>"
|
40
45
|
- !ruby/object:Gem::Version
|
41
|
-
version: '0.
|
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.
|
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/
|
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.
|
122
|
+
rubygems_version: 3.4.10
|
119
123
|
signing_key:
|
120
124
|
specification_version: 4
|
121
|
-
summary:
|
125
|
+
summary: A customizable logger.
|
122
126
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|