extended_logger 0.2.7 → 0.3.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/lib/extended_logger.rb +5 -2
- data/lib/extended_logger/colors.rb +50 -0
- data/lib/extended_logger/colors/pack.rb +47 -0
- data/lib/extended_logger/colors/unpack.rb +55 -0
- data/lib/extended_logger/define.rb +55 -0
- data/lib/extended_logger/extended_logger.rb +21 -76
- data/lib/extended_logger/formatter.rb +20 -78
- metadata +5 -3
- data/lib/extended_logger/factory.rb +0 -61
- data/lib/extended_logger/null_logger.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12acc57301fb31c71adadd859ed1e9227adf4e38
|
4
|
+
data.tar.gz: 15e746abb842188e8c1f2d4786f9c7161d35dc60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19703c7afe912c2c68227efc333641b5d520f98688f73ca23c05261f6bb5984d93e2e6796af3d4593006db05bcd631c9dc66e07bc4d7864358b0aa4c8f4813ec
|
7
|
+
data.tar.gz: c32d52b617a488dd072899e87e2f1d09a268e4a3a71d4878bbd5186d20e060b9d97e8ea2f26fbc696451765414aa46d829ba40966d234843454920124d74ceb2
|
data/lib/extended_logger.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
3
|
require 'extended_logger/extended_logger'
|
4
|
-
|
4
|
+
|
5
|
+
require 'extended_logger/colors'
|
6
|
+
require 'extended_logger/colors/pack'
|
7
|
+
require 'extended_logger/colors/unpack'
|
8
|
+
require 'extended_logger/define'
|
5
9
|
require 'extended_logger/formatter'
|
6
|
-
require 'extended_logger/null_logger'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class ExtendedLogger
|
2
|
+
module Colors
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def apply text, fg:, bg:;
|
6
|
+
fg = Colors.index fg
|
7
|
+
bg = Colors.index bg
|
8
|
+
|
9
|
+
if fg
|
10
|
+
if fg > 8 then fg = "1;3#{fg - 8}" else fg = "0;3#{fg}" end
|
11
|
+
text.insert 0, "\e[#{fg}m"
|
12
|
+
end
|
13
|
+
|
14
|
+
if bg
|
15
|
+
if bg > 8 then bg = "4#{bg - 8}" else bg = "4#{bg}" end
|
16
|
+
text.insert 0, "\e[#{bg}m"
|
17
|
+
end
|
18
|
+
|
19
|
+
text.insert -1, "\e[0m" if fg or bg
|
20
|
+
end
|
21
|
+
|
22
|
+
def pack mapping=nil
|
23
|
+
Pack.(mapping)
|
24
|
+
end
|
25
|
+
|
26
|
+
def unpack data
|
27
|
+
Unpack.(data)
|
28
|
+
end
|
29
|
+
|
30
|
+
Colors = %i(
|
31
|
+
black
|
32
|
+
red
|
33
|
+
green
|
34
|
+
brown
|
35
|
+
blue
|
36
|
+
magenta
|
37
|
+
cyan
|
38
|
+
gray
|
39
|
+
|
40
|
+
dark_gray
|
41
|
+
bright_red
|
42
|
+
bright_green
|
43
|
+
yellow
|
44
|
+
bright_blue
|
45
|
+
bright_magenta
|
46
|
+
bright_cyan
|
47
|
+
white
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class ExtendedLogger
|
2
|
+
module Colors
|
3
|
+
class Pack
|
4
|
+
attr_reader :mapping
|
5
|
+
|
6
|
+
def initialize mapping
|
7
|
+
@mapping = mapping
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.call mapping=nil
|
11
|
+
mapping ||= {}
|
12
|
+
|
13
|
+
instance = new mapping
|
14
|
+
instance.()
|
15
|
+
end
|
16
|
+
|
17
|
+
def call
|
18
|
+
output = ''.encode 'US-ASCII'
|
19
|
+
|
20
|
+
mapping.sort.each do |level_name, hash|
|
21
|
+
fg, bg = hash.values_at(:fg, :bg).map do |color_name|
|
22
|
+
color_code color_name
|
23
|
+
end
|
24
|
+
|
25
|
+
output << ',' unless output.empty?
|
26
|
+
output << "#{level_name.upcase}=#{fg};#{bg}"
|
27
|
+
end
|
28
|
+
|
29
|
+
Unpack.(output)
|
30
|
+
|
31
|
+
output
|
32
|
+
end
|
33
|
+
|
34
|
+
def color_code color_name
|
35
|
+
return '?'.freeze if color_name == :none
|
36
|
+
|
37
|
+
number = Colors.index color_name
|
38
|
+
|
39
|
+
unless number
|
40
|
+
raise ArgumentError, "#{color_name.inspect} is not a color code"
|
41
|
+
end
|
42
|
+
|
43
|
+
number.to_s 16
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class ExtendedLogger
|
2
|
+
module Colors
|
3
|
+
class Unpack
|
4
|
+
attr_reader :data
|
5
|
+
|
6
|
+
Pattern = %r{\A
|
7
|
+
(?<level_name>[A-Z_]+) # DEBUG
|
8
|
+
= # =
|
9
|
+
(?<fg>[?[:xdigit:]])+ # f
|
10
|
+
; # ;
|
11
|
+
(?<bg>[?[:xdigit:]])+ # 8
|
12
|
+
\Z}xn
|
13
|
+
|
14
|
+
def initialize data
|
15
|
+
@data = data
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.call string
|
19
|
+
instance = new string
|
20
|
+
instance.()
|
21
|
+
end
|
22
|
+
|
23
|
+
def call
|
24
|
+
output = {}
|
25
|
+
mappings = data.split ','.freeze
|
26
|
+
|
27
|
+
mappings.each do |mapping|
|
28
|
+
match_data = Pattern.match mapping
|
29
|
+
|
30
|
+
unless match_data
|
31
|
+
raise ArgumentError, "Invalid swatch #{data.inspect}"
|
32
|
+
end
|
33
|
+
|
34
|
+
level_name = match_data[:level_name]
|
35
|
+
|
36
|
+
if match_data[:fg] == '?'.freeze
|
37
|
+
fg = :none
|
38
|
+
else
|
39
|
+
fg = Colors.fetch match_data[:fg].to_i(16)
|
40
|
+
end
|
41
|
+
|
42
|
+
if match_data[:bg] == '?'.freeze
|
43
|
+
bg = :none
|
44
|
+
else
|
45
|
+
bg = Colors.fetch match_data[:bg].to_i(16)
|
46
|
+
end
|
47
|
+
|
48
|
+
output[level_name] = { :fg => fg, :bg => bg }
|
49
|
+
end
|
50
|
+
|
51
|
+
output
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class ExtendedLogger
|
2
|
+
class Define
|
3
|
+
attr_reader :block
|
4
|
+
attr_reader :cls
|
5
|
+
|
6
|
+
DefaultLogLevels = %i(debug debug? error error? fatal fatal? info info? warn warn?)
|
7
|
+
|
8
|
+
def initialize block, cls
|
9
|
+
@block = block
|
10
|
+
@cls = cls
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.call block
|
14
|
+
cls = Class.new ExtendedLogger
|
15
|
+
|
16
|
+
instance = new block, cls
|
17
|
+
instance.()
|
18
|
+
end
|
19
|
+
|
20
|
+
def call
|
21
|
+
cls.send :undef_method, *DefaultLogLevels
|
22
|
+
|
23
|
+
instance_exec &block
|
24
|
+
|
25
|
+
null_logger = cls.new nil
|
26
|
+
cls.const_set :NullLogger, null_logger
|
27
|
+
|
28
|
+
cls
|
29
|
+
end
|
30
|
+
|
31
|
+
def default_formatter &block
|
32
|
+
formatter_cls = Class.new Formatter
|
33
|
+
formatter_cls.send :define_method, :call, &block
|
34
|
+
cls.const_set :Formatter, formatter_cls
|
35
|
+
end
|
36
|
+
|
37
|
+
def levels const_names
|
38
|
+
const_names.each_with_index do |const_name, level|
|
39
|
+
cls.const_set const_name, level
|
40
|
+
|
41
|
+
method_name = const_name.to_s.downcase
|
42
|
+
|
43
|
+
cls.send :define_method, method_name do |progname=nil, &block|
|
44
|
+
add level, nil, progname, &block
|
45
|
+
end
|
46
|
+
|
47
|
+
cls.send :define_method, "#{method_name}?" do
|
48
|
+
@level <= level
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
cls.const_set :UNKNOWN, const_names.size
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -1,93 +1,38 @@
|
|
1
1
|
class ExtendedLogger < Logger
|
2
|
-
|
3
|
-
attr_accessor :default_log_level
|
2
|
+
attr_accessor :always_evaluate
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
setter = "#{attribute_name}=".freeze
|
4
|
+
def initialize *;
|
5
|
+
super
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
receiver.public_send setter, logger
|
12
|
-
end
|
13
|
-
|
14
|
-
def get receiver, **overrides
|
15
|
-
receiver_name =
|
16
|
-
if receiver.is_a? Module
|
17
|
-
receiver.name
|
18
|
-
else
|
19
|
-
receiver.class.name
|
20
|
-
end
|
21
|
-
|
22
|
-
logger = Factory.(**overrides)
|
23
|
-
logger.progname = "(#{receiver_name})"
|
24
|
-
logger
|
25
|
-
end
|
26
|
-
|
27
|
-
def instance
|
28
|
-
@instance ||= Factory.()
|
29
|
-
end
|
30
|
-
|
31
|
-
def levels
|
32
|
-
@levels ||= {
|
33
|
-
-7 => 'OBSOLETE'.freeze,
|
34
|
-
-6 => 'OPT_DATA'.freeze,
|
35
|
-
-5 => 'OPT_TRACE'.freeze,
|
36
|
-
-4 => 'OPT_DEBUG'.freeze,
|
37
|
-
-3 => 'DATA'.freeze,
|
38
|
-
-2 => 'TRACE'.freeze,
|
39
|
-
-1 => 'DEBUG'.freeze,
|
40
|
-
0 => 'INFO'.freeze,
|
41
|
-
1 => 'PASS'.freeze,
|
42
|
-
2 => 'FAIL'.freeze,
|
43
|
-
3 => 'FOCUS'.freeze,
|
44
|
-
4 => 'WARN'.freeze,
|
45
|
-
5 => 'ERROR'.freeze,
|
46
|
-
6 => 'FATAL'.freeze,
|
47
|
-
}
|
48
|
-
end
|
49
|
-
|
50
|
-
def level? level
|
51
|
-
levels.key? level
|
52
|
-
end
|
7
|
+
formatter_cls = self.class.const_get :Formatter
|
8
|
+
@formatter = formatter_cls.new @default_formatter
|
53
9
|
end
|
54
10
|
|
55
|
-
def
|
56
|
-
|
11
|
+
def self.build *arguments, initial_level: nil, **extensions
|
12
|
+
instance = new *arguments
|
13
|
+
instance.level = initial_level if initial_level
|
14
|
+
instance.apply_extensions **extensions
|
15
|
+
instance
|
57
16
|
end
|
58
17
|
|
59
|
-
def
|
60
|
-
|
18
|
+
def add severity, *, &block
|
19
|
+
block.call if block_given? and always_evaluate and severity < @level
|
20
|
+
super
|
61
21
|
end
|
62
22
|
|
63
|
-
def
|
64
|
-
|
65
|
-
Kernel.warn "(extended-logger) Unknown log severity level #{severity.inspect}"
|
66
|
-
end
|
67
|
-
|
68
|
-
self.class.levels.fetch severity, 'ANY'.freeze
|
69
|
-
end
|
23
|
+
def apply_extensions always_evaluate: nil, color_swatch: nil
|
24
|
+
always_evaluate ||= false
|
70
25
|
|
71
|
-
|
72
|
-
if self.formatter.is_a? Formatter
|
73
|
-
self.formatter.logger_formatter = formatter
|
74
|
-
else
|
75
|
-
super
|
76
|
-
end
|
77
|
-
end
|
26
|
+
self.always_evaluate = always_evaluate
|
78
27
|
|
79
|
-
|
80
|
-
return unless @logdev
|
81
|
-
@logdev.dev
|
28
|
+
formatter.color_swatch = Colors.unpack color_swatch if color_swatch
|
82
29
|
end
|
83
30
|
|
84
|
-
def
|
85
|
-
|
31
|
+
def formatter= internal_formatter
|
32
|
+
formatter.internal_formatter = internal_formatter
|
86
33
|
end
|
87
34
|
|
88
|
-
|
89
|
-
|
90
|
-
add level, *arguments, &block
|
91
|
-
end
|
35
|
+
def self.define &block
|
36
|
+
Define.(block)
|
92
37
|
end
|
93
38
|
end
|
@@ -1,97 +1,39 @@
|
|
1
1
|
class ExtendedLogger
|
2
2
|
class Formatter
|
3
|
-
attr_writer :
|
4
|
-
|
3
|
+
attr_writer :color_swatch
|
4
|
+
attr_accessor :internal_formatter
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
color log_entry, severity
|
6
|
+
def initialize internal_formatter
|
7
|
+
@internal_formatter = internal_formatter
|
9
8
|
end
|
10
9
|
|
11
|
-
def
|
12
|
-
colorizer = palette[severity]
|
13
|
-
|
14
|
-
if colorizer
|
15
|
-
log_entry = "#{colorizer}#{log_entry}\e[0m"
|
16
|
-
end
|
17
|
-
|
18
|
-
log_entry
|
19
|
-
end
|
20
|
-
|
21
|
-
def datetime_format
|
22
|
-
logger_formatter.datetime_format
|
23
|
-
end
|
24
|
-
|
25
|
-
def datetime_format= format
|
26
|
-
logger_formatter.datetime_format = format
|
27
|
-
end
|
28
|
-
|
29
|
-
def delegate *arguments, message
|
30
|
-
message = format_message message, arguments
|
31
|
-
logger_formatter.(*arguments, message)
|
32
|
-
end
|
33
|
-
|
34
|
-
def format_message message, arguments
|
10
|
+
def call severity, *arguments, message
|
35
11
|
output = ''
|
36
12
|
|
37
|
-
message
|
38
|
-
if line == "\n".freeze
|
39
|
-
line = "\\n"
|
40
|
-
else
|
41
|
-
line.gsub! "\r".freeze, "\\r".freeze
|
42
|
-
end
|
13
|
+
message = '(empty log message)' if message.empty?
|
43
14
|
|
44
|
-
|
45
|
-
output.concat line
|
46
|
-
else
|
47
|
-
formatted_line = logger_formatter.(*arguments, line.chomp("\n".freeze))
|
48
|
-
output.concat formatted_line
|
49
|
-
end
|
50
|
-
end
|
15
|
+
message.gsub! "\r".freeze, "\\r".freeze
|
51
16
|
|
52
|
-
|
53
|
-
|
17
|
+
message.each_line do |line|
|
18
|
+
line = $/.inspect[1...-1] if line == $/
|
19
|
+
line.chomp! if line.end_with? $/
|
54
20
|
|
55
|
-
|
56
|
-
|
57
|
-
|
21
|
+
formatted_line = internal_formatter.(severity, *arguments, line)
|
22
|
+
output.concat formatted_line
|
23
|
+
end
|
58
24
|
|
59
|
-
|
60
|
-
|
61
|
-
end
|
25
|
+
color = color_swatch[severity] || color_swatch['ANY'.freeze]
|
26
|
+
Colors.apply output, **color if color
|
62
27
|
|
63
|
-
|
64
|
-
@ansi_colors ||= %i(black red green yellow blue magenta cyan white)
|
28
|
+
output
|
65
29
|
end
|
66
30
|
|
67
|
-
def
|
68
|
-
|
69
|
-
escape = "\e[#{brightness};3#{ansi_colors.index fg}m"
|
70
|
-
|
71
|
-
if bg
|
72
|
-
escape << "\e[4#{ansi_colors.index bg}m"
|
73
|
-
end
|
74
|
-
|
75
|
-
escape
|
31
|
+
def color_swatch
|
32
|
+
@color_swatch ||= {}
|
76
33
|
end
|
77
34
|
|
78
|
-
def
|
79
|
-
|
80
|
-
'OBSOLETE' => col(:black, :normal),
|
81
|
-
'DATA' => col(:green, :normal),
|
82
|
-
'TRACE' => col(:cyan, :normal),
|
83
|
-
'DEBUG' => col(:blue, :normal),
|
84
|
-
'OPT_DATA' => col(:green, :normal, :white),
|
85
|
-
'OPT_TRACE' => col(:cyan, :normal, :white),
|
86
|
-
'OPT_DEBUG' => col(:blue, :normal, :white),
|
87
|
-
'PASS' => col(:white, :bright, :green),
|
88
|
-
'FAIL' => col(:white, :bright, :red),
|
89
|
-
'FOCUS' => col(:white, :bright, :blue),
|
90
|
-
'WARN' => col(:yellow, :normal),
|
91
|
-
'ERROR' => col(:red, :normal),
|
92
|
-
'FATAL' => col(:black, :bright, :red),
|
93
|
-
'ANY' => col(:white, :bright, :magenta),
|
94
|
-
}
|
35
|
+
def datetime_format= value
|
36
|
+
internal_formatter.datetime_format = value
|
95
37
|
end
|
96
38
|
end
|
97
39
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extended_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Ladd
|
@@ -21,10 +21,12 @@ extensions: []
|
|
21
21
|
extra_rdoc_files: []
|
22
22
|
files:
|
23
23
|
- lib/extended_logger.rb
|
24
|
+
- lib/extended_logger/colors.rb
|
25
|
+
- lib/extended_logger/colors/pack.rb
|
26
|
+
- lib/extended_logger/colors/unpack.rb
|
27
|
+
- lib/extended_logger/define.rb
|
24
28
|
- lib/extended_logger/extended_logger.rb
|
25
|
-
- lib/extended_logger/factory.rb
|
26
29
|
- lib/extended_logger/formatter.rb
|
27
|
-
- lib/extended_logger/null_logger.rb
|
28
30
|
homepage: https://github.com/ntl/extended-logger
|
29
31
|
licenses:
|
30
32
|
- MIT
|
@@ -1,61 +0,0 @@
|
|
1
|
-
class ExtendedLogger
|
2
|
-
class Factory
|
3
|
-
attr_reader :env
|
4
|
-
attr_writer :device
|
5
|
-
attr_writer :level
|
6
|
-
|
7
|
-
def initialize env
|
8
|
-
@env = env
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.build env=nil, device: nil, level: nil
|
12
|
-
env ||= ENV
|
13
|
-
level ||= ExtendedLogger.default_log_level
|
14
|
-
|
15
|
-
instance = new env
|
16
|
-
instance.device = device if device
|
17
|
-
instance.level = level if level
|
18
|
-
instance
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.call *arguments
|
22
|
-
instance = build *arguments
|
23
|
-
instance.()
|
24
|
-
end
|
25
|
-
|
26
|
-
def call
|
27
|
-
logger = ExtendedLogger.new device
|
28
|
-
|
29
|
-
formatter = Formatter.new
|
30
|
-
formatter.palette = Formatter.default_palette if colors? logger.io
|
31
|
-
logger.formatter = formatter
|
32
|
-
|
33
|
-
level = self.level
|
34
|
-
logger.level = level if level
|
35
|
-
|
36
|
-
logger
|
37
|
-
end
|
38
|
-
|
39
|
-
def colors? io
|
40
|
-
if io.tty?
|
41
|
-
ENV['LOG_COLOR'] != 'off'
|
42
|
-
else
|
43
|
-
ENV['LOG_COLOR'] == 'on'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def device
|
48
|
-
@device || env['LOG_DEVICE'] || $stderr
|
49
|
-
end
|
50
|
-
|
51
|
-
def level
|
52
|
-
level = @level || env['LOG_LEVEL']
|
53
|
-
|
54
|
-
return unless level
|
55
|
-
return level if level.is_a? Integer
|
56
|
-
|
57
|
-
level , _ = ExtendedLogger.levels.rassoc level.upcase
|
58
|
-
level
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|