spaceborne 0.1.37 → 0.1.41
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/.rubocop.yml +4 -1
- data/README.md +4 -3
- data/lib/spaceborne/version.rb +1 -1
- data/lib/spaceborne.rb +43 -23
- 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: 30bd85963db86e76c6f72a21fa703b090ba6cb4573863a2d107e218b2bfe4ee3
|
4
|
+
data.tar.gz: 495ea111c1e2205cc369f29ad28132f6a208d0547ff31b9894459f61eb87be17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65f0d4a71631c24f05793e5a7b78654e2a5b66054f11342dd398614d2eccee8998ef1573ec673e1c245844b68cc7f3040f015f1a719899aac3c8da6eac9163aa
|
7
|
+
data.tar.gz: dcca75d582460de8f3566a5de65bd6bc200446d493bbb9b2efc462008e7928c86bc450fc2caf2bfbef2203842b983143e478d0807e6bcc66ae7ea4efd65da620
|
data/.rubocop.yml
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
AllCops:
|
2
|
+
SuggestExtensions: false
|
3
|
+
|
1
4
|
Style/FrozenStringLiteralComment:
|
2
5
|
Enabled: false
|
3
6
|
|
@@ -23,7 +26,7 @@ Metrics/ClassLength:
|
|
23
26
|
Exclude:
|
24
27
|
- 'bin/*'
|
25
28
|
|
26
|
-
|
29
|
+
Layout/LineLength:
|
27
30
|
Exclude:
|
28
31
|
- 'spec/airborne/**/*.rb'
|
29
32
|
|
data/README.md
CHANGED
@@ -226,15 +226,16 @@ The following example shows how extensions # 6 & 8 work
|
|
226
226
|
{ "array": [] },
|
227
227
|
{ "foo": "bar" }],
|
228
228
|
"highest_array": [ null,
|
229
|
-
{ "array": [{ "present": "name" }]}]
|
229
|
+
{ "array": [{ "present": "name" }]}],
|
230
|
+
"not_an_array": null
|
230
231
|
}
|
231
232
|
```
|
232
233
|
You can now validate the fact that each element in the collection has a key which is variant, but a value that has a defined format (the first and last field values are strings).
|
233
234
|
|
234
235
|
expect_json_types('array_of_hashes.*.*', first: :string, last: :string)
|
235
236
|
expect_json_types('hash_of_hashes.*', first: :string, last: :string)
|
236
|
-
|
237
|
-
|
237
|
+
expect_json_types(optional('lowest_array.*.array.*'), present: :string)
|
238
|
+
expect_json_types(optional('highest_array.*.array.*'), present: :string)
|
238
239
|
|
239
240
|
|
240
241
|
## Development
|
data/lib/spaceborne/version.rb
CHANGED
data/lib/spaceborne.rb
CHANGED
@@ -156,6 +156,24 @@ module Airborne
|
|
156
156
|
|
157
157
|
# Extend airborne's expectations
|
158
158
|
module RequestExpectations
|
159
|
+
# class used for holding an optional path
|
160
|
+
class OptionalPathExpectations
|
161
|
+
def initialize(string)
|
162
|
+
@string = string
|
163
|
+
end
|
164
|
+
|
165
|
+
def to_s
|
166
|
+
@string.to_s
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def do_process_json(part, json)
|
171
|
+
json = process_json(part, json)
|
172
|
+
rescue StandardError
|
173
|
+
raise PathError,
|
174
|
+
"Expected #{json.class}\nto be an object with property #{part}"
|
175
|
+
end
|
176
|
+
|
159
177
|
def call_with_relative_path(data, args)
|
160
178
|
if args.length == 2
|
161
179
|
get_by_path(args[0], data) do |json_chunk|
|
@@ -204,17 +222,18 @@ module Airborne
|
|
204
222
|
end
|
205
223
|
end
|
206
224
|
end
|
225
|
+
|
226
|
+
def optional(data)
|
227
|
+
if data.is_a?(Hash)
|
228
|
+
OptionalHashTypeExpectations.new(data)
|
229
|
+
else
|
230
|
+
Airborne::OptionalPathExpectations.new(data)
|
231
|
+
end
|
232
|
+
end
|
207
233
|
end
|
208
234
|
|
209
235
|
# extension to handle hash value checking
|
210
236
|
module PathMatcher
|
211
|
-
def do_process_json(part, json)
|
212
|
-
json = process_json(part, json)
|
213
|
-
rescue StandardError
|
214
|
-
raise PathError,
|
215
|
-
"Expected #{json.class}\nto be an object with property #{part}"
|
216
|
-
end
|
217
|
-
|
218
237
|
def handle_container(json, &block)
|
219
238
|
case json.class.name
|
220
239
|
when 'Array'
|
@@ -227,7 +246,7 @@ module Airborne
|
|
227
246
|
end
|
228
247
|
|
229
248
|
def handle_type(type, path, json, &block)
|
230
|
-
case type
|
249
|
+
case type.to_s
|
231
250
|
when '*'
|
232
251
|
handle_container(json, &block)
|
233
252
|
when '?'
|
@@ -237,38 +256,39 @@ module Airborne
|
|
237
256
|
end
|
238
257
|
end
|
239
258
|
|
240
|
-
def
|
241
|
-
path.is_a?(Airborne::
|
242
|
-
|
243
|
-
|
244
|
-
def make_path_optional(path, sub_path)
|
245
|
-
if path.is_a?(Airborne::OptionalHashTypeExpectations)
|
246
|
-
Airborne::OptionalHashTypeExpectations.new(sub_path)
|
259
|
+
def make_sub_path_optional(path, sub_path)
|
260
|
+
if path.is_a?(Airborne::OptionalPathExpectations)
|
261
|
+
Airborne::OptionalPathExpectations.new(sub_path)
|
247
262
|
else
|
248
263
|
sub_path
|
249
264
|
end
|
250
265
|
end
|
251
266
|
|
252
267
|
def iterate_path(path)
|
253
|
-
raise PathError, "Invalid Path, contains '..'" if /\.\./ =~
|
268
|
+
raise PathError, "Invalid Path, contains '..'" if /\.\./ =~ path.to_s
|
254
269
|
|
255
|
-
parts =
|
270
|
+
parts = path.to_s.split('.')
|
256
271
|
parts.each_with_index do |part, index|
|
257
|
-
use_part =
|
272
|
+
use_part = make_sub_path_optional(path, part)
|
258
273
|
yield(parts, use_part, index)
|
259
274
|
end
|
260
275
|
end
|
261
276
|
|
277
|
+
def shortcut_validation(path, json)
|
278
|
+
json.nil? && path.is_a?(Airborne::OptionalPathExpectations)
|
279
|
+
end
|
280
|
+
|
262
281
|
def get_by_path(path, json, type: false, &block)
|
263
282
|
iterate_path(path) do |parts, part, index|
|
264
|
-
if
|
265
|
-
|
283
|
+
return if shortcut_validation(path, json)
|
284
|
+
|
285
|
+
if %w[* ?].include?(part.to_s)
|
266
286
|
type = part
|
267
|
-
walk_with_path(type, index, path, parts, json, &block) && return if index < parts.length.pred
|
287
|
+
walk_with_path(type.to_s, index, path, parts, json, &block) && return if index < parts.length.pred
|
268
288
|
|
269
289
|
next
|
270
290
|
end
|
271
|
-
json = do_process_json(
|
291
|
+
json = do_process_json(part.to_s, json)
|
272
292
|
end
|
273
293
|
handle_type(type, path, json, &block)
|
274
294
|
end
|
@@ -288,7 +308,7 @@ module Airborne
|
|
288
308
|
json.each do |element|
|
289
309
|
begin
|
290
310
|
sub_path = parts[(index.next)...(parts.length)].join('.')
|
291
|
-
get_by_path(
|
311
|
+
get_by_path(make_sub_path_optional(path, sub_path), element, &block)
|
292
312
|
rescue Exception => e
|
293
313
|
last_error = e
|
294
314
|
error_count += 1
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spaceborne
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.41
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-08-
|
11
|
+
date: 2021-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|