debride 1.10.1 → 1.11.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
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +11 -0
- data/lib/debride.rb +40 -5
- data/test/test_debride.rb +94 -4
- data.tar.gz.sig +0 -0
- metadata +13 -13
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3d7a09de612d4aa5772fbc3db3e26f51a06331c360c62d359acb8465f3f242a
|
4
|
+
data.tar.gz: 95ce5aff93c1900456ad929a959d60f275feb036ecbb890edd590246d284c5eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8c4f5575198e3d8de1c7486cf5b2a6e43e2f2d8ec61af07b3e6d8f5e101cd5343acb108a55468b1e19e8605c3c27acad32918084c4165a666f58e6d367fb72b
|
7
|
+
data.tar.gz: 17dbd73820e02cea048e1cdc61d4811e3d00702f0d2fcc58098e56982205b80e1932cf6358d3692a7647da0de67251c2cab22e274598b420eae48cedeff94726
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/History.rdoc
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
=== 1.11.0 / 2023-03-24
|
2
|
+
|
3
|
+
* 6 minor enhancements:
|
4
|
+
|
5
|
+
* Added X.const_get(:Y) support. (TSMMark)
|
6
|
+
* Added f(&block_pass) support. (TSMMark)
|
7
|
+
* Added obj&.safe_call support. (TSMMark)
|
8
|
+
* Added obj.method(:msg) support. (TSMMark)
|
9
|
+
* Added op_asgn2 (eg x &&= y) support. (TSMMark)
|
10
|
+
* Added try(:msg) support. (TSMMark)
|
11
|
+
|
1
12
|
=== 1.10.1 / 2022-12-03
|
2
13
|
|
3
14
|
* 4 minor enhancements:
|
data/lib/debride.rb
CHANGED
@@ -12,7 +12,7 @@ require "path_expander"
|
|
12
12
|
# A static code analyzer that points out possible dead methods.
|
13
13
|
|
14
14
|
class Debride < MethodBasedSexpProcessor
|
15
|
-
VERSION = "1.
|
15
|
+
VERSION = "1.11.0" # :nodoc:
|
16
16
|
PROJECT = "debride"
|
17
17
|
|
18
18
|
def self.load_plugins proj = PROJECT
|
@@ -220,6 +220,14 @@ class Debride < MethodBasedSexpProcessor
|
|
220
220
|
sexp
|
221
221
|
end
|
222
222
|
|
223
|
+
# handle &&=, ||=, etc
|
224
|
+
def process_op_asgn2(sexp)
|
225
|
+
_, _, method_name, * = sexp
|
226
|
+
called << method_name
|
227
|
+
process_until_empty sexp
|
228
|
+
sexp
|
229
|
+
end
|
230
|
+
|
223
231
|
def record_method name, file, line
|
224
232
|
signature = "#{klass_name}##{name}"
|
225
233
|
method_locations[signature] = "#{file}:#{line}"
|
@@ -273,7 +281,7 @@ class Debride < MethodBasedSexpProcessor
|
|
273
281
|
end
|
274
282
|
record_method name, file, line
|
275
283
|
end
|
276
|
-
when :send, :public_send, :__send__ then
|
284
|
+
when :send, :public_send, :__send__, :try, :const_get then
|
277
285
|
# s(:call, s(:const, :Seattle), :send, s(:lit, :raining?))
|
278
286
|
_, _, _, msg_arg, * = sexp
|
279
287
|
if Sexp === msg_arg && [:lit, :str].include?(msg_arg.sexp_type) then
|
@@ -291,6 +299,12 @@ class Debride < MethodBasedSexpProcessor
|
|
291
299
|
called << val.last.to_sym if val.sexp_type == :str
|
292
300
|
end
|
293
301
|
end
|
302
|
+
when :method then
|
303
|
+
# s(:call, nil, :method, s(:lit, :foo))
|
304
|
+
_, _, _, msg_arg, * = sexp
|
305
|
+
if Sexp === msg_arg && [:lit, :str].include?(msg_arg.sexp_type) then
|
306
|
+
called << msg_arg.last.to_sym
|
307
|
+
end
|
294
308
|
when *RAILS_DSL_METHODS, *RAILS_VALIDATION_METHODS then
|
295
309
|
if option[:rails]
|
296
310
|
# s(:call, nil, :before_save, s(:lit, :save_callback), s(:hash, ...))
|
@@ -329,6 +343,21 @@ class Debride < MethodBasedSexpProcessor
|
|
329
343
|
sexp
|
330
344
|
end
|
331
345
|
|
346
|
+
def process_block_pass exp # :nodoc:
|
347
|
+
_, name = exp
|
348
|
+
|
349
|
+
case name.sexp_type
|
350
|
+
when :lit then # eg &:to_sym
|
351
|
+
called << name.last
|
352
|
+
else # eg &lvar or &method(:x)
|
353
|
+
# do nothing, body will get processed below
|
354
|
+
end
|
355
|
+
|
356
|
+
process_until_empty exp
|
357
|
+
|
358
|
+
exp
|
359
|
+
end
|
360
|
+
|
332
361
|
def process_cdecl exp # :nodoc:
|
333
362
|
_, name, val = exp
|
334
363
|
|
@@ -348,7 +377,7 @@ class Debride < MethodBasedSexpProcessor
|
|
348
377
|
|
349
378
|
def name_to_string exp
|
350
379
|
case exp.sexp_type
|
351
|
-
when :const then
|
380
|
+
when :const, :lit, :str then
|
352
381
|
exp.last.to_s
|
353
382
|
when :colon2 then
|
354
383
|
_, lhs, rhs = exp
|
@@ -402,6 +431,8 @@ class Debride < MethodBasedSexpProcessor
|
|
402
431
|
end
|
403
432
|
end
|
404
433
|
|
434
|
+
alias process_safe_call process_call
|
435
|
+
|
405
436
|
##
|
406
437
|
# Calculate the difference between known methods and called methods.
|
407
438
|
|
@@ -532,6 +563,10 @@ class Debride < MethodBasedSexpProcessor
|
|
532
563
|
YAML.dump data, io
|
533
564
|
end
|
534
565
|
|
566
|
+
def inspect
|
567
|
+
"Debride[current=%s]" % [signature]
|
568
|
+
end
|
569
|
+
|
535
570
|
##
|
536
571
|
# Rails' macro-style methods that setup method calls to happen during a rails
|
537
572
|
# app's execution.
|
@@ -541,7 +576,7 @@ class Debride < MethodBasedSexpProcessor
|
|
541
576
|
:around_action,
|
542
577
|
:before_action,
|
543
578
|
|
544
|
-
#
|
579
|
+
# https://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
|
545
580
|
:after_commit,
|
546
581
|
:after_create,
|
547
582
|
:after_destroy,
|
@@ -562,7 +597,7 @@ class Debride < MethodBasedSexpProcessor
|
|
562
597
|
:before_update,
|
563
598
|
:before_validation,
|
564
599
|
|
565
|
-
#
|
600
|
+
# https://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validate
|
566
601
|
:validate,
|
567
602
|
]
|
568
603
|
|
data/test/test_debride.rb
CHANGED
@@ -10,6 +10,7 @@ end
|
|
10
10
|
class TestDebride < Minitest::Test
|
11
11
|
EXP_LIST = [["Debride",
|
12
12
|
[:process_attrasgn,
|
13
|
+
:process_block_pass,
|
13
14
|
:process_call,
|
14
15
|
:process_cdecl,
|
15
16
|
:process_colon2,
|
@@ -17,6 +18,7 @@ class TestDebride < Minitest::Test
|
|
17
18
|
:process_const,
|
18
19
|
:process_defn,
|
19
20
|
:process_defs,
|
21
|
+
:process_op_asgn2,
|
20
22
|
:process_rb,
|
21
23
|
:report,
|
22
24
|
:report_json,
|
@@ -287,6 +289,83 @@ class TestDebride < Minitest::Test
|
|
287
289
|
assert_process [], ruby
|
288
290
|
end
|
289
291
|
|
292
|
+
def test_method_try
|
293
|
+
ruby = <<-RUBY.strip
|
294
|
+
class Seattle
|
295
|
+
def self.raining?
|
296
|
+
true
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
Seattle.try :raining?
|
301
|
+
RUBY
|
302
|
+
|
303
|
+
assert_process [], ruby
|
304
|
+
end
|
305
|
+
|
306
|
+
def test_block_pass
|
307
|
+
ruby = <<-RUBY.strip
|
308
|
+
class Seattle
|
309
|
+
def self.raining?
|
310
|
+
true
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
[Seattle].each(&:raining?)
|
315
|
+
RUBY
|
316
|
+
|
317
|
+
assert_process [], ruby
|
318
|
+
end
|
319
|
+
|
320
|
+
def test_block_pass_other
|
321
|
+
ruby = <<-RUBY.strip
|
322
|
+
class Seattle
|
323
|
+
def self.raining?
|
324
|
+
-> { called }
|
325
|
+
end
|
326
|
+
|
327
|
+
def self.uncalled; end
|
328
|
+
def self.called; end
|
329
|
+
end
|
330
|
+
|
331
|
+
f(&Seattle.raining?)
|
332
|
+
RUBY
|
333
|
+
|
334
|
+
assert_process [["Seattle", [:uncalled]]], ruby
|
335
|
+
end
|
336
|
+
|
337
|
+
def test_safe_navigation_operator
|
338
|
+
ruby = <<-RUBY.strip
|
339
|
+
class Seattle
|
340
|
+
def self.raining?
|
341
|
+
true
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
Seattle&.raining?
|
346
|
+
RUBY
|
347
|
+
|
348
|
+
assert_process [], ruby
|
349
|
+
end
|
350
|
+
|
351
|
+
def test_call_method
|
352
|
+
ruby = <<-RUBY.strip
|
353
|
+
class Seattle
|
354
|
+
def self.raining?
|
355
|
+
true
|
356
|
+
end
|
357
|
+
|
358
|
+
def self.raining_still?
|
359
|
+
method(:raining?)
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
Seattle.raining_still?
|
364
|
+
RUBY
|
365
|
+
|
366
|
+
assert_process [], ruby
|
367
|
+
end
|
368
|
+
|
290
369
|
def test_rails_dsl_methods
|
291
370
|
ruby = <<-RUBY.strip
|
292
371
|
class RailsThing
|
@@ -360,6 +439,8 @@ class TestDebride < Minitest::Test
|
|
360
439
|
class Constants
|
361
440
|
USED = 42
|
362
441
|
ALSO = 314
|
442
|
+
AGAIN = 27
|
443
|
+
MORE = 72
|
363
444
|
UNUSED = 24
|
364
445
|
|
365
446
|
def something
|
@@ -370,6 +451,8 @@ class TestDebride < Minitest::Test
|
|
370
451
|
something
|
371
452
|
Constants::ALSO
|
372
453
|
::Constants::ALSO
|
454
|
+
Constants.const_get(:AGAIN)
|
455
|
+
::Constants.const_get("MORE")
|
373
456
|
RUBY
|
374
457
|
|
375
458
|
assert_process [["Constants", [:UNUSED]]], ruby
|
@@ -379,11 +462,13 @@ class TestDebride < Minitest::Test
|
|
379
462
|
ruby = <<-RUBY.strip
|
380
463
|
class AttributeAccessor
|
381
464
|
attr_accessor :a1, :a2, :a3
|
382
|
-
attr_writer :w1, :w2
|
465
|
+
attr_writer :w1, :w2, :w3, :w4
|
383
466
|
attr_reader :r1, :r2
|
384
467
|
def initialize
|
385
468
|
self.a2 = 'Bar'
|
386
469
|
self.w1 = 'W'
|
470
|
+
self.w3 ||= 'W3'
|
471
|
+
self.w4 &&= 'W4'
|
387
472
|
end
|
388
473
|
|
389
474
|
def self.class_method
|
@@ -397,7 +482,10 @@ class TestDebride < Minitest::Test
|
|
397
482
|
object.a3 = 'Baz'
|
398
483
|
RUBY
|
399
484
|
|
400
|
-
|
485
|
+
exp = [["AttributeAccessor",
|
486
|
+
[:a1=, :a2, :a3, :class_method, :r2, :w2=]]]
|
487
|
+
|
488
|
+
d = assert_process exp, ruby
|
401
489
|
|
402
490
|
exp = {
|
403
491
|
"AttributeAccessor#a1" => "(io):2",
|
@@ -408,10 +496,12 @@ class TestDebride < Minitest::Test
|
|
408
496
|
"AttributeAccessor#a3=" => "(io):2",
|
409
497
|
"AttributeAccessor#w1=" => "(io):3",
|
410
498
|
"AttributeAccessor#w2=" => "(io):3",
|
499
|
+
"AttributeAccessor#w3=" => "(io):3",
|
500
|
+
"AttributeAccessor#w4=" => "(io):3",
|
411
501
|
"AttributeAccessor#r1" => "(io):4",
|
412
502
|
"AttributeAccessor#r2" => "(io):4",
|
413
|
-
"AttributeAccessor#initialize" => "(io):5-
|
414
|
-
"AttributeAccessor::class_method" => "(io):
|
503
|
+
"AttributeAccessor#initialize" => "(io):5-9",
|
504
|
+
"AttributeAccessor::class_method" => "(io):12-13"
|
415
505
|
}
|
416
506
|
|
417
507
|
assert_equal exp, d.method_locations
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: debride
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
@@ -10,9 +10,9 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
13
|
+
MIIDPjCCAiagAwIBAgIBBzANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu
|
14
14
|
ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
|
15
|
-
|
15
|
+
GRYDY29tMB4XDTIzMDEwMTA3NTExN1oXDTI0MDEwMTA3NTExN1owRTETMBEGA1UE
|
16
16
|
AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
|
17
17
|
JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
|
18
18
|
b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
|
@@ -22,14 +22,14 @@ cert_chain:
|
|
22
22
|
qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
|
23
23
|
gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
|
24
24
|
HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBCwUAA4IB
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
AQAkg3y+PBnBAPWdxxITm5sPHqdWQgSyCpRA20o4LTuWr8BWhSXBkfQNa7cY6fOn
|
26
|
+
xyM34VPzBFbExv6XOGDfOMFBVaYTHuN9peC/5/umL7kLl+nflXzL2QA7K6LYj5Bg
|
27
|
+
sM574Onr0dZDM6Vn69bzQ7rBIFDfK/OhlPzqKZad4nsdcsVH8ODCiT+ATMIZyz5K
|
28
|
+
WCnNtqlyiWXI8tdTpahDgcUwfcN/oN7v4K8iU5IbLJX6HQ5DKgmKjfb6XyMth16k
|
29
|
+
ROfWo9Uyp8ba/j9eVG14KkYRaLydAY1MNQk2yd3R5CGfeOpD1kttxjoypoUJ2dOG
|
30
|
+
nsNBRuQJ1UfiCG97a6DNm+Fr
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date:
|
32
|
+
date: 2023-03-24 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: sexp_processor
|
@@ -113,14 +113,14 @@ dependencies:
|
|
113
113
|
requirements:
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
116
|
+
version: '4.0'
|
117
117
|
type: :development
|
118
118
|
prerelease: false
|
119
119
|
version_requirements: !ruby/object:Gem::Requirement
|
120
120
|
requirements:
|
121
121
|
- - "~>"
|
122
122
|
- !ruby/object:Gem::Version
|
123
|
-
version: '
|
123
|
+
version: '4.0'
|
124
124
|
description: Analyze code for potentially uncalled / dead methods, now with auto-removal.
|
125
125
|
email:
|
126
126
|
- ryand-ruby@zenspider.com
|
@@ -166,7 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
166
|
- !ruby/object:Gem::Version
|
167
167
|
version: '0'
|
168
168
|
requirements: []
|
169
|
-
rubygems_version: 3.
|
169
|
+
rubygems_version: 3.4.6
|
170
170
|
signing_key:
|
171
171
|
specification_version: 4
|
172
172
|
summary: Analyze code for potentially uncalled / dead methods, now with auto-removal.
|
metadata.gz.sig
CHANGED
Binary file
|