node_query 1.13.8 → 1.13.9
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 +5 -0
- data/Gemfile.lock +1 -1
- data/lib/node_query/compiler/attribute.rb +1 -1
- data/lib/node_query/compiler/basic_selector.rb +1 -1
- data/lib/node_query/compiler/comparable.rb +8 -8
- data/lib/node_query/compiler/selector.rb +1 -1
- data/lib/node_query/version.rb +1 -1
- data/lib/node_query_lexer.rex +2 -15
- data/lib/node_query_lexer.rex.rb +3 -30
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 215ae99bb6d5fddf440256e3982a06f8795ab484008dcc736679151f0b1c963a
|
4
|
+
data.tar.gz: 0e69083c8350bc90058d0b5d62e90046d612a4e26e59141bd7722b8657ec6f06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 561dff60b719e9596343e4f667939b06ffec1078b0802c1236dba472d7051672e1203d610d0e5b4685fcc936728355b69935f1fdf2d2166f85910afa7f484485
|
7
|
+
data.tar.gz: c08f454ba9300e0401d08cff16f269348e9913a6bb1d5b52d237cd0abe45cbb15f5b7dade4f49bdb0b24c279843f954dbf2b4d5ef200533109c14df8a00a9b35
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -7,7 +7,7 @@ module NodeQuery::Compiler
|
|
7
7
|
# @param key [String] the key
|
8
8
|
# @param value the value can be any class implement {NodeQuery::Compiler::Comparable}
|
9
9
|
# @param operator [String] the operator
|
10
|
-
def initialize(key:, value:, operator: '
|
10
|
+
def initialize(key:, value:, operator: '=')
|
11
11
|
@key = key
|
12
12
|
@value = value
|
13
13
|
@operator = operator
|
@@ -15,7 +15,7 @@ module NodeQuery::Compiler
|
|
15
15
|
# @param node [Node] the node
|
16
16
|
# @param base_node [Node] the base node for evaluated value
|
17
17
|
# @return [Boolean]
|
18
|
-
def match?(node, base_node, _operator = '
|
18
|
+
def match?(node, base_node, _operator = '=')
|
19
19
|
return false unless node
|
20
20
|
|
21
21
|
@node_type.to_sym == NodeQuery.adapter.get_node_type(node) && (!@attribute_list || @attribute_list.match?(
|
@@ -3,17 +3,17 @@
|
|
3
3
|
module NodeQuery::Compiler
|
4
4
|
# Compare acutal value with expected value.
|
5
5
|
module Comparable
|
6
|
-
SIMPLE_VALID_OPERATORS = ['
|
7
|
-
STRING_VALID_OPERATORS = ['
|
8
|
-
NUMBER_VALID_OPERATORS = ['
|
9
|
-
ARRAY_VALID_OPERATORS = ['
|
6
|
+
SIMPLE_VALID_OPERATORS = ['=', '!=', 'includes', 'not_includes']
|
7
|
+
STRING_VALID_OPERATORS = ['=', '!=', '^=', '$=', '*=', 'includes', 'not_includes']
|
8
|
+
NUMBER_VALID_OPERATORS = ['=', '!=', '>', '>=', '<', '<=', 'includes', 'not_includes']
|
9
|
+
ARRAY_VALID_OPERATORS = ['=', '!=', 'in', 'not_in']
|
10
10
|
REGEXP_VALID_OPERATORS = ['=~', '!~']
|
11
11
|
|
12
12
|
# Check if the actual value matches the expected value.
|
13
13
|
#
|
14
14
|
# @param node [Node] node to calculate actual value
|
15
15
|
# @param base_node [Node] the base node for evaluated value
|
16
|
-
# @param operator [String] operator to compare with expected value, operator can be <code>'
|
16
|
+
# @param operator [String] operator to compare with expected value, operator can be <code>'='</code>, <code>'!='</code>, <code>'>'</code>, <code>'>='</code>, <code>'<'</code>, <code>'<='</code>, <code>'includes'</code>, <code>'in'</code>, <code>'not_in'</code>, <code>'=~'</code>, <code>'!~'</code>
|
17
17
|
# @return [Boolean] true if actual value matches the expected value
|
18
18
|
# @raise [NodeQuery::Compiler::InvalidOperatorError] if operator is invalid
|
19
19
|
def match?(node, base_node, operator)
|
@@ -51,9 +51,9 @@ module NodeQuery::Compiler
|
|
51
51
|
actual <= expected
|
52
52
|
when 'in'
|
53
53
|
if node.is_a?(Array)
|
54
|
-
node.all? { |child| expected.any? { |expected_child| expected_child.match?(child, base_node, '
|
54
|
+
node.all? { |child| expected.any? { |expected_child| expected_child.match?(child, base_node, '=') } }
|
55
55
|
else
|
56
|
-
expected.any? { |expected_child| expected_child.match?(node, base_node, '
|
56
|
+
expected.any? { |expected_child| expected_child.match?(node, base_node, '=') }
|
57
57
|
end
|
58
58
|
when 'not_in'
|
59
59
|
if node.is_a?(Array)
|
@@ -69,7 +69,7 @@ module NodeQuery::Compiler
|
|
69
69
|
if expected.is_a?(::Array)
|
70
70
|
actual.is_a?(::Array) && actual.size == expected.size &&
|
71
71
|
actual.zip(expected).all? { |actual_child, expected_child|
|
72
|
-
expected_child.match?(actual_child, base_node, '
|
72
|
+
expected_child.match?(actual_child, base_node, '=')
|
73
73
|
}
|
74
74
|
else
|
75
75
|
is_equal?(actual, expected)
|
@@ -33,7 +33,7 @@ module NodeQuery::Compiler
|
|
33
33
|
# Check if node matches the selector.
|
34
34
|
# @param node [Node] the node
|
35
35
|
# @param base_node [Node] the base node for evaluated node
|
36
|
-
def match?(node, base_node, operator = "
|
36
|
+
def match?(node, base_node, operator = "=")
|
37
37
|
if node.is_a?(::Array)
|
38
38
|
case operator
|
39
39
|
when "not_includes"
|
data/lib/node_query/version.rb
CHANGED
data/lib/node_query_lexer.rex
CHANGED
@@ -10,6 +10,7 @@ macros
|
|
10
10
|
NODE_TYPE /\.[a-zA-Z]+/
|
11
11
|
IDENTIFIER /[@\*\-\.\w]*\w/
|
12
12
|
IDENTIFIER_VALUE /[@\.\w!&:\?<>=]+/
|
13
|
+
OPERATOR /(\^=|\$=|\*=|!=|=~|!~|>=|<=|>|<|=|not includes|includes|not in|in)/i
|
13
14
|
FALSE /false/
|
14
15
|
FLOAT /\-?\d+\.\d+/
|
15
16
|
INTEGER /\-?\d+/
|
@@ -39,21 +40,7 @@ rules
|
|
39
40
|
/#{CLOSE_SELECTOR}/ { [:tCLOSE_SELECTOR, text] }
|
40
41
|
/#{OPEN_ATTRIBUTE}/ { @nested_count += 1; @state = :KEY; [:tOPEN_ATTRIBUTE, text] }
|
41
42
|
:KEY /\s+/
|
42
|
-
:KEY
|
43
|
-
:KEY /\$=/ { @state = :VALUE; [:tOPERATOR, '$='] }
|
44
|
-
:KEY /\*=/ { @state = :VALUE; [:tOPERATOR, '*='] }
|
45
|
-
:KEY /!=/ { @state = :VALUE; [:tOPERATOR, '!='] }
|
46
|
-
:KEY /=~/ { @state = :VALUE; [:tOPERATOR, '=~'] }
|
47
|
-
:KEY /!~/ { @state = :VALUE; [:tOPERATOR, '!~'] }
|
48
|
-
:KEY />=/ { @state = :VALUE; [:tOPERATOR, '>='] }
|
49
|
-
:KEY /<=/ { @state = :VALUE; [:tOPERATOR, '<='] }
|
50
|
-
:KEY />/ { @state = :VALUE; [:tOPERATOR, '>'] }
|
51
|
-
:KEY /</ { @state = :VALUE; [:tOPERATOR, '<'] }
|
52
|
-
:KEY /=/ { @state = :VALUE; [:tOPERATOR, '=='] }
|
53
|
-
:KEY /not includes/i { @state = :VALUE; [:tOPERATOR, 'not_includes'] }
|
54
|
-
:KEY /includes/i { @state = :VALUE; [:tOPERATOR, 'includes'] }
|
55
|
-
:KEY /not in/i { @state = :VALUE; [:tOPERATOR, 'not_in'] }
|
56
|
-
:KEY /in/i { @state = :VALUE; [:tOPERATOR, 'in'] }
|
43
|
+
:KEY /#{OPERATOR}/ { @state = :VALUE; [:tOPERATOR, text.downcase.sub(' ', '_')] }
|
57
44
|
:KEY /#{IDENTIFIER}/ { [:tKEY, text] }
|
58
45
|
:VALUE /\s+/
|
59
46
|
:VALUE /\[\]=/ { [:tIDENTIFIER_VALUE, text] }
|
data/lib/node_query_lexer.rex.rb
CHANGED
@@ -23,6 +23,7 @@ class NodeQueryLexer
|
|
23
23
|
NODE_TYPE = /\.[a-zA-Z]+/
|
24
24
|
IDENTIFIER = /[@\*\-\.\w]*\w/
|
25
25
|
IDENTIFIER_VALUE = /[@\.\w!&:\?<>=]+/
|
26
|
+
OPERATOR = /(\^=|\$=|\*=|!=|=~|!~|>=|<=|>|<|=|not includes|includes|not in|in)/i
|
26
27
|
FALSE = /false/
|
27
28
|
FLOAT = /\-?\d+\.\d+/
|
28
29
|
INTEGER = /\-?\d+/
|
@@ -157,36 +158,8 @@ class NodeQueryLexer
|
|
157
158
|
case
|
158
159
|
when ss.skip(/\s+/) then
|
159
160
|
# do nothing
|
160
|
-
when ss.
|
161
|
-
action { @state = :VALUE; [:tOPERATOR, '
|
162
|
-
when ss.skip(/\$=/) then
|
163
|
-
action { @state = :VALUE; [:tOPERATOR, '$='] }
|
164
|
-
when ss.skip(/\*=/) then
|
165
|
-
action { @state = :VALUE; [:tOPERATOR, '*='] }
|
166
|
-
when ss.skip(/!=/) then
|
167
|
-
action { @state = :VALUE; [:tOPERATOR, '!='] }
|
168
|
-
when ss.skip(/=~/) then
|
169
|
-
action { @state = :VALUE; [:tOPERATOR, '=~'] }
|
170
|
-
when ss.skip(/!~/) then
|
171
|
-
action { @state = :VALUE; [:tOPERATOR, '!~'] }
|
172
|
-
when ss.skip(/>=/) then
|
173
|
-
action { @state = :VALUE; [:tOPERATOR, '>='] }
|
174
|
-
when ss.skip(/<=/) then
|
175
|
-
action { @state = :VALUE; [:tOPERATOR, '<='] }
|
176
|
-
when ss.skip(/>/) then
|
177
|
-
action { @state = :VALUE; [:tOPERATOR, '>'] }
|
178
|
-
when ss.skip(/</) then
|
179
|
-
action { @state = :VALUE; [:tOPERATOR, '<'] }
|
180
|
-
when ss.skip(/=/) then
|
181
|
-
action { @state = :VALUE; [:tOPERATOR, '=='] }
|
182
|
-
when ss.skip(/not includes/i) then
|
183
|
-
action { @state = :VALUE; [:tOPERATOR, 'not_includes'] }
|
184
|
-
when ss.skip(/includes/i) then
|
185
|
-
action { @state = :VALUE; [:tOPERATOR, 'includes'] }
|
186
|
-
when ss.skip(/not in/i) then
|
187
|
-
action { @state = :VALUE; [:tOPERATOR, 'not_in'] }
|
188
|
-
when ss.skip(/in/i) then
|
189
|
-
action { @state = :VALUE; [:tOPERATOR, 'in'] }
|
161
|
+
when text = ss.scan(/#{OPERATOR}/) then
|
162
|
+
action { @state = :VALUE; [:tOPERATOR, text.downcase.sub(' ', '_')] }
|
190
163
|
when text = ss.scan(/#{IDENTIFIER}/) then
|
191
164
|
action { [:tKEY, text] }
|
192
165
|
else
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: node_query
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.13.
|
4
|
+
version: 1.13.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: ast node query language
|
14
14
|
email:
|
@@ -78,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
78
|
- !ruby/object:Gem::Version
|
79
79
|
version: '0'
|
80
80
|
requirements: []
|
81
|
-
rubygems_version: 3.4.
|
81
|
+
rubygems_version: 3.4.17
|
82
82
|
signing_key:
|
83
83
|
specification_version: 4
|
84
84
|
summary: ast node query language
|