synvert-core 1.3.0 → 1.5.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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -4
  3. data/CHANGELOG.md +16 -0
  4. data/Gemfile +0 -3
  5. data/Guardfile +0 -9
  6. data/README.md +30 -12
  7. data/Rakefile +1 -15
  8. data/lib/synvert/core/engine/erb.rb +1 -1
  9. data/lib/synvert/core/engine.rb +1 -1
  10. data/lib/synvert/core/node_ext.rb +0 -466
  11. data/lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb +20 -17
  12. data/lib/synvert/core/rewriter/condition/if_exist_condition.rb +1 -1
  13. data/lib/synvert/core/rewriter/condition/unless_exist_condition.rb +1 -1
  14. data/lib/synvert/core/rewriter/instance.rb +89 -135
  15. data/lib/synvert/core/rewriter/scope/query_scope.rb +2 -2
  16. data/lib/synvert/core/rewriter/scope/within_scope.rb +4 -4
  17. data/lib/synvert/core/rewriter.rb +0 -10
  18. data/lib/synvert/core/version.rb +1 -1
  19. data/lib/synvert/core.rb +4 -6
  20. data/spec/synvert/core/engine/erb_spec.rb +3 -3
  21. data/spec/synvert/core/node_ext_spec.rb +0 -795
  22. data/spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb +21 -1
  23. data/spec/synvert/core/rewriter/instance_spec.rb +49 -112
  24. data/spec/synvert/core/rewriter/scope/goto_scope_spec.rb +1 -4
  25. data/spec/synvert/core/rewriter/scope/query_scope_spec.rb +8 -4
  26. data/spec/synvert/core/rewriter/scope/within_scope_spec.rb +1 -4
  27. data/synvert-core-ruby.gemspec +4 -2
  28. metadata +44 -61
  29. data/lib/synvert/core/array_ext.rb +0 -48
  30. data/lib/synvert/core/node_query/compiler/array.rb +0 -34
  31. data/lib/synvert/core/node_query/compiler/attribute.rb +0 -39
  32. data/lib/synvert/core/node_query/compiler/attribute_list.rb +0 -24
  33. data/lib/synvert/core/node_query/compiler/boolean.rb +0 -23
  34. data/lib/synvert/core/node_query/compiler/comparable.rb +0 -86
  35. data/lib/synvert/core/node_query/compiler/dynamic_attribute.rb +0 -51
  36. data/lib/synvert/core/node_query/compiler/expression.rb +0 -58
  37. data/lib/synvert/core/node_query/compiler/float.rb +0 -23
  38. data/lib/synvert/core/node_query/compiler/identifier.rb +0 -41
  39. data/lib/synvert/core/node_query/compiler/integer.rb +0 -23
  40. data/lib/synvert/core/node_query/compiler/invalid_operator_error.rb +0 -7
  41. data/lib/synvert/core/node_query/compiler/nil.rb +0 -23
  42. data/lib/synvert/core/node_query/compiler/parse_error.rb +0 -7
  43. data/lib/synvert/core/node_query/compiler/regexp.rb +0 -37
  44. data/lib/synvert/core/node_query/compiler/selector.rb +0 -138
  45. data/lib/synvert/core/node_query/compiler/simple_selector.rb +0 -29
  46. data/lib/synvert/core/node_query/compiler/string.rb +0 -23
  47. data/lib/synvert/core/node_query/compiler/symbol.rb +0 -23
  48. data/lib/synvert/core/node_query/compiler.rb +0 -25
  49. data/lib/synvert/core/node_query/lexer.rex +0 -108
  50. data/lib/synvert/core/node_query/lexer.rex.rb +0 -321
  51. data/lib/synvert/core/node_query/parser.racc.rb +0 -322
  52. data/lib/synvert/core/node_query/parser.y +0 -62
  53. data/lib/synvert/core/node_query.rb +0 -37
  54. data/lib/synvert/core/rewriter/action/append_action.rb +0 -28
  55. data/lib/synvert/core/rewriter/action/delete_action.rb +0 -32
  56. data/lib/synvert/core/rewriter/action/insert_action.rb +0 -34
  57. data/lib/synvert/core/rewriter/action/insert_after_action.rb +0 -22
  58. data/lib/synvert/core/rewriter/action/prepend_action.rb +0 -44
  59. data/lib/synvert/core/rewriter/action/remove_action.rb +0 -53
  60. data/lib/synvert/core/rewriter/action/replace_action.rb +0 -33
  61. data/lib/synvert/core/rewriter/action/replace_with_action.rb +0 -36
  62. data/lib/synvert/core/rewriter/action/wrap_action.rb +0 -37
  63. data/lib/synvert/core/rewriter/action.rb +0 -102
  64. data/spec/synvert/core/node_query/lexer_spec.rb +0 -640
  65. data/spec/synvert/core/node_query/parser_spec.rb +0 -382
  66. data/spec/synvert/core/rewriter/action/append_action_spec.rb +0 -70
  67. data/spec/synvert/core/rewriter/action/delete_action_spec.rb +0 -26
  68. data/spec/synvert/core/rewriter/action/insert_action_spec.rb +0 -70
  69. data/spec/synvert/core/rewriter/action/insert_after_action_spec.rb +0 -26
  70. data/spec/synvert/core/rewriter/action/prepend_action_spec.rb +0 -175
  71. data/spec/synvert/core/rewriter/action/remove_action_spec.rb +0 -26
  72. data/spec/synvert/core/rewriter/action/replace_action_spec.rb +0 -28
  73. data/spec/synvert/core/rewriter/action/replace_with_action_spec.rb +0 -59
  74. data/spec/synvert/core/rewriter/action/wrap_action_spec.rb +0 -31
  75. data/spec/synvert/core/rewriter/action_spec.rb +0 -14
@@ -3,6 +3,26 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  module Synvert::Core
6
- describe Rewriter::ReplaceErbStmtWithExprAction do
6
+ RSpec.describe Rewriter::ReplaceErbStmtWithExprAction do
7
+ context 'replace with single line' do
8
+ subject {
9
+ source = "<% form_for post do |f| %>\n<% end %>"
10
+ source = Engine::Erb.encode(source)
11
+ node = Parser::CurrentRuby.parse(source).children[1]
12
+ described_class.new(node).process
13
+ }
14
+
15
+ it 'gets start' do
16
+ expect(subject.start).to eq '@output_buffer = output_buffer || ActionView::OutputBuffer.new;'.length
17
+ end
18
+
19
+ it 'gets end' do
20
+ expect(subject.end).to eq '@output_buffer = output_buffer || ActionView::OutputBuffer.new;; ; form_for post do |f| ; ;'.length
21
+ end
22
+
23
+ it 'gets new_code' do
24
+ expect(subject.new_code).to eq '@output_buffer.append= form_for post do |f| ; ;'
25
+ end
26
+ end
7
27
  end
8
28
  end
@@ -4,8 +4,6 @@ require 'spec_helper'
4
4
 
5
5
  module Synvert::Core
6
6
  describe Rewriter::Instance do
7
- before { Rewriter::Instance.reset }
8
-
9
7
  let(:instance) {
10
8
  rewriter = Rewriter.new('foo', 'bar')
11
9
  Rewriter::Instance.new(rewriter, ['file pattern'])
@@ -98,92 +96,83 @@ module Synvert::Core
98
96
  end
99
97
 
100
98
  it 'parses append' do
101
- action = double
102
- expect(Rewriter::AppendAction).to receive(:new).with(
103
- instance,
104
- 'include FactoryGirl::Syntax::Methods'
105
- ).and_return(action)
106
- expect(action).to receive(:process)
107
- instance.append 'include FactoryGirl::Syntax::Methods'
99
+ instance.current_mutation = double
100
+ instance.current_node = double
101
+ expect(instance.current_mutation).to receive(:append).with(instance.current_node, 'Foobar')
102
+ instance.append 'Foobar'
108
103
  end
109
104
 
110
105
  it 'parses prepend' do
111
- action = double
112
- expect(Rewriter::PrependAction).to receive(:new).with(
113
- instance,
114
- '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
115
- ).and_return(action)
116
- expect(action).to receive(:process)
117
- instance.prepend '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
106
+ instance.current_mutation = double
107
+ instance.current_node = double
108
+ expect(instance.current_mutation).to receive(:prepend).with(instance.current_node, 'Foobar')
109
+ instance.prepend 'Foobar'
118
110
  end
119
111
 
120
112
  it 'parses insert at end' do
121
- action = double
122
- expect(Rewriter::InsertAction).to receive(:new).with(
123
- instance,
124
- '.first',
125
- at: 'end',
126
- to: 'receiver'
127
- ).and_return(action)
128
- expect(action).to receive(:process)
129
- instance.insert '.first', to: 'receiver'
113
+ instance.current_mutation = double
114
+ instance.current_node = double
115
+ expect(instance.current_mutation).to receive(:insert).with(instance.current_node, 'Foobar', at: 'end', to: 'receiver')
116
+ instance.insert 'Foobar', to: 'receiver'
130
117
  end
131
118
 
132
119
  it 'parses insert at beginning' do
133
- action = double
134
- expect(Rewriter::InsertAction).to receive(:new).with(
135
- instance,
136
- 'URI.',
137
- at: 'beginning',
138
- to: nil
139
- ).and_return(action)
140
- expect(action).to receive(:process)
141
- instance.insert 'URI.', at: 'beginning'
120
+ instance.current_mutation = double
121
+ instance.current_node = double
122
+ expect(instance.current_mutation).to receive(:insert).with(instance.current_node, 'Foobar', at: 'beginning', to: nil)
123
+ instance.insert 'Foobar', at: 'beginning'
142
124
  end
143
125
 
144
126
  it 'parses insert_after' do
127
+ instance.current_mutation = double
128
+ instance.current_node = double
129
+ expect(instance.current_mutation).to receive(:insert_after).with(instance.current_node, 'Foobar')
130
+ instance.insert_after 'Foobar'
131
+ end
132
+
133
+ it 'parses replace_erb_stmt_with_expr' do
134
+ instance.current_mutation = double
135
+ instance.current_node = double
145
136
  action = double
146
- expect(Rewriter::InsertAfterAction).to receive(:new).with(
147
- instance,
148
- '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
149
- ).and_return(action)
137
+ expect(instance.current_mutation).to receive(:actions).and_return([])
138
+ expect(Rewriter::ReplaceErbStmtWithExprAction).to receive(:new).with(instance.current_node).and_return(action)
150
139
  expect(action).to receive(:process)
151
- instance.insert_after '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
140
+ instance.replace_erb_stmt_with_expr
152
141
  end
153
142
 
154
143
  it 'parses replace_with' do
155
- action = double
156
- expect(Rewriter::ReplaceWithAction).to receive(:new).with(instance, 'create {{arguments}}').and_return(action)
157
- expect(action).to receive(:process)
158
- instance.replace_with 'create {{arguments}}'
144
+ instance.current_mutation = double
145
+ instance.current_node = double
146
+ expect(instance.current_mutation).to receive(:replace_with).with(instance.current_node, 'Foobar')
147
+ instance.replace_with 'Foobar'
159
148
  end
160
149
 
161
150
  it 'parses replace with' do
162
- action = double
163
- expect(Rewriter::ReplaceAction).to receive(:new).with(instance, :message, with: 'test').and_return(action)
164
- expect(action).to receive(:process)
165
- instance.replace :message, with: 'test'
151
+ instance.current_mutation = double
152
+ instance.current_node = double
153
+ expect(instance.current_mutation).to receive(:replace).with(instance.current_node, :message, with: 'Foobar')
154
+ instance.replace :message, with: 'Foobar'
166
155
  end
167
156
 
168
157
  it 'parses remove' do
169
- action = double
170
- expect(Rewriter::RemoveAction).to receive(:new).with(instance).and_return(action)
171
- expect(action).to receive(:process)
172
- instance.remove
158
+ instance.current_mutation = double
159
+ instance.current_node = double
160
+ expect(instance.current_mutation).to receive(:remove).with(instance.current_node, and_comma: true)
161
+ instance.remove and_comma: true
173
162
  end
174
163
 
175
- it 'parses remove' do
176
- action = double
177
- expect(Rewriter::DeleteAction).to receive(:new).with(instance, :dot, :message).and_return(action)
178
- expect(action).to receive(:process)
179
- instance.delete :dot, :message
164
+ it 'parses delete' do
165
+ instance.current_mutation = double
166
+ instance.current_node = double
167
+ expect(instance.current_mutation).to receive(:delete).with(instance.current_node, :dot, :message, and_comma: true)
168
+ instance.delete :dot, :message, and_comma: true
180
169
  end
181
170
 
182
171
  it 'parses wrap with' do
183
- action = double
184
- expect(Rewriter::WrapAction).to receive(:new).with(instance, with: 'module Foo', indent: nil).and_return(action)
185
- expect(action).to receive(:process)
186
- instance.wrap with: 'module Foo'
172
+ instance.current_mutation = double
173
+ instance.current_node = double
174
+ expect(instance.current_mutation).to receive(:wrap).with(instance.current_node, with: 'module Foobar')
175
+ instance.wrap with: 'module Foobar'
187
176
  end
188
177
 
189
178
  it 'parses warn' do
@@ -246,32 +235,6 @@ module Synvert::Core
246
235
  instance.process
247
236
  end
248
237
 
249
- it 'does not read file if already read' do
250
- instance =
251
- Rewriter::Instance.new rewriter, ['spec/spec_helper.rb'] do
252
- with_node type: 'block', caller: { receiver: 'RSpec', message: 'configure' } do
253
- unless_exist_node type: 'send', message: 'include', arguments: ['FactoryGirl::Syntax::Methods'] do
254
- insert '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
255
- end
256
- end
257
- end
258
- input = <<~EOS
259
- RSpec.configure do |config|
260
- config.include FactoryGirl::Syntax::Methods
261
- end
262
- EOS
263
- output = <<~EOS
264
- RSpec.configure do |config|
265
- config.include FactoryGirl::Syntax::Methods
266
- end
267
- EOS
268
- expect(Dir).to receive(:glob).with('./spec/spec_helper.rb').and_return(['spec/spec_helper.rb']).twice
269
- expect(File).to receive(:read).with('spec/spec_helper.rb', encoding: 'UTF-8').and_return(input).once
270
- expect(File).not_to receive(:write).with('spec/spec_helper.rb', output)
271
- instance.process
272
- instance.process
273
- end
274
-
275
238
  it 'updates file_source and file_ast when writing a file' do
276
239
  instance =
277
240
  Rewriter::Instance.new rewriter, ['spec/**/*_spec.rb'] do
@@ -303,32 +266,6 @@ module Synvert::Core
303
266
  end
304
267
  end
305
268
 
306
- describe '#get_conflict_actions' do
307
- let(:rewriter) { Rewriter.new('foo', 'bar') }
308
-
309
- it 'has no conflict' do
310
- action1 = double(begin_pos: 10, end_pos: 20)
311
- action2 = double(begin_pos: 30, end_pos: 40)
312
- action3 = double(begin_pos: 50, end_pos: 60)
313
- instance = Rewriter::Instance.new rewriter, ['spec/spec_helper.rb']
314
- instance.instance_variable_set :@actions, [action1, action2, action3]
315
- conflict_actions = instance.send(:get_conflict_actions)
316
- expect(conflict_actions).to eq []
317
- expect(instance.instance_variable_get(:@actions)).to eq [action1, action2, action3]
318
- end
319
-
320
- it 'has no conflict' do
321
- action1 = double(begin_pos: 30, end_pos: 40)
322
- action2 = double(begin_pos: 50, end_pos: 60)
323
- action3 = double(begin_pos: 10, end_pos: 20)
324
- instance = Rewriter::Instance.new rewriter, ['spec/spec_helper.rb']
325
- instance.instance_variable_set :@actions, [action1, action2, action3]
326
- conflict_actions = instance.send(:get_conflict_actions)
327
- expect(conflict_actions).to eq [action2, action1]
328
- expect(instance.instance_variable_get(:@actions)).to eq [action3]
329
- end
330
- end
331
-
332
269
  describe '#process_with_node' do
333
270
  it 'resets current_node' do
334
271
  node1 = double
@@ -14,10 +14,7 @@ module Synvert::Core
14
14
  EOS
15
15
 
16
16
  let(:node) { Parser::CurrentRuby.parse(source) }
17
- before do
18
- Rewriter::Instance.reset
19
- instance.current_node = node
20
- end
17
+ before { instance.current_node = node }
21
18
 
22
19
  describe '#process' do
23
20
  it 'call block with child node' do
@@ -18,10 +18,7 @@ module Synvert::Core
18
18
 
19
19
  let(:node) { Parser::CurrentRuby.parse(source) }
20
20
 
21
- before do
22
- Rewriter::Instance.reset
23
- instance.current_node = node
24
- end
21
+ before { instance.current_node = node }
25
22
 
26
23
  describe '#process' do
27
24
  it 'not call block if no matching node' do
@@ -64,6 +61,13 @@ module Synvert::Core
64
61
  scope.process
65
62
  }.to raise_error(NodeQuery::Compiler::ParseError)
66
63
 
64
+ scope = described_class.new(instance, '.block <caller.arguments> .hash') {}
65
+ expect {
66
+ scope.process
67
+ }.to raise_error(NodeQuery::Compiler::ParseError)
68
+ end
69
+
70
+ it 'raises InvalidOperatorError' do
67
71
  scope = described_class.new(instance, '.send[receiver IN FactoryGirl]') {}
68
72
  expect {
69
73
  scope.process
@@ -18,10 +18,7 @@ module Synvert::Core
18
18
 
19
19
  let(:node) { Parser::CurrentRuby.parse(source) }
20
20
 
21
- before do
22
- Rewriter::Instance.reset
23
- instance.current_node = node
24
- end
21
+ before { instance.current_node = node }
25
22
 
26
23
  describe '#process' do
27
24
  it 'not call block if no matching node' do
@@ -14,13 +14,15 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "https://github.com/xinminlabs/synvert-core-ruby"
15
15
  spec.license = "MIT"
16
16
 
17
- spec.files = `git ls-files -z`.split("\x0") +
18
- %w[lib/synvert/core/node_query/lexer.rex.rb lib/synvert/core/node_query/parser.racc.rb]
17
+ spec.files = `git ls-files -z`.split("\x0")
19
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
20
  spec.require_paths = ["lib"]
22
21
 
23
22
  spec.add_runtime_dependency "activesupport"
24
23
  spec.add_runtime_dependency "erubis"
24
+ spec.add_runtime_dependency "node_query"
25
+ spec.add_runtime_dependency "node_mutation"
25
26
  spec.add_runtime_dependency "parser"
27
+ spec.add_runtime_dependency "parser_node_ext"
26
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: synvert-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Huang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-12 00:00:00.000000000 Z
11
+ date: 2022-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: node_query
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: node_mutation
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: parser
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +80,20 @@ dependencies:
52
80
  - - ">="
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: parser_node_ext
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  description: convert ruby code to better syntax automatically.
56
98
  email:
57
99
  - flyerhzm@gmail.com
@@ -69,48 +111,13 @@ files:
69
111
  - README.md
70
112
  - Rakefile
71
113
  - lib/synvert/core.rb
72
- - lib/synvert/core/array_ext.rb
73
114
  - lib/synvert/core/configuration.rb
74
115
  - lib/synvert/core/engine.rb
75
116
  - lib/synvert/core/engine/erb.rb
76
117
  - lib/synvert/core/exceptions.rb
77
118
  - lib/synvert/core/node_ext.rb
78
- - lib/synvert/core/node_query.rb
79
- - lib/synvert/core/node_query/compiler.rb
80
- - lib/synvert/core/node_query/compiler/array.rb
81
- - lib/synvert/core/node_query/compiler/attribute.rb
82
- - lib/synvert/core/node_query/compiler/attribute_list.rb
83
- - lib/synvert/core/node_query/compiler/boolean.rb
84
- - lib/synvert/core/node_query/compiler/comparable.rb
85
- - lib/synvert/core/node_query/compiler/dynamic_attribute.rb
86
- - lib/synvert/core/node_query/compiler/expression.rb
87
- - lib/synvert/core/node_query/compiler/float.rb
88
- - lib/synvert/core/node_query/compiler/identifier.rb
89
- - lib/synvert/core/node_query/compiler/integer.rb
90
- - lib/synvert/core/node_query/compiler/invalid_operator_error.rb
91
- - lib/synvert/core/node_query/compiler/nil.rb
92
- - lib/synvert/core/node_query/compiler/parse_error.rb
93
- - lib/synvert/core/node_query/compiler/regexp.rb
94
- - lib/synvert/core/node_query/compiler/selector.rb
95
- - lib/synvert/core/node_query/compiler/simple_selector.rb
96
- - lib/synvert/core/node_query/compiler/string.rb
97
- - lib/synvert/core/node_query/compiler/symbol.rb
98
- - lib/synvert/core/node_query/lexer.rex
99
- - lib/synvert/core/node_query/lexer.rex.rb
100
- - lib/synvert/core/node_query/parser.racc.rb
101
- - lib/synvert/core/node_query/parser.y
102
119
  - lib/synvert/core/rewriter.rb
103
- - lib/synvert/core/rewriter/action.rb
104
- - lib/synvert/core/rewriter/action/append_action.rb
105
- - lib/synvert/core/rewriter/action/delete_action.rb
106
- - lib/synvert/core/rewriter/action/insert_action.rb
107
- - lib/synvert/core/rewriter/action/insert_after_action.rb
108
- - lib/synvert/core/rewriter/action/prepend_action.rb
109
- - lib/synvert/core/rewriter/action/remove_action.rb
110
- - lib/synvert/core/rewriter/action/replace_action.rb
111
120
  - lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb
112
- - lib/synvert/core/rewriter/action/replace_with_action.rb
113
- - lib/synvert/core/rewriter/action/wrap_action.rb
114
121
  - lib/synvert/core/rewriter/any_value.rb
115
122
  - lib/synvert/core/rewriter/condition.rb
116
123
  - lib/synvert/core/rewriter/condition/if_exist_condition.rb
@@ -130,19 +137,7 @@ files:
130
137
  - spec/support/parser_helper.rb
131
138
  - spec/synvert/core/engine/erb_spec.rb
132
139
  - spec/synvert/core/node_ext_spec.rb
133
- - spec/synvert/core/node_query/lexer_spec.rb
134
- - spec/synvert/core/node_query/parser_spec.rb
135
- - spec/synvert/core/rewriter/action/append_action_spec.rb
136
- - spec/synvert/core/rewriter/action/delete_action_spec.rb
137
- - spec/synvert/core/rewriter/action/insert_action_spec.rb
138
- - spec/synvert/core/rewriter/action/insert_after_action_spec.rb
139
- - spec/synvert/core/rewriter/action/prepend_action_spec.rb
140
- - spec/synvert/core/rewriter/action/remove_action_spec.rb
141
- - spec/synvert/core/rewriter/action/replace_action_spec.rb
142
140
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb
143
- - spec/synvert/core/rewriter/action/replace_with_action_spec.rb
144
- - spec/synvert/core/rewriter/action/wrap_action_spec.rb
145
- - spec/synvert/core/rewriter/action_spec.rb
146
141
  - spec/synvert/core/rewriter/condition/if_exist_condition_spec.rb
147
142
  - spec/synvert/core/rewriter/condition/if_only_exist_condition_spec.rb
148
143
  - spec/synvert/core/rewriter/condition/unless_exist_condition_spec.rb
@@ -186,19 +181,7 @@ test_files:
186
181
  - spec/support/parser_helper.rb
187
182
  - spec/synvert/core/engine/erb_spec.rb
188
183
  - spec/synvert/core/node_ext_spec.rb
189
- - spec/synvert/core/node_query/lexer_spec.rb
190
- - spec/synvert/core/node_query/parser_spec.rb
191
- - spec/synvert/core/rewriter/action/append_action_spec.rb
192
- - spec/synvert/core/rewriter/action/delete_action_spec.rb
193
- - spec/synvert/core/rewriter/action/insert_action_spec.rb
194
- - spec/synvert/core/rewriter/action/insert_after_action_spec.rb
195
- - spec/synvert/core/rewriter/action/prepend_action_spec.rb
196
- - spec/synvert/core/rewriter/action/remove_action_spec.rb
197
- - spec/synvert/core/rewriter/action/replace_action_spec.rb
198
184
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb
199
- - spec/synvert/core/rewriter/action/replace_with_action_spec.rb
200
- - spec/synvert/core/rewriter/action/wrap_action_spec.rb
201
- - spec/synvert/core/rewriter/action_spec.rb
202
185
  - spec/synvert/core/rewriter/condition/if_exist_condition_spec.rb
203
186
  - spec/synvert/core/rewriter/condition/if_only_exist_condition_spec.rb
204
187
  - spec/synvert/core/rewriter/condition/unless_exist_condition_spec.rb
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Extend Array.
4
- class Array
5
- # Get child node by the name.
6
- #
7
- # @param child_name [String] name of child node.
8
- # @return [Parser::AST::Node] the child node.
9
- def child_node_by_name(child_name)
10
- direct_child_name, nested_child_name = child_name.split('.', 2)
11
- child_direct_child_node = direct_child_name =~ /\A\d+\z/ ? self[direct_child_name.to_i - 1] : self.send(direct_child_name)
12
- return child_direct_child_node.child_node_by_name(nested_child_name) if nested_child_name
13
- return child_direct_child_node if child_direct_child_node
14
-
15
- raise Synvert::Core::MethodNotSupported,
16
- "child_node_by_name is not handled for #{debug_info}, child_name: #{child_name}"
17
- end
18
-
19
- # Get the source range of child node.
20
- #
21
- # @param child_name [String] name of child node.
22
- # @return [Parser::Source::Range] source range of child node.
23
- def child_node_range(child_name)
24
- direct_child_name, nested_child_name = child_name.split('.', 2)
25
- child_direct_child_node = direct_child_name =~ /\A\d+\z/ ? self[direct_child_name.to_i - 1] : self.send(direct_child_name)
26
- if nested_child_name
27
- return child_direct_child_node.child_node_range(nested_child_name)
28
- elsif child_direct_child_node
29
- return (
30
- Parser::Source::Range.new(
31
- '(string)',
32
- child_direct_child_node.loc.expression.begin_pos,
33
- child_direct_child_node.loc.expression.end_pos
34
- )
35
- )
36
- else
37
- raise Synvert::Core::MethodNotSupported,
38
- "child_node_range is not handled for #{debug_info}, child_name: #{child_name}"
39
- end
40
- end
41
-
42
- # Return the debug info.
43
- #
44
- # @return [String] file, line, source and node.
45
- def debug_info
46
- map(&:debug_info).join("\n")
47
- end
48
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Synvert::Core::NodeQuery::Compiler
4
- # Array represents a ruby array value.
5
- class Array
6
- include Comparable
7
-
8
- # Initialize an Array.
9
- # @param value the first value of the array
10
- # @param rest the rest value of the array
11
- def initialize(value: nil, rest: nil)
12
- @value = value
13
- @rest = rest
14
- end
15
-
16
- # Get the expected value.
17
- # @return [Array]
18
- def expected_value
19
- expected = []
20
- expected.push(@value) if @value
21
- expected += @rest.expected_value if @rest
22
- expected
23
- end
24
-
25
- # Get valid operators.
26
- def valid_operators
27
- ARRAY_VALID_OPERATORS
28
- end
29
-
30
- def to_s
31
- [@value, @rest].compact.join(' ')
32
- end
33
- end
34
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Synvert::Core::NodeQuery::Compiler
4
- # Attribute is a pair of key, value and operator,
5
- class Attribute
6
- # Initialize a Attribute.
7
- # @param key [String] the key
8
- # @param value the value can be any class implement {Synvert::Core::NodeQuery::Compiler::Comparable}
9
- # @param operator [Symbol] the operator
10
- def initialize(key:, value:, operator: '==')
11
- @key = key
12
- @value = value
13
- @operator = operator
14
- end
15
-
16
- # Check if the node matches the attribute.
17
- # @param node [Parser::AST::Node] the node
18
- # @return [Boolean]
19
- def match?(node)
20
- @value.base_node = node if @value.is_a?(DynamicAttribute)
21
- node && @value.match?(node.child_node_by_name(@key), @operator)
22
- end
23
-
24
- def to_s
25
- case @operator
26
- when '^=', '$=', '*=', '!=', '=~', '!~', '>=', '>', '<=', '<'
27
- "#{@key}#{@operator}#{@value}"
28
- when 'in'
29
- "#{@key} in (#{@value})"
30
- when 'not_in'
31
- "#{@key} not in (#{@value})"
32
- when 'includes'
33
- "#{@key} includes #{@value}"
34
- else
35
- "#{@key}=#{@value}"
36
- end
37
- end
38
- end
39
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Synvert::Core::NodeQuery::Compiler
4
- # AttributeList contains one or more {Synvert::Core::NodeQuery::Compiler::Attribute}.
5
- class AttributeList
6
- # Initialize a AttributeList.
7
- # @param attribute [Synvert::Core::NodeQuery::Compiler::Attribute] the attribute
8
- # @param rest [Synvert::Core::NodeQuery::Compiler::AttributeList] the rest attribute list
9
- def initialize(attribute:, rest: nil)
10
- @attribute = attribute
11
- @rest = rest
12
- end
13
-
14
- # Check if the node matches the attribute list.
15
- # @return [Boolean]
16
- def match?(node)
17
- @attribute.match?(node) && (!@rest || @rest.match?(node))
18
- end
19
-
20
- def to_s
21
- "[#{@attribute}]#{@rest}"
22
- end
23
- end
24
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Synvert::Core::NodeQuery::Compiler
4
- # Boolean represents a ruby boolean value.
5
- class Boolean
6
- include Comparable
7
-
8
- # Initialize a Boolean.
9
- # @param value [Boolean] the boolean value
10
- def initialize(value:)
11
- @value = value
12
- end
13
-
14
- # Get valid operators.
15
- def valid_operators
16
- SIMPLE_VALID_OPERATORS
17
- end
18
-
19
- def to_s
20
- @value.to_s
21
- end
22
- end
23
- end