json_schemer 0.2.24 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,172 @@
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,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module JSONSchemer
3
- VERSION = '0.2.24'
3
+ VERSION = '1.0.0'
4
4
  end
data/lib/json_schemer.rb CHANGED
@@ -9,15 +9,17 @@ require 'set'
9
9
  require 'time'
10
10
  require 'uri'
11
11
 
12
- require 'ecma-re-validator'
13
12
  require 'hana'
14
13
  require 'regexp_parser'
14
+ require 'simpleidn'
15
15
  require 'uri_template'
16
16
 
17
17
  require 'json_schemer/version'
18
+ require 'json_schemer/format/hostname'
18
19
  require 'json_schemer/format'
19
20
  require 'json_schemer/errors'
20
21
  require 'json_schemer/cached_resolver'
22
+ require 'json_schemer/ecma_regexp'
21
23
  require 'json_schemer/schema/base'
22
24
  require 'json_schemer/schema/draft4'
23
25
  require 'json_schemer/schema/draft6'
@@ -26,20 +28,21 @@ require 'json_schemer/schema/draft7'
26
28
  module JSONSchemer
27
29
  class UnsupportedMetaSchema < StandardError; end
28
30
  class UnknownRef < StandardError; end
31
+ class UnknownFormat < StandardError; end
29
32
  class InvalidRefResolution < StandardError; end
30
33
  class InvalidRegexpResolution < StandardError; end
31
34
  class InvalidFileURI < StandardError; end
32
35
  class InvalidSymbolKey < StandardError; end
36
+ class InvalidEcmaRegexp < StandardError; end
33
37
 
34
- DRAFT_CLASS_BY_META_SCHEMA = {
38
+ DEFAULT_SCHEMA_CLASS = Schema::Draft7
39
+ SCHEMA_CLASS_BY_META_SCHEMA = {
35
40
  'http://json-schema.org/schema#' => Schema::Draft4, # Version-less $schema deprecated after Draft 4
36
41
  'http://json-schema.org/draft-04/schema#' => Schema::Draft4,
37
42
  'http://json-schema.org/draft-06/schema#' => Schema::Draft6,
38
43
  'http://json-schema.org/draft-07/schema#' => Schema::Draft7
39
44
  }.freeze
40
45
 
41
- DEFAULT_META_SCHEMA = 'http://json-schema.org/draft-07/schema#'
42
-
43
46
  WINDOWS_URI_PATH_REGEX = /\A\/[a-z]:/i
44
47
 
45
48
  FILE_URI_REF_RESOLVER = proc do |uri|
@@ -51,29 +54,38 @@ module JSONSchemer
51
54
  end
52
55
 
53
56
  class << self
54
- def schema(schema, **options)
57
+ def schema(schema, default_schema_class: DEFAULT_SCHEMA_CLASS, **options)
55
58
  case schema
56
59
  when String
57
60
  schema = JSON.parse(schema)
58
61
  when Pathname
59
- uri = URI.parse(File.join('file:', URI::DEFAULT_PARSER.escape(schema.realpath.to_s)))
60
- if options.key?(:ref_resolver)
61
- schema = FILE_URI_REF_RESOLVER.call(uri)
62
+ base_uri = URI.parse(File.join('file:', URI::DEFAULT_PARSER.escape(schema.realpath.to_s)))
63
+ options[:base_uri] = base_uri
64
+ schema = if options.key?(:ref_resolver)
65
+ FILE_URI_REF_RESOLVER.call(base_uri)
62
66
  else
63
67
  ref_resolver = CachedResolver.new(&FILE_URI_REF_RESOLVER)
64
- schema = ref_resolver.call(uri)
65
68
  options[:ref_resolver] = ref_resolver
69
+ ref_resolver.call(base_uri)
66
70
  end
67
- schema[draft_class(schema)::ID_KEYWORD] ||= uri.to_s
68
71
  end
69
- draft_class(schema).new(schema, **options)
72
+
73
+ schema_class = if schema.is_a?(Hash) && schema.key?('$schema')
74
+ meta_schema = schema.fetch('$schema')
75
+ SCHEMA_CLASS_BY_META_SCHEMA[meta_schema] || raise(UnsupportedMetaSchema, meta_schema)
76
+ else
77
+ default_schema_class
78
+ end
79
+
80
+ schema_class.new(schema, **options)
70
81
  end
71
82
 
72
- private
83
+ def valid_schema?(schema, default_schema_class: DEFAULT_SCHEMA_CLASS)
84
+ schema(schema, default_schema_class: default_schema_class).valid_schema?
85
+ end
73
86
 
74
- def draft_class(schema)
75
- meta_schema = schema.is_a?(Hash) && schema.key?('$schema') ? schema['$schema'] : DEFAULT_META_SCHEMA
76
- DRAFT_CLASS_BY_META_SCHEMA[meta_schema] || raise(UnsupportedMetaSchema, meta_schema)
87
+ def validate_schema(schema, default_schema_class: DEFAULT_SCHEMA_CLASS)
88
+ schema(schema, default_schema_class: default_schema_class).validate_schema
77
89
  end
78
90
  end
79
91
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schemer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.24
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Harsha
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-12-08 00:00:00.000000000 Z
11
+ date: 2023-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,19 +53,19 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: ecma-re-validator
56
+ name: simplecov
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.3'
62
- type: :runtime
61
+ version: '0.22'
62
+ type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.3'
68
+ version: '0.22'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: hana
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -81,33 +81,47 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.3'
83
83
  - !ruby/object:Gem::Dependency
84
- name: uri_template
84
+ name: regexp_parser
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.7'
89
+ version: '2.0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.7'
96
+ version: '2.0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: regexp_parser
98
+ name: simpleidn
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '2.0'
103
+ version: '0.2'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '2.0'
110
+ version: '0.2'
111
+ - !ruby/object:Gem::Dependency
112
+ name: uri_template
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.7'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.7'
111
125
  description:
112
126
  email:
113
127
  - davishmcclurg@gmail.com
@@ -118,23 +132,30 @@ extra_rdoc_files: []
118
132
  files:
119
133
  - ".github/workflows/ci.yml"
120
134
  - ".gitignore"
135
+ - CHANGELOG.md
121
136
  - Gemfile
122
137
  - Gemfile.lock
123
138
  - LICENSE.txt
124
139
  - README.md
125
140
  - Rakefile
126
141
  - bin/console
142
+ - bin/hostname_character_classes
127
143
  - bin/rake
128
144
  - bin/setup
129
145
  - exe/json_schemer
130
146
  - json_schemer.gemspec
131
147
  - lib/json_schemer.rb
132
148
  - lib/json_schemer/cached_resolver.rb
149
+ - lib/json_schemer/ecma_regexp.rb
133
150
  - lib/json_schemer/errors.rb
134
151
  - lib/json_schemer/format.rb
152
+ - lib/json_schemer/format/hostname.rb
135
153
  - lib/json_schemer/schema/base.rb
154
+ - lib/json_schemer/schema/draft4.json
136
155
  - lib/json_schemer/schema/draft4.rb
156
+ - lib/json_schemer/schema/draft6.json
137
157
  - lib/json_schemer/schema/draft6.rb
158
+ - lib/json_schemer/schema/draft7.json
138
159
  - lib/json_schemer/schema/draft7.rb
139
160
  - lib/json_schemer/version.rb
140
161
  homepage: https://github.com/davishmcclurg/json_schemer
@@ -149,14 +170,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
149
170
  requirements:
150
171
  - - ">="
151
172
  - !ruby/object:Gem::Version
152
- version: '2.4'
173
+ version: '2.5'
153
174
  required_rubygems_version: !ruby/object:Gem::Requirement
154
175
  requirements:
155
176
  - - ">="
156
177
  - !ruby/object:Gem::Version
157
178
  version: '0'
158
179
  requirements: []
159
- rubygems_version: 3.3.7
180
+ rubygems_version: 3.4.10
160
181
  signing_key:
161
182
  specification_version: 4
162
183
  summary: JSON Schema validator. Supports drafts 4, 6, and 7.