json_schemer 1.0.3 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +2 -7
  3. data/CHANGELOG.md +51 -0
  4. data/Gemfile.lock +10 -3
  5. data/README.md +328 -14
  6. data/json_schemer.gemspec +3 -1
  7. data/lib/json_schemer/content.rb +18 -0
  8. data/lib/json_schemer/draft201909/meta.rb +320 -0
  9. data/lib/json_schemer/draft201909/vocab/applicator.rb +104 -0
  10. data/lib/json_schemer/draft201909/vocab/core.rb +45 -0
  11. data/lib/json_schemer/draft201909/vocab.rb +31 -0
  12. data/lib/json_schemer/draft202012/meta.rb +364 -0
  13. data/lib/json_schemer/draft202012/vocab/applicator.rb +382 -0
  14. data/lib/json_schemer/draft202012/vocab/content.rb +52 -0
  15. data/lib/json_schemer/draft202012/vocab/core.rb +160 -0
  16. data/lib/json_schemer/draft202012/vocab/format_annotation.rb +23 -0
  17. data/lib/json_schemer/draft202012/vocab/format_assertion.rb +23 -0
  18. data/lib/json_schemer/draft202012/vocab/meta_data.rb +30 -0
  19. data/lib/json_schemer/draft202012/vocab/unevaluated.rb +94 -0
  20. data/lib/json_schemer/draft202012/vocab/validation.rb +286 -0
  21. data/lib/json_schemer/draft202012/vocab.rb +105 -0
  22. data/lib/json_schemer/draft4/meta.rb +161 -0
  23. data/lib/json_schemer/draft4/vocab/validation.rb +39 -0
  24. data/lib/json_schemer/draft4/vocab.rb +18 -0
  25. data/lib/json_schemer/draft6/meta.rb +172 -0
  26. data/lib/json_schemer/draft6/vocab.rb +16 -0
  27. data/lib/json_schemer/draft7/meta.rb +183 -0
  28. data/lib/json_schemer/draft7/vocab/validation.rb +69 -0
  29. data/lib/json_schemer/draft7/vocab.rb +30 -0
  30. data/lib/json_schemer/errors.rb +1 -0
  31. data/lib/json_schemer/format/duration.rb +23 -0
  32. data/lib/json_schemer/format/json_pointer.rb +18 -0
  33. data/lib/json_schemer/format.rb +128 -106
  34. data/lib/json_schemer/keyword.rb +53 -0
  35. data/lib/json_schemer/location.rb +25 -0
  36. data/lib/json_schemer/openapi.rb +40 -0
  37. data/lib/json_schemer/openapi30/document.rb +1672 -0
  38. data/lib/json_schemer/openapi30/meta.rb +32 -0
  39. data/lib/json_schemer/openapi30/vocab/base.rb +18 -0
  40. data/lib/json_schemer/openapi30/vocab.rb +12 -0
  41. data/lib/json_schemer/openapi31/document.rb +1557 -0
  42. data/lib/json_schemer/openapi31/meta.rb +136 -0
  43. data/lib/json_schemer/openapi31/vocab/base.rb +127 -0
  44. data/lib/json_schemer/openapi31/vocab.rb +18 -0
  45. data/lib/json_schemer/output.rb +56 -0
  46. data/lib/json_schemer/result.rb +229 -0
  47. data/lib/json_schemer/schema.rb +423 -0
  48. data/lib/json_schemer/version.rb +1 -1
  49. data/lib/json_schemer.rb +198 -24
  50. metadata +71 -10
  51. data/lib/json_schemer/schema/base.rb +0 -677
  52. data/lib/json_schemer/schema/draft4.json +0 -149
  53. data/lib/json_schemer/schema/draft4.rb +0 -44
  54. data/lib/json_schemer/schema/draft6.json +0 -155
  55. data/lib/json_schemer/schema/draft6.rb +0 -25
  56. data/lib/json_schemer/schema/draft7.json +0 -172
  57. data/lib/json_schemer/schema/draft7.rb +0 -32
@@ -1,149 +0,0 @@
1
- {
2
- "id": "http://json-schema.org/draft-04/schema#",
3
- "$schema": "http://json-schema.org/draft-04/schema#",
4
- "description": "Core schema meta-schema",
5
- "definitions": {
6
- "schemaArray": {
7
- "type": "array",
8
- "minItems": 1,
9
- "items": { "$ref": "#" }
10
- },
11
- "positiveInteger": {
12
- "type": "integer",
13
- "minimum": 0
14
- },
15
- "positiveIntegerDefault0": {
16
- "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ]
17
- },
18
- "simpleTypes": {
19
- "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ]
20
- },
21
- "stringArray": {
22
- "type": "array",
23
- "items": { "type": "string" },
24
- "minItems": 1,
25
- "uniqueItems": true
26
- }
27
- },
28
- "type": "object",
29
- "properties": {
30
- "id": {
31
- "type": "string"
32
- },
33
- "$schema": {
34
- "type": "string"
35
- },
36
- "title": {
37
- "type": "string"
38
- },
39
- "description": {
40
- "type": "string"
41
- },
42
- "default": {},
43
- "multipleOf": {
44
- "type": "number",
45
- "minimum": 0,
46
- "exclusiveMinimum": true
47
- },
48
- "maximum": {
49
- "type": "number"
50
- },
51
- "exclusiveMaximum": {
52
- "type": "boolean",
53
- "default": false
54
- },
55
- "minimum": {
56
- "type": "number"
57
- },
58
- "exclusiveMinimum": {
59
- "type": "boolean",
60
- "default": false
61
- },
62
- "maxLength": { "$ref": "#/definitions/positiveInteger" },
63
- "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" },
64
- "pattern": {
65
- "type": "string",
66
- "format": "regex"
67
- },
68
- "additionalItems": {
69
- "anyOf": [
70
- { "type": "boolean" },
71
- { "$ref": "#" }
72
- ],
73
- "default": {}
74
- },
75
- "items": {
76
- "anyOf": [
77
- { "$ref": "#" },
78
- { "$ref": "#/definitions/schemaArray" }
79
- ],
80
- "default": {}
81
- },
82
- "maxItems": { "$ref": "#/definitions/positiveInteger" },
83
- "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" },
84
- "uniqueItems": {
85
- "type": "boolean",
86
- "default": false
87
- },
88
- "maxProperties": { "$ref": "#/definitions/positiveInteger" },
89
- "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" },
90
- "required": { "$ref": "#/definitions/stringArray" },
91
- "additionalProperties": {
92
- "anyOf": [
93
- { "type": "boolean" },
94
- { "$ref": "#" }
95
- ],
96
- "default": {}
97
- },
98
- "definitions": {
99
- "type": "object",
100
- "additionalProperties": { "$ref": "#" },
101
- "default": {}
102
- },
103
- "properties": {
104
- "type": "object",
105
- "additionalProperties": { "$ref": "#" },
106
- "default": {}
107
- },
108
- "patternProperties": {
109
- "type": "object",
110
- "additionalProperties": { "$ref": "#" },
111
- "default": {}
112
- },
113
- "dependencies": {
114
- "type": "object",
115
- "additionalProperties": {
116
- "anyOf": [
117
- { "$ref": "#" },
118
- { "$ref": "#/definitions/stringArray" }
119
- ]
120
- }
121
- },
122
- "enum": {
123
- "type": "array",
124
- "minItems": 1,
125
- "uniqueItems": true
126
- },
127
- "type": {
128
- "anyOf": [
129
- { "$ref": "#/definitions/simpleTypes" },
130
- {
131
- "type": "array",
132
- "items": { "$ref": "#/definitions/simpleTypes" },
133
- "minItems": 1,
134
- "uniqueItems": true
135
- }
136
- ]
137
- },
138
- "format": { "type": "string" },
139
- "allOf": { "$ref": "#/definitions/schemaArray" },
140
- "anyOf": { "$ref": "#/definitions/schemaArray" },
141
- "oneOf": { "$ref": "#/definitions/schemaArray" },
142
- "not": { "$ref": "#" }
143
- },
144
- "dependencies": {
145
- "exclusiveMaximum": [ "maximum" ],
146
- "exclusiveMinimum": [ "minimum" ]
147
- },
148
- "default": {}
149
- }
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
- module JSONSchemer
3
- module Schema
4
- class Draft4 < Base
5
- ID_KEYWORD = 'id'
6
- SUPPORTED_FORMATS = Set[
7
- 'date-time',
8
- 'email',
9
- 'hostname',
10
- 'ipv4',
11
- 'ipv6',
12
- 'uri',
13
- 'regex'
14
- ].freeze
15
-
16
- private
17
-
18
- def id_keyword
19
- ID_KEYWORD
20
- end
21
-
22
- def supported_format?(format)
23
- SUPPORTED_FORMATS.include?(format)
24
- end
25
-
26
- def validate_exclusive_maximum(instance, exclusive_maximum, maximum)
27
- yield error(instance, 'exclusiveMaximum') if exclusive_maximum && instance.data >= maximum
28
- end
29
-
30
- def validate_exclusive_minimum(instance, exclusive_minimum, minimum)
31
- yield error(instance, 'exclusiveMinimum') if exclusive_minimum && instance.data <= minimum
32
- end
33
-
34
- def validate_integer(instance, &block)
35
- if !instance.data.is_a?(Integer)
36
- yield error(instance, 'integer')
37
- return
38
- end
39
-
40
- validate_numeric(instance, &block)
41
- end
42
- end
43
- end
44
- end
@@ -1,155 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-06/schema#",
3
- "$id": "http://json-schema.org/draft-06/schema#",
4
- "title": "Core schema meta-schema",
5
- "definitions": {
6
- "schemaArray": {
7
- "type": "array",
8
- "minItems": 1,
9
- "items": { "$ref": "#" }
10
- },
11
- "nonNegativeInteger": {
12
- "type": "integer",
13
- "minimum": 0
14
- },
15
- "nonNegativeIntegerDefault0": {
16
- "allOf": [
17
- { "$ref": "#/definitions/nonNegativeInteger" },
18
- { "default": 0 }
19
- ]
20
- },
21
- "simpleTypes": {
22
- "enum": [
23
- "array",
24
- "boolean",
25
- "integer",
26
- "null",
27
- "number",
28
- "object",
29
- "string"
30
- ]
31
- },
32
- "stringArray": {
33
- "type": "array",
34
- "items": { "type": "string" },
35
- "uniqueItems": true,
36
- "default": []
37
- }
38
- },
39
- "type": ["object", "boolean"],
40
- "properties": {
41
- "$id": {
42
- "type": "string",
43
- "format": "uri-reference"
44
- },
45
- "$schema": {
46
- "type": "string",
47
- "format": "uri"
48
- },
49
- "$ref": {
50
- "type": "string",
51
- "format": "uri-reference"
52
- },
53
- "title": {
54
- "type": "string"
55
- },
56
- "description": {
57
- "type": "string"
58
- },
59
- "default": {},
60
- "examples": {
61
- "type": "array",
62
- "items": {}
63
- },
64
- "multipleOf": {
65
- "type": "number",
66
- "exclusiveMinimum": 0
67
- },
68
- "maximum": {
69
- "type": "number"
70
- },
71
- "exclusiveMaximum": {
72
- "type": "number"
73
- },
74
- "minimum": {
75
- "type": "number"
76
- },
77
- "exclusiveMinimum": {
78
- "type": "number"
79
- },
80
- "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
81
- "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
82
- "pattern": {
83
- "type": "string",
84
- "format": "regex"
85
- },
86
- "additionalItems": { "$ref": "#" },
87
- "items": {
88
- "anyOf": [
89
- { "$ref": "#" },
90
- { "$ref": "#/definitions/schemaArray" }
91
- ],
92
- "default": {}
93
- },
94
- "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
95
- "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
96
- "uniqueItems": {
97
- "type": "boolean",
98
- "default": false
99
- },
100
- "contains": { "$ref": "#" },
101
- "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
102
- "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
103
- "required": { "$ref": "#/definitions/stringArray" },
104
- "additionalProperties": { "$ref": "#" },
105
- "definitions": {
106
- "type": "object",
107
- "additionalProperties": { "$ref": "#" },
108
- "default": {}
109
- },
110
- "properties": {
111
- "type": "object",
112
- "additionalProperties": { "$ref": "#" },
113
- "default": {}
114
- },
115
- "patternProperties": {
116
- "type": "object",
117
- "additionalProperties": { "$ref": "#" },
118
- "propertyNames": { "format": "regex" },
119
- "default": {}
120
- },
121
- "dependencies": {
122
- "type": "object",
123
- "additionalProperties": {
124
- "anyOf": [
125
- { "$ref": "#" },
126
- { "$ref": "#/definitions/stringArray" }
127
- ]
128
- }
129
- },
130
- "propertyNames": { "$ref": "#" },
131
- "const": {},
132
- "enum": {
133
- "type": "array",
134
- "minItems": 1,
135
- "uniqueItems": true
136
- },
137
- "type": {
138
- "anyOf": [
139
- { "$ref": "#/definitions/simpleTypes" },
140
- {
141
- "type": "array",
142
- "items": { "$ref": "#/definitions/simpleTypes" },
143
- "minItems": 1,
144
- "uniqueItems": true
145
- }
146
- ]
147
- },
148
- "format": { "type": "string" },
149
- "allOf": { "$ref": "#/definitions/schemaArray" },
150
- "anyOf": { "$ref": "#/definitions/schemaArray" },
151
- "oneOf": { "$ref": "#/definitions/schemaArray" },
152
- "not": { "$ref": "#" }
153
- },
154
- "default": {}
155
- }
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
- module JSONSchemer
3
- module Schema
4
- class Draft6 < Base
5
- SUPPORTED_FORMATS = Set[
6
- 'date-time',
7
- 'email',
8
- 'hostname',
9
- 'ipv4',
10
- 'ipv6',
11
- 'uri',
12
- 'uri-reference',
13
- 'uri-template',
14
- 'json-pointer',
15
- 'regex'
16
- ].freeze
17
-
18
- private
19
-
20
- def supported_format?(format)
21
- SUPPORTED_FORMATS.include?(format)
22
- end
23
- end
24
- end
25
- end
@@ -1,172 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "http://json-schema.org/draft-07/schema#",
4
- "title": "Core schema meta-schema",
5
- "definitions": {
6
- "schemaArray": {
7
- "type": "array",
8
- "minItems": 1,
9
- "items": { "$ref": "#" }
10
- },
11
- "nonNegativeInteger": {
12
- "type": "integer",
13
- "minimum": 0
14
- },
15
- "nonNegativeIntegerDefault0": {
16
- "allOf": [
17
- { "$ref": "#/definitions/nonNegativeInteger" },
18
- { "default": 0 }
19
- ]
20
- },
21
- "simpleTypes": {
22
- "enum": [
23
- "array",
24
- "boolean",
25
- "integer",
26
- "null",
27
- "number",
28
- "object",
29
- "string"
30
- ]
31
- },
32
- "stringArray": {
33
- "type": "array",
34
- "items": { "type": "string" },
35
- "uniqueItems": true,
36
- "default": []
37
- }
38
- },
39
- "type": ["object", "boolean"],
40
- "properties": {
41
- "$id": {
42
- "type": "string",
43
- "format": "uri-reference"
44
- },
45
- "$schema": {
46
- "type": "string",
47
- "format": "uri"
48
- },
49
- "$ref": {
50
- "type": "string",
51
- "format": "uri-reference"
52
- },
53
- "$comment": {
54
- "type": "string"
55
- },
56
- "title": {
57
- "type": "string"
58
- },
59
- "description": {
60
- "type": "string"
61
- },
62
- "default": true,
63
- "readOnly": {
64
- "type": "boolean",
65
- "default": false
66
- },
67
- "writeOnly": {
68
- "type": "boolean",
69
- "default": false
70
- },
71
- "examples": {
72
- "type": "array",
73
- "items": true
74
- },
75
- "multipleOf": {
76
- "type": "number",
77
- "exclusiveMinimum": 0
78
- },
79
- "maximum": {
80
- "type": "number"
81
- },
82
- "exclusiveMaximum": {
83
- "type": "number"
84
- },
85
- "minimum": {
86
- "type": "number"
87
- },
88
- "exclusiveMinimum": {
89
- "type": "number"
90
- },
91
- "maxLength": { "$ref": "#/definitions/nonNegativeInteger" },
92
- "minLength": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
93
- "pattern": {
94
- "type": "string",
95
- "format": "regex"
96
- },
97
- "additionalItems": { "$ref": "#" },
98
- "items": {
99
- "anyOf": [
100
- { "$ref": "#" },
101
- { "$ref": "#/definitions/schemaArray" }
102
- ],
103
- "default": true
104
- },
105
- "maxItems": { "$ref": "#/definitions/nonNegativeInteger" },
106
- "minItems": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
107
- "uniqueItems": {
108
- "type": "boolean",
109
- "default": false
110
- },
111
- "contains": { "$ref": "#" },
112
- "maxProperties": { "$ref": "#/definitions/nonNegativeInteger" },
113
- "minProperties": { "$ref": "#/definitions/nonNegativeIntegerDefault0" },
114
- "required": { "$ref": "#/definitions/stringArray" },
115
- "additionalProperties": { "$ref": "#" },
116
- "definitions": {
117
- "type": "object",
118
- "additionalProperties": { "$ref": "#" },
119
- "default": {}
120
- },
121
- "properties": {
122
- "type": "object",
123
- "additionalProperties": { "$ref": "#" },
124
- "default": {}
125
- },
126
- "patternProperties": {
127
- "type": "object",
128
- "additionalProperties": { "$ref": "#" },
129
- "propertyNames": { "format": "regex" },
130
- "default": {}
131
- },
132
- "dependencies": {
133
- "type": "object",
134
- "additionalProperties": {
135
- "anyOf": [
136
- { "$ref": "#" },
137
- { "$ref": "#/definitions/stringArray" }
138
- ]
139
- }
140
- },
141
- "propertyNames": { "$ref": "#" },
142
- "const": true,
143
- "enum": {
144
- "type": "array",
145
- "items": true,
146
- "minItems": 1,
147
- "uniqueItems": true
148
- },
149
- "type": {
150
- "anyOf": [
151
- { "$ref": "#/definitions/simpleTypes" },
152
- {
153
- "type": "array",
154
- "items": { "$ref": "#/definitions/simpleTypes" },
155
- "minItems": 1,
156
- "uniqueItems": true
157
- }
158
- ]
159
- },
160
- "format": { "type": "string" },
161
- "contentMediaType": { "type": "string" },
162
- "contentEncoding": { "type": "string" },
163
- "if": { "$ref": "#" },
164
- "then": { "$ref": "#" },
165
- "else": { "$ref": "#" },
166
- "allOf": { "$ref": "#/definitions/schemaArray" },
167
- "anyOf": { "$ref": "#/definitions/schemaArray" },
168
- "oneOf": { "$ref": "#/definitions/schemaArray" },
169
- "not": { "$ref": "#" }
170
- },
171
- "default": true
172
- }
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
- module JSONSchemer
3
- module Schema
4
- class Draft7 < Base
5
- SUPPORTED_FORMATS = Set[
6
- 'date-time',
7
- 'date',
8
- 'time',
9
- 'email',
10
- 'idn-email',
11
- 'hostname',
12
- 'idn-hostname',
13
- 'ipv4',
14
- 'ipv6',
15
- 'uri',
16
- 'uri-reference',
17
- 'iri',
18
- 'iri-reference',
19
- 'uri-template',
20
- 'json-pointer',
21
- 'relative-json-pointer',
22
- 'regex'
23
- ].freeze
24
-
25
- private
26
-
27
- def supported_format?(format)
28
- SUPPORTED_FORMATS.include?(format)
29
- end
30
- end
31
- end
32
- end