leftovers 0.8.0 → 0.9.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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/README.md +7 -7
  4. data/docs/Configuration.md +141 -32
  5. data/docs/Custom-Precompilers.md +6 -0
  6. data/leftovers.gemspec +2 -1
  7. data/lib/config/actioncable.yml +36 -0
  8. data/lib/config/actionmailbox.yml +28 -0
  9. data/lib/config/actionmailer.yml +87 -11
  10. data/lib/config/actionpack.yml +130 -34
  11. data/lib/config/actiontext.yml +56 -0
  12. data/lib/config/actionview.yml +194 -44
  13. data/lib/config/activejob.yml +15 -8
  14. data/lib/config/activemodel.yml +175 -18
  15. data/lib/config/activerecord.yml +397 -86
  16. data/lib/config/activestorage.yml +26 -0
  17. data/lib/config/activesupport.yml +167 -24
  18. data/lib/config/leftovers.yml +48 -0
  19. data/lib/config/rails.yml +7 -3
  20. data/lib/config/railties.yml +7 -0
  21. data/lib/config/ruby.yml +438 -83
  22. data/lib/config/test-unit.yml +8 -0
  23. data/lib/leftovers/ast/array_node.rb +12 -0
  24. data/lib/leftovers/ast/block_node.rb +12 -0
  25. data/lib/leftovers/ast/builder.rb +24 -5
  26. data/lib/leftovers/ast/casgn_node.rb +20 -0
  27. data/lib/leftovers/ast/const_node.rb +15 -0
  28. data/lib/leftovers/ast/def_node.rb +15 -0
  29. data/lib/leftovers/ast/defs_node.rb +15 -0
  30. data/lib/leftovers/ast/false_node.rb +24 -0
  31. data/lib/leftovers/ast/has_arguments.rb +31 -0
  32. data/lib/leftovers/ast/hash_node.rb +17 -0
  33. data/lib/leftovers/ast/module_node.rb +16 -0
  34. data/lib/leftovers/ast/nil_node.rb +23 -0
  35. data/lib/leftovers/ast/node.rb +33 -90
  36. data/lib/leftovers/ast/numeric_node.rb +22 -0
  37. data/lib/leftovers/ast/send_node.rb +25 -0
  38. data/lib/leftovers/ast/str_node.rb +24 -0
  39. data/lib/leftovers/ast/sym_node.rb +25 -0
  40. data/lib/leftovers/ast/true_node.rb +24 -0
  41. data/lib/leftovers/ast/var_node.rb +14 -0
  42. data/lib/leftovers/ast/vasgn_node.rb +20 -0
  43. data/lib/leftovers/ast.rb +18 -0
  44. data/lib/leftovers/cli.rb +7 -1
  45. data/lib/leftovers/comparable_instance.rb +18 -0
  46. data/lib/leftovers/config_loader/argument_position_schema.rb +3 -1
  47. data/lib/leftovers/config_loader/array_schema.rb +53 -0
  48. data/lib/leftovers/config_loader/document_schema.rb +3 -2
  49. data/lib/leftovers/config_loader/dynamic_schema.rb +1 -0
  50. data/lib/leftovers/config_loader/has_value_schema.rb +4 -0
  51. data/lib/leftovers/config_loader/keyword_argument_schema.rb +13 -0
  52. data/lib/leftovers/config_loader/regexp_schema.rb +27 -0
  53. data/lib/leftovers/config_loader/rule_pattern_schema.rb +2 -0
  54. data/lib/leftovers/config_loader/scalar_value_schema.rb +8 -0
  55. data/lib/leftovers/config_loader/schema.rb +10 -0
  56. data/lib/leftovers/config_loader/string_enum_schema.rb +1 -1
  57. data/lib/leftovers/config_loader/string_pattern_schema.rb +1 -1
  58. data/lib/leftovers/config_loader/transform_schema.rb +12 -6
  59. data/lib/leftovers/config_loader/value_matcher_condition_schema.rb +13 -0
  60. data/lib/leftovers/config_loader/value_matcher_schema.rb +4 -1
  61. data/lib/leftovers/config_loader/value_or_array_schema.rb +2 -34
  62. data/lib/leftovers/config_loader/value_processor_schema.rb +2 -2
  63. data/lib/leftovers/config_loader.rb +11 -4
  64. data/lib/leftovers/definition_collection.rb +37 -0
  65. data/lib/leftovers/definition_node_set.rb +10 -2
  66. data/lib/leftovers/file.rb +1 -1
  67. data/lib/leftovers/file_collector/comments_processor.rb +1 -1
  68. data/lib/leftovers/file_collector/node_processor.rb +7 -7
  69. data/lib/leftovers/file_collector.rb +26 -32
  70. data/lib/leftovers/file_list.rb +3 -2
  71. data/lib/leftovers/matcher_builders/and.rb +26 -9
  72. data/lib/leftovers/matcher_builders/node.rb +32 -20
  73. data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +3 -1
  74. data/lib/leftovers/matcher_builders/node_pair_key.rb +16 -0
  75. data/lib/leftovers/matcher_builders/node_type.rb +9 -9
  76. data/lib/leftovers/matcher_builders/node_value.rb +23 -9
  77. data/lib/leftovers/matcher_builders/or.rb +22 -7
  78. data/lib/leftovers/matcher_builders/path.rb +3 -1
  79. data/lib/leftovers/matcher_builders.rb +1 -1
  80. data/lib/leftovers/matchers/all.rb +4 -0
  81. data/lib/leftovers/matchers/and.rb +4 -0
  82. data/lib/leftovers/matchers/any.rb +2 -0
  83. data/lib/leftovers/matchers/node_has_any_keyword_argument.rb +7 -4
  84. data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +5 -4
  85. data/lib/leftovers/matchers/node_has_positional_argument.rb +5 -1
  86. data/lib/leftovers/matchers/node_has_positional_argument_with_value.rb +6 -1
  87. data/lib/leftovers/matchers/node_has_receiver.rb +4 -0
  88. data/lib/leftovers/matchers/node_is_proc.rb +13 -0
  89. data/lib/leftovers/matchers/node_name.rb +9 -3
  90. data/lib/leftovers/matchers/node_pair_key.rb +23 -0
  91. data/lib/leftovers/matchers/node_pair_value.rb +7 -3
  92. data/lib/leftovers/matchers/node_path.rb +7 -3
  93. data/lib/leftovers/matchers/node_privacy.rb +7 -3
  94. data/lib/leftovers/matchers/node_scalar_value.rb +6 -1
  95. data/lib/leftovers/matchers/node_type.rb +7 -3
  96. data/lib/leftovers/matchers/not.rb +2 -0
  97. data/lib/leftovers/matchers/or.rb +2 -0
  98. data/lib/leftovers/matchers/path.rb +21 -0
  99. data/lib/leftovers/matchers.rb +3 -1
  100. data/lib/leftovers/merged_config.rb +26 -25
  101. data/lib/leftovers/parser.rb +7 -4
  102. data/lib/leftovers/precompilers.rb +5 -5
  103. data/lib/leftovers/processor_builders/action.rb +55 -37
  104. data/lib/leftovers/processor_builders/add_prefix.rb +18 -10
  105. data/lib/leftovers/processor_builders/add_suffix.rb +18 -10
  106. data/lib/leftovers/processor_builders/argument.rb +28 -11
  107. data/lib/leftovers/processor_builders/dynamic.rb +37 -31
  108. data/lib/leftovers/processor_builders/each.rb +82 -10
  109. data/lib/leftovers/processor_builders/itself.rb +2 -2
  110. data/lib/leftovers/processor_builders/keyword.rb +7 -6
  111. data/lib/leftovers/processor_builders/keyword_argument.rb +4 -2
  112. data/lib/leftovers/processor_builders/receiver.rb +13 -0
  113. data/lib/leftovers/processor_builders/transform.rb +55 -44
  114. data/lib/leftovers/processor_builders/transform_chain.rb +1 -1
  115. data/lib/leftovers/processor_builders/transform_set.rb +9 -29
  116. data/lib/leftovers/processor_builders/value.rb +4 -4
  117. data/lib/leftovers/processor_builders.rb +1 -3
  118. data/lib/leftovers/processors/add_call.rb +14 -0
  119. data/lib/leftovers/processors/add_definition_node.rb +16 -0
  120. data/lib/leftovers/processors/add_dynamic_prefix.rb +29 -0
  121. data/lib/leftovers/processors/add_dynamic_suffix.rb +29 -0
  122. data/lib/leftovers/{value_processors → processors}/add_prefix.rb +7 -3
  123. data/lib/leftovers/{value_processors → processors}/add_suffix.rb +7 -3
  124. data/lib/leftovers/processors/append_sym.rb +13 -0
  125. data/lib/leftovers/{value_processors → processors}/camelize.rb +7 -3
  126. data/lib/leftovers/{value_processors → processors}/capitalize.rb +7 -3
  127. data/lib/leftovers/{value_processors → processors}/deconstantize.rb +7 -3
  128. data/lib/leftovers/{value_processors → processors}/delete_after.rb +9 -5
  129. data/lib/leftovers/processors/delete_after_last.rb +26 -0
  130. data/lib/leftovers/processors/delete_before.rb +27 -0
  131. data/lib/leftovers/processors/delete_before_last.rb +27 -0
  132. data/lib/leftovers/{value_processors → processors}/delete_prefix.rb +7 -3
  133. data/lib/leftovers/{value_processors → processors}/delete_suffix.rb +7 -3
  134. data/lib/leftovers/{value_processors → processors}/demodulize.rb +7 -3
  135. data/lib/leftovers/{value_processors → processors}/downcase.rb +7 -3
  136. data/lib/leftovers/processors/each.rb +25 -0
  137. data/lib/leftovers/processors/each_for_definition_set.rb +33 -0
  138. data/lib/leftovers/processors/each_keyword.rb +29 -0
  139. data/lib/leftovers/processors/each_keyword_argument.rb +29 -0
  140. data/lib/leftovers/processors/each_positional_argument.rb +27 -0
  141. data/lib/leftovers/processors/each_positional_argument_from.rb +30 -0
  142. data/lib/leftovers/processors/eval.rb +16 -0
  143. data/lib/leftovers/processors/itself.rb +21 -0
  144. data/lib/leftovers/processors/keyword_argument.rb +30 -0
  145. data/lib/leftovers/processors/match_current_node.rb +26 -0
  146. data/lib/leftovers/processors/match_matched_node.rb +26 -0
  147. data/lib/leftovers/{value_processors → processors}/parameterize.rb +7 -3
  148. data/lib/leftovers/{value_processors → processors}/placeholder.rb +5 -4
  149. data/lib/leftovers/{value_processors → processors}/pluralize.rb +7 -3
  150. data/lib/leftovers/{value_processors → processors}/positional_argument.rb +8 -6
  151. data/lib/leftovers/processors/receiver.rb +24 -0
  152. data/lib/leftovers/{value_processors → processors}/replace_value.rb +7 -3
  153. data/lib/leftovers/processors/set_default_privacy.rb +21 -0
  154. data/lib/leftovers/processors/set_privacy.rb +23 -0
  155. data/lib/leftovers/{value_processors → processors}/singularize.rb +7 -3
  156. data/lib/leftovers/{value_processors → processors}/split.rb +8 -4
  157. data/lib/leftovers/{value_processors → processors}/swapcase.rb +7 -3
  158. data/lib/leftovers/{value_processors → processors}/titleize.rb +7 -3
  159. data/lib/leftovers/{value_processors → processors}/underscore.rb +7 -3
  160. data/lib/leftovers/{value_processors → processors}/upcase.rb +7 -3
  161. data/lib/leftovers/processors.rb +49 -0
  162. data/lib/leftovers/version.rb +1 -1
  163. data/lib/leftovers.rb +3 -12
  164. metadata +97 -52
  165. data/lib/leftovers/dynamic_processors/call.rb +0 -22
  166. data/lib/leftovers/dynamic_processors/call_definition.rb +0 -34
  167. data/lib/leftovers/dynamic_processors/definition.rb +0 -27
  168. data/lib/leftovers/dynamic_processors/each.rb +0 -19
  169. data/lib/leftovers/dynamic_processors/null.rb +0 -9
  170. data/lib/leftovers/dynamic_processors/set_default_privacy.rb +0 -18
  171. data/lib/leftovers/dynamic_processors/set_privacy.rb +0 -23
  172. data/lib/leftovers/dynamic_processors.rb +0 -13
  173. data/lib/leftovers/matcher_builders/node_pair_name.rb +0 -18
  174. data/lib/leftovers/matchers/predicate.rb +0 -19
  175. data/lib/leftovers/processor_builders/each_action.rb +0 -51
  176. data/lib/leftovers/processor_builders/each_dynamic.rb +0 -50
  177. data/lib/leftovers/processor_builders/each_for_definition_set.rb +0 -40
  178. data/lib/leftovers/value_processors/add_dynamic_prefix.rb +0 -24
  179. data/lib/leftovers/value_processors/add_dynamic_suffix.rb +0 -24
  180. data/lib/leftovers/value_processors/delete_before.rb +0 -22
  181. data/lib/leftovers/value_processors/each.rb +0 -21
  182. data/lib/leftovers/value_processors/each_for_definition_set.rb +0 -23
  183. data/lib/leftovers/value_processors/each_keyword.rb +0 -27
  184. data/lib/leftovers/value_processors/each_keyword_argument.rb +0 -27
  185. data/lib/leftovers/value_processors/each_positional_argument.rb +0 -25
  186. data/lib/leftovers/value_processors/itself.rb +0 -17
  187. data/lib/leftovers/value_processors/keyword.rb +0 -28
  188. data/lib/leftovers/value_processors/keyword_argument.rb +0 -28
  189. data/lib/leftovers/value_processors/return_definition_node.rb +0 -14
  190. data/lib/leftovers/value_processors/return_sym.rb +0 -14
  191. data/lib/leftovers/value_processors.rb +0 -40
@@ -7,7 +7,7 @@ module Leftovers
7
7
  def build(transforms, next_transform)
8
8
  case transforms
9
9
  when ::Hash then build_from_hash(transforms, next_transform)
10
- when ::String
10
+ when ::Symbol
11
11
  ::Leftovers::ProcessorBuilders::Transform.build(transforms, true, next_transform)
12
12
  # :nocov:
13
13
  else raise Leftovers::UnexpectedCase, "Unhandled value #{transforms.inspect}"
@@ -4,15 +4,11 @@ module Leftovers
4
4
  module ProcessorBuilders
5
5
  module TransformSet
6
6
  class << self
7
- def build(transforms, action)
8
- each_builder(action).each_or_self(transforms) do |transform|
7
+ def build(transforms, final_processor)
8
+ each_builder(final_processor).each_or_self(transforms) do |transform|
9
9
  case transform
10
- when ::Hash
11
- next build(transform[:transforms], action) if transform[:transforms]
12
-
13
- ::Leftovers::ProcessorBuilders::TransformChain.build(transform, build_final(action))
14
- when ::String
15
- ::Leftovers::ProcessorBuilders::TransformChain.build(transform, build_final(action))
10
+ when ::Hash, ::Symbol
11
+ ::Leftovers::ProcessorBuilders::TransformChain.build(transform, final_processor)
16
12
  # :nocov:
17
13
  else raise Leftovers::UnexpectedCase, "Unhandled value #{transform.inspect}"
18
14
  # :nocov:
@@ -20,29 +16,13 @@ module Leftovers
20
16
  end
21
17
  end
22
18
 
23
- def build_final(action)
24
- case action
25
- when :sym
26
- ::Leftovers::ValueProcessors::ReturnSym
27
- when :definition_node
28
- ::Leftovers::ValueProcessors::ReturnDefinitionNode
29
- # :nocov:
30
- else raise Leftovers::UnexpectedCase, "Unhandled value #{action.inspect}"
31
- # :nocov:
32
- end
33
- end
34
-
35
19
  private
36
20
 
37
- def each_builder(action)
38
- case action
39
- when :sym
40
- ::Leftovers::ProcessorBuilders::Each
41
- when :definition_node
42
- ::Leftovers::ProcessorBuilders::EachForDefinitionSet
43
- # :nocov:
44
- else raise Leftovers::UnexpectedCase, "Unhandled value #{action.inspect}"
45
- # :nocov:
21
+ def each_builder(final_processor)
22
+ if final_processor == ::Leftovers::Processors::AddDefinitionNode
23
+ ::Leftovers::ProcessorBuilders::Each[:each_for_definition_set]
24
+ else
25
+ ::Leftovers::ProcessorBuilders::Each[:each]
46
26
  end
47
27
  end
48
28
  end
@@ -3,10 +3,10 @@
3
3
  module Leftovers
4
4
  module ProcessorBuilders
5
5
  module Value
6
- def self.build(value, then_processor)
7
- return unless value && then_processor
8
-
9
- ::Leftovers::ValueProcessors::ReplaceValue.new(value, then_processor)
6
+ def self.build(values, then_processor)
7
+ ::Leftovers::ProcessorBuilders::Each.each_or_self(values) do |value|
8
+ ::Leftovers::Processors::ReplaceValue.new(value, then_processor)
9
+ end
10
10
  end
11
11
  end
12
12
  end
@@ -7,13 +7,11 @@ module Leftovers
7
7
  autoload(:AddSuffix, "#{__dir__}/processor_builders/add_suffix")
8
8
  autoload(:Argument, "#{__dir__}/processor_builders/argument")
9
9
  autoload(:Dynamic, "#{__dir__}/processor_builders/dynamic")
10
- autoload(:EachAction, "#{__dir__}/processor_builders/each_action")
11
- autoload(:EachDynamic, "#{__dir__}/processor_builders/each_dynamic")
12
- autoload(:EachForDefinitionSet, "#{__dir__}/processor_builders/each_for_definition_set")
13
10
  autoload(:Each, "#{__dir__}/processor_builders/each")
14
11
  autoload(:Itself, "#{__dir__}/processor_builders/itself")
15
12
  autoload(:Keyword, "#{__dir__}/processor_builders/keyword")
16
13
  autoload(:KeywordArgument, "#{__dir__}/processor_builders/keyword_argument")
14
+ autoload(:Receiver, "#{__dir__}/processor_builders/receiver")
17
15
  autoload(:TransformChain, "#{__dir__}/processor_builders/transform_chain")
18
16
  autoload(:TransformSet, "#{__dir__}/processor_builders/transform_set")
19
17
  autoload(:Transform, "#{__dir__}/processor_builders/transform")
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ module AddCall
6
+ def self.process(str, _current_node, _matched_node, acc)
7
+ return unless str
8
+ return if str.empty?
9
+
10
+ acc.calls << str.to_sym
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ # frozen-string-literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ module AddDefinitionNode
6
+ def self.process(str, current_node, _matched_node, acc)
7
+ return unless str
8
+ return if str.empty?
9
+
10
+ acc.add_definition_node Leftovers::DefinitionNode.new(current_node, name: str.to_sym)
11
+ end
12
+
13
+ freeze
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ class AddDynamicPrefix
6
+ include ComparableInstance
7
+
8
+ def initialize(prefix_processor, then_processor)
9
+ @prefix_processor = prefix_processor
10
+ @then_processor = then_processor
11
+
12
+ freeze
13
+ end
14
+
15
+ def process(str, current_node, matched_node, acc)
16
+ return unless str
17
+
18
+ prefixes = []
19
+ @prefix_processor.process(nil, matched_node, matched_node, prefixes)
20
+
21
+ prefixes.each do |prefix|
22
+ @then_processor.process("#{prefix}#{str}", current_node, matched_node, acc)
23
+ end
24
+ end
25
+
26
+ freeze
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ class AddDynamicSuffix
6
+ include ComparableInstance
7
+
8
+ def initialize(suffix_processor, then_processor)
9
+ @suffix_processor = suffix_processor
10
+ @then_processor = then_processor
11
+
12
+ freeze
13
+ end
14
+
15
+ def process(str, current_node, matched_node, acc)
16
+ return unless str
17
+
18
+ suffixes = []
19
+ @suffix_processor.process(nil, matched_node, matched_node, suffixes)
20
+
21
+ suffixes.each do |suffix|
22
+ @then_processor.process("#{str}#{suffix}", current_node, matched_node, acc)
23
+ end
24
+ end
25
+
26
+ freeze
27
+ end
28
+ end
29
+ end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class AddPrefix
6
+ include ComparableInstance
7
+
6
8
  def initialize(prefix, then_processor)
7
9
  @prefix = prefix
8
10
  @then_processor = then_processor
@@ -10,11 +12,13 @@ module Leftovers
10
12
  freeze
11
13
  end
12
14
 
13
- def process(str, node, method_node)
15
+ def process(str, current_node, matched_node, acc)
14
16
  return unless str
15
17
 
16
- @then_processor.process("#{@prefix}#{str}", node, method_node)
18
+ @then_processor.process("#{@prefix}#{str}", current_node, matched_node, acc)
17
19
  end
20
+
21
+ freeze
18
22
  end
19
23
  end
20
24
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class AddSuffix
6
+ include ComparableInstance
7
+
6
8
  def initialize(suffix, then_processor)
7
9
  @suffix = suffix
8
10
  @then_processor = then_processor
@@ -10,11 +12,13 @@ module Leftovers
10
12
  freeze
11
13
  end
12
14
 
13
- def process(str, node, method_node)
15
+ def process(str, current_node, matched_node, acc)
14
16
  return unless str
15
17
 
16
- @then_processor.process("#{str}#{@suffix}", node, method_node)
18
+ @then_processor.process("#{str}#{@suffix}", current_node, matched_node, acc)
17
19
  end
20
+
21
+ freeze
18
22
  end
19
23
  end
20
24
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ module AppendSym
6
+ def self.process(str, _current_node, _matched_node, acc)
7
+ return unless str
8
+
9
+ acc << str.to_sym
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,24 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class Camelize
6
+ include ComparableInstance
7
+
6
8
  def initialize(then_processor)
7
9
  @then_processor = then_processor
8
10
 
9
11
  freeze
10
12
  end
11
13
 
12
- def process(str, node, method_node)
14
+ def process(str, current_node, matched_node, acc)
13
15
  return unless str
14
16
 
15
- @then_processor.process(str.camelize, node, method_node)
17
+ @then_processor.process(str.camelize, current_node, matched_node, acc)
16
18
  rescue NoMethodError
17
19
  Leftovers.error <<~MESSAGE
18
20
  Tried using the String#camelize method, but the activesupport gem was not available and/or not required
19
21
  `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
22
  MESSAGE
21
23
  end
24
+
25
+ freeze
22
26
  end
23
27
  end
24
28
  end
@@ -1,19 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class Capitalize
6
+ include ComparableInstance
7
+
6
8
  def initialize(then_processor)
7
9
  @then_processor = then_processor
8
10
 
9
11
  freeze
10
12
  end
11
13
 
12
- def process(str, node, method_node)
14
+ def process(str, current_node, matched_node, acc)
13
15
  return unless str
14
16
 
15
- @then_processor.process(str.capitalize, node, method_node)
17
+ @then_processor.process(str.capitalize, current_node, matched_node, acc)
16
18
  end
19
+
20
+ freeze
17
21
  end
18
22
  end
19
23
  end
@@ -1,24 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class Deconstantize
6
+ include ComparableInstance
7
+
6
8
  def initialize(then_processor)
7
9
  @then_processor = then_processor
8
10
 
9
11
  freeze
10
12
  end
11
13
 
12
- def process(str, node, method_node)
14
+ def process(str, current_node, matched_node, acc)
13
15
  return unless str
14
16
 
15
- @then_processor.process(str.deconstantize, node, method_node)
17
+ @then_processor.process(str.deconstantize, current_node, matched_node, acc)
16
18
  rescue NoMethodError
17
19
  Leftovers.error <<~MESSAGE
18
20
  Tried using the String#deconstantize method, but the activesupport gem was not available and/or not required
19
21
  `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
22
  MESSAGE
21
23
  end
24
+
25
+ freeze
22
26
  end
23
27
  end
24
28
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class DeleteAfter
6
+ include ComparableInstance
7
+
6
8
  def initialize(delete_after, then_processor)
7
9
  @delete_after = delete_after
8
10
  @then_processor = then_processor
@@ -10,13 +12,15 @@ module Leftovers
10
12
  freeze
11
13
  end
12
14
 
13
- def process(str, node, method_node)
15
+ def process(str, current_node, matched_node, acc)
14
16
  return unless str
15
17
 
16
- # TODO: investigate index
17
- str = str.split(@delete_after, 2).first || str
18
- @then_processor.process(str, node, method_node)
18
+ index = str.index(@delete_after)
19
+ str = str[0...index] if index
20
+ @then_processor.process(str, current_node, matched_node, acc)
19
21
  end
22
+
23
+ freeze
20
24
  end
21
25
  end
22
26
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ class DeleteAfterLast
6
+ include ComparableInstance
7
+
8
+ def initialize(delete_after, then_processor)
9
+ @delete_after = delete_after
10
+ @then_processor = then_processor
11
+
12
+ freeze
13
+ end
14
+
15
+ def process(str, current_node, matched_node, acc)
16
+ return unless str
17
+
18
+ index = str.rindex(@delete_after)
19
+ str = str[0...index] if index
20
+ @then_processor.process(str, current_node, matched_node, acc)
21
+ end
22
+
23
+ freeze
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ class DeleteBefore
6
+ include ComparableInstance
7
+
8
+ def initialize(delete_before, then_processor)
9
+ @delete_before = delete_before
10
+ @delete_before_length = delete_before.length
11
+ @then_processor = then_processor
12
+
13
+ freeze
14
+ end
15
+
16
+ def process(str, current_node, matched_node, acc)
17
+ return unless str
18
+
19
+ index = str.index(@delete_before)
20
+ str = str[(index + @delete_before_length)..-1] if index
21
+ @then_processor.process(str, current_node, matched_node, acc)
22
+ end
23
+
24
+ freeze
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ class DeleteBeforeLast
6
+ include ComparableInstance
7
+
8
+ def initialize(delete_before, then_processor)
9
+ @delete_before = delete_before
10
+ @delete_before_length = delete_before.length
11
+ @then_processor = then_processor
12
+
13
+ freeze
14
+ end
15
+
16
+ def process(str, current_node, matched_node, acc)
17
+ return unless str
18
+
19
+ index = str.rindex(@delete_before)
20
+ str = str[(index + @delete_before_length)..-1] if index
21
+ @then_processor.process(str, current_node, matched_node, acc)
22
+ end
23
+
24
+ freeze
25
+ end
26
+ end
27
+ end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class DeletePrefix
6
+ include ComparableInstance
7
+
6
8
  def initialize(prefix, then_processor)
7
9
  @prefix = prefix
8
10
  @then_processor = then_processor
@@ -10,11 +12,13 @@ module Leftovers
10
12
  freeze
11
13
  end
12
14
 
13
- def process(str, node, method_node)
15
+ def process(str, current_node, matched_node, acc)
14
16
  return unless str
15
17
 
16
- @then_processor.process(str.delete_prefix(@prefix), node, method_node)
18
+ @then_processor.process(str.delete_prefix(@prefix), current_node, matched_node, acc)
17
19
  end
20
+
21
+ freeze
18
22
  end
19
23
  end
20
24
  end
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class DeleteSuffix
6
+ include ComparableInstance
7
+
6
8
  def initialize(suffix, then_processor)
7
9
  @suffix = suffix
8
10
  @then_processor = then_processor
@@ -10,11 +12,13 @@ module Leftovers
10
12
  freeze
11
13
  end
12
14
 
13
- def process(str, node, method_node)
15
+ def process(str, current_node, matched_node, acc)
14
16
  return unless str
15
17
 
16
- @then_processor.process(str.delete_suffix(@suffix), node, method_node)
18
+ @then_processor.process(str.delete_suffix(@suffix), current_node, matched_node, acc)
17
19
  end
20
+
21
+ freeze
18
22
  end
19
23
  end
20
24
  end
@@ -1,24 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class Demodulize
6
+ include ComparableInstance
7
+
6
8
  def initialize(then_processor)
7
9
  @then_processor = then_processor
8
10
 
9
11
  freeze
10
12
  end
11
13
 
12
- def process(str, node, method_node)
14
+ def process(str, current_node, matched_node, acc)
13
15
  return unless str
14
16
 
15
- @then_processor.process(str.demodulize, node, method_node)
17
+ @then_processor.process(str.demodulize, current_node, matched_node, acc)
16
18
  rescue NoMethodError
17
19
  Leftovers.error <<~MESSAGE
18
20
  Tried using the String#demodulize method, but the activesupport gem was not available and/or not required
19
21
  `gem install activesupport`, and/or add `requires: ['active_support', 'active_support/core_ext/string']` to your .leftovers.yml
20
22
  MESSAGE
21
23
  end
24
+
25
+ freeze
22
26
  end
23
27
  end
24
28
  end
@@ -1,19 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Leftovers
4
- module ValueProcessors
4
+ module Processors
5
5
  class Downcase
6
+ include ComparableInstance
7
+
6
8
  def initialize(then_processor)
7
9
  @then_processor = then_processor
8
10
 
9
11
  freeze
10
12
  end
11
13
 
12
- def process(str, node, method_node)
14
+ def process(str, current_node, matched_node, acc)
13
15
  return unless str
14
16
 
15
- @then_processor.process(str.downcase, node, method_node)
17
+ @then_processor.process(str.downcase, current_node, matched_node, acc)
16
18
  end
19
+
20
+ freeze
17
21
  end
18
22
  end
19
23
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ class Each
6
+ include ComparableInstance
7
+
8
+ attr_reader :processors
9
+
10
+ def initialize(processors)
11
+ @processors = processors
12
+
13
+ freeze
14
+ end
15
+
16
+ def process(str, current_node, matched_node, acc)
17
+ @processors.each do |processor|
18
+ processor.process(str, current_node, matched_node, acc)
19
+ end
20
+ end
21
+
22
+ freeze
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,33 @@
1
+ # frozen-string-literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ class EachForDefinitionSet
6
+ include ComparableInstance
7
+
8
+ attr_reader :processors
9
+
10
+ def initialize(processors)
11
+ @processors = processors
12
+
13
+ freeze
14
+ end
15
+
16
+ def process(str, current_node, matched_node, acc)
17
+ set = ::Leftovers::DefinitionNodeSet.new
18
+
19
+ @processors.each do |processor|
20
+ processor.process(str, current_node, matched_node, set)
21
+ end
22
+
23
+ if set.definitions.length == 1
24
+ acc.add_definition_node set.definitions.first
25
+ else
26
+ acc.add_definition_set set
27
+ end
28
+ end
29
+
30
+ freeze
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Leftovers
4
+ module Processors
5
+ class EachKeyword
6
+ include ComparableInstance
7
+
8
+ def initialize(then_processor)
9
+ @then_processor = then_processor
10
+
11
+ freeze
12
+ end
13
+
14
+ def process(_str, current_node, matched_node, acc)
15
+ kwargs = current_node.kwargs
16
+ return unless kwargs
17
+
18
+ kwargs.children.each do |pair|
19
+ next unless pair.type == :pair
20
+
21
+ key_node = pair.first
22
+ @then_processor.process(key_node.to_literal_s, key_node, matched_node, acc)
23
+ end
24
+ end
25
+
26
+ freeze
27
+ end
28
+ end
29
+ end