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)