From 4cc20ae62079df85cba800c1ac6424d6610d3adf Mon Sep 17 00:00:00 2001 From: Adam Meehan Date: Sat, 5 Sep 2009 19:47:49 +1000 Subject: [PATCH] fixed some bad rescue behaviour in parse method --- lib/validates_timeliness/parser.rb | 31 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/validates_timeliness/parser.rb b/lib/validates_timeliness/parser.rb index 7b7845c..39a1b83 100644 --- a/lib/validates_timeliness/parser.rb +++ b/lib/validates_timeliness/parser.rb @@ -7,28 +7,29 @@ module ValidatesTimeliness return nil if raw_value.blank? return raw_value if raw_value.acts_like?(:time) || raw_value.is_a?(Date) - options.reverse_merge!(:strict => true) - - time_array = ValidatesTimeliness::Formats.parse(raw_value, type, options) - raise if time_array.nil? + time_array = ValidatesTimeliness::Formats.parse(raw_value, type, options.reverse_merge(:strict => true)) + return nil if time_array.nil? - # Rails dummy time date part is defined as 2000-01-01 - time_array[0..2] = 2000, 1, 1 if type == :time - - # Date.new enforces days per month, unlike Time - date = Date.new(*time_array[0..2]) unless type == :time + if type == :time + # Rails dummy time date part is defined as 2000-01-01 + time_array[0..2] = 2000, 1, 1 + else + # Enforce date part validity which Time class does not + return nil unless Date.valid_civil?(*time_array[0..2]) + end - return date if type == :date - - make_time(time_array[0..7]) - rescue - nil + if type == :date + Date.new(*time_array[0..2]) + else + make_time(time_array[0..7]) + end end def make_time(time_array) if Time.respond_to?(:zone) && ValidatesTimeliness.use_time_zones Time.zone.local(*time_array) else + # Older AR way of handling times with datetime fallback begin time_zone = ValidatesTimeliness.default_timezone Time.send(time_zone, *time_array) @@ -38,6 +39,8 @@ module ValidatesTimeliness DateTime.civil(*(time_array << zone_offset)) end end + rescue ArgumentError + nil end end