node_query 1.4.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/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/lib/node_query/compiler/expression.rb +2 -2
- data/lib/node_query/compiler/expression_list.rb +2 -2
- data/lib/node_query/compiler/regexp.rb +10 -7
- data/lib/node_query/compiler/selector.rb +10 -6
- data/lib/node_query/compiler/string.rb +1 -1
- data/lib/node_query/helper.rb +9 -1
- data/lib/node_query/node_rules.rb +10 -6
- data/lib/node_query/version.rb +1 -1
- data/lib/node_query.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 526c6ef0b0f58f1a8f1f7aff14e147ce4220cd6366bea5d5108db29591e0ab02
|
4
|
+
data.tar.gz: 347fc60e4f3629871356757349c5a126235a192049eefa713fb15890d26033d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b94b5f913b63824d89211dc6156add8ada6963a0122cf5d6adafc60fcf20af62a4f9a239f2bd341ef12167adcf8a5785b96b9c1b6bbad41d2ebe3f0eb90b498f
|
7
|
+
data.tar.gz: 2a9613221d35553af7e91e1e2a20792dbee63572634e254633cb0951180adb48b582454dee93f6c817d870ec16962af346bb1ce4ea253b253da10cb7e78ada49
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.5.0 (2022-09-15)
|
4
|
+
|
5
|
+
* Add `Helper.to_string`
|
6
|
+
* Only check the current node if `including_self` is true and `recursive` is false
|
7
|
+
* Fix `Regexp#match?` and `String#match?`
|
8
|
+
* Rename `stop_on_match` to `stop_at_first_match`
|
9
|
+
|
3
10
|
## 1.4.0 (2022-09-14)
|
4
11
|
|
5
12
|
* Add options `including_self`, `stop_on_match` and `recursive`
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -62,7 +62,7 @@ It provides two apis: `query_nodes` and `match_node?`
|
|
62
62
|
|
63
63
|
```ruby
|
64
64
|
node_query = NodeQuery.new(nqlOrRules: String | Hash) # Initialize NodeQuery
|
65
|
-
node_query.query_nodes(node: Node, options = { including_self: true,
|
65
|
+
node_query.query_nodes(node: Node, options = { including_self: true, stop_at_first_match: false, recursive: true }): Node[] # Get the matching nodes.
|
66
66
|
node_query.match_node?(node: Node): boolean # Check if the node matches nql or rules.
|
67
67
|
```
|
68
68
|
|
@@ -15,8 +15,8 @@ module NodeQuery::Compiler
|
|
15
15
|
# @param node [Node] node to match
|
16
16
|
# @param options [Hash] if query the current node
|
17
17
|
# @option options [boolean] :including_self if query the current node, default is ture
|
18
|
-
# @option options [boolean] :
|
19
|
-
# @option options [boolean] :recursive if
|
18
|
+
# @option options [boolean] :stop_at_first_match if stop at first match, default is false
|
19
|
+
# @option options [boolean] :recursive if recursively query child nodes, default is true
|
20
20
|
# @return [Array<Node>] matching nodes.
|
21
21
|
def query_nodes(node, options = {})
|
22
22
|
matching_nodes = @selector.query_nodes(node, options)
|
@@ -15,8 +15,8 @@ module NodeQuery::Compiler
|
|
15
15
|
# @param node [Node] node to match
|
16
16
|
# @param options [Hash] if query the current node
|
17
17
|
# @option options [boolean] :including_self if query the current node, default is ture
|
18
|
-
# @option options [boolean] :
|
19
|
-
# @option options [boolean] :recursive if
|
18
|
+
# @option options [boolean] :stop_at_first_match if stop at first match, default is false
|
19
|
+
# @option options [boolean] :recursive if recursively query child nodes, default is true
|
20
20
|
# @return [Array<Node>] matching nodes.
|
21
21
|
def query_nodes(node, options = {})
|
22
22
|
matching_nodes = @expression.query_nodes(node, options)
|
@@ -13,13 +13,16 @@ module NodeQuery::Compiler
|
|
13
13
|
|
14
14
|
# Check if the regexp value matches the node value.
|
15
15
|
# @param node [Node] the node
|
16
|
-
# @
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
16
|
+
# @param operator [String] the operator
|
17
|
+
# @return [Boolean] true if the regexp value matches the node value, otherwise, false.
|
18
|
+
def match?(node, operator = '=~')
|
19
|
+
match =
|
20
|
+
if NodeQuery.adapter.is_node?(node)
|
21
|
+
@value.match(NodeQuery.adapter.get_source(node))
|
22
|
+
else
|
23
|
+
@value.match(node.to_s)
|
24
|
+
end
|
25
|
+
operator == '=~' ? match : !match
|
23
26
|
end
|
24
27
|
|
25
28
|
# Get valid operators.
|
@@ -35,11 +35,11 @@ module NodeQuery::Compiler
|
|
35
35
|
# @param node [Node] node to match
|
36
36
|
# @param options [Hash] if query the current node
|
37
37
|
# @option options [boolean] :including_self if query the current node, default is ture
|
38
|
-
# @option options [boolean] :
|
39
|
-
# @option options [boolean] :recursive if
|
38
|
+
# @option options [boolean] :stop_at_first_match if stop at first match, default is false
|
39
|
+
# @option options [boolean] :recursive if recursively query child nodes, default is true
|
40
40
|
# @return [Array<Node>] matching nodes.
|
41
41
|
def query_nodes(node, options = {})
|
42
|
-
options = { including_self: true,
|
42
|
+
options = { including_self: true, stop_at_first_match: false, recursive: true }.merge(options)
|
43
43
|
return find_nodes_by_relationship(node) if @relationship
|
44
44
|
|
45
45
|
if node.is_a?(::Array)
|
@@ -48,24 +48,28 @@ module NodeQuery::Compiler
|
|
48
48
|
|
49
49
|
return find_nodes_by_goto_scope(node) if @goto_scope
|
50
50
|
|
51
|
+
if options[:including_self] && !options[:recursive]
|
52
|
+
return match?(node) ? [node] : []
|
53
|
+
end
|
54
|
+
|
51
55
|
nodes = []
|
52
56
|
if options[:including_self] && match?(node)
|
53
57
|
nodes << node
|
54
|
-
return
|
58
|
+
return nodes if options[:stop_at_first_match]
|
55
59
|
end
|
56
60
|
if @basic_selector
|
57
61
|
if options[:recursive]
|
58
62
|
NodeQuery::Helper.handle_recursive_child(node) do |child_node|
|
59
63
|
if match?(child_node)
|
60
64
|
nodes << child_node
|
61
|
-
break if options[:
|
65
|
+
break if options[:stop_at_first_match]
|
62
66
|
end
|
63
67
|
end
|
64
68
|
else
|
65
69
|
NodeQuery.adapter.get_children(node).each do |child_node|
|
66
70
|
if match?(child_node)
|
67
71
|
nodes << child_node
|
68
|
-
break if options[:
|
72
|
+
break if options[:stop_at_first_match]
|
69
73
|
end
|
70
74
|
end
|
71
75
|
end
|
@@ -27,7 +27,7 @@ module NodeQuery::Compiler
|
|
27
27
|
# @param node [Node] the node
|
28
28
|
# @return [Boolean] true if the actual value equals the node value.
|
29
29
|
def is_equal?(node)
|
30
|
-
actual_value(node)
|
30
|
+
NodeQuery::Helper.to_string(actual_value(node)) == expected_value
|
31
31
|
end
|
32
32
|
|
33
33
|
# Get valid operators.
|
data/lib/node_query/helper.rb
CHANGED
@@ -50,9 +50,17 @@ class NodeQuery::Helper
|
|
50
50
|
def evaluate_node_value(node, str)
|
51
51
|
str.scan(/{{(.*?)}}/).each do |match_data|
|
52
52
|
target_node = NodeQuery::Helper.get_target_node(node, match_data.first)
|
53
|
-
str = str.sub("{{#{match_data.first}}}",
|
53
|
+
str = str.sub("{{#{match_data.first}}}", to_string(target_node))
|
54
54
|
end
|
55
55
|
str
|
56
56
|
end
|
57
|
+
|
58
|
+
def to_string(node)
|
59
|
+
if NodeQuery.adapter.is_node?(node)
|
60
|
+
return NodeQuery.adapter.get_source(node)
|
61
|
+
end
|
62
|
+
|
63
|
+
node.to_s
|
64
|
+
end
|
57
65
|
end
|
58
66
|
end
|
@@ -13,28 +13,32 @@ class NodeQuery::NodeRules
|
|
13
13
|
# @param node [Node] node to query
|
14
14
|
# @param options [Hash] if query the current node
|
15
15
|
# @option options [boolean] :including_self if query the current node, default is ture
|
16
|
-
# @option options [boolean] :
|
17
|
-
# @option options [boolean] :recursive if
|
16
|
+
# @option options [boolean] :stop_at_first_match if stop at first match, default is false
|
17
|
+
# @option options [boolean] :recursive if recursively query child nodes, default is true
|
18
18
|
# @return [Array<Node>] matching nodes.
|
19
19
|
def query_nodes(node, options = {})
|
20
|
-
options = { including_self: true,
|
20
|
+
options = { including_self: true, stop_at_first_match: false, recursive: true }.merge(options)
|
21
|
+
if options[:including_self] && !options[:recursive]
|
22
|
+
return match_node?(node) ? [node] : []
|
23
|
+
end
|
24
|
+
|
21
25
|
matching_nodes = []
|
22
26
|
if options[:including_self] && match_node?(node)
|
23
27
|
matching_nodes.push(node)
|
24
|
-
return matching_nodes if options[:
|
28
|
+
return matching_nodes if options[:stop_at_first_match]
|
25
29
|
end
|
26
30
|
if options[:recursive]
|
27
31
|
NodeQuery::Helper.handle_recursive_child(node) do |child_node|
|
28
32
|
if match_node?(child_node)
|
29
33
|
matching_nodes.push(child_node)
|
30
|
-
break if options[:
|
34
|
+
break if options[:stop_at_first_match]
|
31
35
|
end
|
32
36
|
end
|
33
37
|
else
|
34
38
|
NodeQuery.adapter.get_children(node).each do |child_node|
|
35
39
|
if match_node?(child_node)
|
36
40
|
matching_nodes.push(child_node)
|
37
|
-
break if options[:
|
41
|
+
break if options[:stop_at_first_match]
|
38
42
|
end
|
39
43
|
end
|
40
44
|
end
|
data/lib/node_query/version.rb
CHANGED
data/lib/node_query.rb
CHANGED
@@ -40,8 +40,8 @@ class NodeQuery
|
|
40
40
|
# @param node [Node] ast node
|
41
41
|
# @param options [Hash] if query the current node
|
42
42
|
# @option options [boolean] :including_self if query the current node, default is ture
|
43
|
-
# @option options [boolean] :
|
44
|
-
# @option options [boolean] :recursive if
|
43
|
+
# @option options [boolean] :stop_at_first_match if stop at first match, default is false
|
44
|
+
# @option options [boolean] :recursive if recursively query child nodes, default is true
|
45
45
|
# @return [Array<Node>] matching child nodes
|
46
46
|
def query_nodes(node, options = {})
|
47
47
|
if @expression
|
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.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09-
|
11
|
+
date: 2022-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|