debride 1.8.2 → 1.10.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 +12 -0
- data/Rakefile +6 -3
- data/lib/debride.rb +153 -51
- data/test/test_debride.rb +77 -16
- data.tar.gz.sig +0 -0
- metadata +32 -17
- 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: 59c8a2f9b5b719c39af3b257881dbc7440f7f1c7000b4e55efdb411120f7cbde
|
|
4
|
+
data.tar.gz: 398c595e7080ecab2a3c2195f7a5176c4a4f19ecf517543a9fdc6d7b9dfe3eb4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: dce7e6ad57ab80693a10c2292192515ced017a6e944aa12c2fde55f766d818357bdc4e7b9c99ab14348a6039a299e3fecd3d105e3a02e544cabba0e5e03d54e5
|
|
7
|
+
data.tar.gz: bc1ec0cf4667aedfc5a85fbf076e3442f08d9acfc7ed2b4e480308f59a6301defcab4222f330f53832af693139aa324ab3cc83ad2d8bc80d1fa63c6e1edc0f18
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/History.rdoc
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
=== 1.9.0 / 2022-05-23
|
|
2
|
+
|
|
3
|
+
* 3 minor enhancements:
|
|
4
|
+
|
|
5
|
+
* Added --json and --yaml output options.
|
|
6
|
+
* Added io argument to #report, added tests for #report.
|
|
7
|
+
* Improved processing of --exclude with directories (adds trailing slash).
|
|
8
|
+
|
|
9
|
+
* 1 bug fix:
|
|
10
|
+
|
|
11
|
+
* Fixed exception thrown in #report when using --focus. (cbillen)
|
|
12
|
+
|
|
1
13
|
=== 1.8.2 / 2019-09-24
|
|
2
14
|
|
|
3
15
|
* 1 bug fix:
|
data/Rakefile
CHANGED
|
@@ -13,6 +13,7 @@ Hoe::add_include_dirs("../../sexp_processor/dev/lib",
|
|
|
13
13
|
Hoe.plugin :isolate
|
|
14
14
|
Hoe.plugin :seattlerb
|
|
15
15
|
Hoe.plugin :rdoc
|
|
16
|
+
Hoe.plugin :cov
|
|
16
17
|
|
|
17
18
|
Hoe.spec "debride" do
|
|
18
19
|
developer "Ryan Davis", "ryand-ruby@zenspider.com"
|
|
@@ -26,15 +27,17 @@ end
|
|
|
26
27
|
def run dir, whitelist
|
|
27
28
|
abort "Specify dir to scan with D=<path>" unless dir
|
|
28
29
|
|
|
29
|
-
ENV["GEM_HOME"] = "tmp/isolate
|
|
30
|
-
ENV["GEM_PATH"] = "../../debride-erb/dev/tmp/isolate
|
|
30
|
+
ENV["GEM_HOME"] = "tmp/isolate"
|
|
31
|
+
ENV["GEM_PATH"] = "../../debride-erb/dev/tmp/isolate"
|
|
31
32
|
|
|
32
33
|
whitelist = whitelist && ["--whitelist", whitelist]
|
|
33
34
|
verbose = ENV["V"] && "-v"
|
|
35
|
+
exclude = ENV["E"] && ["--exclude", ENV["E"]]
|
|
36
|
+
minimum = ENV["M"] && ["--minimum", ENV["M"]]
|
|
34
37
|
|
|
35
38
|
require "debride"
|
|
36
39
|
|
|
37
|
-
args = ["--rails", verbose, whitelist, dir].flatten.compact
|
|
40
|
+
args = ["--rails", verbose, minimum, whitelist, exclude, dir].flatten.compact
|
|
38
41
|
|
|
39
42
|
Debride.run(args).report
|
|
40
43
|
end
|
data/lib/debride.rb
CHANGED
|
@@ -8,21 +8,11 @@ require "ruby_parser"
|
|
|
8
8
|
require "sexp_processor"
|
|
9
9
|
require "path_expander"
|
|
10
10
|
|
|
11
|
-
# :stopdoc:
|
|
12
|
-
class File
|
|
13
|
-
RUBY19 = "<3".respond_to? :encoding unless defined? RUBY19 # :nodoc:
|
|
14
|
-
|
|
15
|
-
class << self
|
|
16
|
-
alias :binread :read unless RUBY19
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
# :startdoc:
|
|
20
|
-
|
|
21
11
|
##
|
|
22
12
|
# A static code analyzer that points out possible dead methods.
|
|
23
13
|
|
|
24
14
|
class Debride < MethodBasedSexpProcessor
|
|
25
|
-
VERSION = "1.
|
|
15
|
+
VERSION = "1.9.0" # :nodoc:
|
|
26
16
|
PROJECT = "debride"
|
|
27
17
|
|
|
28
18
|
def self.load_plugins proj = PROJECT
|
|
@@ -66,6 +56,8 @@ class Debride < MethodBasedSexpProcessor
|
|
|
66
56
|
expander = PathExpander.new(args, glob)
|
|
67
57
|
files = expander.process
|
|
68
58
|
excl = debride.option[:exclude]
|
|
59
|
+
excl.map! { |fd| File.directory?(fd) ? "#{fd}/" : fd } if excl
|
|
60
|
+
|
|
69
61
|
files = expander.filter_files files, StringIO.new(excl.join "\n") if excl
|
|
70
62
|
|
|
71
63
|
debride.run(files)
|
|
@@ -94,33 +86,34 @@ class Debride < MethodBasedSexpProcessor
|
|
|
94
86
|
end
|
|
95
87
|
|
|
96
88
|
def process_rb path_or_io
|
|
97
|
-
|
|
98
|
-
warn "Processing ruby: #{path_or_io}" if option[:verbose]
|
|
99
|
-
|
|
100
|
-
case path_or_io
|
|
101
|
-
when String then
|
|
102
|
-
path, file = path_or_io, File.binread(path_or_io)
|
|
103
|
-
when IO, StringIO then
|
|
104
|
-
path, file = "(io)", path_or_io.read
|
|
105
|
-
else
|
|
106
|
-
raise "Unhandled type: #{path_or_io.class}:#{path_or_io.inspect}"
|
|
107
|
-
end
|
|
89
|
+
warn "Processing ruby: #{path_or_io}" if option[:verbose]
|
|
108
90
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
91
|
+
case path_or_io
|
|
92
|
+
when String then
|
|
93
|
+
path, file = path_or_io, File.binread(path_or_io)
|
|
94
|
+
when IO, StringIO then
|
|
95
|
+
path, file = "(io)", path_or_io.read
|
|
96
|
+
else
|
|
97
|
+
raise "Unhandled type: #{path_or_io.class}:#{path_or_io.inspect}"
|
|
116
98
|
end
|
|
99
|
+
|
|
100
|
+
rp = RubyParser.for_current_ruby rescue RubyParser.new
|
|
101
|
+
rp.process(file, path, option[:timeout])
|
|
102
|
+
rescue Racc::ParseError, RegexpError => e
|
|
103
|
+
warn "Parse Error parsing #{path}. Skipping."
|
|
104
|
+
warn " #{e.message}"
|
|
105
|
+
rescue Timeout::Error
|
|
106
|
+
warn "TIMEOUT parsing #{path}. Skipping."
|
|
117
107
|
end
|
|
118
108
|
|
|
119
109
|
##
|
|
120
110
|
# Parse command line options and return a hash of parsed option values.
|
|
121
111
|
|
|
122
112
|
def self.parse_options args
|
|
123
|
-
options = {
|
|
113
|
+
options = {
|
|
114
|
+
:whitelist => [],
|
|
115
|
+
:format => :text,
|
|
116
|
+
}
|
|
124
117
|
|
|
125
118
|
op = OptionParser.new do |opts|
|
|
126
119
|
opts.banner = "debride [options] files_or_dirs"
|
|
@@ -157,9 +150,21 @@ class Debride < MethodBasedSexpProcessor
|
|
|
157
150
|
options[:rails] = true
|
|
158
151
|
end
|
|
159
152
|
|
|
153
|
+
opts.on("-m", "--minimum N", Integer, "Don't show hits less than N locs.") do |n|
|
|
154
|
+
options[:minimum] = n
|
|
155
|
+
end
|
|
156
|
+
|
|
160
157
|
opts.on("-v", "--verbose", "Verbose. Show progress processing files.") do
|
|
161
158
|
options[:verbose] = true
|
|
162
159
|
end
|
|
160
|
+
|
|
161
|
+
opts.on "--json" do
|
|
162
|
+
options[:format] = :json
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
opts.on "--yaml" do
|
|
166
|
+
options[:format] = :yaml
|
|
167
|
+
end
|
|
163
168
|
end
|
|
164
169
|
|
|
165
170
|
op.parse! args
|
|
@@ -239,6 +244,10 @@ class Debride < MethodBasedSexpProcessor
|
|
|
239
244
|
_, _, _, *args = sexp
|
|
240
245
|
file, line = sexp.file, sexp.line
|
|
241
246
|
args.each do |(_, name)|
|
|
247
|
+
if Sexp === name then
|
|
248
|
+
process name
|
|
249
|
+
next
|
|
250
|
+
end
|
|
242
251
|
record_method name, file, line
|
|
243
252
|
record_method "#{name}=".to_sym, file, line
|
|
244
253
|
end
|
|
@@ -247,6 +256,10 @@ class Debride < MethodBasedSexpProcessor
|
|
|
247
256
|
_, _, _, *args = sexp
|
|
248
257
|
file, line = sexp.file, sexp.line
|
|
249
258
|
args.each do |(_, name)|
|
|
259
|
+
if Sexp === name then
|
|
260
|
+
process name
|
|
261
|
+
next
|
|
262
|
+
end
|
|
250
263
|
record_method "#{name}=".to_sym, file, line
|
|
251
264
|
end
|
|
252
265
|
when :attr_reader then
|
|
@@ -254,6 +267,10 @@ class Debride < MethodBasedSexpProcessor
|
|
|
254
267
|
_, _, _, *args = sexp
|
|
255
268
|
file, line = sexp.file, sexp.line
|
|
256
269
|
args.each do |(_, name)|
|
|
270
|
+
if Sexp === name then
|
|
271
|
+
process name
|
|
272
|
+
next
|
|
273
|
+
end
|
|
257
274
|
record_method name, file, line
|
|
258
275
|
end
|
|
259
276
|
when :send, :public_send, :__send__ then
|
|
@@ -262,6 +279,18 @@ class Debride < MethodBasedSexpProcessor
|
|
|
262
279
|
if Sexp === msg_arg && [:lit, :str].include?(msg_arg.sexp_type) then
|
|
263
280
|
called << msg_arg.last.to_sym
|
|
264
281
|
end
|
|
282
|
+
when :delegate then
|
|
283
|
+
# s(:call, nil, :delegate, ..., s(:hash, s(:lit, :to), s(:lit, :delegator)))
|
|
284
|
+
possible_hash = sexp.last
|
|
285
|
+
if Sexp === possible_hash && possible_hash.sexp_type == :hash
|
|
286
|
+
possible_hash.sexp_body.each_slice(2) do |key, val|
|
|
287
|
+
next unless key == s(:lit, :to)
|
|
288
|
+
next unless Sexp === val
|
|
289
|
+
|
|
290
|
+
called << val.last if val.sexp_type == :lit
|
|
291
|
+
called << val.last.to_sym if val.sexp_type == :str
|
|
292
|
+
end
|
|
293
|
+
end
|
|
265
294
|
when *RAILS_DSL_METHODS, *RAILS_VALIDATION_METHODS then
|
|
266
295
|
if option[:rails]
|
|
267
296
|
# s(:call, nil, :before_save, s(:lit, :save_callback), s(:hash, ...))
|
|
@@ -281,10 +310,16 @@ class Debride < MethodBasedSexpProcessor
|
|
|
281
310
|
when *RAILS_MACRO_METHODS
|
|
282
311
|
# s(:call, nil, :has_one, s(:lit, :has_one_relation), ...)
|
|
283
312
|
_, _, _, (_, name), * = sexp
|
|
284
|
-
|
|
285
|
-
|
|
313
|
+
|
|
314
|
+
# try to detect route scope vs model scope
|
|
315
|
+
if context.include? :module or context.include? :class then
|
|
316
|
+
file, line = sexp.file, sexp.line
|
|
317
|
+
record_method name, file, line
|
|
318
|
+
end
|
|
286
319
|
when /_path$/ then
|
|
287
|
-
method_name = method_name.to_s
|
|
320
|
+
method_name = method_name.to_s.delete_suffix("_path").to_sym if option[:rails]
|
|
321
|
+
when /^deliver_/ then
|
|
322
|
+
method_name = method_name.to_s.delete_prefix("deliver_").to_sym if option[:rails]
|
|
288
323
|
end
|
|
289
324
|
|
|
290
325
|
called << method_name
|
|
@@ -302,6 +337,7 @@ class Debride < MethodBasedSexpProcessor
|
|
|
302
337
|
process val
|
|
303
338
|
|
|
304
339
|
signature = "#{klass_name}::#{name}"
|
|
340
|
+
|
|
305
341
|
known[name] << klass_name
|
|
306
342
|
|
|
307
343
|
file, line = exp.file, exp.line
|
|
@@ -312,12 +348,16 @@ class Debride < MethodBasedSexpProcessor
|
|
|
312
348
|
|
|
313
349
|
def name_to_string exp
|
|
314
350
|
case exp.sexp_type
|
|
351
|
+
when :const then
|
|
352
|
+
exp.last.to_s
|
|
315
353
|
when :colon2 then
|
|
316
|
-
_,
|
|
317
|
-
"#{lhs}::#{rhs}"
|
|
354
|
+
_, lhs, rhs = exp
|
|
355
|
+
"#{name_to_string lhs}::#{rhs}"
|
|
318
356
|
when :colon3 then
|
|
319
357
|
_, rhs = exp
|
|
320
358
|
"::#{rhs}"
|
|
359
|
+
when :self then # wtf?
|
|
360
|
+
"self"
|
|
321
361
|
else
|
|
322
362
|
raise "Not handled: #{exp.inspect}"
|
|
323
363
|
end
|
|
@@ -397,37 +437,99 @@ class Debride < MethodBasedSexpProcessor
|
|
|
397
437
|
by_class.sort_by { |k,v| k }
|
|
398
438
|
end
|
|
399
439
|
|
|
440
|
+
def missing_locations
|
|
441
|
+
focus = option[:focus]
|
|
442
|
+
|
|
443
|
+
missing.map { |klass, meths|
|
|
444
|
+
bad = meths.map { |meth|
|
|
445
|
+
location =
|
|
446
|
+
method_locations["#{klass}##{meth}"] ||
|
|
447
|
+
method_locations["#{klass}::#{meth}"]
|
|
448
|
+
|
|
449
|
+
if focus then
|
|
450
|
+
path = location[/(.+):\d+/, 1]
|
|
451
|
+
|
|
452
|
+
next unless File.fnmatch(focus, path)
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
[meth, location]
|
|
456
|
+
}.compact
|
|
457
|
+
|
|
458
|
+
[klass, bad]
|
|
459
|
+
}
|
|
460
|
+
.to_h
|
|
461
|
+
.reject { |k,v| v.empty? }
|
|
462
|
+
end
|
|
463
|
+
|
|
400
464
|
##
|
|
401
465
|
# Print out a report of suspects.
|
|
402
466
|
|
|
403
|
-
def report
|
|
467
|
+
def report io = $stdout
|
|
404
468
|
focus = option[:focus]
|
|
469
|
+
type = option[:format] || :text
|
|
470
|
+
|
|
471
|
+
send "report_#{type}", io, focus, missing_locations
|
|
472
|
+
end
|
|
405
473
|
|
|
474
|
+
def report_text io, focus, missing
|
|
406
475
|
if focus then
|
|
407
|
-
puts "Focusing on #{focus}"
|
|
408
|
-
puts
|
|
476
|
+
io.puts "Focusing on #{focus}"
|
|
477
|
+
io.puts
|
|
409
478
|
end
|
|
410
479
|
|
|
411
|
-
puts "These methods MIGHT not be called:"
|
|
480
|
+
io.puts "These methods MIGHT not be called:"
|
|
481
|
+
|
|
482
|
+
total = 0
|
|
412
483
|
|
|
413
484
|
missing.each do |klass, meths|
|
|
414
|
-
bad = meths.map { |meth|
|
|
415
|
-
location
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
485
|
+
bad = meths.map { |(meth, location)|
|
|
486
|
+
loc = if location then
|
|
487
|
+
l0, l1 = location.split(/:/).last.scan(/\d+/).flatten.map(&:to_i)
|
|
488
|
+
l1 ||= l0
|
|
489
|
+
l1 - l0 + 1
|
|
490
|
+
else
|
|
491
|
+
1
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
next if option[:minimum] && loc < option[:minimum]
|
|
495
|
+
|
|
496
|
+
total += loc
|
|
419
497
|
|
|
420
|
-
|
|
498
|
+
" %-35s %s (%d)" % [meth, location, loc]
|
|
499
|
+
}.compact
|
|
421
500
|
|
|
422
|
-
" %-35s %s" % [meth, location]
|
|
423
|
-
}
|
|
424
|
-
bad.compact!
|
|
425
501
|
next if bad.empty?
|
|
426
502
|
|
|
427
|
-
puts
|
|
428
|
-
puts klass
|
|
429
|
-
puts bad.join "\n"
|
|
503
|
+
io.puts
|
|
504
|
+
io.puts klass
|
|
505
|
+
io.puts bad.join "\n"
|
|
430
506
|
end
|
|
507
|
+
io.puts
|
|
508
|
+
io.puts "Total suspect LOC: %d" % [total]
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
def report_json io, focus, missing
|
|
512
|
+
require "json"
|
|
513
|
+
|
|
514
|
+
data = {
|
|
515
|
+
:missing => missing
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
data[:focus] = focus if focus
|
|
519
|
+
|
|
520
|
+
JSON.dump data, io
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
def report_yaml io, focus, missing
|
|
524
|
+
require "yaml"
|
|
525
|
+
|
|
526
|
+
data = {
|
|
527
|
+
:missing => missing
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
data[:focus] = focus if focus
|
|
531
|
+
|
|
532
|
+
YAML.dump data, io
|
|
431
533
|
end
|
|
432
534
|
|
|
433
535
|
##
|
data/test/test_debride.rb
CHANGED
|
@@ -8,10 +8,31 @@ class SafeDebride < Debride
|
|
|
8
8
|
end
|
|
9
9
|
|
|
10
10
|
class TestDebride < Minitest::Test
|
|
11
|
+
EXP_LIST = [["Debride",
|
|
12
|
+
[:process_attrasgn,
|
|
13
|
+
:process_call,
|
|
14
|
+
:process_cdecl,
|
|
15
|
+
:process_colon2,
|
|
16
|
+
:process_colon3,
|
|
17
|
+
:process_const,
|
|
18
|
+
:process_defn,
|
|
19
|
+
:process_defs,
|
|
20
|
+
:process_rb,
|
|
21
|
+
:report,
|
|
22
|
+
:report_json,
|
|
23
|
+
:report_text,
|
|
24
|
+
:report_yaml]]]
|
|
25
|
+
|
|
26
|
+
formatted_vals = EXP_LIST.map { |k,vs|
|
|
27
|
+
[k, vs.map { |v| [v, "lib/debride.rb:###"] } ]
|
|
28
|
+
}.to_h
|
|
29
|
+
|
|
30
|
+
EXP_FORMATTED = { :missing => formatted_vals }
|
|
31
|
+
|
|
11
32
|
def assert_option arg, exp_arg, exp_opt
|
|
12
33
|
opt = SafeDebride.parse_options arg
|
|
13
34
|
|
|
14
|
-
exp_opt = {:whitelist => []}.merge exp_opt
|
|
35
|
+
exp_opt = {:whitelist => [], :format => :text}.merge exp_opt
|
|
15
36
|
assert_equal exp_opt, opt
|
|
16
37
|
assert_equal exp_arg, arg
|
|
17
38
|
end
|
|
@@ -27,20 +48,13 @@ class TestDebride < Minitest::Test
|
|
|
27
48
|
end
|
|
28
49
|
|
|
29
50
|
def test_sanity
|
|
30
|
-
skip "This is slow" unless ENV["SLOW"]
|
|
31
|
-
|
|
32
51
|
debride = nil
|
|
33
52
|
|
|
34
53
|
assert_silent do
|
|
35
54
|
debride = Debride.run %w[lib]
|
|
36
55
|
end
|
|
37
56
|
|
|
38
|
-
|
|
39
|
-
[:process_attrasgn, :process_call, :process_cdecl, :process_colon2,
|
|
40
|
-
:process_colon3, :process_const, :process_defn, :process_defs,
|
|
41
|
-
:process_rb, :report]]]
|
|
42
|
-
|
|
43
|
-
assert_equal exp, debride.missing
|
|
57
|
+
assert_equal EXP_LIST, debride.missing
|
|
44
58
|
end
|
|
45
59
|
|
|
46
60
|
def test_parse_options
|
|
@@ -85,16 +99,63 @@ class TestDebride < Minitest::Test
|
|
|
85
99
|
end
|
|
86
100
|
|
|
87
101
|
def test_exclude_files
|
|
88
|
-
|
|
102
|
+
debride = Debride.run %w[--exclude test/ lib test]
|
|
89
103
|
|
|
90
|
-
|
|
104
|
+
assert_equal EXP_LIST, debride.missing
|
|
105
|
+
end
|
|
91
106
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
:process_colon3, :process_const, :process_defn, :process_defs,
|
|
95
|
-
:process_rb, :report]]]
|
|
107
|
+
def test_exclude_files__multiple
|
|
108
|
+
debride = Debride.run %w[--exclude test,lib lib test]
|
|
96
109
|
|
|
97
|
-
|
|
110
|
+
assert_empty debride.missing
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def test_exclude_files__dir_without_slash
|
|
114
|
+
debride = Debride.run %w[--exclude test lib test]
|
|
115
|
+
|
|
116
|
+
assert_equal EXP_LIST, debride.missing
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def test_focus
|
|
120
|
+
debride = Debride.run %w[--focus lib/debride.rb lib test]
|
|
121
|
+
io = StringIO.new
|
|
122
|
+
|
|
123
|
+
debride.report(io)
|
|
124
|
+
|
|
125
|
+
assert_includes io.string, "Focusing on lib/debride.rb"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def test_format__plain
|
|
129
|
+
debride = Debride.run %w[lib]
|
|
130
|
+
io = StringIO.new
|
|
131
|
+
|
|
132
|
+
debride.report(io)
|
|
133
|
+
|
|
134
|
+
assert_match %r%process_attrasgn\s+lib/debride.rb:\d+-\d+%, io.string
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def test_format__json
|
|
138
|
+
debride = Debride.run %w[lib --json]
|
|
139
|
+
io = StringIO.new
|
|
140
|
+
|
|
141
|
+
debride.report(io)
|
|
142
|
+
|
|
143
|
+
exp = JSON.load JSON.dump EXP_FORMATTED # force stringify
|
|
144
|
+
data = JSON.load io.string.gsub(/\d+-\d+/, "###")
|
|
145
|
+
|
|
146
|
+
assert_equal exp, data
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_format__yaml
|
|
150
|
+
debride = Debride.run %w[lib --yaml]
|
|
151
|
+
io = StringIO.new
|
|
152
|
+
|
|
153
|
+
debride.report(io)
|
|
154
|
+
|
|
155
|
+
exp = EXP_FORMATTED
|
|
156
|
+
data = YAML.load io.string.gsub(/\d+-\d+/, "###")
|
|
157
|
+
|
|
158
|
+
assert_equal exp, data
|
|
98
159
|
end
|
|
99
160
|
|
|
100
161
|
def test_whitelist
|
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: debride
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.10.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ryan Davis
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain:
|
|
11
11
|
- |
|
|
12
12
|
-----BEGIN CERTIFICATE-----
|
|
13
|
-
|
|
13
|
+
MIIDPjCCAiagAwIBAgIBBjANBgkqhkiG9w0BAQsFADBFMRMwEQYDVQQDDApyeWFu
|
|
14
14
|
ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
|
|
15
|
-
|
|
15
|
+
GRYDY29tMB4XDTIxMTIyMzIzMTkwNFoXDTIyMTIyMzIzMTkwNFowRTETMBEGA1UE
|
|
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
|
+
AQCKB5jfsuSnKb+t/Wrh3UpdkmX7TrEsjVmERC0pPqzQ5GQJgmEXDD7oMgaKXaAq
|
|
26
|
+
x2m+KSZDrqk7c8uho5OX6YMqg4KdxehfSLqqTZGoeV78qwf/jpPQZKTf+W9gUSJh
|
|
27
|
+
zsWpo4K50MP+QtdSbKXZwjAafpQ8hK0MnnZ/aeCsW9ov5vdXpYbf3dpg6ADXRGE7
|
|
28
|
+
lQY2y1tJ5/chqu6h7dQmnm2ABUqx9O+JcN9hbCYoA5i/EeubUEtFIh2w3SpO6YfB
|
|
29
|
+
JFmxn4h9YO/pVdB962BdBNNDia0kgIjI3ENnkLq0dKpYU3+F3KhEuTksLO0L6X/V
|
|
30
|
+
YsuyUzsMz6GQA4khyaMgKNSD
|
|
31
31
|
-----END CERTIFICATE-----
|
|
32
|
-
date:
|
|
32
|
+
date: 2022-12-03 00:00:00.000000000 Z
|
|
33
33
|
dependencies:
|
|
34
34
|
- !ruby/object:Gem::Dependency
|
|
35
35
|
name: sexp_processor
|
|
@@ -93,20 +93,34 @@ dependencies:
|
|
|
93
93
|
- - "<"
|
|
94
94
|
- !ruby/object:Gem::Version
|
|
95
95
|
version: '7'
|
|
96
|
+
- !ruby/object:Gem::Dependency
|
|
97
|
+
name: simplecov
|
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - "~>"
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '0.21'
|
|
103
|
+
type: :development
|
|
104
|
+
prerelease: false
|
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - "~>"
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '0.21'
|
|
96
110
|
- !ruby/object:Gem::Dependency
|
|
97
111
|
name: hoe
|
|
98
112
|
requirement: !ruby/object:Gem::Requirement
|
|
99
113
|
requirements:
|
|
100
114
|
- - "~>"
|
|
101
115
|
- !ruby/object:Gem::Version
|
|
102
|
-
version: '3.
|
|
116
|
+
version: '3.25'
|
|
103
117
|
type: :development
|
|
104
118
|
prerelease: false
|
|
105
119
|
version_requirements: !ruby/object:Gem::Requirement
|
|
106
120
|
requirements:
|
|
107
121
|
- - "~>"
|
|
108
122
|
- !ruby/object:Gem::Version
|
|
109
|
-
version: '3.
|
|
123
|
+
version: '3.25'
|
|
110
124
|
description: Analyze code for potentially uncalled / dead methods, now with auto-removal.
|
|
111
125
|
email:
|
|
112
126
|
- ryand-ruby@zenspider.com
|
|
@@ -133,8 +147,9 @@ files:
|
|
|
133
147
|
homepage: https://github.com/seattlerb/debride
|
|
134
148
|
licenses:
|
|
135
149
|
- MIT
|
|
136
|
-
metadata:
|
|
137
|
-
|
|
150
|
+
metadata:
|
|
151
|
+
homepage_uri: https://github.com/seattlerb/debride
|
|
152
|
+
post_install_message:
|
|
138
153
|
rdoc_options:
|
|
139
154
|
- "--main"
|
|
140
155
|
- README.rdoc
|
|
@@ -151,8 +166,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
151
166
|
- !ruby/object:Gem::Version
|
|
152
167
|
version: '0'
|
|
153
168
|
requirements: []
|
|
154
|
-
rubygems_version: 3.
|
|
155
|
-
signing_key:
|
|
169
|
+
rubygems_version: 3.3.12
|
|
170
|
+
signing_key:
|
|
156
171
|
specification_version: 4
|
|
157
172
|
summary: Analyze code for potentially uncalled / dead methods, now with auto-removal.
|
|
158
173
|
test_files: []
|
metadata.gz.sig
CHANGED
|
Binary file
|