tty-logger 0.1.0 → 0.6.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
- data/CHANGELOG.md +62 -0
- data/README.md +300 -48
- data/lib/tty/logger.rb +187 -51
- data/lib/tty/logger/config.rb +63 -5
- data/lib/tty/logger/data_filter.rb +118 -0
- data/lib/tty/logger/event.rb +2 -2
- data/lib/tty/logger/formatters/json.rb +3 -4
- data/lib/tty/logger/formatters/text.rb +7 -6
- data/lib/tty/logger/handlers/base.rb +13 -0
- data/lib/tty/logger/handlers/console.rb +37 -14
- data/lib/tty/logger/levels.rb +34 -18
- data/lib/tty/logger/version.rb +3 -3
- metadata +15 -52
- data/Rakefile +0 -8
- data/examples/console.rb +0 -22
- data/examples/error.rb +0 -11
- data/examples/handler.rb +0 -19
- data/examples/output.rb +0 -15
- data/examples/override.rb +0 -29
- data/examples/stream.rb +0 -22
- data/spec/spec_helper.rb +0 -31
- data/spec/unit/add_handler_spec.rb +0 -25
- data/spec/unit/config_spec.rb +0 -107
- data/spec/unit/event_spec.rb +0 -22
- data/spec/unit/exception_spec.rb +0 -45
- data/spec/unit/formatter_spec.rb +0 -70
- data/spec/unit/formatters/json_spec.rb +0 -41
- data/spec/unit/formatters/text_spec.rb +0 -82
- data/spec/unit/handler_spec.rb +0 -83
- data/spec/unit/handlers/custom_spec.rb +0 -26
- data/spec/unit/handlers/null_spec.rb +0 -15
- data/spec/unit/handlers/stream_spec.rb +0 -72
- data/spec/unit/levels_spec.rb +0 -40
- data/spec/unit/log_metadata_spec.rb +0 -55
- data/spec/unit/log_spec.rb +0 -144
- data/spec/unit/output_spec.rb +0 -40
- data/tasks/console.rake +0 -11
- data/tasks/coverage.rake +0 -11
- data/tasks/spec.rake +0 -29
- data/tty-logger.gemspec +0 -35
@@ -0,0 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class Logger
|
5
|
+
class DataFilter
|
6
|
+
FILTERED = "[FILTERED]"
|
7
|
+
DOT = "."
|
8
|
+
|
9
|
+
attr_reader :filters, :compiled_filters, :mask
|
10
|
+
|
11
|
+
# Create a data filter instance with filters.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# TTY::Logger::DataFilter.new(%w[foo], mask: "<SECRET>")
|
15
|
+
#
|
16
|
+
# @param [String] mask
|
17
|
+
# the mask to replace object with. Defaults to `"[FILTERED]"`
|
18
|
+
#
|
19
|
+
# @api private
|
20
|
+
def initialize(filters = [], mask: nil)
|
21
|
+
@mask = mask || FILTERED
|
22
|
+
@filters = filters
|
23
|
+
@compiled_filters = compile(filters)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Filter object for keys matching provided filters.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# data_filter = TTY::Logger::DataFilter.new(%w[foo])
|
30
|
+
# data_filter.filter({"foo" => "bar"})
|
31
|
+
# # => {"foo" => "[FILTERED]"}
|
32
|
+
#
|
33
|
+
# @param [Object] obj
|
34
|
+
# the object to filter
|
35
|
+
#
|
36
|
+
# @api public
|
37
|
+
def filter(obj)
|
38
|
+
return obj if filters.empty?
|
39
|
+
|
40
|
+
obj.each_with_object({}) do |(k, v), acc|
|
41
|
+
acc[k] = filter_val(k, v)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def compile(filters)
|
48
|
+
compiled = {
|
49
|
+
regexps: [],
|
50
|
+
nested_regexps: [],
|
51
|
+
blocks: []
|
52
|
+
}
|
53
|
+
strings = []
|
54
|
+
nested_strings = []
|
55
|
+
|
56
|
+
filters.each do |filter|
|
57
|
+
case filter
|
58
|
+
when Proc
|
59
|
+
compiled[:blocks] << filter
|
60
|
+
when Regexp
|
61
|
+
if filter.to_s.include?(DOT)
|
62
|
+
compiled[:nested_regexps] << filter
|
63
|
+
else
|
64
|
+
compiled[:regexps] << filter
|
65
|
+
end
|
66
|
+
else
|
67
|
+
exp = Regexp.escape(filter)
|
68
|
+
if exp.include?(DOT)
|
69
|
+
nested_strings << exp
|
70
|
+
else
|
71
|
+
strings << exp
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
if !strings.empty?
|
77
|
+
compiled[:regexps] << /^(#{strings.join("|")})$/
|
78
|
+
end
|
79
|
+
|
80
|
+
if !nested_strings.empty?
|
81
|
+
compiled[:nested_regexps] << /^(#{nested_strings.join("|")})$/
|
82
|
+
end
|
83
|
+
|
84
|
+
compiled
|
85
|
+
end
|
86
|
+
|
87
|
+
def filter_val(key, val, composite = [])
|
88
|
+
return mask if filtered?(key, composite)
|
89
|
+
|
90
|
+
case val
|
91
|
+
when Hash then filter_obj(key, val, composite << key)
|
92
|
+
when Array then filter_arr(key, val, composite)
|
93
|
+
else val
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def filtered?(key, composite)
|
98
|
+
composite_key = composite + [key]
|
99
|
+
joined_key = composite_key.join(DOT)
|
100
|
+
@compiled_filters[:regexps].any? { |reg| !!reg.match(key.to_s) } ||
|
101
|
+
@compiled_filters[:nested_regexps].any? { |reg| !!reg.match(joined_key) } ||
|
102
|
+
@compiled_filters[:blocks].any? { |block| block.(composite_key.dup) }
|
103
|
+
end
|
104
|
+
|
105
|
+
def filter_obj(_key, obj, composite)
|
106
|
+
obj.each_with_object({}) do |(k, v), acc|
|
107
|
+
acc[k] = filter_val(k, v, composite)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def filter_arr(key, obj, composite)
|
112
|
+
obj.reduce([]) do |acc, v|
|
113
|
+
acc << filter_val(key, v, composite)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end # DataFilter
|
117
|
+
end # Logger
|
118
|
+
end # TTY
|
data/lib/tty/logger/event.rb
CHANGED
@@ -11,7 +11,7 @@ module TTY
|
|
11
11
|
|
12
12
|
attr_reader :backtrace
|
13
13
|
|
14
|
-
def initialize(message, fields, metadata)
|
14
|
+
def initialize(message, fields = {}, metadata = {})
|
15
15
|
@message = message
|
16
16
|
@fields = fields
|
17
17
|
@metadata = metadata
|
@@ -29,7 +29,7 @@ module TTY
|
|
29
29
|
@message.each do |msg|
|
30
30
|
case msg
|
31
31
|
when Exception
|
32
|
-
@backtrace = msg.backtrace
|
32
|
+
@backtrace = msg.backtrace if msg.backtrace
|
33
33
|
else
|
34
34
|
msg
|
35
35
|
end
|
@@ -20,7 +20,7 @@ module TTY
|
|
20
20
|
def dump(obj, max_bytes: 2**12, max_depth: 3)
|
21
21
|
bytesize = 0
|
22
22
|
|
23
|
-
hash = obj.
|
23
|
+
hash = obj.each_with_object({}) do |(k, v), acc|
|
24
24
|
str = (k.to_json + v.to_json)
|
25
25
|
items = acc.keys.size - 1
|
26
26
|
|
@@ -31,7 +31,6 @@ module TTY
|
|
31
31
|
bytesize += str.bytesize
|
32
32
|
acc[k] = dump_val(v, max_depth)
|
33
33
|
end
|
34
|
-
acc
|
35
34
|
end
|
36
35
|
::JSON.generate(hash)
|
37
36
|
end
|
@@ -50,13 +49,13 @@ module TTY
|
|
50
49
|
def enc_obj(obj, depth)
|
51
50
|
return ELLIPSIS if depth.zero?
|
52
51
|
|
53
|
-
obj.
|
52
|
+
obj.each_with_object({}) { |(k, v), acc| acc[k] = dump_val(v, depth) }
|
54
53
|
end
|
55
54
|
|
56
55
|
def enc_arr(obj, depth)
|
57
56
|
return ELLIPSIS if depth.zero?
|
58
57
|
|
59
|
-
obj.
|
58
|
+
obj.each_with_object([]) { |v, acc| acc << dump_val(v, depth) }
|
60
59
|
end
|
61
60
|
end # JSON
|
62
61
|
end # Formatters
|
@@ -32,12 +32,13 @@ module TTY
|
|
32
32
|
def dump(obj, max_bytes: 2**12, max_depth: 3)
|
33
33
|
bytesize = 0
|
34
34
|
|
35
|
-
line = obj.
|
35
|
+
line = obj.each_with_object([]) do |(k, v), acc|
|
36
36
|
str = "#{dump_key(k)}=#{dump_val(v, max_depth)}"
|
37
37
|
items = acc.size - 1
|
38
38
|
|
39
39
|
if bytesize + str.bytesize + items > max_bytes
|
40
|
-
if bytesize + items +
|
40
|
+
if bytesize + items +
|
41
|
+
(acc[-1].bytesize - ELLIPSIS.bytesize) > max_bytes
|
41
42
|
acc.pop
|
42
43
|
end
|
43
44
|
acc << ELLIPSIS
|
@@ -46,7 +47,6 @@ module TTY
|
|
46
47
|
bytesize += str.bytesize
|
47
48
|
acc << str
|
48
49
|
end
|
49
|
-
acc
|
50
50
|
end
|
51
51
|
line.join(SPACE)
|
52
52
|
end
|
@@ -86,8 +86,8 @@ module TTY
|
|
86
86
|
return LBRACE + ELLIPSIS + RBRACE if depth.zero?
|
87
87
|
|
88
88
|
LBRACE +
|
89
|
-
obj.map { |k, v| "#{dump_key(k)}=#{dump_val(v, depth)}" }
|
90
|
-
|
89
|
+
obj.map { |k, v| "#{dump_key(k)}=#{dump_val(v, depth)}" }
|
90
|
+
.join(SPACE) + RBRACE
|
91
91
|
end
|
92
92
|
|
93
93
|
def enc_arr(array, depth)
|
@@ -113,7 +113,8 @@ module TTY
|
|
113
113
|
case str
|
114
114
|
when SINGLE_QUOTE_REGEX
|
115
115
|
str.inspect
|
116
|
-
when ESCAPE_STR_REGEX, LITERAL_TRUE, LITERAL_FALSE,
|
116
|
+
when ESCAPE_STR_REGEX, LITERAL_TRUE, LITERAL_FALSE,
|
117
|
+
LITERAL_NIL, NUM_REGEX
|
117
118
|
ESCAPE_DOUBLE_QUOTE + str.inspect[1..-2] + ESCAPE_DOUBLE_QUOTE
|
118
119
|
else
|
119
120
|
str
|
@@ -4,6 +4,19 @@ module TTY
|
|
4
4
|
class Logger
|
5
5
|
module Handlers
|
6
6
|
module Base
|
7
|
+
# Change current log level for the duration of the block
|
8
|
+
#
|
9
|
+
# @param [String] tmp_level
|
10
|
+
# the temporary log level
|
11
|
+
#
|
12
|
+
# @api public
|
13
|
+
def log_at(tmp_level)
|
14
|
+
old_level, @level = level, tmp_level
|
15
|
+
yield
|
16
|
+
ensure
|
17
|
+
@level = old_level
|
18
|
+
end
|
19
|
+
|
7
20
|
# Coerce formatter name into constant
|
8
21
|
#
|
9
22
|
# @api private
|
@@ -55,23 +55,44 @@ module TTY
|
|
55
55
|
color: :cyan,
|
56
56
|
levelpad: 0
|
57
57
|
}
|
58
|
-
}
|
58
|
+
}.freeze
|
59
59
|
|
60
|
+
TEXT_REGEXP = /([{}()\[\]])?(["']?)(\S+?)(["']?=)/.freeze
|
61
|
+
JSON_REGEXP = /\"([^,]+?)\"(?=:)/.freeze
|
62
|
+
|
63
|
+
COLOR_PATTERNS = {
|
64
|
+
text: [TEXT_REGEXP, ->(c) { "\\1\\2" + c.("\\3") + "\\4" }],
|
65
|
+
json: [JSON_REGEXP, ->(c) { "\"" + c.("\\1") + "\"" }]
|
66
|
+
}.freeze
|
67
|
+
|
68
|
+
# The output stream
|
69
|
+
# @api private
|
60
70
|
attr_reader :output
|
61
71
|
|
72
|
+
# The configuration options
|
73
|
+
# @api private
|
62
74
|
attr_reader :config
|
63
75
|
|
76
|
+
# The logging level
|
77
|
+
# @api private
|
64
78
|
attr_reader :level
|
65
79
|
|
80
|
+
# The format for the message
|
81
|
+
# @api private
|
82
|
+
attr_reader :message_format
|
83
|
+
|
66
84
|
def initialize(output: $stderr, formatter: nil, config: nil, level: nil,
|
67
|
-
styles: {})
|
85
|
+
styles: {}, enable_color: nil, message_format: "%-25s")
|
68
86
|
@output = Array[output].flatten
|
69
87
|
@formatter = coerce_formatter(formatter || config.formatter).new
|
88
|
+
@formatter_name = @formatter.class.name.split("::").last.downcase
|
89
|
+
@color_pattern = COLOR_PATTERNS[@formatter_name.to_sym]
|
70
90
|
@config = config
|
71
91
|
@styles = styles
|
72
92
|
@level = level || @config.level
|
73
93
|
@mutex = Mutex.new
|
74
|
-
@pastel = Pastel.new
|
94
|
+
@pastel = Pastel.new(enabled: enable_color)
|
95
|
+
@message_format = message_format
|
75
96
|
end
|
76
97
|
|
77
98
|
# Handle log event output in format
|
@@ -104,14 +125,16 @@ module TTY
|
|
104
125
|
end
|
105
126
|
end
|
106
127
|
fmt << ARROW unless config.metadata.empty?
|
107
|
-
|
108
|
-
|
109
|
-
|
128
|
+
unless style.empty?
|
129
|
+
fmt << color.(style[:symbol])
|
130
|
+
fmt << color.(style[:label]) + (" " * style[:levelpad])
|
131
|
+
end
|
132
|
+
fmt << message_format % event.message.join(" ")
|
110
133
|
unless event.fields.empty?
|
134
|
+
pattern, replacement = *@color_pattern
|
111
135
|
fmt << @formatter.dump(event.fields, max_bytes: config.max_bytes,
|
112
|
-
|
113
|
-
|
114
|
-
gsub(/\"([^,]+?)\"(?=:)/, "\"" + color.("\\1") + "\"")
|
136
|
+
max_depth: config.max_depth)
|
137
|
+
.gsub(pattern, replacement.(color))
|
115
138
|
end
|
116
139
|
unless event.backtrace.empty?
|
117
140
|
fmt << "\n" + format_backtrace(event)
|
@@ -138,11 +161,11 @@ module TTY
|
|
138
161
|
#
|
139
162
|
# @api private
|
140
163
|
def configure_styles(event)
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
164
|
+
return {} if event.metadata[:name].nil?
|
165
|
+
|
166
|
+
STYLES.fetch(event.metadata[:name].to_sym, {})
|
167
|
+
.dup
|
168
|
+
.merge!(@styles[event.metadata[:name].to_sym] || {})
|
146
169
|
end
|
147
170
|
|
148
171
|
def configure_color(style)
|
data/lib/tty/logger/levels.rb
CHANGED
@@ -10,41 +10,57 @@ module TTY
|
|
10
10
|
FATAL_LEVEL = 4
|
11
11
|
|
12
12
|
LEVEL_NAMES = {
|
13
|
-
DEBUG_LEVEL
|
14
|
-
INFO_LEVEL
|
15
|
-
WARN_LEVEL
|
16
|
-
ERROR_LEVEL
|
17
|
-
FATAL_LEVEL
|
18
|
-
}
|
13
|
+
debug: DEBUG_LEVEL,
|
14
|
+
info: INFO_LEVEL,
|
15
|
+
warn: WARN_LEVEL,
|
16
|
+
error: ERROR_LEVEL,
|
17
|
+
fatal: FATAL_LEVEL
|
18
|
+
}.freeze
|
19
19
|
|
20
|
+
# All the default level names
|
21
|
+
#
|
22
|
+
# @return [Array[Symbol]]
|
23
|
+
#
|
24
|
+
# @api private
|
20
25
|
def level_names
|
21
|
-
|
26
|
+
LEVEL_NAMES.keys
|
22
27
|
end
|
23
28
|
|
29
|
+
# Convert level name to level number
|
30
|
+
#
|
31
|
+
# @param [Symbol] level
|
32
|
+
#
|
33
|
+
# @return [Integer]
|
34
|
+
#
|
24
35
|
# @api private
|
25
36
|
def level_to_number(level)
|
26
|
-
|
27
|
-
|
28
|
-
when "info" then INFO_LEVEL
|
29
|
-
when "warn" then WARN_LEVEL
|
30
|
-
when "error" then ERROR_LEVEL
|
31
|
-
when "fatal" then FATAL_LEVEL
|
32
|
-
else
|
33
|
-
raise ArgumentError, "Invalid level #{level.inspect}"
|
34
|
-
end
|
37
|
+
LEVEL_NAMES[level.to_s.downcase.to_sym] ||
|
38
|
+
raise(ArgumentError, "Invalid level #{level.inspect}")
|
35
39
|
end
|
36
40
|
|
41
|
+
# Convert level number to level name
|
42
|
+
#
|
43
|
+
# @param [Integer] number
|
44
|
+
#
|
45
|
+
# @return [Symbol]
|
46
|
+
#
|
37
47
|
# @api private
|
38
|
-
def number_to_level(
|
39
|
-
LEVEL_NAMES
|
48
|
+
def number_to_level(number)
|
49
|
+
LEVEL_NAMES.key(number)
|
40
50
|
end
|
41
51
|
|
52
|
+
# Compares two levels by name or number
|
53
|
+
#
|
54
|
+
# @return [Symbol]
|
55
|
+
# either :lt, :gt or :eq
|
56
|
+
#
|
42
57
|
# @api private
|
43
58
|
def compare_levels(left, right)
|
44
59
|
left = left.is_a?(Integer) ? left : level_to_number(left)
|
45
60
|
right = right.is_a?(Integer) ? right : level_to_number(right)
|
46
61
|
|
47
62
|
return :eq if left == right
|
63
|
+
|
48
64
|
left < right ? :lt : :gt
|
49
65
|
end
|
50
66
|
end # Levels
|
data/lib/tty/logger/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tty-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pastel
|
@@ -16,28 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: '0.8'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.5'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.5'
|
26
|
+
version: '0.8'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rake
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,36 +42,33 @@ dependencies:
|
|
56
42
|
name: rspec
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
|
-
- - "
|
45
|
+
- - ">="
|
60
46
|
- !ruby/object:Gem::Version
|
61
47
|
version: '3.0'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
|
-
- - "
|
52
|
+
- - ">="
|
67
53
|
- !ruby/object:Gem::Version
|
68
54
|
version: '3.0'
|
69
55
|
description: Readable, structured and beautiful terminal logging
|
70
56
|
email:
|
71
|
-
-
|
57
|
+
- piotr@piotrmurach.com
|
72
58
|
executables: []
|
73
59
|
extensions: []
|
74
|
-
extra_rdoc_files:
|
60
|
+
extra_rdoc_files:
|
61
|
+
- README.md
|
62
|
+
- CHANGELOG.md
|
63
|
+
- LICENSE.txt
|
75
64
|
files:
|
76
65
|
- CHANGELOG.md
|
77
66
|
- LICENSE.txt
|
78
67
|
- README.md
|
79
|
-
- Rakefile
|
80
|
-
- examples/console.rb
|
81
|
-
- examples/error.rb
|
82
|
-
- examples/handler.rb
|
83
|
-
- examples/output.rb
|
84
|
-
- examples/override.rb
|
85
|
-
- examples/stream.rb
|
86
68
|
- lib/tty-logger.rb
|
87
69
|
- lib/tty/logger.rb
|
88
70
|
- lib/tty/logger/config.rb
|
71
|
+
- lib/tty/logger/data_filter.rb
|
89
72
|
- lib/tty/logger/event.rb
|
90
73
|
- lib/tty/logger/formatters/json.rb
|
91
74
|
- lib/tty/logger/formatters/text.rb
|
@@ -95,27 +78,7 @@ files:
|
|
95
78
|
- lib/tty/logger/handlers/stream.rb
|
96
79
|
- lib/tty/logger/levels.rb
|
97
80
|
- lib/tty/logger/version.rb
|
98
|
-
|
99
|
-
- spec/unit/add_handler_spec.rb
|
100
|
-
- spec/unit/config_spec.rb
|
101
|
-
- spec/unit/event_spec.rb
|
102
|
-
- spec/unit/exception_spec.rb
|
103
|
-
- spec/unit/formatter_spec.rb
|
104
|
-
- spec/unit/formatters/json_spec.rb
|
105
|
-
- spec/unit/formatters/text_spec.rb
|
106
|
-
- spec/unit/handler_spec.rb
|
107
|
-
- spec/unit/handlers/custom_spec.rb
|
108
|
-
- spec/unit/handlers/null_spec.rb
|
109
|
-
- spec/unit/handlers/stream_spec.rb
|
110
|
-
- spec/unit/levels_spec.rb
|
111
|
-
- spec/unit/log_metadata_spec.rb
|
112
|
-
- spec/unit/log_spec.rb
|
113
|
-
- spec/unit/output_spec.rb
|
114
|
-
- tasks/console.rake
|
115
|
-
- tasks/coverage.rake
|
116
|
-
- tasks/spec.rake
|
117
|
-
- tty-logger.gemspec
|
118
|
-
homepage: https://piotrmurach.github.io/tty
|
81
|
+
homepage: https://ttytoolkit.org
|
119
82
|
licenses:
|
120
83
|
- MIT
|
121
84
|
metadata:
|
@@ -123,7 +86,7 @@ metadata:
|
|
123
86
|
bug_tracker_uri: https://github.com/piotrmurach/tty-logger/issues
|
124
87
|
changelog_uri: https://github.com/piotrmurach/tty-logger/blob/master/CHANGELOG.md
|
125
88
|
documentation_uri: https://www.rubydoc.info/gems/tty-logger
|
126
|
-
homepage_uri: https://
|
89
|
+
homepage_uri: https://ttytoolkit.org
|
127
90
|
source_code_uri: https://github.com/piotrmurach/tty-logger
|
128
91
|
post_install_message:
|
129
92
|
rdoc_options: []
|
@@ -140,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
103
|
- !ruby/object:Gem::Version
|
141
104
|
version: '0'
|
142
105
|
requirements: []
|
143
|
-
rubygems_version: 3.
|
106
|
+
rubygems_version: 3.1.2
|
144
107
|
signing_key:
|
145
108
|
specification_version: 4
|
146
109
|
summary: Readable, structured and beautiful terminal logging
|