abstractivator 0.0.27 → 0.0.28
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/abstractivator/enum.rb +15 -21
- data/lib/abstractivator/version.rb +1 -1
- data/spec/lib/abstractivator/enum_spec.rb +6 -7
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb01795d640d7c7f0d8a422cbe77e0e6f9ce262e
|
4
|
+
data.tar.gz: 953bf0c7d6d6fd18e800b7fd22780e5b22f6217a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0abda16e780a4dc57ddf5873b5a36e09d379b8e14c55e14ff081ba2d00de717fd03e57afc0bd3f90bf7d56202cb43a9551a6fd095a6e9f7c430f6f28345ba224
|
7
|
+
data.tar.gz: 022371561b2071ffbe820b25bc3cebddf3c12c169fe391094bb1f8e9c11410fba7fe82ecf225fec010e174054e1ad27a58c4f8fadeea27a2c9c848432544db51
|
data/lib/abstractivator/enum.rb
CHANGED
@@ -10,7 +10,7 @@ module Enum
|
|
10
10
|
|
11
11
|
module ClassMethods
|
12
12
|
def values
|
13
|
-
self.constants.map{|sym| self.const_get(sym)}.reject{|x| x
|
13
|
+
self.constants.map{|sym| self.const_get(sym)}.reject{|x| x.is_a?(Class) || x.is_a?(Module)}
|
14
14
|
end
|
15
15
|
|
16
16
|
def name_for(value)
|
@@ -22,7 +22,7 @@ module Enum
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def from(x)
|
25
|
-
values.find{|v| v == x}
|
25
|
+
values.find{|v| v.value == x}
|
26
26
|
end
|
27
27
|
|
28
28
|
private
|
@@ -37,23 +37,6 @@ module Enum
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
module EnumMember
|
41
|
-
attr_accessor :enum_type
|
42
|
-
end
|
43
|
-
|
44
|
-
class Object
|
45
|
-
include EnumMember
|
46
|
-
end
|
47
|
-
|
48
|
-
class WrappedEnumValue < SimpleDelegator
|
49
|
-
include EnumMember
|
50
|
-
attr_reader :class # pure evil
|
51
|
-
def initialize(value)
|
52
|
-
__setobj__(value)
|
53
|
-
@class = value.class
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
40
|
def define_enum(name, *fields)
|
58
41
|
if respond_to?(:const_set)
|
59
42
|
const_set(name, make_enum(*fields))
|
@@ -67,9 +50,20 @@ def make_enum(*fields)
|
|
67
50
|
fields = fields.first
|
68
51
|
Module.new do
|
69
52
|
include Enum
|
53
|
+
value_class =
|
54
|
+
const_set(:Value,
|
55
|
+
Class.new do
|
56
|
+
attr_reader :enum_type, :value
|
57
|
+
define_method(:initialize) do |enum_type, value|
|
58
|
+
@enum_type, @value = enum_type, value
|
59
|
+
end
|
60
|
+
define_method(:inspect) do
|
61
|
+
"#<#{self.class.name} #{value.inspect}>"
|
62
|
+
end
|
63
|
+
alias_method :to_s, :inspect
|
64
|
+
end)
|
70
65
|
fields.each_pair do |k, v|
|
71
|
-
val =
|
72
|
-
val.enum_type = self
|
66
|
+
val = value_class.new(self, v)
|
73
67
|
fld = k.to_s.upcase.to_sym
|
74
68
|
const_set(fld, val)
|
75
69
|
end
|
@@ -39,21 +39,20 @@ describe Enum do
|
|
39
39
|
describe '::from' do
|
40
40
|
it 'returns the typed version of the value' do
|
41
41
|
x = 'apple'
|
42
|
-
expect(x.enum_type).to be_nil
|
43
42
|
result = Container::Fruits.from(x)
|
44
|
-
expect(result
|
43
|
+
expect(result).to eql Container::Fruits::APPLE
|
45
44
|
end
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
49
48
|
describe '#define_enum' do
|
50
49
|
it 'defines an enum given an array of symbols' do
|
51
|
-
expect(Container::Fruits::APPLE).to eql 'apple'
|
52
|
-
expect(Container::Fruits::ORANGE).to eql 'orange'
|
50
|
+
expect(Container::Fruits::APPLE.value).to eql 'apple'
|
51
|
+
expect(Container::Fruits::ORANGE.value).to eql 'orange'
|
53
52
|
end
|
54
53
|
it 'defines an enum given a hash' do
|
55
|
-
expect(Container::Vegetables::CUCUMBER).to eql 'Cucumis sativus'
|
56
|
-
expect(Container::Vegetables::EGGPLANT).to eql 8
|
54
|
+
expect(Container::Vegetables::CUCUMBER.value).to eql 'Cucumis sativus'
|
55
|
+
expect(Container::Vegetables::EGGPLANT.value).to eql 8
|
57
56
|
end
|
58
57
|
it 'values know their parent' do
|
59
58
|
expect(Container::Fruits::APPLE.enum_type).to eql Container::Fruits
|
@@ -62,7 +61,7 @@ describe '#define_enum' do
|
|
62
61
|
expect(Container::Vegetables::EGGPLANT.enum_type).to eql Container::Vegetables
|
63
62
|
end
|
64
63
|
it 'can define top level enumerations' do
|
65
|
-
expect(Meats.values).to eql %w(bacon more_bacon)
|
64
|
+
expect(Meats.values.map(&:value)).to eql %w(bacon more_bacon)
|
66
65
|
end
|
67
66
|
it 'raises an error when called with bad arguments' do
|
68
67
|
expect{define_enum(:Stuff, 5)}.to raise_error /Arguments must be/
|