jsi 0.0.4 → 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.
- checksums.yaml +4 -4
- data/.simplecov +3 -1
- data/CHANGELOG.md +48 -0
- data/LICENSE.md +613 -0
- data/README.md +84 -45
- data/jsi.gemspec +11 -14
- data/lib/jsi.rb +31 -12
- data/lib/jsi/base.rb +310 -344
- data/lib/jsi/base/to_rb.rb +2 -0
- data/lib/jsi/jsi_coder.rb +91 -0
- data/lib/jsi/json-schema-fragments.rb +3 -135
- data/lib/jsi/json.rb +3 -0
- data/lib/jsi/json/node.rb +72 -197
- data/lib/jsi/json/pointer.rb +419 -0
- data/lib/jsi/metaschema.rb +7 -0
- data/lib/jsi/metaschema_node.rb +218 -0
- data/lib/jsi/pathed_node.rb +118 -0
- data/lib/jsi/schema.rb +168 -223
- data/lib/jsi/schema_classes.rb +158 -0
- data/lib/jsi/simple_wrap.rb +12 -0
- data/lib/jsi/typelike_modules.rb +71 -45
- data/lib/jsi/util.rb +47 -57
- data/lib/jsi/version.rb +1 -1
- data/lib/schemas/json-schema.org/draft-04/schema.rb +7 -0
- data/lib/schemas/json-schema.org/draft-06/schema.rb +7 -0
- data/resources/icons/AGPL-3.0.png +0 -0
- data/test/base_array_test.rb +210 -84
- data/test/base_hash_test.rb +201 -58
- data/test/base_test.rb +212 -121
- data/test/jsi_coder_test.rb +85 -0
- data/test/jsi_json_arraynode_test.rb +26 -25
- data/test/jsi_json_hashnode_test.rb +40 -39
- data/test/jsi_json_node_test.rb +95 -126
- data/test/jsi_json_pointer_test.rb +102 -0
- data/test/jsi_typelike_as_json_test.rb +53 -0
- data/test/metaschema_node_test.rb +19 -0
- data/test/schema_module_test.rb +21 -0
- data/test/schema_test.rb +109 -97
- data/test/spreedly_openapi_test.rb +8 -0
- data/test/test_helper.rb +42 -8
- data/test/util_test.rb +14 -14
- metadata +54 -25
- data/LICENSE.txt +0 -21
- data/lib/jsi/schema_instance_json_coder.rb +0 -83
- data/lib/jsi/struct_json_coder.rb +0 -30
- data/test/schema_instance_json_coder_test.rb +0 -121
- data/test/struct_json_coder_test.rb +0 -130
@@ -0,0 +1,102 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
describe JSI::JSON::Pointer do
|
4
|
+
# For example, given the document
|
5
|
+
let(:document) do
|
6
|
+
{
|
7
|
+
"foo" => ["bar", "baz"],
|
8
|
+
"" => 0,
|
9
|
+
"a/b" => 1,
|
10
|
+
"c%d" => 2,
|
11
|
+
"e^f" => 3,
|
12
|
+
"g|h" => 4,
|
13
|
+
"i\\j" => 5,
|
14
|
+
"k\"l" => 6,
|
15
|
+
" " => 7,
|
16
|
+
"m~n" => 8,
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'initialize from pointer' do
|
21
|
+
it 'parses' do
|
22
|
+
# The following strings evaluate to the accompanying values:
|
23
|
+
evaluations = [
|
24
|
+
"" , document,
|
25
|
+
"/foo" , ["bar", "baz"],
|
26
|
+
"/foo/0", "bar",
|
27
|
+
"/" , 0,
|
28
|
+
"/a~1b" , 1,
|
29
|
+
"/c%d" , 2,
|
30
|
+
"/e^f" , 3,
|
31
|
+
"/g|h" , 4,
|
32
|
+
"/i\\j" , 5,
|
33
|
+
"/k\"l" , 6,
|
34
|
+
"/ " , 7,
|
35
|
+
"/m~0n" , 8,
|
36
|
+
]
|
37
|
+
evaluations.each_slice(2) do |pointer, value|
|
38
|
+
assert_equal(value, JSI::JSON::Pointer.from_pointer(pointer).evaluate(document))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'raises for invalid syntax' do
|
43
|
+
err = assert_raises(JSI::JSON::Pointer::PointerSyntaxError) do
|
44
|
+
JSI::JSON::Pointer.from_pointer("this does not begin with slash").evaluate(document)
|
45
|
+
end
|
46
|
+
assert_equal("Invalid pointer syntax in \"this does not begin with slash\": pointer must begin with /", err.message)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
describe 'initialize from fragment' do
|
50
|
+
# For example, given the document
|
51
|
+
let(:document) do
|
52
|
+
{
|
53
|
+
"foo" => ["bar", "baz"],
|
54
|
+
"" => 0,
|
55
|
+
"a/b" => 1,
|
56
|
+
"c%d" => 2,
|
57
|
+
"e^f" => 3,
|
58
|
+
"g|h" => 4,
|
59
|
+
"i\\j" => 5,
|
60
|
+
"k\"l" => 6,
|
61
|
+
" " => 7,
|
62
|
+
"m~n" => 8,
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'parses' do
|
67
|
+
# the following URI fragment identifiers evaluate to the accompanying values:
|
68
|
+
evaluations = [
|
69
|
+
'#', document,
|
70
|
+
'#/foo', ["bar", "baz"],
|
71
|
+
'#/foo/0', "bar",
|
72
|
+
'#/', 0,
|
73
|
+
'#/a~1b', 1,
|
74
|
+
'#/c%25d', 2,
|
75
|
+
'#/e%5Ef', 3,
|
76
|
+
'#/g%7Ch', 4,
|
77
|
+
'#/i%5Cj', 5,
|
78
|
+
'#/k%22l', 6,
|
79
|
+
'#/%20', 7,
|
80
|
+
'#/m~0n', 8,
|
81
|
+
]
|
82
|
+
evaluations.each_slice(2) do |uri, value|
|
83
|
+
assert_equal(value, JSI::JSON::Pointer.from_fragment(Addressable::URI.parse(uri).fragment).evaluate(document))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'raises for invalid syntax' do
|
88
|
+
err = assert_raises(JSI::JSON::Pointer::PointerSyntaxError) do
|
89
|
+
JSI::JSON::Pointer.from_fragment("this does not begin with slash").evaluate(document)
|
90
|
+
end
|
91
|
+
assert_equal("Invalid pointer syntax in \"this does not begin with slash\": pointer must begin with /", err.message)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
describe 'initialize' do
|
95
|
+
describe 'invalid reference_tokens' do
|
96
|
+
it 'raises' do
|
97
|
+
err = assert_raises(TypeError) { JSI::JSON::Pointer.new({}) }
|
98
|
+
assert_equal("reference_tokens must be an array. got: {}", err.message)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class JSONifiable
|
4
|
+
def initialize(object)
|
5
|
+
@object = object
|
6
|
+
end
|
7
|
+
def as_json
|
8
|
+
@object
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe JSI::Typelike do
|
13
|
+
describe 'as_json' do
|
14
|
+
it 'expresses as json' do
|
15
|
+
assert_equal({}, JSI::Typelike.as_json({}))
|
16
|
+
assert_equal([], JSI::Typelike.as_json([]))
|
17
|
+
|
18
|
+
# symbols to string
|
19
|
+
assert_equal(['a'], JSI::Typelike.as_json([:a]))
|
20
|
+
|
21
|
+
# set
|
22
|
+
assert_equal(['a'], JSI::Typelike.as_json(Set.new(['a'])))
|
23
|
+
|
24
|
+
# responds to #to_hash / #to_ary but naught else
|
25
|
+
assert_equal({'a' => 'b'}, JSI::Typelike.as_json(SortOfHash.new({'a' => 'b'})))
|
26
|
+
assert_equal(['a'], JSI::Typelike.as_json(SortOfArray.new(['a'])))
|
27
|
+
|
28
|
+
# symbol keys to string
|
29
|
+
assert_equal({'a' => 'b'}, JSI::Typelike.as_json({a: 'b'}))
|
30
|
+
# non string/symbol key
|
31
|
+
err = assert_raises(TypeError) { JSI::Typelike.as_json({nil => 0}) }
|
32
|
+
assert_equal('json object (hash) cannot be keyed with: nil', err.message)
|
33
|
+
|
34
|
+
# schema
|
35
|
+
schema = JSI::Schema.from_object({'type' => 'array'})
|
36
|
+
assert_equal({'type' => 'array'}, JSI::Typelike.as_json(schema))
|
37
|
+
|
38
|
+
# JSI
|
39
|
+
assert_equal(['a'], JSI::Typelike.as_json(schema.new_jsi(['a'])))
|
40
|
+
|
41
|
+
# JSON::Node
|
42
|
+
assert_equal(['a'], JSI::Typelike.as_json(JSI::JSON::Node.new_doc(['a'])))
|
43
|
+
|
44
|
+
# #as_json
|
45
|
+
assert_equal(['a'], JSI::Typelike.as_json(JSONifiable.new(['a'])))
|
46
|
+
|
47
|
+
# not jsonifiable
|
48
|
+
object = Object.new
|
49
|
+
err = assert_raises(TypeError) { JSI::Typelike.as_json(object) }
|
50
|
+
assert_equal("cannot express object as json: #{object.pretty_inspect.chomp}", err.message)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
describe JSI::MetaschemaNode do
|
4
|
+
let(:node_document) { {'properties' => {'properties' => {'additionalProperties' => {'$ref' => '#'}}}} }
|
5
|
+
let(:node_ptr) { JSI::JSON::Pointer[] }
|
6
|
+
let(:metaschema_root_ptr) { JSI::JSON::Pointer[] }
|
7
|
+
let(:root_schema_ptr) { JSI::JSON::Pointer[] }
|
8
|
+
let(:subject) { JSI::MetaschemaNode.new(node_document, node_ptr: node_ptr, metaschema_root_ptr: node_ptr, root_schema_ptr: node_ptr) }
|
9
|
+
describe 'initialization' do
|
10
|
+
it 'initializes' do
|
11
|
+
subject
|
12
|
+
end
|
13
|
+
end
|
14
|
+
describe 'json schema draft' do
|
15
|
+
it 'type has a schema' do
|
16
|
+
assert(JSI::JSONSchemaOrgDraft06.schema.type.jsi_schemas.any?)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
describe 'JSI::SchemaModule' do
|
4
|
+
let(:schema_content) { {'properties' => {'foo' => {'items' => {'type' => 'string'}}}} }
|
5
|
+
let(:schema) { JSI::Schema.new(schema_content) }
|
6
|
+
let(:schema_module) { schema.jsi_schema_module }
|
7
|
+
describe 'accessors and subscripts' do
|
8
|
+
it 'returns schemas using accessors and subscripts' do
|
9
|
+
assert_equal(schema.properties, schema_module.properties.possibly_schema_node)
|
10
|
+
assert_equal(schema.properties['foo'], schema_module.properties['foo'].possibly_schema_node)
|
11
|
+
assert_equal(schema.properties['foo'].jsi_schema_module, schema_module.properties['foo'])
|
12
|
+
assert_equal(schema.properties['foo'].items, schema_module.properties['foo'].items.possibly_schema_node)
|
13
|
+
assert_equal(schema.properties['foo'].items.jsi_schema_module, schema_module.properties['foo'].items)
|
14
|
+
assert_equal('string', schema_module.properties['foo'].items.type)
|
15
|
+
end
|
16
|
+
it 'accessors and subscripts with a metaschema' do
|
17
|
+
assert_equal(JSI::JSONSchemaOrgDraft06.schema.properties, JSI::JSONSchemaOrgDraft06.properties.possibly_schema_node)
|
18
|
+
assert_equal(JSI::JSONSchemaOrgDraft06.schema.properties['properties'].additionalProperties.jsi_schema_module, JSI::JSONSchemaOrgDraft06.properties['properties'].additionalProperties)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/test/schema_test.rb
CHANGED
@@ -1,149 +1,163 @@
|
|
1
1
|
require_relative 'test_helper'
|
2
2
|
|
3
|
-
SomeMetaschema = JSI.class_for_schema({id: 'https://schemas.jsi.unth.net/test/somemetaschema', type: 'object'})
|
4
|
-
|
5
3
|
describe JSI::Schema do
|
6
4
|
describe 'new' do
|
7
5
|
it 'initializes from a hash' do
|
8
6
|
schema = JSI::Schema.new({'type' => 'object'})
|
9
|
-
assert_equal(
|
7
|
+
assert_equal({'type' => 'object'}, schema.jsi_instance)
|
10
8
|
end
|
11
9
|
it 'initializes from a Node' do
|
12
10
|
schema_node = JSI::JSON::Node.new_doc({'type' => 'object'})
|
13
11
|
schema = JSI::Schema.new(schema_node)
|
14
|
-
assert_equal(schema_node, schema.
|
15
|
-
assert_equal(schema_node, schema.schema_object)
|
16
|
-
end
|
17
|
-
it 'initializes from a JSI' do
|
18
|
-
schema_jsi = SomeMetaschema.new('type' => 'object')
|
19
|
-
schema = JSI::Schema.new(schema_jsi)
|
20
|
-
assert_equal(schema_jsi.instance, schema.schema_node)
|
21
|
-
assert_equal(schema_jsi, schema.schema_object)
|
12
|
+
assert_equal(schema_node, schema.jsi_instance)
|
22
13
|
end
|
23
14
|
it 'cannot instantiate from some unknown object' do
|
24
15
|
err = assert_raises(TypeError) { JSI::Schema.new(Object.new) }
|
25
16
|
assert_match(/\Acannot instantiate Schema from: #<Object:.*>\z/m, err.message)
|
26
17
|
end
|
27
|
-
it '
|
28
|
-
|
29
|
-
|
18
|
+
it 'instantiating a schema from schema returns that schema' do
|
19
|
+
# this is kinda dumb, but Schema.new now just aliases Schema.from_object, so this is the behavior
|
20
|
+
assert_equal(JSI::Schema.new({}), JSI::Schema.new(JSI::Schema.new({})))
|
30
21
|
end
|
31
22
|
end
|
32
23
|
describe 'as an instance of metaschema' do
|
33
|
-
let(:
|
34
|
-
|
35
|
-
|
36
|
-
JSI::Schema.new(::JSON.parse(File.read(metaschema_file)))
|
37
|
-
end
|
38
|
-
let(:metaschema_jsi_class) { JSI.class_for_schema(default_metaschema) }
|
39
|
-
let(:schema_object) { {'type' => 'array', 'items' => {'description' => 'items!'}} }
|
40
|
-
let(:schema_jsi) { metaschema_jsi_class.new(schema_object) }
|
41
|
-
let(:schema) { JSI::Schema.new(schema_jsi) }
|
24
|
+
let(:metaschema_jsi_module) { JSI::JSONSchemaOrgDraft04 }
|
25
|
+
let(:schema_content) { {'type' => 'array', 'items' => {'description' => 'items!'}} }
|
26
|
+
let(:schema) { metaschema_jsi_module.new_jsi(schema_content) }
|
42
27
|
it '#[]' do
|
43
28
|
schema_items = schema['items']
|
44
|
-
|
29
|
+
assert_is_a(metaschema_jsi_module, schema_items)
|
45
30
|
assert_equal({'description' => 'items!'}, schema_items.as_json)
|
46
31
|
end
|
47
32
|
end
|
48
33
|
describe '#schema_id' do
|
49
|
-
it '
|
50
|
-
|
34
|
+
it "hasn't got one" do
|
35
|
+
assert_nil(JSI::Schema.new({}).schema_id)
|
51
36
|
end
|
52
37
|
it 'uses a given id with a fragment' do
|
53
|
-
schema = JSI::Schema.new({id
|
54
|
-
assert_equal('https://schemas.jsi.unth.net/test/
|
38
|
+
schema = JSI::Schema.new({'id' => 'https://schemas.jsi.unth.net/test/given_id_with_fragment#'})
|
39
|
+
assert_equal('https://schemas.jsi.unth.net/test/given_id_with_fragment#', schema.schema_id)
|
55
40
|
end
|
56
41
|
it 'uses a given id (adding a fragment)' do
|
57
42
|
schema = JSI::Schema.new({id: 'https://schemas.jsi.unth.net/test/given_id'})
|
58
43
|
assert_equal('https://schemas.jsi.unth.net/test/given_id#', schema.schema_id)
|
59
44
|
end
|
60
45
|
it 'uses a pointer in the fragment' do
|
61
|
-
|
62
|
-
'id' => 'https://schemas.jsi.unth.net/test/
|
46
|
+
schema = JSI::Schema.new({
|
47
|
+
'id' => 'https://schemas.jsi.unth.net/test/uses_pointer_in_fragment#',
|
63
48
|
'properties' => {'foo' => {'type' => 'object'}},
|
64
49
|
})
|
65
|
-
|
66
|
-
assert_equal('https://schemas.jsi.unth.net/test/
|
50
|
+
subschema = schema['properties']['foo']
|
51
|
+
assert_equal('https://schemas.jsi.unth.net/test/uses_pointer_in_fragment#/properties/foo', subschema.schema_id)
|
67
52
|
end
|
68
53
|
it 'uses a pointer in the fragment relative to the fragment of the root' do
|
69
|
-
|
70
|
-
'id' => 'https://schemas.jsi.unth.net/test/
|
54
|
+
schema = JSI::Schema.new({
|
55
|
+
'id' => 'https://schemas.jsi.unth.net/test/id_has_pointer#/notroot',
|
71
56
|
'properties' => {'foo' => {'type' => 'object'}},
|
72
57
|
})
|
73
|
-
|
74
|
-
assert_equal('https://schemas.jsi.unth.net/test/
|
58
|
+
subschema = schema['properties']['foo']
|
59
|
+
assert_equal('https://schemas.jsi.unth.net/test/id_has_pointer#/notroot/properties/foo', subschema.schema_id)
|
75
60
|
end
|
76
61
|
end
|
77
|
-
describe '#
|
62
|
+
describe '#jsi_schema_module' do
|
63
|
+
it 'returns the module for the schema' do
|
64
|
+
schema = JSI::Schema.new({'id' => 'https://schemas.jsi.unth.net/test/jsi_schema_module'})
|
65
|
+
assert_is_a(JSI::SchemaModule, schema.jsi_schema_module)
|
66
|
+
assert_equal(schema, schema.jsi_schema_module.schema)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
describe '#jsi_schema_class' do
|
78
70
|
it 'returns the class for the schema' do
|
79
|
-
|
80
|
-
assert_equal(JSI.
|
71
|
+
schema = JSI::Schema.new({'id' => 'https://schemas.jsi.unth.net/test/schema_schema_class'})
|
72
|
+
assert_equal(JSI.class_for_schemas([schema]), schema.jsi_schema_class)
|
81
73
|
end
|
82
74
|
end
|
83
|
-
describe '#
|
75
|
+
describe '#subschemas_for_property_name' do
|
84
76
|
let(:schema) do
|
85
77
|
JSI::Schema.new({
|
86
|
-
properties: {
|
87
|
-
|
78
|
+
properties: {
|
79
|
+
foo: {description: 'foo'},
|
80
|
+
baz: {description: 'baz'},
|
81
|
+
},
|
82
|
+
patternProperties: {
|
83
|
+
"^b" => {description: 'ba*'},
|
84
|
+
},
|
88
85
|
additionalProperties: {description: 'whatever'},
|
89
86
|
})
|
90
87
|
end
|
91
|
-
it 'has no
|
92
|
-
|
88
|
+
it 'has no subschemas' do
|
89
|
+
assert_empty(JSI::Schema.new({}).subschemas_for_property_name('no'))
|
93
90
|
end
|
94
91
|
it 'has a subschema by property' do
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
assert_equal(
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
92
|
+
subschemas = schema.subschemas_for_property_name('foo').to_a
|
93
|
+
assert_equal(1, subschemas.size)
|
94
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, subschemas[0])
|
95
|
+
assert_equal('foo', subschemas[0].description)
|
96
|
+
end
|
97
|
+
it 'has subschemas by patternProperties' do
|
98
|
+
subschemas = schema.subschemas_for_property_name('bar').to_a
|
99
|
+
assert_equal(1, subschemas.size)
|
100
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, subschemas[0])
|
101
|
+
assert_equal('ba*', subschemas[0].description)
|
102
|
+
end
|
103
|
+
it 'has subschemas by properties, patternProperties' do
|
104
|
+
subschemas = schema.subschemas_for_property_name('baz').to_a
|
105
|
+
assert_equal(2, subschemas.size)
|
106
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, subschemas[0])
|
107
|
+
assert_equal('baz', subschemas[0].description)
|
108
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, subschemas[1])
|
109
|
+
assert_equal('ba*', subschemas[1].description)
|
110
|
+
end
|
111
|
+
it 'has subschemas by additional properties' do
|
112
|
+
subschemas = schema.subschemas_for_property_name('anything').to_a
|
113
|
+
assert_equal(1, subschemas.size)
|
114
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, subschemas[0])
|
115
|
+
assert_equal('whatever', subschemas[0].description)
|
108
116
|
end
|
109
117
|
end
|
110
|
-
describe '#
|
111
|
-
it 'has no
|
112
|
-
|
118
|
+
describe '#subschemas_for_index' do
|
119
|
+
it 'has no subschemas' do
|
120
|
+
assert_empty(JSI::Schema.new({}).subschemas_for_index(0))
|
113
121
|
end
|
114
122
|
it 'has a subschema for items' do
|
115
123
|
schema = JSI::Schema.new({
|
116
124
|
items: {description: 'items!'}
|
117
125
|
})
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
assert_equal(
|
126
|
+
first_subschemas = schema.subschemas_for_index(0).to_a
|
127
|
+
assert_equal(1, first_subschemas.size)
|
128
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, first_subschemas[0])
|
129
|
+
assert_equal('items!', first_subschemas[0].description)
|
130
|
+
last_subschemas = schema.subschemas_for_index(1).to_a
|
131
|
+
assert_equal(1, last_subschemas.size)
|
132
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, last_subschemas[0])
|
133
|
+
assert_equal('items!', last_subschemas[0].description)
|
124
134
|
end
|
125
135
|
it 'has a subschema for each item by index' do
|
126
136
|
schema = JSI::Schema.new({
|
127
137
|
items: [{description: 'item one'}, {description: 'item two'}]
|
128
138
|
})
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
assert_equal(
|
139
|
+
first_subschemas = schema.subschemas_for_index(0).to_a
|
140
|
+
assert_equal(1, first_subschemas.size)
|
141
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, first_subschemas[0])
|
142
|
+
assert_equal('item one', first_subschemas[0].description)
|
143
|
+
last_subschemas = schema.subschemas_for_index(1).to_a
|
144
|
+
assert_equal(1, last_subschemas.size)
|
145
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, last_subschemas[0])
|
146
|
+
assert_equal('item two', last_subschemas[0].description)
|
135
147
|
end
|
136
148
|
it 'has a subschema by additional items' do
|
137
149
|
schema = JSI::Schema.new({
|
138
150
|
items: [{description: 'item one'}],
|
139
151
|
additionalItems: {description: "mo' crap"},
|
140
152
|
})
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
assert_equal(
|
153
|
+
first_subschemas = schema.subschemas_for_index(0).to_a
|
154
|
+
assert_equal(1, first_subschemas.size)
|
155
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, first_subschemas[0])
|
156
|
+
assert_equal('item one', first_subschemas[0].description)
|
157
|
+
last_subschemas = schema.subschemas_for_index(1).to_a
|
158
|
+
assert_equal(1, last_subschemas.size)
|
159
|
+
assert_is_a(JSI::Schema.default_metaschema.jsi_schema_module, last_subschemas[0])
|
160
|
+
assert_equal("mo' crap", last_subschemas[0].description)
|
147
161
|
end
|
148
162
|
end
|
149
163
|
describe 'stringification' do
|
@@ -152,42 +166,40 @@ describe JSI::Schema do
|
|
152
166
|
end
|
153
167
|
|
154
168
|
it '#inspect' do
|
155
|
-
assert_equal(
|
169
|
+
assert_equal("\#{<JSI (JSI::JSONSchemaOrgDraft06) Schema> \"id\" => \"https://schemas.jsi.unth.net/test/stringification\", \"type\" => \"object\"}", schema.inspect)
|
156
170
|
end
|
157
171
|
it '#pretty_print' do
|
158
|
-
assert_equal(
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
}
|
163
|
-
>).gsub(/^ /, ''), schema.pretty_inspect.chomp)
|
172
|
+
assert_equal("\#{<JSI (JSI::JSONSchemaOrgDraft06) Schema>
|
173
|
+
\"id\" => \"https://schemas.jsi.unth.net/test/stringification\",
|
174
|
+
\"type\" => \"object\"
|
175
|
+
}".gsub(/^ /, ''), schema.pretty_inspect.chomp)
|
164
176
|
end
|
165
177
|
end
|
166
178
|
describe 'validation' do
|
167
179
|
let(:schema) { JSI::Schema.new({id: 'https://schemas.jsi.unth.net/test/validation', type: 'object'}) }
|
168
180
|
describe 'without errors' do
|
169
181
|
let(:instance) { {'foo' => 'bar'} }
|
170
|
-
it '#
|
171
|
-
assert_equal([], schema.
|
182
|
+
it '#fully_validate_instance' do
|
183
|
+
assert_equal([], schema.fully_validate_instance(instance))
|
172
184
|
end
|
173
|
-
it '#
|
174
|
-
assert_equal(true, schema.
|
185
|
+
it '#validate_instance' do
|
186
|
+
assert_equal(true, schema.validate_instance(instance))
|
175
187
|
end
|
176
|
-
it '#
|
177
|
-
assert_equal(true, schema.
|
188
|
+
it '#validate_instance!' do
|
189
|
+
assert_equal(true, schema.validate_instance!(instance))
|
178
190
|
end
|
179
191
|
end
|
180
192
|
describe 'with errors' do
|
181
193
|
let(:instance) { ['no'] }
|
182
|
-
it '#
|
183
|
-
assert_equal(["The property '#/' of type array did not match the following type: object in schema https://schemas.jsi.unth.net/test/validation"], schema.
|
194
|
+
it '#fully_validate_instance' do
|
195
|
+
assert_equal(["The property '#/' of type array did not match the following type: object in schema https://schemas.jsi.unth.net/test/validation"], schema.fully_validate_instance(instance))
|
184
196
|
end
|
185
|
-
it '#
|
186
|
-
assert_equal(false, schema.
|
197
|
+
it '#validate_instance' do
|
198
|
+
assert_equal(false, schema.validate_instance(instance))
|
187
199
|
end
|
188
|
-
it '#
|
200
|
+
it '#validate_instance!' do
|
189
201
|
err = assert_raises(JSON::Schema::ValidationError) do
|
190
|
-
schema.
|
202
|
+
schema.validate_instance!(instance)
|
191
203
|
end
|
192
204
|
assert_equal("The property '#/' of type array did not match the following type: object", err.message)
|
193
205
|
end
|