json_schema 0.3.1 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4699ec08cb42382077750ca85baa91aa4f60732e
4
- data.tar.gz: 8574657b774444006927dc7df56fdae92f13b2f9
3
+ metadata.gz: 1fd4983a9632b29cb79ed96ceba036d590e74719
4
+ data.tar.gz: 5a819846b5ef11f8be6a5e5e330be6e0de2bc5d9
5
5
  SHA512:
6
- metadata.gz: 6754b7820652d126bf225614bf740ad017a31b3ecf73f62262df3f1763eb8186bda0c5273bf0941dc82887d695fac47d3bc332a130103c4b9c2e94af918c35d5
7
- data.tar.gz: e36ea2ce6d723b7f244e4a18565ce3b5159203ea4ecb0ba2e24d6bdbc0ff04953cf7130e25345a455527fcccb213a04f0b69a9d7d976a453f8d94f2152e45c49
6
+ metadata.gz: f61c5a056f07c791252e663b82973468b11b72a6dc9b7e2998c236c0bf3babe49865e8c4a081c29d9a6e79082c12c3c4e62dda67ebed2c4c5c494a95e31b2361
7
+ data.tar.gz: 742206a63613cc097969f0a3ef429c7c3d5cdc22305e0115e8bb9ff1d90062a5ba605474361184eea2edf058bdb1ae65997cda3a5425b42781bafaca9fd14558
@@ -4,6 +4,7 @@ module JsonSchema
4
4
  class Parser
5
5
  ALLOWED_TYPES = %w{any array boolean integer number null object string}
6
6
  BOOLEAN = [FalseClass, TrueClass]
7
+ FORMATS = %w{date date-time email hostname ipv4 ipv6 regex uri uuid}
7
8
  FRIENDLY_TYPES = {
8
9
  Array => "array",
9
10
  FalseClass => "boolean",
@@ -287,6 +288,7 @@ module JsonSchema
287
288
  schema.min_length = validate_type(schema, [Integer], "minLength")
288
289
  schema.pattern = validate_type(schema, [String], "pattern")
289
290
  schema.pattern = Regexp.new(schema.pattern) if schema.pattern
291
+ validate_format(schema, schema.format) if schema.format
290
292
 
291
293
  # hyperschema
292
294
  schema.links = validate_type(schema, [Array], "links")
@@ -331,5 +333,12 @@ module JsonSchema
331
333
  value
332
334
  end
333
335
  end
336
+
337
+ def validate_format(schema, format)
338
+ return if FORMATS.include?(format)
339
+
340
+ message = %{#{format.inspect} is not a valid format, must be one of #{FORMATS.join(', ')}.}
341
+ @errors << SchemaError.new(schema, message, :unknown_format)
342
+ end
334
343
  end
335
344
  end
@@ -177,6 +177,8 @@ module JsonSchema
177
177
  def validate_format(schema, data, errors, path)
178
178
  return true unless schema.format
179
179
  valid = case schema.format
180
+ when "date"
181
+ data =~ DATE_PATTERN
180
182
  when "date-time"
181
183
  data =~ DATE_TIME_PATTERN
182
184
  when "email"
@@ -510,6 +512,8 @@ module JsonSchema
510
512
 
511
513
  HOSTNAME_PATTERN = /^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?$/
512
514
 
515
+ DATE_PATTERN = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/
516
+
513
517
  DATE_TIME_PATTERN = /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-2][0-9]:[0-5][0-9]:[0-5][0-9](\.[0-9]+)?(Z|[\-+][0-9]{2}:[0-5][0-9])$/
514
518
 
515
519
  # from: http://stackoverflow.com/a/17871737
@@ -257,6 +257,15 @@ describe JsonSchema::Parser do
257
257
  assert_includes error_types, :unknown_type
258
258
  end
259
259
 
260
+ it "errors on unknown formats" do
261
+ schema_sample["format"] = "obscure-thing"
262
+ refute parse
263
+ assert_includes error_messages, '"obscure-thing" is not a valid format, ' \
264
+ 'must be one of date, date-time, email, ' \
265
+ 'hostname, ipv4, ipv6, regex, uri, uuid.'
266
+ assert_includes error_types, :unknown_format
267
+ end
268
+
260
269
  def error_messages
261
270
  @parser.errors.map { |e| e.message }
262
271
  end
@@ -506,6 +506,22 @@ describe JsonSchema::Validator do
506
506
  assert_includes error_types, :not_failed
507
507
  end
508
508
 
509
+ it "validates date format successfully" do
510
+ pointer("#/definitions/app/definitions/owner").merge!(
511
+ "format" => "date"
512
+ )
513
+ data_sample["owner"] = "2014-05-13"
514
+ assert validate
515
+ end
516
+
517
+ it "validates date format unsuccessfully" do
518
+ pointer("#/definitions/app/definitions/owner").merge!(
519
+ "format" => "date"
520
+ )
521
+ data_sample["owner"] = "13/05/2014"
522
+ refute validate
523
+ end
524
+
509
525
  it "validates date-time format successfully" do
510
526
  pointer("#/definitions/app/definitions/owner").merge!(
511
527
  "format" => "date-time"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-04 00:00:00.000000000 Z
11
+ date: 2014-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest