enumpath 0.1.1 → 0.1.2
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/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.github/workflows/greetings.yml +13 -0
- data/.github/workflows/rubocop-analysis.yml +47 -0
- data/.github/workflows/ruby.yml +35 -0
- data/.rubocop.yml +12 -0
- data/CONTRIBUTING.md +13 -8
- data/Gemfile +4 -2
- data/Gemfile.lock +21 -16
- data/README.md +33 -19
- data/Rakefile +6 -4
- data/bin/console +4 -3
- data/enumpath.gemspec +11 -8
- data/lib/enumpath.rb +8 -8
- data/lib/enumpath/logger.rb +14 -11
- data/lib/enumpath/operator.rb +47 -26
- data/lib/enumpath/operator/base.rb +2 -2
- data/lib/enumpath/operator/child.rb +2 -2
- data/lib/enumpath/operator/filter_expression.rb +32 -26
- data/lib/enumpath/operator/recursive_descent.rb +7 -7
- data/lib/enumpath/operator/slice.rb +2 -2
- data/lib/enumpath/operator/subscript_expression.rb +16 -14
- data/lib/enumpath/operator/union.rb +1 -1
- data/lib/enumpath/operator/wildcard.rb +1 -1
- data/lib/enumpath/path.rb +10 -8
- data/lib/enumpath/path/normalized_path.rb +24 -15
- data/lib/enumpath/version.rb +1 -1
- metadata +52 -21
- data/.travis.yml +0 -5
@@ -32,7 +32,7 @@ module Enumpath
|
|
32
32
|
# @yieldparam remaining_path [Array] the union member plus remaining_path
|
33
33
|
# @yieldparam enum [Enumerable] enum
|
34
34
|
# @yieldparam resolved_path [Array] resolved_path
|
35
|
-
def apply(remaining_path, enum, resolved_path
|
35
|
+
def apply(remaining_path, enum, resolved_path)
|
36
36
|
parts = operator.split(SPLIT_REGEX).map { |part| part.strip.gsub(/^['"]|['"]$/, '') }
|
37
37
|
Enumpath.log('Applying union parts') { { parts: parts } }
|
38
38
|
parts.each { |part| yield([part] + remaining_path, enum, resolved_path) }
|
@@ -23,7 +23,7 @@ module Enumpath
|
|
23
23
|
# @yieldparam remaining_path [Array] the key of the given member plus remaining_path
|
24
24
|
# @yieldparam enum [Enumerable] enum
|
25
25
|
# @yieldparam resolved_path [Array] resolved_path
|
26
|
-
def apply(remaining_path, enum, resolved_path
|
26
|
+
def apply(remaining_path, enum, resolved_path)
|
27
27
|
keys = keys(enum)
|
28
28
|
Enumpath.log('Applying wildcard to keys') { { keys: keys } }
|
29
29
|
keys.each { |key| yield([key.to_s] + remaining_path, enum, resolved_path) }
|
data/lib/enumpath/path.rb
CHANGED
@@ -46,13 +46,8 @@ module Enumpath
|
|
46
46
|
def trace(path_segments, enum, resolved_path = [], nesting_level = 0)
|
47
47
|
Enumpath.logger.level = nesting_level
|
48
48
|
if path_segments.any?
|
49
|
-
Enumpath.log(
|
50
|
-
|
51
|
-
remaining_path = path_segments[1..-1]
|
52
|
-
operator = Enumpath::Operator.detect(segment, enum)
|
53
|
-
operator&.apply(remaining_path, enum, resolved_path) do |s, e, c|
|
54
|
-
trace(s, e, c, nesting_level + 1)
|
55
|
-
end
|
49
|
+
Enumpath.log('Applying') { { operator: path_segments, to: enum } }
|
50
|
+
apply_segments(path_segments, enum, resolved_path, nesting_level)
|
56
51
|
else
|
57
52
|
Enumpath.log('Storing') { { resolved_path: resolved_path, enum: enum } }
|
58
53
|
results.store(resolved_path, enum)
|
@@ -60,7 +55,14 @@ module Enumpath
|
|
60
55
|
Enumpath.logger.level = nesting_level
|
61
56
|
end
|
62
57
|
|
63
|
-
|
58
|
+
def apply_segments(path_segments, enum, resolved_path, nesting_level)
|
59
|
+
segment = path_segments.first
|
60
|
+
remaining_path = path_segments[1..-1]
|
61
|
+
operator = Enumpath::Operator.detect(segment, enum)
|
62
|
+
operator&.apply(remaining_path, enum, resolved_path) do |s, e, c|
|
63
|
+
trace(s, e, c, nesting_level + 1)
|
64
|
+
end
|
65
|
+
end
|
64
66
|
|
65
67
|
def cache
|
66
68
|
@cache ||= Enumpath.path_cache
|
@@ -16,34 +16,43 @@ module Enumpath
|
|
16
16
|
|
17
17
|
def normalize(path)
|
18
18
|
return path if path.is_a?(Array)
|
19
|
+
|
19
20
|
normalized_path = path.dup
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
normalized_path = restore_filter_expressions(normalized_path, filter_expressions)
|
25
|
-
normalized_path.gsub!(/\A\$(;|\z)/, '') # Remove root operator
|
21
|
+
filter_expressions = remove_filter_expressions!(normalized_path)
|
22
|
+
replace_tokens!(normalized_path)
|
23
|
+
restore_filter_expressions!(normalized_path, filter_expressions)
|
24
|
+
remove_root!(normalized_path)
|
26
25
|
normalized_path = normalized_path.split(';') # Split into segment parts
|
27
|
-
normalized_path.reject!
|
28
|
-
segment.nil? || segment.size == 0
|
29
|
-
end
|
26
|
+
normalized_path.reject! { |segment| segment.nil? || segment.size.zero? } # Remove blanks
|
30
27
|
Enumpath.log('Path normalized') { { original: path, normalized: normalized_path } }
|
31
28
|
normalized_path
|
32
29
|
end
|
33
30
|
|
34
31
|
# Move filter expressions (`[?(expr)]`) to the temporary array and replace with an index notation
|
35
|
-
def remove_filter_expressions(path)
|
32
|
+
def remove_filter_expressions!(path)
|
36
33
|
filter_expressions = []
|
37
|
-
|
38
|
-
filter_expressions <<
|
34
|
+
path.gsub!(FILTER_EXPRESSION_REGEX) do
|
35
|
+
filter_expressions << Regexp.last_match(1)
|
39
36
|
"[##{filter_expressions.size - 1}]"
|
40
37
|
end
|
41
|
-
|
38
|
+
filter_expressions
|
39
|
+
end
|
40
|
+
|
41
|
+
def replace_tokens!(path)
|
42
|
+
path.gsub!(/'?\.'?|\['?/, ';') # Replace "'?.'?" or "['?" with ";"
|
43
|
+
path.gsub!(/;;;|;;/, ';..;') # Replace ";;;" or ";;" with ";..;"
|
44
|
+
path.gsub!(/;\z|'?\]|'\z/, '') # Replace ";$" or "'?]" or "'$" with ""
|
42
45
|
end
|
43
46
|
|
44
47
|
# Replace index notations with their corresponding filter expressions (`?(expr)`) from the temporary array
|
45
|
-
def restore_filter_expressions(
|
46
|
-
|
48
|
+
def restore_filter_expressions!(path, filter_expressions)
|
49
|
+
path.gsub!(INDEX_NOTATION_REGEX) do
|
50
|
+
filter_expressions[Regexp.last_match(1).to_i]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def remove_root!(path)
|
55
|
+
path.gsub!(/\A\$(;|\z)/, '') # Remove root operator
|
47
56
|
end
|
48
57
|
end
|
49
58
|
end
|
data/lib/enumpath/version.rb
CHANGED
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enumpath
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Bloom
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: mini_cache
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.1.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: to_regexp
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 0.2.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 0.2.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1
|
47
|
+
version: '2.1'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1
|
54
|
+
version: '2.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: null-logger
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '12.3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.8'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.8'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: rspec-benchmark
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,19 +123,33 @@ dependencies:
|
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: 0.3.0
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
126
|
+
name: rspec_junit_formatter
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - "~>"
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
131
|
+
version: '0.4'
|
118
132
|
type: :development
|
119
133
|
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
138
|
+
version: '0.4'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: yard
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.9.26
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.9.26
|
125
153
|
description: |
|
126
154
|
Enumpath is an implementation of the JSONPath spec for Ruby objects,
|
127
155
|
plus some added sugar. It's like Ruby's native Enumerable#dig method,
|
@@ -131,15 +159,19 @@ description: |
|
|
131
159
|
(Extract, Transform, Load) processes by allowing you to define paths
|
132
160
|
through your data in a simple, easily readable, easily storable syntax.
|
133
161
|
email:
|
134
|
-
- open-source@youearnedit.com
|
135
162
|
- chrisbloom7@gmail.com
|
136
163
|
executables: []
|
137
164
|
extensions: []
|
138
165
|
extra_rdoc_files: []
|
139
166
|
files:
|
167
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
168
|
+
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
169
|
+
- ".github/workflows/greetings.yml"
|
170
|
+
- ".github/workflows/rubocop-analysis.yml"
|
171
|
+
- ".github/workflows/ruby.yml"
|
140
172
|
- ".gitignore"
|
141
173
|
- ".rspec"
|
142
|
-
- ".
|
174
|
+
- ".rubocop.yml"
|
143
175
|
- ".yardopts"
|
144
176
|
- CONTRIBUTING.md
|
145
177
|
- Gemfile
|
@@ -167,11 +199,11 @@ files:
|
|
167
199
|
- lib/enumpath/resolver/simple.rb
|
168
200
|
- lib/enumpath/results.rb
|
169
201
|
- lib/enumpath/version.rb
|
170
|
-
homepage: https://github.com/
|
202
|
+
homepage: https://github.com/chrisbloom7/enumpath
|
171
203
|
licenses:
|
172
204
|
- Apache-2.0
|
173
205
|
metadata: {}
|
174
|
-
post_install_message:
|
206
|
+
post_install_message:
|
175
207
|
rdoc_options: []
|
176
208
|
require_paths:
|
177
209
|
- lib
|
@@ -186,9 +218,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
186
218
|
- !ruby/object:Gem::Version
|
187
219
|
version: '0'
|
188
220
|
requirements: []
|
189
|
-
|
190
|
-
|
191
|
-
signing_key:
|
221
|
+
rubygems_version: 3.0.3
|
222
|
+
signing_key:
|
192
223
|
specification_version: 4
|
193
224
|
summary: A JSONPath-compatible library for navigating nested Ruby objects using path
|
194
225
|
expressions
|