leftovers 0.4.3 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/docs/Configuration.md +46 -11
  4. data/lib/.DS_Store +0 -0
  5. data/lib/config/actioncable.yml +4 -0
  6. data/lib/config/actionmailer.yml +22 -0
  7. data/lib/config/actionpack.yml +190 -0
  8. data/lib/config/actionview.yml +64 -0
  9. data/lib/config/activejob.yml +29 -0
  10. data/lib/config/activemodel.yml +74 -0
  11. data/lib/config/activerecord.yml +179 -0
  12. data/lib/config/activesupport.yml +99 -0
  13. data/lib/config/haml.yml +2 -0
  14. data/lib/config/rails.yml +11 -450
  15. data/lib/config/ruby.yml +6 -0
  16. data/lib/leftovers/ast/node.rb +14 -0
  17. data/lib/leftovers/config.rb +8 -0
  18. data/lib/leftovers/config_validator/schema_hash.rb +62 -29
  19. data/lib/leftovers/erb.rb +2 -2
  20. data/lib/leftovers/file.rb +2 -3
  21. data/lib/leftovers/matcher_builders/node.rb +2 -0
  22. data/lib/leftovers/matcher_builders/node_has_argument.rb +11 -7
  23. data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +14 -10
  24. data/lib/leftovers/matcher_builders/node_has_positional_argument.rb +17 -13
  25. data/lib/leftovers/matcher_builders/node_has_receiver.rb +15 -0
  26. data/lib/leftovers/matcher_builders/node_type.rb +7 -6
  27. data/lib/leftovers/matcher_builders/node_value.rb +50 -0
  28. data/lib/leftovers/matcher_builders.rb +3 -2
  29. data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +4 -1
  30. data/lib/leftovers/matchers/node_has_positional_argument.rb +0 -4
  31. data/lib/leftovers/matchers/node_has_receiver.rb +20 -0
  32. data/lib/leftovers/matchers/predicate.rb +19 -0
  33. data/lib/leftovers/matchers.rb +2 -0
  34. data/lib/leftovers/merged_config.rb +19 -1
  35. data/lib/leftovers/todo_reporter.rb +9 -6
  36. data/lib/leftovers/value_processors/camelize.rb +1 -1
  37. data/lib/leftovers/value_processors/deconstantize.rb +1 -1
  38. data/lib/leftovers/value_processors/demodulize.rb +1 -1
  39. data/lib/leftovers/value_processors/parameterize.rb +1 -1
  40. data/lib/leftovers/value_processors/pluralize.rb +1 -1
  41. data/lib/leftovers/value_processors/singularize.rb +1 -1
  42. data/lib/leftovers/value_processors/titleize.rb +1 -1
  43. data/lib/leftovers/value_processors/underscore.rb +1 -1
  44. data/lib/leftovers/version.rb +1 -1
  45. data/lib/leftovers.rb +95 -92
  46. metadata +16 -4
  47. data/lib/leftovers/matcher_builders/argument_node_value.rb +0 -21
@@ -30,12 +30,9 @@ module Leftovers
30
30
  def report_instructions
31
31
  puts <<~MESSAGE
32
32
  generated #{path.basename}.
33
- running leftovers again will read this file and
34
- not alert you to any unused items mentioned in it.
33
+ running leftovers again will read this file and not alert you to any unused items mentioned in it.
35
34
 
36
- commit this file so you/your team can gradually
37
- address these items while still having leftovers
38
- alert you to any newly unused items.
35
+ commit this file so you/your team can gradually address these items while still having leftovers alert you to any newly unused items.
39
36
  MESSAGE
40
37
  end
41
38
 
@@ -108,12 +105,18 @@ module Leftovers
108
105
  def generate_list(title, list)
109
106
  <<~YML
110
107
  # #{title}
111
- #{list.map { |d| print_definition(d) }.join("\n")}
108
+ #{print_definition_list(list)}
112
109
 
113
110
  YML
114
111
  end
115
112
 
113
+ def print_definition_list(definition_list)
114
+ definition_list.map { |definition| print_definition(definition) }.join("\n")
115
+ end
116
+
116
117
  def print_definition(definition)
118
+ return print_definition_list(definition.definitions) if definition.is_a?(DefinitionSet)
119
+
117
120
  " - #{definition.to_s.inspect} # #{definition.location_s} #{definition.source_line.strip}"
118
121
  end
119
122
 
@@ -16,7 +16,7 @@ module Leftovers
16
16
  rescue NoMethodError
17
17
  Leftovers.error <<~MESSAGE
18
18
  Tried using the String#camelize method, but the activesupport gem was not available and/or not required
19
- `gem install activesupport`, and/or add `requires: 'active_support/core_ext/string'` to your .leftovers.yml
19
+ `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
20
  MESSAGE
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Leftovers
16
16
  rescue NoMethodError
17
17
  Leftovers.error <<~MESSAGE
18
18
  Tried using the String#deconstantize method, but the activesupport gem was not available and/or not required
19
- `gem install activesupport`, and/or add `requires: 'active_support/core_ext/string'` to your .leftovers.yml
19
+ `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
20
  MESSAGE
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Leftovers
16
16
  rescue NoMethodError
17
17
  Leftovers.error <<~MESSAGE
18
18
  Tried using the String#demodulize method, but the activesupport gem was not available and/or not required
19
- `gem install activesupport`, and/or add `requires: 'active_support/core_ext/string'` to your .leftovers.yml
19
+ `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
20
  MESSAGE
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Leftovers
16
16
  rescue NoMethodError
17
17
  Leftovers.error <<~MESSAGE
18
18
  Tried using the String#parameterize method, but the activesupport gem was not available and/or not required
19
- `gem install activesupport`, and/or add `requires: 'active_support/core_ext/string'` to your .leftovers.yml
19
+ `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
20
  MESSAGE
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Leftovers
16
16
  rescue NoMethodError
17
17
  Leftovers.error <<~MESSAGE
18
18
  Tried using the String#pluralize method, but the activesupport gem was not available and/or not required
19
- `gem install activesupport`, and/or add `requires: 'active_support/core_ext/string'` to your .leftovers.yml
19
+ `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
20
  MESSAGE
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Leftovers
16
16
  rescue NoMethodError
17
17
  Leftovers.error <<~MESSAGE
18
18
  Tried using the String#singularize method, but the activesupport gem was not available and/or not required
19
- `gem install activesupport`, and/or add `requires: 'active_support/core_ext/string'` to your .leftovers.yml
19
+ `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
20
  MESSAGE
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Leftovers
16
16
  rescue NoMethodError
17
17
  Leftovers.error <<~MESSAGE
18
18
  Tried using the String#titleize method, but the activesupport gem was not available and/or not required
19
- `gem install activesupport`, and/or add `requires: 'active_support/core_ext/string'` to your .leftovers.yml
19
+ `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
20
  MESSAGE
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ module Leftovers
16
16
  rescue NoMethodError
17
17
  Leftovers.error <<~MESSAGE
18
18
  Tried using the String#underscore method, but the activesupport gem was not available and/or not required
19
- `gem install activesupport`, and/or add `requires: 'active_support/core_ext/string'` to your .leftovers.yml
19
+ `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
20
  MESSAGE
21
21
  end
22
22
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- VERSION = '0.4.3'
4
+ VERSION = '0.5.3'
5
5
  end
data/lib/leftovers.rb CHANGED
@@ -3,8 +3,6 @@
3
3
  module Leftovers # rubocop:disable Metrics/ModuleLength
4
4
  class Error < ::StandardError; end
5
5
 
6
- module_function
7
-
8
6
  autoload(:AST, "#{__dir__}/leftovers/ast")
9
7
  autoload(:Backports, "#{__dir__}/leftovers/backports")
10
8
  autoload(:CLI, "#{__dir__}/leftovers/cli")
@@ -32,124 +30,129 @@ module Leftovers # rubocop:disable Metrics/ModuleLength
32
30
  autoload(:VERSION, "#{__dir__}/leftovers/version")
33
31
 
34
32
  class << self
35
- attr_accessor :parallel, :progress, :reporter
33
+ attr_accessor :parallel, :progress
34
+ attr_writer :reporter
36
35
  alias_method :parallel?, :parallel
37
36
  alias_method :progress?, :progress
38
- end
39
37
 
40
- def stdout
41
- @stdout ||= $stdout
42
- end
38
+ def stdout
39
+ @stdout ||= $stdout
40
+ end
43
41
 
44
- def stderr
45
- @stderr ||= $stderr
46
- end
42
+ def stderr
43
+ @stderr ||= $stderr
44
+ end
47
45
 
48
- def config
49
- @config ||= Leftovers::MergedConfig.new(load_defaults: true)
50
- end
46
+ def config
47
+ @config ||= Leftovers::MergedConfig.new(load_defaults: true)
48
+ end
51
49
 
52
- def collector
53
- @collector ||= Leftovers::Collector.new
54
- end
50
+ def collector
51
+ @collector ||= Leftovers::Collector.new
52
+ end
55
53
 
56
- def reporter
57
- @reporter ||= Leftovers::Reporter.new
58
- end
54
+ def reporter
55
+ @reporter ||= Leftovers::Reporter.new
56
+ end
59
57
 
60
- def leftovers
61
- @leftovers ||= begin
62
- collector.collect
63
- collector.definitions.reject(&:in_collection?)
58
+ def leftovers
59
+ @leftovers ||= begin
60
+ collector.collect
61
+ collector.definitions.reject(&:in_collection?)
62
+ end
64
63
  end
65
- end
66
64
 
67
- def run(stdout: StringIO.new, stderr: StringIO.new) # rubocop:disable Metrics/MethodLength
68
- @stdout = stdout
69
- @stderr = stderr
70
- return reporter.report_success if leftovers.empty?
71
-
72
- only_test = []
73
- none = []
74
- leftovers.sort_by(&:location_s).each do |definition|
75
- if !definition.test? && definition.in_test_collection?
76
- only_test << definition
77
- else
78
- none << definition
65
+ def run(stdout: StringIO.new, stderr: StringIO.new) # rubocop:disable Metrics/MethodLength
66
+ @stdout = stdout
67
+ @stderr = stderr
68
+ return reporter.report_success if leftovers.empty?
69
+
70
+ only_test = []
71
+ none = []
72
+ leftovers.sort_by(&:location_s).each do |definition|
73
+ if !definition.test? && definition.in_test_collection?
74
+ only_test << definition
75
+ else
76
+ none << definition
77
+ end
79
78
  end
79
+
80
+ reporter.report(only_test: only_test, none: none)
80
81
  end
81
82
 
82
- reporter.report(only_test: only_test, none: none)
83
- end
83
+ def reset # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
84
+ remove_instance_variable(:@config) if defined?(@config)
85
+ remove_instance_variable(:@collector) if defined?(@collector)
86
+ remove_instance_variable(:@reporter) if defined?(@reporter)
87
+ remove_instance_variable(:@leftovers) if defined?(@leftovers)
88
+ remove_instance_variable(:@try_require_cache) if defined?(@try_require_cache)
89
+ remove_instance_variable(:@stdout) if defined?(@stdout)
90
+ remove_instance_variable(:@stderr) if defined?(@stderr)
91
+ remove_instance_variable(:@parallel) if defined?(@parallel)
92
+ remove_instance_variable(:@pwd) if defined?(@pwd)
93
+ end
84
94
 
85
- def reset # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
86
- remove_instance_variable(:@config) if defined?(@config)
87
- remove_instance_variable(:@collector) if defined?(@collector)
88
- remove_instance_variable(:@reporter) if defined?(@reporter)
89
- remove_instance_variable(:@leftovers) if defined?(@leftovers)
90
- remove_instance_variable(:@try_require) if defined?(@try_require)
91
- remove_instance_variable(:@stdout) if defined?(@stdout)
92
- remove_instance_variable(:@stderr) if defined?(@stderr)
93
- remove_instance_variable(:@parallel) if defined?(@parallel)
94
- remove_instance_variable(:@pwd) if defined?(@pwd)
95
- end
95
+ def resolution_instructions_link
96
+ "https://github.com/robotdana/leftovers/tree/v#{Leftovers::VERSION}/README.md#how_to_resolve"
97
+ end
96
98
 
97
- def resolution_instructions_link
98
- "https://github.com/robotdana/leftovers/tree/v#{Leftovers::VERSION}/README.md#how_to_resolve"
99
- end
99
+ def warn(message)
100
+ stderr.puts("\e[2K#{message}")
101
+ end
100
102
 
101
- def warn(message)
102
- stderr.puts("\e[2K#{message}")
103
- end
103
+ def error(message)
104
+ warn(message)
105
+ exit 1
106
+ end
104
107
 
105
- def error(message)
106
- warn(message)
107
- exit 1
108
- end
108
+ def puts(message)
109
+ stdout.puts("\e[2K#{message}")
110
+ end
109
111
 
110
- def puts(message)
111
- stdout.puts("\e[2K#{message}")
112
- end
112
+ def print(message)
113
+ stdout.print(message)
114
+ end
113
115
 
114
- def print(message)
115
- stdout.print(message)
116
- end
116
+ def newline
117
+ stdout.puts('')
118
+ end
117
119
 
118
- def newline
119
- stdout.puts('')
120
- end
120
+ def pwd
121
+ @pwd ||= Pathname.new(Dir.pwd + '/')
122
+ end
121
123
 
122
- def pwd
123
- @pwd ||= Pathname.new(Dir.pwd + '/')
124
- end
124
+ def exit(status = 0)
125
+ throw :leftovers_exit, status
126
+ end
125
127
 
126
- def exit(status = 0)
127
- throw :leftovers_exit, status
128
- end
128
+ def try_require(requirable, message: nil)
129
+ warn message if !try_require_cache(requirable) && message
130
+ try_require_cache(requirable)
131
+ end
129
132
 
130
- def try_require(requirable, message: nil) # rubocop:disable Metrics/MethodLength
131
- @try_require ||= {}
133
+ def each_or_self(value, &block)
134
+ return enum_for(__method__, value) unless block
132
135
 
133
- @try_require[requirable] = begin
134
- if @try_require.key?(requirable)
135
- @try_require[requirable]
136
- else
137
- require requirable
138
- true
136
+ case value
137
+ when nil then nil
138
+ when Array then value.each(&block)
139
+ else yield(value)
139
140
  end
140
- rescue LoadError
141
- false
142
141
  end
143
142
 
144
- warn message if !@try_require[requirable] && message
145
- @try_require[requirable]
146
- end
143
+ private
147
144
 
148
- def each_or_self(value, &block)
149
- case value
150
- when nil then nil
151
- when Array then value.each(&block)
152
- else yield(value)
145
+ def try_require_cache(requirable)
146
+ @try_require_cache ||= {}
147
+
148
+ @try_require_cache.fetch(requirable) do
149
+ begin
150
+ require requirable
151
+ @try_require_cache[requirable] = true
152
+ rescue LoadError
153
+ @try_require_cache[requirable] = false
154
+ end
155
+ end
153
156
  end
154
157
  end
155
158
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leftovers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dana Sherson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-25 00:00:00.000000000 Z
11
+ date: 2022-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -291,6 +291,15 @@ files:
291
291
  - docs/Configuration.md
292
292
  - exe/leftovers
293
293
  - leftovers.gemspec
294
+ - lib/.DS_Store
295
+ - lib/config/actioncable.yml
296
+ - lib/config/actionmailer.yml
297
+ - lib/config/actionpack.yml
298
+ - lib/config/actionview.yml
299
+ - lib/config/activejob.yml
300
+ - lib/config/activemodel.yml
301
+ - lib/config/activerecord.yml
302
+ - lib/config/activesupport.yml
294
303
  - lib/config/attr_encrypted.yml
295
304
  - lib/config/audited.yml
296
305
  - lib/config/builder.yml
@@ -343,17 +352,18 @@ files:
343
352
  - lib/leftovers/matcher_builders.rb
344
353
  - lib/leftovers/matcher_builders/and.rb
345
354
  - lib/leftovers/matcher_builders/and_not.rb
346
- - lib/leftovers/matcher_builders/argument_node_value.rb
347
355
  - lib/leftovers/matcher_builders/name.rb
348
356
  - lib/leftovers/matcher_builders/node.rb
349
357
  - lib/leftovers/matcher_builders/node_has_argument.rb
350
358
  - lib/leftovers/matcher_builders/node_has_keyword_argument.rb
351
359
  - lib/leftovers/matcher_builders/node_has_positional_argument.rb
360
+ - lib/leftovers/matcher_builders/node_has_receiver.rb
352
361
  - lib/leftovers/matcher_builders/node_name.rb
353
362
  - lib/leftovers/matcher_builders/node_pair_name.rb
354
363
  - lib/leftovers/matcher_builders/node_pair_value.rb
355
364
  - lib/leftovers/matcher_builders/node_path.rb
356
365
  - lib/leftovers/matcher_builders/node_type.rb
366
+ - lib/leftovers/matcher_builders/node_value.rb
357
367
  - lib/leftovers/matcher_builders/or.rb
358
368
  - lib/leftovers/matcher_builders/path.rb
359
369
  - lib/leftovers/matcher_builders/string.rb
@@ -367,6 +377,7 @@ files:
367
377
  - lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb
368
378
  - lib/leftovers/matchers/node_has_positional_argument.rb
369
379
  - lib/leftovers/matchers/node_has_positional_argument_with_value.rb
380
+ - lib/leftovers/matchers/node_has_receiver.rb
370
381
  - lib/leftovers/matchers/node_name.rb
371
382
  - lib/leftovers/matchers/node_pair_value.rb
372
383
  - lib/leftovers/matchers/node_path.rb
@@ -374,6 +385,7 @@ files:
374
385
  - lib/leftovers/matchers/node_type.rb
375
386
  - lib/leftovers/matchers/not.rb
376
387
  - lib/leftovers/matchers/or.rb
388
+ - lib/leftovers/matchers/predicate.rb
377
389
  - lib/leftovers/merged_config.rb
378
390
  - lib/leftovers/parser.rb
379
391
  - lib/leftovers/processor_builders.rb
@@ -454,7 +466,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
454
466
  - !ruby/object:Gem::Version
455
467
  version: '0'
456
468
  requirements: []
457
- rubygems_version: 3.1.6
469
+ rubygems_version: 3.2.15
458
470
  signing_key:
459
471
  specification_version: 4
460
472
  summary: Find unused methods and classes/modules
@@ -1,21 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Leftovers
4
- module MatcherBuilders
5
- module ArgumentNodeValue
6
- def self.build(pattern)
7
- ::Leftovers::MatcherBuilders::Or.each_or_self(pattern) do |pat|
8
- case pat
9
- when ::Integer, true, false, nil
10
- ::Leftovers::Matchers::NodeScalarValue.new(pat)
11
- when ::String, ::Hash
12
- ::Leftovers::MatcherBuilders::NodeName.build(pat)
13
- # :nocov:
14
- else raise
15
- # :nocov:
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end