abstractivator 0.0.27 → 0.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/
|