debride 1.7.0 → 1.8.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.tar.gz.sig +0 -0
- data/History.rdoc +10 -0
- data/README.rdoc +5 -0
- data/lib/debride.rb +46 -27
- data/test/test_debride.rb +52 -2
- metadata +19 -19
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9997dcf31c73430147cd74d4365cacc011a9ddf9
|
4
|
+
data.tar.gz: 0d52faa989d72642bfc90eb59efe69c1eb29bd85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '090808da18149228a64261245d549cb50fa78141b73428a913fe606b61f700bec4ada3de220c5b9ff01e48b1f15f94daa93a4296f570d8da65f6cea7bf53e124'
|
7
|
+
data.tar.gz: 73af8d47c93780a568590bc7bf34b4ff4df80dd6ce9e877d01347b232ca2907274b7d1cb4b090481a5aaab13e23f2e3575324a02e9f49c10bffb513c7817086b
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/History.rdoc
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
=== 1.8.0 / 2017-05-09
|
2
|
+
|
3
|
+
* 1 minor enhancement:
|
4
|
+
|
5
|
+
* Updated rails support. (phiggins)
|
6
|
+
|
7
|
+
* 1 bug fix:
|
8
|
+
|
9
|
+
* Fixed regression reporting class methods caused by 1.7.0. (marcinruszkiewicz/etagwerker)
|
10
|
+
|
1
11
|
=== 1.7.0 / 2016-11-30
|
2
12
|
|
3
13
|
* 1 minor enhancement:
|
data/README.rdoc
CHANGED
@@ -52,6 +52,11 @@ debride-haml :: Plugin to allow debride to parse Haml files.
|
|
52
52
|
debride-curly :: A plugin for the Curly templating language
|
53
53
|
debride-slim :: Extends debride to analyze Slim files
|
54
54
|
|
55
|
+
== EDITOR INTEGRATION:
|
56
|
+
|
57
|
+
TextMate 2 :: * {Debride-Rails.tmbundle}[https://github.com/jjuliano/Debride-Rails.tmbundle] - Debride with Rails support
|
58
|
+
* {Debride.tmbundle}[https://github.com/jjuliano/Debride-Rails.tmbundle] - Debride for Ruby
|
59
|
+
|
55
60
|
== REQUIREMENTS:
|
56
61
|
|
57
62
|
* sexp_processor
|
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.8.0" # :nodoc:
|
26
26
|
PROJECT = "debride"
|
27
27
|
|
28
28
|
def self.load_plugins proj = PROJECT
|
@@ -262,29 +262,27 @@ class Debride < MethodBasedSexpProcessor
|
|
262
262
|
if Sexp === msg_arg && [:lit, :str].include?(msg_arg.sexp_type) then
|
263
263
|
called << msg_arg.last.to_sym
|
264
264
|
end
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
end
|
287
|
-
end
|
265
|
+
when *RAILS_DSL_METHODS, *RAILS_VALIDATION_METHODS then
|
266
|
+
if option[:rails]
|
267
|
+
# s(:call, nil, :before_save, s(:lit, :save_callback), s(:hash, ...))
|
268
|
+
if RAILS_DSL_METHODS.include?(method_name)
|
269
|
+
_, _, _, (_, new_name), * = sexp
|
270
|
+
called << new_name if new_name
|
271
|
+
end
|
272
|
+
possible_hash = sexp.last
|
273
|
+
if Sexp === possible_hash && possible_hash.sexp_type == :hash
|
274
|
+
possible_hash.sexp_body.each_slice(2) do |key, val|
|
275
|
+
next unless Sexp === val
|
276
|
+
called << val.last if val.first == :lit
|
277
|
+
called << val.last.to_sym if val.first == :str
|
278
|
+
end
|
279
|
+
end
|
280
|
+
end
|
281
|
+
when *RAILS_MACRO_METHODS
|
282
|
+
# s(:call, nil, :has_one, s(:lit, :has_one_relation), ...)
|
283
|
+
_, _, _, (_, name), * = sexp
|
284
|
+
file, line = sexp.file, sexp.line
|
285
|
+
record_method name, file, line
|
288
286
|
when /_path$/ then
|
289
287
|
method_name = method_name.to_s[0..-6].to_sym if option[:rails]
|
290
288
|
end
|
@@ -398,7 +396,9 @@ class Debride < MethodBasedSexpProcessor
|
|
398
396
|
|
399
397
|
missing.each do |klass, meths|
|
400
398
|
bad = meths.map { |meth|
|
401
|
-
location =
|
399
|
+
location =
|
400
|
+
method_locations["#{klass}##{meth}"] ||
|
401
|
+
method_locations["#{klass}::#{meth}"]
|
402
402
|
path = location[/(.+):\d+$/, 1]
|
403
403
|
|
404
404
|
next if focus and not File.fnmatch(focus, path)
|
@@ -414,12 +414,16 @@ class Debride < MethodBasedSexpProcessor
|
|
414
414
|
end
|
415
415
|
end
|
416
416
|
|
417
|
+
##
|
418
|
+
# Rails' macro-style methods that setup method calls to happen during a rails
|
419
|
+
# app's execution.
|
420
|
+
|
417
421
|
RAILS_DSL_METHODS = [
|
418
422
|
:after_action,
|
419
423
|
:around_action,
|
420
424
|
:before_action,
|
421
425
|
|
422
|
-
# http://api.rubyonrails.org/
|
426
|
+
# http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
|
423
427
|
:after_commit,
|
424
428
|
:after_create,
|
425
429
|
:after_destroy,
|
@@ -444,8 +448,12 @@ class Debride < MethodBasedSexpProcessor
|
|
444
448
|
:validate,
|
445
449
|
]
|
446
450
|
|
447
|
-
|
451
|
+
##
|
452
|
+
# Rails' macro-style methods that count as method calls if their options
|
453
|
+
# include +:if+ or +:unless+.
|
454
|
+
|
448
455
|
RAILS_VALIDATION_METHODS = [
|
456
|
+
# http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html
|
449
457
|
:validates,
|
450
458
|
:validates_absence_of,
|
451
459
|
:validates_acceptance_of,
|
@@ -458,4 +466,15 @@ class Debride < MethodBasedSexpProcessor
|
|
458
466
|
:validates_presence_of,
|
459
467
|
:validates_size_of,
|
460
468
|
]
|
469
|
+
|
470
|
+
##
|
471
|
+
# Rails' macro-style methods that define methods dynamically.
|
472
|
+
|
473
|
+
RAILS_MACRO_METHODS = [
|
474
|
+
:belongs_to,
|
475
|
+
:has_and_belongs_to_many,
|
476
|
+
:has_many,
|
477
|
+
:has_one,
|
478
|
+
:scope,
|
479
|
+
]
|
461
480
|
end
|
data/test/test_debride.rb
CHANGED
@@ -223,12 +223,57 @@ class TestDebride < Minitest::Test
|
|
223
223
|
after_save :save_callback, if: lambda {|r| true }
|
224
224
|
validates :database_column, if: :validation_condition
|
225
225
|
validate :some_validation_method
|
226
|
+
|
227
|
+
before_save do
|
228
|
+
foo.bar
|
229
|
+
end
|
226
230
|
end
|
227
231
|
RUBY
|
228
232
|
|
229
233
|
assert_process [], ruby, :rails => true
|
230
234
|
end
|
231
235
|
|
236
|
+
def test_rails_dsl_macro_definitions
|
237
|
+
ruby = <<-RUBY.strip
|
238
|
+
class RailsModel
|
239
|
+
has_one :has_one_relation
|
240
|
+
has_one :uncalled_has_one_relation
|
241
|
+
belongs_to :belongs_to_relation
|
242
|
+
belongs_to :uncalled_belongs_to_relation
|
243
|
+
has_many :has_many_relation
|
244
|
+
has_many :uncalled_has_many_relation
|
245
|
+
has_and_belongs_to_many :has_and_belongs_to_many_relation
|
246
|
+
has_and_belongs_to_many :uncalled_has_and_belongs_to_many_relation
|
247
|
+
scope :scope_method
|
248
|
+
scope :uncalled_scope_method
|
249
|
+
|
250
|
+
def instance_method_caller
|
251
|
+
has_one_relation
|
252
|
+
belongs_to_relation
|
253
|
+
has_many_relation
|
254
|
+
has_and_belongs_to_many_relation
|
255
|
+
end
|
256
|
+
|
257
|
+
def self.class_method_caller
|
258
|
+
scope_method
|
259
|
+
end
|
260
|
+
|
261
|
+
class_method_caller
|
262
|
+
new.instance_method_caller
|
263
|
+
end
|
264
|
+
RUBY
|
265
|
+
|
266
|
+
unused_methods = [
|
267
|
+
:uncalled_belongs_to_relation,
|
268
|
+
:uncalled_has_and_belongs_to_many_relation,
|
269
|
+
:uncalled_has_many_relation,
|
270
|
+
:uncalled_has_one_relation,
|
271
|
+
:uncalled_scope_method,
|
272
|
+
]
|
273
|
+
|
274
|
+
assert_process [["RailsModel", unused_methods]], ruby, :rails => true
|
275
|
+
end
|
276
|
+
|
232
277
|
def test_constants
|
233
278
|
ruby = <<-RUBY.strip
|
234
279
|
class Constants
|
@@ -259,6 +304,10 @@ class TestDebride < Minitest::Test
|
|
259
304
|
self.a2 = 'Bar'
|
260
305
|
self.w1 = 'W'
|
261
306
|
end
|
307
|
+
|
308
|
+
def self.class_method
|
309
|
+
puts "bazinga"
|
310
|
+
end
|
262
311
|
end
|
263
312
|
|
264
313
|
object = AttributeAccessor.new
|
@@ -267,7 +316,7 @@ class TestDebride < Minitest::Test
|
|
267
316
|
object.a3 = 'Baz'
|
268
317
|
RUBY
|
269
318
|
|
270
|
-
d = assert_process [["AttributeAccessor", [:a1=, :a2, :a3, :r2, :w2=]]], ruby
|
319
|
+
d = assert_process [["AttributeAccessor", [:a1=, :a2, :a3, :class_method, :r2, :w2=]]], ruby
|
271
320
|
|
272
321
|
exp = {
|
273
322
|
"AttributeAccessor#a1" => "(io):2",
|
@@ -280,7 +329,8 @@ class TestDebride < Minitest::Test
|
|
280
329
|
"AttributeAccessor#w2=" => "(io):3",
|
281
330
|
"AttributeAccessor#r1" => "(io):4",
|
282
331
|
"AttributeAccessor#r2" => "(io):4",
|
283
|
-
"AttributeAccessor#initialize" => "(io):5",
|
332
|
+
"AttributeAccessor#initialize" => "(io):5-7",
|
333
|
+
"AttributeAccessor::class_method" => "(io):10-11"
|
284
334
|
}
|
285
335
|
|
286
336
|
assert_equal exp, d.method_locations
|
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.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
@@ -30,78 +30,78 @@ cert_chain:
|
|
30
30
|
E4oJcnPkJAr0rw504JGtlZtONZQblwmRJOIdXzolaE3NRGUzGVOUSptZppAKiavY
|
31
31
|
fO6tdKQc/5RfA8oQEkg8hrxA5PQSz4TOFJGLpFvIapEk6tMruQ0bHgkhr9auXg==
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date:
|
33
|
+
date: 2017-05-09 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: sexp_processor
|
37
37
|
requirement: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - ~>
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '4.5'
|
42
42
|
type: :runtime
|
43
43
|
prerelease: false
|
44
44
|
version_requirements: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - ~>
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '4.5'
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: ruby_parser
|
51
51
|
requirement: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - ~>
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '3.6'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - ~>
|
60
|
+
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '3.6'
|
63
63
|
- !ruby/object:Gem::Dependency
|
64
64
|
name: path_expander
|
65
65
|
requirement: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - ~>
|
67
|
+
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '1.0'
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- - ~>
|
74
|
+
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: '1.0'
|
77
77
|
- !ruby/object:Gem::Dependency
|
78
78
|
name: rdoc
|
79
79
|
requirement: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- - ~>
|
81
|
+
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '4.0'
|
84
84
|
type: :development
|
85
85
|
prerelease: false
|
86
86
|
version_requirements: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- - ~>
|
88
|
+
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: '4.0'
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: hoe
|
93
93
|
requirement: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- - ~>
|
95
|
+
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: '3.
|
97
|
+
version: '3.16'
|
98
98
|
type: :development
|
99
99
|
prerelease: false
|
100
100
|
version_requirements: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- - ~>
|
102
|
+
- - "~>"
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version: '3.
|
104
|
+
version: '3.16'
|
105
105
|
description: Analyze code for potentially uncalled / dead methods, now with auto-removal.
|
106
106
|
email:
|
107
107
|
- ryand-ruby@zenspider.com
|
@@ -115,7 +115,7 @@ extra_rdoc_files:
|
|
115
115
|
- Manifest.txt
|
116
116
|
- README.rdoc
|
117
117
|
files:
|
118
|
-
- .autotest
|
118
|
+
- ".autotest"
|
119
119
|
- History.rdoc
|
120
120
|
- Manifest.txt
|
121
121
|
- README.rdoc
|
@@ -131,23 +131,23 @@ licenses:
|
|
131
131
|
metadata: {}
|
132
132
|
post_install_message:
|
133
133
|
rdoc_options:
|
134
|
-
- --main
|
134
|
+
- "--main"
|
135
135
|
- README.rdoc
|
136
136
|
require_paths:
|
137
137
|
- lib
|
138
138
|
required_ruby_version: !ruby/object:Gem::Requirement
|
139
139
|
requirements:
|
140
|
-
- -
|
140
|
+
- - ">="
|
141
141
|
- !ruby/object:Gem::Version
|
142
142
|
version: '0'
|
143
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
144
144
|
requirements:
|
145
|
-
- -
|
145
|
+
- - ">="
|
146
146
|
- !ruby/object:Gem::Version
|
147
147
|
version: '0'
|
148
148
|
requirements: []
|
149
149
|
rubyforge_project:
|
150
|
-
rubygems_version: 2.
|
150
|
+
rubygems_version: 2.6.8
|
151
151
|
signing_key:
|
152
152
|
specification_version: 4
|
153
153
|
summary: Analyze code for potentially uncalled / dead methods, now with auto-removal.
|
metadata.gz.sig
CHANGED
Binary file
|