Class: Foobara::Enumerated::Values
- Inherits:
-
Object
- Object
- Foobara::Enumerated::Values
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?
raise ArgumentError, "Expected Module, Hash, or Array"
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
raise ArgumentError, "Expected Module, Hash, or Array"
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)
super
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)
raise BadValueType, "Expected nil, String, or Symbol, but got #{value} which is a #{value.class}"
end
value&.to_sym
end
|
.valid_name_type?(value) ⇒ 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
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)
raise BadNameType, "name is #{name} which is a #{name.class} but expected String, or Symbol"
end
unless valid_value_type?(value)
raise BadValueType, "#{
name
} is #{value} which is a #{value.class} but expected nil, String, or Symbol"
end
end
end
|
Instance Method Details
#all ⇒ Object
94
95
96
|
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 94
def all
@symbol_map
end
|
#all_names ⇒ Object
98
99
100
|
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 98
def all_names
@symbol_map.keys
end
|
#all_values ⇒ Object
102
103
104
|
# File 'foobara-0.0.110/projects/enumerated/src/values.rb', line 102
def all_values
@symbol_map.values
end
|
#make_module ⇒ Object
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
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
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
|