File: boolean.rb

package info (click to toggle)
ruby-necromancer 0.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 308 kB
  • sloc: ruby: 1,578; sh: 4; makefile: 4
file content (90 lines) | stat: -rw-r--r-- 2,522 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# frozen_string_literal: true

require_relative "../converter"
require_relative "../null_converter"

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
      #   converter.call("True") # => true
      #
      #   other values converted to true are:
      #     1, t, T, TRUE,  true,  True,  y, Y, YES, yes, Yes, on, ON
      #
      # @example
      #   converter.call("False") # => false
      #
      #  other values coerced to false are:
      #    0, f, F, FALSE, false, False, n, N, NO,  no,  No, off, OFF
      #
      # @api public
      def call(value, strict: config.strict)
        case value.to_s
        when TRUE_MATCHER then true
        when FALSE_MATCHER then false
        else strict ? raise_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, strict: config.strict)
        !value.zero?
      rescue StandardError
        strict ? raise_conversion_type(value) : value
      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, strict: config.strict)
        if %w[TrueClass FalseClass].include?(value.class.name)
          value ? 1 : 0
        else
          strict ? raise_conversion_type(value) : value
        end
      end
    end

    def self.load(conversions)
      [
        StringToBooleanConverter.new(:string, :boolean),
        IntegerToBooleanConverter.new(:integer, :boolean),
        BooleanToIntegerConverter.new(:boolean, :integer),
        NullConverter.new(:boolean, :boolean)
      ].each do |converter|
        conversions.register converter
      end
    end
  end # BooleanConverters
end # Necromancer