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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +201 -28
  3. data/bin/janeway +36 -9
  4. data/lib/janeway/ast/expression.rb +1 -2
  5. data/lib/janeway/enumerator.rb +43 -0
  6. data/lib/janeway/error.rb +6 -9
  7. data/lib/janeway/functions/length.rb +1 -1
  8. data/lib/janeway/interpreter.rb +124 -19
  9. data/lib/janeway/interpreters/array_slice_selector_deleter.rb +41 -0
  10. data/lib/janeway/interpreters/array_slice_selector_interpreter.rb +15 -10
  11. data/lib/janeway/interpreters/base.rb +26 -2
  12. data/lib/janeway/interpreters/binary_operator_interpreter.rb +10 -7
  13. data/lib/janeway/interpreters/child_segment_deleter.rb +19 -0
  14. data/lib/janeway/interpreters/child_segment_interpreter.rb +48 -8
  15. data/lib/janeway/interpreters/current_node_interpreter.rb +5 -3
  16. data/lib/janeway/interpreters/descendant_segment_interpreter.rb +13 -9
  17. data/lib/janeway/interpreters/filter_selector_deleter.rb +65 -0
  18. data/lib/janeway/interpreters/filter_selector_interpreter.rb +54 -14
  19. data/lib/janeway/interpreters/function_interpreter.rb +7 -5
  20. data/lib/janeway/interpreters/index_selector_deleter.rb +26 -0
  21. data/lib/janeway/interpreters/index_selector_interpreter.rb +3 -2
  22. data/lib/janeway/interpreters/name_selector_deleter.rb +27 -0
  23. data/lib/janeway/interpreters/name_selector_interpreter.rb +19 -4
  24. data/lib/janeway/interpreters/root_node_deleter.rb +34 -0
  25. data/lib/janeway/interpreters/root_node_interpreter.rb +4 -2
  26. data/lib/janeway/interpreters/tree_constructor.rb +20 -1
  27. data/lib/janeway/interpreters/unary_operator_interpreter.rb +2 -2
  28. data/lib/janeway/interpreters/wildcard_selector_deleter.rb +32 -0
  29. data/lib/janeway/interpreters/wildcard_selector_interpreter.rb +26 -11
  30. data/lib/janeway/interpreters/yielder.rb +50 -12
  31. data/lib/janeway/lexer.rb +1 -1
  32. data/lib/janeway/normalized_path.rb +66 -0
  33. data/lib/janeway/parser.rb +3 -3
  34. data/lib/janeway/query.rb +70 -0
  35. data/lib/janeway/version.rb +1 -1
  36. data/lib/janeway.rb +16 -28
  37. metadata +12 -3
  38. 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.3.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-22 00:00:00.000000000 Z
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
@@ -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