schemacop 3.0.0.rc1 → 3.0.0.rc2

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: 5caf1b6b11b5c690dc05694cab67e34fb6ecc326381f9d7b63b9c016b5249d9c
4
- data.tar.gz: 8b819ad6e32dd2329bd20c0869c216c677b766a5d7374a49f6a9c146d0e743d5
3
+ metadata.gz: 73279c1805de5438933af200c883a7f6a813878d583c92bf7e597580f392df95
4
+ data.tar.gz: 2ac5ce2925de12c5df8a4f82086d967c68d31cd9f8c598cff0da9231d221f5ff
5
5
  SHA512:
6
- metadata.gz: 5db8ca31cdf29cea9744529fec11af70dc1c534dc970639931e3a9c287f3005cc578e2d7e9b0525ceefdbcb17d5f01d46d42c0a5b5868b62cabafe2779464ccc
7
- data.tar.gz: a12d18800342da6d1d9fdc39bffbec18877872c0cffb62c9b4a41cbd8954b0915c68afeb0b9e03c7e3bdd21f5803fa57daa7deb9cfd49a14363b67586e4e2fc0
6
+ metadata.gz: c04434b491dac3c09018969b13293c029347011a58386234ea5dcca6b3aa7ed8ebe3f291b8d819869d79b3c8c80d5a998bbbca0a95d928988367e04efcad4ec2
7
+ data.tar.gz: 75564dd05800d295f3eb7ebb606f97ea67f2c19512a62193d49651cc77828836cfa95977465692ac85a5738a8407c7a2275a7cbe34db110c8400e70aa5057e95
@@ -10,6 +10,20 @@
10
10
  ### Changes
11
11
  -->
12
12
 
13
+ ## 3.0.0.r2
14
+
15
+ * Represent node names as strings internally
16
+
17
+ * Update documentation
18
+
19
+ ## 3.0.0.rc1
20
+
21
+ * Add support for ruby `3.0.0`
22
+
23
+ * Add `ruby-3.0.0` to travis testing
24
+
25
+ * Document all `v3` nodes
26
+
13
27
  ## 3.0.0.rc0
14
28
 
15
29
  * Add `Schemacop::Schema3`
@@ -1,15 +1,11 @@
1
1
  # Schemacop schema V3
2
2
 
3
- Please note that Schemacop v3 is still a work in progress, especially the documentation.
3
+ ## Table of Contents
4
4
 
5
- Use at your own discretion.
6
-
7
- # Table of Contents
8
- 1. [Introduction](#Introduction)
9
- 2. [Validation](#validation)
10
- 3. [Exceptions](#exceptions)
11
- 4. [Generic Keywords](#generic-keywords)
12
- 5. [Nodes](#nodes)
5
+ 1. [Validation](#validation)
6
+ 2. [Exceptions](#exceptions)
7
+ 3. [Generic Keywords](#generic-keywords)
8
+ 4. [Nodes](#nodes)
13
9
  1. [String](#string)
14
10
  2. [Integer](#integer)
15
11
  3. [Number](#number)
@@ -23,12 +19,8 @@ Use at your own discretion.
23
19
  11. [OneOf](#oneOf)
24
20
  12. [IsNot](#isNot)
25
21
  13. [Reference](#reference)
26
- 6. [Context](#context)
27
- 7. [External schemas](#external-schemas)
28
-
29
- ## Introduction
30
-
31
- TODO: Write short section about using schemacop V3
22
+ 5. [Context](#context)
23
+ 6. [External schemas](#external-schemas)
32
24
 
33
25
  ## Validation
34
26
 
@@ -74,19 +66,121 @@ schema.validate!('Foo') # => Schemacop::Exceptions::ValidationError: /:
74
66
 
75
67
  ## Exceptions
76
68
 
77
- TODO: Describe the exceptions raised by schemacop
69
+ Schemacop can raise the following exceptions:
78
70
 
79
- `Schemacop::Exceptions::ValidationError`
80
- `Schemacop::Exceptions::InvalidSchemaError`
71
+ * `Schemacop::Exceptions::ValidationError`: This exception is raised when the `validate!`
72
+ method is used, and the data that was passed in is invalid. The exception message contains
73
+ additional informations why the validation failed.
74
+
75
+ Example:
76
+
77
+ ```ruby
78
+ schema = Schemacop::Schema3.new :hash do
79
+ int! :foo
80
+ end
81
+
82
+ schema.validate!(foo: 'bar')
83
+ # => Schemacop::Exceptions::ValidationError: /foo: Invalid type, expected "integer".
84
+ ```
85
+
86
+ * `Schemacop::Exceptions::InvalidSchemaError`: This exception is raised when the schema
87
+ itself is not valid. The exception message contains additional informations why the
88
+ validation failed.
89
+
90
+ Example:
91
+
92
+ ```ruby
93
+ Schemacop::Schema3.new :hash do
94
+ int!
95
+ end
96
+
97
+ # => Schemacop::Exceptions::InvalidSchemaError: Child nodes must have a name.
98
+ ```
81
99
 
82
100
  ## Generic Keywords
83
101
 
84
- TODO: Complete this
102
+ The nodes in Schemacop v3 also support generic keywords, similar to JSON schema:
103
+
104
+ * `title`: Short string, should be self-explanatory
105
+ * `description`: Description of the schema
106
+ * `examples`: Here, you can provide examples which will be valid for the schema
107
+ * `enum`: Here, you may enumerate values which will be valid, if the provided
108
+ value is not in the array, the validation will fail
109
+ * `default`: You may provide a default value for items that will be set if the
110
+ value is not given
111
+
112
+
113
+ The three keywords `title`, `description` and `examples` aren't used for validation,
114
+ but can be used to document the schema. They will be included in the JSON output
115
+ when you use the `as_json` method:
116
+
117
+ ```ruby
118
+ schema = Schemacop::Schema3.new :hash do
119
+ str! :name, title: 'Name', description: 'Holds the name of the user', examples: ['Joe', 'Anna']
120
+ end
121
+
122
+ schema.as_json
123
+
124
+ # => {"properties"=>{"name"=>{"type"=>"string", "title"=>"Name", "examples"=>["Joe", "Anna"], "description"=>"Holds the name of the user"}}, "additionalProperties"=>false, "required"=>["name"], "type"=>"object"}
125
+ ```
126
+
127
+ The `enum` keyword can be used to only allow a subset of values:
128
+
129
+ ```ruby
130
+ schema = Schemacop::Schema3.new :string, enum: ['foo', 'bar']
131
+
132
+ schema.validate!('foo') # => "foo"
133
+ schema.validate!('bar') # => "bar"
134
+ schema.validate!('baz') # => Schemacop::Exceptions::ValidationError: /: Value not included in enum ["foo", "bar"].
135
+ ```
136
+
137
+ Please note, that you can also specify values in the enum that are not valid for
138
+ the schema. This means that the validation will still fail:
139
+
140
+ ```ruby
141
+ schema = Schemacop::Schema3.new :string, enum: ['foo', 'bar', 42]
142
+
143
+ schema.validate!('foo') # => "foo"
144
+ schema.validate!('bar') # => "bar"
145
+ schema.validate!(42) # => Schemacop::Exceptions::ValidationError: /: Invalid type, expected "string".
146
+ ```
147
+
148
+ The enum will also be provided in the json output:
149
+
150
+ ```ruby
151
+ schema = Schemacop::Schema3.new :string, enum: ['foo', 'bar']
152
+
153
+ schema.as_json
154
+ # => {"type"=>"string", "enum"=>["foo", "bar", 42]}
155
+ ```
156
+
157
+ And finally, the `default` keyword lets you set a default value to use when no
158
+ value is provided:
159
+
160
+ ```ruby
161
+ schema = Schemacop::Schema3.new :string, default: 'Schemacop'
162
+
163
+ schema.validate!('foo') # => "foo"
164
+ schema.validate!(nil) # => "Schemacop"
165
+ ```
166
+
167
+ The default value will also be provided in the json output:
85
168
 
86
- * enum
87
- * title
88
- * description
89
- * examples
169
+ ```ruby
170
+ schema = Schemacop::Schema3.new :string, default: 'Schemacop'
171
+
172
+ schema.as_json
173
+ # => {"type"=>"string", "default"=>"Schemacop"}
174
+ ```
175
+
176
+ Note that the default value you use is also validated against the schema:
177
+
178
+ ```ruby
179
+ schema = Schemacop::Schema3.new :string, default: 42
180
+
181
+ schema.validate!('foo') # => "foo"
182
+ schema.validate!(nil) # => Schemacop::Exceptions::ValidationError: /: Invalid type, expected "string".
183
+ ```
90
184
 
91
185
  ## Nodes
92
186
 
@@ -523,11 +617,61 @@ schema = Schemacop::Schema3.new :hash do
523
617
  end
524
618
 
525
619
  schema.validate!({}) # => Schemacop::Exceptions::ValidationError: /foo: Value must be given.
526
- schema.validate!({foo: 'str'}) # => {:foo=>"str"}
527
- schema.validate!({foo: 'str', bar: 42}) # => {:foo=>"str", :bar=>42}
620
+ schema.validate!({foo: 'str'}) # => {"foo"=>"str"}
621
+ schema.validate!({foo: 'str', bar: 42}) # => {"foo"=>"str", "bar"=>42}
528
622
  schema.validate!({bar: 42}) # => Schemacop::Exceptions::ValidationError: /foo: Value must be given.
529
623
  ```
530
624
 
625
+ The name of the properties may either be a string or a symbol, and you can pass
626
+ in the property either identified by a symbol or a string:
627
+
628
+ The following two schemas are equal:
629
+
630
+ ```ruby
631
+ schema = Schemacop::Schema3.new :hash do
632
+ int! :foo
633
+ end
634
+
635
+ schema.validate!(foo: 42) # => {"foo"=>42}
636
+ schema.validate!('foo' => 42) # => {"foo"=>42}
637
+
638
+ schema = Schemacop::Schema3.new :hash do
639
+ int! 'foo'
640
+ end
641
+
642
+ schema.validate!(foo: 42) # => {"foo"=>42}
643
+ schema.validate!('foo' => 42) # => {"foo"=>42}
644
+ ```
645
+
646
+ The result in both cases will be a
647
+ [HashWithIndifferentAccess](https://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html),
648
+ which means that you can access the data in the hash with the symbol as well
649
+ as the string representation:
650
+
651
+ ```ruby
652
+ schema = Schemacop::Schema3.new :hash do
653
+ int! :foo
654
+ end
655
+
656
+ result = schema.validate!(foo: 42)
657
+
658
+ result.class # => ActiveSupport::HashWithIndifferentAccess
659
+ result[:foo] # => 42
660
+ result['foo'] # 42
661
+ ```
662
+
663
+ Please note, that if you specify the value twice in the data you want to validate,
664
+ once with the key being a symbol and once being a string, Schemacop will raise an
665
+ error:
666
+
667
+ ```ruby
668
+ schema = Schemacop::Schema3.new :hash do
669
+ int! :foo
670
+ end
671
+
672
+ schema.validate!(foo: 42, 'foo' => 43) # => Schemacop::Exceptions::ValidationError: /: Has 1 ambiguous properties: [:foo].
673
+ ```
674
+
531
675
  ##### Pattern properties
532
676
 
533
677
  In addition to symbols, property keys can also be a regular expression. Here,
@@ -543,8 +687,8 @@ schema = Schemacop::Schema3.new :hash do
543
687
  end
544
688
 
545
689
  schema.validate!({}) # => {}
546
- schema.validate!({id_foo: 1}) # => {:id_foo=>1}
547
- schema.validate!({id_foo: 1, id_bar: 2}) # => {:id_foo=>1, :id_bar=>2}
690
+ schema.validate!({id_foo: 1}) # => {"id_foo"=>1}
691
+ schema.validate!({id_foo: 1, id_bar: 2}) # => {"id_foo"=>1, "id_bar"=>2}
548
692
  schema.validate!({foo: 3}) # => Schemacop::Exceptions::ValidationError: /: Obsolete property "foo".
549
693
  ```
550
694
 
@@ -562,7 +706,7 @@ enable all of them by enabling the option `additional_properties`:
562
706
  schema = Schemacop::Schema3.new :hash, additional_properties: true
563
707
 
564
708
  schema.validate!({}) # => {}
565
- schema.validate!({foo: :bar, baz: 42}) # => {:foo=>:bar, :baz=>42}
709
+ schema.validate!({foo: :bar, baz: 42}) # => {"foo"=>:bar, "baz"=>42}
566
710
  ```
567
711
 
568
712
  Using the DSL method `add` in the hash-node's body however, you can specify
@@ -578,8 +722,8 @@ Schemacop::Schema3.new :hash do
578
722
  add :string
579
723
  end
580
724
 
581
- schema.validate!({id: 1}) # => {:id=>1}
582
- schema.validate!({id: 1, foo: 'bar'}) # => {:foo=>"bar", :id=>1}
725
+ schema.validate!({id: 1}) # => {"id"=>1}
726
+ schema.validate!({id: 1, foo: 'bar'}) # => {"id"=>1, "foo"=>"bar"}
583
727
  schema.validate!({id: 1, foo: 42}) # => Schemacop::Exceptions::ValidationError: /foo: Invalid type, expected "string".
584
728
  ```
585
729
 
@@ -589,12 +733,12 @@ any additional property **keys** must adhere to:
589
733
  ```ruby
590
734
  # The following schema allows any number of properties, but all keys must
591
735
  # consist of downcase letters from a-z.
592
- schema = Schemacop::Schema3.new :hash, additional_properties: :true, property_names: '^[a-z]+$'
736
+ schema = Schemacop::Schema3.new :hash, additional_properties: true, property_names: '^[a-z]+$'
593
737
 
594
738
 
595
739
  schema.validate!({}) # => {}
596
- schema.validate!({foo: 123}) # => {:foo=>123}
597
- schema.validate!({Foo: 'bar'}) # => Schemacop::Exceptions::ValidationError: /: Property name :Foo does not match "^[a-z]+$".
740
+ schema.validate!({foo: 123}) # => {"foo"=>123}
741
+ schema.validate!({Foo: 'bar'}) # => Schemacop::Exceptions::ValidationError: /: Property name "Foo" does not match "^[a-z]+$".
598
742
 
599
743
  # The following schema allows any number of properties, but all keys must
600
744
  # consist of downcase letters from a-z AND the properties must be arrays.
@@ -603,7 +747,7 @@ schema = Schemacop::Schema3.new :hash, additional_properties: true, property_nam
603
747
  end
604
748
 
605
749
  schema.validate!({}) # => {}
606
- schema.validate!({foo: [1, 2, 3]}) # => {:foo=>[1, 2, 3]}
750
+ schema.validate!({foo: [1, 2, 3]}) # => {"foo"=>[1, 2, 3]}
607
751
  schema.validate!({foo: :bar}) # => Schemacop::Exceptions::ValidationError: /foo: Invalid type, expected "array".
608
752
  schema.validate!({Foo: :bar}) # => Schemacop::Exceptions::ValidationError: /: Property name :Foo does not match "^[a-z]+$". /Foo: Invalid type, expected "array".
609
753
  ```
@@ -627,7 +771,7 @@ schema = Schemacop::Schema3.new :hash do
627
771
  end
628
772
 
629
773
  schema.validate!({}) # => Schemacop::Exceptions::ValidationError: /name: Value must be given.
630
- schema.validate!({name: 'Joe Doe'}) # => {:name=>"Joe Doe"}
774
+ schema.validate!({name: 'Joe Doe'}) # => {"name"=>"Joe Doe"}
631
775
  schema.validate!({
632
776
  name: 'Joe Doe',
633
777
  billing_address: 'Street 42'
@@ -646,7 +790,7 @@ schema.validate!({
646
790
  phone_number: '000-000-00-00',
647
791
  credit_card: 'XXXX XXXX XXXX XXXX X'
648
792
  })
649
- # => {:name=>"Joe Doe", :credit_card=>"XXXX XXXX XXXX XXXX X", :billing_address=>"Street 42", :phone_number=>"000-000-00-00"}
793
+ # => {"name"=>"Joe Doe", "credit_card"=>"XXXX XXXX XXXX XXXX X", "billing_address"=>"Street 42", "phone_number"=>"000-000-00-00"}
650
794
  ```
651
795
 
652
796
  ### Object
@@ -654,7 +798,7 @@ schema.validate!({
654
798
  Type: `:object`\
655
799
  DSL: `obj`
656
800
 
657
- The object type represents a ruby `Object`. Please note that the `as_json? method
801
+ The object type represents a ruby `Object`. Please note that the `as_json` method
658
802
  on nodes of this type will just return `{}` (an empty JSON object), as there isn't
659
803
  a useful way to represent a ruby object without conflicting with the `Hash` type.
660
804
  If you want to represent an JSON object, you should use the `Hash` node.
@@ -884,7 +1028,7 @@ schema.validate!({
884
1028
  }
885
1029
  })
886
1030
 
887
- # => {:shipping_address=>{:street=>"Example Street 42", :zip_code=>"12345", :location=>"London", :country=>"United Kingdom"}, :billing_address=>{:street=>"Main St.", :zip_code=>"54321", :location=>"Washington DC", :country=>"USA"}}
1031
+ # => {"shipping_address"=>{"street"=>"Example Street 42", "zip_code"=>"12345", "location"=>"London", "country"=>"United Kingdom"}, "billing_address"=>{"street"=>"Main St.", "zip_code"=>"54321", "location"=>"Washington DC", "country"=>"USA"}}
888
1032
  ```
889
1033
 
890
1034
  Note that if you use the reference node with the long type name `reference`,
@@ -902,7 +1046,7 @@ schema = Schemacop::Schema3.new :array do
902
1046
  end
903
1047
 
904
1048
  schema.validate!([]) # => []
905
- schema.validate!([{first_name: 'Joe', last_name: 'Doe'}]) # => [{:first_name=>"Joe", :last_name=>"Doe"}]
1049
+ schema.validate!([{first_name: 'Joe', last_name: 'Doe'}]) # => [{"first_name"=>"Joe", "last_name"=>"Doe"}]
906
1050
  schema.validate!([id: 42, first_name: 'Joe']) # => Schemacop::Exceptions::ValidationError: /[0]/last_name: Value must be given. /[0]: Obsolete property "id".
907
1051
  ```
908
1052
 
@@ -940,7 +1084,7 @@ schema = Schemacop::Schema3.new :reference, path: :Person
940
1084
  # of the person.
941
1085
  Schemacop.with_context context do
942
1086
  schema.validate!({first_name: 'Joe', last_name: 'Doe', info: { born_at: '1980-01-01'} })
943
- # => {:first_name=>"Joe", :last_name=>"Doe", :info=>{:born_at=>Tue, 01 Jan 1980}}
1087
+ # => {"first_name"=>"Joe", "last_name"=>"Doe", "info"=>{"born_at"=>Tue, 01 Jan 1980}}
944
1088
  end
945
1089
 
946
1090
  # Now we might want another context, where the person is more anonymous, and as
@@ -961,7 +1105,7 @@ Schemacop.with_context other_context do
961
1105
  # /: Obsolete property "last_name".
962
1106
  # /: Obsolete property "info".
963
1107
 
964
- schema.validate!({nickname: 'J.'}) # => {:nickname=>"J."}
1108
+ schema.validate!({nickname: 'J.'}) # => {"nickname"=>"J."}
965
1109
  end
966
1110
  ```
967
1111
 
@@ -1032,13 +1176,13 @@ schema = Schemacop::Schema3.new :hash do
1032
1176
  end
1033
1177
 
1034
1178
  schema.validate!({usr: {first_name: 'Joe', last_name: 'Doe'}})
1035
- # => {:usr=>{:first_name=>"Joe", :last_name=>"Doe"}}
1179
+ # => {"usr"=>{"first_name"=>"Joe", "last_name"=>"Doe"}}
1036
1180
 
1037
1181
  schema.validate!({usr: {first_name: 'Joe', last_name: 'Doe', groups: []}})
1038
- # => {:usr=>{:first_name=>"Joe", :last_name=>"Doe", :groups=>[]}}
1182
+ # => {"usr"=>{"first_name"=>"Joe", "last_name"=>"Doe", "groups"=>[]}}
1039
1183
 
1040
1184
  schema.validate!({usr: {first_name: 'Joe', last_name: 'Doe', groups: [{name: 'foo'}, {name: 'bar'}]}})
1041
- # => {:usr=>{:first_name=>"Joe", :last_name=>"Doe", :groups=>[{:name=>"foo"}, {:name=>"bar"}]}}
1185
+ # => {"usr"=>{"first_name"=>"Joe", "last_name"=>"Doe", "groups"=>[{"name"=>"foo"}, {"name"=>"bar"}]}}
1042
1186
  ```
1043
1187
 
1044
1188
  ### Non-Rails applications
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.0.0.rc1
1
+ 3.0.0.rc2
@@ -172,10 +172,9 @@ module Schemacop
172
172
  list_item.present?
173
173
  end
174
174
 
175
- def item_for_data(data, force: true)
175
+ def item_for_data(data)
176
176
  item = children.find { |c| item_matches?(c, data) }
177
177
  return item if item
178
- return nil unless force
179
178
 
180
179
  fail "Could not find specification for item #{data.inspect}."
181
180
  end
@@ -91,14 +91,23 @@ module Schemacop
91
91
  super_data = super
92
92
  return if super_data.nil?
93
93
 
94
+ original_data_hash = super_data.dup
95
+ data_hash = super_data.with_indifferent_access
96
+
97
+ if original_data_hash.size != data_hash.size
98
+ ambiguous_properties = original_data_hash.keys - data_hash.keys
99
+
100
+ result.error "Has #{ambiguous_properties.size} ambiguous properties: #{ambiguous_properties}."
101
+ end
102
+
94
103
  # Validate min_properties #
95
- if options[:min_properties] && super_data.size < options[:min_properties]
96
- result.error "Has #{super_data.size} properties but needs at least #{options[:min_properties]}."
104
+ if options[:min_properties] && data_hash.size < options[:min_properties]
105
+ result.error "Has #{data_hash.size} properties but needs at least #{options[:min_properties]}."
97
106
  end
98
107
 
99
108
  # Validate max_properties #
100
- if options[:max_properties] && super_data.size > options[:max_properties]
101
- result.error "Has #{super_data.size} properties but needs at most #{options[:max_properties]}."
109
+ if options[:max_properties] && data_hash.size > options[:max_properties]
110
+ result.error "Has #{data_hash.size} properties but needs at most #{options[:max_properties]}."
102
111
  end
103
112
 
104
113
  # Validate specified properties #
@@ -106,13 +115,13 @@ module Schemacop
106
115
  result.in_path(node.name) do
107
116
  next if node.name.is_a?(Regexp)
108
117
 
109
- node._validate(super_data[node.name], result: result)
118
+ node._validate(data_hash[node.name], result: result)
110
119
  end
111
120
  end
112
121
 
113
122
  # Validate additional properties #
114
123
  specified_properties = @properties.keys.to_set
115
- additional_properties = super_data.reject { |k, _v| specified_properties.include?(k.to_s.to_sym) }
124
+ additional_properties = data_hash.reject { |k, _v| specified_properties.include?(k.to_s) }
116
125
 
117
126
  property_patterns = {}
118
127
 
@@ -149,7 +158,7 @@ module Schemacop
149
158
  # Validate dependencies #
150
159
  options[:dependencies]&.each do |source, targets|
151
160
  targets.each do |target|
152
- if super_data[source].present? && super_data[target].blank?
161
+ if data_hash[source].present? && data_hash[target].blank?
153
162
  result.error "Missing property #{target.to_s.inspect} because #{source.to_s.inspect} is given."
154
163
  end
155
164
  end
@@ -161,10 +170,19 @@ module Schemacop
161
170
  end
162
171
 
163
172
  def cast(data)
164
- result = {}
173
+ result = {}.with_indifferent_access
165
174
  data ||= default
166
175
  return nil if data.nil?
167
176
 
177
+ original_data_hash = data.dup
178
+ data_hash = data.with_indifferent_access
179
+
180
+ if original_data_hash.size != data_hash.size
181
+ ambiguous_properties = original_data_hash.keys - data_hash.keys
182
+
183
+ result.error "Has #{ambiguous_properties.size} ambiguous properties: #{ambiguous_properties}."
184
+ end
185
+
168
186
  property_patterns = {}
169
187
 
170
188
  @properties.each_value do |prop|
@@ -173,16 +191,16 @@ module Schemacop
173
191
  next
174
192
  end
175
193
 
176
- result[prop.name] = prop.cast(data[prop.name])
194
+ result[prop.name] = prop.cast(data_hash[prop.name])
177
195
 
178
- if result[prop.name].nil? && !data.include?(prop.name)
196
+ if result[prop.name].nil? && !data_hash.include?(prop.name)
179
197
  result.delete(prop.name)
180
198
  end
181
199
  end
182
200
 
183
201
  # Handle regex properties
184
202
  specified_properties = @properties.keys.to_set
185
- additional_properties = data.reject { |k, _v| specified_properties.include?(k.to_s.to_sym) }
203
+ additional_properties = data_hash.reject { |k, _v| specified_properties.include?(k.to_s.to_sym) }
186
204
 
187
205
  if additional_properties.any? && property_patterns.any?
188
206
  additional_properties.each do |name, additional_property|
@@ -194,10 +212,10 @@ module Schemacop
194
212
 
195
213
  # Handle additional properties
196
214
  if options[:additional_properties] == true
197
- result = data.merge(result)
215
+ result = data_hash.merge(result)
198
216
  elsif options[:additional_properties].is_a?(Node)
199
217
  specified_properties = @properties.keys.to_set
200
- additional_properties = data.reject { |k, _v| specified_properties.include?(k.to_s.to_sym) }
218
+ additional_properties = data_hash.reject { |k, _v| specified_properties.include?(k.to_s.to_sym) }
201
219
  if additional_properties.any?
202
220
  additional_properties_result = {}
203
221
  additional_properties.each do |key, value|
@@ -74,6 +74,7 @@ module Schemacop
74
74
 
75
75
  # Assign attributes #
76
76
  @name = options.delete(:name)
77
+ @name = @name.to_s unless @name.nil? || @name.is_a?(Regexp)
77
78
  @required = !!options.delete(:required)
78
79
  @default = options.delete(:default)
79
80
  @title = options.delete(:title)
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: schemacop 3.0.0.rc1 ruby lib
2
+ # stub: schemacop 3.0.0.rc2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "schemacop".freeze
6
- s.version = "3.0.0.rc1"
6
+ s.version = "3.0.0.rc2"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2021-01-22"
11
+ s.date = "2021-01-28"
12
12
  s.files = [".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, ".travis.yml".freeze, ".yardopts".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "README_V2.md".freeze, "README_V3.md".freeze, "RUBY_VERSION".freeze, "Rakefile".freeze, "VERSION".freeze, "lib/schemacop.rb".freeze, "lib/schemacop/base_schema.rb".freeze, "lib/schemacop/exceptions.rb".freeze, "lib/schemacop/railtie.rb".freeze, "lib/schemacop/schema.rb".freeze, "lib/schemacop/schema2.rb".freeze, "lib/schemacop/schema3.rb".freeze, "lib/schemacop/scoped_env.rb".freeze, "lib/schemacop/v2.rb".freeze, "lib/schemacop/v2/caster.rb".freeze, "lib/schemacop/v2/collector.rb".freeze, "lib/schemacop/v2/dupper.rb".freeze, "lib/schemacop/v2/field_node.rb".freeze, "lib/schemacop/v2/node.rb".freeze, "lib/schemacop/v2/node_resolver.rb".freeze, "lib/schemacop/v2/node_supporting_field.rb".freeze, "lib/schemacop/v2/node_supporting_type.rb".freeze, "lib/schemacop/v2/node_with_block.rb".freeze, "lib/schemacop/v2/root_node.rb".freeze, "lib/schemacop/v2/validator/array_validator.rb".freeze, "lib/schemacop/v2/validator/boolean_validator.rb".freeze, "lib/schemacop/v2/validator/float_validator.rb".freeze, "lib/schemacop/v2/validator/hash_validator.rb".freeze, "lib/schemacop/v2/validator/integer_validator.rb".freeze, "lib/schemacop/v2/validator/nil_validator.rb".freeze, "lib/schemacop/v2/validator/number_validator.rb".freeze, "lib/schemacop/v2/validator/object_validator.rb".freeze, "lib/schemacop/v2/validator/string_validator.rb".freeze, "lib/schemacop/v2/validator/symbol_validator.rb".freeze, "lib/schemacop/v3.rb".freeze, "lib/schemacop/v3/all_of_node.rb".freeze, "lib/schemacop/v3/any_of_node.rb".freeze, "lib/schemacop/v3/array_node.rb".freeze, "lib/schemacop/v3/boolean_node.rb".freeze, "lib/schemacop/v3/combination_node.rb".freeze, "lib/schemacop/v3/context.rb".freeze, "lib/schemacop/v3/dsl_scope.rb".freeze, "lib/schemacop/v3/global_context.rb".freeze, "lib/schemacop/v3/hash_node.rb".freeze, "lib/schemacop/v3/integer_node.rb".freeze, "lib/schemacop/v3/is_not_node.rb".freeze, "lib/schemacop/v3/node.rb".freeze, "lib/schemacop/v3/node_registry.rb".freeze, "lib/schemacop/v3/number_node.rb".freeze, "lib/schemacop/v3/numeric_node.rb".freeze, "lib/schemacop/v3/object_node.rb".freeze, "lib/schemacop/v3/one_of_node.rb".freeze, "lib/schemacop/v3/reference_node.rb".freeze, "lib/schemacop/v3/result.rb".freeze, "lib/schemacop/v3/string_node.rb".freeze, "lib/schemacop/v3/symbol_node.rb".freeze, "schemacop.gemspec".freeze, "test/lib/test_helper.rb".freeze, "test/schemas/nested/group.rb".freeze, "test/schemas/user.rb".freeze, "test/unit/schemacop/v2/casting_test.rb".freeze, "test/unit/schemacop/v2/collector_test.rb".freeze, "test/unit/schemacop/v2/custom_check_test.rb".freeze, "test/unit/schemacop/v2/custom_if_test.rb".freeze, "test/unit/schemacop/v2/defaults_test.rb".freeze, "test/unit/schemacop/v2/empty_test.rb".freeze, "test/unit/schemacop/v2/nil_dis_allow_test.rb".freeze, "test/unit/schemacop/v2/node_resolver_test.rb".freeze, "test/unit/schemacop/v2/short_forms_test.rb".freeze, "test/unit/schemacop/v2/types_test.rb".freeze, "test/unit/schemacop/v2/validator_array_test.rb".freeze, "test/unit/schemacop/v2/validator_boolean_test.rb".freeze, "test/unit/schemacop/v2/validator_float_test.rb".freeze, "test/unit/schemacop/v2/validator_hash_test.rb".freeze, "test/unit/schemacop/v2/validator_integer_test.rb".freeze, "test/unit/schemacop/v2/validator_nil_test.rb".freeze, "test/unit/schemacop/v2/validator_number_test.rb".freeze, "test/unit/schemacop/v2/validator_object_test.rb".freeze, "test/unit/schemacop/v2/validator_string_test.rb".freeze, "test/unit/schemacop/v2/validator_symbol_test.rb".freeze, "test/unit/schemacop/v3/all_of_node_test.rb".freeze, "test/unit/schemacop/v3/any_of_node_test.rb".freeze, "test/unit/schemacop/v3/array_node_test.rb".freeze, "test/unit/schemacop/v3/boolean_node_test.rb".freeze, "test/unit/schemacop/v3/global_context_test.rb".freeze, "test/unit/schemacop/v3/hash_node_test.rb".freeze, "test/unit/schemacop/v3/integer_node_test.rb".freeze, "test/unit/schemacop/v3/is_not_node_test.rb".freeze, "test/unit/schemacop/v3/node_test.rb".freeze, "test/unit/schemacop/v3/number_node_test.rb".freeze, "test/unit/schemacop/v3/object_node_test.rb".freeze, "test/unit/schemacop/v3/one_of_node_test.rb".freeze, "test/unit/schemacop/v3/reference_node_test.rb".freeze, "test/unit/schemacop/v3/string_node_test.rb".freeze, "test/unit/schemacop/v3/symbol_node_test.rb".freeze]
13
13
  s.homepage = "https://github.com/sitrox/schemacop".freeze
14
14
  s.licenses = ["MIT".freeze]
@@ -142,8 +142,7 @@ module Schemacop
142
142
 
143
143
  assert_cast(
144
144
  { foo: '42', bar: '2020-01-15' },
145
- foo: 42,
146
- bar: Date.new(2020, 1, 15)
145
+ { foo: 42, bar: Date.new(2020, 1, 15) }.with_indifferent_access
147
146
  )
148
147
  end
149
148
 
@@ -133,11 +133,11 @@ module Schemacop
133
133
 
134
134
  assert_cast(
135
135
  { created_at: '2020-01-01' },
136
- created_at: Date.new(2020, 1, 1)
136
+ { created_at: Date.new(2020, 1, 1) }.with_indifferent_access
137
137
  )
138
138
  assert_cast(
139
139
  { created_at: '2020-01-01T17:38:20' },
140
- created_at: DateTime.new(2020, 1, 1, 17, 38, 20)
140
+ { created_at: DateTime.new(2020, 1, 1, 17, 38, 20) }.with_indifferent_access
141
141
  )
142
142
  end
143
143
 
@@ -158,12 +158,12 @@ module Schemacop
158
158
 
159
159
  assert_cast(
160
160
  { foo: { bar: nil } },
161
- foo: { bar: nil }
161
+ { foo: { bar: nil } }.with_indifferent_access
162
162
  )
163
163
 
164
164
  assert_cast(
165
165
  { foo: { baz: nil } },
166
- foo: { baz: 'Baz' }
166
+ { foo: { baz: 'Baz' } }.with_indifferent_access
167
167
  )
168
168
 
169
169
  schema do
@@ -175,12 +175,12 @@ module Schemacop
175
175
 
176
176
  assert_cast(
177
177
  { foo: { bar: '1990-01-13' } },
178
- foo: { bar: Date.new(1990, 1, 13) }
178
+ { foo: { bar: Date.new(1990, 1, 13) } }.with_indifferent_access
179
179
  )
180
180
 
181
181
  assert_cast(
182
182
  { foo: { bar: '1990-01-13T10:00:00Z' } },
183
- foo: { bar: DateTime.new(1990, 1, 13, 10, 0, 0) }
183
+ { foo: { bar: DateTime.new(1990, 1, 13, 10, 0, 0) } }.with_indifferent_access
184
184
  )
185
185
  end
186
186
 
@@ -446,8 +446,8 @@ module Schemacop
446
446
  end
447
447
 
448
448
  assert_cast(['foo', 42], ['foo', 42])
449
- assert_cast(['foo', 42, { foo: '1990-01-01' }], ['foo', 42, { foo: Date.new(1990, 1, 1) }])
450
- assert_cast(['foo', 42, { foo: '1990-01-01', bar: :baz }], ['foo', 42, { foo: Date.new(1990, 1, 1), bar: :baz }])
449
+ assert_cast(['foo', 42, { foo: '1990-01-01' }], ['foo', 42, { foo: Date.new(1990, 1, 1) }.with_indifferent_access])
450
+ assert_cast(['foo', 42, { foo: '1990-01-01', bar: :baz }], ['foo', 42, { foo: Date.new(1990, 1, 1), bar: :baz }.with_indifferent_access])
451
451
  end
452
452
 
453
453
  def test_multiple_add_in_schema
@@ -537,7 +537,7 @@ module Schemacop
537
537
  additionalItems: false
538
538
  )
539
539
 
540
- assert_cast [{}], [{ name: 'John' }]
540
+ assert_cast [{}], [{ name: 'John' }.with_indifferent_access]
541
541
  end
542
542
 
543
543
  def test_enum_schema
@@ -800,6 +800,16 @@ module Schemacop
800
800
 
801
801
  assert_cast(%w[foo 1990-01-01], ['foo', Date.new(1990, 1, 1)])
802
802
  end
803
+
804
+ def test_contains_multiple_should_fail
805
+ assert_raises_with_message Exceptions::InvalidSchemaError, 'You can only use "cont" once.' do
806
+ schema :array do
807
+ list :string
808
+ cont :string
809
+ cont :integer
810
+ end
811
+ end
812
+ end
803
813
  end
804
814
  end
805
815
  end
@@ -54,6 +54,14 @@ module Schemacop
54
54
  type: :object,
55
55
  additionalProperties: { type: :string }
56
56
  )
57
+
58
+ assert_nothing_raised do
59
+ @schema.validate!({ foo: 'foo' })
60
+ end
61
+
62
+ assert_raises_with_message Exceptions::ValidationError, '/bar: Invalid type, expected "string".' do
63
+ @schema.validate!({ foo: 'foo', bar: :baz })
64
+ end
57
65
  end
58
66
 
59
67
  def test_property_names
@@ -72,8 +80,8 @@ module Schemacop
72
80
  propertyNames: '^[a-zA-Z0-9]+$'
73
81
  )
74
82
 
75
- assert_cast({ foo: 123 }, { foo: 123 })
76
- assert_cast({ Foo: 123 }, { Foo: 123 })
83
+ assert_cast({ foo: 123 }, { foo: 123 }.with_indifferent_access)
84
+ assert_cast({ Foo: 123 }, { Foo: 123 }.with_indifferent_access)
77
85
 
78
86
  # New schema
79
87
  schema :hash, additional_properties: true, property_names: '^[a-z]+$'
@@ -82,13 +90,13 @@ module Schemacop
82
90
  assert_validation(foo: :bar)
83
91
  assert_validation('foo' => 'bar')
84
92
  assert_validation(Foo: :bar) do
85
- error '/', 'Property name :Foo does not match "^[a-z]+$".'
93
+ error '/', 'Property name "Foo" does not match "^[a-z]+$".'
86
94
  end
87
95
  assert_validation('_foo39sjfdoi 345893(%' => 'bar', 'foo' => 'bar') do
88
96
  error '/', 'Property name "_foo39sjfdoi 345893(%" does not match "^[a-z]+$".'
89
97
  end
90
98
 
91
- assert_cast({ foo: 123 }, { foo: 123 })
99
+ assert_cast({ foo: 123 }, { foo: 123 }.with_indifferent_access)
92
100
  end
93
101
 
94
102
  def test_required
@@ -293,9 +301,9 @@ module Schemacop
293
301
  assert_validation({ id_foo: 1, id_bar: 2 })
294
302
  assert_validation({ id_foo: 1, id_bar: 2, value: 4 })
295
303
 
296
- assert_cast({ id_foo: 1 }, { id_foo: 1 })
297
- assert_cast({ id_foo: 1, id_bar: 2 }, { id_foo: 1, id_bar: 2 })
298
- assert_cast({ id_foo: 1, id_bar: 2, value: 4 }, { id_foo: 1, id_bar: 2, value: 4 })
304
+ assert_cast({ id_foo: 1 }, { id_foo: 1 }.with_indifferent_access)
305
+ assert_cast({ id_foo: 1, id_bar: 2 }, { id_foo: 1, id_bar: 2 }.with_indifferent_access)
306
+ assert_cast({ id_foo: 1, id_bar: 2, value: 4 }, { id_foo: 1, id_bar: 2, value: 4 }.with_indifferent_access)
299
307
  end
300
308
 
301
309
  def test_defaults
@@ -311,7 +319,9 @@ module Schemacop
311
319
  data = { last_name: 'Doeringer', active: 'true' }
312
320
  data_was = data.dup
313
321
 
314
- assert_equal({ first_name: 'John', last_name: 'Doeringer', active: true, address: { street: 'Example 42' } }, @schema.validate(data).data)
322
+ expected_data = { first_name: 'John', last_name: 'Doeringer', active: true, address: { street: 'Example 42' } }.with_indifferent_access
323
+
324
+ assert_equal(expected_data, @schema.validate(data).data)
315
325
  assert_equal data_was, data
316
326
 
317
327
  schema do
@@ -526,7 +536,7 @@ module Schemacop
526
536
 
527
537
  assert_validation(nil)
528
538
  assert_validation(foo: '1')
529
- assert_cast({ foo: '1' }, { foo: 1 })
539
+ assert_cast({ foo: '1' }, { foo: 1 }.with_indifferent_access)
530
540
 
531
541
  assert_validation(foo: '1', bar: '2') do
532
542
  error '/', 'Obsolete property "bar".'
@@ -552,11 +562,11 @@ module Schemacop
552
562
 
553
563
  assert_validation(nil)
554
564
  assert_validation(foo: '1')
555
- assert_cast({ foo: '1' }, { foo: 1 })
565
+ assert_cast({ foo: '1' }, { foo: 1 }.with_indifferent_access)
556
566
 
557
567
  assert_validation(foo: '1', bar: nil)
558
568
  assert_validation(foo: '1', bar: '2')
559
- assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: '2' })
569
+ assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: '2' }.with_indifferent_access)
560
570
 
561
571
  assert_json(
562
572
  type: 'object',
@@ -589,11 +599,11 @@ module Schemacop
589
599
 
590
600
  assert_validation(nil)
591
601
  assert_validation(foo: '1')
592
- assert_cast({ foo: '1' }, { foo: 1 })
602
+ assert_cast({ foo: '1' }, { foo: 1 }.with_indifferent_access)
593
603
 
594
604
  assert_validation(foo: '1', bar: nil)
595
605
  assert_validation(foo: '1', bar: '2')
596
- assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: '2' })
606
+ assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: '2' }.with_indifferent_access)
597
607
 
598
608
  assert_json(
599
609
  type: 'object',
@@ -616,11 +626,11 @@ module Schemacop
616
626
 
617
627
  assert_validation(nil)
618
628
  assert_validation(foo: '1')
619
- assert_cast({ foo: '1' }, { foo: 1 })
629
+ assert_cast({ foo: '1' }, { foo: 1 }.with_indifferent_access)
620
630
 
621
631
  assert_validation(foo: '1', bar: nil)
622
632
  assert_validation(foo: '1', bar: '2')
623
- assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: 2 })
633
+ assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: 2 }.with_indifferent_access)
624
634
  end
625
635
 
626
636
  def test_cast_with_additional_any_of
@@ -634,7 +644,7 @@ module Schemacop
634
644
 
635
645
  assert_validation(nil)
636
646
  assert_validation(foo: '1')
637
- assert_cast({ foo: '1' }, { foo: 1 })
647
+ assert_cast({ foo: '1' }, { foo: 1 }.with_indifferent_access)
638
648
 
639
649
  assert_validation(foo: '1', bar: nil)
640
650
  assert_validation(foo: '1', bar: '2')
@@ -643,7 +653,7 @@ module Schemacop
643
653
  error '/qux', 'Does not match any anyOf condition.'
644
654
  end
645
655
 
646
- assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: '2' })
656
+ assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: '2' }.with_indifferent_access)
647
657
 
648
658
  assert_json(
649
659
  type: 'object',
@@ -675,7 +685,7 @@ module Schemacop
675
685
 
676
686
  assert_validation(nil)
677
687
  assert_validation(foo: '1')
678
- assert_cast({ foo: '1' }, { foo: 1 })
688
+ assert_cast({ foo: '1' }, { foo: 1 }.with_indifferent_access)
679
689
 
680
690
  assert_validation(foo: '1', bar: nil)
681
691
  assert_validation(foo: '1', bar: '2')
@@ -684,8 +694,8 @@ module Schemacop
684
694
  error '/qux', 'Does not match any anyOf condition.'
685
695
  end
686
696
 
687
- assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: 2 })
688
- assert_cast({ foo: '1', bar: '2', qux: '2020-01-13', asd: 1 }, { foo: 1, bar: 2, qux: Date.new(2020, 1, 13), asd: 1 })
697
+ assert_cast({ foo: '1', bar: '2' }, { foo: 1, bar: 2 }.with_indifferent_access)
698
+ assert_cast({ foo: '1', bar: '2', qux: '2020-01-13', asd: 1 }, { foo: 1, bar: 2, qux: Date.new(2020, 1, 13), asd: 1 }.with_indifferent_access)
689
699
 
690
700
  assert_json(
691
701
  type: 'object',
@@ -821,6 +831,54 @@ module Schemacop
821
831
  end
822
832
  end
823
833
  end
834
+
835
+ def test_schema_with_string_keys
836
+ schema :hash do
837
+ int! 'foo'
838
+ end
839
+
840
+ assert_validation(nil)
841
+ assert_validation({ 'foo' => 42 })
842
+ assert_validation({ foo: 42 })
843
+
844
+ assert_cast({ 'foo' => 42 }, { 'foo' => 42 })
845
+ assert_cast({ foo: 42 }, { foo: 42 }.with_indifferent_access)
846
+
847
+ assert_validation({}) do
848
+ error '/foo', 'Value must be given.'
849
+ end
850
+
851
+ assert_validation({ :foo => 42, 'foo' => 43 }) do
852
+ error '/', 'Has 1 ambiguous properties: [:foo].'
853
+ end
854
+ end
855
+
856
+ def test_schema_with_string_keys_in_data
857
+ schema :hash do
858
+ int! :foo
859
+ end
860
+
861
+ assert_validation(nil)
862
+ assert_validation({ 'foo' => 42 })
863
+ assert_validation({ foo: 42 })
864
+
865
+ assert_cast({ 'foo' => 42 }, { 'foo' => 42 })
866
+ assert_cast({ foo: 42 }, { foo: 42 }.with_indifferent_access)
867
+
868
+ assert_validation({}) do
869
+ error '/foo', 'Value must be given.'
870
+ end
871
+
872
+ assert_validation({ :foo => 42, 'foo' => 43 }) do
873
+ error '/', 'Has 1 ambiguous properties: [:foo].'
874
+ end
875
+ end
876
+
877
+ # def test_invalid_key_names
878
+ # schema :hash do
879
+ # int!
880
+ # end
881
+ # end
824
882
  end
825
883
  end
826
884
  end
@@ -102,11 +102,11 @@ module Schemacop
102
102
 
103
103
  assert_cast(
104
104
  { created_at: '2020-01-01' },
105
- created_at: Date.new(2020, 1, 1)
105
+ { created_at: Date.new(2020, 1, 1) }.with_indifferent_access
106
106
  )
107
107
  assert_cast(
108
108
  { created_at: '2020-01-01T17:38:20' },
109
- created_at: DateTime.new(2020, 1, 1, 17, 38, 20)
109
+ { created_at: DateTime.new(2020, 1, 1, 17, 38, 20) }.with_indifferent_access
110
110
  )
111
111
  end
112
112
 
@@ -127,12 +127,12 @@ module Schemacop
127
127
 
128
128
  assert_cast(
129
129
  { foo: { bar: nil } },
130
- foo: { bar: nil }
130
+ { foo: { bar: nil } }.with_indifferent_access
131
131
  )
132
132
 
133
133
  assert_cast(
134
134
  { foo: { baz: nil } },
135
- foo: { baz: 'Baz' }
135
+ { foo: { baz: 'Baz' } }.with_indifferent_access
136
136
  )
137
137
 
138
138
  schema do
@@ -144,12 +144,12 @@ module Schemacop
144
144
 
145
145
  assert_cast(
146
146
  { foo: { bar: '1990-01-13' } },
147
- foo: { bar: Date.new(1990, 1, 13) }
147
+ { foo: { bar: Date.new(1990, 1, 13) } }.with_indifferent_access
148
148
  )
149
149
 
150
150
  assert_cast(
151
151
  { foo: { bar: '1990-01-13T10:00:00Z' } },
152
- foo: { bar: DateTime.new(1990, 1, 13, 10, 0, 0) }
152
+ { foo: { bar: DateTime.new(1990, 1, 13, 10, 0, 0) } }.with_indifferent_access
153
153
  )
154
154
  end
155
155
 
@@ -333,7 +333,7 @@ module Schemacop
333
333
  ref? :person, :Person, default: {}
334
334
  end
335
335
 
336
- assert_cast({}, person: { foo: 'bar' })
336
+ assert_cast({}, { person: { foo: 'bar' } }.with_indifferent_access)
337
337
  end
338
338
 
339
339
  def test_casting
@@ -344,7 +344,7 @@ module Schemacop
344
344
  ref? :person, :Person, default: {}
345
345
  end
346
346
 
347
- assert_cast({ person: { born_at: '1990-01-13' } }, person: { born_at: Date.new(1990, 1, 13) })
347
+ assert_cast({ person: { born_at: '1990-01-13' } }, { person: { born_at: Date.new(1990, 1, 13) } }.with_indifferent_access)
348
348
  end
349
349
  end
350
350
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schemacop
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.rc1
4
+ version: 3.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-22 00:00:00.000000000 Z
11
+ date: 2021-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport