leftovers 0.4.1 → 0.5.1

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.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +29 -0
  3. data/README.md +30 -0
  4. data/docs/Configuration.md +46 -11
  5. data/leftovers.gemspec +1 -0
  6. data/lib/config/actioncable.yml +4 -0
  7. data/lib/config/actionmailer.yml +22 -0
  8. data/lib/config/actionpack.yml +190 -0
  9. data/lib/config/actionview.yml +64 -0
  10. data/lib/config/activejob.yml +29 -0
  11. data/lib/config/activemodel.yml +74 -0
  12. data/lib/config/activerecord.yml +179 -0
  13. data/lib/config/activesupport.yml +98 -0
  14. data/lib/config/haml.yml +2 -0
  15. data/lib/config/rails.yml +11 -450
  16. data/lib/config/ruby.yml +6 -0
  17. data/lib/leftovers/ast/node.rb +14 -0
  18. data/lib/leftovers/cli.rb +13 -4
  19. data/lib/leftovers/collector.rb +2 -1
  20. data/lib/leftovers/config.rb +8 -0
  21. data/lib/leftovers/config_validator/schema_hash.rb +50 -5
  22. data/lib/leftovers/definition.rb +4 -4
  23. data/lib/leftovers/erb.rb +2 -2
  24. data/lib/leftovers/file.rb +2 -3
  25. data/lib/leftovers/matcher_builders/node.rb +2 -0
  26. data/lib/leftovers/matcher_builders/node_has_argument.rb +11 -7
  27. data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +14 -10
  28. data/lib/leftovers/matcher_builders/node_has_positional_argument.rb +17 -13
  29. data/lib/leftovers/matcher_builders/node_has_receiver.rb +15 -0
  30. data/lib/leftovers/matcher_builders/node_type.rb +7 -6
  31. data/lib/leftovers/matcher_builders/node_value.rb +50 -0
  32. data/lib/leftovers/matcher_builders.rb +3 -2
  33. data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +4 -1
  34. data/lib/leftovers/matchers/node_has_positional_argument.rb +0 -4
  35. data/lib/leftovers/matchers/node_has_receiver.rb +20 -0
  36. data/lib/leftovers/matchers/predicate.rb +19 -0
  37. data/lib/leftovers/matchers.rb +2 -0
  38. data/lib/leftovers/merged_config.rb +24 -1
  39. data/lib/leftovers/reporter.rb +56 -4
  40. data/lib/leftovers/todo_reporter.rb +127 -0
  41. data/lib/leftovers/version.rb +1 -1
  42. data/lib/leftovers.rb +93 -96
  43. metadata +31 -4
  44. data/lib/leftovers/matcher_builders/argument_node_value.rb +0 -21
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")
@@ -26,136 +24,135 @@ module Leftovers # rubocop:disable Metrics/ModuleLength
26
24
  autoload(:ProcessorBuilders, "#{__dir__}/leftovers/processor_builders")
27
25
  autoload(:RakeTask, "#{__dir__}/leftovers/rake_task")
28
26
  autoload(:Reporter, "#{__dir__}/leftovers/reporter")
27
+ autoload(:TodoReporter, "#{__dir__}/leftovers/todo_reporter")
29
28
  autoload(:DynamicProcessors, "#{__dir__}/leftovers/dynamic_processors")
30
29
  autoload(:ValueProcessors, "#{__dir__}/leftovers/value_processors")
31
30
  autoload(:VERSION, "#{__dir__}/leftovers/version")
32
31
 
33
32
  class << self
34
33
  attr_accessor :parallel, :progress
34
+ attr_writer :reporter
35
35
  alias_method :parallel?, :parallel
36
-
37
36
  alias_method :progress?, :progress
38
- end
39
-
40
- def stdout
41
- @stdout ||= $stdout
42
- end
43
37
 
44
- def stderr
45
- @stderr ||= $stderr
46
- end
38
+ def stdout
39
+ @stdout ||= $stdout
40
+ end
47
41
 
48
- def config
49
- @config ||= Leftovers::MergedConfig.new(load_defaults: true)
50
- end
42
+ def stderr
43
+ @stderr ||= $stderr
44
+ end
51
45
 
52
- def collector
53
- @collector ||= Leftovers::Collector.new
54
- end
46
+ def config
47
+ @config ||= Leftovers::MergedConfig.new(load_defaults: true)
48
+ end
55
49
 
56
- def reporter
57
- @reporter ||= Leftovers::Reporter.new
58
- end
50
+ def collector
51
+ @collector ||= Leftovers::Collector.new
52
+ end
59
53
 
60
- def leftovers
61
- @leftovers ||= begin
62
- collector.collect
63
- collector.definitions.reject(&:in_collection?)
54
+ def reporter
55
+ @reporter ||= Leftovers::Reporter.new
64
56
  end
65
- end
66
57
 
67
- def run(stdout: StringIO.new, stderr: StringIO.new) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
68
- @stdout = stdout
69
- @stderr = stderr
70
- return 0 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
58
+ def leftovers
59
+ @leftovers ||= begin
60
+ collector.collect
61
+ collector.definitions.reject(&:in_collection?)
79
62
  end
80
63
  end
81
64
 
82
- unless only_test.empty?
83
- puts "\e[31mOnly directly called in tests:\e[0m"
84
- only_test.each { |definition| reporter.call(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
78
+ end
79
+
80
+ reporter.report(only_test: only_test, none: none)
85
81
  end
86
82
 
87
- unless none.empty?
88
- puts "\e[31mNot directly called at all:\e[0m"
89
- none.each { |definition| reporter.call(definition) }
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)
90
93
  end
91
94
 
92
- 1
93
- end
95
+ def resolution_instructions_link
96
+ "https://github.com/robotdana/leftovers/tree/v#{Leftovers::VERSION}/README.md#how_to_resolve"
97
+ end
94
98
 
95
- def reset # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
96
- remove_instance_variable(:@config) if defined?(@config)
97
- remove_instance_variable(:@collector) if defined?(@collector)
98
- remove_instance_variable(:@reporter) if defined?(@reporter)
99
- remove_instance_variable(:@leftovers) if defined?(@leftovers)
100
- remove_instance_variable(:@try_require) if defined?(@try_require)
101
- remove_instance_variable(:@stdout) if defined?(@stdout)
102
- remove_instance_variable(:@stderr) if defined?(@stderr)
103
- remove_instance_variable(:@parallel) if defined?(@parallel)
104
- remove_instance_variable(:@pwd) if defined?(@pwd)
105
- end
99
+ def warn(message)
100
+ stderr.puts("\e[2K#{message}")
101
+ end
106
102
 
107
- def warn(message)
108
- stderr.puts("\e[2K#{message}")
109
- end
103
+ def error(message)
104
+ warn(message)
105
+ exit 1
106
+ end
110
107
 
111
- def error(message)
112
- warn(message)
113
- exit 1
114
- end
108
+ def puts(message)
109
+ stdout.puts("\e[2K#{message}")
110
+ end
115
111
 
116
- def puts(message)
117
- stdout.puts("\e[2K#{message}")
118
- end
112
+ def print(message)
113
+ stdout.print(message)
114
+ end
119
115
 
120
- def print(message)
121
- stdout.print(message)
122
- end
116
+ def newline
117
+ stdout.puts('')
118
+ end
123
119
 
124
- def newline
125
- stdout.puts('')
126
- end
120
+ def pwd
121
+ @pwd ||= Pathname.new(Dir.pwd + '/')
122
+ end
127
123
 
128
- def pwd
129
- @pwd ||= Pathname.new(Dir.pwd + '/')
130
- end
124
+ def exit(status = 0)
125
+ throw :leftovers_exit, status
126
+ end
131
127
 
132
- def exit(status = 0)
133
- throw :leftovers_exit, status
134
- end
128
+ def try_require(requirable, message: nil)
129
+ warn message if !try_require_cache(requirable) && message
130
+ try_require_cache(requirable)
131
+ end
135
132
 
136
- def try_require(requirable, message: nil) # rubocop:disable Metrics/MethodLength
137
- @try_require ||= {}
133
+ def each_or_self(value, &block)
134
+ return enum_for(__method__, value) unless block
138
135
 
139
- @try_require[requirable] = begin
140
- if @try_require.key?(requirable)
141
- @try_require[requirable]
142
- else
143
- require requirable
144
- true
136
+ case value
137
+ when nil then nil
138
+ when Array then value.each(&block)
139
+ else yield(value)
145
140
  end
146
- rescue LoadError
147
- false
148
141
  end
149
142
 
150
- warn message if !@try_require[requirable] && message
151
- @try_require[requirable]
152
- end
143
+ private
153
144
 
154
- def each_or_self(value, &block)
155
- case value
156
- when nil then nil
157
- when Array then value.each(&block)
158
- 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
159
156
  end
160
157
  end
161
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.1
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dana Sherson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-04 00:00:00.000000000 Z
11
+ date: 2021-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -178,6 +178,20 @@ dependencies:
178
178
  - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: timecop
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: tty_string
183
197
  requirement: !ruby/object:Gem::Requirement
@@ -277,6 +291,14 @@ files:
277
291
  - docs/Configuration.md
278
292
  - exe/leftovers
279
293
  - leftovers.gemspec
294
+ - lib/config/actioncable.yml
295
+ - lib/config/actionmailer.yml
296
+ - lib/config/actionpack.yml
297
+ - lib/config/actionview.yml
298
+ - lib/config/activejob.yml
299
+ - lib/config/activemodel.yml
300
+ - lib/config/activerecord.yml
301
+ - lib/config/activesupport.yml
280
302
  - lib/config/attr_encrypted.yml
281
303
  - lib/config/audited.yml
282
304
  - lib/config/builder.yml
@@ -329,17 +351,18 @@ files:
329
351
  - lib/leftovers/matcher_builders.rb
330
352
  - lib/leftovers/matcher_builders/and.rb
331
353
  - lib/leftovers/matcher_builders/and_not.rb
332
- - lib/leftovers/matcher_builders/argument_node_value.rb
333
354
  - lib/leftovers/matcher_builders/name.rb
334
355
  - lib/leftovers/matcher_builders/node.rb
335
356
  - lib/leftovers/matcher_builders/node_has_argument.rb
336
357
  - lib/leftovers/matcher_builders/node_has_keyword_argument.rb
337
358
  - lib/leftovers/matcher_builders/node_has_positional_argument.rb
359
+ - lib/leftovers/matcher_builders/node_has_receiver.rb
338
360
  - lib/leftovers/matcher_builders/node_name.rb
339
361
  - lib/leftovers/matcher_builders/node_pair_name.rb
340
362
  - lib/leftovers/matcher_builders/node_pair_value.rb
341
363
  - lib/leftovers/matcher_builders/node_path.rb
342
364
  - lib/leftovers/matcher_builders/node_type.rb
365
+ - lib/leftovers/matcher_builders/node_value.rb
343
366
  - lib/leftovers/matcher_builders/or.rb
344
367
  - lib/leftovers/matcher_builders/path.rb
345
368
  - lib/leftovers/matcher_builders/string.rb
@@ -353,6 +376,7 @@ files:
353
376
  - lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb
354
377
  - lib/leftovers/matchers/node_has_positional_argument.rb
355
378
  - lib/leftovers/matchers/node_has_positional_argument_with_value.rb
379
+ - lib/leftovers/matchers/node_has_receiver.rb
356
380
  - lib/leftovers/matchers/node_name.rb
357
381
  - lib/leftovers/matchers/node_pair_value.rb
358
382
  - lib/leftovers/matchers/node_path.rb
@@ -360,6 +384,7 @@ files:
360
384
  - lib/leftovers/matchers/node_type.rb
361
385
  - lib/leftovers/matchers/not.rb
362
386
  - lib/leftovers/matchers/or.rb
387
+ - lib/leftovers/matchers/predicate.rb
363
388
  - lib/leftovers/merged_config.rb
364
389
  - lib/leftovers/parser.rb
365
390
  - lib/leftovers/processor_builders.rb
@@ -381,6 +406,7 @@ files:
381
406
  - lib/leftovers/processor_builders/value.rb
382
407
  - lib/leftovers/rake_task.rb
383
408
  - lib/leftovers/reporter.rb
409
+ - lib/leftovers/todo_reporter.rb
384
410
  - lib/leftovers/value_processors.rb
385
411
  - lib/leftovers/value_processors/add_dynamic_prefix.rb
386
412
  - lib/leftovers/value_processors/add_dynamic_suffix.rb
@@ -439,7 +465,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
439
465
  - !ruby/object:Gem::Version
440
466
  version: '0'
441
467
  requirements: []
442
- rubygems_version: 3.1.2
468
+ rubyforge_project:
469
+ rubygems_version: 2.6.13
443
470
  signing_key:
444
471
  specification_version: 4
445
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