spaceborne 0.1.37 → 0.1.41
Sign up to get free protection for your applications and to get access to all the features.
- 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
|