debride 1.10.0 → 1.11.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: 59c8a2f9b5b719c39af3b257881dbc7440f7f1c7000b4e55efdb411120f7cbde
4
- data.tar.gz: 398c595e7080ecab2a3c2195f7a5176c4a4f19ecf517543a9fdc6d7b9dfe3eb4
3
+ metadata.gz: a3d7a09de612d4aa5772fbc3db3e26f51a06331c360c62d359acb8465f3f242a
4
+ data.tar.gz: 95ce5aff93c1900456ad929a959d60f275feb036ecbb890edd590246d284c5eb
5
5
  SHA512:
6
- metadata.gz: dce7e6ad57ab80693a10c2292192515ced017a6e944aa12c2fde55f766d818357bdc4e7b9c99ab14348a6039a299e3fecd3d105e3a02e544cabba0e5e03d54e5
7
- data.tar.gz: bc1ec0cf4667aedfc5a85fbf076e3442f08d9acfc7ed2b4e480308f59a6301defcab4222f330f53832af693139aa324ab3cc83ad2d8bc80d1fa63c6e1edc0f18
6
+ metadata.gz: b8c4f5575198e3d8de1c7486cf5b2a6e43e2f2d8ec61af07b3e6d8f5e101cd5343acb108a55468b1e19e8605c3c27acad32918084c4165a666f58e6d367fb72b
7
+ data.tar.gz: 17dbd73820e02cea048e1cdc61d4811e3d00702f0d2fcc58098e56982205b80e1932cf6358d3692a7647da0de67251c2cab22e274598b420eae48cedeff94726
checksums.yaml.gz.sig CHANGED
Binary file
data/History.rdoc CHANGED
@@ -1,3 +1,33 @@
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
+
12
+ === 1.10.1 / 2022-12-03
13
+
14
+ * 4 minor enhancements:
15
+
16
+ * Added --minimum <Nloc> flag to filter out smaller suspects.
17
+ * Added line count to suspects in report and total line count to end of report.
18
+ * Added processing of `delegate xs to: target` as a call to target.
19
+ * Added processing of rails deliver_X -> X calls.
20
+
21
+ * 3 bug fixes:
22
+
23
+ * Fixed processing of colon2 (X::Y::Z) names.
24
+ * Fixed processing of var splatted attr_* methods.
25
+ * Possibly fixed conflation between rails route scopes and model scopes.
26
+
27
+ === 1.10.0 / 2022-12-03
28
+
29
+ * See above... something went wrong with the release process.
30
+
1
31
  === 1.9.0 / 2022-05-23
2
32
 
3
33
  * 3 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.9.0" # :nodoc:
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
- # http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
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
- # http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validate
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
- d = assert_process [["AttributeAccessor", [:a1=, :a2, :a3, :class_method, :r2, :w2=]]], ruby
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-7",
414
- "AttributeAccessor::class_method" => "(io):10-11"
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.10.0
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
- MIIDPjCCAiagAwIBAgIBBjANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu
13
+ MIIDPjCCAiagAwIBAgIBBzANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu
14
14
  ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
15
- GRYDY29tMB4XDTIxMTIyMzIzMTkwNFoXDTIyMTIyMzIzMTkwNFowRTETMBEGA1UE
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
- AQCKB5jfsuSnKb+t/Wrh3UpdkmX7TrEsjVmERC0pPqzQ5GQJgmEXDD7oMgaKXaAq
26
- x2m+KSZDrqk7c8uho5OX6YMqg4KdxehfSLqqTZGoeV78qwf/jpPQZKTf+W9gUSJh
27
- zsWpo4K50MP+QtdSbKXZwjAafpQ8hK0MnnZ/aeCsW9ov5vdXpYbf3dpg6ADXRGE7
28
- lQY2y1tJ5/chqu6h7dQmnm2ABUqx9O+JcN9hbCYoA5i/EeubUEtFIh2w3SpO6YfB
29
- JFmxn4h9YO/pVdB962BdBNNDia0kgIjI3ENnkLq0dKpYU3+F3KhEuTksLO0L6X/V
30
- YsuyUzsMz6GQA4khyaMgKNSD
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: 2022-12-03 00:00:00.000000000 Z
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: '3.25'
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: '3.25'
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.3.12
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
@@ -1,2 +1,3 @@
1
- W��e����h��
2
- Q�eJ�|{�|��c �>sEeB@��z�ܓN�Z̞PP�&�T�Z�F�gR��ˀi���%����Tł��x�c����������� זf������_B�n�[�c�o�lt�xfz,����:7�c̐Ā�&�۩�GX��mM�h������9����X�4u߫� .m͗i�\��V���dt�q9{{�����V�*M��HĎ��j��%;V�X����.�IV�i?0
1
+ �����=��BV��`L�*�tJc�A�
2
+ E��Q�v���!zK��
3
+ ���F� `�|��A�Ev<