diff --git a/lib/json-schema/attributes/format.rb b/lib/json-schema/attributes/format.rb index f5013214..3f2379ff 100644 --- a/lib/json-schema/attributes/format.rb +++ b/lib/json-schema/attributes/format.rb @@ -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 diff --git a/test/test_jsonschema_draft1.rb b/test/test_jsonschema_draft1.rb index b59f3126..8a6318cc 100644 --- a/test/test_jsonschema_draft1.rb +++ b/test/test_jsonschema_draft1.rb @@ -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 diff --git a/test/test_jsonschema_draft2.rb b/test/test_jsonschema_draft2.rb index 17de81b1..34ad5da5 100644 --- a/test/test_jsonschema_draft2.rb +++ b/test/test_jsonschema_draft2.rb @@ -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 diff --git a/test/test_jsonschema_draft3.rb b/test/test_jsonschema_draft3.rb index e438ba59..f7b7ce30 100644 --- a/test/test_jsonschema_draft3.rb +++ b/test/test_jsonschema_draft3.rb @@ -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)) diff --git a/test/test_jsonschema_draft4.rb b/test/test_jsonschema_draft4.rb index 58e4f37e..4ef8a861 100644 --- a/test/test_jsonschema_draft4.rb +++ b/test/test_jsonschema_draft4.rb @@ -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