dbg_tags 1.0.2 → 1.1.1

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 +166 -118
  3. data/spec/01_tag_spec.rb +99 -3
  4. metadata +6 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d46c56e295261f0f6f156e3c70c41aade388aed18c0cb3e9ae76bee4aa22c3b2
4
- data.tar.gz: a5d7eea81b5582c768fd1ac1300368fa5363c01a99186658f85c1c6f9811401d
3
+ metadata.gz: d23d3bfe9f58ffa0b26481b6aa296208c6febff871649c197506ee836a54f36e
4
+ data.tar.gz: 669f9963e7dcdb9bffceabff6c7f45ba48d7b75c0d7d7293d9c65d16d772eb1d
5
5
  SHA512:
6
- metadata.gz: 61c3376e8b6b4eaba1887c6269ce96a92b9541a750891c0014799ca60e18ec14fdb3372d984d8b8b62576b041718709cc330776271f112284a71836058c781bf
7
- data.tar.gz: 21c04cd90236a8157e74dd32228be60805f366c63448bce43f1aa6efa16863861079f0a911110b04bc45a2febd1c434797f53b2e0f3f877d374d4b1284bc9edc
6
+ metadata.gz: 1b2f84b3808a68011ae0a489c294e20f81d10ebc8a99f28d620191dd862b9ae399046ddfd5e9952334730377a11c6b49c8912aaca3a91c9617b24838899b5785
7
+ data.tar.gz: db37f12455aef1520cd5a0c1e93dbe2f352b07f3cd345fc92b367e26da649b6eb817e66550b90d64a46ebc9fa7feeb971edd0344292854b756f7e2bff23fab1d
data/lib/dbg_tags.rb CHANGED
@@ -3,45 +3,41 @@
3
3
  #
4
4
  # # enabling
5
5
  # # -----------
6
- # require 'dbg_tags'
6
+ # require 'dbg_tags'
7
7
  #
8
- # Tag.enable :feature1, :feature2..., featureN: :log, featureO: :val, ...
9
- # Tag.enable feature1: :trc, feature2: :val
10
- # Tag.enable feature: Tag::TRC
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
16
- # Tag.enable # sets :generic to :trc
17
- # Tag.enable(...) do ... end
18
- # Tag.enable feature: nil
19
- # Tag.enable feature: :nil
20
- # Tag.enable all: :err # :all is a default for ALL systems, including :generic
21
- # Tag.enable test: :err # switch on paranoia checking
22
- # Tag.enable feature: '>=trc' # make sure at least level trc
8
+ # Tag.enable :feature1, :feature2..., featureN: :log, featureO: :val, ...
9
+ # Tag.enable feature1: :trc, feature2: :val
10
+ # Tag.enable feature: Tag::TRC
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
16
+ # Tag.enable # sets :generic to :trc
17
+ # Tag.enable(...) do ... end
18
+ # Tag.enable feature: nil
19
+ # Tag.enable feature: :nil
20
+ # Tag.enable all: :err # :all is a default for ALL systems, including :generic
21
+ # Tag.enable test: :err # switch on paranoia checking
22
+ # Tag.enable feature: '>=trc' # make sure at least level trc
23
23
  #
24
24
  # # logging
25
25
  # # -----------
26
- # Tag.err 'text', short for Tag.err(:generic) 'text'
26
+ # Tag.err 'text', short for Tag.err(:generic) 'text'
27
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 }
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
39
 
40
40
  module Tag
41
-
42
- # the default is :trc
43
- TAG_DEFAULT_LEVEL = 3
44
-
45
41
  # :all overrides the minimum level on ALL tags in the system
46
42
  TAG_FEATURE_ALL = :all
47
43
 
@@ -66,79 +62,24 @@ module Tag
66
62
  # level 5. Mostly used for exhaustive dumping of attribute values and minor details
67
63
  DTL = 5
68
64
 
65
+ # the default is :trc
66
+ TAG_DEFAULT_LEVEL = TRC
67
+
69
68
  # nil and :nil will both map to NONE
70
69
  TAG_MAPPING = { none: NONE, err: ERR, log: LOG, trc: TRC, val: VAL, dtl: DTL,
71
70
  nil: NONE,
72
71
  nil => NONE
73
72
  } # TAG_MAPPING
74
73
 
75
- # @@enabled[:feature] => 0..5
76
- @@enabled = {}
77
- @@stream = STDERR
78
-
79
- module InstanceMethods
80
- @@inside = false
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
-
104
- TAG_MAPPING.each do |meth, lev|
105
- next if lev == NONE
106
- define_method meth do |feature = TAG_FEATURE_GENERIC, msg = '', &msg_block|
107
- msg, feature = feature, TAG_FEATURE_GENERIC if String === feature
108
- #STDERR.puts "DEBUGTAG #{meth}. feature=#{feature}, level=#{Tag.level(feature)}, lev=#{lev}"
109
- return if @@inside || (Tag.level(feature) || Tag::NONE) < lev
110
- # either msg OR msg_block must be set
111
- if msg_block
112
- prev_inside = @@inside
113
- begin
114
- @@inside = true
115
- msg = msg_block.call
116
- ensure
117
- @@inside = prev_inside
118
- end
119
- end
120
- if msg
121
- c = caller[0]
122
- #STDERR.puts "DEBUGTAG c[#{idx}] = #{c}, caller[1]=#{caller[1]}, caller[2]=#{caller[2]}"
123
- label = c[/\w+\.rb:\d+:in `[^']+'/]&.sub(/in `([^']+)'/, '\1:') ||
124
- c[/\w+\.rb:\d+:/] ||
125
- c[/[^:\/]+:\d+:/] ||
126
- c
127
- Tag.stream.print "#{label} #{msg}\n"
128
- end
129
- end # Tag.err, Tag.log, Tag.trc, Tag.val, Tag.dtl
130
- end # each
131
-
132
- # inside? -> true if we are currently executing a block in err/log/trc/val or dtl.
133
- def inside?; @@inside; end
134
-
135
- end # module Tag::InstanceMethods
136
-
137
- extend InstanceMethods
138
- include InstanceMethods
139
-
140
- class << self
141
- private # class methods of Tag
74
+ # This class stores an instance of the global state of the Tag system
75
+ class GlobalState
76
+ private
77
+ def initialize
78
+ # @enabled[:feature] => 0..5
79
+ @enabled = {}
80
+ @inside = false
81
+ @stream = STDERR
82
+ end # GlobalState.initialize
142
83
 
143
84
  # @param level_spec [Integer,Symbol,String,nil]
144
85
  # @param feature [Symbol]
@@ -162,9 +103,21 @@ module Tag
162
103
  raise ArgumentError, "bad level #{level_spec.inspect}"
163
104
  end # Tag::debunk_level
164
105
 
165
- public # class methods of Tag
106
+ public # methods of GlobalState
166
107
 
167
- # @param features [<Symbol>]
108
+ # @return [{Symbol} => 0..5]
109
+ attr :enabled
110
+
111
+ # @return [Bool] True if a Tag.err..dtl is currently active
112
+ attr_accessor :inside
113
+ alias inside? inside
114
+
115
+ # @return [IO] Current output stream
116
+ attr_accessor :stream
117
+
118
+ # @param features [<Symbol>] To enable on :trc level
119
+ # @param opts [{Symbol => Symbol}] Keys are features, values levels.
120
+ # A block can be given to restore the original state afterwards
168
121
  # enable :feature, ...[, feature: level, ...] [block]
169
122
  # :generic is NO LONGER IMPLICETELY ENABLED as of version 1.0.0
170
123
  # Use :all to set a default for all features not mentioned otherwise
@@ -173,62 +126,157 @@ module Tag
173
126
  # Strings can be used in the shape of 'err' or '>=err' etc.
174
127
  # If '>=LVL' is used the level will not lower, if already set in an outer block.
175
128
  # If no level is specified for a feature the default is :trc (== TRC == 3)
176
- # use nil or :none to disable all tags, even the ERR level ones.
129
+ # use nil, :nil, :none or Tag::NONE to disable all tags, even the ERR level ones.
177
130
  #
178
131
  # enable performs a merge with an existing enable.
179
132
  def enable *features, **opts
180
- org_enabled = @@enabled.dup # to restore the state at the end (unused unless block_given)
133
+ org_enabled = @enabled.clone # to restore the state at the end (unused unless block_given)
181
134
  features.each do |feature|
182
135
  case feature
183
136
  when 0..5 # not a feature, apply to :generic
184
- @@enabled[TAG_FEATURE_GENERIC] = feature
137
+ @enabled[TAG_FEATURE_GENERIC] = feature
185
138
  when Symbol
186
139
  if TAG_MAPPING[feature] # not a feature
187
- @@enabled[TAG_FEATURE_GENERIC] = TAG_MAPPING[feature]
140
+ @enabled[TAG_FEATURE_GENERIC] = TAG_MAPPING[feature]
188
141
  else
189
- @@enabled[feature] = TAG_DEFAULT_LEVEL
142
+ @enabled[feature] = TAG_DEFAULT_LEVEL
190
143
  end
191
144
  when String
192
- @@enabled[TAG_FEATURE_GENERIC] = debunk_level feature, TAG_FEATURE_GENERIC
145
+ @enabled[TAG_FEATURE_GENERIC] = debunk_level feature, TAG_FEATURE_GENERIC
193
146
  else
194
147
  raise ArgumentError "bad level #{feature.inspect}"
195
148
  end # case
196
149
  end # each
197
150
  opts.each do |feature, level|
198
151
  # OK STDERR.puts "OPTION!!!!!!!!!!!!!!!!!, calling debunk_level"
199
- @@enabled[feature] = debunk_level level, feature
152
+ @enabled[feature] = debunk_level level, feature
200
153
  end
201
154
  if features.empty? && opts.empty?
202
- @@enabled[TAG_FEATURE_GENERIC] = TAG_DEFAULT_LEVEL
155
+ @enabled[TAG_FEATURE_GENERIC] = TAG_DEFAULT_LEVEL
203
156
  end
204
157
  if block_given?
205
- # STDERR.puts "TAG: block_given!"
206
158
  begin
207
- # STDERR.puts "TAG: yield!"
208
159
  yield
209
160
  ensure
210
- @@enabled = org_enabled
161
+ @enabled = org_enabled
211
162
  end # ensure
212
163
  end # block_given?
213
- end # Tag.enable
164
+ end # GlobalState.enable
165
+
166
+ # @param state [{Symbol=>0..5}] As returned by Tag.state (aka Tag.enabled)
167
+ # A block can be given to restore the original state afterwards.
168
+ # restore_state overwrites any existing enabled feature.
169
+ def restore_state state
170
+ org_enabled = @enabled.clone # to restore the state at the end (unused unless block_given)
171
+ @enabled = state.dup
172
+ if block_given?
173
+ begin
174
+ yield
175
+ ensure
176
+ @enabled = org_enabled
177
+ end # ensure
178
+ end # block_given?
179
+ end # GlobalState.restore_state
180
+
181
+ # @param feature [Symbol]
182
+ # @return [0..5] Current effective level for feature.
183
+ def level feature
184
+ @enabled[feature] || @enabled[TAG_FEATURE_ALL] || Tag::NONE
185
+ end # GlobalState.level
186
+ end # GlobalState
187
+
188
+ class << self
189
+
190
+ public # class methods of Tag
191
+
192
+ # @return [GlobalState] Thread local data
193
+ def global_state
194
+ if gs = Thread.current[:dbg_tags_global_state]
195
+ gs
196
+ else
197
+ Thread.current[:dbg_tags_global_state] = GlobalState.new
198
+ end
199
+ end # Tag::global_state
200
+
201
+ # @param feature [Symbol,nil] Subsystem to print logging for. Fully dynamic/free
202
+ # @param msg [String,nil]
203
+ # @note feature and msg can be switched
204
+ # @param block [Proc,nil] If set the result overrides and msg passed.
205
+ # The call is silently ignored if called from inside another Tag block (likely
206
+ # a sign of a stack overflow in process).
207
+ # The call is silently ignored if the current tag level is too low.
208
+ # For trc it should be trc or val or dtl to actually print something.
209
+ # @!method trc feature = TAG_FEATURE_GENERIC, msg = '', &block
210
+
211
+ # @!method err feature = TAG_FEATURE_GENERIC, msg = '', &block
212
+ # @see trc
213
+
214
+ # @!method log feature = TAG_FEATURE_GENERIC, msg = '', &block
215
+ # @see trc
216
+
217
+ # @!method val feature = TAG_FEATURE_GENERIC, msg = '', &block
218
+ # @see trc
219
+
220
+ # @!method dtl feature = TAG_FEATURE_GENERIC, msg = '', &block
221
+ # @see trc
222
+
223
+ TAG_MAPPING.each do |meth, lev|
224
+ next if lev == NONE
225
+ define_method meth do |feature = TAG_FEATURE_GENERIC, msg = '', &msg_block|
226
+ state = global_state
227
+ msg, feature = feature, TAG_FEATURE_GENERIC if String === feature
228
+ #STDERR.puts "DEBUGTAG #{meth}. feature=#{feature}, level=#{Tag.level(feature)}, lev=#{lev}"
229
+ return if state.inside? || (state.level(feature) || Tag::NONE) < lev
230
+ # either msg OR msg_block must be set
231
+ if msg_block
232
+ prev_inside = state.inside?
233
+ begin
234
+ state.inside = true
235
+ msg = msg_block.call
236
+ ensure
237
+ state.inside = prev_inside
238
+ end
239
+ end
240
+ if msg
241
+ c = caller[0]
242
+ #STDERR.puts "DEBUGTAG c[#{idx}] = #{c}, caller[1]=#{caller[1]}, caller[2]=#{caller[2]}"
243
+ label = c[/\w+\.rb:\d+:in `[^']+'/]&.sub(/in `([^']+)'/, '\1:') ||
244
+ c[/\w+\.rb:\d+:/] ||
245
+ c[/[^:\/]+:\d+:/] ||
246
+ c
247
+ state.stream.print "#{label} #{msg}\n"
248
+ end
249
+ end # Tag.err, Tag.log, Tag.trc, Tag.val, Tag.dtl
250
+ end # each
251
+
252
+ # inside? -> true if we are currently executing a block in err/log/trc/val or dtl.
253
+ def inside?; global_state.inside?; end
254
+
255
+ # @see GlobalState.enable
256
+ def enable(...); global_state.enable(...); end
257
+
258
+ # @see GlobalState.restore_state
259
+ def restore_state(...); global_state.restore_state(...); end
214
260
 
215
261
  # @return [{Symbol=>0..5}] Keys are the features
216
- def enabled; @@enabled; end
262
+ def enabled; global_state.enabled; end
263
+ alias state enabled
217
264
 
218
265
  # @return [IO] By default this is STDERR
219
- def stream; @@stream; end
266
+ def stream; global_state.stream; end
220
267
 
221
268
  # @param val [IO]
222
269
  # Override the output stream.
223
- def stream= val; @@stream = val; end
270
+ def stream= val; global_state.stream = val; end
224
271
 
225
272
  # @param feature [Symbol]
226
273
  # @return [0..5] Current effective level for feature.
227
274
  # 2023-08-14 no longer returns nil
228
- def level feature; @@enabled[feature] || @@enabled[TAG_FEATURE_ALL] || Tag::NONE; end
275
+ def level feature; global_state.level feature; end
229
276
 
230
277
  # @param feature [Symbol]
231
278
  # @return [bool] Reflects explicit enable calls only. The :all feature is IGNORED
232
- def enabled? feature; (@@enabled[feature] || NONE) > NONE; end
279
+ def enabled? feature; (global_state.enabled[feature] || NONE) > NONE; end
280
+
233
281
  end # singleton class Tag
234
282
  end # module Tag
data/spec/01_tag_spec.rb CHANGED
@@ -1,6 +1,8 @@
1
1
 
2
- require 'simplecov'
3
- SimpleCov.start
2
+ if t = ENV['USE_SIMPLECOV'] and !t.empty?
3
+ require 'simplecov'
4
+ SimpleCov.start { add_filter '/spec/' }
5
+ end
4
6
 
5
7
  require_relative '../lib/dbg_tags'
6
8
 
@@ -9,7 +11,7 @@ class Pathological
9
11
  Tag.trc { "HERE in #{self}!" }
10
12
  super
11
13
  end # to_s
12
- end
14
+ end # class Pathological
13
15
 
14
16
  describe 'tag' do
15
17
  before :each do
@@ -252,6 +254,99 @@ describe 'tag' do
252
254
  end # it
253
255
  end # context 'Nested levels'
254
256
 
257
+ it 'has thread local data to prevent mix ups (tag_300)' do
258
+ t1 = Thread.new do
259
+ Tag.enable threads: :trc do
260
+ Tag.trc(:threads) {
261
+ expect(Tag.inside?).to be true
262
+ sleep 1
263
+ nil
264
+ }
265
+ end
266
+ end
267
+ t2 = Thread.new do
268
+ sleep 0.2
269
+ expect(Tag.enabled).to eq({})
270
+ expect(Tag.inside?).to be false
271
+ end
272
+ t1.join
273
+ t2.join
274
+ end # it
275
+
276
+ it 'each thread has a private tag system (tag_301)' do
277
+ Tag.enable threads: :trc do
278
+ expect(Tag.enabled).to eq({threads: 3})
279
+ t1 = Thread.new do
280
+ expect(Tag.enabled).to eq({})
281
+ Tag.enable threads: :log do
282
+ expect(Tag.enabled).to eq({threads: 2})
283
+ Tag.trc(:threads) {
284
+ expect(Tag.inside?).to be true
285
+ sleep 1
286
+ nil
287
+ }
288
+ end
289
+ end
290
+ t1.join
291
+ expect(Tag.enabled).to eq({threads: 3})
292
+ end
293
+ end # it
294
+
295
+ it 'each fiber has a private tag system (tag_302)' do
296
+ Tag.enable threads: :trc do
297
+ expect(Tag.enabled).to eq({threads: 3})
298
+ t1 = Fiber.new do
299
+ expect(Tag.enabled).to eq({})
300
+ Tag.enable threads: :log do
301
+ expect(Tag.enabled).to eq({threads: 2})
302
+ Tag.trc(:threads) {
303
+ expect(Tag.inside?).to be true
304
+ sleep 1
305
+ nil
306
+ }
307
+ end
308
+ end
309
+ t1.resume
310
+ expect(Tag.enabled).to eq({threads: 3})
311
+ end
312
+ end # it
313
+
314
+ it 'does allow restore_state to transfer state through a Fiber barrier (tag_310)' do
315
+ did_something = false
316
+ Tag.enable example: :dtl, fiber: :trc do
317
+ state = Tag.state # same as Tag.enabled
318
+ expect(state).to eq({example: Tag::DTL, fiber: Tag::TRC})
319
+ t1 = Fiber.new do
320
+ expect(Tag.state).to eq({})
321
+ Tag.enable foo: :trc
322
+ Tag.restore_state state do
323
+ expect(Tag.state).to eq({example: Tag::DTL, fiber: Tag::TRC})
324
+ did_something = true
325
+ end
326
+ end
327
+ t1.resume
328
+ expect(Tag.state).to eq({example: Tag::DTL, fiber: Tag::TRC})
329
+ end # enable
330
+ expect(did_something).to be true
331
+ end # it
332
+
333
+ it 'does allow a nil-state to transfer state through a Fiber barrier (tag_311)' do
334
+ did_something = false
335
+ state = Tag.state
336
+ expect(state).to eq({})
337
+ t1 = Fiber.new do
338
+ expect(Tag.state).to eq({})
339
+ Tag.enable foo: :trc
340
+ Tag.restore_state state do
341
+ expect(Tag.state).to eq({})
342
+ did_something = true
343
+ end
344
+ end
345
+ t1.resume
346
+ expect(Tag.state).to eq({})
347
+ expect(did_something).to be true
348
+ end # it
349
+
255
350
  it 'does not allow levels out of range (tag_900)' do
256
351
  expect do
257
352
  Tag.enable nest: 24
@@ -269,4 +364,5 @@ describe 'tag' do
269
364
  Tag.enable nest: '>=foo'
270
365
  end.to raise_error ArgumentError, /bad level/i
271
366
  end # it
367
+
272
368
  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.2
4
+ version: 1.1.1
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: 2023-08-17 00:00:00.000000000 Z
11
+ date: 2024-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -66,7 +66,7 @@ homepage: https://github.com/Eugene-Brazwick/dbg_tags
66
66
  licenses:
67
67
  - GPL-3.0
68
68
  metadata: {}
69
- post_install_message:
69
+ post_install_message:
70
70
  rdoc_options: []
71
71
  require_paths:
72
72
  - lib
@@ -74,7 +74,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - ">="
76
76
  - !ruby/object:Gem::Version
77
- version: '2.7'
77
+ version: '3.0'
78
78
  required_rubygems_version: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
@@ -82,7 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  version: '0'
83
83
  requirements: []
84
84
  rubygems_version: 3.3.5
85
- signing_key:
85
+ signing_key:
86
86
  specification_version: 4
87
87
  summary: a versatile dynamic debug tracing system
88
88
  test_files: