blumquist 0.9.1 → 0.10.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/CHANGELOG.md +8 -0
- data/lib/blumquist.rb +10 -12
- data/lib/blumquist/errors.rb +3 -2
- data/lib/blumquist/errors/invalid_pointer.rb +7 -2
- data/lib/blumquist/errors/unsupported_pointer.rb +16 -0
- data/lib/blumquist/errors/unsupported_type.rb +1 -1
- data/lib/blumquist/json_pointer.rb +75 -0
- data/lib/blumquist/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d916de12dccf999a0a3a93ed8b1fb321230c7c29
|
4
|
+
data.tar.gz: bbb8e9662f65bd8ec435fc9c07632d79d7945ca4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d96097e7eb7bfc8915cf59d66e1ee8f5cdc1a6a917c9caf06661b9f8b9abcd877bdd880716d9e9a0234d1d8971a1167a59f18e1dfb84b21c8c5b124b32be9cc8
|
7
|
+
data.tar.gz: a029e3cbb688916ed4d18fe0c255a282829de0a7415f89afdcf5db6b21c9f2b095dd398b361b57092e7d44f9eb61946a02edc6bee3ffca823440629f3aabd42d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# [0.10.0] - 2017-09-05
|
2
|
+
## Added
|
3
|
+
- References ($ref):
|
4
|
+
Support for more JSON pointers formats:
|
5
|
+
1. #/key1/key2/.../keyN
|
6
|
+
2. path-to-file.json
|
7
|
+
3. path-to-file.json#/key1/key2/.../keyN
|
8
|
+
|
1
9
|
# [0.9.1] - 2017-09-04 Alfonso Mancilla (#20)
|
2
10
|
- Support primitive type: integer.
|
3
11
|
|
data/lib/blumquist.rb
CHANGED
@@ -2,9 +2,12 @@ require 'blumquist/version'
|
|
2
2
|
require 'active_support/core_ext/hash/indifferent_access'
|
3
3
|
require 'json'
|
4
4
|
require 'json-schema'
|
5
|
+
require 'blumquist/json_pointer'
|
5
6
|
require 'blumquist/errors'
|
6
7
|
|
7
8
|
class Blumquist
|
9
|
+
PRIMITIVE_TYPES = %w{null boolean number string enum integer}.freeze
|
10
|
+
|
8
11
|
attr_reader :_type
|
9
12
|
|
10
13
|
def initialize(options)
|
@@ -61,25 +64,20 @@ class Blumquist
|
|
61
64
|
end
|
62
65
|
|
63
66
|
def resolve_json_pointer(type_def)
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
type_def.merge(definition)
|
67
|
+
pointer = JSONPointer.new(type_def[:$ref], document: @schema)
|
68
|
+
|
69
|
+
type_def.merge(pointer.value)
|
68
70
|
end
|
69
71
|
|
70
72
|
def resolve_json_pointer!(type_def)
|
71
|
-
|
72
|
-
pointer =
|
73
|
-
key = pointer.split('/').last
|
74
|
-
definition = @schema[:definitions][key]
|
75
|
-
|
76
|
-
raise(Errors::InvalidPointer, pointer) unless definition
|
73
|
+
pointer_path = type_def.delete(:$ref)
|
74
|
+
pointer = JSONPointer.new(pointer_path, document: @schema)
|
77
75
|
|
78
|
-
type_def.merge!
|
76
|
+
type_def.merge!(pointer.value)
|
79
77
|
end
|
80
78
|
|
81
79
|
def primitive_type?(type)
|
82
|
-
|
80
|
+
PRIMITIVE_TYPES.include?(type.to_s)
|
83
81
|
end
|
84
82
|
|
85
83
|
def define_getters
|
data/lib/blumquist/errors.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'blumquist/error'
|
2
|
-
require 'blumquist/errors/unsupported_schema'
|
3
|
-
require 'blumquist/errors/unsupported_type'
|
4
2
|
require 'blumquist/errors/invalid_pointer'
|
5
3
|
require 'blumquist/errors/missing_array_items_type'
|
6
4
|
require 'blumquist/errors/missing_properties'
|
7
5
|
require 'blumquist/errors/no_compatible_one_of'
|
6
|
+
require 'blumquist/errors/unsupported_pointer'
|
7
|
+
require 'blumquist/errors/unsupported_schema'
|
8
|
+
require 'blumquist/errors/unsupported_type'
|
8
9
|
require 'blumquist/errors/validation'
|
@@ -1,8 +1,13 @@
|
|
1
1
|
class Blumquist
|
2
2
|
module Errors
|
3
3
|
class InvalidPointer < Blumquist::Error
|
4
|
-
def initialize(pointer)
|
5
|
-
|
4
|
+
def initialize(pointer:, document:)
|
5
|
+
msg = %{
|
6
|
+
Could not find pointer '#{pointer}' in the given document:\n
|
7
|
+
#{JSON.pretty_generate(document)}
|
8
|
+
}
|
9
|
+
|
10
|
+
super(msg)
|
6
11
|
end
|
7
12
|
end
|
8
13
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Blumquist
|
2
|
+
module Errors
|
3
|
+
class UnsupportedPointer < Blumquist::Error
|
4
|
+
def initialize(pointer:)
|
5
|
+
msg = %{
|
6
|
+
Pointer '#{pointer}' is not supported. Current supported formats are:\n
|
7
|
+
1. #/key1/key2/.../keyN
|
8
|
+
2. path_to_file.json
|
9
|
+
3. path_to_file.json#/key1/key2/.../keyN
|
10
|
+
}
|
11
|
+
|
12
|
+
super(msg)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -2,7 +2,7 @@ class Blumquist
|
|
2
2
|
module Errors
|
3
3
|
class UnsupportedType < Blumquist::Error
|
4
4
|
def initialize(type)
|
5
|
-
super("Unsupported type '#{type.to_s}' (#{
|
5
|
+
super("Unsupported type '#{type.to_s}' (#{Blumquist::PRIMITIVE_TYPES.to_json}) are supported)")
|
6
6
|
end
|
7
7
|
end
|
8
8
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#
|
2
|
+
# JSON Pointer
|
3
|
+
# This is a VERY BASIC implementation
|
4
|
+
# to support pointers in the form of:
|
5
|
+
#
|
6
|
+
# 1. #/key1/key2/.../keyN
|
7
|
+
# 2. path_to_file.json
|
8
|
+
# 3. path_to_file.json#/key1/key2/.../keyN
|
9
|
+
#
|
10
|
+
# More about JSON Pointer & Reference Specification
|
11
|
+
# https://cswr.github.io/JsonSchema/spec/definitions_references/#json-pointers
|
12
|
+
#
|
13
|
+
|
14
|
+
class Blumquist
|
15
|
+
class JSONPointer
|
16
|
+
DOCUMENT_ROOT_IDENTIFIER = '#'.freeze
|
17
|
+
DOCUMENT_ADDRESS_IDENTIFIER = '.json'.freeze
|
18
|
+
|
19
|
+
attr_reader :uri
|
20
|
+
|
21
|
+
def initialize(uri, document: nil)
|
22
|
+
@uri = uri
|
23
|
+
validate_uri!
|
24
|
+
@document = document
|
25
|
+
end
|
26
|
+
|
27
|
+
def value
|
28
|
+
result = keys.any? ? document&.dig(*keys) : document
|
29
|
+
|
30
|
+
raise(Errors::InvalidPointer, pointer: uri, document: document) if result.nil?
|
31
|
+
|
32
|
+
result
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def keys
|
38
|
+
return @keys if defined?(@keys)
|
39
|
+
|
40
|
+
@keys = @uri.split('#')[1]
|
41
|
+
@keys = @keys&.sub('/', '') if @keys&.start_with?('/')
|
42
|
+
@keys = @keys&.split('/') || []
|
43
|
+
end
|
44
|
+
|
45
|
+
def address
|
46
|
+
return @address if defined?(@address)
|
47
|
+
|
48
|
+
@address = uri.scan(/.*\.json/).first
|
49
|
+
end
|
50
|
+
|
51
|
+
def document
|
52
|
+
if points_to_document_address?
|
53
|
+
@external_document ||= JSON.parse( File.read(address) )
|
54
|
+
else
|
55
|
+
@document
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def points_to_document_address?
|
60
|
+
!address.nil?
|
61
|
+
end
|
62
|
+
|
63
|
+
def validate_uri!
|
64
|
+
#
|
65
|
+
# Why only this uri formats are valid?
|
66
|
+
# Refer to the description on the top of this file
|
67
|
+
#
|
68
|
+
|
69
|
+
return if uri.start_with?(DOCUMENT_ROOT_IDENTIFIER)
|
70
|
+
return if uri.match(DOCUMENT_ADDRESS_IDENTIFIER)
|
71
|
+
|
72
|
+
raise(Errors::UnsupportedPointer, pointer: uri)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/blumquist/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blumquist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jannis Hermanns
|
@@ -189,10 +189,12 @@ files:
|
|
189
189
|
- lib/blumquist/errors/missing_array_items_type.rb
|
190
190
|
- lib/blumquist/errors/missing_properties.rb
|
191
191
|
- lib/blumquist/errors/no_compatible_one_of.rb
|
192
|
+
- lib/blumquist/errors/unsupported_pointer.rb
|
192
193
|
- lib/blumquist/errors/unsupported_schema.rb
|
193
194
|
- lib/blumquist/errors/unsupported_type.rb
|
194
195
|
- lib/blumquist/errors/validation.rb
|
195
196
|
- lib/blumquist/errors/validation_error.rb
|
197
|
+
- lib/blumquist/json_pointer.rb
|
196
198
|
- lib/blumquist/version.rb
|
197
199
|
homepage: https://github.com/moviepilot/blumquist
|
198
200
|
licenses:
|