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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d4f5d3ae3592f31b6c012044205c37d859c9e809d58f8cce63c7b6b2ed634829
4
- data.tar.gz: d50becd65a8386e2466ddebcbbbd6bf2ec92aad95f4c5ae76288974429d607bc
3
+ metadata.gz: 101c7a9ab2862c9ff3e7ace74f812a20a522dfa7fa8c6fcdf9f9accc53fd29e2
4
+ data.tar.gz: 1e1f7d6e1c9cbfe48a21cc8cceaa7cd37de7712363ae78e80bcff87aa6c5ca5a
5
5
  SHA512:
6
- metadata.gz: dbe6aab96f5a2f67f85fd5147462d65e0f8496a1271406710f4d9e8b5df3a245c8f7e1292a9ac3f548973a204442332abafe21a8a97b6724f25a513b3eef7148
7
- data.tar.gz: 5165beba92525197a3d9359bc7513c15e4aa6057a3bea5902870541141fe9ca4fdb3b4f6270eefcbbbf7ca75aff209e03cf39d4d8eb00d34e3292a45e71960ad
6
+ metadata.gz: 875fc9ea64929088e6a445f43b1e3a0c7b1c92de106a53c8112c68a3eb28ab5ea081c2a1e21d7d672d7e3109c68e68a83283be41364d65b2c450b6932408e15a
7
+ data.tar.gz: 9be8b0019a5afb3b3a9050dcb6139d9cf2ffe9fbd89549ebb717e8e4a2b59ee981dad95948400836a78e8b8205a324dbd2a35dea6638567143e37cbc93425e32
@@ -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
- ruby-version: ['3.1', '3.0', '2.7', '2.6']
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
- - uses: actions/checkout@v3
29
- - name: Set up Ruby
30
- # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
31
- # change this to (see https://github.com/ruby/setup-ruby#versioning):
32
- # uses: ruby/setup-ruby@v1
33
- uses: ruby/setup-ruby@0a29871fe2b0200a17a4497bae54fe5df0d973aa # v1.115.3
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 :: Process Alpha
751
+ # ╔ START Process Alpha
752
752
  # ╟ find files
753
753
  # ╟ found 34 files
754
- # ║ ┌ START :: extracting ...
754
+ # ║ ┌ START extracting ...
755
755
  # ║ ├ 10% done
756
756
  # ║ ├ 20% done
757
757
  # ║ ├ 100% done
758
- # ║ └ END [SUCCESS] (duration: 0.000267545)
759
- # ║ ┌ START :: transforming ...
758
+ # ║ └ END ❯ extracting ... [SUCCESS] (0.000244804)
759
+ # ║ ┌ START transforming ...
760
760
  # ║ ├ bad memory
761
761
  # ║ ├ rolling back
762
- # ║ └ END [FAILED]
763
- # ╚ END [Process Alpha] (duration: 0.001040807)
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 = true if @ignore_payload.nil? && opts[:payload] == false
43
+ @ignore_payload = true if @ignore_payload.nil? && opts[:payload] == false
47
44
 
48
- # set the inspector to be used for data inspection.
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
- builtin = opts.delete(:builtin)
67
+ # remove builtin key from opts and force an array
68
+ builtins = Array(opts.delete(:builtin))
66
69
 
67
- # retransform array into single value
68
- builtin = builtin[0] if builtin.is_a?(Array) && builtin.length < 2
70
+ # expand builtins with stdout
71
+ builtins << :stdout if opts.delete(:stdout)
69
72
 
70
- # expand current builtin with optional provided keywords
71
- if opts.delete(:stdout)
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
- if opts.delete(:memory)
77
- builtin = [builtin] unless builtin.is_a?(Array)
78
- builtin << :memory
79
- end
76
+ builtins.uniq!
80
77
 
81
- # determinate builtin - first check to create +MultiDevice+.
82
- if builtin.is_a?(Array)
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
- builtin.uniq.each do |key|
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(key, builtin_opts), _resolve_formatter(builtin_opts))
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] = _nl(opts)
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] = false
162
- opts[:format] = :passthrough
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] = :memory
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
- __default__: %w(╟ ├),
16
- __processed__: %w( ),
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 [nil, Symbol] handle - optional handle to increase or decrease the current lvl (+:up+ / +:down+)
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
- # nothing here ...
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 [Object] data
70
+ # @param [String] data
64
71
  # @param [Hash] opts
65
- # @return [Object,String]
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 lvl, once
77
+ # resolve the current level - either directly through the options or the +processed_lvl+.
71
78
  lvl = opts[:lvl] || processed_lvl
72
79
 
73
- # create final string
74
- lvl.times.map { |i| "#{_pcd_box_char(:__processed__, i)} " }.join + _pcd_box_char(opts[:pcd], lvl) + " #{data}"
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[:__default__]
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, _pcd(data, opts)
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 << _parse_data(data, (opts[:inspect] ? (opts[:inspector] || self.inspector) : nil))
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
- # just parses the data and calls an inspection method, if provided
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 [Symbol, nil] inspector - the inspection method to be called (e.g. :ai, :inspect, :to_s) - if not provided it tries to auto-resolve
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 _parse_data(data, inspector = nil)
130
- (inspector ? data.send(inspector) : data).to_s
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
- measure: 0
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][:measure] = 0
21
+ @timers[key][:total] = 0
20
22
 
21
23
  true
22
- when :start, :continue
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][:measure] += @timers[key][:stop] - @timers[key][:start]
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][:measure] += Time.now - @timers[key][:start]
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][:measure]
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/, '')
@@ -9,8 +9,8 @@ module RubySmart
9
9
 
10
10
  module VERSION
11
11
  MAJOR = 1
12
- MINOR = 2
13
- TINY = 1
12
+ MINOR = 3
13
+ TINY = 0
14
14
  PRE = nil
15
15
 
16
16
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
@@ -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, subject = 'Debug', opts = {}|
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, subject = 'Info', opts = {}|
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, subject = 'Warn', opts = {}|
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, subject = 'Error', opts = {}|
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, subject = 'Fatal', opts = {}|
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, subject = 'Success', opts = {}|
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 :: job
308
+ # ╔ START job
291
309
  # ╟ doing some cool log
292
310
  # ╟ doing some extra log
293
- # ╚ END [job] (duration: 4.34223)
311
+ # ╚ END job [SUCCESS] (duration: 4.34223)
294
312
  base.scene :processed, { level: :debug } do |name, opts = {}, &block|
295
- # resolve the current process-level
313
+ # increase level
296
314
  lvl = processed_lvl(:up)
297
315
 
298
- # start the timer, if it should - directly sets a timer key to be reused in the +:clear+ method
299
- if (timer_key = (opts[:timer] ? "processed_#{lvl}" : nil))
300
- self.timer(:start, timer_key) if timer_key
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
- if GemInfo.loaded?('activesupport') && GemInfo.installed?('actionview')
21
- ActiveSupport.on_load(:active_record) do
22
- require('action_view/helpers/date_helper')
23
- RubySmart::SimpleLogger::Logger.include(ActionView::Helpers::DateHelper)
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.2.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-02-17 00:00:00.000000000 Z
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.3.26
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: []