leftovers 0.4.2 → 0.5.2

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 +30 -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 +1 -0
  20. data/lib/leftovers/config.rb +8 -0
  21. data/lib/leftovers/config_validator/schema_hash.rb +62 -29
  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
@@ -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
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- VERSION = '0.4.2'
4
+ VERSION = '0.5.2'
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")
@@ -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.2
4
+ version: 0.5.2
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-20 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