synvert-core 1.4.0 → 1.6.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/.github/workflows/main.yml +0 -1
- data/.gitignore +0 -5
- data/CHANGELOG.md +12 -0
- data/Gemfile +0 -3
- data/Gemfile.lock +101 -0
- data/Guardfile +0 -9
- data/README.md +31 -13
- 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 -639
- 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 -5
- data/lib/synvert/core/rewriter/condition/if_only_exist_condition.rb +1 -1
- data/lib/synvert/core/rewriter/condition/unless_exist_condition.rb +1 -5
- data/lib/synvert/core/rewriter/condition.rb +5 -1
- data/lib/synvert/core/rewriter/instance.rb +91 -140
- data/lib/synvert/core/rewriter/scope/query_scope.rb +8 -6
- data/lib/synvert/core/rewriter/scope/within_scope.rb +4 -87
- 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 -965
- data/spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb +21 -1
- data/spec/synvert/core/rewriter/instance_spec.rb +64 -131
- data/spec/synvert/core/rewriter/scope/goto_scope_spec.rb +1 -4
- data/spec/synvert/core/rewriter/scope/query_scope_spec.rb +1 -16
- data/spec/synvert/core/rewriter/scope/within_scope_spec.rb +22 -13
- data/synvert-core-ruby.gemspec +5 -3
- metadata +46 -62
- 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/basic_selector.rb +0 -28
- 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 -41
- 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 -113
- 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 -99
- data/lib/synvert/core/node_query/lexer.rex.rb +0 -299
- data/lib/synvert/core/node_query/parser.racc.rb +0 -306
- data/lib/synvert/core/node_query/parser.y +0 -60
- data/lib/synvert/core/node_query.rb +0 -36
- data/lib/synvert/core/rewriter/action/append_action.rb +0 -28
- data/lib/synvert/core/rewriter/action/delete_action.rb +0 -34
- 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 -56
- 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 -580
- data/spec/synvert/core/node_query/parser_spec.rb +0 -337
- 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'])
|
@@ -14,16 +12,27 @@ module Synvert::Core
|
|
14
12
|
it 'parses find_node' do
|
15
13
|
scope = double
|
16
14
|
block = proc {}
|
17
|
-
expect(Rewriter::QueryScope).to receive(:new).with(instance, '.send[message=create]', &block).and_return(scope)
|
15
|
+
expect(Rewriter::QueryScope).to receive(:new).with(instance, '.send[message=create]', {}, &block).and_return(scope)
|
18
16
|
expect(scope).to receive(:process)
|
19
17
|
instance.find_node('.send[message=create]', &block)
|
20
18
|
end
|
21
19
|
|
20
|
+
it 'raises ParseError when parsing invalid nql' do
|
21
|
+
block = proc {}
|
22
|
+
expect {
|
23
|
+
instance.find_node('synvert', &block)
|
24
|
+
}.to raise_error(NodeQuery::Compiler::ParseError)
|
25
|
+
|
26
|
+
expect {
|
27
|
+
instance.find_node('.block <caller.arguments> .hash', &block)
|
28
|
+
}.to raise_error(NodeQuery::Compiler::ParseError)
|
29
|
+
end
|
30
|
+
|
22
31
|
it 'parses within_node' do
|
23
32
|
scope = double
|
24
33
|
block = proc {}
|
25
34
|
expect(Rewriter::WithinScope).to receive(:new)
|
26
|
-
.with(instance, { type: 'send', message: 'create' }, {
|
35
|
+
.with(instance, { type: 'send', message: 'create' }, {}, &block)
|
27
36
|
.and_return(scope)
|
28
37
|
expect(scope).to receive(:process)
|
29
38
|
instance.within_node(type: 'send', message: 'create', &block)
|
@@ -33,30 +42,20 @@ module Synvert::Core
|
|
33
42
|
scope = double
|
34
43
|
block = proc {}
|
35
44
|
expect(Rewriter::WithinScope).to receive(:new)
|
36
|
-
.with(instance, { type: 'send', message: 'create' }, {
|
45
|
+
.with(instance, { type: 'send', message: 'create' }, {}, &block)
|
37
46
|
.and_return(scope)
|
38
47
|
expect(scope).to receive(:process)
|
39
48
|
instance.with_node(type: 'send', message: 'create', &block)
|
40
49
|
end
|
41
50
|
|
42
|
-
it 'parses within_node with
|
43
|
-
scope = double
|
44
|
-
block = proc {}
|
45
|
-
expect(Rewriter::WithinScope).to receive(:new)
|
46
|
-
.with(instance, { type: 'send', message: 'create' }, { stop_when_match: true, direct: false }, &block)
|
47
|
-
.and_return(scope)
|
48
|
-
expect(scope).to receive(:process)
|
49
|
-
instance.within_node({ type: 'send', message: 'create' }, { stop_when_match: true }, &block)
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'parses within_node with direct true' do
|
51
|
+
it 'parses within_node with stop_at_first_match true' do
|
53
52
|
scope = double
|
54
53
|
block = proc {}
|
55
54
|
expect(Rewriter::WithinScope).to receive(:new)
|
56
|
-
.with(instance, { type: 'send', message: 'create' }, {
|
55
|
+
.with(instance, { type: 'send', message: 'create' }, { stop_at_first_match: true }, &block)
|
57
56
|
.and_return(scope)
|
58
57
|
expect(scope).to receive(:process)
|
59
|
-
instance.within_node({ type: 'send', message: 'create' }, {
|
58
|
+
instance.within_node({ type: 'send', message: 'create' }, { stop_at_first_match: true }, &block)
|
60
59
|
end
|
61
60
|
|
62
61
|
it 'parses goto_node' do
|
@@ -98,97 +97,83 @@ module Synvert::Core
|
|
98
97
|
end
|
99
98
|
|
100
99
|
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'
|
100
|
+
instance.current_mutation = double
|
101
|
+
instance.current_node = double
|
102
|
+
expect(instance.current_mutation).to receive(:append).with(instance.current_node, 'Foobar')
|
103
|
+
instance.append 'Foobar'
|
108
104
|
end
|
109
105
|
|
110
106
|
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'
|
107
|
+
instance.current_mutation = double
|
108
|
+
instance.current_node = double
|
109
|
+
expect(instance.current_mutation).to receive(:prepend).with(instance.current_node, 'Foobar')
|
110
|
+
instance.prepend 'Foobar'
|
118
111
|
end
|
119
112
|
|
120
113
|
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'
|
114
|
+
instance.current_mutation = double
|
115
|
+
instance.current_node = double
|
116
|
+
expect(instance.current_mutation).to receive(:insert).with(instance.current_node, 'Foobar', at: 'end', to: 'receiver')
|
117
|
+
instance.insert 'Foobar', to: 'receiver'
|
130
118
|
end
|
131
119
|
|
132
120
|
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'
|
121
|
+
instance.current_mutation = double
|
122
|
+
instance.current_node = double
|
123
|
+
expect(instance.current_mutation).to receive(:insert).with(instance.current_node, 'Foobar', at: 'beginning', to: nil)
|
124
|
+
instance.insert 'Foobar', at: 'beginning'
|
142
125
|
end
|
143
126
|
|
144
127
|
it 'parses insert_after' do
|
128
|
+
instance.current_mutation = double
|
129
|
+
instance.current_node = double
|
130
|
+
expect(instance.current_mutation).to receive(:insert_after).with(instance.current_node, 'Foobar')
|
131
|
+
instance.insert_after 'Foobar'
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'parses replace_erb_stmt_with_expr' do
|
135
|
+
instance.current_mutation = double
|
136
|
+
instance.current_node = double
|
145
137
|
action = double
|
146
|
-
expect(
|
147
|
-
|
148
|
-
'{{arguments.first}}.include FactoryGirl::Syntax::Methods'
|
149
|
-
).and_return(action)
|
138
|
+
expect(instance.current_mutation).to receive(:actions).and_return([])
|
139
|
+
expect(Rewriter::ReplaceErbStmtWithExprAction).to receive(:new).with(instance.current_node).and_return(action)
|
150
140
|
expect(action).to receive(:process)
|
151
|
-
instance.
|
141
|
+
instance.replace_erb_stmt_with_expr
|
152
142
|
end
|
153
143
|
|
154
144
|
it 'parses replace_with' do
|
155
|
-
|
156
|
-
|
157
|
-
expect(
|
158
|
-
instance.replace_with '
|
145
|
+
instance.current_mutation = double
|
146
|
+
instance.current_node = double
|
147
|
+
expect(instance.current_mutation).to receive(:replace_with).with(instance.current_node, 'Foobar')
|
148
|
+
instance.replace_with 'Foobar'
|
159
149
|
end
|
160
150
|
|
161
151
|
it 'parses replace with' do
|
162
|
-
|
163
|
-
|
164
|
-
expect(
|
165
|
-
instance.replace :message, with: '
|
152
|
+
instance.current_mutation = double
|
153
|
+
instance.current_node = double
|
154
|
+
expect(instance.current_mutation).to receive(:replace).with(instance.current_node, :message, with: 'Foobar')
|
155
|
+
instance.replace :message, with: 'Foobar'
|
166
156
|
end
|
167
157
|
|
168
158
|
it 'parses remove' do
|
169
|
-
|
170
|
-
|
171
|
-
expect(
|
159
|
+
instance.current_mutation = double
|
160
|
+
instance.current_node = double
|
161
|
+
expect(instance.current_mutation).to receive(:remove).with(instance.current_node, and_comma: true)
|
172
162
|
instance.remove and_comma: true
|
173
163
|
end
|
174
164
|
|
175
|
-
it 'parses
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
:dot,
|
180
|
-
:message,
|
181
|
-
{ and_comma: true }
|
182
|
-
).and_return(action)
|
183
|
-
expect(action).to receive(:process)
|
165
|
+
it 'parses delete' do
|
166
|
+
instance.current_mutation = double
|
167
|
+
instance.current_node = double
|
168
|
+
expect(instance.current_mutation).to receive(:delete).with(instance.current_node, :dot, :message, and_comma: true)
|
184
169
|
instance.delete :dot, :message, and_comma: true
|
185
170
|
end
|
186
171
|
|
187
172
|
it 'parses wrap with' do
|
188
|
-
|
189
|
-
|
190
|
-
expect(
|
191
|
-
instance.wrap with: 'module
|
173
|
+
instance.current_mutation = double
|
174
|
+
instance.current_node = double
|
175
|
+
expect(instance.current_mutation).to receive(:wrap).with(instance.current_node, with: 'module Foobar')
|
176
|
+
instance.wrap with: 'module Foobar'
|
192
177
|
end
|
193
178
|
|
194
179
|
it 'parses warn' do
|
@@ -251,32 +236,6 @@ module Synvert::Core
|
|
251
236
|
instance.process
|
252
237
|
end
|
253
238
|
|
254
|
-
it 'does not read file if already read' do
|
255
|
-
instance =
|
256
|
-
Rewriter::Instance.new rewriter, ['spec/spec_helper.rb'] do
|
257
|
-
with_node type: 'block', caller: { receiver: 'RSpec', message: 'configure' } do
|
258
|
-
unless_exist_node type: 'send', message: 'include', arguments: ['FactoryGirl::Syntax::Methods'] do
|
259
|
-
insert '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
|
260
|
-
end
|
261
|
-
end
|
262
|
-
end
|
263
|
-
input = <<~EOS
|
264
|
-
RSpec.configure do |config|
|
265
|
-
config.include FactoryGirl::Syntax::Methods
|
266
|
-
end
|
267
|
-
EOS
|
268
|
-
output = <<~EOS
|
269
|
-
RSpec.configure do |config|
|
270
|
-
config.include FactoryGirl::Syntax::Methods
|
271
|
-
end
|
272
|
-
EOS
|
273
|
-
expect(Dir).to receive(:glob).with('./spec/spec_helper.rb').and_return(['spec/spec_helper.rb']).twice
|
274
|
-
expect(File).to receive(:read).with('spec/spec_helper.rb', encoding: 'UTF-8').and_return(input).once
|
275
|
-
expect(File).not_to receive(:write).with('spec/spec_helper.rb', output)
|
276
|
-
instance.process
|
277
|
-
instance.process
|
278
|
-
end
|
279
|
-
|
280
239
|
it 'updates file_source and file_ast when writing a file' do
|
281
240
|
instance =
|
282
241
|
Rewriter::Instance.new rewriter, ['spec/**/*_spec.rb'] do
|
@@ -308,32 +267,6 @@ module Synvert::Core
|
|
308
267
|
end
|
309
268
|
end
|
310
269
|
|
311
|
-
describe '#get_conflict_actions' do
|
312
|
-
let(:rewriter) { Rewriter.new('foo', 'bar') }
|
313
|
-
|
314
|
-
it 'has no conflict' do
|
315
|
-
action1 = double(begin_pos: 10, end_pos: 20)
|
316
|
-
action2 = double(begin_pos: 30, end_pos: 40)
|
317
|
-
action3 = double(begin_pos: 50, end_pos: 60)
|
318
|
-
instance = Rewriter::Instance.new rewriter, ['spec/spec_helper.rb']
|
319
|
-
instance.instance_variable_set :@actions, [action1, action2, action3]
|
320
|
-
conflict_actions = instance.send(:get_conflict_actions)
|
321
|
-
expect(conflict_actions).to eq []
|
322
|
-
expect(instance.instance_variable_get(:@actions)).to eq [action1, action2, action3]
|
323
|
-
end
|
324
|
-
|
325
|
-
it 'has no conflict' do
|
326
|
-
action1 = double(begin_pos: 30, end_pos: 40)
|
327
|
-
action2 = double(begin_pos: 50, end_pos: 60)
|
328
|
-
action3 = double(begin_pos: 10, end_pos: 20)
|
329
|
-
instance = Rewriter::Instance.new rewriter, ['spec/spec_helper.rb']
|
330
|
-
instance.instance_variable_set :@actions, [action1, action2, action3]
|
331
|
-
conflict_actions = instance.send(:get_conflict_actions)
|
332
|
-
expect(conflict_actions).to eq [action2, action1]
|
333
|
-
expect(instance.instance_variable_get(:@actions)).to eq [action3]
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
270
|
describe '#process_with_node' do
|
338
271
|
it 'resets current_node' do
|
339
272
|
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
|
@@ -58,18 +55,6 @@ module Synvert::Core
|
|
58
55
|
expect(block_nodes.size).to eq 2
|
59
56
|
end
|
60
57
|
|
61
|
-
it 'raises ParseError' do
|
62
|
-
scope = described_class.new(instance, 'synvert') {}
|
63
|
-
expect {
|
64
|
-
scope.process
|
65
|
-
}.to raise_error(NodeQuery::Compiler::ParseError)
|
66
|
-
|
67
|
-
scope = described_class.new(instance, '.block <caller.arguments> .hash') {}
|
68
|
-
expect {
|
69
|
-
scope.process
|
70
|
-
}.to raise_error(NodeQuery::Compiler::ParseError)
|
71
|
-
end
|
72
|
-
|
73
58
|
it 'raises InvalidOperatorError' do
|
74
59
|
scope = described_class.new(instance, '.send[receiver IN FactoryGirl]') {}
|
75
60
|
expect {
|
@@ -9,19 +9,18 @@ module Synvert::Core
|
|
9
9
|
Rewriter::Instance.new(rewriter, 'file pattern')
|
10
10
|
}
|
11
11
|
let(:source) { <<~EOS }
|
12
|
-
describe
|
13
|
-
|
14
|
-
|
12
|
+
describe User do
|
13
|
+
describe 'create' do
|
14
|
+
it 'creates user' do
|
15
|
+
FactoryGirl.create :user
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
EOS
|
18
20
|
|
19
21
|
let(:node) { Parser::CurrentRuby.parse(source) }
|
20
22
|
|
21
|
-
before
|
22
|
-
Rewriter::Instance.reset
|
23
|
-
instance.current_node = node
|
24
|
-
end
|
23
|
+
before { instance.current_node = node }
|
25
24
|
|
26
25
|
describe '#process' do
|
27
26
|
it 'not call block if no matching node' do
|
@@ -42,7 +41,7 @@ module Synvert::Core
|
|
42
41
|
type: 'send',
|
43
42
|
receiver: 'FactoryGirl',
|
44
43
|
message: 'create',
|
45
|
-
arguments: [':
|
44
|
+
arguments: [':user'] do
|
46
45
|
run = true
|
47
46
|
type_in_scope = node.type
|
48
47
|
end
|
@@ -55,27 +54,37 @@ module Synvert::Core
|
|
55
54
|
it 'matches multiple block nodes' do
|
56
55
|
block_nodes = []
|
57
56
|
scope =
|
58
|
-
Rewriter::WithinScope.new(instance, { type: 'block' }
|
57
|
+
Rewriter::WithinScope.new(instance, { type: 'block' }) do
|
58
|
+
block_nodes << node
|
59
|
+
end
|
60
|
+
scope.process
|
61
|
+
expect(block_nodes.size).to eq 3
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'matches only 2 block nodes if including_self is false' do
|
65
|
+
block_nodes = []
|
66
|
+
scope =
|
67
|
+
Rewriter::WithinScope.new(instance, { type: 'block' }, { including_self: false }) do
|
59
68
|
block_nodes << node
|
60
69
|
end
|
61
70
|
scope.process
|
62
71
|
expect(block_nodes.size).to eq 2
|
63
72
|
end
|
64
73
|
|
65
|
-
it 'matches only one block node if
|
74
|
+
it 'matches only one block node if recursive is false' do
|
66
75
|
block_nodes = []
|
67
76
|
scope =
|
68
|
-
Rewriter::WithinScope.new(instance, { type: 'block' }, {
|
77
|
+
Rewriter::WithinScope.new(instance, { type: 'block' }, { recursive: false }) do
|
69
78
|
block_nodes << node
|
70
79
|
end
|
71
80
|
scope.process
|
72
81
|
expect(block_nodes.size).to eq 1
|
73
82
|
end
|
74
83
|
|
75
|
-
it 'matches only one
|
84
|
+
it 'matches only one block node if stop_at_first_match is true' do
|
76
85
|
block_nodes = []
|
77
86
|
scope =
|
78
|
-
Rewriter::WithinScope.new(instance, { type: 'block' }, {
|
87
|
+
Rewriter::WithinScope.new(instance, { type: 'block' }, { stop_at_first_match: true }) do
|
79
88
|
block_nodes << node
|
80
89
|
end
|
81
90
|
scope.process
|
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
|
-
spec.add_runtime_dependency "activesupport"
|
22
|
+
spec.add_runtime_dependency "activesupport", "< 7.0.0"
|
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,17 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: synvert-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.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-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "<"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 7.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "<"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 7.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: erubis
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
@@ -25,7 +39,21 @@ dependencies:
|
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
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
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
30
58
|
requirements:
|
31
59
|
- - ">="
|
@@ -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
|
@@ -64,53 +106,19 @@ files:
|
|
64
106
|
- ".rspec"
|
65
107
|
- CHANGELOG.md
|
66
108
|
- Gemfile
|
109
|
+
- Gemfile.lock
|
67
110
|
- Guardfile
|
68
111
|
- LICENSE.txt
|
69
112
|
- README.md
|
70
113
|
- Rakefile
|
71
114
|
- lib/synvert/core.rb
|
72
|
-
- lib/synvert/core/array_ext.rb
|
73
115
|
- lib/synvert/core/configuration.rb
|
74
116
|
- lib/synvert/core/engine.rb
|
75
117
|
- lib/synvert/core/engine/erb.rb
|
76
118
|
- lib/synvert/core/exceptions.rb
|
77
119
|
- 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/basic_selector.rb
|
84
|
-
- lib/synvert/core/node_query/compiler/boolean.rb
|
85
|
-
- lib/synvert/core/node_query/compiler/comparable.rb
|
86
|
-
- lib/synvert/core/node_query/compiler/dynamic_attribute.rb
|
87
|
-
- lib/synvert/core/node_query/compiler/expression.rb
|
88
|
-
- lib/synvert/core/node_query/compiler/float.rb
|
89
|
-
- lib/synvert/core/node_query/compiler/identifier.rb
|
90
|
-
- lib/synvert/core/node_query/compiler/integer.rb
|
91
|
-
- lib/synvert/core/node_query/compiler/invalid_operator_error.rb
|
92
|
-
- lib/synvert/core/node_query/compiler/nil.rb
|
93
|
-
- lib/synvert/core/node_query/compiler/parse_error.rb
|
94
|
-
- lib/synvert/core/node_query/compiler/regexp.rb
|
95
|
-
- lib/synvert/core/node_query/compiler/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
120
|
- 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
121
|
- 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
122
|
- lib/synvert/core/rewriter/any_value.rb
|
115
123
|
- lib/synvert/core/rewriter/condition.rb
|
116
124
|
- lib/synvert/core/rewriter/condition/if_exist_condition.rb
|
@@ -130,19 +138,7 @@ files:
|
|
130
138
|
- spec/support/parser_helper.rb
|
131
139
|
- spec/synvert/core/engine/erb_spec.rb
|
132
140
|
- 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
141
|
- 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
142
|
- spec/synvert/core/rewriter/condition/if_exist_condition_spec.rb
|
147
143
|
- spec/synvert/core/rewriter/condition/if_only_exist_condition_spec.rb
|
148
144
|
- spec/synvert/core/rewriter/condition/unless_exist_condition_spec.rb
|
@@ -186,19 +182,7 @@ test_files:
|
|
186
182
|
- spec/support/parser_helper.rb
|
187
183
|
- spec/synvert/core/engine/erb_spec.rb
|
188
184
|
- 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
185
|
- 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
186
|
- spec/synvert/core/rewriter/condition/if_exist_condition_spec.rb
|
203
187
|
- spec/synvert/core/rewriter/condition/if_only_exist_condition_spec.rb
|
204
188
|
- 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
|