leftovers 0.3.0 → 0.4.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 (144) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/README.md +28 -45
  4. data/docs/Configuration.md +598 -0
  5. data/exe/leftovers +1 -1
  6. data/leftovers.gemspec +9 -6
  7. data/lib/config/attr_encrypted.yml +3 -4
  8. data/lib/config/audited.yml +9 -4
  9. data/lib/config/datagrid.yml +1 -1
  10. data/lib/config/flipper.yml +1 -3
  11. data/lib/config/graphql.yml +15 -13
  12. data/lib/config/okcomputer.yml +1 -3
  13. data/lib/config/parser.yml +89 -91
  14. data/lib/config/rails.yml +125 -107
  15. data/lib/config/redcarpet.yml +35 -38
  16. data/lib/config/rollbar.yml +1 -3
  17. data/lib/config/rspec.yml +18 -10
  18. data/lib/config/ruby.yml +40 -50
  19. data/lib/config/selenium-webdriver.yml +19 -21
  20. data/lib/config/sidekiq.yml +4 -8
  21. data/lib/config/will_paginate.yml +12 -14
  22. data/lib/leftovers.rb +38 -26
  23. data/lib/leftovers/ast.rb +8 -0
  24. data/lib/leftovers/ast/builder.rb +4 -4
  25. data/lib/leftovers/ast/node.rb +50 -77
  26. data/lib/leftovers/backports.rb +27 -23
  27. data/lib/leftovers/cli.rb +0 -3
  28. data/lib/leftovers/collector.rb +4 -8
  29. data/lib/leftovers/config.rb +19 -25
  30. data/lib/leftovers/config_validator.rb +60 -0
  31. data/lib/leftovers/config_validator/error_processor.rb +196 -0
  32. data/lib/leftovers/config_validator/schema_hash.rb +495 -0
  33. data/lib/leftovers/definition.rb +11 -36
  34. data/lib/leftovers/definition_set.rb +7 -17
  35. data/lib/leftovers/dynamic_processors.rb +11 -0
  36. data/lib/leftovers/dynamic_processors/call.rb +25 -0
  37. data/lib/leftovers/dynamic_processors/call_definition.rb +31 -0
  38. data/lib/leftovers/dynamic_processors/definition.rb +26 -0
  39. data/lib/leftovers/dynamic_processors/each.rb +19 -0
  40. data/lib/leftovers/dynamic_processors/null.rb +9 -0
  41. data/lib/leftovers/erb.rb +2 -2
  42. data/lib/leftovers/file.rb +3 -5
  43. data/lib/leftovers/file_collector.rb +65 -49
  44. data/lib/leftovers/file_list.rb +0 -1
  45. data/lib/leftovers/haml.rb +1 -1
  46. data/lib/leftovers/matcher_builders.rb +24 -0
  47. data/lib/leftovers/matcher_builders/and.rb +19 -0
  48. data/lib/leftovers/matcher_builders/and_not.rb +14 -0
  49. data/lib/leftovers/matcher_builders/argument_node_value.rb +21 -0
  50. data/lib/leftovers/matcher_builders/name.rb +29 -0
  51. data/lib/leftovers/matcher_builders/node.rb +40 -0
  52. data/lib/leftovers/matcher_builders/node_has_argument.rb +71 -0
  53. data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +22 -0
  54. data/lib/leftovers/matcher_builders/node_has_positional_argument.rb +24 -0
  55. data/lib/leftovers/matcher_builders/node_name.rb +15 -0
  56. data/lib/leftovers/matcher_builders/node_pair_name.rb +18 -0
  57. data/lib/leftovers/matcher_builders/node_pair_value.rb +16 -0
  58. data/lib/leftovers/matcher_builders/node_path.rb +14 -0
  59. data/lib/leftovers/matcher_builders/node_type.rb +28 -0
  60. data/lib/leftovers/matcher_builders/or.rb +73 -0
  61. data/lib/leftovers/matcher_builders/path.rb +15 -0
  62. data/lib/leftovers/matcher_builders/string.rb +11 -0
  63. data/lib/leftovers/matcher_builders/string_pattern.rb +19 -0
  64. data/lib/leftovers/matcher_builders/unless.rb +13 -0
  65. data/lib/leftovers/matchers.rb +26 -0
  66. data/lib/leftovers/matchers/all.rb +25 -0
  67. data/lib/leftovers/matchers/and.rb +24 -0
  68. data/lib/leftovers/matchers/any.rb +27 -0
  69. data/lib/leftovers/matchers/node_has_any_keyword_argument.rb +28 -0
  70. data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +25 -0
  71. data/lib/leftovers/matchers/node_has_positional_argument.rb +23 -0
  72. data/lib/leftovers/matchers/node_has_positional_argument_with_value.rb +25 -0
  73. data/lib/leftovers/matchers/node_name.rb +23 -0
  74. data/lib/leftovers/matchers/node_pair_value.rb +23 -0
  75. data/lib/leftovers/matchers/node_path.rb +23 -0
  76. data/lib/leftovers/matchers/node_scalar_value.rb +25 -0
  77. data/lib/leftovers/matchers/node_type.rb +23 -0
  78. data/lib/leftovers/matchers/not.rb +23 -0
  79. data/lib/leftovers/matchers/or.rb +26 -0
  80. data/lib/leftovers/merged_config.rb +13 -8
  81. data/lib/leftovers/parser.rb +1 -4
  82. data/lib/leftovers/processor_builders.rb +22 -0
  83. data/lib/leftovers/processor_builders/action.rb +63 -0
  84. data/lib/leftovers/processor_builders/add_prefix.rb +20 -0
  85. data/lib/leftovers/processor_builders/add_suffix.rb +20 -0
  86. data/lib/leftovers/processor_builders/argument.rb +25 -0
  87. data/lib/leftovers/processor_builders/dynamic.rb +27 -0
  88. data/lib/leftovers/processor_builders/each.rb +36 -0
  89. data/lib/leftovers/processor_builders/each_action.rb +51 -0
  90. data/lib/leftovers/processor_builders/each_dynamic.rb +54 -0
  91. data/lib/leftovers/processor_builders/each_for_definition_set.rb +36 -0
  92. data/lib/leftovers/processor_builders/itself.rb +13 -0
  93. data/lib/leftovers/processor_builders/keyword.rb +24 -0
  94. data/lib/leftovers/processor_builders/keyword_argument.rb +14 -0
  95. data/lib/leftovers/processor_builders/transform.rb +55 -0
  96. data/lib/leftovers/processor_builders/transform_chain.rb +24 -0
  97. data/lib/leftovers/processor_builders/transform_set.rb +47 -0
  98. data/lib/leftovers/processor_builders/value.rb +13 -0
  99. data/lib/leftovers/rake_task.rb +1 -1
  100. data/lib/leftovers/reporter.rb +1 -1
  101. data/lib/leftovers/value_processors.rb +40 -0
  102. data/lib/leftovers/value_processors/add_dynamic_prefix.rb +31 -0
  103. data/lib/leftovers/value_processors/add_dynamic_suffix.rb +31 -0
  104. data/lib/leftovers/value_processors/add_prefix.rb +20 -0
  105. data/lib/leftovers/value_processors/add_suffix.rb +20 -0
  106. data/lib/leftovers/value_processors/camelize.rb +24 -0
  107. data/lib/leftovers/value_processors/capitalize.rb +19 -0
  108. data/lib/leftovers/value_processors/deconstantize.rb +24 -0
  109. data/lib/leftovers/value_processors/delete_after.rb +22 -0
  110. data/lib/leftovers/value_processors/delete_before.rb +22 -0
  111. data/lib/leftovers/value_processors/delete_prefix.rb +26 -0
  112. data/lib/leftovers/value_processors/delete_suffix.rb +26 -0
  113. data/lib/leftovers/value_processors/demodulize.rb +24 -0
  114. data/lib/leftovers/value_processors/downcase.rb +19 -0
  115. data/lib/leftovers/value_processors/each.rb +21 -0
  116. data/lib/leftovers/value_processors/each_for_definition_set.rb +33 -0
  117. data/lib/leftovers/value_processors/each_keyword.rb +27 -0
  118. data/lib/leftovers/value_processors/each_keyword_argument.rb +27 -0
  119. data/lib/leftovers/value_processors/each_positional_argument.rb +24 -0
  120. data/lib/leftovers/value_processors/itself.rb +17 -0
  121. data/lib/leftovers/value_processors/keyword.rb +36 -0
  122. data/lib/leftovers/value_processors/keyword_argument.rb +36 -0
  123. data/lib/leftovers/value_processors/parameterize.rb +24 -0
  124. data/lib/leftovers/value_processors/placeholder.rb +18 -0
  125. data/lib/leftovers/value_processors/pluralize.rb +24 -0
  126. data/lib/leftovers/value_processors/positional_argument.rb +26 -0
  127. data/lib/leftovers/value_processors/replace_value.rb +18 -0
  128. data/lib/leftovers/value_processors/return_definition.rb +24 -0
  129. data/lib/leftovers/value_processors/return_string.rb +14 -0
  130. data/lib/leftovers/value_processors/singularize.rb +24 -0
  131. data/lib/leftovers/value_processors/split.rb +22 -0
  132. data/lib/leftovers/value_processors/swapcase.rb +19 -0
  133. data/lib/leftovers/value_processors/titleize.rb +24 -0
  134. data/lib/leftovers/value_processors/underscore.rb +24 -0
  135. data/lib/leftovers/value_processors/upcase.rb +19 -0
  136. data/lib/leftovers/version.rb +1 -1
  137. metadata +143 -24
  138. data/lib/leftovers/argument_rule.rb +0 -229
  139. data/lib/leftovers/core_ext.rb +0 -15
  140. data/lib/leftovers/hash_rule.rb +0 -42
  141. data/lib/leftovers/name_rule.rb +0 -98
  142. data/lib/leftovers/rule.rb +0 -82
  143. data/lib/leftovers/transform_rule.rb +0 -169
  144. data/lib/leftovers/value_rule.rb +0 -57
@@ -1,229 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'definition'
4
- require_relative 'definition_set'
5
- require_relative 'name_rule'
6
- require_relative 'transform_rule'
7
- require_relative 'hash_rule'
8
-
9
- module Leftovers
10
- class ArgumentRule # rubocop:disable Metrics/ClassLength
11
- def self.wrap(rules, definer: false) # rubocop:disable Metrics/MethodLength
12
- case rules
13
- when Array
14
- rules.flat_map { |r| wrap(r, definer: definer) }
15
- when Hash
16
- [new(**rules, definer: definer)]
17
- else
18
- []
19
- end
20
- end
21
-
22
- ADDITIONAL_VALID_KEYS = Leftovers::TransformRule::VALID_TRANSFORMS + %i{if unless}
23
- def initialize( # rubocop:disable Metrics/ParameterLists, Metrics/MethodLength, Metrics/CyclomaticComplexity
24
- argument: nil,
25
- arguments: nil,
26
- key: nil,
27
- keys: nil,
28
- itself: false,
29
- linked_transforms: nil,
30
- transforms: nil,
31
- definer: false,
32
- **options
33
- )
34
- assert_valid_keys(options, ADDITIONAL_VALID_KEYS)
35
- prepare_argument(argument, arguments)
36
- @key = prepare_key(key, keys)
37
- @itself = itself
38
-
39
- unless @positions || @keywords || @all_positions || @all_keywords || @key || @itself
40
- raise Leftovers::ConfigError, "require at least one of 'argument(s)', 'key(s)', itself"
41
- end
42
-
43
- @if = prepare_condition(options.delete(:if))
44
- @unless = prepare_condition(options.delete(:unless))
45
- @transforms = prepare_transform(options, transforms, linked_transforms)
46
- @definer = definer
47
- end
48
-
49
- def prepare_transform(options, transforms, linked_transforms) # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize
50
- if linked_transforms && transforms
51
- raise Leftovers::ConfigError, 'Only use one of linked_transforms/transforms'
52
- end
53
- return if !linked_transforms && !transforms && options.empty?
54
-
55
- if !(linked_transforms || transforms)
56
- @transform = TransformRule.new(options)
57
- else
58
- @linked = !!linked_transforms
59
-
60
- transforms = Leftovers.array_wrap(linked_transforms || transforms).map do |transform|
61
- transform = { transform.to_sym => true } if transform.is_a?(String)
62
- Leftovers::TransformRule.new(options.merge(transform))
63
- end
64
-
65
- if transforms.length <= 1
66
- @transform = transforms.first
67
- else
68
- @transforms = transforms
69
- end
70
- end
71
- end
72
-
73
- def prepare_condition(conditions) # rubocop:disable Metrics/MethodLength
74
- Leftovers.array_wrap(conditions).each do |cond|
75
- unless cond.is_a?(Hash) && cond.keys == [:has_argument]
76
- raise Leftovers::ConfigError, <<~MESSAGE
77
- Invalid condition #{cond.inspect}. Valid condition keys are: has_argument
78
- MESSAGE
79
- end
80
-
81
- cond[:has_argument] = HashRule.new(cond[:has_argument])
82
- end
83
- end
84
-
85
- def prepare_key(key, keys)
86
- raise Leftovers::ConfigError, 'Only use one of key/keys' if key && keys
87
-
88
- key || keys
89
- end
90
-
91
- def prepare_argument(argument, arguments) # rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize
92
- raise Leftovers::ConfigError, 'Only use one of argument/arguments' if argument && arguments
93
-
94
- positions = Set.new
95
- keywords = []
96
-
97
- Leftovers.each_or_self(argument || arguments) do |arg|
98
- case arg
99
- when '*'
100
- @all_positions = true
101
- when '**'
102
- @all_keywords = true
103
- when Integer
104
- positions << arg - 1
105
- when String, Symbol, Hash
106
- keywords << arg
107
- else
108
- raise Leftovers::ConfigError, <<~MESSAGE
109
- Invalid value for argument: #{arg.inspect}. Must by a string ('*', '**', or a keyword), or a hash with the name match rules, or an integer, or an array of these
110
- MESSAGE
111
- end
112
- end
113
-
114
- @positions = positions unless @all_positions || positions.empty? || @all_positions
115
- @keywords = NameRule.wrap(keywords) unless @all_keywords || keywords.empty?
116
- end
117
-
118
- def matches(method_node) # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/AbcSize
119
- return [].freeze unless all_conditions_match?(method_node)
120
-
121
- result = []
122
-
123
- if @all_positions
124
- result.leftovers_append values(method_node.positional_arguments, method_node)
125
- elsif @positions
126
- result.leftovers_append(
127
- values(method_node.positional_arguments_at(@positions).compact, method_node)
128
- )
129
- end
130
-
131
- if @keywords || @all_keywords || @key
132
- result.leftovers_append hash_values(method_node.kwargs, method_node)
133
- end
134
- result << method_value(method_node) if @itself
135
-
136
- result
137
- end
138
-
139
- def values(value_nodes, method_node)
140
- value_nodes.flat_map { |value_node| value(value_node, method_node) }.compact
141
- end
142
-
143
- def all_conditions_match?(method_node)
144
- @if.all? { |c| condition_match?(c, method_node) } &&
145
- @unless.all? { |c| !condition_match?(c, method_node) }
146
- end
147
-
148
- def condition_match?(condition, method_node)
149
- method_node.positional_arguments.each.with_index(1).any? do |value, index|
150
- condition[:has_argument].match_pair?(index, value)
151
- end || method_node.kwargs&.each_pair&.any? do |key, value|
152
- condition[:has_argument].match_pair?(key.to_sym, value)
153
- end
154
- end
155
-
156
- def hash_values(hash_node, method_node) # rubocop:disable Metrics/MethodLength
157
- return unless hash_node
158
-
159
- value_nodes = []
160
- value_nodes.concat hash_node.keys if @key
161
-
162
- if @all_keywords
163
- value_nodes.concat(hash_node.values)
164
- elsif @keywords
165
- value_nodes.concat(hash_node.values_at_match(@keywords))
166
- end
167
-
168
- values(value_nodes, method_node)
169
- end
170
-
171
- def value(value_node, method_node) # rubocop:disable Metrics/MethodLength
172
- value_node = value_node.unwrap_freeze
173
-
174
- case value_node.type
175
- when :array
176
- values(value_node.values, method_node)
177
- when :hash
178
- hash_values(value_node, method_node)
179
- when :str, :sym
180
- symbol_values(value_node, method_node)
181
- end
182
- end
183
-
184
- SPLIT = /[.:]+/.freeze
185
- def symbol_values(symbol_node, method_node) # rubocop:disable Metrics/MethodLength
186
- subnodes = Array(transform(symbol_node.to_s, method_node))
187
- .flat_map { |s| s.to_s.split(SPLIT).map(&:to_sym) }
188
-
189
- return subnodes unless @definer
190
-
191
- location = symbol_node.loc.expression
192
- if @linked
193
- Leftovers::DefinitionSet.new(subnodes, location: location, method_node: method_node)
194
- else
195
- subnodes.map do |subnode|
196
- Leftovers::Definition.new(subnode, location: location, method_node: method_node)
197
- end
198
- end
199
- end
200
-
201
- def method_value(method_node)
202
- value = transform(method_node.to_s, method_node)
203
-
204
- return value unless @definer
205
-
206
- Leftovers::Definition.new(value, method_node: method_node)
207
- end
208
-
209
- def transform(string, method_node)
210
- return string unless @transform || @transforms
211
- return @transform.transform(string, method_node) if @transform
212
-
213
- @transforms.map do |transform|
214
- transform.transform(string, method_node)
215
- end
216
- end
217
-
218
- def assert_valid_keys(options, keys) # rubocop:disable Metrics/MethodLength
219
- invalid = options.keys - keys
220
-
221
- return if invalid.empty?
222
-
223
- raise(
224
- Leftovers::ConfigError,
225
- "unknown keyword#{'s' if invalid.length > 1}: #{invalid.join(', ')}"
226
- )
227
- end
228
- end
229
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'set'
4
-
5
- class Array
6
- def leftovers_append(other) # rubocop:disable Metrics/MethodLength
7
- return self if other.nil?
8
-
9
- if other.respond_to?(:to_a)
10
- concat(other.to_a)
11
- else
12
- self << other
13
- end
14
- end
15
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'set'
4
- require_relative 'value_rule'
5
- require_relative 'name_rule'
6
-
7
- module Leftovers
8
- class HashRule
9
- # :nocov:
10
- using ::Leftovers::SetCaseEq if defined?(::Leftovers::SetCaseEq)
11
- # :nocov:
12
-
13
- def initialize(patterns) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
14
- keys = []
15
- pairs = []
16
- Leftovers.each_or_self(patterns) do |pat|
17
- if pat.is_a?(Hash) && pat[:value]
18
- pairs << [
19
- NameRule.wrap(pat[:keyword] || pat[:index]),
20
- ValueRule.new(pat[:value])
21
- ]
22
- else
23
- keys << NameRule.wrap(pat)
24
- end
25
- end
26
-
27
- @keys = NameRule.wrap(keys, false)
28
-
29
- @pairs = (pairs unless pairs.empty?)
30
-
31
- freeze
32
- end
33
-
34
- def match_pair?(key, value_node)
35
- return true if @keys === key
36
-
37
- @pairs&.any? do |(key_rule, value_rule)|
38
- key_rule === key && value_rule.match?(value_node)
39
- end
40
- end
41
- end
42
- end
@@ -1,98 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'set'
4
- module Leftovers
5
- class NameRule
6
- # :nocov:
7
- using ::Leftovers::SetCaseEq if defined?(::Leftovers::SetCaseEq)
8
- # :nocov:
9
-
10
- module TrueReturner
11
- def self.===(_value)
12
- true
13
- end
14
- end
15
-
16
- module FalseReturner
17
- def self.===(_value)
18
- false
19
- end
20
- end
21
-
22
- attr_reader :syms, :regexp
23
-
24
- def self.wrap(patterns, default = true) # rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize
25
- regexps = []
26
- syms = Set.new
27
-
28
- Leftovers.each_or_self(patterns) do |pat| # rubocop:disable Metrics/BlockLength
29
- # can't have these as part of the case statement because case equality
30
- next if pat == Leftovers::NameRule::TrueReturner
31
- next if pat == Leftovers::NameRule::FalseReturner
32
-
33
- case pat
34
- when nil
35
- nil # do nothing
36
- when Leftovers::NameRule
37
- pat.syms.is_a?(Set) ? syms.merge(pat.syms) : syms << pat.syms
38
- regexps << pat.regexp
39
- when String
40
- syms.merge(pat.split(/\s+/).map(&:to_sym))
41
- when Symbol
42
- syms << pat
43
- when Integer
44
- syms << pat
45
- when Set
46
- syms.merge(pat)
47
- when Regexp
48
- regexps << pat
49
- when Hash
50
- if pat[:match]
51
- regexps << /\A#{pat[:match]}\z/
52
- elsif pat[:matches]
53
- regexps << /\A#{pat[:matches]}\z/
54
- elsif pat[:has_prefix] && pat[:has_suffix]
55
- regexps << /\A#{Regexp.escape(pat[:has_prefix])}.*#{Regexp.escape(pat[:has_suffix])}\z/
56
- elsif pat[:has_prefix]
57
- regexps << /\A#{Regexp.escape(pat[:has_prefix])}/
58
- elsif pat[:has_suffix]
59
- regexps << /#{Regexp.escape(pat[:has_suffix])}\z/
60
- else
61
- raise Leftovers::ConfigError, "Invalid value for name #{pat}, "\
62
- 'valid keys are matches, has_prefix, has_suffix'
63
- end
64
- else
65
- raise Leftovers::ConfigError, "Invalid value type for name #{pat}, "\
66
- 'valid types are a String, or an object with keys matches, has_prefix, has_suffix'
67
- end
68
- end
69
-
70
- syms = syms.first if syms.length <= 1
71
-
72
- regexp = if regexps.empty?
73
- nil
74
- else
75
- Regexp.union(regexps).freeze
76
- end
77
-
78
- if syms && regexp
79
- new(syms, regexp)
80
- else
81
- syms || regexp || (
82
- default ? ::Leftovers::NameRule::TrueReturner : ::Leftovers::NameRule::FalseReturner
83
- )
84
- end
85
- end
86
-
87
- def initialize(syms, regexp)
88
- @syms = syms
89
- @regexp = regexp
90
-
91
- freeze
92
- end
93
-
94
- def ===(sym)
95
- @syms === sym || @regexp === sym
96
- end
97
- end
98
- end
@@ -1,82 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'name_rule'
4
- require_relative 'argument_rule'
5
- require 'fast_ignore'
6
-
7
- module Leftovers
8
- class Rule
9
- # :nocov:
10
- using ::Leftovers::SetCaseEq if defined?(::Leftovers::SetCaseEq)
11
- # :nocov:
12
-
13
- def self.wrap(rules)
14
- case rules
15
- when Array then rules.flat_map { |r| wrap(r) }
16
- when nil then [].freeze
17
- else new(**rules)
18
- end
19
- end
20
-
21
- attr_reader :skip
22
- alias_method :skip?, :skip
23
-
24
- def initialize( # rubocop:disable Metrics/ParameterLists, Metrics/PerceivedComplexity, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize
25
- name: nil,
26
- names: nil,
27
- calls: nil,
28
- call: nil,
29
- skip: false,
30
- defines: nil,
31
- define: nil,
32
- path: nil,
33
- paths: nil
34
- )
35
- raise Leftovers::ConfigError, 'Only use one of name/names' if name && names
36
- raise Leftovers::ConfigError, 'Only use one of path/paths' if path && paths
37
- raise Leftovers::ConfigError, 'Only use one of call/calls' if call && calls
38
- raise Leftovers::ConfigError, 'Only use one of define/defines' if define && defines
39
- if skip && (defines || calls || define || call)
40
- raise Leftovers::ConfigError, "skip can't exist with defines or calls"
41
- end
42
-
43
- @name_matcher = NameRule.wrap(name || names)
44
- if path || paths
45
- @path = FastIgnore.new(include_rules: path || paths, gitignore: false, root: Leftovers.pwd)
46
- end
47
- @skip = skip
48
-
49
- begin
50
- @calls = ArgumentRule.wrap(calls)
51
- rescue ArgumentError, Leftovers::ConfigError => e
52
- raise e, "#{e.message} for calls", e.backtrace
53
- end
54
-
55
- begin
56
- @defines = ArgumentRule.wrap(defines, definer: true)
57
- rescue ArgumentError, Leftovers::ConfigError => e
58
- raise e, "#{e.message} for defines", e.backtrace
59
- end
60
- rescue ArgumentError, Leftovers::ConfigError => e
61
- raise e, "#{e.message} for #{Array(name || names).map(&:to_s).join(', ')}", e.backtrace
62
- end
63
-
64
- def filename?(file)
65
- return true unless @path
66
-
67
- @path.allowed?(file)
68
- end
69
-
70
- def match?(name, file)
71
- @name_matcher === name && filename?(file)
72
- end
73
-
74
- def calls(node)
75
- @calls.flat_map { |m| m.matches(node) }
76
- end
77
-
78
- def definitions(node)
79
- @defines.flat_map { |m| m.matches(node) }
80
- end
81
- end
82
- end