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