Class: Foobara::Enumerated::Values

Inherits:
Object
  • Object
show all
Defined in:
foobara-0.0.110/projects/enumerated/src/values.rb

Defined Under Namespace

Classes: BadNameType, BadValueType

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Values

Returns a new instance of Values.



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 67

def initialize(*args)
  if args.empty?
    # :nocov:
    raise ArgumentError, "Expected Module, Hash, or Array"
  # :nocov:
  elsif args.size > 1
    initialize(args)
  else
    symbol_map = args.first

    case symbol_map
    when ::Hash
      Values.validate_symbol_map_types(symbol_map)

      @symbol_map = Values.normalize_symbol_map(symbol_map)
    when ::Module
      initialize(Values.module_to_symbol_map(symbol_map))
    when ::Array
      initialize(symbol_map.to_h { |name| [name, name] })
    else
      # :nocov:
      raise ArgumentError, "Expected Module, Hash, or Array"
      # :nocov:
    end
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name) ⇒ Object



106
107
108
109
110
111
112
113
114
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 106

def method_missing(name)
  unless respond_to_missing?(name)
    # :nocov:
    super
    # :nocov:
  end

  @symbol_map[name]
end

Class Method Details

.module_to_symbol_map(constants_module) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 26

def module_to_symbol_map(constants_module)
  symbol_map = {}

  constants_module.constants.each do |constant_name|
    constant_value = constants_module.const_get(constant_name)

    symbol_map[constant_name] = constant_value
  end

  symbol_map
end

.normalize_symbol_map(symbol_map) ⇒ Object



56
57
58
59
60
61
62
63
64
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 56

def normalize_symbol_map(symbol_map)
  normalized = {}

  symbol_map.each_pair do |name, value|
    normalized[Util.constantify(name).gsub(/[:\/]/, "_").to_sym] = value&.to_sym
  end

  normalized.freeze
end

.normalize_value(value) ⇒ Object



16
17
18
19
20
21
22
23
24
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 16

def normalize_value(value)
  unless Values.valid_value_type?(value)
    # :nocov:
    raise BadValueType, "Expected nil, String, or Symbol, but got #{value} which is a #{value.class}"
    # :nocov:
  end

  value&.to_sym
end

.valid_name_type?(value) ⇒ Boolean

Returns:

  • (Boolean)


12
13
14
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 12

def valid_name_type?(value)
  value.is_a?(String) || value.is_a?(Symbol)
end

.valid_value_type?(value) ⇒ Boolean

Returns:

  • (Boolean)


8
9
10
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 8

def valid_value_type?(value)
  value.is_a?(String) || value.is_a?(Symbol) || value.nil?
end

.validate_symbol_map_types(symbol_map) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 38

def validate_symbol_map_types(symbol_map)
  symbol_map.each_pair do |name, value|
    unless valid_name_type?(name)
      # :nocov:
      raise BadNameType, "name is #{name} which is a #{name.class} but expected String, or Symbol"
      # :nocov:
    end

    unless valid_value_type?(value)
      # :nocov:
      raise BadValueType, "#{
        name
      } is #{value} which is a #{value.class} but expected nil, String, or Symbol"
      # :nocov:
    end
  end
end

Instance Method Details

#allObject



94
95
96
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 94

def all
  @symbol_map
end

#all_namesObject



98
99
100
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 98

def all_names
  @symbol_map.keys
end

#all_valuesObject



102
103
104
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 102

def all_values
  @symbol_map.values
end

#make_moduleObject



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 124

def make_module
  mod = Module.new
  enumerated = self

  %i[all all_names all_values value?].each do |method_name|
    mod.singleton_class.define_method method_name do |*args, **opts, &block|
      enumerated.send(method_name, *args, **opts, &block)
    end
  end

  @symbol_map.each_pair do |name, value|
    mod.const_set(name, value)
  end

  mod
end

#respond_to_missing?(name, _include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


116
117
118
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 116

def respond_to_missing?(name, _include_private = false)
  @symbol_map.key?(name)
end

#value?(value) ⇒ Boolean

Returns:

  • (Boolean)


120
121
122
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 120

def value?(value)
  @symbol_map.values.include?(value.to_sym)
end