janeway-jsonpath 0.3.0 → 0.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/README.md +201 -28
- data/bin/janeway +36 -9
- data/lib/janeway/ast/expression.rb +1 -2
- data/lib/janeway/enumerator.rb +43 -0
- data/lib/janeway/error.rb +6 -9
- data/lib/janeway/functions/length.rb +1 -1
- data/lib/janeway/interpreter.rb +124 -19
- data/lib/janeway/interpreters/array_slice_selector_deleter.rb +41 -0
- data/lib/janeway/interpreters/array_slice_selector_interpreter.rb +15 -10
- data/lib/janeway/interpreters/base.rb +26 -2
- data/lib/janeway/interpreters/binary_operator_interpreter.rb +10 -7
- data/lib/janeway/interpreters/child_segment_deleter.rb +19 -0
- data/lib/janeway/interpreters/child_segment_interpreter.rb +48 -8
- data/lib/janeway/interpreters/current_node_interpreter.rb +5 -3
- data/lib/janeway/interpreters/descendant_segment_interpreter.rb +13 -9
- data/lib/janeway/interpreters/filter_selector_deleter.rb +65 -0
- data/lib/janeway/interpreters/filter_selector_interpreter.rb +54 -14
- data/lib/janeway/interpreters/function_interpreter.rb +7 -5
- data/lib/janeway/interpreters/index_selector_deleter.rb +26 -0
- data/lib/janeway/interpreters/index_selector_interpreter.rb +3 -2
- data/lib/janeway/interpreters/name_selector_deleter.rb +27 -0
- data/lib/janeway/interpreters/name_selector_interpreter.rb +19 -4
- data/lib/janeway/interpreters/root_node_deleter.rb +34 -0
- data/lib/janeway/interpreters/root_node_interpreter.rb +4 -2
- data/lib/janeway/interpreters/tree_constructor.rb +20 -1
- data/lib/janeway/interpreters/unary_operator_interpreter.rb +2 -2
- data/lib/janeway/interpreters/wildcard_selector_deleter.rb +32 -0
- data/lib/janeway/interpreters/wildcard_selector_interpreter.rb +26 -11
- data/lib/janeway/interpreters/yielder.rb +50 -12
- data/lib/janeway/lexer.rb +1 -1
- data/lib/janeway/normalized_path.rb +66 -0
- data/lib/janeway/parser.rb +3 -3
- data/lib/janeway/query.rb +70 -0
- data/lib/janeway/version.rb +1 -1
- data/lib/janeway.rb +16 -28
- metadata +12 -3
- data/lib/janeway/ast/query.rb +0 -98
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: janeway-jsonpath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fraser Hanson
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-01-
|
10
|
+
date: 2025-01-29 00:00:00.000000000 Z
|
11
11
|
dependencies: []
|
12
12
|
description: |+
|
13
13
|
JSONPath is a query language for selecting and extracting values from a JSON text.
|
@@ -46,12 +46,12 @@ files:
|
|
46
46
|
- lib/janeway/ast/name_selector.rb
|
47
47
|
- lib/janeway/ast/null.rb
|
48
48
|
- lib/janeway/ast/number.rb
|
49
|
-
- lib/janeway/ast/query.rb
|
50
49
|
- lib/janeway/ast/root_node.rb
|
51
50
|
- lib/janeway/ast/selector.rb
|
52
51
|
- lib/janeway/ast/string_type.rb
|
53
52
|
- lib/janeway/ast/unary_operator.rb
|
54
53
|
- lib/janeway/ast/wildcard_selector.rb
|
54
|
+
- lib/janeway/enumerator.rb
|
55
55
|
- lib/janeway/error.rb
|
56
56
|
- lib/janeway/functions.rb
|
57
57
|
- lib/janeway/functions/count.rb
|
@@ -60,24 +60,33 @@ files:
|
|
60
60
|
- lib/janeway/functions/search.rb
|
61
61
|
- lib/janeway/functions/value.rb
|
62
62
|
- lib/janeway/interpreter.rb
|
63
|
+
- lib/janeway/interpreters/array_slice_selector_deleter.rb
|
63
64
|
- lib/janeway/interpreters/array_slice_selector_interpreter.rb
|
64
65
|
- lib/janeway/interpreters/base.rb
|
65
66
|
- lib/janeway/interpreters/binary_operator_interpreter.rb
|
67
|
+
- lib/janeway/interpreters/child_segment_deleter.rb
|
66
68
|
- lib/janeway/interpreters/child_segment_interpreter.rb
|
67
69
|
- lib/janeway/interpreters/current_node_interpreter.rb
|
68
70
|
- lib/janeway/interpreters/descendant_segment_interpreter.rb
|
71
|
+
- lib/janeway/interpreters/filter_selector_deleter.rb
|
69
72
|
- lib/janeway/interpreters/filter_selector_interpreter.rb
|
70
73
|
- lib/janeway/interpreters/function_interpreter.rb
|
74
|
+
- lib/janeway/interpreters/index_selector_deleter.rb
|
71
75
|
- lib/janeway/interpreters/index_selector_interpreter.rb
|
76
|
+
- lib/janeway/interpreters/name_selector_deleter.rb
|
72
77
|
- lib/janeway/interpreters/name_selector_interpreter.rb
|
78
|
+
- lib/janeway/interpreters/root_node_deleter.rb
|
73
79
|
- lib/janeway/interpreters/root_node_interpreter.rb
|
74
80
|
- lib/janeway/interpreters/tree_constructor.rb
|
75
81
|
- lib/janeway/interpreters/unary_operator_interpreter.rb
|
82
|
+
- lib/janeway/interpreters/wildcard_selector_deleter.rb
|
76
83
|
- lib/janeway/interpreters/wildcard_selector_interpreter.rb
|
77
84
|
- lib/janeway/interpreters/yielder.rb
|
78
85
|
- lib/janeway/lexer.rb
|
79
86
|
- lib/janeway/location.rb
|
87
|
+
- lib/janeway/normalized_path.rb
|
80
88
|
- lib/janeway/parser.rb
|
89
|
+
- lib/janeway/query.rb
|
81
90
|
- lib/janeway/token.rb
|
82
91
|
- lib/janeway/version.rb
|
83
92
|
homepage: https://github.com/gongfarmer/janeway
|
data/lib/janeway/ast/query.rb
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Janeway
|
4
|
-
module AST
|
5
|
-
# AST::Query holds the complete abstract syntax tree created by parsing the query.
|
6
|
-
#
|
7
|
-
# This can be frozen and passed to multiple threads or ractors for simultaneous use.
|
8
|
-
# No instance members are modified during the interpretation stage.
|
9
|
-
class Query
|
10
|
-
# @return [AST::RootNode]
|
11
|
-
attr_reader :root
|
12
|
-
|
13
|
-
# The original jsonpath query, for use in error messages
|
14
|
-
# @return [String]
|
15
|
-
attr_reader :jsonpath
|
16
|
-
|
17
|
-
# @param root_node [AST::Root]
|
18
|
-
# @param jsonpath [String]
|
19
|
-
def initialize(root_node, jsonpath)
|
20
|
-
raise ArgumentError, "expect root identifier, got #{root_node.inspect}" unless root_node.is_a?(RootNode)
|
21
|
-
raise ArgumentError, "expect query string, got #{jsonpath.inspect}" unless jsonpath.is_a?(String)
|
22
|
-
|
23
|
-
@root = root_node
|
24
|
-
@jsonpath = jsonpath
|
25
|
-
end
|
26
|
-
|
27
|
-
# Use this Query to search the input, and return the results.
|
28
|
-
#
|
29
|
-
# @param input [Object] ruby object to be searched
|
30
|
-
# @return [Array] all matched objects
|
31
|
-
def find_all(input)
|
32
|
-
Janeway::Interpreter.new(self).interpret(input)
|
33
|
-
end
|
34
|
-
|
35
|
-
# Iterate through each value matched by the JSONPath query.
|
36
|
-
#
|
37
|
-
# @param input [Hash, Array] ruby object to be searched
|
38
|
-
# @yieldparam [Object] matched value
|
39
|
-
# @return [void]
|
40
|
-
def each(input, &block)
|
41
|
-
return enum_for(:each, input) unless block_given?
|
42
|
-
|
43
|
-
interpreter = Janeway::Interpreter.new(self)
|
44
|
-
interpreter.push Janeway::Interpreters::Yielder.new(&block)
|
45
|
-
interpreter.interpret(input)
|
46
|
-
end
|
47
|
-
|
48
|
-
def to_s
|
49
|
-
@root.to_s
|
50
|
-
end
|
51
|
-
|
52
|
-
# Return a list of all the nodes in the AST.
|
53
|
-
# The AST of a jsonpath query is a straight line, so this is expressible as an array.
|
54
|
-
# The only part of the AST with branches is inside a filter selector, but that doesn't show up here.
|
55
|
-
# @return [Array<Expression>]
|
56
|
-
def node_list
|
57
|
-
nodes = []
|
58
|
-
node = @root
|
59
|
-
loop do
|
60
|
-
nodes << node
|
61
|
-
break unless node.next
|
62
|
-
|
63
|
-
node = node.next
|
64
|
-
end
|
65
|
-
nodes
|
66
|
-
end
|
67
|
-
|
68
|
-
# Remove the last selector in the query from the node list, and return the removed selector.
|
69
|
-
# @return [AST::Selector, nil] last selector in the query, if any
|
70
|
-
def pop
|
71
|
-
nodes = node_list
|
72
|
-
return nil if node_list.size == 1 # only 1 node, don't pop
|
73
|
-
|
74
|
-
# Remove the last selector and return it
|
75
|
-
last_node = nodes.pop
|
76
|
-
nodes.last.next = nil # delete the second-last node's link to the last node
|
77
|
-
last_node
|
78
|
-
end
|
79
|
-
|
80
|
-
# Queries are considered equal if their ASTs evaluate to the same JSONPath string.
|
81
|
-
#
|
82
|
-
# The string output is generated from the AST and should be considered a "normalized"
|
83
|
-
# form of the query. It may have different whitespace and parentheses than the original
|
84
|
-
# input but will be semantically equivalent.
|
85
|
-
def ==(other)
|
86
|
-
to_s == other.to_s
|
87
|
-
end
|
88
|
-
|
89
|
-
# Print AST in tree format
|
90
|
-
# Every AST class prints a 1-line representation of self, with children on separate lines
|
91
|
-
def tree
|
92
|
-
result = @root.tree(0)
|
93
|
-
|
94
|
-
result.flatten.join("\n")
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|