json-schema 2.8.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3361b9ea49eb9e208babcec94973eb5efd0d371c2a2cbab16cca9e6555b11b77
4
- data.tar.gz: 82f4c4d50b75db5d379555c76ca2606580c14d74a0ec5088504cfb5f5025e1ed
3
+ metadata.gz: ab17ffc9133c3115ad9bb2f4b37338ee71d1994bf62849e7557b7e41a9d1d8e9
4
+ data.tar.gz: 3c44c431d8997fa255613bd6235fdd82b3c7c15ecc9e1077a1d41ff33b31c69b
5
5
  SHA512:
6
- metadata.gz: 5040893a974d35c4e9833076d8db0073215fdc6330535a4ae7c7d3eef3bdfd902e3642ed5bd9729735b65d8821e30db2b563411d4fd6cf0187c6efe2a4179669
7
- data.tar.gz: 9161d768e8829faafefeabf7723c462019831393d4c696ccbc9b7f7be9f5affcc988cf93a2ce1709ea1b6cddd70230fa44815cd4a3e965b7c15ea65b2b0c3de2
6
+ metadata.gz: 999689f22f02b64395c78b537ee86f6f0390e9cb2dc57e14293d310999bf11b5633b2fe16f1ca4c773bedb90e002452617f3df6926ff955deb84cca5446381ce
7
+ data.tar.gz: 71f12207a56541aab4ba1157d74e988295aff34e181daeb8937ed1e8bdc7a81025baaad536a0634da49527d63c71d341d433832cb56672b60f7fd920dcecda1a
data/README.md CHANGED
@@ -1,9 +1,11 @@
1
- [![Gem Version](https://badge.fury.io/rb/json-schema.svg)](https://badge.fury.io/rb/json-schema)
2
- [![Travis](https://travis-ci.org/ruby-json-schema/json-schema.svg?branch=master)](https://travis-ci.org/ruby-json-schema/json-schema)
3
- [![Code Climate](https://codeclimate.com/github/ruby-json-schema/json-schema/badges/gpa.svg)](https://codeclimate.com/github/ruby-json-schema/json-schema)
1
+ # Ruby JSON Schema Validator
4
2
 
5
- Ruby JSON Schema Validator
6
- ==========================
3
+ [![License](https://img.shields.io/github/license/voxpupuli/json-schema.svg)](https://github.com/voxpupuli/json-schema/blob/master/LICENSE)
4
+ [![Test](https://github.com/voxpupuli/json-schema/actions/workflows/test.yml/badge.svg)](https://github.com/voxpupuli/json-schema/actions/workflows/test.yml)
5
+ [![Release](https://github.com/voxpupuli/json-schema/actions/workflows/release.yml/badge.svg)](https://github.com/voxpupuli/json-schema/actions/workflows/release.yml)
6
+ [![RubyGem Version](https://img.shields.io/gem/v/json-schema.svg)](https://rubygems.org/gems/json-schema)
7
+ [![RubyGem Downloads](https://img.shields.io/gem/dt/json-schema.svg)](https://rubygems.org/gems/json-schema)
8
+ [![Donated by Iain Beeston](https://img.shields.io/badge/donated%20by-Iain%20Beeston-fb7047.svg)](#transfer-notice)
7
9
 
8
10
  This library is intended to provide Ruby with an interface for validating JSON
9
11
  objects against a JSON schema conforming to [JSON Schema Draft
@@ -17,7 +19,7 @@ Additional Resources
17
19
  --------------------
18
20
 
19
21
  - [Google Groups](https://groups.google.com/forum/#!forum/ruby-json-schema)
20
- - #ruby-json-schema on chat.freenode.net
22
+ - #voxpupuli on irc.libera.chat
21
23
 
22
24
  Version 2.0.0 Upgrade Notes
23
25
  ---------------------------
@@ -27,6 +29,14 @@ default**, so schemas that do not declare a validator using the `$schema`
27
29
  keyword will use Draft-04 now instead of Draft-03. This is the reason for the
28
30
  major version upgrade.
29
31
 
32
+ Version 3.0.0 Upgrade Notes
33
+ ---------------------------
34
+
35
+ All individual changes are documented in the CHANGELOG.md. The biggest change
36
+ is that the new version only supports Ruby 2.5 and newer. Take a look into the
37
+ gemspec file to see the currently supported Ruby version and also
38
+ `.github/workflows/test.yml` to see the Ruby versions we test on.
39
+
30
40
  Installation
31
41
  ------------
32
42
 
@@ -39,8 +49,8 @@ gem install json-schema
39
49
  From the git repo:
40
50
 
41
51
  ```sh
42
- $ gem build json-schema.gemspec
43
- $ gem install json-schema-2.5.2.gem
52
+ gem build json-schema.gemspec
53
+ gem install json-schema-*.gem
44
54
  ```
45
55
 
46
56
  Validation
@@ -166,7 +176,7 @@ JSON::Validator.validate(schema, [{"a" => 1}, {"a" => 2}, {"a" => 3}])
166
176
  JSON::Validator.fully_validate(schema, { "a" => "taco" }, :errors_as_objects => true)
167
177
 
168
178
  #
169
- # with the `:strict` option, all properties are condisidered to have `"required": true` and all objects `"additionalProperties": false`
179
+ # with the `:strict` option, all properties are considered to have `"required": true` and all objects `"additionalProperties": false`
170
180
  #
171
181
 
172
182
  # => true
@@ -472,3 +482,23 @@ value is of the correct datatype (e.g., an instance value is validated to be an
472
482
  integer or a float in the case of 'utc-millisec').
473
483
 
474
484
  Additionally, JSON::Validator does not handle any json hyperschema attributes.
485
+
486
+ # Transfer Notice
487
+
488
+ This plugin was originally authored by [Iain Beeston](https://github.com/iainbeeston).
489
+ The maintainer preferred that [Vox Pupuli](https://voxpupuli.org/) take ownership of the module for future improvement and maintenance.
490
+ Existing pull requests and issues were transferred, please fork and continue to contribute [here](https://github.com/voxpupuli/json-schema).
491
+
492
+ # License
493
+
494
+ This gem is licensed unter the [MIT license](LICENSE.md).
495
+
496
+ ## Release information
497
+
498
+ To make a new release, please do:
499
+ * update the version in VERSION.yml
500
+ * Install gems with `bundle install --with release --path .vendor`
501
+ * generate the changelog with `bundle exec rake changelog`
502
+ * Check if the new version matches the closed issues/PRs in the changelog
503
+ * Create a PR with it
504
+ * After it got merged, push a tag. GitHub actions will do the actual release to rubygems and GitHub Packages
@@ -0,0 +1,15 @@
1
+ require 'json-schema/attribute'
2
+
3
+ module JSON
4
+ class Schema
5
+ class ConstAttribute < Attribute
6
+ def self.validate(current_schema, data, fragments, processor, validator, options = {})
7
+ const_value = current_schema.schema['const']
8
+ unless const_value == data
9
+ message = "The property '#{build_fragment(fragments)}' value #{data.inspect} did not match constant '#{const_value}'"
10
+ validation_error(processor, message, fragments, current_schema, self, options[:record_errors])
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -11,7 +11,7 @@ module JSON
11
11
  begin
12
12
  ip = IPAddr.new(data)
13
13
  rescue ArgumentError => e
14
- raise e unless e.message == 'invalid address'
14
+ raise e unless e.message.start_with?('invalid address')
15
15
  end
16
16
 
17
17
  family = ip_version == 6 ? Socket::AF_INET6 : Socket::AF_INET
@@ -118,7 +118,7 @@ module JSON
118
118
 
119
119
  def read_uri(uri)
120
120
  if accept_uri?(uri)
121
- open(uri.to_s).read
121
+ URI.open(uri.to_s).read
122
122
  else
123
123
  raise JSON::Schema::ReadRefused.new(uri.to_s, :uri)
124
124
  end
@@ -4,6 +4,7 @@ require 'bigdecimal'
4
4
  require 'digest/sha1'
5
5
  require 'date'
6
6
  require 'thread'
7
+ require 'timeout'
7
8
  require 'yaml'
8
9
 
9
10
  require 'json-schema/schema/reader'
@@ -41,8 +42,7 @@ module JSON
41
42
  @options = @@default_opts.clone.merge(opts)
42
43
  @errors = []
43
44
 
44
- validator = self.class.validator_for_name(@options[:version])
45
- @options[:version] = validator
45
+ configured_validator = self.class.validator_for_name(@options[:version])
46
46
  @options[:schema_reader] ||= self.class.schema_reader
47
47
 
48
48
  @validation_options = @options[:record_errors] ? {:record_errors => true} : {}
@@ -50,19 +50,16 @@ module JSON
50
50
  @validation_options[:strict] = true if @options[:strict] == true
51
51
  @validation_options[:clear_cache] = true if !@@cache_schemas || @options[:clear_cache]
52
52
 
53
- @@mutex.synchronize { @base_schema = initialize_schema(schema_data) }
53
+ @@mutex.synchronize { @base_schema = initialize_schema(schema_data, configured_validator) }
54
54
  @original_data = data
55
55
  @data = initialize_data(data)
56
56
  @@mutex.synchronize { build_schemas(@base_schema) }
57
57
 
58
58
  # validate the schema, if requested
59
59
  if @options[:validate_schema]
60
- if @base_schema.schema["$schema"]
61
- base_validator = self.class.validator_for_name(@base_schema.schema["$schema"])
62
- end
63
- metaschema = base_validator ? base_validator.metaschema : validator.metaschema
64
60
  # Don't clear the cache during metaschema validation!
65
- self.class.validate!(metaschema, @base_schema.schema, {:clear_cache => false})
61
+ meta_validator = self.class.new(@base_schema.validator.metaschema, @base_schema.schema, {:clear_cache => false})
62
+ meta_validator.validate
66
63
  end
67
64
 
68
65
  # If the :fragment option is set, try and validate against the fragment
@@ -73,40 +70,35 @@ module JSON
73
70
 
74
71
  def schema_from_fragment(base_schema, fragment)
75
72
  schema_uri = base_schema.uri
76
- fragments = fragment.split("/")
73
+ fragments = fragment.split("/").map { |f| f.gsub('~0', '~').gsub('~1', '/') }
77
74
 
78
75
  # ensure the first element was a hash, per the fragment spec
79
76
  if fragments.shift != "#"
80
77
  raise JSON::Schema::SchemaError.new("Invalid fragment syntax in :fragment option")
81
78
  end
82
79
 
80
+ schema_fragment = base_schema.schema
83
81
  fragments.each do |f|
84
- if base_schema.is_a?(JSON::Schema) #test if fragment is a JSON:Schema instance
85
- if !base_schema.schema.has_key?(f)
86
- raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
87
- end
88
- base_schema = base_schema.schema[f]
89
- elsif base_schema.is_a?(Hash)
90
- if !base_schema.has_key?(f)
91
- raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
92
- end
93
- base_schema = JSON::Schema.new(base_schema[f],schema_uri,@options[:version])
94
- elsif base_schema.is_a?(Array)
95
- if base_schema[f.to_i].nil?
96
- raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
97
- end
98
- base_schema = JSON::Schema.new(base_schema[f.to_i],schema_uri,@options[:version])
99
- else
100
- raise JSON::Schema::SchemaError.new("Invalid schema encountered when resolving :fragment option")
82
+ case schema_fragment
83
+ when Hash
84
+ schema_fragment = schema_fragment[f]
85
+ when Array
86
+ schema_fragment = schema_fragment[f.to_i]
101
87
  end
102
88
  end
103
89
 
90
+ unless schema_fragment.is_a?(Hash)
91
+ raise JSON::Schema::SchemaError.new("Invalid fragment resolution for :fragment option")
92
+ end
93
+
94
+ schema = JSON::Schema.new(schema_fragment, schema_uri, base_schema.validator)
95
+
104
96
  if @options[:list]
105
- base_schema.to_array_schema
106
- elsif base_schema.is_a?(Hash)
107
- JSON::Schema.new(base_schema, schema_uri, @options[:version])
97
+ schema.to_array_schema
98
+ elsif schema.is_a?(Hash)
99
+ JSON::Schema.new(schema, schema_uri, @options[:version])
108
100
  else
109
- base_schema
101
+ schema
110
102
  end
111
103
  end
112
104
 
@@ -519,12 +511,12 @@ module JSON
519
511
  @@fake_uuid_generator.call(schema)
520
512
  end
521
513
 
522
- def initialize_schema(schema)
514
+ def initialize_schema(schema, default_validator)
523
515
  if schema.is_a?(String)
524
516
  begin
525
517
  # Build a fake URI for this
526
518
  schema_uri = JSON::Util::URI.parse(fake_uuid(schema))
527
- schema = JSON::Schema.new(self.class.parse(schema), schema_uri, @options[:version])
519
+ schema = JSON::Schema.new(JSON::Validator.parse(schema), schema_uri, default_validator)
528
520
  if @options[:list] && @options[:fragment].nil?
529
521
  schema = schema.to_array_schema
530
522
  end
@@ -554,7 +546,7 @@ module JSON
554
546
  elsif schema.is_a?(Hash)
555
547
  schema_uri = JSON::Util::URI.parse(fake_uuid(serialize(schema)))
556
548
  schema = JSON::Schema.stringify(schema)
557
- schema = JSON::Schema.new(schema, schema_uri, @options[:version])
549
+ schema = JSON::Schema.new(schema, schema_uri, default_validator)
558
550
  if @options[:list] && @options[:fragment].nil?
559
551
  schema = schema.to_array_schema
560
552
  end
@@ -593,7 +585,7 @@ module JSON
593
585
  uri = Util::URI.normalized_uri(uri) if uri.is_a?(String)
594
586
  if uri.absolute? && Util::URI::SUPPORTED_PROTOCOLS.include?(uri.scheme)
595
587
  begin
596
- open(uri.to_s).read
588
+ URI.open(uri.to_s).read
597
589
  rescue OpenURI::HTTPError, Timeout::Error => e
598
590
  raise JSON::Schema::JsonLoadError, e.message
599
591
  end
@@ -34,6 +34,7 @@ module JSON
34
34
  "additionalItems" => JSON::Schema::AdditionalItemsAttribute,
35
35
  "dependencies" => JSON::Schema::DependenciesV4Attribute,
36
36
  "extends" => JSON::Schema::ExtendsAttribute,
37
+ "const" => JSON::Schema::ConstAttribute,
37
38
  "$ref" => JSON::Schema::RefAttribute
38
39
  }
39
40
  @default_formats = {
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.1
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenny Hoxworth
8
+ - Vox Pupuli
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2018-10-14 00:00:00.000000000 Z
12
+ date: 2022-05-03 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rake
@@ -72,16 +73,16 @@ dependencies:
72
73
  requirements:
73
74
  - - ">="
74
75
  - !ruby/object:Gem::Version
75
- version: '2.4'
76
+ version: '2.8'
76
77
  type: :runtime
77
78
  prerelease: false
78
79
  version_requirements: !ruby/object:Gem::Requirement
79
80
  requirements:
80
81
  - - ">="
81
82
  - !ruby/object:Gem::Version
82
- version: '2.4'
83
+ version: '2.8'
83
84
  description:
84
- email: hoxworth@gmail.com
85
+ email: voxpupuli@groups.io
85
86
  executables: []
86
87
  extensions: []
87
88
  extra_rdoc_files:
@@ -96,6 +97,7 @@ files:
96
97
  - lib/json-schema/attributes/additionalproperties.rb
97
98
  - lib/json-schema/attributes/allof.rb
98
99
  - lib/json-schema/attributes/anyof.rb
100
+ - lib/json-schema/attributes/const.rb
99
101
  - lib/json-schema/attributes/dependencies.rb
100
102
  - lib/json-schema/attributes/dependencies_v4.rb
101
103
  - lib/json-schema/attributes/disallow.rb
@@ -169,7 +171,7 @@ files:
169
171
  - resources/draft-03.json
170
172
  - resources/draft-04.json
171
173
  - resources/draft-06.json
172
- homepage: http://github.com/ruby-json-schema/json-schema/tree/master
174
+ homepage: http://github.com/voxpupuli/json-schema/
173
175
  licenses:
174
176
  - MIT
175
177
  metadata: {}
@@ -181,15 +183,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
181
183
  requirements:
182
184
  - - ">="
183
185
  - !ruby/object:Gem::Version
184
- version: '1.9'
186
+ version: '2.5'
185
187
  required_rubygems_version: !ruby/object:Gem::Requirement
186
188
  requirements:
187
189
  - - ">="
188
190
  - !ruby/object:Gem::Version
189
- version: '1.8'
191
+ version: '2.5'
190
192
  requirements: []
191
- rubyforge_project:
192
- rubygems_version: 2.7.6
193
+ rubygems_version: 3.3.7
193
194
  signing_key:
194
195
  specification_version: 4
195
196
  summary: Ruby JSON Schema Validator