strict_json_schema_generator 1.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: dbbea843ebad164d883cb1ecfdae9185b54ed118c812f84c589f3435c512dd88
4
+ data.tar.gz: cb62e100998e3b58f2fb52fc249baafb532b02e78f1732c98f0844514eae9c01
5
+ SHA512:
6
+ metadata.gz: 9ec272b55d8c644cef6db7ccafbd3e257c745bf9dda8ba3a5058f2eaecf6d0fd8cc48be02f1339b17ca8bee7974dde1502350a3f471e63bf4643ca5abd52ccce
7
+ data.tar.gz: 8ebc9c1ebb8c3c1a0679dea66b3c3d902651b2d3f1722daec3be6ce37a38ee7890aaacfcce9c917a0e9ab75d3a1cd52edb477660ae7ea14cda72e20e848549ad
@@ -0,0 +1,62 @@
1
+ module JSON
2
+ class StrictSchemaGenerator
3
+ attr_reader :schema
4
+
5
+ # beware that the provided object must have symbol keys and will be modified
6
+ def self.call(schema)
7
+ new(schema).strictify!
8
+ end
9
+
10
+ def initialize(schema)
11
+ @schema = schema
12
+ end
13
+
14
+ def strictify!
15
+ set_strict_attributes_for(schema)
16
+
17
+ schema
18
+ end
19
+
20
+ private
21
+
22
+ def type
23
+ @type ||= schema[:type].to_s
24
+ end
25
+
26
+ def object?
27
+ type == 'object'
28
+ end
29
+
30
+ def object_with_properties?
31
+ object? && schema[:properties].is_a?(Hash)
32
+ end
33
+
34
+ def set_strict_attributes_for(schema_subset)
35
+ set_object_strict_attributes(schema_subset)
36
+
37
+ schema_subset.each do |_key, subset|
38
+ case subset
39
+ when Hash
40
+ self.class.call(subset)
41
+ when Array
42
+ subset.each do |item|
43
+ self.class.call(item) if item.is_a?(Hash)
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ def set_object_strict_attributes(schema_subset)
50
+ return unless object_with_properties?
51
+
52
+ schema_subset.merge!(
53
+ required: schema_subset[:required] || schema_subset[:properties].keys,
54
+ additionalProperties: false
55
+ )
56
+
57
+ schema_subset[:properties].each do |_, property|
58
+ self.class.call(property)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,7 @@
1
+ RSpec::Matchers.define :strictly_match_schema do |schema|
2
+ match do |data|
3
+ schema_dup = JSON.parse(schema.to_json, symbolize_names: true)
4
+
5
+ JSON::Validator.validate!(JSON::StrictSchemaGenerator.call(schema_dup), data)
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'json/strict_schema_generator'
2
+ require 'rspec/strictly_match_schema' if defined?(RSpec)
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: strict_json_schema_generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Alexandre Bernard
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-07-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json-schema
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ description: Ease the pain from manually requiring all fields in a JSON Schema when
28
+ no required field list is specified
29
+ email: archiduc@alexandrebernard.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/json/strict_schema_generator.rb
35
+ - lib/rspec/strictly_match_schema.rb
36
+ - lib/strict_json_schema_generator.rb
37
+ homepage: https://github.com/AlexandreBernard/rb_strict_json_schema_generator
38
+ licenses:
39
+ - MIT
40
+ metadata:
41
+ source_code_uri: https://github.com/AlexandreBernard/rb_strict_json_schema_generator
42
+ post_install_message:
43
+ rdoc_options: []
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '2.5'
56
+ requirements: []
57
+ rubygems_version: 3.1.4
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: Transforms a JSON Schema to require all fields when not specified
61
+ test_files: []