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.
- checksums.yaml +4 -4
- data/.gitignore +0 -4
- data/CHANGELOG.md +16 -0
- data/Gemfile +0 -3
- data/Guardfile +0 -9
- data/README.md +30 -12
- data/Rakefile +1 -15
- data/lib/synvert/core/engine/erb.rb +1 -1
- data/lib/synvert/core/engine.rb +1 -1
- data/lib/synvert/core/node_ext.rb +0 -466
- data/lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb +20 -17
- data/lib/synvert/core/rewriter/condition/if_exist_condition.rb +1 -1
- data/lib/synvert/core/rewriter/condition/unless_exist_condition.rb +1 -1
- data/lib/synvert/core/rewriter/instance.rb +89 -135
- data/lib/synvert/core/rewriter/scope/query_scope.rb +2 -2
- data/lib/synvert/core/rewriter/scope/within_scope.rb +4 -4
- data/lib/synvert/core/rewriter.rb +0 -10
- data/lib/synvert/core/version.rb +1 -1
- data/lib/synvert/core.rb +4 -6
- data/spec/synvert/core/engine/erb_spec.rb +3 -3
- data/spec/synvert/core/node_ext_spec.rb +0 -795
- data/spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb +21 -1
- data/spec/synvert/core/rewriter/instance_spec.rb +49 -112
- data/spec/synvert/core/rewriter/scope/goto_scope_spec.rb +1 -4
- data/spec/synvert/core/rewriter/scope/query_scope_spec.rb +8 -4
- data/spec/synvert/core/rewriter/scope/within_scope_spec.rb +1 -4
- data/synvert-core-ruby.gemspec +4 -2
- metadata +44 -61
- data/lib/synvert/core/array_ext.rb +0 -48
- data/lib/synvert/core/node_query/compiler/array.rb +0 -34
- data/lib/synvert/core/node_query/compiler/attribute.rb +0 -39
- data/lib/synvert/core/node_query/compiler/attribute_list.rb +0 -24
- data/lib/synvert/core/node_query/compiler/boolean.rb +0 -23
- data/lib/synvert/core/node_query/compiler/comparable.rb +0 -86
- data/lib/synvert/core/node_query/compiler/dynamic_attribute.rb +0 -51
- data/lib/synvert/core/node_query/compiler/expression.rb +0 -58
- data/lib/synvert/core/node_query/compiler/float.rb +0 -23
- data/lib/synvert/core/node_query/compiler/identifier.rb +0 -41
- data/lib/synvert/core/node_query/compiler/integer.rb +0 -23
- data/lib/synvert/core/node_query/compiler/invalid_operator_error.rb +0 -7
- data/lib/synvert/core/node_query/compiler/nil.rb +0 -23
- data/lib/synvert/core/node_query/compiler/parse_error.rb +0 -7
- data/lib/synvert/core/node_query/compiler/regexp.rb +0 -37
- data/lib/synvert/core/node_query/compiler/selector.rb +0 -138
- data/lib/synvert/core/node_query/compiler/simple_selector.rb +0 -29
- data/lib/synvert/core/node_query/compiler/string.rb +0 -23
- data/lib/synvert/core/node_query/compiler/symbol.rb +0 -23
- data/lib/synvert/core/node_query/compiler.rb +0 -25
- data/lib/synvert/core/node_query/lexer.rex +0 -108
- data/lib/synvert/core/node_query/lexer.rex.rb +0 -321
- data/lib/synvert/core/node_query/parser.racc.rb +0 -322
- data/lib/synvert/core/node_query/parser.y +0 -62
- data/lib/synvert/core/node_query.rb +0 -37
- data/lib/synvert/core/rewriter/action/append_action.rb +0 -28
- data/lib/synvert/core/rewriter/action/delete_action.rb +0 -32
- data/lib/synvert/core/rewriter/action/insert_action.rb +0 -34
- data/lib/synvert/core/rewriter/action/insert_after_action.rb +0 -22
- data/lib/synvert/core/rewriter/action/prepend_action.rb +0 -44
- data/lib/synvert/core/rewriter/action/remove_action.rb +0 -53
- data/lib/synvert/core/rewriter/action/replace_action.rb +0 -33
- data/lib/synvert/core/rewriter/action/replace_with_action.rb +0 -36
- data/lib/synvert/core/rewriter/action/wrap_action.rb +0 -37
- data/lib/synvert/core/rewriter/action.rb +0 -102
- data/spec/synvert/core/node_query/lexer_spec.rb +0 -640
- data/spec/synvert/core/node_query/parser_spec.rb +0 -382
- data/spec/synvert/core/rewriter/action/append_action_spec.rb +0 -70
- data/spec/synvert/core/rewriter/action/delete_action_spec.rb +0 -26
- data/spec/synvert/core/rewriter/action/insert_action_spec.rb +0 -70
- data/spec/synvert/core/rewriter/action/insert_after_action_spec.rb +0 -26
- data/spec/synvert/core/rewriter/action/prepend_action_spec.rb +0 -175
- data/spec/synvert/core/rewriter/action/remove_action_spec.rb +0 -26
- data/spec/synvert/core/rewriter/action/replace_action_spec.rb +0 -28
- data/spec/synvert/core/rewriter/action/replace_with_action_spec.rb +0 -59
- data/spec/synvert/core/rewriter/action/wrap_action_spec.rb +0 -31
- 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
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
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
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
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
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
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
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
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(
|
147
|
-
|
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.
|
140
|
+
instance.replace_erb_stmt_with_expr
|
152
141
|
end
|
153
142
|
|
154
143
|
it 'parses replace_with' do
|
155
|
-
|
156
|
-
|
157
|
-
expect(
|
158
|
-
instance.replace_with '
|
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
|
-
|
163
|
-
|
164
|
-
expect(
|
165
|
-
instance.replace :message, with: '
|
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
|
-
|
170
|
-
|
171
|
-
expect(
|
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
|
176
|
-
|
177
|
-
|
178
|
-
expect(
|
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
|
-
|
184
|
-
|
185
|
-
expect(
|
186
|
-
instance.wrap with: 'module
|
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
|
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
|
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
|
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
|
data/synvert-core-ruby.gemspec
CHANGED
@@ -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.
|
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-
|
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
|