dbg_tags 1.0.0 → 1.0.2

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dbg_tags.rb +138 -49
  3. data/spec/01_tag_spec.rb +91 -0
  4. metadata +9 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f67668ea968705e3998d9481a23a32d12fd5db9f42a53d97f6f7f1383f424372
4
- data.tar.gz: d2ea2f479005e3d652629749b1c5d7cb2304140ca56de952c8c6b35fe3078e50
3
+ metadata.gz: d46c56e295261f0f6f156e3c70c41aade388aed18c0cb3e9ae76bee4aa22c3b2
4
+ data.tar.gz: a5d7eea81b5582c768fd1ac1300368fa5363c01a99186658f85c1c6f9811401d
5
5
  SHA512:
6
- metadata.gz: ad6860e2153812cede77a7bc1c56c16720e553e3fb1a90fc3922349f578738dd3d242e5622636327a80199038741298f407905f99f3684b8cf42e9a3c65d268e
7
- data.tar.gz: 3b68a1bfffc89b93d2344f72662d0046b0d8d410047abd856f15df3f75f46d1e783cf03748478a32231c60e2d0e026b488ff2ed4655d487a27edb48f1b5ad4f7
6
+ metadata.gz: 61c3376e8b6b4eaba1887c6269ce96a92b9541a750891c0014799ca60e18ec14fdb3372d984d8b8b62576b041718709cc330776271f112284a71836058c781bf
7
+ data.tar.gz: 21c04cd90236a8157e74dd32228be60805f366c63448bce43f1aa6efa16863861079f0a911110b04bc45a2febd1c434797f53b2e0f3f877d374d4b1284bc9edc
data/lib/dbg_tags.rb CHANGED
@@ -1,62 +1,112 @@
1
1
 
2
- # Usage:
2
+ # @example Usage:
3
+ #
4
+ # # enabling
5
+ # # -----------
3
6
  # require 'dbg_tags'
4
- # Tag.err 'text', short for Tag.err(:generic) 'text'
5
- # # :err should be used for fail states and paranoia stuff
6
- # Tag.log 'text' # prints very important messages only
7
- # Tag.trc 'text' # default level, method entries, for example
8
- # Tag.val 'text' # prints more details
9
- # Tag.dtl 'text' # prints megabytes of details
10
- # Tag.enable :log # enables log,trc,val,dtl tags for :generic
11
- # Tag.enable :dtl # only enables :dtl calls
12
- # Tag.enable :err # enable ALL :generic tags
13
- # Tag.err :feature, 'FAILURE'
14
- # Tag.log :feature, 'log me'
15
- # Tag.trc :feature, 'called method'
16
- # Tag.val(:feature) { "text#{expr}" }
17
- # Tag.dtl(:feature) { "text#{very complicated expr}" }
18
- # Tag.err(:test) { raise 'aaaarg' if paranoia_failure }
19
- # Tag.err(:test) { raise 'CANTHAPPEN' if paranoia_failure }
7
+ #
20
8
  # Tag.enable :feature1, :feature2..., featureN: :log, featureO: :val, ...
21
9
  # Tag.enable feature1: :trc, feature2: :val
22
10
  # Tag.enable feature: Tag::TRC
23
- # Tag.enable :val # for :generic only
11
+ # Tag.enable :dtl # enables ALL logging for :generic
12
+ # Tag.enable :val # enables val+trc+log+err for :generic only
13
+ # Tag.enable :trc # enables trc+log+err for :generic only
14
+ # Tag.enable :log # enables log+err tags for :generic
15
+ # Tag.enable :err # enables err tags for :generic
24
16
  # Tag.enable # sets :generic to :trc
25
17
  # Tag.enable(...) do ... end
26
18
  # Tag.enable feature: nil
27
19
  # Tag.enable feature: :nil
28
20
  # Tag.enable all: :err # :all is a default for ALL systems, including :generic
29
21
  # Tag.enable test: :err # switch on paranoia checking
22
+ # Tag.enable feature: '>=trc' # make sure at least level trc
23
+ #
24
+ # # logging
25
+ # # -----------
26
+ # Tag.err 'text', short for Tag.err(:generic) 'text'
27
+ # # :err should be used for fail states and paranoia stuff
28
+ # Tag.log 'text' # prints very important messages only
29
+ # Tag.trc 'text' # default level, method entries, for example
30
+ # Tag.val 'text' # prints more details
31
+ # Tag.dtl 'text' # likely prints megabytes of details
32
+ # Tag.err :feature, 'FAILURE'
33
+ # Tag.log :feature, 'log me'
34
+ # Tag.trc :feature, 'called method'
35
+ # Tag.val(:feature) { "text#{expr}" }
36
+ # Tag.dtl(:feature) { "text#{very complicated expr}" }
37
+ # Tag.err(:test) { raise 'aaaarg' if complex_paranoia_failure }
38
+ # Tag.err(:test) { raise 'CANTHAPPEN' if complex_paranoia_failure }
39
+
30
40
  module Tag
31
41
 
42
+ # the default is :trc
32
43
  TAG_DEFAULT_LEVEL = 3
44
+
45
+ # :all overrides the minimum level on ALL tags in the system
33
46
  TAG_FEATURE_ALL = :all
47
+
48
+ # :generic is the default feature, if left unspecified
34
49
  TAG_FEATURE_GENERIC = :generic
50
+
51
+ # lowest level. No output
35
52
  NONE = 0
53
+
54
+ # level 1. Only error situation should use this
36
55
  ERR = 1
56
+
57
+ # level 2. Only very important information
37
58
  LOG = 2
59
+
60
+ # level 3. Mostly used for method entries
38
61
  TRC = 3
62
+
63
+ # level 4. Mostly used dumping of attribute values
39
64
  VAL = 4
65
+
66
+ # level 5. Mostly used for exhaustive dumping of attribute values and minor details
40
67
  DTL = 5
68
+
41
69
  # nil and :nil will both map to NONE
42
70
  TAG_MAPPING = { none: NONE, err: ERR, log: LOG, trc: TRC, val: VAL, dtl: DTL,
43
71
  nil: NONE,
44
72
  nil => NONE
45
73
  } # TAG_MAPPING
46
74
 
47
- # @@enabled[:feature] => 0..5
75
+ # @@enabled[:feature] => 0..5
48
76
  @@enabled = {}
49
77
  @@stream = STDERR
50
78
 
51
79
  module InstanceMethods
52
80
  @@inside = false
53
81
 
82
+ # @param feature [Symbol,nil] Subsystem to print logging for. Fully dynamic/free
83
+ # @param msg [String,nil]
84
+ # @note feature and msg can be switched
85
+ # @param block [Proc,nil] If set the result overrides and msg passed.
86
+ # The call is silently ignored if called from inside another Tag block (likely
87
+ # a sign of a stack overflow in process).
88
+ # The call is silently ignored if the current tag level is too low.
89
+ # For trc it should be trc or val or dtl to actually print something.
90
+ # @!method trc feature = TAG_FEATURE_GENERIC, msg = '', &block
91
+
92
+ # see trc
93
+ # !method err feature = TAG_FEATURE_GENERIC, msg = '', &block
94
+
95
+ # see trc
96
+ # !method log feature = TAG_FEATURE_GENERIC, msg = '', &block
97
+
98
+ # see trc
99
+ # !method val feature = TAG_FEATURE_GENERIC, msg = '', &block
100
+
101
+ # see trc
102
+ # !method dtl feature = TAG_FEATURE_GENERIC, msg = '', &block
103
+
54
104
  TAG_MAPPING.each do |meth, lev|
55
105
  next if lev == NONE
56
106
  define_method meth do |feature = TAG_FEATURE_GENERIC, msg = '', &msg_block|
57
107
  msg, feature = feature, TAG_FEATURE_GENERIC if String === feature
58
108
  #STDERR.puts "DEBUGTAG #{meth}. feature=#{feature}, level=#{Tag.level(feature)}, lev=#{lev}"
59
- return if @@inside || (Tag.level(feature) || 0) < lev
109
+ return if @@inside || (Tag.level(feature) || Tag::NONE) < lev
60
110
  # either msg OR msg_block must be set
61
111
  if msg_block
62
112
  prev_inside = @@inside
@@ -84,39 +134,71 @@ module Tag
84
134
 
85
135
  end # module Tag::InstanceMethods
86
136
 
87
- public # class methods of Tag
137
+ extend InstanceMethods
138
+ include InstanceMethods
139
+
140
+ class << self
141
+ private # class methods of Tag
88
142
 
89
- extend InstanceMethods
90
- include InstanceMethods
143
+ # @param level_spec [Integer,Symbol,String,nil]
144
+ # @param feature [Symbol]
145
+ # @return [0..5]
146
+ def debunk_level level_spec, feature
147
+ # raise 'AARG' unless Symbol === feature
148
+ # OK STDERR.puts "DEBUNK: level_spec=#{level_spec.inspect}, feature=#{feature.inspect}"
149
+ case level_spec
150
+ when 0..5 then return level_spec
151
+ when nil then return NONE
152
+ when Symbol
153
+ r = TAG_MAPPING[level_spec] and return r
154
+ when /\A(err|log|trc|val|dtl)\z/
155
+ return TAG_MAPPING[level_spec.to_sym]
156
+ when /\A>=(err|log|trc|val|dtl)\z/
157
+ eff_lev = level feature
158
+ new_lev = TAG_MAPPING[level_spec[2..].to_sym]
159
+ # OK STDERR.puts "level_spec=#{level_spec}, feature=#{feature.inspect},eff_lev=#{eff_lev},new_lev=#{new_lev}"
160
+ return [eff_lev, new_lev].max
161
+ end # case
162
+ raise ArgumentError, "bad level #{level_spec.inspect}"
163
+ end # Tag::debunk_level
91
164
 
165
+ public # class methods of Tag
166
+
167
+ # @param features [<Symbol>]
92
168
  # enable :feature, ...[, feature: level, ...] [block]
93
- # :generic is NO LONGER IMPLICETELY ENABLED as of version
169
+ # :generic is NO LONGER IMPLICETELY ENABLED as of version 1.0.0
94
170
  # Use :all to set a default for all features not mentioned otherwise
95
171
  # Integers in range 1..5 can be used as level or the constants ERR,LOG,TRC,VAL,DTL
96
172
  # or the symbols :err, :log, :trc, :val and :dtl
173
+ # Strings can be used in the shape of 'err' or '>=err' etc.
174
+ # If '>=LVL' is used the level will not lower, if already set in an outer block.
97
175
  # If no level is specified for a feature the default is :trc (== TRC == 3)
98
176
  # use nil or :none to disable all tags, even the ERR level ones.
99
177
  #
100
178
  # enable performs a merge with an existing enable.
101
- def self.enable *arg
102
- org_enabled = @@enabled.dup
103
- arg.each do |s|
104
- case s
105
- when Hash
106
- s.each do |t, level|
107
- @@enabled[t] = Symbol === level ? TAG_MAPPING[level] : level
108
- end
109
- when Integer
110
- @@enabled[TAG_FEATURE_GENERIC] = s
111
- else
112
- if TAG_MAPPING[s]
113
- @@enabled[TAG_FEATURE_GENERIC] = TAG_MAPPING[s]
179
+ def enable *features, **opts
180
+ org_enabled = @@enabled.dup # to restore the state at the end (unused unless block_given)
181
+ features.each do |feature|
182
+ case feature
183
+ when 0..5 # not a feature, apply to :generic
184
+ @@enabled[TAG_FEATURE_GENERIC] = feature
185
+ when Symbol
186
+ if TAG_MAPPING[feature] # not a feature
187
+ @@enabled[TAG_FEATURE_GENERIC] = TAG_MAPPING[feature]
114
188
  else
115
- @@enabled[s] = TAG_DEFAULT_LEVEL
189
+ @@enabled[feature] = TAG_DEFAULT_LEVEL
116
190
  end
117
- end # case
191
+ when String
192
+ @@enabled[TAG_FEATURE_GENERIC] = debunk_level feature, TAG_FEATURE_GENERIC
193
+ else
194
+ raise ArgumentError "bad level #{feature.inspect}"
195
+ end # case
118
196
  end # each
119
- if arg.empty?
197
+ opts.each do |feature, level|
198
+ # OK STDERR.puts "OPTION!!!!!!!!!!!!!!!!!, calling debunk_level"
199
+ @@enabled[feature] = debunk_level level, feature
200
+ end
201
+ if features.empty? && opts.empty?
120
202
  @@enabled[TAG_FEATURE_GENERIC] = TAG_DEFAULT_LEVEL
121
203
  end
122
204
  if block_given?
@@ -130,16 +212,23 @@ module Tag
130
212
  end # block_given?
131
213
  end # Tag.enable
132
214
 
133
- # enabled -> Hash
134
- def self.enabled; @@enabled; end
135
- def self.stream; @@stream; end
215
+ # @return [{Symbol=>0..5}] Keys are the features
216
+ def enabled; @@enabled; end
217
+
218
+ # @return [IO] By default this is STDERR
219
+ def stream; @@stream; end
136
220
 
137
- # for testing purposes:
138
- def self.stream= val; @@stream = val; end
221
+ # @param val [IO]
222
+ # Override the output stream.
223
+ def stream= val; @@stream = val; end
139
224
 
140
- # level(:feature) -> 0..5 or nil. Uses :all as a fallback-feature
141
- def self.level feature; @@enabled[feature] || @@enabled[TAG_FEATURE_ALL]; end
225
+ # @param feature [Symbol]
226
+ # @return [0..5] Current effective level for feature.
227
+ # 2023-08-14 no longer returns nil
228
+ def level feature; @@enabled[feature] || @@enabled[TAG_FEATURE_ALL] || Tag::NONE; end
142
229
 
143
- # enabled?(:feature) -> bool. Could be :err up to :dtl. Ignores setting of :all!
144
- def self.enabled? feature; @@enabled[feature] && @@enabled[feature] > NONE; end
230
+ # @param feature [Symbol]
231
+ # @return [bool] Reflects explicit enable calls only. The :all feature is IGNORED
232
+ def enabled? feature; (@@enabled[feature] || NONE) > NONE; end
233
+ end # singleton class Tag
145
234
  end # module Tag
data/spec/01_tag_spec.rb CHANGED
@@ -175,7 +175,98 @@ describe 'tag' do
175
175
  end
176
176
  end
177
177
 
178
+ it 'is allowed to use nil for :nil in enable (tag_110)' do
179
+ Tag.enable feature: nil do
180
+ expect(Tag.enabled[:feature]).to eq Tag::NONE
181
+ end
182
+ end # it
183
+
178
184
  # however, it only works with LAZY calls.
179
185
  # def to_s; Tag.trc "HERE in #{self}"; super; end
180
186
  # will OBVIOUSLY cause a stack overflow.
187
+ #
188
+
189
+ context 'Nested levels' do
190
+ it 'overwrites the level set in outer temporarily (tag_200)' do
191
+ Tag.enable nest: :val do
192
+ expect(Tag.level :nest).to be Tag::VAL
193
+ Tag.enable nest: 'trc' do
194
+ expect(Tag.level :nest).to be Tag::TRC
195
+ end
196
+ expect(Tag.level :nest).to be Tag::VAL
197
+ end
198
+ end # it
199
+
200
+ it 'raises the level set in outer temporarily if >= is used (tag_201)' do
201
+ Tag.enable nest: :err do
202
+ expect(Tag.level :nest).to be Tag::ERR
203
+ Tag.enable nest: '>=trc' do
204
+ expect(Tag.level :nest).to be Tag::TRC
205
+ end
206
+ expect(Tag.level :nest).to be Tag::ERR
207
+ end
208
+ end # it
209
+
210
+ it 'ONLY raises the level set in outer temporarily if >= is used (tag_202)' do
211
+ Tag.enable nest: :trc do
212
+ expect(Tag.level :nest).to be Tag::TRC
213
+ Tag.enable nest: '>=err' do
214
+ expect(Tag.level :nest).to be Tag::TRC
215
+ end
216
+ expect(Tag.level :nest).to be Tag::TRC
217
+ end
218
+ end # it
219
+
220
+ it 'raises the level set in outer temporarily if >= is used (tag_201.b)' do
221
+ Tag.enable :err do
222
+ expect(Tag.level Tag::TAG_FEATURE_GENERIC).to be Tag::ERR
223
+ Tag.enable '>=trc' do
224
+ expect(Tag.level Tag::TAG_FEATURE_GENERIC).to be Tag::TRC
225
+ end
226
+ expect(Tag.level Tag::TAG_FEATURE_GENERIC).to be Tag::ERR
227
+ end
228
+ end # it
229
+
230
+ it 'ONLY raises the level set in outer temporarily if >= is used (tag_202.b)' do
231
+ Tag.enable :trc do
232
+ expect(Tag.level Tag::TAG_FEATURE_GENERIC).to be Tag::TRC
233
+ Tag.enable nest: '>=err' do
234
+ expect(Tag.level Tag::TAG_FEATURE_GENERIC).to be Tag::TRC
235
+ end
236
+ expect(Tag.level Tag::TAG_FEATURE_GENERIC).to be Tag::TRC
237
+ end
238
+ end # it
239
+
240
+ it 'takes :all into consideration when >= is used (tag_205)' do
241
+ Tag.enable all: :log do
242
+ expect(Tag.level :nest).to be Tag::LOG
243
+ Tag.enable nest: '>=err' do
244
+ expect(Tag.level :nest).to be Tag::LOG
245
+ end
246
+ expect(Tag.level :nest).to be Tag::LOG
247
+ Tag.enable nest: '>=trc' do
248
+ expect(Tag.level :nest).to be Tag::TRC
249
+ end
250
+ expect(Tag.level :nest).to be Tag::LOG
251
+ end
252
+ end # it
253
+ end # context 'Nested levels'
254
+
255
+ it 'does not allow levels out of range (tag_900)' do
256
+ expect do
257
+ Tag.enable nest: 24
258
+ end.to raise_error ArgumentError, /bad level/i
259
+ expect do
260
+ Tag.enable nest: -2
261
+ end.to raise_error ArgumentError, /bad level/i
262
+ end # it
263
+
264
+ it 'does not allow made up levels (tag_901)' do
265
+ expect do
266
+ Tag.enable nest: :foo
267
+ end.to raise_error ArgumentError, /bad level/i
268
+ expect do
269
+ Tag.enable nest: '>=foo'
270
+ end.to raise_error ArgumentError, /bad level/i
271
+ end # it
181
272
  end # describe
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbg_tags
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eugene Brazwick
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-24 00:00:00.000000000 Z
11
+ date: 2023-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -52,25 +52,9 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.18'
55
- description: " tags in your code can be switched on using features and levels.\n
56
- \ Examples:\n Tag.trc 'a message' # a :generic tag\n # All tags
57
- print sourcefile, current method and linenumber automatically\n Tag.trc # prints
58
- file, method and linenumber\n Tag.trc :feature, 'a message' # only called if
59
- :feature enabled.\n Tag.err 'msg' # Triggered when :generic feature is set
60
- to at \n # least :err level.\n # The levels
61
- are :err, :log, :trc, :val and :dtl, \n # in that order\n Tag.dtl
62
- :complex do \"val = #{expensive.method.call}\" end\n Tag.dtl(:complex) { \"val
63
- = #{expensive.method.call}\" }\n\t # use lazy evaluation with a block.\n #
64
- The block expression is printed using to_s.\n Tag.dtl(:complex) {} # same as
65
- Tag.dtl :complex \n# At the start of your application enable the desired dump-level.\n
66
- \ Tag.enable\t# Same as Tag.enable generic: :trc\n #
67
- That is enables levels <=:trc\n Tag.enable :val # enable :generic tags at
68
- <=:val levels\n Tag.enable :feature1, :feat2, ... # enables given features
69
- on <=:trc\n Tag.enable :feature1, :feat2, feat3: :dtl, all: :err\n\t# Set :feature1,
70
- :feat2, and :generic to <=:trc, :feat3 to :dtl\n\t# and ANY OTHER feature to only
71
- :err. \n Tag.enable feature: :err \n Tag.enable feature: :dtl # so ALL
72
- tags with feature :feature\n Tag.err(:feature) { raise 'aaaarg' if expensive_check_fails?
73
- }\n"
55
+ description: |
56
+ debug 'tags' in your code can be switched on/off using features and levels.
57
+ See README.md
74
58
  email: eugenebrazwick@gmail.com
75
59
  executables: []
76
60
  extensions: []
@@ -82,7 +66,7 @@ homepage: https://github.com/Eugene-Brazwick/dbg_tags
82
66
  licenses:
83
67
  - GPL-3.0
84
68
  metadata: {}
85
- post_install_message:
69
+ post_install_message:
86
70
  rdoc_options: []
87
71
  require_paths:
88
72
  - lib
@@ -97,8 +81,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
81
  - !ruby/object:Gem::Version
98
82
  version: '0'
99
83
  requirements: []
100
- rubygems_version: 3.1.2
101
- signing_key:
84
+ rubygems_version: 3.3.5
85
+ signing_key:
102
86
  specification_version: 4
103
87
  summary: a versatile dynamic debug tracing system
104
88
  test_files: