leftovers 0.7.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (227) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +39 -0
  3. data/README.md +8 -7
  4. data/docs/Configuration.md +187 -93
  5. data/docs/Custom-Precompilers.md +44 -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 -32
  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 +422 -89
  16. data/lib/config/activestorage.yml +26 -0
  17. data/lib/config/activesupport.yml +167 -24
  18. data/lib/config/haml.yml +4 -2
  19. data/lib/config/leftovers.yml +48 -0
  20. data/lib/config/rails.yml +7 -3
  21. data/lib/config/railties.yml +7 -0
  22. data/lib/config/ruby.yml +439 -95
  23. data/lib/config/slim.yml +4 -2
  24. data/lib/config/test-unit.yml +8 -0
  25. data/lib/leftovers/ast/array_node.rb +12 -0
  26. data/lib/leftovers/ast/block_node.rb +12 -0
  27. data/lib/leftovers/ast/builder.rb +24 -5
  28. data/lib/leftovers/ast/casgn_node.rb +20 -0
  29. data/lib/leftovers/ast/const_node.rb +15 -0
  30. data/lib/leftovers/ast/def_node.rb +15 -0
  31. data/lib/leftovers/ast/defs_node.rb +15 -0
  32. data/lib/leftovers/ast/false_node.rb +24 -0
  33. data/lib/leftovers/ast/has_arguments.rb +31 -0
  34. data/lib/leftovers/ast/hash_node.rb +17 -0
  35. data/lib/leftovers/ast/module_node.rb +16 -0
  36. data/lib/leftovers/ast/nil_node.rb +23 -0
  37. data/lib/leftovers/ast/node.rb +33 -90
  38. data/lib/leftovers/ast/numeric_node.rb +22 -0
  39. data/lib/leftovers/ast/send_node.rb +25 -0
  40. data/lib/leftovers/ast/str_node.rb +24 -0
  41. data/lib/leftovers/ast/sym_node.rb +25 -0
  42. data/lib/leftovers/ast/true_node.rb +24 -0
  43. data/lib/leftovers/ast/var_node.rb +14 -0
  44. data/lib/leftovers/ast/vasgn_node.rb +20 -0
  45. data/lib/leftovers/ast.rb +18 -0
  46. data/lib/leftovers/cli.rb +12 -1
  47. data/lib/leftovers/collector.rb +2 -1
  48. data/lib/leftovers/comparable_instance.rb +18 -0
  49. data/lib/leftovers/config.rb +2 -18
  50. data/lib/leftovers/config_loader/argument_position_schema.rb +5 -3
  51. data/lib/leftovers/config_loader/array_schema.rb +53 -0
  52. data/lib/leftovers/config_loader/attribute.rb +36 -10
  53. data/lib/leftovers/config_loader/built_in_precompiler_schema.rb +13 -0
  54. data/lib/leftovers/config_loader/document_schema.rb +33 -5
  55. data/lib/leftovers/config_loader/dynamic_schema.rb +1 -0
  56. data/lib/leftovers/config_loader/has_argument_schema.rb +2 -2
  57. data/lib/leftovers/config_loader/has_receiver_schema.rb +15 -0
  58. data/lib/leftovers/config_loader/has_value_schema.rb +7 -3
  59. data/lib/leftovers/config_loader/inherit_schema_attributes.rb +22 -0
  60. data/lib/leftovers/config_loader/keep_test_only_schema.rb +2 -2
  61. data/lib/leftovers/config_loader/keyword_argument_schema.rb +13 -0
  62. data/lib/leftovers/config_loader/object_schema.rb +33 -105
  63. data/lib/leftovers/config_loader/precompile_schema.rb +12 -0
  64. data/lib/leftovers/config_loader/precompiler_schema.rb +11 -0
  65. data/lib/leftovers/config_loader/privacy_processor_schema.rb +0 -2
  66. data/lib/leftovers/config_loader/regexp_schema.rb +27 -0
  67. data/lib/leftovers/config_loader/require_schema.rb +3 -3
  68. data/lib/leftovers/config_loader/rule_pattern_schema.rb +3 -1
  69. data/lib/leftovers/config_loader/scalar_value_schema.rb +8 -0
  70. data/lib/leftovers/config_loader/schema.rb +12 -0
  71. data/lib/leftovers/config_loader/string_enum_schema.rb +1 -1
  72. data/lib/leftovers/config_loader/string_pattern_schema.rb +3 -3
  73. data/lib/leftovers/config_loader/string_value_processor_schema.rb +2 -2
  74. data/lib/leftovers/config_loader/transform_schema.rb +10 -6
  75. data/lib/leftovers/config_loader/value_matcher_condition_schema.rb +13 -0
  76. data/lib/leftovers/config_loader/value_matcher_schema.rb +6 -3
  77. data/lib/leftovers/config_loader/value_or_array_schema.rb +2 -32
  78. data/lib/leftovers/config_loader/value_or_object_schema.rb +40 -0
  79. data/lib/leftovers/config_loader/value_processor_schema.rb +4 -4
  80. data/lib/leftovers/config_loader.rb +15 -3
  81. data/lib/leftovers/definition_collection.rb +37 -0
  82. data/lib/leftovers/definition_node.rb +8 -14
  83. data/lib/leftovers/definition_node_set.rb +10 -2
  84. data/lib/leftovers/file.rb +8 -54
  85. data/lib/leftovers/file_collector/comments_processor.rb +57 -0
  86. data/lib/leftovers/file_collector/node_processor.rb +131 -0
  87. data/lib/leftovers/file_collector.rb +56 -223
  88. data/lib/leftovers/file_list.rb +3 -2
  89. data/lib/leftovers/matcher_builders/and.rb +26 -9
  90. data/lib/leftovers/matcher_builders/and_not.rb +7 -5
  91. data/lib/leftovers/matcher_builders/name.rb +18 -17
  92. data/lib/leftovers/matcher_builders/node.rb +60 -34
  93. data/lib/leftovers/matcher_builders/node_has_argument.rb +48 -52
  94. data/lib/leftovers/matcher_builders/node_has_keyword_argument.rb +16 -11
  95. data/lib/leftovers/matcher_builders/node_has_positional_argument.rb +29 -15
  96. data/lib/leftovers/matcher_builders/node_has_receiver.rb +12 -3
  97. data/lib/leftovers/matcher_builders/node_pair_key.rb +16 -0
  98. data/lib/leftovers/matcher_builders/node_type.rb +10 -10
  99. data/lib/leftovers/matcher_builders/node_value.rb +46 -25
  100. data/lib/leftovers/matcher_builders/or.rb +64 -49
  101. data/lib/leftovers/matcher_builders/path.rb +3 -1
  102. data/lib/leftovers/matcher_builders/string_pattern.rb +1 -1
  103. data/lib/leftovers/matcher_builders.rb +1 -1
  104. data/lib/leftovers/matchers/all.rb +4 -0
  105. data/lib/leftovers/matchers/and.rb +4 -0
  106. data/lib/leftovers/matchers/any.rb +2 -0
  107. data/lib/leftovers/matchers/node_has_any_keyword_argument.rb +7 -4
  108. data/lib/leftovers/matchers/node_has_any_positional_argument_with_value.rb +5 -4
  109. data/lib/leftovers/matchers/node_has_any_receiver.rb +13 -0
  110. data/lib/leftovers/matchers/node_has_positional_argument.rb +5 -1
  111. data/lib/leftovers/matchers/node_has_positional_argument_with_value.rb +6 -1
  112. data/lib/leftovers/matchers/node_has_receiver.rb +4 -0
  113. data/lib/leftovers/matchers/node_is_proc.rb +13 -0
  114. data/lib/leftovers/matchers/node_name.rb +9 -3
  115. data/lib/leftovers/matchers/node_pair_key.rb +23 -0
  116. data/lib/leftovers/matchers/node_pair_value.rb +7 -3
  117. data/lib/leftovers/matchers/node_path.rb +7 -3
  118. data/lib/leftovers/matchers/node_privacy.rb +7 -3
  119. data/lib/leftovers/matchers/node_scalar_value.rb +6 -1
  120. data/lib/leftovers/matchers/node_type.rb +7 -3
  121. data/lib/leftovers/matchers/not.rb +2 -0
  122. data/lib/leftovers/matchers/or.rb +2 -0
  123. data/lib/leftovers/matchers/path.rb +21 -0
  124. data/lib/leftovers/matchers.rb +4 -1
  125. data/lib/leftovers/merged_config.rb +28 -47
  126. data/lib/leftovers/parser.rb +7 -4
  127. data/lib/leftovers/precompilers/erb.rb +22 -0
  128. data/lib/leftovers/precompilers/haml.rb +15 -0
  129. data/lib/leftovers/precompilers/json.rb +27 -0
  130. data/lib/leftovers/precompilers/precompiler.rb +28 -0
  131. data/lib/leftovers/precompilers/slim.rb +15 -0
  132. data/lib/leftovers/precompilers/yaml.rb +75 -0
  133. data/lib/leftovers/precompilers.rb +50 -0
  134. data/lib/leftovers/processor_builders/action.rb +69 -42
  135. data/lib/leftovers/processor_builders/add_prefix.rb +18 -10
  136. data/lib/leftovers/processor_builders/add_suffix.rb +18 -10
  137. data/lib/leftovers/processor_builders/argument.rb +28 -14
  138. data/lib/leftovers/processor_builders/dynamic.rb +37 -31
  139. data/lib/leftovers/processor_builders/each.rb +83 -11
  140. data/lib/leftovers/processor_builders/itself.rb +2 -2
  141. data/lib/leftovers/processor_builders/keyword.rb +9 -9
  142. data/lib/leftovers/processor_builders/keyword_argument.rb +4 -2
  143. data/lib/leftovers/processor_builders/receiver.rb +13 -0
  144. data/lib/leftovers/processor_builders/transform.rb +55 -44
  145. data/lib/leftovers/processor_builders/transform_chain.rb +16 -8
  146. data/lib/leftovers/processor_builders/transform_set.rb +16 -32
  147. data/lib/leftovers/processor_builders/value.rb +4 -4
  148. data/lib/leftovers/processor_builders.rb +1 -3
  149. data/lib/leftovers/processors/add_call.rb +14 -0
  150. data/lib/leftovers/processors/add_definition_node.rb +16 -0
  151. data/lib/leftovers/processors/add_dynamic_prefix.rb +29 -0
  152. data/lib/leftovers/processors/add_dynamic_suffix.rb +29 -0
  153. data/lib/leftovers/{value_processors → processors}/add_prefix.rb +7 -3
  154. data/lib/leftovers/{value_processors → processors}/add_suffix.rb +7 -3
  155. data/lib/leftovers/processors/append_sym.rb +13 -0
  156. data/lib/leftovers/{value_processors → processors}/camelize.rb +7 -3
  157. data/lib/leftovers/{value_processors → processors}/capitalize.rb +7 -3
  158. data/lib/leftovers/{value_processors → processors}/deconstantize.rb +7 -3
  159. data/lib/leftovers/{value_processors → processors}/delete_after.rb +9 -5
  160. data/lib/leftovers/processors/delete_after_last.rb +26 -0
  161. data/lib/leftovers/processors/delete_before.rb +27 -0
  162. data/lib/leftovers/processors/delete_before_last.rb +27 -0
  163. data/lib/leftovers/{value_processors → processors}/delete_prefix.rb +7 -3
  164. data/lib/leftovers/{value_processors → processors}/delete_suffix.rb +7 -3
  165. data/lib/leftovers/{value_processors → processors}/demodulize.rb +7 -3
  166. data/lib/leftovers/{value_processors → processors}/downcase.rb +7 -3
  167. data/lib/leftovers/processors/each.rb +25 -0
  168. data/lib/leftovers/processors/each_for_definition_set.rb +33 -0
  169. data/lib/leftovers/processors/each_keyword.rb +29 -0
  170. data/lib/leftovers/processors/each_keyword_argument.rb +29 -0
  171. data/lib/leftovers/processors/each_positional_argument.rb +27 -0
  172. data/lib/leftovers/processors/each_positional_argument_from.rb +30 -0
  173. data/lib/leftovers/processors/eval.rb +16 -0
  174. data/lib/leftovers/processors/itself.rb +21 -0
  175. data/lib/leftovers/{value_processors → processors}/keyword_argument.rb +9 -11
  176. data/lib/leftovers/processors/match_current_node.rb +26 -0
  177. data/lib/leftovers/processors/match_matched_node.rb +26 -0
  178. data/lib/leftovers/{value_processors → processors}/parameterize.rb +7 -3
  179. data/lib/leftovers/{value_processors → processors}/placeholder.rb +5 -4
  180. data/lib/leftovers/{value_processors → processors}/pluralize.rb +7 -3
  181. data/lib/leftovers/{value_processors → processors}/positional_argument.rb +8 -6
  182. data/lib/leftovers/processors/receiver.rb +24 -0
  183. data/lib/leftovers/{value_processors → processors}/replace_value.rb +7 -3
  184. data/lib/leftovers/processors/set_default_privacy.rb +21 -0
  185. data/lib/leftovers/processors/set_privacy.rb +23 -0
  186. data/lib/leftovers/{value_processors → processors}/singularize.rb +7 -3
  187. data/lib/leftovers/{value_processors → processors}/split.rb +8 -4
  188. data/lib/leftovers/{value_processors → processors}/swapcase.rb +7 -3
  189. data/lib/leftovers/{value_processors → processors}/titleize.rb +7 -3
  190. data/lib/leftovers/{value_processors → processors}/underscore.rb +7 -3
  191. data/lib/leftovers/{value_processors → processors}/upcase.rb +7 -3
  192. data/lib/leftovers/processors.rb +49 -0
  193. data/lib/leftovers/rake_task.rb +1 -1
  194. data/lib/leftovers/version.rb +1 -1
  195. data/lib/leftovers.rb +34 -8
  196. metadata +116 -58
  197. data/lib/leftovers/dynamic_processors/call.rb +0 -22
  198. data/lib/leftovers/dynamic_processors/call_definition.rb +0 -34
  199. data/lib/leftovers/dynamic_processors/definition.rb +0 -27
  200. data/lib/leftovers/dynamic_processors/each.rb +0 -19
  201. data/lib/leftovers/dynamic_processors/null.rb +0 -9
  202. data/lib/leftovers/dynamic_processors/set_default_privacy.rb +0 -18
  203. data/lib/leftovers/dynamic_processors/set_privacy.rb +0 -23
  204. data/lib/leftovers/dynamic_processors.rb +0 -13
  205. data/lib/leftovers/erb.rb +0 -20
  206. data/lib/leftovers/haml.rb +0 -21
  207. data/lib/leftovers/json.rb +0 -28
  208. data/lib/leftovers/matcher_builders/node_pair_name.rb +0 -18
  209. data/lib/leftovers/matchers/predicate.rb +0 -19
  210. data/lib/leftovers/processor_builders/each_action.rb +0 -51
  211. data/lib/leftovers/processor_builders/each_dynamic.rb +0 -54
  212. data/lib/leftovers/processor_builders/each_for_definition_set.rb +0 -36
  213. data/lib/leftovers/slim.rb +0 -21
  214. data/lib/leftovers/value_processors/add_dynamic_prefix.rb +0 -31
  215. data/lib/leftovers/value_processors/add_dynamic_suffix.rb +0 -31
  216. data/lib/leftovers/value_processors/delete_before.rb +0 -22
  217. data/lib/leftovers/value_processors/each.rb +0 -21
  218. data/lib/leftovers/value_processors/each_for_definition_set.rb +0 -26
  219. data/lib/leftovers/value_processors/each_keyword.rb +0 -27
  220. data/lib/leftovers/value_processors/each_keyword_argument.rb +0 -27
  221. data/lib/leftovers/value_processors/each_positional_argument.rb +0 -24
  222. data/lib/leftovers/value_processors/itself.rb +0 -17
  223. data/lib/leftovers/value_processors/keyword.rb +0 -32
  224. data/lib/leftovers/value_processors/return_definition_node.rb +0 -14
  225. data/lib/leftovers/value_processors/return_sym.rb +0 -14
  226. data/lib/leftovers/value_processors.rb +0 -40
  227. data/lib/leftovers/yaml.rb +0 -73
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module Haml
5
- module_function
6
-
7
- def precompile(file, name)
8
- return '' unless Leftovers.try_require('haml', message: <<~MESSAGE) # rubocop:disable Layout/EmptyLineAfterGuardClause
9
- Skipped parsing #{name.relative_path}, because the haml gem was not available
10
- `gem install haml`
11
- MESSAGE
12
-
13
- begin
14
- ::Haml::Engine.new(file).precompiled
15
- rescue ::Haml::SyntaxError => e
16
- Leftovers.warn "#{e.class}: #{e.message} #{name.relative_path}:#{e.line}"
17
- ''
18
- end
19
- end
20
- end
21
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'json'
4
-
5
- module Leftovers
6
- module JSON
7
- class << self
8
- def precompile(json, name)
9
- "__leftovers_document(#{to_ruby_argument(::JSON.parse(json))})"
10
- rescue ::JSON::ParserError => e
11
- Leftovers.warn "#{e.class}: (#{name.relative_path}): #{e.message}"
12
- ''
13
- end
14
-
15
- private
16
-
17
- def to_ruby_argument(value)
18
- ruby = value.inspect
19
- return ruby unless value.is_a?(Array)
20
-
21
- ruby.delete_prefix!('[')
22
- ruby.delete_suffix!(']')
23
-
24
- ruby
25
- end
26
- end
27
- end
28
- end
@@ -1,18 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Leftovers
4
- module MatcherBuilders
5
- module NodePairName
6
- def self.build(name_pattern)
7
- matcher = ::Leftovers::MatcherBuilders::Name.build(name_pattern)
8
-
9
- return unless matcher
10
-
11
- ::Leftovers::MatcherBuilders::And.build([
12
- ::Leftovers::Matchers::NodeType.new(:pair),
13
- ::Leftovers::Matchers::NodeName.new(matcher)
14
- ])
15
- end
16
- end
17
- end
18
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module Matchers
5
- class Predicate
6
- def initialize(predicate)
7
- @predicate = predicate
8
-
9
- freeze
10
- end
11
-
12
- def ===(node)
13
- node.send(@predicate)
14
- end
15
-
16
- freeze
17
- end
18
- end
19
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ProcessorBuilders
5
- module EachAction
6
- def self.each_or_self(value, &block)
7
- case value
8
- when nil then nil
9
- when Array then build(value.map(&block))
10
- else build([yield(value)])
11
- end
12
- end
13
-
14
- def self.build(processors)
15
- processors = compact(processors)
16
-
17
- case processors.length
18
- # :nocov:
19
- when 0 then raise
20
- # :nocov:
21
- when 1 then processors.first
22
- else ::Leftovers::ValueProcessors::Each.new(processors)
23
- end
24
- end
25
-
26
- def self.flatten(value) # rubocop:disable Metrics/MethodLength
27
- case value
28
- when ::Leftovers::ValueProcessors::Each
29
- ret = value.processors.map { |v| flatten(v) }
30
- ret.flatten!(1)
31
- ret
32
- when Array
33
- ret = value.map { |v| flatten(v) }
34
- ret.flatten!(1)
35
- ret
36
- else
37
- value
38
- end
39
- end
40
-
41
- def self.compact(processors)
42
- return processors if processors.length <= 1
43
-
44
- processors = flatten(processors)
45
- processors.compact!
46
-
47
- processors
48
- end
49
- end
50
- end
51
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ProcessorBuilders
5
- module EachDynamic
6
- def self.each_or_self(value, &block)
7
- case value
8
- when nil then ::Leftovers::DynamicProcessors::Null
9
- when Array then build(value.map(&block))
10
- else build([yield(value)])
11
- end
12
- end
13
-
14
- def self.build(processors)
15
- processors = compact(processors)
16
-
17
- case processors.length
18
- # :nocov:
19
- when 0 then raise
20
- # :nocov:
21
- when 1 then processors.first
22
- else ::Leftovers::DynamicProcessors::Each.new(processors)
23
- end
24
- end
25
-
26
- def self.flatten(value) # rubocop:disable Metrics/MethodLength
27
- case value
28
- when ::Leftovers::DynamicProcessors::Each
29
- ret = value.processors.map { |v| flatten(v) }
30
- ret.flatten!(1)
31
- ret
32
- when Array
33
- ret = value.map { |v| flatten(v) }
34
- ret.flatten!(1)
35
- ret
36
- else
37
- value
38
- end
39
- end
40
-
41
- def self.compact(processors)
42
- return processors if processors.length <= 1
43
-
44
- processors = flatten(processors)
45
-
46
- processors.reject! do |p|
47
- p == ::Leftovers::DynamicProcessors::Null
48
- end
49
-
50
- processors
51
- end
52
- end
53
- end
54
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ProcessorBuilders
5
- module EachForDefinitionSet
6
- def self.each_or_self(value, &block)
7
- case value
8
- # :nocov:
9
- when nil then raise
10
- # :nocov:
11
- when Array then build(value.map(&block))
12
- else build([yield(value)])
13
- end
14
- end
15
-
16
- def self.build(processors)
17
- processors = compact(processors)
18
-
19
- case processors.length
20
- # :nocov:
21
- when 0 then raise
22
- # :nocov:
23
- when 1 then processors.first
24
- else ::Leftovers::ValueProcessors::EachForDefinitionSet.new(processors)
25
- end
26
- end
27
-
28
- def self.compact(processors)
29
- processors.flatten!
30
- processors.compact!
31
-
32
- processors
33
- end
34
- end
35
- end
36
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module Slim
5
- module_function
6
-
7
- def precompile(file, name)
8
- return '' unless Leftovers.try_require('slim', message: <<~MESSAGE) # rubocop:disable Layout/EmptyLineAfterGuardClause
9
- Skipped parsing #{name.relative_path}, because the slim gem was not available
10
- `gem install slim`
11
- MESSAGE
12
-
13
- begin
14
- ::Slim::Engine.new(file: file).call(file)
15
- rescue ::Slim::Parser::SyntaxError => e
16
- Leftovers.warn "#{e.class}: \"#{e.error}\" #{name.relative_path}:#{e.lineno}:#{e.column}"
17
- ''
18
- end
19
- end
20
- end
21
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class AddDynamicPrefix
6
- def initialize(prefix_processor, then_processor)
7
- @prefix_processor = prefix_processor
8
- @then_processor = then_processor
9
-
10
- freeze
11
- end
12
-
13
- def process(str, node, method_node) # rubocop:disable Metrics/MethodLength
14
- return unless str
15
-
16
- prefixes = @prefix_processor.process(nil, method_node, method_node)
17
- if prefixes.is_a?(Array)
18
- prefixes.flatten!
19
- prefixes.compact!
20
- prefixes.uniq!
21
-
22
- prefixes.map do |prefix|
23
- @then_processor.process("#{prefix}#{str}", node, method_node)
24
- end
25
- else
26
- @then_processor.process("#{prefixes}#{str}", node, method_node)
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class AddDynamicSuffix
6
- def initialize(suffix_processor, then_processor)
7
- @suffix_processor = suffix_processor
8
- @then_processor = then_processor
9
-
10
- freeze
11
- end
12
-
13
- def process(str, node, method_node) # rubocop:disable Metrics/MethodLength
14
- return unless str
15
-
16
- suffixes = @suffix_processor.process(nil, method_node, method_node)
17
- if suffixes.is_a?(Array)
18
- suffixes.flatten!
19
- suffixes.compact!
20
- suffixes.uniq!
21
-
22
- suffixes.map do |suffix|
23
- @then_processor.process("#{str}#{suffix}", node, method_node)
24
- end
25
- else
26
- @then_processor.process("#{str}#{suffixes}", node, method_node)
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class DeleteBefore
6
- def initialize(delete_before, then_processor)
7
- @delete_before = delete_before
8
- @then_processor = then_processor
9
-
10
- freeze
11
- end
12
-
13
- def process(str, node, method_node)
14
- return unless str
15
-
16
- # TODO: investigate index
17
- str = str.split(@delete_before, 2)[1] || str
18
- @then_processor.process(str, node, method_node)
19
- end
20
- end
21
- end
22
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class Each
6
- attr_reader :processors
7
-
8
- def initialize(processors)
9
- @processors = processors
10
-
11
- freeze
12
- end
13
-
14
- def process(str, node, method_node)
15
- @processors.flat_map do |processor|
16
- processor.process(str, node, method_node)
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,26 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class EachForDefinitionSet
6
- def initialize(then_processors)
7
- @then_processors = then_processors
8
-
9
- freeze
10
- end
11
-
12
- def process(str, node, method_node)
13
- definitions = @then_processors.map do |then_processor|
14
- then_processor.process(str, node, method_node)
15
- end
16
-
17
- definitions.flatten!
18
- definitions.compact!
19
-
20
- return definitions.first if definitions.length <= 1
21
-
22
- ::Leftovers::DefinitionNodeSet.new(definitions)
23
- end
24
- end
25
- end
26
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class EachKeyword
6
- def initialize(then_processor)
7
- @then_processor = then_processor
8
-
9
- freeze
10
- end
11
-
12
- def process(_str, node, method_node)
13
- kwargs = node.kwargs
14
- return unless kwargs
15
-
16
- kwargs.children.map do |pair|
17
- next unless pair.type == :pair
18
-
19
- argument_node = pair.first
20
- str = argument_node.to_s if argument_node.string_or_symbol?
21
-
22
- @then_processor.process(str, argument_node, method_node)
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class EachKeywordArgument
6
- def initialize(then_processor)
7
- @then_processor = then_processor
8
-
9
- freeze
10
- end
11
-
12
- def process(_str, node, method_node)
13
- kwargs = node.kwargs
14
- return unless kwargs
15
-
16
- kwargs.children.map do |pair|
17
- next unless pair.type == :pair
18
-
19
- argument_node = pair.second
20
- str = argument_node.to_s if argument_node.string_or_symbol?
21
-
22
- @then_processor.process(str, argument_node, method_node)
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class EachPositionalArgument
6
- def initialize(then_processor)
7
- @then_processor = then_processor
8
-
9
- freeze
10
- end
11
-
12
- def process(_str, node, method_node)
13
- positional_arguments = node.positional_arguments
14
- return unless positional_arguments
15
-
16
- positional_arguments.map do |argument_node|
17
- str = argument_node.to_s if argument_node.string_or_symbol_or_def?
18
-
19
- @then_processor.process(str, argument_node, method_node)
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class Itself
6
- def initialize(then_processor)
7
- @then_processor = then_processor
8
-
9
- freeze
10
- end
11
-
12
- def process(_str, node, method_node)
13
- @then_processor.process(method_node.to_s, node, method_node)
14
- end
15
- end
16
- end
17
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- class Keyword
6
- def initialize(matcher, then_processor)
7
- @matcher = matcher
8
- @then_processor = then_processor
9
-
10
- freeze
11
- end
12
-
13
- def process(_str, node, method_node)
14
- kwargs = node.kwargs
15
- return unless kwargs
16
-
17
- result = []
18
-
19
- kwargs.children.each do |pair|
20
- next unless @matcher === pair
21
-
22
- argument_node = pair.first
23
- str = argument_node.to_s
24
-
25
- result << @then_processor.process(str, argument_node, method_node)
26
- end
27
-
28
- result
29
- end
30
- end
31
- end
32
- end
@@ -1,14 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- module ReturnDefinitionNode
6
- def self.process(str, node, _method_node)
7
- return unless str
8
- return if str.empty?
9
-
10
- Leftovers::DefinitionNode.new(node, name: str.to_sym)
11
- end
12
- end
13
- end
14
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- module ReturnSym
6
- def self.process(str, _node, _method_node)
7
- return unless str
8
- return if str.empty?
9
-
10
- str.to_sym
11
- end
12
- end
13
- end
14
- end
@@ -1,40 +0,0 @@
1
- # frozen-string-literal: true
2
-
3
- module Leftovers
4
- module ValueProcessors
5
- autoload(:AddDynamicPrefix, "#{__dir__}/value_processors/add_dynamic_prefix")
6
- autoload(:AddDynamicSuffix, "#{__dir__}/value_processors/add_dynamic_suffix")
7
- autoload(:AddPrefix, "#{__dir__}/value_processors/add_prefix")
8
- autoload(:AddSuffix, "#{__dir__}/value_processors/add_suffix")
9
- autoload(:Camelize, "#{__dir__}/value_processors/camelize")
10
- autoload(:Capitalize, "#{__dir__}/value_processors/capitalize")
11
- autoload(:Deconstantize, "#{__dir__}/value_processors/deconstantize")
12
- autoload(:DeleteAfter, "#{__dir__}/value_processors/delete_after")
13
- autoload(:DeleteBefore, "#{__dir__}/value_processors/delete_before")
14
- autoload(:DeletePrefix, "#{__dir__}/value_processors/delete_prefix")
15
- autoload(:DeleteSuffix, "#{__dir__}/value_processors/delete_suffix")
16
- autoload(:Demodulize, "#{__dir__}/value_processors/demodulize")
17
- autoload(:Downcase, "#{__dir__}/value_processors/downcase")
18
- autoload(:EachForDefinitionSet, "#{__dir__}/value_processors/each_for_definition_set")
19
- autoload(:EachKeyword, "#{__dir__}/value_processors/each_keyword")
20
- autoload(:EachKeywordArgument, "#{__dir__}/value_processors/each_keyword_argument")
21
- autoload(:EachPositionalArgument, "#{__dir__}/value_processors/each_positional_argument")
22
- autoload(:Each, "#{__dir__}/value_processors/each")
23
- autoload(:Itself, "#{__dir__}/value_processors/itself")
24
- autoload(:Keyword, "#{__dir__}/value_processors/keyword")
25
- autoload(:KeywordArgument, "#{__dir__}/value_processors/keyword_argument")
26
- autoload(:Parameterize, "#{__dir__}/value_processors/parameterize")
27
- autoload(:Placeholder, "#{__dir__}/value_processors/placeholder")
28
- autoload(:Pluralize, "#{__dir__}/value_processors/pluralize")
29
- autoload(:PositionalArgument, "#{__dir__}/value_processors/positional_argument")
30
- autoload(:ReplaceValue, "#{__dir__}/value_processors/replace_value")
31
- autoload(:ReturnDefinitionNode, "#{__dir__}/value_processors/return_definition_node")
32
- autoload(:ReturnSym, "#{__dir__}/value_processors/return_sym")
33
- autoload(:Singularize, "#{__dir__}/value_processors/singularize")
34
- autoload(:Split, "#{__dir__}/value_processors/split")
35
- autoload(:Swapcase, "#{__dir__}/value_processors/swapcase")
36
- autoload(:Titleize, "#{__dir__}/value_processors/titleize")
37
- autoload(:Underscore, "#{__dir__}/value_processors/underscore")
38
- autoload(:Upcase, "#{__dir__}/value_processors/upcase")
39
- end
40
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'yaml'
4
-
5
- module Leftovers
6
- module YAML
7
- class Builder < ::Psych::TreeBuilder
8
- def initialize
9
- @constants = []
10
-
11
- super
12
- end
13
-
14
- def add_constant_for_tag(tag, value = nil)
15
- match = %r{\A!ruby/[^:]*(?::(.*))?\z}.match(tag)
16
- return unless match
17
-
18
- @constants << (match[1] || value)
19
- end
20
-
21
- def start_mapping(_anchor, tag, *rest) # leftovers:keep
22
- add_constant_for_tag(tag)
23
- tag = nil
24
-
25
- super
26
- end
27
-
28
- def start_sequence(_anchor, tag, *rest) # leftovers:keep
29
- add_constant_for_tag(tag)
30
- tag = nil
31
-
32
- super
33
- end
34
-
35
- def scalar(value, _anchor, tag, *rest) # leftovers:keep
36
- add_constant_for_tag(tag, value)
37
- tag = nil
38
-
39
- super
40
- end
41
-
42
- def to_ruby_file
43
- <<~RUBY
44
- __leftovers_document(#{to_ruby_argument(root.to_ruby.first)})
45
- #{@constants.join("\n")}
46
- RUBY
47
- end
48
-
49
- private
50
-
51
- def to_ruby_argument(value)
52
- ruby = value.inspect
53
- return ruby unless value.is_a?(Array)
54
-
55
- ruby.delete_prefix!('[')
56
- ruby.delete_suffix!(']')
57
-
58
- ruby
59
- end
60
- end
61
-
62
- def self.precompile(yaml, name)
63
- builder = ::Leftovers::YAML::Builder.new
64
- parser = ::Psych::Parser.new(builder)
65
- parser.parse(yaml, name.relative_path)
66
-
67
- builder.to_ruby_file
68
- rescue ::Psych::SyntaxError => e
69
- Leftovers.warn "#{e.class}: #{e.message}"
70
- ''
71
- end
72
- end
73
- end