nrser 0.2.0.pre.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/nrser/ext/enumerable.rb +12 -3
- data/lib/nrser/ext/module.rb +62 -0
- data/lib/nrser/ext.rb +1 -0
- data/lib/nrser/functions/binding.rb +33 -0
- data/lib/nrser/functions/enumerable/associate.rb +103 -0
- data/lib/nrser/functions/enumerable/map_keys.rb +0 -0
- data/lib/nrser/functions/enumerable/map_values.rb +94 -0
- data/lib/nrser/functions/enumerable.rb +2 -87
- data/lib/nrser/functions/module/methods.rb +206 -0
- data/lib/nrser/functions/module/source_locations.rb +213 -0
- data/lib/nrser/functions/module.rb +2 -0
- data/lib/nrser/functions.rb +1 -0
- data/lib/nrser/logging/appender/sync.rb +148 -0
- data/lib/nrser/logging/appender.rb +3 -0
- data/lib/nrser/logging/formatters/color.rb +165 -0
- data/lib/nrser/logging/formatters.rb +1 -0
- data/lib/nrser/logging.rb +353 -0
- data/lib/nrser/refinements/module.rb +5 -0
- data/lib/nrser/refinements.rb +1 -0
- data/lib/nrser/rspex/described.rb +99 -0
- data/lib/nrser/rspex/example_group/describe_called_with.rb +2 -2
- data/lib/nrser/rspex/example_group/describe_class.rb +31 -0
- data/lib/nrser/rspex/example_group/describe_instance.rb +1 -1
- data/lib/nrser/rspex/example_group/describe_method.rb +40 -0
- data/lib/nrser/rspex/example_group.rb +2 -34
- data/lib/nrser/rspex/format.rb +19 -6
- data/lib/nrser/rspex.rb +1 -1
- data/lib/nrser/types/numbers.rb +16 -16
- data/lib/nrser/version.rb +1 -1
- data/lib/nrser.rb +2 -5
- data/spec/design/mapping_spec.rb +42 -0
- data/spec/lib/nrser/mean_streak/identity_instance_spec.rb +7 -5
- data/spec/spec_helper.rb +23 -105
- data/spec/support/shared/types.rb +92 -0
- data/spec/support/shared.rb +1 -0
- metadata +27 -24
- data/lib/nrser/labs/unicode_math.rb +0 -48
- data/lib/nrser/labs/where.rb +0 -50
- data/lib/nrser/logger.rb +0 -457
- data/spec/lib/nrser/logger/dest_spec.rb +0 -15
- data/spec/lib/nrser/logger/die_spec.rb +0 -41
- data/spec/lib/nrser/logger/install_spec.rb +0 -98
- data/spec/lib/nrser/logger/level_int_spec.rb +0 -22
- data/spec/lib/nrser/logger/level_name_spec.rb +0 -23
- data/spec/lib/nrser/logger/level_sym_spec.rb +0 -22
- data/spec/lib/nrser/logger/send_log_spec.rb +0 -63
- data/spec/lib/nrser/logger/use_spec.rb +0 -16
@@ -0,0 +1,213 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
using NRSER
|
5
|
+
|
6
|
+
# Definitions
|
7
|
+
# =======================================================================
|
8
|
+
|
9
|
+
module NRSER
|
10
|
+
|
11
|
+
# @!group Module Functions
|
12
|
+
# ==========================================================================
|
13
|
+
|
14
|
+
|
15
|
+
# @todo Document map_to_source_locations method.
|
16
|
+
#
|
17
|
+
# @param [type] arg_name
|
18
|
+
# @todo Add name param description.
|
19
|
+
#
|
20
|
+
# @return [Hash<#source_location, Array<(String?, Fixnum?)>?>]
|
21
|
+
# Map of objects
|
22
|
+
#
|
23
|
+
def self.map_to_source_locations methods
|
24
|
+
methods.assoc_to &:source_location
|
25
|
+
end # .map_to_source_locations
|
26
|
+
|
27
|
+
|
28
|
+
# Map class method {Methods} objects to the `#source_location` for `mod`
|
29
|
+
# class methods.
|
30
|
+
#
|
31
|
+
# @see https://ruby-doc.org/core/Method.html#method-i-source_location
|
32
|
+
#
|
33
|
+
# @param (see NRSER.class_method_objects_for)
|
34
|
+
#
|
35
|
+
# @return [Hash<Symbol, Array<(String?, Fixnum?)>?>]
|
36
|
+
# Hash mapping method name {Symbol}s to results of calling their
|
37
|
+
# {Method#source_location}, which seems to be able to be:
|
38
|
+
#
|
39
|
+
# 1. `Array<(String, Fixnum)>` - two-entry array of file path,
|
40
|
+
# line number.
|
41
|
+
#
|
42
|
+
# 2. `nil` - if this method was not defined in Ruby (C extension, etc.)
|
43
|
+
#
|
44
|
+
# 3. `Array<(nil, nil)>` - Not listed as a possibility in the docs, but
|
45
|
+
# I swear I've seen it, so watch out.
|
46
|
+
#
|
47
|
+
def self.class_method_source_locations_for *args
|
48
|
+
map_to_source_locations class_method_objects_for( *args )
|
49
|
+
end # .class_method_source_locations
|
50
|
+
|
51
|
+
|
52
|
+
# Map *own* (not inherited) class method {Methods} objects to the
|
53
|
+
# `#source_location` for `mod` class methods.
|
54
|
+
#
|
55
|
+
# @see https://ruby-doc.org/core/Method.html#method-i-source_location
|
56
|
+
#
|
57
|
+
# @param (see .own_class_method_objects_for)
|
58
|
+
# @return (see .class_method_objects_for)
|
59
|
+
#
|
60
|
+
def self.own_class_method_source_locations_for *args
|
61
|
+
map_to_source_locations own_class_method_objects_for( *args )
|
62
|
+
end # .own_class_method_source_locations_for
|
63
|
+
|
64
|
+
|
65
|
+
# Map instance method {Methods} objects to the `#source_location` for `mod`
|
66
|
+
# class methods.
|
67
|
+
#
|
68
|
+
# @see https://ruby-doc.org/core/Method.html#method-i-source_location
|
69
|
+
#
|
70
|
+
# @param (see .instance_method_objects_for)
|
71
|
+
# @return (see .class_method_source_locations_for)
|
72
|
+
#
|
73
|
+
def self.instance_method_source_locations_for *args
|
74
|
+
map_to_source_locations instance_method_objects_for( *args )
|
75
|
+
end # .class_method_source_locations
|
76
|
+
|
77
|
+
|
78
|
+
# Map *own* (not inherited) class method {Methods} objects to the
|
79
|
+
# `#source_location` for `mod` class methods.
|
80
|
+
#
|
81
|
+
# @see https://ruby-doc.org/core/Method.html#method-i-source_location
|
82
|
+
#
|
83
|
+
# @param (see NRSER.own_class_method_objects_for)
|
84
|
+
# @return (see NRSER.class_method_objects_for)
|
85
|
+
#
|
86
|
+
def self.own_instance_method_source_locations_for *args
|
87
|
+
map_to_source_locations own_instance_methods_objects_for( *args )
|
88
|
+
end # .own_class_method_source_locations_for
|
89
|
+
|
90
|
+
|
91
|
+
# @todo Document method_source_locations_for method.
|
92
|
+
#
|
93
|
+
# @param [type] mod
|
94
|
+
# @todo Add name param description.
|
95
|
+
#
|
96
|
+
# @return [return_type]
|
97
|
+
# @todo Document return value.
|
98
|
+
#
|
99
|
+
def self.method_source_locations_for mod,
|
100
|
+
include_super = false,
|
101
|
+
sort: true
|
102
|
+
class_method_source_locations_for(
|
103
|
+
mod,
|
104
|
+
include_super,
|
105
|
+
sort: sort,
|
106
|
+
).
|
107
|
+
# map_keys { |name| ".#{ name }" }.
|
108
|
+
merge instance_method_source_locations_for(
|
109
|
+
mod,
|
110
|
+
include_super,
|
111
|
+
sort: sort,
|
112
|
+
# Think it makes sense to *always* include `#initialize` since at this
|
113
|
+
# point we're interested in where *all* the methods are, and that
|
114
|
+
# should def be included.
|
115
|
+
include_initialize: true,
|
116
|
+
) # .map_keys { |name| "##{ name }" }
|
117
|
+
end # .method_source_locations_for
|
118
|
+
|
119
|
+
|
120
|
+
def self.own_method_source_locations_for mod,
|
121
|
+
sort: true
|
122
|
+
method_source_locations_for \
|
123
|
+
mod,
|
124
|
+
false,
|
125
|
+
sort: sort
|
126
|
+
end # .method_source_locations_for
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
# @todo Document module_source_locations method.
|
131
|
+
#
|
132
|
+
# @param [type] arg_name
|
133
|
+
# @todo Add name param description.
|
134
|
+
#
|
135
|
+
# @return [return_type]
|
136
|
+
# @todo Document return value.
|
137
|
+
#
|
138
|
+
def self.module_source_locations mod
|
139
|
+
# Get all the src locs for `mod`'s methods
|
140
|
+
own_method_source_locations_for( mod ).values.
|
141
|
+
# Filter out any that don't have full src loc info
|
142
|
+
reject { |src_loc| src_loc.nil? || src_loc.any?( &:nil? ) }
|
143
|
+
end # .module_source_locations
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
# Get a reasonable file and line for the class.
|
148
|
+
#
|
149
|
+
# @param [Class] cls
|
150
|
+
# Class to try and locate.
|
151
|
+
#
|
152
|
+
# @return [Array<(String, Fixnum)>]
|
153
|
+
# Two entry array; first entry is the string file path, second is the
|
154
|
+
# line number.
|
155
|
+
#
|
156
|
+
def self.module_source_location mod
|
157
|
+
# If any files end with the "canonical path" then use that. It's a path
|
158
|
+
# suffix
|
159
|
+
#
|
160
|
+
# "my_mod/sub_mod/some_class.rb"
|
161
|
+
#
|
162
|
+
# the for a class
|
163
|
+
#
|
164
|
+
# MyMod::SubMod::SomeClass
|
165
|
+
#
|
166
|
+
canonical_path_end = \
|
167
|
+
ActiveSupport::Inflector.underscore( mod.name ) + '.rb'
|
168
|
+
|
169
|
+
# Get all the src locs for `mod`'s methods
|
170
|
+
src_locs = module_source_locations mod
|
171
|
+
|
172
|
+
# Find first line in canonical path (if any)
|
173
|
+
canonical_path_src_loc = src_locs.
|
174
|
+
find_all { |(path, line)| path.end_with? canonical_path_end }.
|
175
|
+
min_by { |(path, line)| line }
|
176
|
+
|
177
|
+
# If we found one, we're done!
|
178
|
+
return canonical_path_src_loc if canonical_path_src_loc
|
179
|
+
|
180
|
+
raise "HERE"
|
181
|
+
|
182
|
+
klass.
|
183
|
+
# Get an array of all instance methods, excluding inherited ones
|
184
|
+
# (the `false` arg)
|
185
|
+
instance_methods( false ).
|
186
|
+
# Add `#initialize` since it isn't in `#instance_methods` for some
|
187
|
+
# reason
|
188
|
+
<<( :initialize ).
|
189
|
+
# Map those to their {UnboundMethod} objects
|
190
|
+
map { |sym| klass.instance_method sym }.
|
191
|
+
# Toss any `nil` values (TODO how/why?)
|
192
|
+
compact.
|
193
|
+
# Get the source locations
|
194
|
+
map( &:source_location ).
|
195
|
+
# Get rid of `[nil, nil]` results, which seems to come from C exts?
|
196
|
+
reject { |(path, line)| path.nil? || line.nil? }.
|
197
|
+
# Get the first line in the shortest path
|
198
|
+
min_by { |(path, line)| [path.length, line] }
|
199
|
+
|
200
|
+
# Another approach I thought of... (untested)
|
201
|
+
#
|
202
|
+
# Get the path
|
203
|
+
# # Get frequency of the paths
|
204
|
+
# count_by { |(path, line)| path }.
|
205
|
+
# # Get the one with the most occurrences
|
206
|
+
# max_by { |path, count| count }.
|
207
|
+
# # Get just the path (not the count)
|
208
|
+
# first
|
209
|
+
end # .module_source_location
|
210
|
+
|
211
|
+
# @!endgroup Module Functions
|
212
|
+
|
213
|
+
end # module NRSER
|
data/lib/nrser/functions.rb
CHANGED
@@ -0,0 +1,148 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
|
5
|
+
# Definitions
|
6
|
+
# =======================================================================
|
7
|
+
|
8
|
+
# Replacement for {SemanticLogger::Appender::Async} that implements the
|
9
|
+
# same interface but just logs synchronously in the current thread.
|
10
|
+
#
|
11
|
+
# Basically just implements the {SemanticLogger::Appender::Async} API,
|
12
|
+
# returning mostly with fake / nonsense values, but it seems to work, and
|
13
|
+
# just let's writes go strait through to the {#appender} (which is actually
|
14
|
+
# a {SemanticLogger::Processor}).
|
15
|
+
#
|
16
|
+
# Useful for CLI applications where you want to see output in sync with
|
17
|
+
# operations.
|
18
|
+
#
|
19
|
+
class NRSER::Logging::Appender::Sync
|
20
|
+
|
21
|
+
# Mixins
|
22
|
+
# ============================================================================
|
23
|
+
|
24
|
+
# Macros for forwarding to {#appender}
|
25
|
+
extend Forwardable
|
26
|
+
|
27
|
+
|
28
|
+
#
|
29
|
+
# ============================================================================
|
30
|
+
|
31
|
+
# The appender we forward to, which is a {SemanticLogger::Processor}
|
32
|
+
# in practice, since it wouldn't make any sense to wrap a regular
|
33
|
+
# appender in a Sync.
|
34
|
+
#
|
35
|
+
# @return [SemanticLogger::Processor]
|
36
|
+
#
|
37
|
+
attr_accessor :appender
|
38
|
+
|
39
|
+
# Forward methods that can be called directly
|
40
|
+
def_delegator :@appender, :name
|
41
|
+
def_delegator :@appender, :should_log?
|
42
|
+
def_delegator :@appender, :filter
|
43
|
+
def_delegator :@appender, :host
|
44
|
+
def_delegator :@appender, :application
|
45
|
+
def_delegator :@appender, :level
|
46
|
+
def_delegator :@appender, :level=
|
47
|
+
def_delegator :@appender, :logger
|
48
|
+
|
49
|
+
# Added for sync
|
50
|
+
def_delegator :@appender, :log
|
51
|
+
def_delegator :@appender, :on_log
|
52
|
+
def_delegator :@appender, :flush
|
53
|
+
def_delegator :@appender, :close
|
54
|
+
|
55
|
+
|
56
|
+
# A fake {Queue} that just implements a {.size} method that returns `0`.
|
57
|
+
#
|
58
|
+
# Sync appender doesn't need a queue, but Semantic Logger expects one, so
|
59
|
+
# telling it the length is always zero seems to make sense.
|
60
|
+
#
|
61
|
+
class FakeQueue
|
62
|
+
# @return [0]
|
63
|
+
# Fake queue is always empty.
|
64
|
+
def self.size
|
65
|
+
0
|
66
|
+
end
|
67
|
+
end # class FakeQueue
|
68
|
+
|
69
|
+
|
70
|
+
# Construct a sync appender.
|
71
|
+
#
|
72
|
+
# @param [SemanticLogger]
|
73
|
+
# name: [String]
|
74
|
+
# Name to use for the log thread and the log name when logging any errors from this appender.
|
75
|
+
#
|
76
|
+
# lag_threshold_s [Float]
|
77
|
+
# Log a warning when a log message has been on the queue for longer than this period in seconds.
|
78
|
+
# Default: 30
|
79
|
+
#
|
80
|
+
# lag_check_interval: [Integer]
|
81
|
+
# Number of messages to process before checking for slow logging.
|
82
|
+
# Default: 1,000
|
83
|
+
def initialize appender:, name: appender.class.name
|
84
|
+
@appender = appender
|
85
|
+
end
|
86
|
+
|
87
|
+
# Needs to be there to support {SemanticLogger::Processor.queue_size},
|
88
|
+
# which gets the queue and returns it's size (which will always be zero
|
89
|
+
# for us).
|
90
|
+
#
|
91
|
+
# We return {FakeQueue}, which only implements a `size` method that
|
92
|
+
# returns zero.
|
93
|
+
#
|
94
|
+
# @return [#size]
|
95
|
+
#
|
96
|
+
def queue; FakeQueue; end
|
97
|
+
|
98
|
+
|
99
|
+
# @return [-1]
|
100
|
+
# Nonsense value meant to indicate there is no lag check interval.
|
101
|
+
def lag_check_interval; -1; end
|
102
|
+
|
103
|
+
|
104
|
+
# @raise [NotImplementedError]
|
105
|
+
# Sync appender doesn't support setting lag check interval.
|
106
|
+
def lag_check_interval= value
|
107
|
+
raise NotImplementedError,
|
108
|
+
"Can't set `lag_check_interval` on Sync appender"
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
# @return [-1]
|
113
|
+
# Nonsense value meant to indicate there is no lag threshold.
|
114
|
+
def lag_threshold_s; -1; end
|
115
|
+
|
116
|
+
|
117
|
+
# @raise [NotImplementedError]
|
118
|
+
# Sync appender doesn't support setting log threshold.
|
119
|
+
def lag_threshold_s= value
|
120
|
+
raise NotImplementedError,
|
121
|
+
"Can't set `lag_threshold_s` on Sync appender"
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
# @return [false]
|
126
|
+
# Sync appender is of course not size-capped.
|
127
|
+
def capped?; false; end
|
128
|
+
|
129
|
+
|
130
|
+
# The {SemanticLogger::Appender::Async} worker thread is exposed via
|
131
|
+
# this method, which creates it if it doesn't exist and returns it, but
|
132
|
+
# it doesn't seem like the returned value is ever used; the method
|
133
|
+
# call is just invoked to start the thread.
|
134
|
+
#
|
135
|
+
# Hence it seems to make most sense to just return `nil` since we don't
|
136
|
+
# have a thread, and figure out what to do if that causes errors (so far
|
137
|
+
# it seems fine).
|
138
|
+
#
|
139
|
+
# @return [nil]
|
140
|
+
#
|
141
|
+
def thread; end
|
142
|
+
|
143
|
+
|
144
|
+
# @return [true]
|
145
|
+
# Sync appender is always active
|
146
|
+
def active?; true; end
|
147
|
+
|
148
|
+
end # class NRSER::Logging::Appender::Sync
|
@@ -0,0 +1,165 @@
|
|
1
|
+
# Requirements
|
2
|
+
# =======================================================================
|
3
|
+
|
4
|
+
# Stdlib
|
5
|
+
# -----------------------------------------------------------------------
|
6
|
+
|
7
|
+
# Deps
|
8
|
+
# -----------------------------------------------------------------------
|
9
|
+
require 'awesome_print'
|
10
|
+
require 'semantic_logger'
|
11
|
+
|
12
|
+
# Project / Package
|
13
|
+
# -----------------------------------------------------------------------
|
14
|
+
|
15
|
+
|
16
|
+
# Refinements
|
17
|
+
# =======================================================================
|
18
|
+
|
19
|
+
|
20
|
+
# Declarations
|
21
|
+
# =======================================================================
|
22
|
+
|
23
|
+
module NRSER::Logging; end
|
24
|
+
module NRSER::Logging::Formatters; end
|
25
|
+
|
26
|
+
|
27
|
+
# Definitions
|
28
|
+
# =======================================================================
|
29
|
+
|
30
|
+
class NRSER::Logging::Formatters::Color < ::SemanticLogger::Formatters::Color
|
31
|
+
|
32
|
+
# Constants
|
33
|
+
# ======================================================================
|
34
|
+
|
35
|
+
# ANSI escape sequence to start "Dark Gray" color.
|
36
|
+
#
|
37
|
+
# @return [String]
|
38
|
+
#
|
39
|
+
ANSI_ESC_DARK_GRAY = "\e[1;30m"
|
40
|
+
|
41
|
+
|
42
|
+
# Class Methods
|
43
|
+
# ======================================================================
|
44
|
+
|
45
|
+
# @todo Document default_color_map method.
|
46
|
+
#
|
47
|
+
# @param [type] arg_name
|
48
|
+
# @todo Add name param description.
|
49
|
+
#
|
50
|
+
# @return [SemanticLogger::Formatters::Color::ColorMap]
|
51
|
+
#
|
52
|
+
def self.default_color_map
|
53
|
+
SemanticLogger::Formatters::Color::ColorMap.new(
|
54
|
+
debug: SemanticLogger::AnsiColors::MAGENTA,
|
55
|
+
trace: ANSI_ESC_DARK_GRAY,
|
56
|
+
)
|
57
|
+
end # .default_color_map
|
58
|
+
|
59
|
+
|
60
|
+
# Attributes
|
61
|
+
# ======================================================================
|
62
|
+
|
63
|
+
|
64
|
+
# Constructor
|
65
|
+
# ======================================================================
|
66
|
+
|
67
|
+
# Instantiate a new `ColorFormatter`.
|
68
|
+
def initialize ap: {multiline: true},
|
69
|
+
color_map: self.class.default_color_map,
|
70
|
+
time_format: ::SemanticLogger::Formatters::Base::TIME_FORMAT,
|
71
|
+
log_host: false,
|
72
|
+
log_application: false
|
73
|
+
super ap: ap,
|
74
|
+
color_map: color_map,
|
75
|
+
time_format: time_format,
|
76
|
+
log_host: log_host,
|
77
|
+
log_application: log_application
|
78
|
+
end # #initialize
|
79
|
+
|
80
|
+
|
81
|
+
# Instance Methods
|
82
|
+
# ======================================================================
|
83
|
+
|
84
|
+
|
85
|
+
# Upcase the log level.
|
86
|
+
#
|
87
|
+
# @return [String]
|
88
|
+
#
|
89
|
+
def level
|
90
|
+
"#{ color }#{ log.level.upcase }#{ color_map.clear }"
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
# Create the log entry text. Overridden to customize appearance -
|
95
|
+
# generally reduce amount of info and put payload on it's own line.
|
96
|
+
#
|
97
|
+
# We need to replace *two* super functions, the first being
|
98
|
+
# [SemanticLogger::Formatters::Color#call][]:
|
99
|
+
#
|
100
|
+
# def call(log, logger)
|
101
|
+
# self.color = color_map[log.level]
|
102
|
+
# super(log, logger)
|
103
|
+
# end
|
104
|
+
#
|
105
|
+
# [SemanticLogger::Formatters::Color#call]: https://github.com/rocketjob/semantic_logger/blob/v4.2.0/lib/semantic_logger/formatters/color.rb#L98
|
106
|
+
#
|
107
|
+
# which doesn't do all too much, and the next being it's super-method,
|
108
|
+
# [SemanticLogger::Formatters::Default#call][]:
|
109
|
+
#
|
110
|
+
# # Default text log format
|
111
|
+
# # Generates logs of the form:
|
112
|
+
# # 2011-07-19 14:36:15.660235 D [1149:ScriptThreadProcess] Rails -- Hello World
|
113
|
+
# def call(log, logger)
|
114
|
+
# self.log = log
|
115
|
+
# self.logger = logger
|
116
|
+
#
|
117
|
+
# [time, level, process_info, tags, named_tags, duration, name, message, payload, exception].compact.join(' ')
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# [SemanticLogger::Formatters::Default#call]: https://github.com/rocketjob/semantic_logger/blob/v4.2.0/lib/semantic_logger/formatters/default.rb#L64
|
121
|
+
#
|
122
|
+
# which does most the real assembly.
|
123
|
+
#
|
124
|
+
# @param [SemanticLogger::Log] log
|
125
|
+
# The log entry to format.
|
126
|
+
#
|
127
|
+
# See [SemanticLogger::Log](https://github.com/rocketjob/semantic_logger/blob/v4.2.0/lib/semantic_logger/log.rb)
|
128
|
+
#
|
129
|
+
# @param [SemanticLogger::Logger] logger
|
130
|
+
# The logger doing the logging (pretty sure, haven't checked).
|
131
|
+
#
|
132
|
+
# See [SemanticLogger::Logger](https://github.com/rocketjob/semantic_logger/blob/v4.2.0/lib/semantic_logger/logger.rb)
|
133
|
+
#
|
134
|
+
# @return [return_type]
|
135
|
+
# @todo Document return value.
|
136
|
+
#
|
137
|
+
def call log, logger
|
138
|
+
# SemanticLogger::Formatters::Color code
|
139
|
+
self.color = color_map[log.level]
|
140
|
+
|
141
|
+
# SemanticLogger::Formatters::Default code
|
142
|
+
self.log = log
|
143
|
+
self.logger = logger
|
144
|
+
|
145
|
+
[
|
146
|
+
time, # annoyingly noisy and don't really need for local CLI app
|
147
|
+
level,
|
148
|
+
process_info,
|
149
|
+
tags,
|
150
|
+
named_tags,
|
151
|
+
duration,
|
152
|
+
name,
|
153
|
+
].compact.join( ' ' ) +
|
154
|
+
"\n" +
|
155
|
+
[
|
156
|
+
message,
|
157
|
+
payload,
|
158
|
+
exception,
|
159
|
+
].compact.join(' ') +
|
160
|
+
"\n" # I like extra newline to space shit out
|
161
|
+
|
162
|
+
end # #call
|
163
|
+
|
164
|
+
|
165
|
+
end # class Color
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative './formatters/color'
|