leftovers 0.4.0 → 0.5.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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/README.md +37 -4
  4. data/docs/Configuration.md +75 -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 +18 -4
  18. data/lib/leftovers/cli.rb +13 -4
  19. data/lib/leftovers/collector.rb +2 -1
  20. data/lib/leftovers/config.rb +12 -0
  21. data/lib/leftovers/config_validator/schema_hash.rb +57 -11
  22. data/lib/leftovers/definition.rb +6 -6
  23. data/lib/leftovers/definition_node.rb +36 -0
  24. data/lib/leftovers/definition_set.rb +15 -8
  25. data/lib/leftovers/file.rb +2 -3
  26. data/lib/leftovers/file_collector.rb +10 -5
  27. data/lib/leftovers/matcher_builders/node.rb +2 -0
  28. data/lib/leftovers/matcher_builders/node_has_argument.rb +11 -7
  29. data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +14 -10
  30. data/lib/leftovers/matcher_builders/node_has_positional_argument.rb +17 -13
  31. data/lib/leftovers/matcher_builders/node_has_receiver.rb +15 -0
  32. data/lib/leftovers/matcher_builders/node_type.rb +7 -6
  33. data/lib/leftovers/matcher_builders/node_value.rb +42 -0
  34. data/lib/leftovers/matcher_builders.rb +3 -2
  35. data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +4 -1
  36. data/lib/leftovers/matchers/node_has_positional_argument.rb +0 -4
  37. data/lib/leftovers/matchers/node_has_receiver.rb +20 -0
  38. data/lib/leftovers/matchers/predicate.rb +19 -0
  39. data/lib/leftovers/matchers.rb +2 -0
  40. data/lib/leftovers/merged_config.rb +28 -1
  41. data/lib/leftovers/reporter.rb +56 -4
  42. data/lib/leftovers/todo_reporter.rb +127 -0
  43. data/lib/leftovers/value_processors/each_for_definition_set.rb +2 -6
  44. data/lib/leftovers/value_processors/return_definition.rb +5 -3
  45. data/lib/leftovers/version.rb +1 -1
  46. data/lib/leftovers.rb +94 -96
  47. metadata +31 -5
  48. data/lib/leftovers/matcher_builders/argument_node_value.rb +0 -21
@@ -12,6 +12,7 @@ module Leftovers
12
12
 
13
13
  self << :ruby
14
14
  self << project_config
15
+ self << project_todo
15
16
  load_bundled_gem_config
16
17
  end
17
18
 
@@ -32,10 +33,16 @@ module Leftovers
32
33
  Leftovers::Config.new(:'.leftovers.yml', path: Leftovers.pwd + '.leftovers.yml')
33
34
  end
34
35
 
35
- def unmemoize
36
+ def project_todo
37
+ Leftovers::Config.new(:'.leftovers_todo.yml', path: Leftovers.pwd + '.leftovers_todo.yml')
38
+ end
39
+
40
+ def unmemoize # rubocop:disable Metrics/CyclomaticComplexity
36
41
  remove_instance_variable(:@exclude_paths) if defined?(@exclude_paths)
37
42
  remove_instance_variable(:@include_paths) if defined?(@include_paths)
38
43
  remove_instance_variable(:@test_paths) if defined?(@test_paths)
44
+ remove_instance_variable(:@haml_paths) if defined?(@haml_paths)
45
+ remove_instance_variable(:@erb_paths) if defined?(@erb_paths)
39
46
  remove_instance_variable(:@dynamic) if defined?(@dynamic)
40
47
  remove_instance_variable(:@keep) if defined?(@keep)
41
48
  end
@@ -56,6 +63,22 @@ module Leftovers
56
63
  )
57
64
  end
58
65
 
66
+ def haml_paths
67
+ @haml_paths ||= FastIgnore.new(
68
+ include_rules: @configs.flat_map(&:haml_paths),
69
+ gitignore: false,
70
+ root: Leftovers.pwd
71
+ )
72
+ end
73
+
74
+ def erb_paths
75
+ @erb_paths ||= FastIgnore.new(
76
+ include_rules: @configs.flat_map(&:erb_paths),
77
+ gitignore: false,
78
+ root: Leftovers.pwd
79
+ )
80
+ end
81
+
59
82
  def dynamic
60
83
  @dynamic ||= ::Leftovers::ProcessorBuilders::EachDynamic.build(@configs.map(&:dynamic))
61
84
  end
@@ -64,6 +87,10 @@ module Leftovers
64
87
  @keep ||= ::Leftovers::MatcherBuilders::Or.build(@configs.map(&:keep))
65
88
  end
66
89
 
90
+ def test_only
91
+ @test_only ||= ::Leftovers::MatcherBuilders::Or.build(@configs.map(&:test_only))
92
+ end
93
+
67
94
  private
68
95
 
69
96
  def load_bundled_gem_config
@@ -2,10 +2,62 @@
2
2
 
3
3
  module Leftovers
4
4
  class Reporter
5
- def call(definition)
6
- Leftovers.puts(
7
- "\e[36m#{definition.location_s}\e[0m #{definition} \e[2m#{definition.highlighted_source("\e[33m", "\e[0;2m")}\e[0m" # rubocop:disable Layout/LineLength
8
- )
5
+ def prepare; end
6
+
7
+ def report(only_test:, none:)
8
+ report_list('Only directly called in tests:', only_test)
9
+ report_list('Not directly called at all:', none)
10
+ report_instructions
11
+
12
+ 1
13
+ end
14
+
15
+ def report_success
16
+ puts green('Everything is used')
17
+
18
+ 0
19
+ end
20
+
21
+ private
22
+
23
+ def report_instructions
24
+ puts <<~HELP
25
+
26
+ how to resolve: #{green Leftovers.resolution_instructions_link}
27
+ HELP
28
+ end
29
+
30
+ def report_list(title, list)
31
+ return if list.empty?
32
+
33
+ puts red(title)
34
+ list.each { |d| print_definition(d) }
35
+ end
36
+
37
+ def print_definition(definition)
38
+ puts "#{aqua definition.location_s} "\
39
+ "#{definition} "\
40
+ "#{grey definition.highlighted_source("\e[33m", "\e[0;2m")}"
41
+ end
42
+
43
+ def puts(string)
44
+ Leftovers.puts(string)
45
+ end
46
+
47
+ def red(string)
48
+ "\e[31m#{string}\e[0m"
49
+ end
50
+
51
+ def green(string)
52
+ "\e[32m#{string}\e[0m"
53
+ end
54
+
55
+ def aqua(string)
56
+ "\e[36m#{string}\e[0m"
57
+ end
58
+
59
+ def grey(string)
60
+ "\e[2m#{string}\e[0m"
9
61
  end
10
62
  end
11
63
  end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+
5
+ module Leftovers
6
+ class TodoReporter
7
+ def prepare
8
+ return unless path.exist?
9
+
10
+ puts "Removing previous #{path.basename} file"
11
+ puts ''
12
+ path.delete
13
+ end
14
+
15
+ def report(only_test:, none:)
16
+ path.write(generate_file_body(only_test, none))
17
+ report_instructions
18
+
19
+ 0
20
+ end
21
+
22
+ def report_success
23
+ puts "No #{path.basename} file generated, everything is used"
24
+
25
+ 0
26
+ end
27
+
28
+ private
29
+
30
+ def report_instructions
31
+ puts <<~MESSAGE
32
+ generated #{path.basename}.
33
+ running leftovers again will read this file and not alert you to any unused items mentioned in it.
34
+
35
+ commit this file so you/your team can gradually address these items while still having leftovers alert you to any newly unused items.
36
+ MESSAGE
37
+ end
38
+
39
+ def path
40
+ Leftovers.pwd.join('.leftovers_todo.yml')
41
+ end
42
+
43
+ def generate_file_body(only_test, none)
44
+ <<~YML.chomp
45
+ #{generation_message.chomp}
46
+ #
47
+ #{resolution_instructions}
48
+ #{todo_data(only_test, none).chomp}
49
+ YML
50
+ end
51
+
52
+ def generation_message
53
+ <<~YML
54
+ # This file was generated by `leftovers --write-todo`
55
+ # Generated at: #{Time.now.utc.strftime('%F %T')} UTC
56
+ YML
57
+ end
58
+
59
+ def resolution_instructions
60
+ <<~YML
61
+ # for instructions on how to address these
62
+ # see #{Leftovers.resolution_instructions_link}
63
+ YML
64
+ end
65
+
66
+ def todo_data(only_test, none)
67
+ none_test = none.select(&:test?)
68
+ none_non_test = none.reject(&:test?)
69
+ [
70
+ test_only_data(none_test),
71
+ keep_data(only_test, none_non_test)
72
+ ].compact.join
73
+ end
74
+
75
+ def test_only_data(list)
76
+ return if list.empty?
77
+
78
+ <<~YML
79
+ test_only:
80
+ #{generate_list('Defined in tests:', list).chomp}
81
+ YML
82
+ end
83
+
84
+ def keep_data(only_test, none_non_test)
85
+ return if only_test.empty? && none_non_test.empty?
86
+
87
+ <<~YML.chomp
88
+ keep:
89
+ #{keep_test_called_data(only_test)}#{keep_never_called_data(none_non_test)}
90
+ YML
91
+ end
92
+
93
+ def keep_test_called_data(list)
94
+ return if list.empty?
95
+
96
+ generate_list('Only directly called in tests:', list)
97
+ end
98
+
99
+ def keep_never_called_data(list)
100
+ return if list.empty?
101
+
102
+ generate_list('Not directly called at all:', list)
103
+ end
104
+
105
+ def generate_list(title, list)
106
+ <<~YML
107
+ # #{title}
108
+ #{print_definition_list(list)}
109
+
110
+ YML
111
+ end
112
+
113
+ def print_definition_list(definition_list)
114
+ definition_list.map { |definition| print_definition(definition) }.join("\n")
115
+ end
116
+
117
+ def print_definition(definition)
118
+ return print_definition_list(definition.definitions) if definition.is_a?(DefinitionSet)
119
+
120
+ " - #{definition.to_s.inspect} # #{definition.location_s} #{definition.source_line.strip}"
121
+ end
122
+
123
+ def puts(string)
124
+ Leftovers.puts(string)
125
+ end
126
+ end
127
+ end
@@ -9,7 +9,7 @@ module Leftovers
9
9
  freeze
10
10
  end
11
11
 
12
- def process(str, node, method_node) # rubocop:disable Metrics/MethodLength
12
+ def process(str, node, method_node)
13
13
  definitions = @then_processors.map do |then_processor|
14
14
  processed = then_processor.process(str, node, method_node)
15
15
  return if processed == :keep # rubocop:disable Lint/NonLocalExitFromIterator
@@ -22,11 +22,7 @@ module Leftovers
22
22
 
23
23
  return definitions.first if definitions.length <= 1
24
24
 
25
- ::Leftovers::DefinitionSet.new(
26
- definitions,
27
- location: node.loc.expression,
28
- method_node: method_node
29
- )
25
+ ::Leftovers::DefinitionSet.new(definitions)
30
26
  end
31
27
  end
32
28
  end
@@ -11,12 +11,14 @@ module Leftovers
11
11
  return unless str
12
12
  return if str.empty?
13
13
 
14
- return :keep if ::Leftovers.config.keep === node
14
+ str_node = Leftovers::DefinitionNode.new(str.to_sym, method_node.path)
15
+
16
+ return :keep if ::Leftovers.config.keep === str_node
15
17
 
16
18
  Leftovers::Definition.new(
17
- str.to_sym,
19
+ str_node.name,
18
20
  location: node.loc.expression,
19
- method_node: method_node
21
+ test: method_node.test_line? || ::Leftovers.config.test_only === str_node
20
22
  )
21
23
  end
22
24
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- VERSION = '0.4.0'
4
+ VERSION = '0.5.0'
5
5
  end
data/lib/leftovers.rb CHANGED
@@ -3,14 +3,13 @@
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")
11
9
  autoload(:Collector, "#{__dir__}/leftovers/collector")
12
10
  autoload(:ConfigValidator, "#{__dir__}/leftovers/config_validator")
13
11
  autoload(:Config, "#{__dir__}/leftovers/config")
12
+ autoload(:DefinitionNode, "#{__dir__}/leftovers/definition_node")
14
13
  autoload(:DefinitionSet, "#{__dir__}/leftovers/definition_set")
15
14
  autoload(:Definition, "#{__dir__}/leftovers/definition")
16
15
  autoload(:ERB, "#{__dir__}/leftovers/erb")
@@ -25,136 +24,135 @@ module Leftovers # rubocop:disable Metrics/ModuleLength
25
24
  autoload(:ProcessorBuilders, "#{__dir__}/leftovers/processor_builders")
26
25
  autoload(:RakeTask, "#{__dir__}/leftovers/rake_task")
27
26
  autoload(:Reporter, "#{__dir__}/leftovers/reporter")
27
+ autoload(:TodoReporter, "#{__dir__}/leftovers/todo_reporter")
28
28
  autoload(:DynamicProcessors, "#{__dir__}/leftovers/dynamic_processors")
29
29
  autoload(:ValueProcessors, "#{__dir__}/leftovers/value_processors")
30
30
  autoload(:VERSION, "#{__dir__}/leftovers/version")
31
31
 
32
32
  class << self
33
33
  attr_accessor :parallel, :progress
34
+ attr_writer :reporter
34
35
  alias_method :parallel?, :parallel
35
-
36
36
  alias_method :progress?, :progress
37
- end
38
-
39
- def stdout
40
- @stdout ||= $stdout
41
- end
42
37
 
43
- def stderr
44
- @stderr ||= $stderr
45
- end
38
+ def stdout
39
+ @stdout ||= $stdout
40
+ end
46
41
 
47
- def config
48
- @config ||= Leftovers::MergedConfig.new(load_defaults: true)
49
- end
42
+ def stderr
43
+ @stderr ||= $stderr
44
+ end
50
45
 
51
- def collector
52
- @collector ||= Leftovers::Collector.new
53
- end
46
+ def config
47
+ @config ||= Leftovers::MergedConfig.new(load_defaults: true)
48
+ end
54
49
 
55
- def reporter
56
- @reporter ||= Leftovers::Reporter.new
57
- end
50
+ def collector
51
+ @collector ||= Leftovers::Collector.new
52
+ end
58
53
 
59
- def leftovers
60
- @leftovers ||= begin
61
- collector.collect
62
- collector.definitions.reject(&:in_collection?)
54
+ def reporter
55
+ @reporter ||= Leftovers::Reporter.new
63
56
  end
64
- end
65
57
 
66
- def run(stdout: StringIO.new, stderr: StringIO.new) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
67
- @stdout = stdout
68
- @stderr = stderr
69
- return 0 if leftovers.empty?
70
-
71
- only_test = []
72
- none = []
73
- leftovers.sort_by(&:location_s).each do |definition|
74
- if !definition.test? && definition.in_test_collection?
75
- only_test << definition
76
- else
77
- none << definition
58
+ def leftovers
59
+ @leftovers ||= begin
60
+ collector.collect
61
+ collector.definitions.reject(&:in_collection?)
78
62
  end
79
63
  end
80
64
 
81
- unless only_test.empty?
82
- puts "\e[31mOnly directly called in tests:\e[0m"
83
- 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)
84
81
  end
85
82
 
86
- unless none.empty?
87
- puts "\e[31mNot directly called at all:\e[0m"
88
- 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)
89
93
  end
90
94
 
91
- 1
92
- end
95
+ def resolution_instructions_link
96
+ "https://github.com/robotdana/leftovers/tree/v#{Leftovers::VERSION}/README.md#how_to_resolve"
97
+ end
93
98
 
94
- def reset # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
95
- remove_instance_variable(:@config) if defined?(@config)
96
- remove_instance_variable(:@collector) if defined?(@collector)
97
- remove_instance_variable(:@reporter) if defined?(@reporter)
98
- remove_instance_variable(:@leftovers) if defined?(@leftovers)
99
- remove_instance_variable(:@try_require) if defined?(@try_require)
100
- remove_instance_variable(:@stdout) if defined?(@stdout)
101
- remove_instance_variable(:@stderr) if defined?(@stderr)
102
- remove_instance_variable(:@parallel) if defined?(@parallel)
103
- remove_instance_variable(:@pwd) if defined?(@pwd)
104
- end
99
+ def warn(message)
100
+ stderr.puts("\e[2K#{message}")
101
+ end
105
102
 
106
- def warn(message)
107
- stderr.puts("\e[2K#{message}")
108
- end
103
+ def error(message)
104
+ warn(message)
105
+ exit 1
106
+ end
109
107
 
110
- def error(message)
111
- warn(message)
112
- exit 1
113
- end
108
+ def puts(message)
109
+ stdout.puts("\e[2K#{message}")
110
+ end
114
111
 
115
- def puts(message)
116
- stdout.puts("\e[2K#{message}")
117
- end
112
+ def print(message)
113
+ stdout.print(message)
114
+ end
118
115
 
119
- def print(message)
120
- stdout.print(message)
121
- end
116
+ def newline
117
+ stdout.puts('')
118
+ end
122
119
 
123
- def newline
124
- stdout.puts('')
125
- end
120
+ def pwd
121
+ @pwd ||= Pathname.new(Dir.pwd + '/')
122
+ end
126
123
 
127
- def pwd
128
- @pwd ||= Pathname.new(Dir.pwd + '/')
129
- end
124
+ def exit(status = 0)
125
+ throw :leftovers_exit, status
126
+ end
130
127
 
131
- def exit(status = 0)
132
- throw :leftovers_exit, status
133
- end
128
+ def try_require(requirable, message: nil)
129
+ warn message if !try_require_cache(requirable) && message
130
+ try_require_cache(requirable)
131
+ end
134
132
 
135
- def try_require(requirable, message: nil) # rubocop:disable Metrics/MethodLength
136
- @try_require ||= {}
133
+ def each_or_self(value, &block)
134
+ return enum_for(__method__, value) unless block
137
135
 
138
- @try_require[requirable] = begin
139
- if @try_require.key?(requirable)
140
- @try_require[requirable]
141
- else
142
- require requirable
143
- true
136
+ case value
137
+ when nil then nil
138
+ when Array then value.each(&block)
139
+ else yield(value)
144
140
  end
145
- rescue LoadError
146
- false
147
141
  end
148
142
 
149
- warn message if !@try_require[requirable] && message
150
- @try_require[requirable]
151
- end
143
+ private
152
144
 
153
- def each_or_self(value, &block)
154
- case value
155
- when nil then nil
156
- when Array then value.each(&block)
157
- 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
158
156
  end
159
157
  end
160
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.0
4
+ version: 0.5.0
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-03 00:00:00.000000000 Z
11
+ date: 2021-10-25 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
@@ -313,6 +335,7 @@ files:
313
335
  - lib/leftovers/config_validator/error_processor.rb
314
336
  - lib/leftovers/config_validator/schema_hash.rb
315
337
  - lib/leftovers/definition.rb
338
+ - lib/leftovers/definition_node.rb
316
339
  - lib/leftovers/definition_set.rb
317
340
  - lib/leftovers/dynamic_processors.rb
318
341
  - lib/leftovers/dynamic_processors/call.rb
@@ -328,17 +351,18 @@ files:
328
351
  - lib/leftovers/matcher_builders.rb
329
352
  - lib/leftovers/matcher_builders/and.rb
330
353
  - lib/leftovers/matcher_builders/and_not.rb
331
- - lib/leftovers/matcher_builders/argument_node_value.rb
332
354
  - lib/leftovers/matcher_builders/name.rb
333
355
  - lib/leftovers/matcher_builders/node.rb
334
356
  - lib/leftovers/matcher_builders/node_has_argument.rb
335
357
  - lib/leftovers/matcher_builders/node_has_keyword_argument.rb
336
358
  - lib/leftovers/matcher_builders/node_has_positional_argument.rb
359
+ - lib/leftovers/matcher_builders/node_has_receiver.rb
337
360
  - lib/leftovers/matcher_builders/node_name.rb
338
361
  - lib/leftovers/matcher_builders/node_pair_name.rb
339
362
  - lib/leftovers/matcher_builders/node_pair_value.rb
340
363
  - lib/leftovers/matcher_builders/node_path.rb
341
364
  - lib/leftovers/matcher_builders/node_type.rb
365
+ - lib/leftovers/matcher_builders/node_value.rb
342
366
  - lib/leftovers/matcher_builders/or.rb
343
367
  - lib/leftovers/matcher_builders/path.rb
344
368
  - lib/leftovers/matcher_builders/string.rb
@@ -352,6 +376,7 @@ files:
352
376
  - lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb
353
377
  - lib/leftovers/matchers/node_has_positional_argument.rb
354
378
  - lib/leftovers/matchers/node_has_positional_argument_with_value.rb
379
+ - lib/leftovers/matchers/node_has_receiver.rb
355
380
  - lib/leftovers/matchers/node_name.rb
356
381
  - lib/leftovers/matchers/node_pair_value.rb
357
382
  - lib/leftovers/matchers/node_path.rb
@@ -359,6 +384,7 @@ files:
359
384
  - lib/leftovers/matchers/node_type.rb
360
385
  - lib/leftovers/matchers/not.rb
361
386
  - lib/leftovers/matchers/or.rb
387
+ - lib/leftovers/matchers/predicate.rb
362
388
  - lib/leftovers/merged_config.rb
363
389
  - lib/leftovers/parser.rb
364
390
  - lib/leftovers/processor_builders.rb
@@ -380,6 +406,7 @@ files:
380
406
  - lib/leftovers/processor_builders/value.rb
381
407
  - lib/leftovers/rake_task.rb
382
408
  - lib/leftovers/reporter.rb
409
+ - lib/leftovers/todo_reporter.rb
383
410
  - lib/leftovers/value_processors.rb
384
411
  - lib/leftovers/value_processors/add_dynamic_prefix.rb
385
412
  - lib/leftovers/value_processors/add_dynamic_suffix.rb
@@ -438,8 +465,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
438
465
  - !ruby/object:Gem::Version
439
466
  version: '0'
440
467
  requirements: []
441
- rubyforge_project:
442
- rubygems_version: 2.7.6
468
+ rubygems_version: 3.1.6
443
469
  signing_key:
444
470
  specification_version: 4
445
471
  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