ruby_smart-simple_logger 1.3.0 → 1.5.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/README.md +48 -21
- data/docs/CHANGELOG.md +16 -0
- data/lib/ruby_smart/simple_logger/devices/memory_device.rb +0 -1
- data/lib/ruby_smart/simple_logger/devices/null_device.rb +42 -0
- data/lib/ruby_smart/simple_logger/extensions/helper.rb +12 -15
- data/lib/ruby_smart/simple_logger/extensions/mask.rb +11 -3
- data/lib/ruby_smart/simple_logger/extensions/scene.rb +13 -3
- data/lib/ruby_smart/simple_logger/gem_version.rb +1 -1
- data/lib/ruby_smart/simple_logger/logger.rb +1 -0
- data/lib/ruby_smart/simple_logger/scenes.rb +80 -60
- data/ruby_smart-simple_logger.gemspec +2 -2
- metadata +8 -7
- /data/{docs/LICENSE.txt → LICENSE.txt} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a08f3caf3bd643806e098079f29a399c3b99bf5d84528d1e2c034276b99ca2c9
|
4
|
+
data.tar.gz: 2a3caee2427ae5d8a51d7931749ac61c338af688c56993f48b9f412dffa85b98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccac78a543d4f6a20d15b86f044754fef1478bb7636607d228e359fa56093838dc1805bdc7147baa8845f97227cf06cc4ace949b3e14ec82745d2ee94c61c4bb
|
7
|
+
data.tar.gz: 44b6f4000abfff0f7b0f84eafd9caddf2708892576b6a8ed1d826490ae10795d8aa484ce70829884b23195cef7c52dce51e0801ef55af7321ca812e3527f2195
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
[](https://coveralls.io/github/ruby-smart/simple_logger?branch=main)
|
10
10
|
[](https://github.com/ruby-smart/simple_logger/actions/workflows/ruby.yml)
|
11
11
|
|
12
|
-
A simple, multifunctional logging library for Ruby.
|
12
|
+
A simple, multifunctional logging library for Ruby (and Rails).
|
13
13
|
It features a fast, customizable logging with multi-device support (e.g. log to STDOUT AND file).
|
14
14
|
Special (PRE-defined) scenes can be used for interactive CLI and better logging visibility.
|
15
15
|
|
@@ -36,7 +36,7 @@ Or install it yourself as:
|
|
36
36
|
## Enhancements
|
37
37
|
* PRE-defined scenes to fastly create a simple, structured CLI output. _(see [Scenes](#scenes))_
|
38
38
|
* Better log-visibility with masked output through scenes
|
39
|
-
*
|
39
|
+
* `awesome_print` gem compatibility for a prettified object debug
|
40
40
|
* Multi-device support (write to logfile & to STDOUT & to ... & to ...)
|
41
41
|
* 'klass_logger' instances for easier access _(see [klass_logger](#klass_logger_Usage))_
|
42
42
|
|
@@ -198,10 +198,11 @@ While you can just build a new logger _(or use the klass_logger)_ without any ar
|
|
198
198
|
|
199
199
|
### nil Builtin
|
200
200
|
|
201
|
-
A
|
202
|
-
For CLI or windowed programs it'll just send the logs to
|
203
|
-
For
|
204
|
-
|
201
|
+
A `nil` builtin will auto-detect the best logging solution for you:
|
202
|
+
* For CLI or windowed programs it'll just send the logs to `STDOUT`.
|
203
|
+
* For Debugging _(e.g. IDE-related debugging gems)_ it'll send the logs to the `Debugger`.
|
204
|
+
* For rails-applications it'll send to the current `Rails.logger` instance.
|
205
|
+
* Otherwise it'll store logs temporary in memory _(accessible through the #logs method)_
|
205
206
|
|
206
207
|
**Example:**
|
207
208
|
```ruby
|
@@ -211,7 +212,7 @@ logger.debug "some debug"
|
|
211
212
|
|
212
213
|
### stdout / stderr Builtin
|
213
214
|
|
214
|
-
A
|
215
|
+
A `:stdout / :stderr` builtin will send to `STDOUT / STDERR` and uses a colored output by default.
|
215
216
|
|
216
217
|
**Example:**
|
217
218
|
```ruby
|
@@ -224,9 +225,34 @@ logger = ::SimpleLogger.new(:stdout)
|
|
224
225
|
logger.debug "some debug"
|
225
226
|
```
|
226
227
|
|
228
|
+
### debugger Builtin
|
229
|
+
|
230
|
+
A `:debugger` builtin will send to the `Debugger` (e.g. your IDE's debugging gem)
|
231
|
+
|
232
|
+
**Example:**
|
233
|
+
```ruby
|
234
|
+
logger = ::SimpleLogger.new(:debugger)
|
235
|
+
|
236
|
+
# > will be shown within your debugging gem
|
237
|
+
logger.debug "some debug"
|
238
|
+
```
|
239
|
+
|
240
|
+
|
241
|
+
### null Builtin
|
242
|
+
|
243
|
+
A `:null` builtin will silently swallow all logging data (so it will not be send).
|
244
|
+
|
245
|
+
**Example:**
|
246
|
+
```ruby
|
247
|
+
logger = ::SimpleLogger.new(:null)
|
248
|
+
|
249
|
+
# >
|
250
|
+
logger.debug "some debug"
|
251
|
+
```
|
252
|
+
|
227
253
|
### rails Builtin
|
228
254
|
|
229
|
-
A
|
255
|
+
A `:rails` builtin will always send to the `Rails.logger` instance.
|
230
256
|
|
231
257
|
**Example:**
|
232
258
|
```ruby
|
@@ -238,9 +264,9 @@ logger.debug "some debug"
|
|
238
264
|
|
239
265
|
### proc Builtin
|
240
266
|
|
241
|
-
A
|
267
|
+
A `:proc` builtin will call the provided proc _(through `options[:proc]```)_ everytime a log will be written.
|
242
268
|
|
243
|
-
The data will be provided as array _(
|
269
|
+
The data will be provided as array _( `[severity, time, progname, data]` )_.
|
244
270
|
|
245
271
|
**Example:**
|
246
272
|
```ruby
|
@@ -255,7 +281,7 @@ logger.debug "some debug"
|
|
255
281
|
|
256
282
|
### memory Builtin
|
257
283
|
|
258
|
-
A
|
284
|
+
A `:memory` builtin will always store the logged data within an _instance variable_ and can be accessed through the `#logs` or `#logs_to_h` methods.
|
259
285
|
|
260
286
|
**Example:**
|
261
287
|
```ruby
|
@@ -276,7 +302,7 @@ logger.logs
|
|
276
302
|
|
277
303
|
### String Builtin
|
278
304
|
|
279
|
-
Providing a
|
305
|
+
Providing a `String` will always create and write to a new logfile.
|
280
306
|
|
281
307
|
**Example:**
|
282
308
|
```ruby
|
@@ -313,7 +339,7 @@ noformat_logger.debug "some debug without color and mask - uses the default form
|
|
313
339
|
|
314
340
|
### Module Builtin
|
315
341
|
|
316
|
-
Providing a
|
342
|
+
Providing a `module` will also create and write to a new logfile.
|
317
343
|
The path depends on the provided module name.
|
318
344
|
|
319
345
|
**Example:**
|
@@ -331,13 +357,13 @@ logger.debug "some debug"
|
|
331
357
|
|
332
358
|
### other Builtin
|
333
359
|
|
334
|
-
Providing any other Object must respond to
|
360
|
+
Providing any other Object must respond to `#write```.
|
335
361
|
|
336
362
|
-----
|
337
363
|
|
338
364
|
## Formats
|
339
365
|
|
340
|
-
The default formatter _(if no other was provided through
|
366
|
+
The default formatter _(if no other was provided through `opts[:formatter```)_ will provide the following PRE-defined formats:
|
341
367
|
_Also prints a colored output by default._
|
342
368
|
|
343
369
|
### default Format
|
@@ -447,7 +473,7 @@ logger = ::SimpleLogger.new(:stdout, payload: false)
|
|
447
473
|
### format
|
448
474
|
|
449
475
|
Provide a other format.
|
450
|
-
Possible values:
|
476
|
+
Possible values: `:default, :passthrough, :plain, :memory, :datalog```
|
451
477
|
```ruby
|
452
478
|
logger = ::SimpleLogger.new(format: :default)
|
453
479
|
logger = ::SimpleLogger.new(:memory, format: :passthrough)
|
@@ -465,7 +491,7 @@ logger.debug "debug 2"
|
|
465
491
|
|
466
492
|
### proc _(:proc-builtin ONLY)_
|
467
493
|
|
468
|
-
Provide a callback for the
|
494
|
+
Provide a callback for the `:proc` builtin.
|
469
495
|
```ruby
|
470
496
|
logger = ::SimpleLogger.new(:proc, proc: lambda{|data| ... })
|
471
497
|
```
|
@@ -528,7 +554,7 @@ logger.debug({a: {custom: 'object'}})
|
|
528
554
|
|
529
555
|
### inspector
|
530
556
|
|
531
|
-
Provide a other
|
557
|
+
Provide a other `inspector` method for the data-debug.
|
532
558
|
|
533
559
|
```ruby
|
534
560
|
logger = ::SimpleLogger.new(inspector: :to_s)
|
@@ -541,13 +567,13 @@ logger.debug({ a: 1, b: 2 })
|
|
541
567
|
|
542
568
|
## _defaults_
|
543
569
|
|
544
|
-
Device default options are still available:
|
570
|
+
Device default options are still available: `shift_age, shift_size, progname, datetime_format, shift_period_suffix, binmode```
|
545
571
|
|
546
572
|
-----
|
547
573
|
|
548
574
|
## Scenes
|
549
575
|
|
550
|
-
The following PRE-defined scenes are available. _(You can define your own scenes by using the class method
|
576
|
+
The following PRE-defined scenes are available. _(You can define your own scenes by using the class method `.scene```)_
|
551
577
|
|
552
578
|
### debug(data, subject = 'Debug')
|
553
579
|
```ruby
|
@@ -768,6 +794,7 @@ end
|
|
768
794
|
- line
|
769
795
|
- print
|
770
796
|
- nl
|
797
|
+
- model _(rails only)_
|
771
798
|
|
772
799
|
-----
|
773
800
|
|
@@ -784,7 +811,7 @@ This project is intended to be a safe, welcoming space for collaboration, and co
|
|
784
811
|
|
785
812
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
786
813
|
|
787
|
-
A copy of the [LICENSE](
|
814
|
+
A copy of the [LICENSE](LICENSE.txt) can be found @ the docs.
|
788
815
|
|
789
816
|
## Code of Conduct
|
790
817
|
|
data/docs/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# RubySmart::SimpleLogger - CHANGELOG
|
2
2
|
|
3
|
+
## [1.5.0] - 2024-09-12
|
4
|
+
* **[add]** `SimpleLogger.scene?`-method to check for registered scene options
|
5
|
+
* **[ref]** scene options to **keyword**-args _(**WARNING:** This may break existing calls to the scene methods)_
|
6
|
+
* **[fix]** `model` scene not calling related scene methods
|
7
|
+
* **[fix]** `subject` parameter for default severity-methods not cast as string _(now any object may be provided - which calls `#to_s` method)_
|
8
|
+
|
9
|
+
## [1.4.0] - 2024-07-31
|
10
|
+
* **[add]** 'null'-device / builtin
|
11
|
+
* **[add]** 'debugger'-builtin to send logs to the debugging gem
|
12
|
+
* **[add]** new logging method `model` _(for rails applications only)_
|
13
|
+
* **[ref]** `nil`-builtin to detect `Debugger` after checking for stdout
|
14
|
+
* **[ref]** `mask`-length to 120 _(was 100 by default)_
|
15
|
+
* **[ref]** `ruby_smart-support`-gem dependency to 1.5
|
16
|
+
* **[fix]** exception _(to build a new device)_ if a Logger was provided
|
17
|
+
* **[fix]** mask-reference manipulation on inherited classes
|
18
|
+
|
3
19
|
## [1.3.0] - 2023-08-15
|
4
20
|
* **[add]** exception message within `processed`-scene
|
5
21
|
* **[add]** new logging option `tag`, to prefix a log-string with a [TAG]
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubySmart
|
4
|
+
module SimpleLogger
|
5
|
+
module Devices
|
6
|
+
class NullDevice
|
7
|
+
attr_reader :status
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@status = true
|
11
|
+
end
|
12
|
+
|
13
|
+
def write(*)
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
alias_method :<<, :write
|
18
|
+
|
19
|
+
# disables writing
|
20
|
+
def close
|
21
|
+
@status = false
|
22
|
+
end
|
23
|
+
|
24
|
+
# enables writing
|
25
|
+
def reopen
|
26
|
+
@status = true
|
27
|
+
end
|
28
|
+
|
29
|
+
# clears all logs
|
30
|
+
def clear!
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
|
34
|
+
# returns logs
|
35
|
+
# @return [Array] logs
|
36
|
+
def logs
|
37
|
+
[]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -132,11 +132,19 @@ module RubySmart
|
|
132
132
|
when nil # builtin is nil - resolve optimal device for current environment
|
133
133
|
if ::ThreadInfo.stdout?
|
134
134
|
_resolve_device(:stdout, opts)
|
135
|
+
elsif ::ThreadInfo.debugger?
|
136
|
+
_resolve_device(:debugger, opts)
|
135
137
|
elsif ::ThreadInfo.rails? && ::Rails.logger
|
136
138
|
_resolve_device(:rails, opts)
|
137
139
|
else
|
138
140
|
_resolve_device(:memory, opts)
|
139
141
|
end
|
142
|
+
when :null
|
143
|
+
::RubySmart::SimpleLogger::Devices::NullDevice.new
|
144
|
+
when :debugger
|
145
|
+
raise "Unable to build SimpleLogger with 'debugger' builtin for not initialized Debugger!" unless ThreadInfo.debugger?
|
146
|
+
|
147
|
+
_resolve_device(::Debugger.logger, opts)
|
140
148
|
when :stdout
|
141
149
|
STDOUT
|
142
150
|
when :stderr
|
@@ -148,9 +156,9 @@ module RubySmart
|
|
148
156
|
if ThreadInfo.console? && ::Rails.logger.instance_variable_get(:@logdev).dev != STDOUT
|
149
157
|
::RubySmart::SimpleLogger::Devices::MultiDevice
|
150
158
|
.register(_resolve_device(:stdout, opts))
|
151
|
-
.register(::Rails.logger
|
159
|
+
.register(_resolve_device(::Rails.logger, opts))
|
152
160
|
else
|
153
|
-
::Rails.logger
|
161
|
+
_resolve_device(::Rails.logger, opts)
|
154
162
|
end
|
155
163
|
when :proc
|
156
164
|
# force overwrite opts
|
@@ -171,6 +179,8 @@ module RubySmart
|
|
171
179
|
# force overwrite opts
|
172
180
|
opts[:clr] = false
|
173
181
|
_logdev(opts, builtin)
|
182
|
+
when ::Logger
|
183
|
+
builtin.instance_variable_get(:@logdev).dev
|
174
184
|
else
|
175
185
|
_logdev(opts, builtin)
|
176
186
|
end
|
@@ -360,19 +370,6 @@ module RubySmart
|
|
360
370
|
res_or_clr.to_sym
|
361
371
|
end
|
362
372
|
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
|
376
373
|
end
|
377
374
|
end
|
378
375
|
end
|
@@ -13,17 +13,25 @@ module RubySmart
|
|
13
13
|
# @option [String] :char - the character to be used as mask
|
14
14
|
# @option [Integer] :length - the mask length (amount of mask chars be line)
|
15
15
|
# @option [Symbol] :clr - the color to be used by printing the mask
|
16
|
-
self.mask = { char: '=', length:
|
16
|
+
self.mask = { char: '=', length: 120, clr: :blue }
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
module ClassMethods
|
21
21
|
def mask
|
22
|
-
|
22
|
+
@mask
|
23
23
|
end
|
24
24
|
|
25
25
|
def mask=(mask)
|
26
|
-
|
26
|
+
@mask = mask
|
27
|
+
end
|
28
|
+
|
29
|
+
# prevents to overwrite parent class through inheriting subclasses
|
30
|
+
def inherited(subclass)
|
31
|
+
super
|
32
|
+
|
33
|
+
# dup existing values
|
34
|
+
subclass.mask = self.mask.dup
|
27
35
|
end
|
28
36
|
end
|
29
37
|
|
@@ -27,6 +27,13 @@ module RubySmart
|
|
27
27
|
class_variable_set('@@scenes', scenes)
|
28
28
|
end
|
29
29
|
|
30
|
+
# returns true, if provided *key* is a registered scene option
|
31
|
+
# @param [Symbol] key
|
32
|
+
# @return [Boolean]
|
33
|
+
def scene?(key)
|
34
|
+
scenes.key?(key)
|
35
|
+
end
|
36
|
+
|
30
37
|
# registers a new scene by provided key & options
|
31
38
|
# also defines this method by provided block
|
32
39
|
#
|
@@ -64,11 +71,14 @@ module RubySmart
|
|
64
71
|
|
65
72
|
private
|
66
73
|
|
67
|
-
# resolves scene options by provided key & merges them with additional
|
74
|
+
# resolves scene options by provided key & merges them with additional *opts*
|
68
75
|
# @param [Symbol] key
|
69
76
|
# @param [Array<Hash>] opts
|
70
|
-
def
|
71
|
-
|
77
|
+
def _scene_opts(key, **opts)
|
78
|
+
{
|
79
|
+
**(scenes[key] || {}),
|
80
|
+
**opts
|
81
|
+
}
|
72
82
|
end
|
73
83
|
end
|
74
84
|
end
|
@@ -11,9 +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,
|
15
|
-
|
16
|
-
self.log data, _scene_opt(:debug, { subject: subject }, opts)
|
14
|
+
base.scene :debug, { level: :debug, inspect: true, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, subject = 'Debug', **opts|
|
15
|
+
self.log data, _scene_opts(:debug, subject: subject.to_s, **opts)
|
17
16
|
end
|
18
17
|
|
19
18
|
# info method (BASE)
|
@@ -23,9 +22,8 @@ module RubySmart
|
|
23
22
|
# > ================================================= [Info] =================================================
|
24
23
|
# > DATA
|
25
24
|
# > ==========================================================================================================
|
26
|
-
base.scene :info, { level: :info, mask: { clr: :cyan }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
27
|
-
|
28
|
-
self.log data, _scene_opt(:info, { subject: subject }, opts)
|
25
|
+
base.scene :info, { level: :info, mask: { clr: :cyan }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, subject = 'Info', **opts|
|
26
|
+
self.log data, _scene_opts(:info, subject: subject.to_s, **opts)
|
29
27
|
end
|
30
28
|
|
31
29
|
# warn method (BASE)
|
@@ -35,9 +33,8 @@ module RubySmart
|
|
35
33
|
# > ================================================= [Warn] =================================================
|
36
34
|
# > DATA
|
37
35
|
# > ==========================================================================================================
|
38
|
-
base.scene :warn, { level: :warn, mask: { clr: :yellow }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
39
|
-
|
40
|
-
self.log data, _scene_opt(:warn, { subject: subject }, opts)
|
36
|
+
base.scene :warn, { level: :warn, mask: { clr: :yellow }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, subject = 'Warn', **opts|
|
37
|
+
self.log data, _scene_opts(:warn, subject: subject.to_s, **opts)
|
41
38
|
end
|
42
39
|
|
43
40
|
# error method (BASE)
|
@@ -47,9 +44,8 @@ module RubySmart
|
|
47
44
|
# > ================================================ [Error] =================================================
|
48
45
|
# > DATA
|
49
46
|
# > ==========================================================================================================
|
50
|
-
base.scene :error, { level: :error, mask: { clr: :red }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data
|
51
|
-
|
52
|
-
self.log data, _scene_opt(:error, { subject: subject }, opts)
|
47
|
+
base.scene :error, { level: :error, mask: { clr: :red }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, subject = 'Error', **opts|
|
48
|
+
self.log data, _scene_opts(:error, subject: subject.to_s, **opts)
|
53
49
|
end
|
54
50
|
|
55
51
|
# fatal method (BASE)
|
@@ -59,9 +55,8 @@ module RubySmart
|
|
59
55
|
# > ================================================ [Fatal] =================================================
|
60
56
|
# > DATA
|
61
57
|
# > ==========================================================================================================
|
62
|
-
base.scene :fatal, { level: :fatal, mask: { clr: :bg_red }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
63
|
-
|
64
|
-
self.log data, _scene_opt(:fatal, { subject: subject }, opts)
|
58
|
+
base.scene :fatal, { level: :fatal, mask: { clr: :bg_red }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, subject = 'Fatal', **opts|
|
59
|
+
self.log data, _scene_opts(:fatal, subject: subject.to_s, **opts)
|
65
60
|
end
|
66
61
|
|
67
62
|
# unknown method (BASE)
|
@@ -71,9 +66,8 @@ module RubySmart
|
|
71
66
|
# > =============================================== [Unknown] ================================================
|
72
67
|
# > DATA
|
73
68
|
# > ==========================================================================================================
|
74
|
-
base.scene :unknown, { level: :unknown, mask: { clr: :gray }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
75
|
-
|
76
|
-
self.log data, _scene_opt(:unknown, { subject: subject }, opts)
|
69
|
+
base.scene :unknown, { level: :unknown, mask: { clr: :gray }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, subject = 'Unknown', **opts|
|
70
|
+
self.log data, _scene_opts(:unknown, subject: subject.to_s, **opts)
|
77
71
|
end
|
78
72
|
|
79
73
|
# success method
|
@@ -83,9 +77,8 @@ module RubySmart
|
|
83
77
|
# > ================================================ [Success] ================================================
|
84
78
|
# > DATA
|
85
79
|
# > ===========================================================================================================
|
86
|
-
base.scene :success, { level: :success, mask: { clr: :green }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data,
|
87
|
-
|
88
|
-
self.log data, _scene_opt(:success, { subject: subject }, opts)
|
80
|
+
base.scene :success, { level: :success, mask: { clr: :green }, payload: [[:mask, ' [%{subject}] '], :__data__, :mask] } do |data, subject = 'Success', **opts|
|
81
|
+
self.log data, _scene_opts(:success, subject: subject.to_s, **opts)
|
89
82
|
end
|
90
83
|
|
91
84
|
# header method
|
@@ -95,11 +88,11 @@ module RubySmart
|
|
95
88
|
# > ===========================================================================================================
|
96
89
|
# > ================================================ <Subject> ================================================
|
97
90
|
# > ===========================================================================================================
|
98
|
-
base.scene :header, { level: :debug, payload: [:mask, [:mask, ' <%{subject}> '], :mask] } do |subject, opts
|
91
|
+
base.scene :header, { level: :debug, payload: [:mask, [:mask, ' <%{subject}> '], :mask] } do |subject, **opts|
|
99
92
|
# autostart a timer method, if required
|
100
93
|
self.timer(:start, :default) if opts[:timer]
|
101
94
|
|
102
|
-
self.log nil,
|
95
|
+
self.log nil, _scene_opts(:header, subject: subject.to_s, **opts)
|
103
96
|
end
|
104
97
|
|
105
98
|
# footer method
|
@@ -109,8 +102,8 @@ module RubySmart
|
|
109
102
|
# > ===========================================================================================================
|
110
103
|
# > ================================================ >Subject< ================================================
|
111
104
|
# > ===========================================================================================================
|
112
|
-
base.scene :footer, { level: :debug, payload: [:mask, [:mask, ' >%{subject}< '], :mask] } do |subject, opts
|
113
|
-
self.log nil,
|
105
|
+
base.scene :footer, { level: :debug, payload: [:mask, [:mask, ' >%{subject}< '], :mask] } do |subject, **opts|
|
106
|
+
self.log nil, _scene_opts(:footer, subject: subject.to_s, **opts)
|
114
107
|
|
115
108
|
# clears & prints timer
|
116
109
|
self.desc("duration: #{self.timer(:clear, :default, :humanized => true)}") if opts[:timer]
|
@@ -123,8 +116,8 @@ module RubySmart
|
|
123
116
|
# > --------------------------------------------------------------------------------
|
124
117
|
# > #----------------------------------- Subject ----------------------------------#
|
125
118
|
# > --------------------------------------------------------------------------------
|
126
|
-
base.scene :topic, { level: :debug, mask: { char: '-', length: 95, clr: :blueish }, payload: [:mask, [:mask, '%{title}'], :mask] } do |subject, opts
|
127
|
-
opts =
|
119
|
+
base.scene :topic, { level: :debug, mask: { char: '-', length: 95, clr: :blueish }, payload: [:mask, [:mask, '%{title}'], :mask] } do |subject, **opts|
|
120
|
+
opts = _scene_opts(:topic, **opts)
|
128
121
|
txt = " #{subject} ".center(opts[:mask][:length] - 2, opts[:mask][:char])
|
129
122
|
opts[:title] = "##{txt}#"
|
130
123
|
|
@@ -137,8 +130,8 @@ module RubySmart
|
|
137
130
|
#
|
138
131
|
# > # Subject
|
139
132
|
# > ----------------------------------------------------------------------
|
140
|
-
base.scene :theme, { level: :debug, clr: :purple, mask: { char: '-', length: 85, clr: :purple }, payload: [[:txt, '# %{subject}'], :mask] } do |subject, opts
|
141
|
-
self.log nil,
|
133
|
+
base.scene :theme, { level: :debug, clr: :purple, mask: { char: '-', length: 85, clr: :purple }, payload: [[:txt, '# %{subject}'], :mask] } do |subject, **opts|
|
134
|
+
self.log nil, _scene_opts(:theme, subject: subject.to_s, **opts)
|
142
135
|
end
|
143
136
|
|
144
137
|
# theme_result method
|
@@ -148,9 +141,9 @@ module RubySmart
|
|
148
141
|
# > ----------------------------------------------------------------------
|
149
142
|
# > -> Result
|
150
143
|
# >
|
151
|
-
base.scene :theme_result, { level: :debug, mask: { char: '-', length: 85, clr: :purple }, payload: [:mask, [:txt, '-> %{result}'], ''] } do |result, status = nil, opts
|
144
|
+
base.scene :theme_result, { level: :debug, mask: { char: '-', length: 85, clr: :purple }, payload: [:mask, [:txt, '-> %{result}'], ''] } do |result, status = nil, **opts|
|
152
145
|
res_or_clr = status.nil? ? result : status
|
153
|
-
self.log nil,
|
146
|
+
self.log nil, _scene_opts(:theme_result, result: result, clr: _res_clr(res_or_clr), **opts)
|
154
147
|
end
|
155
148
|
|
156
149
|
# theme_line method
|
@@ -158,8 +151,8 @@ module RubySmart
|
|
158
151
|
# prints: colored line with no text
|
159
152
|
#
|
160
153
|
# > ----------------------------------------------------------------------
|
161
|
-
base.scene :theme_line, { level: :debug, mask: { char: '-', length: 85, clr: :purple }, payload: [:mask] } do
|
162
|
-
self.log nil,
|
154
|
+
base.scene :theme_line, { level: :debug, mask: { char: '-', length: 85, clr: :purple }, payload: [:mask] } do |**opts|
|
155
|
+
self.log nil, _scene_opts(:theme_line, **opts)
|
163
156
|
end
|
164
157
|
|
165
158
|
# desc method
|
@@ -168,8 +161,8 @@ module RubySmart
|
|
168
161
|
#
|
169
162
|
# > "description"
|
170
163
|
# >
|
171
|
-
base.scene :desc, { level: :debug, clr: :purple, payload: [[:txt, '%{description}']] } do |description, opts
|
172
|
-
self.log nil,
|
164
|
+
base.scene :desc, { level: :debug, clr: :purple, payload: [[:txt, '%{description}']] } do |description, **opts|
|
165
|
+
self.log nil, _scene_opts(:desc, description: description.to_s, **opts)
|
173
166
|
end
|
174
167
|
|
175
168
|
# job method
|
@@ -179,8 +172,8 @@ module RubySmart
|
|
179
172
|
#
|
180
173
|
# > - Job name =>
|
181
174
|
# ________________________________________________________________ <- 64 chars
|
182
|
-
base.scene :job, { level: :debug, clr: :cyan, nl: false, length: 64, payload: [[:concat, ['- ', [:txt, '%{name}'], ' => ']]] } do |name, opts
|
183
|
-
self.log nil,
|
175
|
+
base.scene :job, { level: :debug, clr: :cyan, nl: false, length: 64, payload: [[:concat, ['- ', [:txt, '%{name}'], ' => ']]] } do |name, **opts, &block|
|
176
|
+
self.log nil, _scene_opts(:job, name: name, **opts)
|
184
177
|
self.result(*block.call) if block_given?
|
185
178
|
end
|
186
179
|
|
@@ -191,8 +184,8 @@ module RubySmart
|
|
191
184
|
#
|
192
185
|
# > * Subjob name =>
|
193
186
|
# ______________________________________________________________ <- 62 chars
|
194
|
-
base.scene :sub_job, { level: :debug, clr: :cyan, nl: false, length: 62, payload: [[:concat, [' * ', [:txt, '%{name}'], ' => ']]] } do |name, opts
|
195
|
-
self.log nil,
|
187
|
+
base.scene :sub_job, { level: :debug, clr: :cyan, nl: false, length: 62, payload: [[:concat, [' * ', [:txt, '%{name}'], ' => ']]] } do |name, **opts, &block|
|
188
|
+
self.log nil, _scene_opts(:sub_job, name: name, **opts)
|
196
189
|
self.result(*block.call) if block_given?
|
197
190
|
end
|
198
191
|
|
@@ -201,9 +194,9 @@ module RubySmart
|
|
201
194
|
# prints: colored result
|
202
195
|
#
|
203
196
|
# > Result
|
204
|
-
base.scene :result, { level: :debug, payload: [[:txt, '%{result}']] } do |result, status = nil, opts
|
197
|
+
base.scene :result, { level: :debug, payload: [[:txt, '%{result}']] } do |result, status = nil, **opts|
|
205
198
|
res_or_clr = status.nil? ? result : status
|
206
|
-
self.log nil,
|
199
|
+
self.log nil, _scene_opts(:result, result: result, clr: _res_clr(res_or_clr), **opts)
|
207
200
|
end
|
208
201
|
|
209
202
|
# job_result method
|
@@ -211,9 +204,9 @@ module RubySmart
|
|
211
204
|
# prints: job with combined colored result
|
212
205
|
#
|
213
206
|
# > - Job name => Result
|
214
|
-
base.scene :job_result, { level: :debug } do |name, result, status = nil, opts
|
215
|
-
self.job(name, opts)
|
216
|
-
self.result(result, status, opts)
|
207
|
+
base.scene :job_result, { level: :debug } do |name, result, status = nil, **opts|
|
208
|
+
self.job(name, **opts)
|
209
|
+
self.result(result, status, **opts)
|
217
210
|
end
|
218
211
|
|
219
212
|
# sub_job_result method
|
@@ -221,9 +214,9 @@ module RubySmart
|
|
221
214
|
# prints: sub_job with combined colored result
|
222
215
|
#
|
223
216
|
# > * Subjob name => Result
|
224
|
-
base.scene :sub_job_result, { level: :debug } do |name, result, status = nil, opts
|
225
|
-
self.sub_job(name, opts)
|
226
|
-
self.result(result, status, opts)
|
217
|
+
base.scene :sub_job_result, { level: :debug } do |name, result, status = nil, **opts|
|
218
|
+
self.sub_job(name, **opts)
|
219
|
+
self.result(result, status, **opts)
|
227
220
|
end
|
228
221
|
|
229
222
|
# line method
|
@@ -231,8 +224,8 @@ module RubySmart
|
|
231
224
|
# prints: just a line with data
|
232
225
|
#
|
233
226
|
# > DATA
|
234
|
-
base.scene :line, { level: :debug } do |data, opts
|
235
|
-
self.log data,
|
227
|
+
base.scene :line, { level: :debug } do |data, **opts|
|
228
|
+
self.log data, _scene_opts(:line, **opts)
|
236
229
|
end
|
237
230
|
|
238
231
|
# print method
|
@@ -240,8 +233,8 @@ module RubySmart
|
|
240
233
|
# prints: prints data without a newline
|
241
234
|
#
|
242
235
|
# > DATA
|
243
|
-
base.scene :print, { level: :debug, nl: false } do |data, opts
|
244
|
-
self.log data,
|
236
|
+
base.scene :print, { level: :debug, nl: false } do |data, **opts|
|
237
|
+
self.log data, _scene_opts(:print, **opts)
|
245
238
|
end
|
246
239
|
|
247
240
|
# nl method
|
@@ -250,8 +243,8 @@ module RubySmart
|
|
250
243
|
#
|
251
244
|
# >
|
252
245
|
# >
|
253
|
-
base.scene :nl, { level: :debug } do
|
254
|
-
self.log '',
|
246
|
+
base.scene :nl, { level: :debug } do |**opts|
|
247
|
+
self.log '', _scene_opts(:nl, **opts)
|
255
248
|
end
|
256
249
|
|
257
250
|
# spec method
|
@@ -263,7 +256,7 @@ module RubySmart
|
|
263
256
|
# "other" => ? (yellow)
|
264
257
|
#
|
265
258
|
# > .FFF...??...F....F...F..???....F...??
|
266
|
-
base.scene :spec, { level: :debug, nl: false, payload: [[:txt, '%{result}']] } do |status, opts
|
259
|
+
base.scene :spec, { level: :debug, nl: false, payload: [[:txt, '%{result}']] } do |status, **opts|
|
267
260
|
result = if status.is_a?(TrueClass)
|
268
261
|
'.'
|
269
262
|
elsif status.is_a?(FalseClass)
|
@@ -272,7 +265,7 @@ module RubySmart
|
|
272
265
|
status = :yellow
|
273
266
|
'?'
|
274
267
|
end
|
275
|
-
self.log nil,
|
268
|
+
self.log nil, _scene_opts(:spec, result: result, clr: _res_clr(status), **opts)
|
276
269
|
end
|
277
270
|
|
278
271
|
# progress method
|
@@ -283,7 +276,7 @@ module RubySmart
|
|
283
276
|
# > - Progress of Step 1 [ 40%] ===================>------------------------------
|
284
277
|
# ________________________________________________ <- 48 chars
|
285
278
|
# 50 chars -> __________________________________________________
|
286
|
-
base.scene :progress, { level: :debug, payload: [[:txt, '- %{name} [%{perc}%] %{progress}']] } do |name, perc, opts
|
279
|
+
base.scene :progress, { level: :debug, payload: [[:txt, '- %{name} [%{perc}%] %{progress}']] } do |name, perc, **opts|
|
287
280
|
pmask_length = 50
|
288
281
|
|
289
282
|
# convert and fix progress
|
@@ -298,7 +291,7 @@ module RubySmart
|
|
298
291
|
|
299
292
|
progress_string = _clr(('=' * pmask_left_length) + '>', :green) + _clr('-' * pmask_right_length, :red)
|
300
293
|
perc_string = perc.to_s.rjust(3, ' ')
|
301
|
-
self.log nil,
|
294
|
+
self.log nil, _scene_opts(:progress, name: _clr(_lgth(name, 48), :cyan), perc: perc_string, progress: progress_string, **opts)
|
302
295
|
end
|
303
296
|
|
304
297
|
# processed method
|
@@ -309,7 +302,7 @@ module RubySmart
|
|
309
302
|
# ╟ doing some cool log
|
310
303
|
# ╟ doing some extra log
|
311
304
|
# ╚ END ❯ job [SUCCESS] (duration: 4.34223)
|
312
|
-
base.scene :processed, { level: :debug } do |name, opts
|
305
|
+
base.scene :processed, { level: :debug } do |name, **opts, &block|
|
313
306
|
# increase level
|
314
307
|
lvl = processed_lvl(:up)
|
315
308
|
|
@@ -326,7 +319,7 @@ module RubySmart
|
|
326
319
|
self.timer(:start, timer_key)
|
327
320
|
|
328
321
|
# send START name as +data+ - the full log line is created through the +_pcd+ method.
|
329
|
-
self.log(name,
|
322
|
+
self.log(name, _scene_opts(:processed, **opts, pcd: :start))
|
330
323
|
|
331
324
|
# run the provided block and resolve result
|
332
325
|
result_str = case block.call
|
@@ -345,7 +338,7 @@ module RubySmart
|
|
345
338
|
result_str ||= ''
|
346
339
|
|
347
340
|
# 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)})" : '')}",
|
341
|
+
self.log("#{name} #{result_str}#{(timer_key ? "(#{self.timer(:clear, timer_key, humanized: true)})" : '')}", _scene_opts(:processed, **opts, pcd: :end ))
|
349
342
|
|
350
343
|
# reduce level
|
351
344
|
processed_lvl(:down)
|
@@ -353,6 +346,33 @@ module RubySmart
|
|
353
346
|
|
354
347
|
true
|
355
348
|
end
|
349
|
+
|
350
|
+
# model method
|
351
|
+
# log level @ error/success/info
|
352
|
+
# prints: ActiveRecord::Base related data, depending on the models "save" state (also shows possible errors)
|
353
|
+
base.scene :model do |model, status = nil, **opts|
|
354
|
+
# build model-logging string
|
355
|
+
mdl_string = "#{model.id.present? ? "##{model.id} - " : ''}#{model.to_s[0..49]}"
|
356
|
+
|
357
|
+
# resolve model's status
|
358
|
+
status = ((model.persisted? && model.errors.empty?) ? (model.previous_changes.blank? ? :skipped : :success) : :error) if status.nil?
|
359
|
+
|
360
|
+
# switch between status
|
361
|
+
case status
|
362
|
+
when :success
|
363
|
+
# show verbose logging for updated records
|
364
|
+
if opts[:verbose] != false && !model.previously_new_record?
|
365
|
+
self.success("#{mdl_string} (#{model.previous_changes.inspect})", tag: "#{model.class.name.upcase}|UPDATED", **opts)
|
366
|
+
else
|
367
|
+
self.success(mdl_string, tag: "#{model.class.name.upcase}|#{(model.previously_new_record? ? 'CREATED' : 'UPDATED')}", **opts)
|
368
|
+
end
|
369
|
+
when :error
|
370
|
+
msg_string = model.errors.full_messages.join(', ')
|
371
|
+
self.error("#{mdl_string} (#{msg_string.present? ? msg_string : '-'})", tag: "#{model.class.name.upcase}|ERROR", **opts)
|
372
|
+
else
|
373
|
+
self.info(mdl_string, tag: "#{model.class.name.upcase}|#{status}", **opts)
|
374
|
+
end
|
375
|
+
end
|
356
376
|
end
|
357
377
|
end
|
358
378
|
end
|
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ['Tobias Gonsior']
|
9
9
|
spec.email = ['info@ruby-smart.org']
|
10
10
|
|
11
|
-
spec.summary = "A simple, multifunctional logging library for Ruby."
|
11
|
+
spec.summary = "A simple, multifunctional logging library for Ruby (and Rails)."
|
12
12
|
spec.description = <<~DESC
|
13
13
|
RubySmart::SimpleLogger is a fast, customizable logging library with multi-device support,
|
14
14
|
special (PRE-defined) scenes for better logging visibility.
|
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
|
34
34
|
spec.require_paths = ['lib']
|
35
35
|
|
36
|
-
spec.add_dependency 'ruby_smart-support', '~> 1.
|
36
|
+
spec.add_dependency 'ruby_smart-support', '~> 1.5'
|
37
37
|
|
38
38
|
spec.add_development_dependency 'awesome_print', '~> 1.9'
|
39
39
|
spec.add_development_dependency 'coveralls_reborn', '~> 0.25'
|
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.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Gonsior
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby_smart-support
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.5'
|
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: '1.
|
26
|
+
version: '1.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: awesome_print
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,19 +135,20 @@ files:
|
|
135
135
|
- ".rspec"
|
136
136
|
- ".yardopts"
|
137
137
|
- Gemfile
|
138
|
+
- LICENSE.txt
|
138
139
|
- README.md
|
139
140
|
- Rakefile
|
140
141
|
- bin/console
|
141
142
|
- bin/setup
|
142
143
|
- docs/CHANGELOG.md
|
143
144
|
- docs/CODE_OF_CONDUCT.md
|
144
|
-
- docs/LICENSE.txt
|
145
145
|
- lib/ruby_smart-debugger.rb
|
146
146
|
- lib/ruby_smart-simple_logger.rb
|
147
147
|
- lib/ruby_smart/simple_logger.rb
|
148
148
|
- lib/ruby_smart/simple_logger/core_ext/ruby/string.rb
|
149
149
|
- lib/ruby_smart/simple_logger/devices/memory_device.rb
|
150
150
|
- lib/ruby_smart/simple_logger/devices/multi_device.rb
|
151
|
+
- lib/ruby_smart/simple_logger/devices/null_device.rb
|
151
152
|
- lib/ruby_smart/simple_logger/devices/proc_device.rb
|
152
153
|
- lib/ruby_smart/simple_logger/extensions/helper.rb
|
153
154
|
- lib/ruby_smart/simple_logger/extensions/logs.rb
|
@@ -189,8 +190,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
190
|
- !ruby/object:Gem::Version
|
190
191
|
version: '0'
|
191
192
|
requirements: []
|
192
|
-
rubygems_version: 3.
|
193
|
+
rubygems_version: 3.5.14
|
193
194
|
signing_key:
|
194
195
|
specification_version: 4
|
195
|
-
summary: A simple, multifunctional logging library for Ruby.
|
196
|
+
summary: A simple, multifunctional logging library for Ruby (and Rails).
|
196
197
|
test_files: []
|
File without changes
|