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/parser/array_parser.rb b/lib/decanter/parser/array_parser.rb index e52848d..4753d57 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 @@ -10,7 +10,7 @@ class ArrayParser < ValueParser # 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/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/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/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/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 == '') 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..4ac5cea 100644 --- a/lib/decanter/parser/value_parser.rb +++ b/lib/decanter/parser/value_parser.rb @@ -3,8 +3,16 @@ module Decanter module Parser class ValueParser < Base + def self._parse(name, value, options={}) - { name => @parser.call(value, options) } + self.validate_singularity(value) + 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 end end 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