synvert-core 1.2.1 → 1.4.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/CHANGELOG.md +16 -0
- data/Gemfile +9 -0
- data/lib/synvert/core/node_query/compiler/attribute.rb +6 -18
- data/lib/synvert/core/node_query/compiler/basic_selector.rb +28 -0
- data/lib/synvert/core/node_query/compiler/comparable.rb +26 -19
- data/lib/synvert/core/node_query/compiler/expression.rb +8 -93
- data/lib/synvert/core/node_query/compiler/identifier.rb +1 -1
- data/lib/synvert/core/node_query/compiler/regexp.rb +2 -2
- data/lib/synvert/core/node_query/compiler/selector.rb +91 -34
- data/lib/synvert/core/node_query/compiler/string.rb +1 -1
- data/lib/synvert/core/node_query/compiler.rb +1 -0
- data/lib/synvert/core/node_query/lexer.rex +20 -26
- data/lib/synvert/core/node_query/lexer.rex.rb +35 -51
- data/lib/synvert/core/node_query/parser.racc.rb +115 -293
- data/lib/synvert/core/node_query/parser.y +16 -35
- data/lib/synvert/core/node_query.rb +3 -4
- data/lib/synvert/core/rewriter/action/delete_action.rb +4 -2
- data/lib/synvert/core/rewriter/action/remove_action.rb +5 -2
- data/lib/synvert/core/rewriter/instance.rb +8 -4
- data/lib/synvert/core/version.rb +1 -1
- data/spec/synvert/core/node_query/lexer_spec.rb +46 -106
- data/spec/synvert/core/node_query/parser_spec.rb +116 -129
- data/spec/synvert/core/rewriter/instance_spec.rb +12 -7
- data/spec/synvert/core/rewriter/scope/query_scope_spec.rb +9 -2
- data/synvert-core-ruby.gemspec +0 -10
- metadata +3 -128
@@ -1,141 +1,138 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
def assert_parser(source)
|
4
|
+
expect(parser.parse(source).to_s).to eq source
|
5
|
+
end
|
6
|
+
|
3
7
|
module Synvert::Core::NodeQuery
|
4
8
|
RSpec.describe Parser do
|
5
9
|
let(:parser) { described_class.new }
|
6
10
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
source = '.send[message=:create]'
|
13
|
-
assert_parser(source)
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'parses two selectors' do
|
17
|
-
source = '.class[name=Synvert] .def[name="foobar"]'
|
18
|
-
assert_parser(source)
|
19
|
-
end
|
11
|
+
describe '#toString' do
|
12
|
+
it 'parses one selector' do
|
13
|
+
source = '.send[message=:create]'
|
14
|
+
assert_parser(source)
|
15
|
+
end
|
20
16
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
it 'parses two selectors' do
|
18
|
+
source = '.class[name=Synvert] .def[name="foobar"]'
|
19
|
+
assert_parser(source)
|
20
|
+
end
|
25
21
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
22
|
+
it 'parses three selectors' do
|
23
|
+
source = '.class[name=Synvert] .def[name="foobar"] .send[message=create]'
|
24
|
+
assert_parser(source)
|
25
|
+
end
|
30
26
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
27
|
+
it 'parses child selector' do
|
28
|
+
source = '.class[name=Synvert] > .def[name="foobar"]'
|
29
|
+
assert_parser(source)
|
30
|
+
end
|
35
31
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
it 'parses scope' do
|
33
|
+
source = '.block body > .send'
|
34
|
+
assert_parser(source)
|
35
|
+
end
|
40
36
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
37
|
+
it 'parses :has selector' do
|
38
|
+
source = '.class :has(> .def)'
|
39
|
+
assert_parser(source)
|
40
|
+
end
|
45
41
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
42
|
+
it 'parses :not_has selector' do
|
43
|
+
source = '.class :not_has(> .def)'
|
44
|
+
assert_parser(source)
|
45
|
+
end
|
50
46
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
47
|
+
it 'parses root :has selector' do
|
48
|
+
source = ':has(.def)'
|
49
|
+
assert_parser(source)
|
50
|
+
end
|
55
51
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
52
|
+
it 'parses multiple attributes' do
|
53
|
+
source = '.send[receiver=nil][message=:create]'
|
54
|
+
assert_parser(source)
|
55
|
+
end
|
60
56
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
57
|
+
it 'parses nested attributes' do
|
58
|
+
source = '.send[receiver.message=:create]'
|
59
|
+
assert_parser(source)
|
60
|
+
end
|
65
61
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
62
|
+
it 'parses selector value' do
|
63
|
+
source = '.send[receiver=.send[message=:create]]'
|
64
|
+
assert_parser(source)
|
65
|
+
end
|
70
66
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
67
|
+
it 'parses start with operator' do
|
68
|
+
source = '.def[name^=synvert]'
|
69
|
+
assert_parser(source)
|
70
|
+
end
|
75
71
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
72
|
+
it 'parses end with operator' do
|
73
|
+
source = '.def[name$=synvert]'
|
74
|
+
assert_parser(source)
|
75
|
+
end
|
80
76
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
77
|
+
it 'parses contain operator' do
|
78
|
+
source = '.def[name*=synvert]'
|
79
|
+
assert_parser(source)
|
80
|
+
end
|
85
81
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
82
|
+
it 'parses not equal operator' do
|
83
|
+
source = '.send[receiver=.send[message!=:create]]'
|
84
|
+
assert_parser(source)
|
85
|
+
end
|
90
86
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
87
|
+
it 'parses greater than operator' do
|
88
|
+
source = '.send[receiver=.send[arguments.size>1]]'
|
89
|
+
assert_parser(source)
|
90
|
+
end
|
95
91
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
92
|
+
it 'parses greater than or equal operator' do
|
93
|
+
source = '.send[receiver=.send[arguments.size>=1]]'
|
94
|
+
assert_parser(source)
|
95
|
+
end
|
100
96
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
97
|
+
it 'parses less than operator' do
|
98
|
+
source = '.send[receiver=.send[arguments.size<1]]'
|
99
|
+
assert_parser(source)
|
100
|
+
end
|
105
101
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
102
|
+
it 'parses less than or equal operator' do
|
103
|
+
source = '.send[receiver=.send[arguments.size<=1]]'
|
104
|
+
assert_parser(source)
|
105
|
+
end
|
110
106
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
107
|
+
it 'parses in operator' do
|
108
|
+
source = '.def[name in (foo bar)]'
|
109
|
+
assert_parser(source)
|
110
|
+
end
|
115
111
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
112
|
+
it 'parses not_in operator' do
|
113
|
+
source = '.def[name not in (foo bar)]'
|
114
|
+
assert_parser(source)
|
115
|
+
end
|
120
116
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
117
|
+
it 'parses includes operator' do
|
118
|
+
source = '.def[arguments includes &block]'
|
119
|
+
assert_parser(source)
|
120
|
+
end
|
125
121
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
122
|
+
it 'parses empty string' do
|
123
|
+
source = '.send[arguments.first=""]'
|
124
|
+
assert_parser(source)
|
125
|
+
end
|
130
126
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
127
|
+
it 'parses []=' do
|
128
|
+
source = '.send[message=[]=]'
|
129
|
+
assert_parser(source)
|
130
|
+
end
|
135
131
|
|
136
|
-
|
137
|
-
|
138
|
-
|
132
|
+
it 'parses :[]' do
|
133
|
+
source = '.send[message=:[]]'
|
134
|
+
assert_parser(source)
|
135
|
+
end
|
139
136
|
end
|
140
137
|
|
141
138
|
describe '#query_nodes' do
|
@@ -178,31 +175,21 @@ module Synvert::Core::NodeQuery
|
|
178
175
|
expect(expression.query_nodes(node)).to eq node.body
|
179
176
|
end
|
180
177
|
|
181
|
-
it 'matches
|
182
|
-
expression = parser.parse('.def
|
183
|
-
expect(expression.query_nodes(node)).to eq [node.body.first]
|
178
|
+
it 'matches start with' do
|
179
|
+
expression = parser.parse('.def[name^=foo]')
|
180
|
+
expect(expression.query_nodes(node)).to eq [node.body.first, node.body.last]
|
184
181
|
end
|
185
182
|
|
186
|
-
it 'matches
|
187
|
-
expression = parser.parse('.def[
|
188
|
-
expect(expression.query_nodes(node)).to eq [node.body.
|
183
|
+
it 'matches end with' do
|
184
|
+
expression = parser.parse('.def[name$=bar]')
|
185
|
+
expect(expression.query_nodes(node)).to eq [node.body.second, node.body.last]
|
189
186
|
end
|
190
187
|
|
191
|
-
it 'matches
|
192
|
-
expression = parser.parse('.def
|
188
|
+
it 'matches contain' do
|
189
|
+
expression = parser.parse('.def[name*=oob]')
|
193
190
|
expect(expression.query_nodes(node)).to eq [node.body.last]
|
194
191
|
end
|
195
192
|
|
196
|
-
it 'matches nth-child node' do
|
197
|
-
expression = parser.parse('.def:nth-child(2)')
|
198
|
-
expect(expression.query_nodes(node)).to eq [node.body.second]
|
199
|
-
end
|
200
|
-
|
201
|
-
it 'matches nth-last-child node' do
|
202
|
-
expression = parser.parse('.def:nth-last-child(2)')
|
203
|
-
expect(expression.query_nodes(node)).to eq [node.body[-2]]
|
204
|
-
end
|
205
|
-
|
206
193
|
it 'matches not equal' do
|
207
194
|
expression = parser.parse('.def[name!=foobar]')
|
208
195
|
expect(expression.query_nodes(node)).to eq [node.body.first, node.body.second]
|
@@ -265,15 +252,15 @@ module Synvert::Core::NodeQuery
|
|
265
252
|
end
|
266
253
|
|
267
254
|
it 'matches goto scope' do
|
268
|
-
expression = parser.parse('.def
|
255
|
+
expression = parser.parse('.def body > .send[message=:create]')
|
269
256
|
expect(expression.query_nodes(node)).to eq [node.body.first.body.last, node.body.second.body.last]
|
270
257
|
|
271
|
-
expression = parser.parse('.def
|
258
|
+
expression = parser.parse('.def body .send[message=:create]')
|
272
259
|
expect(expression.query_nodes(node)).to eq [node.body.first.body.last, node.body.second.body.last]
|
273
260
|
end
|
274
261
|
|
275
262
|
it 'matches multiple goto scope' do
|
276
|
-
expression = parser.parse('.block
|
263
|
+
expression = parser.parse('.block caller.arguments .const[name=Synvert]')
|
277
264
|
expect(expression.query_nodes(test_node)).to eq [test_node.caller.arguments.first]
|
278
265
|
end
|
279
266
|
|
@@ -71,7 +71,7 @@ module Synvert::Core
|
|
71
71
|
condition = double
|
72
72
|
block = proc {}
|
73
73
|
expect(Rewriter::IfExistCondition).to receive(:new)
|
74
|
-
.with(instance, type: 'send', message: 'create', &block)
|
74
|
+
.with(instance, { type: 'send', message: 'create' }, &block)
|
75
75
|
.and_return(condition)
|
76
76
|
expect(condition).to receive(:process)
|
77
77
|
instance.if_exist_node(type: 'send', message: 'create', &block)
|
@@ -81,7 +81,7 @@ module Synvert::Core
|
|
81
81
|
condition = double
|
82
82
|
block = proc {}
|
83
83
|
expect(Rewriter::UnlessExistCondition).to receive(:new)
|
84
|
-
.with(instance, type: 'send', message: 'create', &block)
|
84
|
+
.with(instance, { type: 'send', message: 'create' }, &block)
|
85
85
|
.and_return(condition)
|
86
86
|
expect(condition).to receive(:process)
|
87
87
|
instance.unless_exist_node(type: 'send', message: 'create', &block)
|
@@ -91,7 +91,7 @@ module Synvert::Core
|
|
91
91
|
condition = double
|
92
92
|
block = proc {}
|
93
93
|
expect(Rewriter::IfOnlyExistCondition).to receive(:new)
|
94
|
-
.with(instance, type: 'send', message: 'create', &block)
|
94
|
+
.with(instance, { type: 'send', message: 'create' }, &block)
|
95
95
|
.and_return(condition)
|
96
96
|
expect(condition).to receive(:process)
|
97
97
|
instance.if_only_exist_node(type: 'send', message: 'create', &block)
|
@@ -167,16 +167,21 @@ module Synvert::Core
|
|
167
167
|
|
168
168
|
it 'parses remove' do
|
169
169
|
action = double
|
170
|
-
expect(Rewriter::RemoveAction).to receive(:new).with(instance).and_return(action)
|
170
|
+
expect(Rewriter::RemoveAction).to receive(:new).with(instance, { and_comma: true }).and_return(action)
|
171
171
|
expect(action).to receive(:process)
|
172
|
-
instance.remove
|
172
|
+
instance.remove and_comma: true
|
173
173
|
end
|
174
174
|
|
175
175
|
it 'parses remove' do
|
176
176
|
action = double
|
177
|
-
expect(Rewriter::DeleteAction).to receive(:new).with(
|
177
|
+
expect(Rewriter::DeleteAction).to receive(:new).with(
|
178
|
+
instance,
|
179
|
+
:dot,
|
180
|
+
:message,
|
181
|
+
{ and_comma: true }
|
182
|
+
).and_return(action)
|
178
183
|
expect(action).to receive(:process)
|
179
|
-
instance.delete :dot, :message
|
184
|
+
instance.delete :dot, :message, and_comma: true
|
180
185
|
end
|
181
186
|
|
182
187
|
it 'parses wrap with' do
|
@@ -59,16 +59,23 @@ module Synvert::Core
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it 'raises ParseError' do
|
62
|
-
scope = described_class.new(instance, '
|
62
|
+
scope = described_class.new(instance, 'synvert') {}
|
63
63
|
expect {
|
64
64
|
scope.process
|
65
65
|
}.to raise_error(NodeQuery::Compiler::ParseError)
|
66
66
|
|
67
|
-
scope = described_class.new(instance, '.
|
67
|
+
scope = described_class.new(instance, '.block <caller.arguments> .hash') {}
|
68
68
|
expect {
|
69
69
|
scope.process
|
70
70
|
}.to raise_error(NodeQuery::Compiler::ParseError)
|
71
71
|
end
|
72
|
+
|
73
|
+
it 'raises InvalidOperatorError' do
|
74
|
+
scope = described_class.new(instance, '.send[receiver IN FactoryGirl]') {}
|
75
|
+
expect {
|
76
|
+
scope.process
|
77
|
+
}.to raise_error(NodeQuery::Compiler::InvalidOperatorError)
|
78
|
+
end
|
72
79
|
end
|
73
80
|
end
|
74
81
|
end
|
data/synvert-core-ruby.gemspec
CHANGED
@@ -23,14 +23,4 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_runtime_dependency "activesupport"
|
24
24
|
spec.add_runtime_dependency "erubis"
|
25
25
|
spec.add_runtime_dependency "parser"
|
26
|
-
|
27
|
-
spec.add_development_dependency "bundler"
|
28
|
-
spec.add_development_dependency "guard"
|
29
|
-
spec.add_development_dependency "guard-rspec"
|
30
|
-
spec.add_development_dependency "guard-rake"
|
31
|
-
spec.add_development_dependency "oedipus_lex"
|
32
|
-
spec.add_development_dependency "racc"
|
33
|
-
spec.add_development_dependency "rake"
|
34
|
-
spec.add_development_dependency "rspec", "3.10.0"
|
35
|
-
spec.add_development_dependency "rspec-mocks", "3.10.2" # rspec-mocks 3.10.3 breaks tests
|
36
26
|
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.4.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-
|
11
|
+
date: 2022-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -52,132 +52,6 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: bundler
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: guard
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: guard-rspec
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: guard-rake
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: oedipus_lex
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: racc
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rake
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: rspec
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - '='
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: 3.10.0
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - '='
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 3.10.0
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: rspec-mocks
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - '='
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: 3.10.2
|
174
|
-
type: :development
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - '='
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: 3.10.2
|
181
55
|
description: convert ruby code to better syntax automatically.
|
182
56
|
email:
|
183
57
|
- flyerhzm@gmail.com
|
@@ -206,6 +80,7 @@ files:
|
|
206
80
|
- lib/synvert/core/node_query/compiler/array.rb
|
207
81
|
- lib/synvert/core/node_query/compiler/attribute.rb
|
208
82
|
- lib/synvert/core/node_query/compiler/attribute_list.rb
|
83
|
+
- lib/synvert/core/node_query/compiler/basic_selector.rb
|
209
84
|
- lib/synvert/core/node_query/compiler/boolean.rb
|
210
85
|
- lib/synvert/core/node_query/compiler/comparable.rb
|
211
86
|
- lib/synvert/core/node_query/compiler/dynamic_attribute.rb
|