cogger 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|