From acb696c75e33cfe45b58572fa737cde84171ff0b Mon Sep 17 00:00:00 2001 From: Nikki Date: Fri, 1 Dec 2023 13:21:18 -0500 Subject: [PATCH 1/8] move singularity check to ValueParser class --- lib/decanter/parser/boolean_parser.rb | 1 - lib/decanter/parser/date_parser.rb | 1 - lib/decanter/parser/datetime_parser.rb | 1 - lib/decanter/parser/float_parser.rb | 1 - lib/decanter/parser/integer_parser.rb | 1 - lib/decanter/parser/phone_parser.rb | 1 - lib/decanter/parser/string_parser.rb | 1 - lib/decanter/parser/value_parser.rb | 5 +++++ 8 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/decanter/parser/boolean_parser.rb b/lib/decanter/parser/boolean_parser.rb index 5ac6ca4..ff666e4 100644 --- a/lib/decanter/parser/boolean_parser.rb +++ b/lib/decanter/parser/boolean_parser.rb @@ -5,7 +5,6 @@ class BooleanParser < ValueParser allow TrueClass, FalseClass parser do |val, options| - raise Decanter::ParseError.new 'Expects a single value' if val.is_a? Array next if (val.nil? || val === '') [1, '1'].include?(val) || !!/^true$/i.match?(val.to_s) end diff --git a/lib/decanter/parser/date_parser.rb b/lib/decanter/parser/date_parser.rb index 4b8ac74..8af7f08 100644 --- a/lib/decanter/parser/date_parser.rb +++ b/lib/decanter/parser/date_parser.rb @@ -5,7 +5,6 @@ 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 === '') parse_format = options.fetch(:parse_format, '%m/%d/%Y') ::Date.strptime(val, parse_format) diff --git a/lib/decanter/parser/datetime_parser.rb b/lib/decanter/parser/datetime_parser.rb index 68fafda..08dbb99 100644 --- a/lib/decanter/parser/datetime_parser.rb +++ b/lib/decanter/parser/datetime_parser.rb @@ -5,7 +5,6 @@ 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 === '') parse_format = options.fetch(:parse_format, '%m/%d/%Y %I:%M:%S %p') ::DateTime.strptime(val, parse_format) diff --git a/lib/decanter/parser/float_parser.rb b/lib/decanter/parser/float_parser.rb index ef0cd33..37af36f 100644 --- a/lib/decanter/parser/float_parser.rb +++ b/lib/decanter/parser/float_parser.rb @@ -6,7 +6,6 @@ class FloatParser < ValueParser allow Float, Integer parser do |val, options| - raise Decanter::ParseError.new 'Expects a single value' if val.is_a? Array next if (val.nil? || val === '') val.scan(REGEX).join.try(:to_f) end diff --git a/lib/decanter/parser/integer_parser.rb b/lib/decanter/parser/integer_parser.rb index 39587c9..6069980 100644 --- a/lib/decanter/parser/integer_parser.rb +++ b/lib/decanter/parser/integer_parser.rb @@ -6,7 +6,6 @@ class IntegerParser < ValueParser allow Integer parser do |val, options| - raise Decanter::ParseError.new 'Expects a single value' if val.is_a? Array next if (val.nil? || val === '') val.is_a?(Float) ? val.to_i : diff --git a/lib/decanter/parser/phone_parser.rb b/lib/decanter/parser/phone_parser.rb index 229ac67..1d4064a 100644 --- a/lib/decanter/parser/phone_parser.rb +++ b/lib/decanter/parser/phone_parser.rb @@ -6,7 +6,6 @@ class PhoneParser < ValueParser allow Integer parser do |val, options| - raise Decanter::ParseError.new 'Expects a single value' if val.is_a? Array next if (val.nil? || val === '') val.scan(REGEX).join.to_s end diff --git a/lib/decanter/parser/string_parser.rb b/lib/decanter/parser/string_parser.rb index c3c8745..457be7c 100644 --- a/lib/decanter/parser/string_parser.rb +++ b/lib/decanter/parser/string_parser.rb @@ -2,7 +2,6 @@ module Decanter module Parser class StringParser < ValueParser parser do |val, options| - raise Decanter::ParseError.new 'Expects a single value' if val.is_a? Array next if (val.nil? || val === '') next val if val.is_a? String val.to_s diff --git a/lib/decanter/parser/value_parser.rb b/lib/decanter/parser/value_parser.rb index 2f2fe71..9b5a5a7 100644 --- a/lib/decanter/parser/value_parser.rb +++ b/lib/decanter/parser/value_parser.rb @@ -4,8 +4,13 @@ module Decanter module Parser class ValueParser < Base def self._parse(name, value, options={}) + self.validate_singularity(value) { name => @parser.call(value, options) } end + + def self.validate_singularity(value) + raise Decanter::ParseError.new 'Expects a single value' if value.is_a? Array + end end end end From b974b9ca26b96f4f81c1f21e2cefd8096d597dfa Mon Sep 17 00:00:00 2001 From: Nikki Date: Fri, 1 Dec 2023 13:33:21 -0500 Subject: [PATCH 2/8] move singularity check to valueparser and have arrayparser inherit from base --- lib/decanter/parser/array_parser.rb | 2 +- lib/decanter/parser/core.rb | 4 ++++ lib/decanter/parser/value_parser.rb | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/decanter/parser/array_parser.rb b/lib/decanter/parser/array_parser.rb index e52848d..8978395 100644 --- a/lib/decanter/parser/array_parser.rb +++ b/lib/decanter/parser/array_parser.rb @@ -1,6 +1,6 @@ module Decanter module Parser - class ArrayParser < ValueParser + class ArrayParser < Base DUMMY_VALUE_KEY = '_'.freeze diff --git a/lib/decanter/parser/core.rb b/lib/decanter/parser/core.rb index 8254c67..f185ee8 100644 --- a/lib/decanter/parser/core.rb +++ b/lib/decanter/parser/core.rb @@ -8,6 +8,10 @@ def self.included(base) module ClassMethods + def _parse(name, value, options={}) + { name => @parser.call(value, options) } + end + # Check if allowed, parse if not def parse(name, value, options={}) if allowed?(value) diff --git a/lib/decanter/parser/value_parser.rb b/lib/decanter/parser/value_parser.rb index 9b5a5a7..53cbfb9 100644 --- a/lib/decanter/parser/value_parser.rb +++ b/lib/decanter/parser/value_parser.rb @@ -3,9 +3,10 @@ module Decanter module Parser class ValueParser < Base + def self._parse(name, value, options={}) self.validate_singularity(value) - { name => @parser.call(value, options) } + super(name, value, options) end def self.validate_singularity(value) From 9c59b11fe993b11addc9ff9f7f62ccd0a33fb98b Mon Sep 17 00:00:00 2001 From: Nikki Date: Fri, 1 Dec 2023 13:48:58 -0500 Subject: [PATCH 3/8] in spec, do not require PassParser to be a subclass of ValueParser --- lib/decanter/parser/array_parser.rb | 2 +- lib/decanter/parser/pass_parser.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/decanter/parser/array_parser.rb b/lib/decanter/parser/array_parser.rb index 8978395..9767613 100644 --- a/lib/decanter/parser/array_parser.rb +++ b/lib/decanter/parser/array_parser.rb @@ -10,7 +10,7 @@ class ArrayParser < Base # Fetch parser classes for provided keys parse_each = options.fetch(:parse_each, :pass) item_parsers = Parser.parsers_for(Array.wrap(parse_each)) - unless item_parsers.all? { |parser| parser <= ValueParser } + unless item_parsers.all? { |parser| parser <= ValueParser || parser <= PassParser} raise Decanter::ParseError.new 'parser(s) for array items must subclass ValueParser' end # Compose supplied parsers diff --git a/lib/decanter/parser/pass_parser.rb b/lib/decanter/parser/pass_parser.rb index 4a36ecf..0cfeea7 100644 --- a/lib/decanter/parser/pass_parser.rb +++ b/lib/decanter/parser/pass_parser.rb @@ -1,6 +1,6 @@ module Decanter module Parser - class PassParser < ValueParser + class PassParser < Base parser do |val, options| next if (val.nil? || val == '') From 086d452ad607a8e5061a21e4e40dc21e80b7ead4 Mon Sep 17 00:00:00 2001 From: Nikki Date: Fri, 1 Dec 2023 13:51:39 -0500 Subject: [PATCH 4/8] update version --- lib/decanter/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/decanter/version.rb b/lib/decanter/version.rb index 764056d..5ffaffd 100644 --- a/lib/decanter/version.rb +++ b/lib/decanter/version.rb @@ -1,3 +1,3 @@ module Decanter - VERSION = '4.0.2'.freeze + VERSION = '4.0.3'.freeze end From 2a9f417671732e1655820ba9297bf857a79fa10d Mon Sep 17 00:00:00 2001 From: Nikki Date: Fri, 1 Dec 2023 14:06:25 -0500 Subject: [PATCH 5/8] formatting --- lib/decanter/parser/array_parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/decanter/parser/array_parser.rb b/lib/decanter/parser/array_parser.rb index 9767613..4753d57 100644 --- a/lib/decanter/parser/array_parser.rb +++ b/lib/decanter/parser/array_parser.rb @@ -10,7 +10,7 @@ class ArrayParser < Base # Fetch parser classes for provided keys parse_each = options.fetch(:parse_each, :pass) item_parsers = Parser.parsers_for(Array.wrap(parse_each)) - unless item_parsers.all? { |parser| parser <= ValueParser || parser <= PassParser} + unless item_parsers.all? { |parser| parser <= ValueParser || parser <= PassParser } raise Decanter::ParseError.new 'parser(s) for array items must subclass ValueParser' end # Compose supplied parsers From 1fbf56808a38a6bffb8529414d20f9ca6b3bb557 Mon Sep 17 00:00:00 2001 From: Nikki Date: Fri, 1 Dec 2023 14:09:12 -0500 Subject: [PATCH 6/8] bundle --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8b117b6..ac41a73 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - decanter (4.0.2) + decanter (4.0.3) actionpack (>= 4.2.10) activesupport rails-html-sanitizer (>= 1.0.4) From 096e2810ee0973650a476c2a4f7c5873cdd6ccfe Mon Sep 17 00:00:00 2001 From: Nikki Date: Thu, 11 Jan 2024 15:22:16 -0700 Subject: [PATCH 7/8] re-bundle as 4.0.5 --- Gemfile.lock | 2 +- lib/decanter/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 301191c..d95e869 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - decanter (4.0.4) + decanter (4.0.5) actionpack (>= 4.2.10) activesupport rails-html-sanitizer (>= 1.0.4) diff --git a/lib/decanter/version.rb b/lib/decanter/version.rb index 09aa6a1..ede1e76 100644 --- a/lib/decanter/version.rb +++ b/lib/decanter/version.rb @@ -1,3 +1,3 @@ module Decanter - VERSION = '4.0.4'.freeze + VERSION = '4.0.5'.freeze end From d8f7f0ed718354aea812c040ad1cbab47d43b674 Mon Sep 17 00:00:00 2001 From: Nikki Date: Thu, 11 Jan 2024 15:26:33 -0700 Subject: [PATCH 8/8] make validate_singularity a private method --- lib/decanter/parser/value_parser.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/decanter/parser/value_parser.rb b/lib/decanter/parser/value_parser.rb index 53cbfb9..4ac5cea 100644 --- a/lib/decanter/parser/value_parser.rb +++ b/lib/decanter/parser/value_parser.rb @@ -9,6 +9,8 @@ def self._parse(name, value, options={}) super(name, value, options) end + private + def self.validate_singularity(value) raise Decanter::ParseError.new 'Expects a single value' if value.is_a? Array end