synvert-core 1.3.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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