jsi 0.6.0 → 0.8.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.
- checksums.yaml +4 -4
 - data/.yardopts +6 -1
 - data/CHANGELOG.md +33 -0
 - data/LICENSE.md +1 -1
 - data/README.md +29 -23
 - data/jsi.gemspec +29 -0
 - data/lib/jsi/base/mutability.rb +44 -0
 - data/lib/jsi/base/node.rb +348 -0
 - data/lib/jsi/base.rb +497 -339
 - data/lib/jsi/jsi_coder.rb +19 -17
 - data/lib/jsi/metaschema_node/bootstrap_schema.rb +61 -26
 - data/lib/jsi/metaschema_node.rb +161 -133
 - data/lib/jsi/ptr.rb +80 -47
 - data/lib/jsi/schema/application/child_application/contains.rb +11 -2
 - data/lib/jsi/schema/application/child_application/draft04.rb +0 -1
 - data/lib/jsi/schema/application/child_application/draft06.rb +0 -1
 - data/lib/jsi/schema/application/child_application/draft07.rb +0 -1
 - data/lib/jsi/schema/application/child_application/items.rb +3 -3
 - data/lib/jsi/schema/application/child_application/properties.rb +3 -3
 - data/lib/jsi/schema/application/child_application.rb +0 -27
 - data/lib/jsi/schema/application/inplace_application/dependencies.rb +1 -1
 - data/lib/jsi/schema/application/inplace_application/draft04.rb +0 -1
 - data/lib/jsi/schema/application/inplace_application/draft06.rb +0 -1
 - data/lib/jsi/schema/application/inplace_application/draft07.rb +0 -1
 - data/lib/jsi/schema/application/inplace_application/ifthenelse.rb +3 -3
 - data/lib/jsi/schema/application/inplace_application/ref.rb +2 -2
 - data/lib/jsi/schema/application/inplace_application/someof.rb +26 -11
 - data/lib/jsi/schema/application/inplace_application.rb +0 -32
 - data/lib/jsi/schema/draft04.rb +0 -1
 - data/lib/jsi/schema/draft06.rb +0 -1
 - data/lib/jsi/schema/draft07.rb +0 -1
 - data/lib/jsi/schema/ref.rb +46 -19
 - data/lib/jsi/schema/schema_ancestor_node.rb +69 -66
 - data/lib/jsi/schema/validation/array.rb +3 -3
 - data/lib/jsi/schema/validation/const.rb +1 -1
 - data/lib/jsi/schema/validation/contains.rb +2 -2
 - data/lib/jsi/schema/validation/dependencies.rb +1 -1
 - data/lib/jsi/schema/validation/draft04/minmax.rb +8 -6
 - data/lib/jsi/schema/validation/draft04.rb +0 -2
 - data/lib/jsi/schema/validation/draft06.rb +0 -2
 - data/lib/jsi/schema/validation/draft07.rb +0 -2
 - data/lib/jsi/schema/validation/enum.rb +1 -1
 - data/lib/jsi/schema/validation/ifthenelse.rb +5 -5
 - data/lib/jsi/schema/validation/items.rb +7 -7
 - data/lib/jsi/schema/validation/not.rb +1 -1
 - data/lib/jsi/schema/validation/numeric.rb +5 -5
 - data/lib/jsi/schema/validation/object.rb +2 -2
 - data/lib/jsi/schema/validation/pattern.rb +2 -2
 - data/lib/jsi/schema/validation/properties.rb +7 -7
 - data/lib/jsi/schema/validation/property_names.rb +1 -1
 - data/lib/jsi/schema/validation/ref.rb +2 -2
 - data/lib/jsi/schema/validation/required.rb +1 -1
 - data/lib/jsi/schema/validation/someof.rb +3 -3
 - data/lib/jsi/schema/validation/string.rb +2 -2
 - data/lib/jsi/schema/validation/type.rb +1 -1
 - data/lib/jsi/schema/validation.rb +1 -3
 - data/lib/jsi/schema.rb +443 -226
 - data/lib/jsi/schema_classes.rb +241 -147
 - data/lib/jsi/schema_registry.rb +78 -19
 - data/lib/jsi/schema_set.rb +114 -28
 - data/lib/jsi/simple_wrap.rb +18 -4
 - data/lib/jsi/util/private/attr_struct.rb +141 -0
 - data/lib/jsi/util/private/memo_map.rb +75 -0
 - data/lib/jsi/util/private.rb +185 -0
 - data/lib/jsi/{typelike_modules.rb → util/typelike.rb} +79 -105
 - data/lib/jsi/util.rb +157 -153
 - data/lib/jsi/validation/error.rb +4 -0
 - data/lib/jsi/validation/result.rb +18 -32
 - data/lib/jsi/version.rb +1 -1
 - data/lib/jsi.rb +65 -39
 - data/lib/schemas/json-schema.org/draft-04/schema.rb +160 -3
 - data/lib/schemas/json-schema.org/draft-06/schema.rb +162 -3
 - data/lib/schemas/json-schema.org/draft-07/schema.rb +189 -3
 - metadata +27 -11
 - data/lib/jsi/metaschema.rb +0 -7
 - data/lib/jsi/pathed_node.rb +0 -116
 - data/lib/jsi/schema/validation/core.rb +0 -39
 - data/lib/jsi/util/attr_struct.rb +0 -106
 
| 
         @@ -6,7 +6,7 @@ module JSI 
     | 
|
| 
       6 
6 
     | 
    
         
             
                def internal_validate_properties(result_builder)
         
     | 
| 
       7 
7 
     | 
    
         
             
                  evaluated_property_names = Set[]
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                  if  
     | 
| 
      
 9 
     | 
    
         
            +
                  if keyword?('properties')
         
     | 
| 
       10 
10 
     | 
    
         
             
                    value = schema_content['properties']
         
     | 
| 
       11 
11 
     | 
    
         
             
                    # The value of "properties" MUST be an object. Each value of this object MUST be a valid JSON Schema.
         
     | 
| 
       12 
12 
     | 
    
         
             
                    if value.respond_to?(:to_hash)
         
     | 
| 
         @@ -19,8 +19,8 @@ module JSI 
     | 
|
| 
       19 
19 
     | 
    
         
             
                          if value.key?(property_name)
         
     | 
| 
       20 
20 
     | 
    
         
             
                            evaluated_property_names << property_name
         
     | 
| 
       21 
21 
     | 
    
         
             
                            results[property_name] = result_builder.child_subschema_validate(
         
     | 
| 
      
 22 
     | 
    
         
            +
                              property_name,
         
     | 
| 
       22 
23 
     | 
    
         
             
                              ['properties', property_name],
         
     | 
| 
       23 
     | 
    
         
            -
                              [property_name],
         
     | 
| 
       24 
24 
     | 
    
         
             
                            )
         
     | 
| 
       25 
25 
     | 
    
         
             
                          end
         
     | 
| 
       26 
26 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -36,7 +36,7 @@ module JSI 
     | 
|
| 
       36 
36 
     | 
    
         
             
                    end
         
     | 
| 
       37 
37 
     | 
    
         
             
                  end
         
     | 
| 
       38 
38 
     | 
    
         | 
| 
       39 
     | 
    
         
            -
                  if  
     | 
| 
      
 39 
     | 
    
         
            +
                  if keyword?('patternProperties')
         
     | 
| 
       40 
40 
     | 
    
         
             
                    value = schema_content['patternProperties']
         
     | 
| 
       41 
41 
     | 
    
         
             
                    # The value of "patternProperties" MUST be an object. Each property name of this object SHOULD be a
         
     | 
| 
       42 
42 
     | 
    
         
             
                    # valid regular expression, according to the ECMA 262 regular expression dialect. Each property value
         
     | 
| 
         @@ -54,8 +54,8 @@ module JSI 
     | 
|
| 
       54 
54 
     | 
    
         
             
                              if value_property_pattern.respond_to?(:to_str) && Regexp.new(value_property_pattern).match(property_name.to_s)
         
     | 
| 
       55 
55 
     | 
    
         
             
                                evaluated_property_names << property_name
         
     | 
| 
       56 
56 
     | 
    
         
             
                                results[property_name] = result_builder.child_subschema_validate(
         
     | 
| 
      
 57 
     | 
    
         
            +
                                  property_name,
         
     | 
| 
       57 
58 
     | 
    
         
             
                                  ['patternProperties', value_property_pattern],
         
     | 
| 
       58 
     | 
    
         
            -
                                  [property_name],
         
     | 
| 
       59 
59 
     | 
    
         
             
                                )
         
     | 
| 
       60 
60 
     | 
    
         
             
                              end
         
     | 
| 
       61 
61 
     | 
    
         
             
                            rescue ::RegexpError
         
     | 
| 
         @@ -75,7 +75,7 @@ module JSI 
     | 
|
| 
       75 
75 
     | 
    
         
             
                    end
         
     | 
| 
       76 
76 
     | 
    
         
             
                  end
         
     | 
| 
       77 
77 
     | 
    
         | 
| 
       78 
     | 
    
         
            -
                  if  
     | 
| 
      
 78 
     | 
    
         
            +
                  if keyword?('additionalProperties')
         
     | 
| 
       79 
79 
     | 
    
         
             
                    value = schema_content['additionalProperties']
         
     | 
| 
       80 
80 
     | 
    
         
             
                    # The value of "additionalProperties" MUST be a valid JSON Schema.
         
     | 
| 
       81 
81 
     | 
    
         
             
                    if result_builder.instance.respond_to?(:to_hash)
         
     | 
| 
         @@ -83,11 +83,11 @@ module JSI 
     | 
|
| 
       83 
83 
     | 
    
         
             
                      result_builder.instance.keys.each do |property_name|
         
     | 
| 
       84 
84 
     | 
    
         
             
                        if !evaluated_property_names.include?(property_name)
         
     | 
| 
       85 
85 
     | 
    
         
             
                          results[property_name] = result_builder.child_subschema_validate(
         
     | 
| 
      
 86 
     | 
    
         
            +
                            property_name,
         
     | 
| 
       86 
87 
     | 
    
         
             
                            ['additionalProperties'],
         
     | 
| 
       87 
     | 
    
         
            -
                            [property_name],
         
     | 
| 
       88 
88 
     | 
    
         
             
                          )
         
     | 
| 
       89 
89 
     | 
    
         
             
                        end
         
     | 
| 
       90 
     | 
    
         
            -
                      end 
     | 
| 
      
 90 
     | 
    
         
            +
                      end
         
     | 
| 
       91 
91 
     | 
    
         
             
                      result_builder.validate(
         
     | 
| 
       92 
92 
     | 
    
         
             
                        results.values.all?(&:valid?),
         
     | 
| 
       93 
93 
     | 
    
         
             
                        'instance object additional properties are not all valid against `additionalProperties` schema value',
         
     | 
| 
         @@ -4,7 +4,7 @@ module JSI 
     | 
|
| 
       4 
4 
     | 
    
         
             
              module Schema::Validation::PropertyNames
         
     | 
| 
       5 
5 
     | 
    
         
             
                # @private
         
     | 
| 
       6 
6 
     | 
    
         
             
                def internal_validate_propertyNames(result_builder)
         
     | 
| 
       7 
     | 
    
         
            -
                  if  
     | 
| 
      
 7 
     | 
    
         
            +
                  if keyword?('propertyNames')
         
     | 
| 
       8 
8 
     | 
    
         
             
                    # The value of "propertyNames" MUST be a valid JSON Schema.
         
     | 
| 
       9 
9 
     | 
    
         
             
                    #
         
     | 
| 
       10 
10 
     | 
    
         
             
                    # If the instance is an object, this keyword validates if every property name in the instance
         
     | 
| 
         @@ -6,11 +6,11 @@ module JSI 
     | 
|
| 
       6 
6 
     | 
    
         
             
                # @param throw_result [Boolean] if a $ref is present, whether to throw the result being built after
         
     | 
| 
       7 
7 
     | 
    
         
             
                #   validating the $ref, bypassing subsequent keyword validation
         
     | 
| 
       8 
8 
     | 
    
         
             
                def internal_validate_ref(result_builder, throw_result: false)
         
     | 
| 
       9 
     | 
    
         
            -
                  if  
     | 
| 
      
 9 
     | 
    
         
            +
                  if keyword?('$ref')
         
     | 
| 
       10 
10 
     | 
    
         
             
                    value = schema_content['$ref']
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                    if value.respond_to?(:to_str)
         
     | 
| 
       13 
     | 
    
         
            -
                      schema_ref =  
     | 
| 
      
 13 
     | 
    
         
            +
                      schema_ref = self.schema_ref('$ref')
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                      if result_builder.visited_refs.include?(schema_ref)
         
     | 
| 
       16 
16 
     | 
    
         
             
                        result_builder.schema_error('self-referential schema structure', '$ref')
         
     | 
| 
         @@ -4,7 +4,7 @@ module JSI 
     | 
|
| 
       4 
4 
     | 
    
         
             
              module Schema::Validation::Required
         
     | 
| 
       5 
5 
     | 
    
         
             
                # @private
         
     | 
| 
       6 
6 
     | 
    
         
             
                def internal_validate_required(result_builder)
         
     | 
| 
       7 
     | 
    
         
            -
                  if  
     | 
| 
      
 7 
     | 
    
         
            +
                  if keyword?('required')
         
     | 
| 
       8 
8 
     | 
    
         
             
                    value = schema_content['required']
         
     | 
| 
       9 
9 
     | 
    
         
             
                    # The value of this keyword MUST be an array. Elements of this array, if any, MUST be strings, and MUST be unique.
         
     | 
| 
       10 
10 
     | 
    
         
             
                    if value.respond_to?(:to_ary)
         
     | 
| 
         @@ -4,7 +4,7 @@ module JSI 
     | 
|
| 
       4 
4 
     | 
    
         
             
              module Schema::Validation::AllOf
         
     | 
| 
       5 
5 
     | 
    
         
             
                # @private
         
     | 
| 
       6 
6 
     | 
    
         
             
                def internal_validate_allOf(result_builder)
         
     | 
| 
       7 
     | 
    
         
            -
                  if  
     | 
| 
      
 7 
     | 
    
         
            +
                  if keyword?('allOf')
         
     | 
| 
       8 
8 
     | 
    
         
             
                    value = schema_content['allOf']
         
     | 
| 
       9 
9 
     | 
    
         
             
                    # This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.
         
     | 
| 
       10 
10 
     | 
    
         
             
                    if value.respond_to?(:to_ary)
         
     | 
| 
         @@ -29,7 +29,7 @@ module JSI 
     | 
|
| 
       29 
29 
     | 
    
         
             
              module Schema::Validation::AnyOf
         
     | 
| 
       30 
30 
     | 
    
         
             
                # @private
         
     | 
| 
       31 
31 
     | 
    
         
             
                def internal_validate_anyOf(result_builder)
         
     | 
| 
       32 
     | 
    
         
            -
                  if  
     | 
| 
      
 32 
     | 
    
         
            +
                  if keyword?('anyOf')
         
     | 
| 
       33 
33 
     | 
    
         
             
                    value = schema_content['anyOf']
         
     | 
| 
       34 
34 
     | 
    
         
             
                    # This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.
         
     | 
| 
       35 
35 
     | 
    
         
             
                    if value.respond_to?(:to_ary)
         
     | 
| 
         @@ -56,7 +56,7 @@ module JSI 
     | 
|
| 
       56 
56 
     | 
    
         
             
              module Schema::Validation::OneOf
         
     | 
| 
       57 
57 
     | 
    
         
             
                # @private
         
     | 
| 
       58 
58 
     | 
    
         
             
                def internal_validate_oneOf(result_builder)
         
     | 
| 
       59 
     | 
    
         
            -
                  if  
     | 
| 
      
 59 
     | 
    
         
            +
                  if keyword?('oneOf')
         
     | 
| 
       60 
60 
     | 
    
         
             
                    value = schema_content['oneOf']
         
     | 
| 
       61 
61 
     | 
    
         
             
                    # This keyword's value MUST be a non-empty array. Each item of the array MUST be a valid JSON Schema.
         
     | 
| 
       62 
62 
     | 
    
         
             
                    if value.respond_to?(:to_ary)
         
     | 
| 
         @@ -4,7 +4,7 @@ module JSI 
     | 
|
| 
       4 
4 
     | 
    
         
             
              module Schema::Validation::StringLength
         
     | 
| 
       5 
5 
     | 
    
         
             
                # @private
         
     | 
| 
       6 
6 
     | 
    
         
             
                def internal_validate_maxLength(result_builder)
         
     | 
| 
       7 
     | 
    
         
            -
                  if  
     | 
| 
      
 7 
     | 
    
         
            +
                  if keyword?('maxLength')
         
     | 
| 
       8 
8 
     | 
    
         
             
                    value = schema_content['maxLength']
         
     | 
| 
       9 
9 
     | 
    
         
             
                    # The value of this keyword MUST be a non-negative integer.
         
     | 
| 
       10 
10 
     | 
    
         
             
                    if internal_integer?(value) && value >= 0
         
     | 
| 
         @@ -25,7 +25,7 @@ module JSI 
     | 
|
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                # @private
         
     | 
| 
       27 
27 
     | 
    
         
             
                def internal_validate_minLength(result_builder)
         
     | 
| 
       28 
     | 
    
         
            -
                  if  
     | 
| 
      
 28 
     | 
    
         
            +
                  if keyword?('minLength')
         
     | 
| 
       29 
29 
     | 
    
         
             
                    value = schema_content['minLength']
         
     | 
| 
       30 
30 
     | 
    
         
             
                    # The value of this keyword MUST be a non-negative integer.
         
     | 
| 
       31 
31 
     | 
    
         
             
                    if internal_integer?(value) && value >= 0
         
     | 
| 
         @@ -4,7 +4,7 @@ module JSI 
     | 
|
| 
       4 
4 
     | 
    
         
             
              module Schema::Validation::Type
         
     | 
| 
       5 
5 
     | 
    
         
             
                # @private
         
     | 
| 
       6 
6 
     | 
    
         
             
                def internal_validate_type(result_builder)
         
     | 
| 
       7 
     | 
    
         
            -
                  if  
     | 
| 
      
 7 
     | 
    
         
            +
                  if keyword?('type')
         
     | 
| 
       8 
8 
     | 
    
         
             
                    value = schema_content['type']
         
     | 
| 
       9 
9 
     | 
    
         
             
                    instance = result_builder.instance
         
     | 
| 
       10 
10 
     | 
    
         
             
                    # The value of this keyword MUST be either a string or an array. If it is an array, elements of
         
     | 
| 
         @@ -2,8 +2,6 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module JSI
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Schema::Validation
         
     | 
| 
       5 
     | 
    
         
            -
                autoload :Core, 'jsi/schema/validation/core'
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
5 
     | 
    
         
             
                autoload :Draft04, 'jsi/schema/validation/draft04'
         
     | 
| 
       8 
6 
     | 
    
         
             
                autoload :Draft06, 'jsi/schema/validation/draft06'
         
     | 
| 
       9 
7 
     | 
    
         
             
                autoload :Draft07, 'jsi/schema/validation/draft07'
         
     | 
| 
         @@ -15,7 +13,6 @@ module JSI 
     | 
|
| 
       15 
13 
     | 
    
         
             
                autoload :AllOf, 'jsi/schema/validation/someof'
         
     | 
| 
       16 
14 
     | 
    
         
             
                autoload :AnyOf, 'jsi/schema/validation/someof'
         
     | 
| 
       17 
15 
     | 
    
         
             
                autoload :OneOf, 'jsi/schema/validation/someof'
         
     | 
| 
       18 
     | 
    
         
            -
                autoload :Not,  'jsi/schema/validation/not'
         
     | 
| 
       19 
16 
     | 
    
         
             
                autoload :IfThenElse, 'jsi/schema/validation/ifthenelse'
         
     | 
| 
       20 
17 
     | 
    
         | 
| 
       21 
18 
     | 
    
         
             
                # child subschema application
         
     | 
| 
         @@ -30,6 +27,7 @@ module JSI 
     | 
|
| 
       30 
27 
     | 
    
         
             
                autoload :Type, 'jsi/schema/validation/type'
         
     | 
| 
       31 
28 
     | 
    
         
             
                autoload :Enum, 'jsi/schema/validation/enum'
         
     | 
| 
       32 
29 
     | 
    
         
             
                autoload :Const, 'jsi/schema/validation/const'
         
     | 
| 
      
 30 
     | 
    
         
            +
                autoload :Not,  'jsi/schema/validation/not'
         
     | 
| 
       33 
31 
     | 
    
         | 
| 
       34 
32 
     | 
    
         
             
                # object validation
         
     | 
| 
       35 
33 
     | 
    
         
             
                autoload :Required,    'jsi/schema/validation/required'
         
     |