typesafe_enum 0.2.1 → 0.2.2
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/.gitignore +1 -0
- data/CHANGES.md +4 -0
- data/README.md +31 -16
- data/lib/typesafe_enum/base.rb +3 -18
- data/lib/typesafe_enum/module_info.rb +1 -1
- data/spec/unit/typesafe_enum/base_spec.rb +45 -20
- data/typesafe_enum.gemspec +2 -2
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb07ad036d64d6c64c976b86db50a4f94a33c85fb18410077551282ad2d32f51
|
4
|
+
data.tar.gz: 0c9a2342fa1163a2475fe0c7bb7656c333e678a66ae5be47b6beed9934cebd17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a39483acf17f3a706dd61caa5cebd6c269789a23baf8b36ce0c7f3e4a870d3e0dc15b47753e268505417e00d769dea6d1e1719a9e5570fba5af9f8329da37ea
|
7
|
+
data.tar.gz: b02640de3559f49920ae311c6cd2b68411a78bd38763289cb87726c3c4989d0ed49c98a1f2d0450d9a8ef79b0782cca1f62968d61ea83ce61deff1978b24e267
|
data/.gitignore
CHANGED
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -14,23 +14,25 @@ with syntax loosely inspired by [Ruby::Enum](https://github.com/dblock/ruby-enum
|
|
14
14
|
- [Basic usage](#basic-usage)
|
15
15
|
- [Ordering](#ordering)
|
16
16
|
- [String representations](#string-representations)
|
17
|
+
- [Enumerable](#enumerable)
|
17
18
|
- [Convenience methods on enum classes](#convenience-methods-on-enum-classes)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
- [#to_a](#to_a)
|
20
|
+
- [#size](#size)
|
21
|
+
- [#each, <code>#each_with_index</code>, <code>#map</code> and <code>#flat_map</code>](#each-each_with_index-map-and-flat_map)
|
22
|
+
- [#find_by_key, <code>#find_by_value</code>, <code>#find_by_ord</code>](#find_by_key-find_by_value-find_by_ord)
|
23
|
+
- [#find_by_value_str](#find_by_value_str)
|
23
24
|
- [Enum classes with methods](#enum-classes-with-methods)
|
24
25
|
- [Enum instances with methods](#enum-instances-with-methods)
|
25
|
-
- [How is this different from Ruby::Enum
|
26
|
+
- [How is this different from <a href="https://github.com/dblock/ruby-enum">Ruby::Enum</a>?](#how-is-this-different-from-rubyenum)
|
26
27
|
- [How is this different from java.lang.Enum?](#how-is-this-different-from-javalangenum)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
- [Clunkier syntax](#clunkier-syntax)
|
29
|
+
- [No special switch/<code>case</code> support](#no-special-switchcase-support)
|
30
|
+
- [No serialization support](#no-serialization-support)
|
31
|
+
- [No support classes](#no-support-classes)
|
32
|
+
- [Enum classes are not closed](#enum-classes-are-not-closed)
|
32
33
|
- [Contributing](#contributing)
|
33
34
|
|
35
|
+
|
34
36
|
## Basic usage
|
35
37
|
|
36
38
|
Create a new enum class and a set of instances:
|
@@ -199,9 +201,19 @@ Suit::DIAMONDS.to_s
|
|
199
201
|
|
200
202
|
It can of course be overridden.
|
201
203
|
|
204
|
+
## `Enumerable`
|
205
|
+
|
206
|
+
As of version 0.2.2, `TypesafeEnum` classes implement
|
207
|
+
[`Enumerable`](https://ruby-doc.org/core-2.6.5/Enumerable.html),
|
208
|
+
so they support methods such as
|
209
|
+
[`#find`](https://ruby-doc.org/core-2.6.5/Enumerable.html#method-i-find),
|
210
|
+
[`#select`](https://ruby-doc.org/core-2.6.5/Enumerable.html#method-i-select),
|
211
|
+
and [`#reduce`](https://ruby-doc.org/core-2.6.5/Enumerable.html#method-i-reduce),
|
212
|
+
in addition to the convenience methods called out specifically below.
|
213
|
+
|
202
214
|
## Convenience methods on enum classes
|
203
215
|
|
204
|
-
###
|
216
|
+
### `#to_a`
|
205
217
|
|
206
218
|
Returns an array of the enum instances in declaration order:
|
207
219
|
|
@@ -210,7 +222,7 @@ Tarot.to_a
|
|
210
222
|
# => [#<Tarot:0x007fd4db30eca8 @key=:CUPS, @value="Cups", @ord=0>, #<Tarot:0x007fd4db30ebe0 @key=:COINS, @value="Coins", @ord=1>, #<Tarot:0x007fd4db30eaf0 @key=:WANDS, @value="Wands", @ord=2>, #<Tarot:0x007fd4db30e9b0 @key=:SWORDS, @value="Swords", @ord=3>]
|
211
223
|
```
|
212
224
|
|
213
|
-
###
|
225
|
+
### `#size`
|
214
226
|
|
215
227
|
Returns the number of enum instances:
|
216
228
|
|
@@ -219,7 +231,7 @@ Suit.size
|
|
219
231
|
# => 4
|
220
232
|
```
|
221
233
|
|
222
|
-
###
|
234
|
+
### `#each`, `#each_with_index`, `#map` and `#flat_map`
|
223
235
|
|
224
236
|
Iterate over the set of enum instances:
|
225
237
|
|
@@ -238,9 +250,12 @@ Suit.each_with_index { |s, i| puts "#{i}: #{s.key}" }
|
|
238
250
|
|
239
251
|
Suit.map(&:value)
|
240
252
|
# => ["clubs", "diamonds", "hearts", "spades"]
|
253
|
+
|
254
|
+
Suit.flat_map { |s| [s.key, s.value] }
|
255
|
+
# => [:CLUBS, "clubs", :DIAMONDS, "diamonds", :HEARTS, "hearts", :SPADES, "spades"]
|
241
256
|
```
|
242
257
|
|
243
|
-
###
|
258
|
+
### `#find_by_key`, `#find_by_value`, `#find_by_ord`
|
244
259
|
|
245
260
|
Look up an enum instance based on its key, value, or ordinal:
|
246
261
|
|
@@ -253,7 +268,7 @@ Tarot.find_by_ord(3)
|
|
253
268
|
# => #<Tarot:0x007faab19fd810 @key=:SWORDS, @value="Swords", @ord=3>
|
254
269
|
```
|
255
270
|
|
256
|
-
###
|
271
|
+
### `#find_by_value_str`
|
257
272
|
|
258
273
|
Look up an enum instance based on the string form of its value (as returned by `to_s`) --
|
259
274
|
useful for, e.g., XML or JSON mapping of enums with non-string values:
|
data/lib/typesafe_enum/base.rb
CHANGED
@@ -8,6 +8,7 @@ module TypesafeEnum
|
|
8
8
|
include Comparable
|
9
9
|
|
10
10
|
class << self
|
11
|
+
include Enumerable
|
11
12
|
|
12
13
|
# Returns an array of the enum instances in declaration order
|
13
14
|
# @return [Array<self>] All instances of this enum, in declaration order
|
@@ -18,32 +19,16 @@ module TypesafeEnum
|
|
18
19
|
# Returns the number of enum instances
|
19
20
|
# @return [Integer] the number of instances
|
20
21
|
def size
|
21
|
-
as_array
|
22
|
+
as_array.size
|
22
23
|
end
|
23
24
|
|
24
25
|
# Iterates over the set of enum instances
|
25
26
|
# @yield [self] Each instance of this enum, in declaration order
|
26
|
-
# @return [
|
27
|
+
# @return [Enumerator<self>] All instances of this enum, in declaration order
|
27
28
|
def each(&block)
|
28
29
|
to_a.each(&block)
|
29
30
|
end
|
30
31
|
|
31
|
-
# Iterates over the set of enum instances
|
32
|
-
# @yield [self, Integer] Each instance of this enum, in declaration order,
|
33
|
-
# with its ordinal index
|
34
|
-
# @return [Array<self>] All instances of this enum, in declaration order
|
35
|
-
def each_with_index(&block)
|
36
|
-
to_a.each_with_index(&block)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Iterates over the set of enum instances
|
40
|
-
# @yield [self] Each instance of this enum, in declaration order
|
41
|
-
# @return [Array] An array containing the result of applying `&block`
|
42
|
-
# to each instance of this enum, in instance declaration order
|
43
|
-
def map(&block)
|
44
|
-
to_a.map(&block)
|
45
|
-
end
|
46
|
-
|
47
32
|
# Looks up an enum instance based on its key
|
48
33
|
# @param key [Symbol] the key to look up
|
49
34
|
# @return [self, nil] the corresponding enum instance, or nil
|
@@ -32,8 +32,8 @@ end
|
|
32
32
|
module TypesafeEnum
|
33
33
|
describe Base do
|
34
34
|
|
35
|
-
describe
|
36
|
-
it '
|
35
|
+
describe :new do
|
36
|
+
it 'news a constant enum value' do
|
37
37
|
enum = Suit::CLUBS
|
38
38
|
expect(enum).to be_a(Suit)
|
39
39
|
end
|
@@ -113,7 +113,7 @@ module TypesafeEnum
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
describe
|
116
|
+
describe :to_a do
|
117
117
|
it 'returns the values as an array' do
|
118
118
|
expect(Suit.to_a).to eq([Suit::CLUBS, Suit::DIAMONDS, Suit::HEARTS, Suit::SPADES])
|
119
119
|
end
|
@@ -125,13 +125,27 @@ module TypesafeEnum
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
-
describe
|
128
|
+
describe :size do
|
129
129
|
it 'returns the number of enum instnaces' do
|
130
130
|
expect(Suit.size).to eq(4)
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
-
describe
|
134
|
+
describe :count do
|
135
|
+
it 'returns the number of enum instnaces' do
|
136
|
+
expect(Suit.count).to eq(4)
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'counts items' do
|
140
|
+
expect(Suit.count(Suit::SPADES)).to eq(1)
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'counts items that match a predicate' do
|
144
|
+
expect(Suit.count { |s| s.value.length == 6 }).to eq(2)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe :each do
|
135
149
|
it 'iterates the enum values' do
|
136
150
|
expected = [Suit::CLUBS, Suit::DIAMONDS, Suit::HEARTS, Suit::SPADES]
|
137
151
|
index = 0
|
@@ -142,7 +156,7 @@ module TypesafeEnum
|
|
142
156
|
end
|
143
157
|
end
|
144
158
|
|
145
|
-
describe
|
159
|
+
describe :each_with_index do
|
146
160
|
it 'iterates the enum values with indices' do
|
147
161
|
expected = [Suit::CLUBS, Suit::DIAMONDS, Suit::HEARTS, Suit::SPADES]
|
148
162
|
Suit.each_with_index do |s, index|
|
@@ -151,14 +165,21 @@ module TypesafeEnum
|
|
151
165
|
end
|
152
166
|
end
|
153
167
|
|
154
|
-
describe
|
168
|
+
describe :map do
|
155
169
|
it 'maps enum values' do
|
156
170
|
all_keys = Suit.map(&:key)
|
157
171
|
expect(all_keys).to eq(%i[CLUBS DIAMONDS HEARTS SPADES])
|
158
172
|
end
|
159
173
|
end
|
160
174
|
|
161
|
-
describe
|
175
|
+
describe :flat_map do
|
176
|
+
it 'flatmaps enum values' do
|
177
|
+
result = Tarot.flat_map { |t| [t.key, t.value] }
|
178
|
+
expect(result).to eq([:CUPS, 'Cups', :COINS, 'Coins', :WANDS, 'Wands', :SWORDS, 'Swords'])
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe :<=> do
|
162
183
|
it 'orders enum instances' do
|
163
184
|
Suit.each_with_index do |s1, i1|
|
164
185
|
Suit.each_with_index do |s2, i2|
|
@@ -168,7 +189,7 @@ module TypesafeEnum
|
|
168
189
|
end
|
169
190
|
end
|
170
191
|
|
171
|
-
describe
|
192
|
+
describe :== do
|
172
193
|
it 'returns true for identical instances, false otherwise' do
|
173
194
|
Suit.each do |s1|
|
174
195
|
Suit.each do |s2|
|
@@ -202,7 +223,7 @@ module TypesafeEnum
|
|
202
223
|
# rubocop:enable Security/MarshalLoad
|
203
224
|
end
|
204
225
|
|
205
|
-
describe
|
226
|
+
describe :!= do
|
206
227
|
it 'returns false for identical instances, true otherwise' do
|
207
228
|
Suit.each do |s1|
|
208
229
|
Suit.each do |s2|
|
@@ -224,7 +245,7 @@ module TypesafeEnum
|
|
224
245
|
end
|
225
246
|
end
|
226
247
|
|
227
|
-
describe
|
248
|
+
describe :hash do
|
228
249
|
it 'gives consistent values' do
|
229
250
|
Suit.each do |s1|
|
230
251
|
Suit.each do |s2|
|
@@ -264,7 +285,7 @@ module TypesafeEnum
|
|
264
285
|
end
|
265
286
|
end
|
266
287
|
|
267
|
-
describe
|
288
|
+
describe :eql? do
|
268
289
|
it 'is consistent with #hash' do
|
269
290
|
Suit.each do |s1|
|
270
291
|
Suit.each do |s2|
|
@@ -274,7 +295,7 @@ module TypesafeEnum
|
|
274
295
|
end
|
275
296
|
end
|
276
297
|
|
277
|
-
describe
|
298
|
+
describe :value do
|
278
299
|
it 'returns the string value of the enum instance' do
|
279
300
|
expected = %w[clubs diamonds hearts spades]
|
280
301
|
Suit.each_with_index do |s, index|
|
@@ -283,7 +304,7 @@ module TypesafeEnum
|
|
283
304
|
end
|
284
305
|
end
|
285
306
|
|
286
|
-
describe
|
307
|
+
describe :key do
|
287
308
|
it 'returns the symbol key of the enum instance' do
|
288
309
|
expected = %i[CLUBS DIAMONDS HEARTS SPADES]
|
289
310
|
Suit.each_with_index do |s, index|
|
@@ -292,7 +313,7 @@ module TypesafeEnum
|
|
292
313
|
end
|
293
314
|
end
|
294
315
|
|
295
|
-
describe
|
316
|
+
describe :ord do
|
296
317
|
it 'returns the ord value of the enum instance' do
|
297
318
|
Suit.each_with_index do |s, index|
|
298
319
|
expect(s.ord).to eq(index)
|
@@ -300,7 +321,7 @@ module TypesafeEnum
|
|
300
321
|
end
|
301
322
|
end
|
302
323
|
|
303
|
-
describe
|
324
|
+
describe :to_s do
|
304
325
|
it 'provides an informative string' do
|
305
326
|
aggregate_failures 'informative string' do
|
306
327
|
[Suit, Tarot, RGBColor, Scale].each do |ec|
|
@@ -315,7 +336,7 @@ module TypesafeEnum
|
|
315
336
|
end
|
316
337
|
end
|
317
338
|
|
318
|
-
describe
|
339
|
+
describe :find_by_key do
|
319
340
|
it 'maps symbol keys to enum instances' do
|
320
341
|
keys = %i[CLUBS DIAMONDS HEARTS SPADES]
|
321
342
|
expected = Suit.to_a
|
@@ -329,7 +350,7 @@ module TypesafeEnum
|
|
329
350
|
end
|
330
351
|
end
|
331
352
|
|
332
|
-
describe
|
353
|
+
describe :find_by_value do
|
333
354
|
it 'maps values to enum instances' do
|
334
355
|
values = %w[clubs diamonds hearts spades]
|
335
356
|
expected = Suit.to_a
|
@@ -355,7 +376,7 @@ module TypesafeEnum
|
|
355
376
|
end
|
356
377
|
end
|
357
378
|
|
358
|
-
describe
|
379
|
+
describe :find_by_value_str do
|
359
380
|
it 'maps string values to enum instances' do
|
360
381
|
values = %w[clubs diamonds hearts spades]
|
361
382
|
expected = Suit.to_a
|
@@ -381,7 +402,7 @@ module TypesafeEnum
|
|
381
402
|
end
|
382
403
|
end
|
383
404
|
|
384
|
-
describe
|
405
|
+
describe :find_by_ord do
|
385
406
|
it 'maps ordinal indices to enum instances' do
|
386
407
|
Suit.each do |s|
|
387
408
|
expect(Suit.find_by_ord(s.ord)).to be(s)
|
@@ -436,5 +457,9 @@ module TypesafeEnum
|
|
436
457
|
|
437
458
|
expect(Operation.map { |op| op.eval(39, 23) }).to eq([39 + 23, 39 - 23])
|
438
459
|
end
|
460
|
+
|
461
|
+
it 'is an Enumerable' do
|
462
|
+
expect(Suit).to be_an(Enumerable)
|
463
|
+
end
|
439
464
|
end
|
440
465
|
end
|
data/typesafe_enum.gemspec
CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency 'rake', '~> 12.3', '>= 12.3.3'
|
27
27
|
spec.add_development_dependency 'rspec', '~> 3.9'
|
28
28
|
spec.add_development_dependency 'rubocop', '~> 0.80'
|
29
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
30
|
-
spec.add_development_dependency 'simplecov-console', '~> 0.
|
29
|
+
spec.add_development_dependency 'simplecov', '~> 0.18'
|
30
|
+
spec.add_development_dependency 'simplecov-console', '~> 0.7'
|
31
31
|
spec.add_development_dependency 'yard', '~> 0.9', '>= 0.9.12'
|
32
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typesafe_enum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Moles
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -64,28 +64,28 @@ dependencies:
|
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: 0.
|
67
|
+
version: '0.18'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: 0.
|
74
|
+
version: '0.18'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: simplecov-console
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: 0.
|
81
|
+
version: '0.7'
|
82
82
|
type: :development
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: 0.
|
88
|
+
version: '0.7'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: yard
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
149
|
- !ruby/object:Gem::Version
|
150
150
|
version: '0'
|
151
151
|
requirements: []
|
152
|
-
rubygems_version: 3.0.
|
152
|
+
rubygems_version: 3.0.8
|
153
153
|
signing_key:
|
154
154
|
specification_version: 4
|
155
155
|
summary: Typesafe enum pattern for Ruby
|