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,169 +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 = CUSTOM_TRANSFORMS + RUBY_STRING_METHODS + ACTIVESUPPORT_STRING_METHODS
41
- def initialize(transforms)
42
- @transforms = prepare_transforms(transforms)
43
-
44
- freeze
45
- end
46
-
47
- def transform(original_string, method_node)
48
- string = original_string
49
- @transforms.each { |proc| string = proc.call(string, method_node) }
50
-
51
- string.to_sym
52
- end
53
-
54
- private
55
-
56
- def prepare_transforms(transforms) # rubocop:disable Metrics/MethodLength
57
- transforms.map do |key, value|
58
- unless VALID_TRANSFORMS.include?(key)
59
- raise Leftovers::ConfigError, <<~MESSAGE
60
- invalid transform key: (#{key}: #{value})
61
- Valid transform keys are #{VALID_TRANSFORMS.join(', ')}
62
- MESSAGE
63
- end
64
-
65
- key, value = prepare_hash_value(key, value) if value.is_a?(Hash)
66
-
67
- instance_variable_set(:"@#{key}", value.freeze)
68
- method(key)
69
- end
70
- end
71
-
72
- HASH_VALUE_TRANSFORMS = %i{add_prefix add_suffix}.freeze
73
- HASH_VALUE_KEYS = %i{from_argument joiner}.freeze
74
- def prepare_hash_value(method, hash) # rubocop:disable Metrics/MethodLength
75
- raise Leftovers::ConfigError, <<~MESSAGE unless HASH_VALUE_TRANSFORMS.include?(method)
76
- invalid transform value (#{method}: #{hash.inspect}).
77
- Hash values are only valid for #{HASH_VALUE_TRANSFORMS.join(', ')}
78
- MESSAGE
79
-
80
- hash = hash.map do |k, v|
81
- raise Leftovers::ConfigError, <<~MESSAGE unless HASH_VALUE_KEYS.include?(k)
82
- invalid transform value argument (#{method}: { #{k}: #{v} }).
83
- Valid keys are #{HASH_VALUE_KEYS.join(', ')}
84
- MESSAGE
85
-
86
- [k, (v.respond_to?(:to_sym) ? v.to_sym : v)]
87
- end.to_h
88
-
89
- ["#{method}_dynamic", hash]
90
- end
91
-
92
- RUBY_STRING_METHODS.each do |method|
93
- class_eval <<~RUBY, __FILE__, __LINE__ + 1
94
- def #{method}(string, _method_node)
95
- string.#{method}
96
- end
97
- RUBY
98
- end
99
-
100
- # leftovers:call activesupport_available?
101
- ACTIVESUPPORT_STRING_METHODS.each do |method|
102
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
103
- def #{method}(string, _method_node)
104
- return string unless activesupport_available?(:#{method})
105
-
106
- string.#{method}
107
- end
108
- RUBY
109
- end
110
-
111
- def original(string, _method_node)
112
- string
113
- end
114
-
115
- def delete_prefix(string, _method_node)
116
- string.delete_prefix(@delete_prefix)
117
- end
118
-
119
- def delete_suffix(string, _method_node)
120
- string.delete_suffix(@delete_suffix)
121
- end
122
-
123
- def delete_before(string, _method_node)
124
- string.split(@delete_before, 2)[1] || string
125
- end
126
-
127
- def delete_after(string, _method_node)
128
- string.split(@delete_after, 2).first || string
129
- end
130
-
131
- def replace_with(_string, _method_node)
132
- @replace_with
133
- end
134
-
135
- def add_prefix(string, _method_node)
136
- "#{@add_prefix}#{string}"
137
- end
138
-
139
- def add_suffix(string, _method_node)
140
- "#{string}#{@add_suffix}"
141
- end
142
-
143
- def add_prefix_dynamic(string, method_node)
144
- prefix = dynamic_value(@add_prefix_dynamic, method_node)
145
- "#{prefix}#{@add_prefix_dynamic[:joiner] if prefix}#{string}"
146
- end
147
-
148
- def add_suffix_dynamic(string, method_node)
149
- suffix = dynamic_value(@add_suffix_dynamic, method_node)
150
- "#{string}#{@add_suffix_dynamic[:joiner] if suffix}#{suffix}"
151
- end
152
-
153
- def dynamic_value(value, method_node)
154
- method_node[value[:from_argument]] if value[:from_argument]
155
- end
156
-
157
- def activesupport_available?(method) # rubocop:disable Metrics/MethodLength
158
- message = <<~MESSAGE
159
- Tried transforming a string using an activesupport method (#{method}), but the activesupport gem was not available
160
- `gem install activesupport`
161
- MESSAGE
162
- Leftovers.try_require('active_support/core_ext/string', message: message)
163
- Leftovers.try_require('active_support/inflections', message: message)
164
- Leftovers.try_require(::File.join(Leftovers.pwd, 'config', 'initializers', 'inflections.rb'))
165
-
166
- defined?(ActiveSupport)
167
- end
168
- end
169
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- class ValueRule
5
- def initialize(values) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity
6
- literal_values = Set.new
7
- value_types = Set.new
8
-
9
- Leftovers.each_or_self(values) do |value|
10
- case value
11
- when Hash
12
- raise Leftovers::ConfigError, "invalid value #{value.inspect}" unless value[:type]
13
-
14
- value_types.merge(
15
- Array(value[:type]).map do |v|
16
- case v
17
- when 'String' then :str
18
- when 'Symbol' then :sym
19
- when 'Integer' then :int
20
- else v.to_s.downcase.to_sym
21
- end
22
- end
23
- )
24
- else
25
- literal_values << value
26
- end
27
- end
28
-
29
- if literal_values.length <= 1
30
- @literal_value = literal_values.first
31
- @literal_values = nil
32
- else
33
- @literal_value = nil
34
- @literal_values = literal_values
35
- end
36
-
37
- if value_types.length <= 1
38
- @value_type = value_types.first
39
- @value_types = nil
40
- else
41
- @value_type = nil
42
- @value_types = value_types
43
- end
44
-
45
- freeze
46
- end
47
-
48
- def match?(value_node) # rubocop:disable Metrics/CyclomaticComplexity
49
- return true if @value_type&.== value_node.type
50
- return true if @value_types&.include?(value_node.type)
51
- return false unless (@literal_value || @literal_values) && value_node.scalar?
52
- return true if @literal_value&.== value_node.to_scalar_value
53
-
54
- @literal_values&.include?(value_node.to_scalar_value)
55
- end
56
- end
57
- end