ruby_smart-simple_logger 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +11 -15
- data/README.md +7 -7
- data/docs/CHANGELOG.md +18 -0
- data/lib/ruby_smart/simple_logger/extensions/helper.rb +55 -31
- data/lib/ruby_smart/simple_logger/extensions/processed.rb +48 -12
- data/lib/ruby_smart/simple_logger/extensions/simple_log.rb +34 -6
- data/lib/ruby_smart/simple_logger/extensions/timer.rb +9 -7
- data/lib/ruby_smart/simple_logger/formatter.rb +2 -2
- data/lib/ruby_smart/simple_logger/gem_version.rb +2 -2
- data/lib/ruby_smart/simple_logger/scenes.rb +63 -27
- data/lib/ruby_smart/simple_logger.rb +4 -5
- data/ruby_smart-simple_logger.gemspec +2 -0
- metadata +34 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 101c7a9ab2862c9ff3e7ace74f812a20a522dfa7fa8c6fcdf9f9accc53fd29e2
|
4
|
+
data.tar.gz: 1e1f7d6e1c9cbfe48a21cc8cceaa7cd37de7712363ae78e80bcff87aa6c5ca5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 875fc9ea64929088e6a445f43b1e3a0c7b1c92de106a53c8112c68a3eb28ab5ea081c2a1e21d7d672d7e3109c68e68a83283be41364d65b2c450b6932408e15a
|
7
|
+
data.tar.gz: 9be8b0019a5afb3b3a9050dcb6139d9cf2ffe9fbd89549ebb717e8e4a2b59ee981dad95948400836a78e8b8205a324dbd2a35dea6638567143e37cbc93425e32
|
data/.github/workflows/ruby.yml
CHANGED
@@ -18,21 +18,17 @@ permissions:
|
|
18
18
|
|
19
19
|
jobs:
|
20
20
|
test:
|
21
|
-
|
22
|
-
runs-on: ubuntu-latest
|
23
21
|
strategy:
|
22
|
+
fail-fast: false
|
24
23
|
matrix:
|
25
|
-
|
26
|
-
|
24
|
+
os: [ubuntu-latest]
|
25
|
+
# Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
|
26
|
+
ruby: ['3.2', '3.1', '3.0', '2.7', '2.6']
|
27
|
+
runs-on: ${{ matrix.os }}
|
27
28
|
steps:
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
with:
|
35
|
-
ruby-version: ${{ matrix.ruby-version }}
|
36
|
-
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
37
|
-
- name: Run tests
|
38
|
-
run: bundle exec rake
|
29
|
+
- uses: actions/checkout@v3
|
30
|
+
- uses: ruby/setup-ruby@v1
|
31
|
+
with:
|
32
|
+
ruby-version: ${{ matrix.ruby }}
|
33
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
34
|
+
- run: bundle exec rake
|
data/README.md
CHANGED
@@ -560,7 +560,7 @@ The following PRE-defined scenes are available. _(You can define your own scenes
|
|
560
560
|
# > ==========================================================================================================
|
561
561
|
```
|
562
562
|
|
563
|
-
### info, warn, error, fatal, success (data, subject = 'name')
|
563
|
+
### info, warn, error, fatal, unknown, success (data, subject = 'name')
|
564
564
|
```ruby
|
565
565
|
# info method (BASE)
|
566
566
|
# severity: methods name
|
@@ -748,19 +748,19 @@ l.processed("Process Alpha", timer: true) do
|
|
748
748
|
end
|
749
749
|
|
750
750
|
|
751
|
-
# ╔ START
|
751
|
+
# ╔ START ❯ Process Alpha
|
752
752
|
# ╟ find files
|
753
753
|
# ╟ found 34 files
|
754
|
-
# ║ ┌ START
|
754
|
+
# ║ ┌ START ❯ extracting ...
|
755
755
|
# ║ ├ 10% done
|
756
756
|
# ║ ├ 20% done
|
757
757
|
# ║ ├ 100% done
|
758
|
-
# ║ └
|
759
|
-
# ║ ┌ START
|
758
|
+
# ║ └ END ❯ extracting ... [SUCCESS] (0.000244804)
|
759
|
+
# ║ ┌ START ❯ transforming ...
|
760
760
|
# ║ ├ bad memory
|
761
761
|
# ║ ├ rolling back
|
762
|
-
# ║ └
|
763
|
-
# ╚
|
762
|
+
# ║ └ END ❯ transforming ... [FAIL]
|
763
|
+
# ╚ END ❯ Process Alpha (0.001036969)
|
764
764
|
```
|
765
765
|
|
766
766
|
### _other useful methods_
|
data/docs/CHANGELOG.md
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
# RubySmart::SimpleLogger - CHANGELOG
|
2
2
|
|
3
|
+
## [1.3.0] - 2023-08-15
|
4
|
+
* **[add]** exception message within `processed`-scene
|
5
|
+
* **[add]** new logging option `tag`, to prefix a log-string with a [TAG]
|
6
|
+
* **[add]** logger options `processed: false` & `tagged: false` to prevent processing or tagging
|
7
|
+
* **[add]** `_tagged`-helper method
|
8
|
+
* **[add]** `__scene_subject_with_opts`-helper method to grep subject&opts from args (used for default severities)
|
9
|
+
* **[add]** additional box_chars for 'tagged' & 'feed' extensions - used @ `processed`-scene
|
10
|
+
* **[add]** `unknown`-scene
|
11
|
+
* **[ref]** `processed`-scene with better logging chars & homogenous syntax for humanized reading
|
12
|
+
* **[fix]** missing '_declr' for memory formatting (only on Strings)
|
13
|
+
* **[fix]** missing 'clr:false' option for memory devices
|
14
|
+
* **[fix]** exception while in `processed`-scene not logging the END-line
|
15
|
+
* **[fix]** re-using timer-methods with the same key, did not restart the 'total' measurement
|
16
|
+
|
17
|
+
## [1.2.2] - 2023-03-15
|
18
|
+
* **[ref]** simplify device-generation for builtins
|
19
|
+
* **[fix]** `ActionView::Helpers::DateHelper` require, which breaks rails loading process in some cases
|
20
|
+
|
3
21
|
## [1.2.1] - 2023-02-17
|
4
22
|
* **[fix]** 'rails'-related builtins
|
5
23
|
* **[fix]** `::RubySmart::SimpleLogger::Devices::MultiDevice` register `MultiDevice` instead of nested devices
|
@@ -14,8 +14,7 @@ module RubySmart
|
|
14
14
|
# set / overwrite default opts
|
15
15
|
# @param [Hash] opts
|
16
16
|
def _opts_init!(opts)
|
17
|
-
|
18
|
-
# level
|
17
|
+
# -- level ---------------------------------------------------------------------------------------------------
|
19
18
|
|
20
19
|
# initialize a default rails-dependent output
|
21
20
|
if ::ThreadInfo.rails?
|
@@ -25,8 +24,7 @@ module RubySmart
|
|
25
24
|
# clean & rewrite level (possible symbols) to real level
|
26
25
|
opts[:level] = _level(opts[:level] || :debug)
|
27
26
|
|
28
|
-
|
29
|
-
# mask
|
27
|
+
# -- mask ----------------------------------------------------------------------------------------------------
|
30
28
|
|
31
29
|
# set mask from options
|
32
30
|
self.mask(opts[:mask]) if opts[:mask]
|
@@ -39,13 +37,18 @@ module RubySmart
|
|
39
37
|
self.mask(length: ::ThreadInfo.winsize[1])
|
40
38
|
end
|
41
39
|
|
42
|
-
|
43
|
-
# instance related
|
40
|
+
# -- instance related ----------------------------------------------------------------------------------------
|
44
41
|
|
45
42
|
# ignore payload and send data directly to the logdev
|
46
|
-
@ignore_payload
|
43
|
+
@ignore_payload = true if @ignore_payload.nil? && opts[:payload] == false
|
47
44
|
|
48
|
-
#
|
45
|
+
# ignore processed logging and send data without 'leveling' & PCD-char to the logdev
|
46
|
+
@ignore_processed = true if @ignore_processed.nil? && opts[:processed] == false
|
47
|
+
|
48
|
+
# ignore tagged logging and send data without 'tags' to the logdev
|
49
|
+
@ignore_tagged = true if @ignore_tagged.nil? && opts[:tagged] == false
|
50
|
+
|
51
|
+
# set custom inspector (used for data inspection)
|
49
52
|
# 'disable' inspector, if false was provided - which simply results in +#to_s+
|
50
53
|
@inspector = (opts[:inspect] == false) ? :to_s : opts[:inspector]
|
51
54
|
|
@@ -61,36 +64,30 @@ module RubySmart
|
|
61
64
|
# check for already existing +device+
|
62
65
|
return if opts[:device]
|
63
66
|
|
64
|
-
# remove builtin key from opts
|
65
|
-
|
67
|
+
# remove builtin key from opts and force an array
|
68
|
+
builtins = Array(opts.delete(:builtin))
|
66
69
|
|
67
|
-
#
|
68
|
-
|
70
|
+
# expand builtins with stdout
|
71
|
+
builtins << :stdout if opts.delete(:stdout)
|
69
72
|
|
70
|
-
# expand
|
71
|
-
if opts.delete(:
|
72
|
-
builtin = [builtin] unless builtin.is_a?(Array)
|
73
|
-
builtin << :stdout
|
74
|
-
end
|
73
|
+
# expand builtins with memory
|
74
|
+
builtins << :memory if opts.delete(:memory)
|
75
75
|
|
76
|
-
|
77
|
-
builtin = [builtin] unless builtin.is_a?(Array)
|
78
|
-
builtin << :memory
|
79
|
-
end
|
76
|
+
builtins.uniq!
|
80
77
|
|
81
|
-
#
|
82
|
-
if
|
78
|
+
# don't create multi-device for a single (or +nil+) builtin
|
79
|
+
if builtins.length < 2
|
80
|
+
opts[:device] = _resolve_device(builtins[0], opts)
|
81
|
+
else
|
83
82
|
opts[:device] = ::RubySmart::SimpleLogger::Devices::MultiDevice.new
|
84
|
-
|
83
|
+
builtins.each do |builtin|
|
85
84
|
# IMPORTANT: dup, original hash to prevent reference manipulation (on the TOP-level, only)
|
86
85
|
builtin_opts = opts.dup
|
87
|
-
opts[:device].register(_resolve_device(
|
86
|
+
opts[:device].register(_resolve_device(builtin, builtin_opts), _resolve_formatter(builtin_opts))
|
88
87
|
end
|
89
88
|
|
90
89
|
# force 'passthrough', as format, since this is required for multi-devices
|
91
90
|
opts[:format] = :passthrough
|
92
|
-
else
|
93
|
-
opts[:device] = _resolve_device(builtin, opts)
|
94
91
|
end
|
95
92
|
|
96
93
|
# prevent to return any data
|
@@ -119,7 +116,7 @@ module RubySmart
|
|
119
116
|
opts[:format] ||= :plain
|
120
117
|
|
121
118
|
# fix nl - which depends on other opts
|
122
|
-
opts[:nl]
|
119
|
+
opts[:nl] = _nl(opts)
|
123
120
|
|
124
121
|
# fix clr
|
125
122
|
opts[:clr] = true if opts[:clr].nil?
|
@@ -158,14 +155,16 @@ module RubySmart
|
|
158
155
|
when :proc
|
159
156
|
# force overwrite opts
|
160
157
|
@ignore_payload = true
|
161
|
-
opts[:nl]
|
162
|
-
opts[:format]
|
158
|
+
opts[:nl] = false
|
159
|
+
opts[:format] = :passthrough
|
163
160
|
|
164
161
|
::RubySmart::SimpleLogger::Devices::ProcDevice.new(opts.delete(:proc))
|
165
162
|
when :memory
|
166
163
|
# force overwrite opts
|
167
164
|
@ignore_payload = true
|
168
|
-
opts[:format]
|
165
|
+
opts[:format] = :memory
|
166
|
+
# no color logging for memory devices
|
167
|
+
opts[:clr] = false
|
169
168
|
|
170
169
|
::RubySmart::SimpleLogger::Devices::MemoryDevice.new
|
171
170
|
when Module, String
|
@@ -281,6 +280,18 @@ module RubySmart
|
|
281
280
|
end
|
282
281
|
end
|
283
282
|
|
283
|
+
# 'tags' a provided string
|
284
|
+
# returns the string if no tag was provided or general tags are disabled
|
285
|
+
# @param [String] str
|
286
|
+
# @param [nil|Symbol|String] tag
|
287
|
+
# @return [String]
|
288
|
+
def _tagged(str, tag = nil)
|
289
|
+
# check for active tag
|
290
|
+
return str if tag.nil? || ignore_tagged?
|
291
|
+
|
292
|
+
"#{"[#{tag.to_s.upcase.bg_cyan}]"} #{str}"
|
293
|
+
end
|
294
|
+
|
284
295
|
# colorizes a provided string
|
285
296
|
# returns the string if no color was provided or invalid
|
286
297
|
#
|
@@ -349,6 +360,19 @@ module RubySmart
|
|
349
360
|
res_or_clr.to_sym
|
350
361
|
end
|
351
362
|
end
|
363
|
+
|
364
|
+
# resolves subject & opts from provided args.
|
365
|
+
# returns provided default subject, if not in args.
|
366
|
+
# @param [Object] args
|
367
|
+
# @param [String] subject
|
368
|
+
# @return [Array]
|
369
|
+
def _scene_subject_with_opts(args, subject = '')
|
370
|
+
if args[0].is_a?(Hash)
|
371
|
+
[subject, args[0]]
|
372
|
+
else
|
373
|
+
[args[0] || subject, args[1] || {}]
|
374
|
+
end
|
375
|
+
end
|
352
376
|
end
|
353
377
|
end
|
354
378
|
end
|
@@ -12,10 +12,15 @@ module RubySmart
|
|
12
12
|
base.class_eval do
|
13
13
|
# set default box chars
|
14
14
|
self.box_chars = {
|
15
|
-
|
16
|
-
|
15
|
+
# control characters by provided +:pcd+
|
16
|
+
default: %w(╟ ├),
|
17
17
|
start: %w(╔ ┌),
|
18
|
-
end: %w(╚ └)
|
18
|
+
end: %w(╚ └),
|
19
|
+
|
20
|
+
# additional characters, added ad specific position
|
21
|
+
__processed__: %w(║ │),
|
22
|
+
__feed__: %w(═ ─),
|
23
|
+
__tagged__: %w(┄ ┄),
|
19
24
|
}.freeze
|
20
25
|
end
|
21
26
|
end
|
@@ -33,18 +38,20 @@ module RubySmart
|
|
33
38
|
module InstanceMethods
|
34
39
|
# returns the current processed level.
|
35
40
|
# by providing a handle it will either increase or decrease the current level.
|
36
|
-
# @param [
|
41
|
+
# @param [Symbol|Integer] handle - optional handle to increase or decrease the current lvl (+:up+ / +:down+)
|
37
42
|
# @return [Integer]
|
38
43
|
def processed_lvl(handle = nil)
|
39
44
|
@processed_lvl ||= -1
|
40
45
|
|
41
46
|
case handle
|
47
|
+
when :reset
|
48
|
+
@processed_lvl = -1
|
42
49
|
when :up
|
43
50
|
@processed_lvl += 1
|
44
51
|
when :down
|
45
52
|
@processed_lvl -= 1 if @processed_lvl >= 0
|
46
53
|
else
|
47
|
-
|
54
|
+
@processed_lvl = handle if handle.is_a?(Integer)
|
48
55
|
end
|
49
56
|
|
50
57
|
@processed_lvl
|
@@ -53,25 +60,54 @@ module RubySmart
|
|
53
60
|
# returns true if the processed state is active.
|
54
61
|
# @return [Boolean]
|
55
62
|
def processed?
|
56
|
-
processed_lvl >= 0
|
63
|
+
processed_lvl >= 0 && !@ignore_processed
|
57
64
|
end
|
58
65
|
|
59
66
|
private
|
60
67
|
|
61
68
|
# transforms the provided data into a 'processed' string and forces the data to be transformed to string.
|
62
69
|
# simple returns the provided data, if currently not processed.
|
63
|
-
# @param [
|
70
|
+
# @param [String] data
|
64
71
|
# @param [Hash] opts
|
65
|
-
# @return [
|
72
|
+
# @return [String]
|
66
73
|
def _pcd(data, opts)
|
67
74
|
# check for active pcd (processed)
|
68
75
|
return data if opts[:pcd] == false || !processed?
|
69
76
|
|
70
|
-
# resolve
|
77
|
+
# resolve the current level - either directly through the options or the +processed_lvl+.
|
71
78
|
lvl = opts[:lvl] || processed_lvl
|
72
79
|
|
73
|
-
#
|
74
|
-
|
80
|
+
# prepares the out-string array
|
81
|
+
strs = []
|
82
|
+
|
83
|
+
# add level-charters with indent
|
84
|
+
lvl.times.each { |i|
|
85
|
+
# ║ │
|
86
|
+
strs << _pcd_box_char(:__processed__, i) + ' '
|
87
|
+
}
|
88
|
+
|
89
|
+
# add pcd-related control character
|
90
|
+
strs << _pcd_box_char(opts[:pcd], lvl)
|
91
|
+
|
92
|
+
# add pcd-operation string
|
93
|
+
if opts[:pcd].is_a?(Symbol)
|
94
|
+
# ╔ START ❯
|
95
|
+
# └ END ❯
|
96
|
+
strs << " #{opts[:pcd].to_s.upcase.rjust(5)} \u276F"
|
97
|
+
end
|
98
|
+
|
99
|
+
# check for tagged
|
100
|
+
# ┄
|
101
|
+
if opts[:tag]
|
102
|
+
strs << _pcd_box_char(:__tagged__, lvl)
|
103
|
+
else
|
104
|
+
strs << ' '
|
105
|
+
end
|
106
|
+
|
107
|
+
# add data
|
108
|
+
strs << data.to_s
|
109
|
+
|
110
|
+
strs.join
|
75
111
|
end
|
76
112
|
|
77
113
|
# returns the processed box character for provided key and position.
|
@@ -81,7 +117,7 @@ module RubySmart
|
|
81
117
|
# @param [Integer] pos
|
82
118
|
# @return [String]
|
83
119
|
def _pcd_box_char(key, pos = 0)
|
84
|
-
chars = self.class.box_chars[key] || self.class.box_chars[:
|
120
|
+
chars = self.class.box_chars[key] || self.class.box_chars[:default]
|
85
121
|
chars[pos] || chars[-1]
|
86
122
|
end
|
87
123
|
end
|
@@ -53,7 +53,7 @@ module RubySmart
|
|
53
53
|
# prevent logging nil data
|
54
54
|
return false if data.nil?
|
55
55
|
|
56
|
-
add level,
|
56
|
+
add level, _parse_data(data, opts)
|
57
57
|
return true
|
58
58
|
end
|
59
59
|
|
@@ -82,6 +82,14 @@ module RubySmart
|
|
82
82
|
!!@ignore_payload
|
83
83
|
end
|
84
84
|
|
85
|
+
# returns true if no tags should be created - instead the data will be send directly to the logdev
|
86
|
+
# forces the *simple_log* method to prevent building tags from opts
|
87
|
+
#
|
88
|
+
# @return [Boolean]
|
89
|
+
def ignore_tagged?
|
90
|
+
!!@ignore_tagged
|
91
|
+
end
|
92
|
+
|
85
93
|
# resolve an inspector method for data inspection
|
86
94
|
# @return [Symbol, nil]
|
87
95
|
def inspector
|
@@ -107,7 +115,7 @@ module RubySmart
|
|
107
115
|
str = ''
|
108
116
|
if payload == self.class::PAYLOAD_DATA_KEY
|
109
117
|
# checks, if we should inspect the data
|
110
|
-
str <<
|
118
|
+
str << _parse_inspect_data(data, opts)
|
111
119
|
else
|
112
120
|
str << _parse_payload(payload, opts)
|
113
121
|
end
|
@@ -121,13 +129,33 @@ module RubySmart
|
|
121
129
|
true
|
122
130
|
end
|
123
131
|
|
124
|
-
#
|
132
|
+
# parses the provided data to string.
|
133
|
+
# - calls an inspection method, if provided
|
134
|
+
# - tags the string, if provided
|
135
|
+
# - adds processed prefix-chars, if provided
|
125
136
|
#
|
126
137
|
# @param [Object] data
|
127
|
-
# @param [
|
138
|
+
# @param [Hash] opts
|
139
|
+
# @return [String] stringified data
|
140
|
+
def _parse_data(data, opts)
|
141
|
+
_pcd(
|
142
|
+
_tagged(
|
143
|
+
data.to_s,
|
144
|
+
opts[:tag]
|
145
|
+
),
|
146
|
+
opts
|
147
|
+
)
|
148
|
+
end
|
149
|
+
|
150
|
+
# parses the provided data to string, but calls a possible inspect method.
|
151
|
+
# @param [Object] data
|
152
|
+
# @param [Hash] opts
|
128
153
|
# @return [String] stringified data
|
129
|
-
def
|
130
|
-
(
|
154
|
+
def _parse_inspect_data(data, opts)
|
155
|
+
_parse_data(
|
156
|
+
data.send(opts[:inspect] ? (opts[:inspector] || self.inspector) : :to_s),
|
157
|
+
opts
|
158
|
+
)
|
131
159
|
end
|
132
160
|
|
133
161
|
# parses a single payload with provided options
|
@@ -5,21 +5,23 @@ module RubySmart
|
|
5
5
|
module Extensions
|
6
6
|
module Timer
|
7
7
|
def timer(action, key = :default, opts = {})
|
8
|
+
return if key.nil?
|
9
|
+
|
8
10
|
@timers ||= {}
|
9
11
|
@timers[key] ||= {
|
10
12
|
start: nil,
|
11
13
|
stop: nil,
|
12
|
-
|
14
|
+
total: 0
|
13
15
|
}
|
14
16
|
|
15
17
|
case action
|
16
|
-
when :restart
|
18
|
+
when :start, :restart
|
17
19
|
@timers[key][:start] = Time.now
|
18
20
|
@timers[key][:stop] = nil
|
19
|
-
@timers[key][:
|
21
|
+
@timers[key][:total] = 0
|
20
22
|
|
21
23
|
true
|
22
|
-
when :
|
24
|
+
when :continue
|
23
25
|
@timers[key][:start] = Time.now
|
24
26
|
@timers[key][:stop] = nil
|
25
27
|
|
@@ -27,13 +29,13 @@ module RubySmart
|
|
27
29
|
when :stop
|
28
30
|
return false if !@timers[key][:start] || @timers[key][:stop]
|
29
31
|
@timers[key][:stop] = Time.now
|
30
|
-
@timers[key][:
|
32
|
+
@timers[key][:total] += @timers[key][:stop] - @timers[key][:start]
|
31
33
|
|
32
34
|
true
|
33
35
|
when :pause
|
34
36
|
return false if !@timers[key][:start] || @timers[key][:stop]
|
35
37
|
|
36
|
-
@timers[key][:
|
38
|
+
@timers[key][:total] += Time.now - @timers[key][:start]
|
37
39
|
@timers[key][:start] = nil
|
38
40
|
@timers[key][:stop] = nil
|
39
41
|
|
@@ -50,7 +52,7 @@ module RubySmart
|
|
50
52
|
current
|
51
53
|
end
|
52
54
|
when :current
|
53
|
-
current = @timers[key][:
|
55
|
+
current = @timers[key][:total]
|
54
56
|
current += Time.now - @timers[key][:start] if @timers[key][:start] && @timers[key][:stop].nil?
|
55
57
|
current
|
56
58
|
else
|
@@ -33,7 +33,7 @@ module RubySmart
|
|
33
33
|
plain: -> (_severity, _time, _progname, data) { _nl _declr(data.to_s) },
|
34
34
|
|
35
35
|
# specialized array for memory-logging
|
36
|
-
memory: -> (severity, time, _progname, data) { [severity.downcase.to_sym, time, data] },
|
36
|
+
memory: -> (severity, time, _progname, data) { [severity.downcase.to_sym, time, _declr(data)] },
|
37
37
|
|
38
38
|
# specialized string as datalog with every provided data in additional brackets -> [data] [data] [data]
|
39
39
|
datalog: -> (severity, time, _progname, data) {
|
@@ -202,7 +202,7 @@ module RubySmart
|
|
202
202
|
# @param [String] str
|
203
203
|
# @return [String]
|
204
204
|
def _declr(str)
|
205
|
-
if opts[:clr]
|
205
|
+
if opts[:clr] || !str.is_a?(String)
|
206
206
|
str
|
207
207
|
else
|
208
208
|
str.gsub(/\e\[[\d;]+m/, '')
|
@@ -11,7 +11,8 @@ module RubySmart
|
|
11
11
|
# > ================================================= [Debug] ================================================
|
12
12
|
# > "DEBUGGED DATA" <- analyzed by awesome_print#ai method
|
13
13
|
# > ==========================================================================================================
|
14
|
-
base.scene :debug, { level: :debug, inspect: true, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
14
|
+
base.scene :debug, { level: :debug, inspect: true, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, *args|
|
15
|
+
subject, opts = _scene_subject_with_opts(args, 'Debug')
|
15
16
|
self.log data, _scene_opt(:debug, { subject: subject }, opts)
|
16
17
|
end
|
17
18
|
|
@@ -22,7 +23,8 @@ module RubySmart
|
|
22
23
|
# > ================================================= [Info] =================================================
|
23
24
|
# > DATA
|
24
25
|
# > ==========================================================================================================
|
25
|
-
base.scene :info, { level: :info, mask: { clr: :cyan }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
26
|
+
base.scene :info, { level: :info, mask: { clr: :cyan }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, *args|
|
27
|
+
subject, opts = _scene_subject_with_opts(args, 'Info')
|
26
28
|
self.log data, _scene_opt(:info, { subject: subject }, opts)
|
27
29
|
end
|
28
30
|
|
@@ -33,7 +35,8 @@ module RubySmart
|
|
33
35
|
# > ================================================= [Warn] =================================================
|
34
36
|
# > DATA
|
35
37
|
# > ==========================================================================================================
|
36
|
-
base.scene :warn, { level: :warn, mask: { clr: :yellow }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
38
|
+
base.scene :warn, { level: :warn, mask: { clr: :yellow }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, *args|
|
39
|
+
subject, opts = _scene_subject_with_opts(args, 'Warn')
|
37
40
|
self.log data, _scene_opt(:warn, { subject: subject }, opts)
|
38
41
|
end
|
39
42
|
|
@@ -44,7 +47,8 @@ module RubySmart
|
|
44
47
|
# > ================================================ [Error] =================================================
|
45
48
|
# > DATA
|
46
49
|
# > ==========================================================================================================
|
47
|
-
base.scene :error, { level: :error, mask: { clr: :red }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data
|
50
|
+
base.scene :error, { level: :error, mask: { clr: :red }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,*args|
|
51
|
+
subject, opts = _scene_subject_with_opts(args, 'Error')
|
48
52
|
self.log data, _scene_opt(:error, { subject: subject }, opts)
|
49
53
|
end
|
50
54
|
|
@@ -55,10 +59,23 @@ module RubySmart
|
|
55
59
|
# > ================================================ [Fatal] =================================================
|
56
60
|
# > DATA
|
57
61
|
# > ==========================================================================================================
|
58
|
-
base.scene :fatal, { level: :fatal, mask: { clr: :bg_red }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
62
|
+
base.scene :fatal, { level: :fatal, mask: { clr: :bg_red }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, *args|
|
63
|
+
subject, opts = _scene_subject_with_opts(args, 'Fatal')
|
59
64
|
self.log data, _scene_opt(:fatal, { subject: subject }, opts)
|
60
65
|
end
|
61
66
|
|
67
|
+
# unknown method (BASE)
|
68
|
+
# log level @ unknown
|
69
|
+
# prints: enclosed data
|
70
|
+
#
|
71
|
+
# > =============================================== [Unknown] ================================================
|
72
|
+
# > DATA
|
73
|
+
# > ==========================================================================================================
|
74
|
+
base.scene :unknown, { level: :unknown, mask: { clr: :gray }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, *args|
|
75
|
+
subject, opts = _scene_subject_with_opts(args, 'Unknown')
|
76
|
+
self.log data, _scene_opt(:unknown, { subject: subject }, opts)
|
77
|
+
end
|
78
|
+
|
62
79
|
# success method
|
63
80
|
# log level @ success (sub-level of info)
|
64
81
|
# prints: enclosed data
|
@@ -66,7 +83,8 @@ module RubySmart
|
|
66
83
|
# > ================================================ [Success] ================================================
|
67
84
|
# > DATA
|
68
85
|
# > ===========================================================================================================
|
69
|
-
base.scene :success, { level: :success, mask: { clr: :green }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
86
|
+
base.scene :success, { level: :success, mask: { clr: :green }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, *args|
|
87
|
+
subject, opts = _scene_subject_with_opts(args, 'Success')
|
70
88
|
self.log data, _scene_opt(:success, { subject: subject }, opts)
|
71
89
|
end
|
72
90
|
|
@@ -287,34 +305,52 @@ module RubySmart
|
|
287
305
|
# log level @ debug
|
288
306
|
# prints: a processed output with unicode box-chars (e.g. ║ )
|
289
307
|
#
|
290
|
-
# ╔ START
|
308
|
+
# ╔ START ❯ job
|
291
309
|
# ╟ doing some cool log
|
292
310
|
# ╟ doing some extra log
|
293
|
-
# ╚ END [
|
311
|
+
# ╚ END ❯ job [SUCCESS] (duration: 4.34223)
|
294
312
|
base.scene :processed, { level: :debug } do |name, opts = {}, &block|
|
295
|
-
#
|
313
|
+
# increase level
|
296
314
|
lvl = processed_lvl(:up)
|
297
315
|
|
298
|
-
#
|
299
|
-
|
300
|
-
|
316
|
+
# resolve a new time-key.
|
317
|
+
# The key depends on the current level - this should be possible, since processes on the same level should not be possible
|
318
|
+
timer_key = if opts[:timer]
|
319
|
+
"processed_#{lvl}"
|
320
|
+
else
|
321
|
+
nil
|
322
|
+
end
|
323
|
+
|
324
|
+
begin
|
325
|
+
# starts new time (if key was created)
|
326
|
+
self.timer(:start, timer_key)
|
327
|
+
|
328
|
+
# send START name as +data+ - the full log line is created through the +_pcd+ method.
|
329
|
+
self.log(name, _scene_opt(:processed, opts, { pcd: :start }))
|
330
|
+
|
331
|
+
# run the provided block and resolve result
|
332
|
+
result_str = case block.call
|
333
|
+
when true
|
334
|
+
'[SUCCESS]'.bg_green + ' '
|
335
|
+
when false
|
336
|
+
'[FAIL]'.bg_red + ' '
|
337
|
+
else
|
338
|
+
''
|
339
|
+
end
|
340
|
+
rescue => e
|
341
|
+
self.fatal("#{e.message} @ #{e.backtrace_locations&.first}") unless opts[:silent]
|
342
|
+
# reraise exception
|
343
|
+
raise
|
344
|
+
ensure
|
345
|
+
result_str ||= ''
|
346
|
+
|
347
|
+
# send END name with result & possible time as +data+ - the full log line is created through the +_pcd+ method.
|
348
|
+
self.log("#{name} #{result_str}#{(timer_key ? "(#{self.timer(:clear, timer_key, humanized: true)})" : '')}", _scene_opt(:processed, opts, { pcd: :end }))
|
349
|
+
|
350
|
+
# reduce level
|
351
|
+
processed_lvl(:down)
|
301
352
|
end
|
302
353
|
|
303
|
-
self.log("START :: #{name}", _scene_opt(:processed, opts, { pcd: :start }))
|
304
|
-
|
305
|
-
end_str = case block.call
|
306
|
-
when true
|
307
|
-
'SUCCESS'
|
308
|
-
when false
|
309
|
-
'FAILED'
|
310
|
-
else
|
311
|
-
name
|
312
|
-
end
|
313
|
-
|
314
|
-
self.log("END [#{end_str}] #{(timer_key ? "(duration: #{self.timer(:clear, timer_key, humanized: true)})" : '')}", _scene_opt(:processed, opts, { pcd: :end }))
|
315
|
-
|
316
|
-
processed_lvl(:down)
|
317
|
-
|
318
354
|
true
|
319
355
|
end
|
320
356
|
end
|
@@ -17,9 +17,8 @@ module RubySmart
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# load date extensions for logger
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
20
|
+
# since 'actionview' is loaded in different ways, we only can check for +installed?+ here...
|
21
|
+
if GemInfo.installed?('actionview')
|
22
|
+
# IMPORTANT: any require will break the loading process
|
23
|
+
RubySmart::SimpleLogger::Logger.include(ActionView::Helpers::DateHelper) unless RubySmart::SimpleLogger::Logger.included_modules.include?(ActionView::Helpers::DateHelper)
|
25
24
|
end
|
@@ -40,4 +40,6 @@ Gem::Specification.new do |spec|
|
|
40
40
|
spec.add_development_dependency 'rake', '~> 13.0'
|
41
41
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
42
42
|
spec.add_development_dependency 'yard', '~> 0.9'
|
43
|
+
spec.add_development_dependency 'yard-activesupport-concern', '~> 0.0.1'
|
44
|
+
spec.add_development_dependency 'yard-relative_markdown_links', '>= 0.4'
|
43
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_smart-simple_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Gonsior
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby_smart-support
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.9'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: yard-activesupport-concern
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.0.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.0.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: yard-relative_markdown_links
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.4'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.4'
|
97
125
|
description: "RubySmart::SimpleLogger is a fast, customizable logging library with
|
98
126
|
multi-device support, \nspecial (PRE-defined) scenes for better logging visibility.\n"
|
99
127
|
email:
|
@@ -146,7 +174,7 @@ metadata:
|
|
146
174
|
documentation_uri: https://rubydoc.info/gems/ruby_smart-simple_logger
|
147
175
|
changelog_uri: https://github.com/ruby-smart/simple_logger/blob/main/docs/CHANGELOG.md
|
148
176
|
allowed_push_host: https://rubygems.org
|
149
|
-
post_install_message:
|
177
|
+
post_install_message:
|
150
178
|
rdoc_options: []
|
151
179
|
require_paths:
|
152
180
|
- lib
|
@@ -161,8 +189,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
189
|
- !ruby/object:Gem::Version
|
162
190
|
version: '0'
|
163
191
|
requirements: []
|
164
|
-
rubygems_version: 3.
|
165
|
-
signing_key:
|
192
|
+
rubygems_version: 3.4.10
|
193
|
+
signing_key:
|
166
194
|
specification_version: 4
|
167
195
|
summary: A simple, multifunctional logging library for Ruby.
|
168
196
|
test_files: []
|