json_schemer 0.2.24 → 1.0.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.
@@ -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.