enums 1.0.0 → 1.1.0
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/README.md +19 -3
- data/lib/enums.rb +39 -3
- data/lib/enums/version.rb +1 -1
- data/test/test_enum.rb +84 -61
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1fd2c8d5f02ac6908e4a728c5875e177f3b1d1e
|
4
|
+
data.tar.gz: cde381d80361a980cc34825a29c897d5f3a604ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09b36ca1dd6f1918839ab56ec2a0884777bb99a57e65aaff09a97e9d962baf3392cbd3907a70356e8226c257086b005ac6133ccdc56f26b8d26699320c6a3f7e'
|
7
|
+
data.tar.gz: 273c1e400392057321bae3f78776ffad156a32beffa4ad661ea8135f59cb718f861795212036cb63c480f810d13c2a41ae36e87d11d7789c1ffb0d4f871f9a0d
|
data/README.md
CHANGED
@@ -45,8 +45,13 @@ Why? Why not? Discuss.
|
|
45
45
|
|
46
46
|
``` ruby
|
47
47
|
Enum.new( 'Color', :red, :green, :blue )
|
48
|
+
# or
|
49
|
+
enum 'Color', :red, :green, :blue
|
50
|
+
# or
|
51
|
+
enum 'Color', [:red, :green, :blue]
|
48
52
|
```
|
49
53
|
|
54
|
+
|
50
55
|
(Auto-)builds a class and code like:
|
51
56
|
|
52
57
|
``` ruby
|
@@ -71,14 +76,14 @@ class Color < Enum
|
|
71
76
|
def self.keys() [:red, :blue, :green]; end
|
72
77
|
def self.members() [RED, BLUE, GREEN]; end
|
73
78
|
|
74
|
-
def self.value( index )
|
79
|
+
def self.value( index ) members[index]; end
|
75
80
|
def self.zero() value(0); end
|
76
81
|
|
77
82
|
def self.key( key )
|
78
83
|
@hash ||= Hash[ keys.zip( members ) ]
|
79
84
|
@hash[ key ]
|
80
85
|
end
|
81
|
-
def self.[]( key )
|
86
|
+
def self.[]( key ) self.key( key ); end
|
82
87
|
|
83
88
|
def red?() self == RED; end
|
84
89
|
def blue?() self == BLUE; end
|
@@ -100,6 +105,8 @@ Color.zero #=> same as Color(0)
|
|
100
105
|
Color.red #=> Color::RED
|
101
106
|
Color.values #=> [0, 1, 2]
|
102
107
|
Color.keys #=> [:red, :green, :blue]
|
108
|
+
Color.size #=> 3
|
109
|
+
Color.length #=> same as Color.size
|
103
110
|
Color.members #=> [RED, GREEN, BLUE]
|
104
111
|
# -or-
|
105
112
|
# [<Color @key=:red, @value=0>,
|
@@ -125,9 +132,16 @@ Let's try another example:
|
|
125
132
|
|
126
133
|
``` ruby
|
127
134
|
Enum.new( 'State', :fundraising, :expired_refund, :successful )
|
135
|
+
# or
|
136
|
+
enum 'State', :fundraising, :expired_refund, :successful
|
137
|
+
# or
|
138
|
+
enum 'State', [:fundraising, :expired_refund, :successful]
|
139
|
+
|
128
140
|
|
129
141
|
State.values #=> [0, 1, 2]
|
130
142
|
State.keys #=> [:fundraising, :expired_refund, :successful]
|
143
|
+
State.size #=> 3
|
144
|
+
State.length #=> same as State.size
|
131
145
|
|
132
146
|
State.members #=> [FUNDRAISING, EXPIRED_REFUND, SUCCESSFUL]
|
133
147
|
# -or-
|
@@ -147,6 +161,8 @@ State::FUNDRAISING.key #=> :fundraising
|
|
147
161
|
state = State.fundraising
|
148
162
|
state.fundraising? #=> true
|
149
163
|
state.value #=> 0
|
164
|
+
state.is_a? Enum #=> true
|
165
|
+
state.is_a? State #=> true
|
150
166
|
|
151
167
|
State(0) #=> State::FUNDRAISING
|
152
168
|
State(1) #=> State::EXPIRED_REFUND
|
@@ -172,7 +188,7 @@ and so on.
|
|
172
188
|
- [Ruby Sample Contracts for the Universum Blockchain/World Computer Runtime](https://github.com/s6ruby/universum-contracts)
|
173
189
|
|
174
190
|
|
175
|
-
## More Safe Data
|
191
|
+
## More Safe Data Structures (Array, Hash, Struct)
|
176
192
|
|
177
193
|
[Safe Data Structures (Array, Hash, Struct)](https://github.com/s6ruby/safestruct) - Say goodbye to null / nil (and maybe) and the Billion-Dollar mistake. Say hello to zero and the Billon-Dollar fix.
|
178
194
|
|
data/lib/enums.rb
CHANGED
@@ -48,6 +48,13 @@ require 'enums/version' # note: let version always go first
|
|
48
48
|
|
49
49
|
module Safe
|
50
50
|
|
51
|
+
## note: use ClassMethods pattern for auto-including class methods
|
52
|
+
def self.included( klass )
|
53
|
+
klass.extend( ClassMethods )
|
54
|
+
end
|
55
|
+
module ClassMethods; end
|
56
|
+
|
57
|
+
|
51
58
|
|
52
59
|
## base class for enum
|
53
60
|
class Enum
|
@@ -91,6 +98,10 @@ class Enum
|
|
91
98
|
@values
|
92
99
|
end
|
93
100
|
|
101
|
+
def self.size() keys.size; end
|
102
|
+
def self.length() size; end ## alias (as is the ruby tradition)
|
103
|
+
|
104
|
+
|
94
105
|
def self.convert( arg )
|
95
106
|
## todo/check: support keys too - why? why not?
|
96
107
|
## e.g. Color(0), Color(1)
|
@@ -104,6 +115,9 @@ class Enum
|
|
104
115
|
## meta-programming "macro" - build class (on the fly)
|
105
116
|
def self.build_class( class_name, *keys )
|
106
117
|
|
118
|
+
## todo/fix:
|
119
|
+
## check class name MUST start with uppercase letter
|
120
|
+
|
107
121
|
## check if all keys are symbols and follow the ruby id(entifier) naming rules
|
108
122
|
keys.each do |key|
|
109
123
|
if key.is_a?( Symbol ) && key =~ /\A[a-z][a-zA-Z0-9_]*\z/
|
@@ -143,17 +157,21 @@ RUBY
|
|
143
157
|
end
|
144
158
|
RUBY
|
145
159
|
|
146
|
-
## note: use
|
147
|
-
##
|
160
|
+
## note: use Object for "namespacing"
|
161
|
+
## make all enums convenience converters (always) global
|
162
|
+
## including uppercase methods (e.g. State(), Color(), etc.) does NOT work otherwise (with other module includes)
|
148
163
|
|
149
164
|
## add global convenience converter function
|
150
165
|
## e.g. State(0) is same as State.convert(0)
|
151
|
-
|
166
|
+
## Color(0) is same as Color.convert(0)
|
167
|
+
Object.class_eval( <<RUBY )
|
152
168
|
def #{class_name}( arg )
|
153
169
|
#{class_name}.convert( arg )
|
154
170
|
end
|
155
171
|
RUBY
|
156
172
|
|
173
|
+
## note: use Safe (module) and NO Object for namespacing
|
174
|
+
## use include Safe to make all enums constants and machinery global
|
157
175
|
Safe.const_set( class_name, klass ) ## returns klass (plus sets global constant class name)
|
158
176
|
end
|
159
177
|
|
@@ -162,6 +180,24 @@ RUBY
|
|
162
180
|
alias_method :new, :build_class # replace original version with create
|
163
181
|
end
|
164
182
|
end # class Enum
|
183
|
+
|
184
|
+
|
185
|
+
module ClassMethods
|
186
|
+
def enum( class_name, *args )
|
187
|
+
########################################
|
188
|
+
# note: lets you use:
|
189
|
+
# enum 'Color', :red, :green, :blue
|
190
|
+
# -or-
|
191
|
+
# enum 'Color', [:red, :green, :blue]
|
192
|
+
if args[0].is_a?( Array )
|
193
|
+
keys = args[0]
|
194
|
+
else
|
195
|
+
keys = args
|
196
|
+
end
|
197
|
+
|
198
|
+
Enum.new( class_name, *keys )
|
199
|
+
end
|
200
|
+
end # module ClassMethods
|
165
201
|
end # module Safe
|
166
202
|
|
167
203
|
|
data/lib/enums/version.rb
CHANGED
data/test/test_enum.rb
CHANGED
@@ -13,76 +13,99 @@ class TestEnum < MiniTest::Test
|
|
13
13
|
include Safe ## make all enums (and "convenience" converters) global
|
14
14
|
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
puts "Safe.constants:"
|
21
|
-
pp Safe.constants
|
22
|
-
puts "Enum.constants:"
|
23
|
-
pp Enum.constants
|
24
|
-
puts "State.constants:"
|
25
|
-
pp State.constants
|
26
|
-
|
27
|
-
|
28
|
-
pp State.values
|
29
|
-
pp State.keys
|
30
|
-
## pp State(0)
|
16
|
+
## Enum.new( 'State', :fundraising, :expired_refund, :successful )
|
17
|
+
enum 'State', :fundraising, :expired_refund, :successful
|
31
18
|
|
32
|
-
pp State
|
33
|
-
pp State
|
34
|
-
pp State.members[0].value
|
35
|
-
pp State.members[1].key
|
36
|
-
pp State.members[1].value
|
19
|
+
pp State
|
20
|
+
pp State(0)
|
37
21
|
|
38
|
-
|
39
|
-
|
40
|
-
pp State::FUNDRAISING.value
|
41
|
-
pp State::FUNDRAISING.key
|
22
|
+
## Enum.new( 'Color', :red, :green, :blue )
|
23
|
+
enum 'Color', :red, :green, :blue
|
42
24
|
|
25
|
+
pp Color
|
26
|
+
pp Color(0)
|
43
27
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
pp
|
48
|
-
pp state.value
|
28
|
+
puts "Safe.constants:"
|
29
|
+
pp Safe.constants #=> [:ClassMethods, :Enum, :State, :Color]
|
30
|
+
puts "Enum.constants:"
|
31
|
+
pp Enum.constants #=> []
|
49
32
|
|
50
33
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
34
|
+
def test_state
|
35
|
+
assert_equal [:FUNDRAISING, :EXPIRED_REFUND, :SUCCESSFUL], State.constants
|
36
|
+
|
37
|
+
assert_equal [0, 1, 2], State.values
|
38
|
+
assert_equal [:fundraising, :expired_refund, :successful], State.keys
|
39
|
+
|
40
|
+
assert_equal 3, State.size
|
41
|
+
assert_equal 3, State.length
|
42
|
+
|
43
|
+
assert_equal State.fundraising, State::FUNDRAISING
|
44
|
+
assert_equal State.expired_refund, State::EXPIRED_REFUND
|
45
|
+
assert_equal State.successful, State::SUCCESSFUL
|
46
|
+
|
47
|
+
pp State.members
|
48
|
+
assert_equal :fundraising, State.members[0].key
|
49
|
+
assert_equal 0, State.members[0].value
|
50
|
+
assert_equal :expired_refund, State.members[1].key
|
51
|
+
assert_equal 1, State.members[1].value
|
52
|
+
|
53
|
+
assert_equal 0, State.fundraising.value
|
54
|
+
assert_equal :fundraising, State.fundraising.key
|
55
|
+
assert_equal 0, State::FUNDRAISING.value
|
56
|
+
assert_equal :fundraising, State::FUNDRAISING.key
|
57
|
+
|
58
|
+
pp State
|
59
|
+
state = State.fundraising
|
60
|
+
pp state
|
61
|
+
assert_equal true, state.fundraising?
|
62
|
+
assert_equal 0, state.value
|
63
|
+
assert_equal true, state.is_a?( Enum )
|
64
|
+
assert_equal true, state.is_a?( State )
|
65
|
+
|
66
|
+
assert_equal State.fundraising, State(0)
|
67
|
+
assert_equal State.expired_refund, State(1)
|
68
|
+
assert_equal State.successful, State(2)
|
69
|
+
|
70
|
+
pp State.zero
|
71
|
+
assert_equal true, State(0) == State.zero
|
72
|
+
assert_equal false, State(1) == State.zero
|
73
|
+
|
74
|
+
assert_equal State.fundraising, State.value(0)
|
75
|
+
assert_equal State.fundraising, State.key(:fundraising)
|
76
|
+
assert_equal State.fundraising, State[:fundraising]
|
63
77
|
end
|
64
78
|
|
79
|
+
|
65
80
|
def test_color
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
pp Color.
|
74
|
-
pp Color
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
pp
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
81
|
+
assert_equal [0, 1, 2], Color.values
|
82
|
+
assert_equal [:red, :green, :blue], Color.keys
|
83
|
+
assert_equal [:RED, :GREEN, :BLUE], Color.constants
|
84
|
+
|
85
|
+
assert_equal 3, Color.size
|
86
|
+
assert_equal 3, Color.length
|
87
|
+
|
88
|
+
pp Color.zero
|
89
|
+
pp Color.red
|
90
|
+
|
91
|
+
assert_equal Color.red, Color(0)
|
92
|
+
assert_equal Color.green, Color(1)
|
93
|
+
assert_equal Color.blue, Color(2)
|
94
|
+
|
95
|
+
pp Color.members
|
96
|
+
assert_equal Color.green, Color.value(1)
|
97
|
+
assert_equal Color.red, Color.key(:red)
|
98
|
+
assert_equal Color.red, Color[:red]
|
99
|
+
|
100
|
+
color = Color.red
|
101
|
+
assert_equal true, color.red?
|
102
|
+
assert_equal true, color == Color.red
|
103
|
+
assert_equal false, color.blue?
|
104
|
+
assert_equal false, color == Color.blue
|
105
|
+
|
106
|
+
assert_equal Color.red, Color::RED
|
107
|
+
assert_equal Color.green, Color::GREEN
|
108
|
+
assert_equal Color.blue, Color::BLUE
|
86
109
|
end
|
87
110
|
|
88
111
|
end # class TestEnum
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enums
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|