Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Stopped parsing dates using regular expressions, and instead used Ruby's
Browse files Browse the repository at this point in the history
own iso8601 parsing method

The initial reason for this was that date-time should allow 'YYYY-MM-DD'
according to iso8601. Ruby allows this but schema-form did not.
iainbeeston committed Sep 5, 2014
1 parent 67a3e83 commit 73f44b3
Showing 5 changed files with 32 additions and 54 deletions.
44 changes: 10 additions & 34 deletions lib/json-schema/attributes/format.rb
Original file line number Diff line number Diff line change
@@ -9,25 +9,10 @@ def self.validate(current_schema, data, fragments, processor, validator, options
# Timestamp in restricted ISO-8601 YYYY-MM-DDThh:mm:ssZ with optional decimal fraction of the second
when 'date-time'
if data.is_a?(String)
error_message = "The property '#{build_fragment(fragments)}' must be a date/time in the ISO-8601 format of YYYY-MM-DDThh:mm:ssZ or YYYY-MM-DDThh:mm:ss.ssZ"
r = Regexp.new('^\d\d\d\d-\d\d-\d\dT(\d\d):(\d\d):(\d\d)([\.,]\d+)?(Z|[+-](\d\d)(:?\d\d)?)?$')
if (m = r.match(data))
parts = data.split("T")
begin
Date.parse(parts[0])
rescue Exception
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
return
end
begin
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[1].to_i > 23
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[2].to_i > 59
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[3].to_i > 59
rescue Exception
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
return
end
else
error_message = "The property '#{build_fragment(fragments)}' must be a date/time in the ISO-8601 format of YYYY-MM-DDThh:mm:ssZ or YYYY-MM-DD"
begin
DateTime.iso8601(data)
rescue ArgumentError
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
return
end
@@ -36,15 +21,9 @@ def self.validate(current_schema, data, fragments, processor, validator, options
when 'date'
if data.is_a?(String)
error_message = "The property '#{build_fragment(fragments)}' must be a date in the format of YYYY-MM-DD"
r = Regexp.new('^\d\d\d\d-\d\d-\d\d$')
if (m = r.match(data))
begin
Date.parse(data)
rescue Exception
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
return
end
else
begin
Date.iso8601(data)
rescue ArgumentError
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
return
end
@@ -54,12 +33,9 @@ def self.validate(current_schema, data, fragments, processor, validator, options
when 'time'
if data.is_a?(String)
error_message = "The property '#{build_fragment(fragments)}' must be a time in the format of hh:mm:ss"
r = Regexp.new('^(\d\d):(\d\d):(\d\d)$')
if (m = r.match(data))
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[1].to_i > 23
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[2].to_i > 59
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors]) and return if m[3].to_i > 59
else
begin
Time.iso8601("#{Date.today.iso8601}T#{data}")
rescue ArgumentError
validation_error(processor, error_message, fragments, current_schema, self, options[:record_errors])
return
end
10 changes: 5 additions & 5 deletions test/test_jsonschema_draft1.rb
Original file line number Diff line number Diff line change
@@ -626,11 +626,11 @@ def test_format_time
data = {"a" => "12:00"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "12:00:60"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
assert(JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "12:60:00"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "24:00:00"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
assert(JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "0:00:00"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "-12:00:00"}
@@ -673,13 +673,13 @@ def test_format_datetime
data = {"a" => "2010-13-01T12:00:00Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "2010-01-01T24:00:00Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
assert(JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "2010-01-01T12:60:00Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "2010-01-01T12:00:60Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
assert(JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "2010-01-01T12:00:00z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
assert(JSON::Validator.validate(schema,data,:version => :draft1))
data = {"a" => "2010-01-0112:00:00Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft1))
end
10 changes: 5 additions & 5 deletions test/test_jsonschema_draft2.rb
Original file line number Diff line number Diff line change
@@ -698,11 +698,11 @@ def test_format_time
data = {"a" => "12:00"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "12:00:60"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
assert(JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "12:60:00"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "24:00:00"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
assert(JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "0:00:00"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "-12:00:00"}
@@ -745,13 +745,13 @@ def test_format_datetime
data = {"a" => "2010-13-01T12:00:00Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "2010-01-01T24:00:00Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
assert(JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "2010-01-01T12:60:00Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "2010-01-01T12:00:60Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
assert(JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "2010-01-01T12:00:00z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
assert(JSON::Validator.validate(schema,data,:version => :draft2))
data = {"a" => "2010-01-0112:00:00Z"}
assert(!JSON::Validator.validate(schema,data,:version => :draft2))
end
10 changes: 5 additions & 5 deletions test/test_jsonschema_draft3.rb
Original file line number Diff line number Diff line change
@@ -978,11 +978,11 @@ def test_format_time
data = {"a" => "12:00"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "12:00:60"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "12:60:00"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "24:00:00"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "0:00:00"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "-12:00:00"}
@@ -1031,13 +1031,13 @@ def test_format_datetime
data = {"a" => "2010-13-01T12:00:00Z"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-01T24:00:00Z"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-01T12:60:00Z"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-01T12:00:60Z"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-01T12:00:00z"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-0112:00:00Z"}
assert(!JSON::Validator.validate(schema,data))

12 changes: 7 additions & 5 deletions test/test_jsonschema_draft4.rb
Original file line number Diff line number Diff line change
@@ -940,11 +940,11 @@ def test_format_time
data = {"a" => "12:00"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "12:00:60"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "12:60:00"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "24:00:00"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "0:00:00"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "-12:00:00"}
@@ -997,15 +997,17 @@ def test_format_datetime
data = {"a" => "2010-13-01T12:00:00Z"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-01T24:00:00Z"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-01T12:60:00Z"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-01T12:00:60Z"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-01T12:00:00z"}
assert(!JSON::Validator.validate(schema,data))
assert(JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-0112:00:00Z"}
assert(!JSON::Validator.validate(schema,data))
data = {"a" => "2010-01-01"}
assert(JSON::Validator.validate(schema,data))
end

def test_format_uri

0 comments on commit 73f44b3

Please sign in to comment.