lib/necromancer/converters/boolean.rb in necromancer-0.1.0 vs lib/necromancer/converters/boolean.rb in necromancer-0.2.0
- old
+ new
@@ -1,12 +1,16 @@
# coding: utf-8
module Necromancer
+ # Container for Boolean converter classes
module BooleanConverters
+ TRUE_MATCHER = /^(yes|y|on|t(rue)?|1)$/i.freeze
+
+ FALSE_MATCHER = /^(no|n|off|f(alse)?|0)$/i.freeze
+
# An object that converts a String to a Boolean
class StringToBooleanConverter < Converter
-
# Convert value to boolean type including range of strings
#
# @param [Object] value
#
# @example
@@ -17,35 +21,61 @@
#
# @example
# converter.call("False") # => false
#
# other values coerced to false are:
- # 0, f, F, FALSE, false, False, n, N, NO, no, No, on, ON
+ # 0, f, F, FALSE, false, False, n, N, NO, no, No, off, OFF
#
# @api public
def call(value, options = {})
+ strict = options.fetch(:strict, false)
case value.to_s
- when /^(yes|y|on|t(rue)?|1)$/i
- return true
- when /^(no|n|off|f(alse)?|0)$/i
- return false
- else
- fail ArgumentError, "Expected boolean type, got #{value}"
+ when TRUE_MATCHER then true
+ when FALSE_MATCHER then false
+ else strict ? fail_conversion_type(value) : value
end
end
end
# An object that converts an Integer to a Boolean
class IntegerToBooleanConverter < Converter
+ # Convert integer to boolean
+ #
+ # @example
+ # converter.call(1) # => true
+ #
+ # @example
+ # converter.call(0) # => false
+ #
+ # @api public
def call(value, options = {})
- !value.zero?
+ strict = options.fetch(:strict, false)
+ begin
+ !value.zero?
+ rescue
+ strict ? fail_conversion_type(value) : value
+ end
end
end
# An object that converts a Boolean to an Integer
class BooleanToIntegerConverter < Converter
+ # Convert boolean to integer
+ #
+ # @example
+ # converter.call(true) # => 1
+ #
+ # @example
+ # converter.call(false) # => 0
+ #
+ # @api public
def call(value, options = {})
- value ? 1 : 0
+ strict = options.fetch(:strict, false)
+ if ['TrueClass', 'FalseClass'].include?(value.class.name)
+ value ? 1 : 0
+ else
+ strict ? fail_conversion_type(value) : value
+ end
end
end
def self.load(conversions)
conversions.register StringToBooleanConverter.new(:string, :boolean)