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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95dcf07d501c704e59bb792454be0bae1ddfafb915c77b6a062c6331d654564b
4
- data.tar.gz: 7b835b8479ff5239ea77dcb5ed09f4868b1a09cbdf5edc2f4ab9413d352030be
3
+ metadata.gz: 526c6ef0b0f58f1a8f1f7aff14e147ce4220cd6366bea5d5108db29591e0ab02
4
+ data.tar.gz: 347fc60e4f3629871356757349c5a126235a192049eefa713fb15890d26033d0
5
5
  SHA512:
6
- metadata.gz: e2dbea64418363ad059ea2b6e9d93b3c2d010bdba59317327904b6a48411517a511ab6737fe40bdf4847b2833ec4d81eb5d474be7db7d831a6119c89fe904fea
7
- data.tar.gz: c2cf0bfec6edfa28b644a38957dce1276cc287507c3c3034a39e0ce018f25e420faded6ad0c7c3c3838757df5107082c30d05fcf9f4323c5d5d3f32bc68337f1
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- node_query (1.4.0)
4
+ node_query (1.5.0)
5
5
  activesupport (< 7.0.0)
6
6
 
7
7
  GEM
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, stop_on_match: false, recursive: true }): Node[] # Get the matching nodes.
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] :stop_on_match if stop on first match, default is false
19
- # @option options [boolean] :recursive if stop on first match, default is true
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] :stop_on_match if stop on first match, default is false
19
- # @option options [boolean] :recursive if stop on first match, default is true
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
- # @return [Boolean] true if the regexp value matches the node value.
17
- def is_equal?(node)
18
- if NodeQuery.adapter.is_node?(node)
19
- @value.match(NodeQuery.adapter.get_source(node))
20
- else
21
- @value.match(node.to_s)
22
- end
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] :stop_on_match if stop on first match, default is false
39
- # @option options [boolean] :recursive if stop on first match, default is true
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, stop_on_match: false, recursive: true }.merge(options)
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 matching_nodes if options[:stop_on_match]
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[:stop_on_match]
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[:stop_on_match]
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).to_s == expected_value
30
+ NodeQuery::Helper.to_string(actual_value(node)) == expected_value
31
31
  end
32
32
 
33
33
  # Get valid operators.
@@ -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}}}", NodeQuery.adapter.get_source(target_node))
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] :stop_on_match if stop on first match, default is false
17
- # @option options [boolean] :recursive if stop on first match, default is true
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, stop_on_match: false, recursive: true }.merge(options)
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[:stop_on_match]
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[:stop_on_match]
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[:stop_on_match]
41
+ break if options[:stop_at_first_match]
38
42
  end
39
43
  end
40
44
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class NodeQuery
4
- VERSION = "1.4.0"
4
+ VERSION = "1.5.0"
5
5
  end
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] :stop_on_match if stop on first match, default is false
44
- # @option options [boolean] :recursive if stop on first match, default is true
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.0
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-14 00:00:00.000000000 Z
11
+ date: 2022-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport