From 2e8d994844f9a6a6888666b27b53ee5053fbcd68 Mon Sep 17 00:00:00 2001 From: Owen Roth Date: Wed, 24 Aug 2022 10:05:18 -0500 Subject: [PATCH 1/7] added new error handling to date and datetime --- lib/decanter/exceptions.rb | 1 + lib/decanter/parser/date_parser.rb | 4 ++++ lib/decanter/parser/datetime_parser.rb | 4 ++++ spec/decanter/parser/date_parser_spec.rb | 2 +- spec/decanter/parser/datetime_parser_spec.rb | 2 +- 5 files changed, 11 insertions(+), 2 deletions(-) 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 4b8ac74..5659a4a 100644 --- a/lib/decanter/parser/date_parser.rb +++ b/lib/decanter/parser/date_parser.rb @@ -8,7 +8,11 @@ class DateParser < ValueParser raise Decanter::ParseError.new 'Expects a single value' if val.is_a? Array next if (val.nil? || val === '') parse_format = options.fetch(:parse_format, '%m/%d/%Y') + begin ::Date.strptime(val, parse_format) + rescue ArgumentError + raise Decanter::ValueFormatError.new 'invalid Date value for format' + end end end end diff --git a/lib/decanter/parser/datetime_parser.rb b/lib/decanter/parser/datetime_parser.rb index 68fafda..312e4ac 100644 --- a/lib/decanter/parser/datetime_parser.rb +++ b/lib/decanter/parser/datetime_parser.rb @@ -8,7 +8,11 @@ class DateTimeParser < ValueParser raise Decanter::ParseError.new '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') + begin ::DateTime.strptime(val, parse_format) + rescue ArgumentError + raise Decanter::ValueFormatError.new 'invalid DateTime value for format' + end end end end diff --git a/spec/decanter/parser/date_parser_spec.rb b/spec/decanter/parser/date_parser_spec.rb index 1b8e4cc..bbf34e3 100644 --- a/spec/decanter/parser/date_parser_spec.rb +++ b/spec/decanter/parser/date_parser_spec.rb @@ -16,7 +16,7 @@ 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 diff --git a/spec/decanter/parser/datetime_parser_spec.rb b/spec/decanter/parser/datetime_parser_spec.rb index 087004f..dc2bd5e 100644 --- a/spec/decanter/parser/datetime_parser_spec.rb +++ b/spec/decanter/parser/datetime_parser_spec.rb @@ -16,7 +16,7 @@ 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 From 82e49c55224ee2a0b096956dffa561be20664764 Mon Sep 17 00:00:00 2001 From: Owen Roth Date: Wed, 24 Aug 2022 11:16:42 -0500 Subject: [PATCH 2/7] added more tests --- spec/decanter/parser/date_parser_spec.rb | 7 +++++++ spec/decanter/parser/datetime_parser_spec.rb | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/spec/decanter/parser/date_parser_spec.rb b/spec/decanter/parser/date_parser_spec.rb index bbf34e3..03af6b7 100644 --- a/spec/decanter/parser/date_parser_spec.rb +++ b/spec/decanter/parser/date_parser_spec.rb @@ -20,6 +20,13 @@ 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 + context 'with a date' do it 'returns the date' do expect(parser.parse(name, Date.new(1990,2,21))).to match({name => Date.new(1990,2,21)}) diff --git a/spec/decanter/parser/datetime_parser_spec.rb b/spec/decanter/parser/datetime_parser_spec.rb index dc2bd5e..4680ba4 100644 --- a/spec/decanter/parser/datetime_parser_spec.rb +++ b/spec/decanter/parser/datetime_parser_spec.rb @@ -20,6 +20,13 @@ 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 + context 'with a datetime' do it 'returns the datetime' do expect(parser.parse(name, DateTime.new(1990,2,21))).to match({name => DateTime.new(1990,2,21)}) From 8e36442e71f6d8048c9da029c2053caf8c576bab Mon Sep 17 00:00:00 2001 From: Owen Roth Date: Wed, 24 Aug 2022 11:26:10 -0500 Subject: [PATCH 3/7] raise based on message --- lib/decanter/parser/date_parser.rb | 4 ++-- lib/decanter/parser/datetime_parser.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/decanter/parser/date_parser.rb b/lib/decanter/parser/date_parser.rb index 5659a4a..a35394f 100644 --- a/lib/decanter/parser/date_parser.rb +++ b/lib/decanter/parser/date_parser.rb @@ -10,8 +10,8 @@ class DateParser < ValueParser parse_format = options.fetch(:parse_format, '%m/%d/%Y') begin ::Date.strptime(val, parse_format) - rescue ArgumentError - raise Decanter::ValueFormatError.new 'invalid Date value for format' + rescue ArgumentError => e + raise Decanter::ValueFormatError.new 'invalid Date value for format' if e.message == "invalid date" end end end diff --git a/lib/decanter/parser/datetime_parser.rb b/lib/decanter/parser/datetime_parser.rb index 312e4ac..c9aabfe 100644 --- a/lib/decanter/parser/datetime_parser.rb +++ b/lib/decanter/parser/datetime_parser.rb @@ -10,8 +10,8 @@ class DateTimeParser < ValueParser parse_format = options.fetch(:parse_format, '%m/%d/%Y %I:%M:%S %p') begin ::DateTime.strptime(val, parse_format) - rescue ArgumentError - raise Decanter::ValueFormatError.new 'invalid DateTime value for format' + rescue ArgumentError => e + raise Decanter::ValueFormatError.new 'invalid DateTime value for format' if e.message == "invalid date" end end end From f4cd0549f8d721a85ddde0ae7cf071e5061ae60e Mon Sep 17 00:00:00 2001 From: Owen Roth Date: Tue, 13 Dec 2022 18:26:48 -0600 Subject: [PATCH 4/7] refactor rescue to still raise an argument error even though it is not an 'invalid date --- lib/decanter/parser/date_parser.rb | 13 +++++++------ lib/decanter/parser/datetime_parser.rb | 12 +++++++----- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/decanter/parser/date_parser.rb b/lib/decanter/parser/date_parser.rb index a35394f..a751a1f 100644 --- a/lib/decanter/parser/date_parser.rb +++ b/lib/decanter/parser/date_parser.rb @@ -1,20 +1,21 @@ module Decanter module Parser class DateParser < ValueParser - allow Date parser do |val, options| - raise Decanter::ParseError.new 'Expects a single value' if val.is_a? Array - 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') begin - ::Date.strptime(val, parse_format) + ::Date.strptime(val, parse_format) rescue ArgumentError => e - raise Decanter::ValueFormatError.new 'invalid Date value for format' if e.message == "invalid date" + raise Decanter::ValueFormatError, 'invalid Date value for format' if e.message == 'invalid date' + + raise ArgumentError, e.message end end end end end - diff --git a/lib/decanter/parser/datetime_parser.rb b/lib/decanter/parser/datetime_parser.rb index c9aabfe..1183a5b 100644 --- a/lib/decanter/parser/datetime_parser.rb +++ b/lib/decanter/parser/datetime_parser.rb @@ -1,17 +1,19 @@ module Decanter module Parser class DateTimeParser < ValueParser - allow DateTime parser do |val, options| - raise Decanter::ParseError.new 'Expects a single value' if val.is_a? Array - 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') begin - ::DateTime.strptime(val, parse_format) + ::DateTime.strptime(val, parse_format) rescue ArgumentError => e - raise Decanter::ValueFormatError.new 'invalid DateTime value for format' if e.message == "invalid date" + raise Decanter::ValueFormatError, 'invalid DateTime value for format' if e.message == 'invalid date' + + raise ArgumentError, e.message end end end From b5333ea652bd76e4c06bf77ec30bf710002ea8d6 Mon Sep 17 00:00:00 2001 From: Owen Roth Date: Tue, 13 Dec 2022 18:48:05 -0600 Subject: [PATCH 5/7] bump minor version --- Gemfile.lock | 2 +- lib/decanter/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0e65cf7..74b5f2d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - decanter (4.0.0) + decanter (4.1.0) actionpack (>= 4.2.10) activesupport rails-html-sanitizer (>= 1.0.4) diff --git a/lib/decanter/version.rb b/lib/decanter/version.rb index d29c91e..41bd3a3 100644 --- a/lib/decanter/version.rb +++ b/lib/decanter/version.rb @@ -1,3 +1,3 @@ module Decanter - VERSION = '4.0.0'.freeze + VERSION = '4.1.0'.freeze end From 7e69ed1001eb32a91bc946faa29eddcd56511da6 Mon Sep 17 00:00:00 2001 From: Owen Roth <69156111+oroth8@users.noreply.github.com> Date: Mon, 7 Apr 2025 11:38:07 -0500 Subject: [PATCH 6/7] rescue Date::Error instead and make sure errors are not swallowed --- lib/decanter/parser/date_parser.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/decanter/parser/date_parser.rb b/lib/decanter/parser/date_parser.rb index 9c4fba1..1c0d8bc 100644 --- a/lib/decanter/parser/date_parser.rb +++ b/lib/decanter/parser/date_parser.rb @@ -9,10 +9,12 @@ class DateParser < ValueParser parse_format = options.fetch(:parse_format, '%m/%d/%Y') begin ::Date.strptime(val, parse_format) - rescue ArgumentError => e - raise Decanter::ValueFormatError, 'invalid Date value for format' if e.message == 'invalid date' - - raise ArgumentError, e.message + 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 From 99304cc4b8c7773479fd48b171e9ab5db8830fcb Mon Sep 17 00:00:00 2001 From: Owen Roth <69156111+oroth8@users.noreply.github.com> Date: Mon, 7 Apr 2025 11:39:52 -0500 Subject: [PATCH 7/7] bump version to 5.1.0 --- Gemfile.lock | 2 +- lib/decanter/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/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