debride 1.6.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +10 -0
- data/Manifest.txt +1 -0
- data/README.rdoc +3 -1
- data/bin/debride_rm +96 -0
- data/lib/debride.rb +2 -8
- data/test/test_debride.rb +0 -18
- metadata +17 -14
- metadata.gz.sig +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9e867eaaa0e3d510c124de19d4ea6ab0fa818e5
|
4
|
+
data.tar.gz: 39740af34dbd97eb9e1286ab0a1ca51437aec120
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee65c75009da3d4f6c8760c5fe0b493929008d42f81be3db3cb19e6cf3c8e30f89483eb30088c95d1174880e91b9895e72ecf5f31c5c6fa36d9930f374291d72
|
7
|
+
data.tar.gz: ce1b919309e8790d5a320675721ed82116a1312440ff678fb002f00130247ca7369e71358ad3d379749ac2c6048b6e6a7e109b1405d478055daa30e5881f24ff
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/History.rdoc
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
=== 1.7.0 / 2016-11-30
|
2
|
+
|
3
|
+
* 1 minor enhancement:
|
4
|
+
|
5
|
+
* Added bin/debride_rm to automatically remove all dead methods!
|
6
|
+
|
7
|
+
* 1 bug fix:
|
8
|
+
|
9
|
+
* Remove #map hash in favor of #method_locations (chrisarcand)
|
10
|
+
|
1
11
|
=== 1.6.0 / 2016-05-15
|
2
12
|
|
3
13
|
* 1 minor enhancement:
|
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
@@ -5,7 +5,7 @@ rdoc :: http://docs.seattlerb.org/debride
|
|
5
5
|
|
6
6
|
== DESCRIPTION:
|
7
7
|
|
8
|
-
Analyze code for potentially uncalled / dead methods.
|
8
|
+
Analyze code for potentially uncalled / dead methods, now with auto-removal.
|
9
9
|
|
10
10
|
== FEATURES/PROBLEMS:
|
11
11
|
|
@@ -13,6 +13,7 @@ Analyze code for potentially uncalled / dead methods.
|
|
13
13
|
* As with all static analysis tools of dynamic languages, can't be 100%.
|
14
14
|
* Whitelisting known good methods by name or regexp.
|
15
15
|
* Use --rails for Rails-specific domain knowledge.
|
16
|
+
* Use debride_rm to brazenly remove all unused methods. BE CAREFUL.
|
16
17
|
* Use `debride_rails_whitelist` to generate an emperical whitelist from logs.
|
17
18
|
* Uses path_expander, so you can use:
|
18
19
|
* dir_arg -- expand a directory automatically
|
@@ -49,6 +50,7 @@ You can also use regexps in your whitelist by delimiting them with //'s.
|
|
49
50
|
debride-erb :: Extends debride to analyze erb files (via erubis ala rails).
|
50
51
|
debride-haml :: Plugin to allow debride to parse Haml files.
|
51
52
|
debride-curly :: A plugin for the Curly templating language
|
53
|
+
debride-slim :: Extends debride to analyze Slim files
|
52
54
|
|
53
55
|
== REQUIREMENTS:
|
54
56
|
|
data/bin/debride_rm
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
|
3
|
+
def autoclave nuke
|
4
|
+
skips = 0
|
5
|
+
|
6
|
+
nuke.each do |path, ary|
|
7
|
+
# warn path
|
8
|
+
|
9
|
+
file = File.readlines path
|
10
|
+
|
11
|
+
ary.each do |(line, name)|
|
12
|
+
opener = file[line-1]
|
13
|
+
|
14
|
+
case opener
|
15
|
+
when /^\s*def/
|
16
|
+
# do nothing
|
17
|
+
else # attr_accessor, etc
|
18
|
+
# warn " unsupported: #{opener.strip}"
|
19
|
+
skips += 1
|
20
|
+
next
|
21
|
+
end
|
22
|
+
|
23
|
+
leader = opener[/^\s+/]
|
24
|
+
end_line = file[line..-1].find_index { |l| l =~ /^#{leader}end/ }
|
25
|
+
|
26
|
+
if end_line then
|
27
|
+
end_line += line + 1
|
28
|
+
end_line += 1 while file[end_line] =~ /^\s*$/
|
29
|
+
end_line += 1 while file[end_line] =~ /^\s*alias.*?\b#{name}$/
|
30
|
+
end_line += 1 while file[end_line] =~ /^\s*$/
|
31
|
+
|
32
|
+
end_line.downto line do |i|
|
33
|
+
file.delete_at(i-1)
|
34
|
+
end
|
35
|
+
else
|
36
|
+
warn "NOT FOUND: ending for #{name} #{path}:#{line}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
File.open path, "w" do |f|
|
41
|
+
f.write file.join
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
print " skips = %3d" % skips if skips > 0
|
46
|
+
end
|
47
|
+
|
48
|
+
def read_debride path
|
49
|
+
nuke = Hash.new { |h,k| h[k] = [] }
|
50
|
+
|
51
|
+
count = 0
|
52
|
+
|
53
|
+
File.foreach path do |line|
|
54
|
+
case line
|
55
|
+
when /^ (\S+)\s+(\S+):(\d+)$/ then
|
56
|
+
name, path, line = $1, $2, $3.to_i
|
57
|
+
nuke[path] << [line, name]
|
58
|
+
count += 1
|
59
|
+
when /^[\w:]+$/, "\n", /:$/ then
|
60
|
+
# ignore
|
61
|
+
else
|
62
|
+
warn "unparsed: #{line.chomp}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
nuke.each do |k, ary|
|
67
|
+
nuke[k] = ary.sort.reverse
|
68
|
+
end
|
69
|
+
|
70
|
+
[nuke, count]
|
71
|
+
end
|
72
|
+
|
73
|
+
iter = 0
|
74
|
+
old_count = nil
|
75
|
+
|
76
|
+
abort "usage: #{$0} [debride args]+" if ARGV.empty? or ARGV.include? "-h"
|
77
|
+
|
78
|
+
cmd = %w[debride] + ARGV + %w[> dummy_for_cmd_below]
|
79
|
+
|
80
|
+
loop do
|
81
|
+
iter += 1
|
82
|
+
dead = "dead%02d.txt" % iter
|
83
|
+
cmd[-1] = dead
|
84
|
+
|
85
|
+
Process.wait Process.spawn cmd.join " "
|
86
|
+
abort "debride failed: #{$?}" unless $?.success?
|
87
|
+
|
88
|
+
nuke, count = read_debride dead
|
89
|
+
|
90
|
+
break if old_count == count
|
91
|
+
old_count = count
|
92
|
+
|
93
|
+
print "iter = %2d count = %4d" % [iter, count]
|
94
|
+
autoclave nuke
|
95
|
+
puts
|
96
|
+
end
|
data/lib/debride.rb
CHANGED
@@ -22,7 +22,7 @@ end
|
|
22
22
|
# A static code analyzer that points out possible dead methods.
|
23
23
|
|
24
24
|
class Debride < MethodBasedSexpProcessor
|
25
|
-
VERSION = "1.
|
25
|
+
VERSION = "1.7.0" # :nodoc:
|
26
26
|
PROJECT = "debride"
|
27
27
|
|
28
28
|
def self.load_plugins proj = PROJECT
|
@@ -188,7 +188,6 @@ class Debride < MethodBasedSexpProcessor
|
|
188
188
|
# Command-line options.
|
189
189
|
|
190
190
|
attr_accessor :option
|
191
|
-
attr_accessor :map # :nodoc: # TODO: retire and use method_locations
|
192
191
|
|
193
192
|
##
|
194
193
|
# Create a new Debride instance w/ +options+
|
@@ -197,7 +196,6 @@ class Debride < MethodBasedSexpProcessor
|
|
197
196
|
self.option = { :whitelist => [] }.merge options
|
198
197
|
self.known = Hash.new { |h,k| h[k] = Set.new }
|
199
198
|
self.called = Set.new
|
200
|
-
self.map = Hash.new { |h,k| h[k] = {} }
|
201
199
|
super()
|
202
200
|
end
|
203
201
|
|
@@ -220,7 +218,6 @@ class Debride < MethodBasedSexpProcessor
|
|
220
218
|
def record_method name, file, line
|
221
219
|
signature = "#{klass_name}##{name}"
|
222
220
|
method_locations[signature] = "#{file}:#{line}"
|
223
|
-
map[klass_name][name] = signature
|
224
221
|
known[name] << klass_name
|
225
222
|
end
|
226
223
|
|
@@ -304,7 +301,6 @@ class Debride < MethodBasedSexpProcessor
|
|
304
301
|
process val
|
305
302
|
|
306
303
|
signature = "#{klass_name}::#{name}"
|
307
|
-
map[klass_name][name] = signature
|
308
304
|
known[name] << klass_name
|
309
305
|
|
310
306
|
file, line = exp.file, exp.line
|
@@ -340,7 +336,6 @@ class Debride < MethodBasedSexpProcessor
|
|
340
336
|
|
341
337
|
def process_defn sexp # :nodoc:
|
342
338
|
super do
|
343
|
-
map[klass_name][plain_method_name] = signature
|
344
339
|
known[plain_method_name] << klass_name
|
345
340
|
process_until_empty sexp
|
346
341
|
end
|
@@ -348,7 +343,6 @@ class Debride < MethodBasedSexpProcessor
|
|
348
343
|
|
349
344
|
def process_defs sexp # :nodoc:
|
350
345
|
super do
|
351
|
-
map[klass_name][plain_method_name] = signature
|
352
346
|
known[plain_method_name] << klass_name
|
353
347
|
process_until_empty sexp
|
354
348
|
end
|
@@ -404,7 +398,7 @@ class Debride < MethodBasedSexpProcessor
|
|
404
398
|
|
405
399
|
missing.each do |klass, meths|
|
406
400
|
bad = meths.map { |meth|
|
407
|
-
location = method_locations[
|
401
|
+
location = method_locations["#{klass}##{meth}"]
|
408
402
|
path = location[/(.+):\d+$/, 1]
|
409
403
|
|
410
404
|
next if focus and not File.fnmatch(focus, path)
|
data/test/test_debride.rb
CHANGED
@@ -269,24 +269,6 @@ class TestDebride < Minitest::Test
|
|
269
269
|
|
270
270
|
d = assert_process [["AttributeAccessor", [:a1=, :a2, :a3, :r2, :w2=]]], ruby
|
271
271
|
|
272
|
-
exp = {
|
273
|
-
"AttributeAccessor" => {
|
274
|
-
:a1 => "AttributeAccessor#a1",
|
275
|
-
:a1= => "AttributeAccessor#a1=",
|
276
|
-
:a2 => "AttributeAccessor#a2",
|
277
|
-
:a2= => "AttributeAccessor#a2=",
|
278
|
-
:a3 => "AttributeAccessor#a3",
|
279
|
-
:a3= => "AttributeAccessor#a3=",
|
280
|
-
:w1= => "AttributeAccessor#w1=",
|
281
|
-
:w2= => "AttributeAccessor#w2=",
|
282
|
-
:r1 => "AttributeAccessor#r1",
|
283
|
-
:r2 => "AttributeAccessor#r2",
|
284
|
-
:initialize => "AttributeAccessor#initialize"
|
285
|
-
}
|
286
|
-
}
|
287
|
-
|
288
|
-
assert_equal exp, d.map
|
289
|
-
|
290
272
|
exp = {
|
291
273
|
"AttributeAccessor#a1" => "(io):2",
|
292
274
|
"AttributeAccessor#a1=" => "(io):2",
|
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.7.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
|
+
MIIDijCCAnKgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu
|
14
14
|
ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
|
15
|
-
|
15
|
+
GRYDY29tMB4XDTE2MDkyNjAxNTczNVoXDTE3MDkyNjAxNTczNVowRTETMBEGA1UE
|
16
16
|
AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
|
17
17
|
JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
|
18
18
|
b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
|
@@ -20,16 +20,17 @@ cert_chain:
|
|
20
20
|
oOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh
|
21
21
|
GiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt
|
22
22
|
qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
|
23
|
-
gBEfoTEGr7Zii72cx+
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
23
|
+
gBEfoTEGr7Zii72cx+sCAwEAAaOBhDCBgTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE
|
24
|
+
sDAdBgNVHQ4EFgQUR8V72Z3+v+2P9abCnL4wjx32T+EwIwYDVR0RBBwwGoEYcnlh
|
25
|
+
bmQtcnVieUB6ZW5zcGlkZXIuY29tMCMGA1UdEgQcMBqBGHJ5YW5kLXJ1YnlAemVu
|
26
|
+
c3BpZGVyLmNvbTANBgkqhkiG9w0BAQUFAAOCAQEAIGzgp0aZ2W9+v96ujmBcQHoC
|
27
|
+
buy0iU68MVj2VlxMyfr1KPZIh1OyhU4UO4zrkREcH8ML70v9cYHNvOd9oynRHnvC
|
28
|
+
l2tj/fD3YJ0AEkJxGrYwRWQmvMfC4bJ02bC1+rVOUIXXKp3+cUmiN4sTniof8VFo
|
29
|
+
bo/YYP4c7erpERa+9hrqygg6WQbJlk2YRlH3JXPFjmu869i2dcbR5ZLOAeEy+axH
|
30
|
+
E4oJcnPkJAr0rw504JGtlZtONZQblwmRJOIdXzolaE3NRGUzGVOUSptZppAKiavY
|
31
|
+
fO6tdKQc/5RfA8oQEkg8hrxA5PQSz4TOFJGLpFvIapEk6tMruQ0bHgkhr9auXg==
|
31
32
|
-----END CERTIFICATE-----
|
32
|
-
date: 2016-
|
33
|
+
date: 2016-12-01 00:00:00.000000000 Z
|
33
34
|
dependencies:
|
34
35
|
- !ruby/object:Gem::Dependency
|
35
36
|
name: sexp_processor
|
@@ -101,12 +102,13 @@ dependencies:
|
|
101
102
|
- - ~>
|
102
103
|
- !ruby/object:Gem::Version
|
103
104
|
version: '3.15'
|
104
|
-
description: Analyze code for potentially uncalled / dead methods.
|
105
|
+
description: Analyze code for potentially uncalled / dead methods, now with auto-removal.
|
105
106
|
email:
|
106
107
|
- ryand-ruby@zenspider.com
|
107
108
|
executables:
|
108
109
|
- debride
|
109
110
|
- debride_rails_whitelist
|
111
|
+
- debride_rm
|
110
112
|
extensions: []
|
111
113
|
extra_rdoc_files:
|
112
114
|
- History.rdoc
|
@@ -120,6 +122,7 @@ files:
|
|
120
122
|
- Rakefile
|
121
123
|
- bin/debride
|
122
124
|
- bin/debride_rails_whitelist
|
125
|
+
- bin/debride_rm
|
123
126
|
- lib/debride.rb
|
124
127
|
- test/test_debride.rb
|
125
128
|
homepage: https://github.com/seattlerb/debride
|
@@ -147,5 +150,5 @@ rubyforge_project:
|
|
147
150
|
rubygems_version: 2.4.5
|
148
151
|
signing_key:
|
149
152
|
specification_version: 4
|
150
|
-
summary: Analyze code for potentially uncalled / dead methods.
|
153
|
+
summary: Analyze code for potentially uncalled / dead methods, now with auto-removal.
|
151
154
|
test_files: []
|
metadata.gz.sig
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
�e�6������^�@&�e��zC��`W�j�Pqz�Ʌ+�4t��^��e;EU�� P�lKˮ~�-�'r��!z_A�T��|���N�]N2_��O�C�,�>2(�y'��h��J��>n��)���C{��S��v�P�m���סA�E��;����L!�|p�*�P0��F��ϙ���nV���lT��.�v����ZZ8�^d0G��TS�ݴ�A�I��=����:h�9껖����!�n�F(^�W�
|