diff --git a/Gemfile.lock b/Gemfile.lock index b9f6b37..28775bf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - decanter (5.0.0) + decanter (5.1.0) actionpack (>= 7.1.3.2) activesupport rails (>= 7.1.3.2) diff --git a/lib/decanter/exceptions.rb b/lib/decanter/exceptions.rb index 1729381..441ae84 100644 --- a/lib/decanter/exceptions.rb +++ b/lib/decanter/exceptions.rb @@ -3,4 +3,5 @@ class Error < StandardError; end class UnhandledKeysError < Error; end class MissingRequiredInputValue < Error; end class ParseError < Error; end + class ValueFormatError < Error; end end diff --git a/lib/decanter/parser/date_parser.rb b/lib/decanter/parser/date_parser.rb index 8af7f08..1c0d8bc 100644 --- a/lib/decanter/parser/date_parser.rb +++ b/lib/decanter/parser/date_parser.rb @@ -1,15 +1,22 @@ module Decanter module Parser class DateParser < ValueParser - allow Date parser do |val, options| - next if (val.nil? || val === '') + raise Decanter::ParseError, 'Expects a single value' if val.is_a? Array + next if val.nil? || val === '' parse_format = options.fetch(:parse_format, '%m/%d/%Y') - ::Date.strptime(val, parse_format) + begin + ::Date.strptime(val, parse_format) + rescue Date::Error => e + if e.message == 'invalid date' + raise Decanter::ValueFormatError, 'invalid Date value for format' + else + raise Decanter::ValueFormatError, e.message + end + end end end end end - diff --git a/lib/decanter/parser/datetime_parser.rb b/lib/decanter/parser/datetime_parser.rb index 08dbb99..e2399c2 100644 --- a/lib/decanter/parser/datetime_parser.rb +++ b/lib/decanter/parser/datetime_parser.rb @@ -1,13 +1,19 @@ module Decanter module Parser class DateTimeParser < ValueParser - allow DateTime parser do |val, options| - next if (val.nil? || val === '') + raise Decanter::ParseError, 'Expects a single value' if val.is_a? Array + next if val.nil? || val === '' parse_format = options.fetch(:parse_format, '%m/%d/%Y %I:%M:%S %p') - ::DateTime.strptime(val, parse_format) + begin + ::DateTime.strptime(val, parse_format) + rescue ArgumentError => e + raise Decanter::ValueFormatError, 'invalid DateTime value for format' if e.message == 'invalid date' + + raise ArgumentError, e.message + end end end end diff --git a/lib/decanter/version.rb b/lib/decanter/version.rb index 7a560e6..e12ba21 100644 --- a/lib/decanter/version.rb +++ b/lib/decanter/version.rb @@ -1,3 +1,3 @@ module Decanter - VERSION = '5.0.0'.freeze + VERSION = '5.1.0'.freeze end diff --git a/spec/decanter/parser/date_parser_spec.rb b/spec/decanter/parser/date_parser_spec.rb index 1b8e4cc..03af6b7 100644 --- a/spec/decanter/parser/date_parser_spec.rb +++ b/spec/decanter/parser/date_parser_spec.rb @@ -16,7 +16,14 @@ context 'with an invalid date string' do it 'raises an Argument Error' do expect { parser.parse(name, '2-21-1990') } - .to raise_error(ArgumentError, 'invalid date') + .to raise_error(Decanter::ValueFormatError, 'invalid Date value for format') + end + end + + context 'with a invalid date string and custom format' do + it 'raises an Argument Error' do + expect { parser.parse(name, '2-21-1990', parse_format: '%d-%m-%Y') } + .to raise_error(Decanter::ValueFormatError, 'invalid Date value for format') end end diff --git a/spec/decanter/parser/datetime_parser_spec.rb b/spec/decanter/parser/datetime_parser_spec.rb index 087004f..4680ba4 100644 --- a/spec/decanter/parser/datetime_parser_spec.rb +++ b/spec/decanter/parser/datetime_parser_spec.rb @@ -16,7 +16,14 @@ context 'with an invalid date string' do it 'raises an Argument Error' do expect { parser.parse(name, '2-21-1990') } - .to raise_error(ArgumentError, 'invalid date') + .to raise_error(Decanter::ValueFormatError, 'invalid DateTime value for format') + end + end + + context 'with a invalid date string and custom format' do + it 'raises an Argument Error' do + expect { parser.parse(name, '2-21-1990', parse_format: '%d-%m-%Y') } + .to raise_error(Decanter::ValueFormatError, 'invalid DateTime value for format') end end