ruby-enum 0.6.0 → 0.9.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 +5 -5
- data/CHANGELOG.md +32 -6
- data/Dangerfile +4 -0
- data/Gemfile +14 -2
- data/Gemfile.lock +116 -33
- data/LICENSE.md +1 -1
- data/README.md +176 -64
- data/RELEASING.md +5 -12
- data/Rakefile +3 -1
- data/UPGRADING.md +44 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png +0 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png +0 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png +0 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png +0 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png +0 -0
- data/coverage/assets/0.12.3/application.css +1 -0
- data/coverage/assets/0.12.3/application.js +7 -0
- data/coverage/assets/0.12.3/colorbox/border.png +0 -0
- data/coverage/assets/0.12.3/colorbox/controls.png +0 -0
- data/coverage/assets/0.12.3/colorbox/loading.gif +0 -0
- data/coverage/assets/0.12.3/colorbox/loading_background.png +0 -0
- data/coverage/assets/0.12.3/favicon_green.png +0 -0
- data/coverage/assets/0.12.3/favicon_red.png +0 -0
- data/coverage/assets/0.12.3/favicon_yellow.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/assets/0.12.3/loading.gif +0 -0
- data/coverage/assets/0.12.3/magnify.png +0 -0
- data/coverage/index.html +3841 -0
- data/lib/ruby-enum.rb +2 -0
- data/lib/ruby-enum/enum.rb +59 -21
- data/lib/ruby-enum/errors/base.rb +3 -1
- data/lib/ruby-enum/errors/duplicate_key_error.rb +2 -0
- data/lib/ruby-enum/errors/duplicate_value_error.rb +2 -0
- data/lib/ruby-enum/errors/uninitialized_constant_error.rb +2 -0
- data/lib/ruby-enum/version.rb +3 -1
- data/lib/ruby_enum.rb +2 -0
- data/pkg/ruby-enum-0.8.0.gem +0 -0
- data/ruby-enum.gemspec +3 -1
- data/spec/ruby-enum/enum_spec.rb +125 -9
- data/spec/ruby-enum/version_spec.rb +2 -0
- data/spec/spec_helper.rb +6 -0
- metadata +40 -8
data/lib/ruby-enum.rb
CHANGED
data/lib/ruby-enum/enum.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Ruby
|
2
4
|
module Enum
|
3
5
|
attr_reader :key, :value
|
@@ -10,6 +12,8 @@ module Ruby
|
|
10
12
|
def self.included(base)
|
11
13
|
base.extend Enumerable
|
12
14
|
base.extend ClassMethods
|
15
|
+
|
16
|
+
base.private_class_method(:new)
|
13
17
|
end
|
14
18
|
|
15
19
|
module ClassMethods
|
@@ -18,36 +22,30 @@ module Ruby
|
|
18
22
|
# === Parameters
|
19
23
|
# [key] Enumerator key.
|
20
24
|
# [value] Enumerator value.
|
21
|
-
def define(key, value)
|
25
|
+
def define(key, value = key)
|
22
26
|
@_enum_hash ||= {}
|
23
27
|
@_enums_by_value ||= {}
|
24
28
|
|
25
29
|
validate_key!(key)
|
26
30
|
validate_value!(value)
|
27
31
|
|
28
|
-
|
29
|
-
@_enum_hash[key] = new_instance
|
30
|
-
@_enums_by_value[value] = new_instance
|
31
|
-
end
|
32
|
+
store_new_instance(key, value)
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
if upper?(key.to_s)
|
35
|
+
const_set key, value
|
36
|
+
else
|
37
|
+
define_singleton_method(key) { value }
|
38
|
+
end
|
37
39
|
end
|
38
40
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
41
|
+
def store_new_instance(key, value)
|
42
|
+
new_instance = new(key, value)
|
43
|
+
@_enum_hash[key] = new_instance
|
44
|
+
@_enums_by_value[value] = new_instance
|
43
45
|
end
|
44
46
|
|
45
47
|
def const_missing(key)
|
46
|
-
|
47
|
-
@_enum_hash[key].value
|
48
|
-
else
|
49
|
-
fail Ruby::Enum::Errors::UninitializedConstantError, name: name, key: key
|
50
|
-
end
|
48
|
+
raise Ruby::Enum::Errors::UninitializedConstantError, name: name, key: key
|
51
49
|
end
|
52
50
|
|
53
51
|
# Iterate over all enumerated values.
|
@@ -89,7 +87,7 @@ module Ruby
|
|
89
87
|
# Returns the corresponding enum instance or nil.
|
90
88
|
def value(k)
|
91
89
|
enum = @_enum_hash[k]
|
92
|
-
enum
|
90
|
+
enum&.value
|
93
91
|
end
|
94
92
|
|
95
93
|
# Whether the specified value exists in this enum.
|
@@ -110,7 +108,7 @@ module Ruby
|
|
110
108
|
# Returns the corresponding key symbol or nil.
|
111
109
|
def key(v)
|
112
110
|
enum = @_enums_by_value[v]
|
113
|
-
enum
|
111
|
+
enum&.key
|
114
112
|
end
|
115
113
|
|
116
114
|
# Returns all enum keys.
|
@@ -120,7 +118,29 @@ module Ruby
|
|
120
118
|
|
121
119
|
# Returns all enum values.
|
122
120
|
def values
|
123
|
-
@_enum_hash.values.map(&:value)
|
121
|
+
result = @_enum_hash.values.map(&:value)
|
122
|
+
|
123
|
+
if superclass < Ruby::Enum
|
124
|
+
superclass.values + result
|
125
|
+
else
|
126
|
+
result
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Iterate over all enumerated values.
|
131
|
+
# Required for Enumerable mixin
|
132
|
+
def each_value(&_block)
|
133
|
+
@_enum_hash.each_value do |v|
|
134
|
+
yield v.value
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# Iterate over all enumerated keys.
|
139
|
+
# Required for Enumerable mixin
|
140
|
+
def each_key(&_block)
|
141
|
+
@_enum_hash.each_value do |v|
|
142
|
+
yield v.key
|
143
|
+
end
|
124
144
|
end
|
125
145
|
|
126
146
|
def to_h
|
@@ -128,6 +148,24 @@ module Ruby
|
|
128
148
|
[key, enum.value]
|
129
149
|
end]
|
130
150
|
end
|
151
|
+
|
152
|
+
private
|
153
|
+
|
154
|
+
def upper?(s)
|
155
|
+
!/[[:upper:]]/.match(s).nil?
|
156
|
+
end
|
157
|
+
|
158
|
+
def validate_key!(key)
|
159
|
+
return unless @_enum_hash.key?(key)
|
160
|
+
|
161
|
+
raise Ruby::Enum::Errors::DuplicateKeyError, name: name, key: key
|
162
|
+
end
|
163
|
+
|
164
|
+
def validate_value!(value)
|
165
|
+
return unless @_enums_by_value.key?(value)
|
166
|
+
|
167
|
+
raise Ruby::Enum::Errors::DuplicateValueError, name: name, value: value
|
168
|
+
end
|
131
169
|
end
|
132
170
|
end
|
133
171
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Ruby
|
2
4
|
module Enum
|
3
5
|
module Errors
|
@@ -37,7 +39,7 @@ module Ruby
|
|
37
39
|
#
|
38
40
|
# Returns a localized error message string.
|
39
41
|
def translate(key, options)
|
40
|
-
::I18n.translate("#{BASE_KEY}.#{key}", { locale: :en }.merge(options)).strip
|
42
|
+
::I18n.translate("#{BASE_KEY}.#{key}", **{ locale: :en }.merge(options)).strip
|
41
43
|
end
|
42
44
|
|
43
45
|
# Create the problem.
|
data/lib/ruby-enum/version.rb
CHANGED
data/lib/ruby_enum.rb
CHANGED
Binary file
|
data/ruby-enum.gemspec
CHANGED
data/spec/ruby-enum/enum_spec.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
|
3
5
|
class Colors
|
@@ -7,6 +9,14 @@ class Colors
|
|
7
9
|
define :GREEN, 'green'
|
8
10
|
end
|
9
11
|
|
12
|
+
class FirstSubclass < Colors
|
13
|
+
define :ORANGE, 'orange'
|
14
|
+
end
|
15
|
+
|
16
|
+
class SecondSubclass < FirstSubclass
|
17
|
+
define :PINK, 'pink'
|
18
|
+
end
|
19
|
+
|
10
20
|
describe Ruby::Enum do
|
11
21
|
it 'returns an enum value' do
|
12
22
|
expect(Colors::RED).to eq 'red'
|
@@ -25,9 +35,9 @@ describe Ruby::Enum do
|
|
25
35
|
enum_keys << enum.key
|
26
36
|
enum_values << enum.value
|
27
37
|
end
|
28
|
-
expect(keys).to eq [
|
29
|
-
expect(enum_keys).to eq [
|
30
|
-
expect(enum_values).to eq %w
|
38
|
+
expect(keys).to eq %i[RED GREEN]
|
39
|
+
expect(enum_keys).to eq %i[RED GREEN]
|
40
|
+
expect(enum_values).to eq %w[red green]
|
31
41
|
end
|
32
42
|
end
|
33
43
|
context '#map' do
|
@@ -55,8 +65,13 @@ describe Ruby::Enum do
|
|
55
65
|
end
|
56
66
|
end
|
57
67
|
context '#key?' do
|
58
|
-
it 'returns true for valid keys' do
|
59
|
-
Colors.keys.each do |key|
|
68
|
+
it 'returns true for valid keys accessed directly' do
|
69
|
+
Colors.keys.each do |key| # rubocop:disable Style/HashEachMethods
|
70
|
+
expect(Colors.key?(key)).to eq(true)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
it 'returns true for valid keys accessed via each_keys' do
|
74
|
+
Colors.each_key do |key|
|
60
75
|
expect(Colors.key?(key)).to eq(true)
|
61
76
|
end
|
62
77
|
end
|
@@ -75,8 +90,13 @@ describe Ruby::Enum do
|
|
75
90
|
end
|
76
91
|
end
|
77
92
|
context '#value?' do
|
78
|
-
it 'returns true for valid values' do
|
79
|
-
Colors.values.each do |value|
|
93
|
+
it 'returns true for valid values accessed directly' do
|
94
|
+
Colors.values.each do |value| # rubocop:disable Style/HashEachMethods
|
95
|
+
expect(Colors.value?(value)).to eq(true)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
it 'returns true for valid values accessed via each_value' do
|
99
|
+
Colors.each_value do |value|
|
80
100
|
expect(Colors.value?(value)).to eq(true)
|
81
101
|
end
|
82
102
|
end
|
@@ -96,12 +116,12 @@ describe Ruby::Enum do
|
|
96
116
|
end
|
97
117
|
context '#keys' do
|
98
118
|
it 'returns keys' do
|
99
|
-
expect(Colors.keys).to eq([
|
119
|
+
expect(Colors.keys).to eq(%i[RED GREEN])
|
100
120
|
end
|
101
121
|
end
|
102
122
|
context '#values' do
|
103
123
|
it 'returns values' do
|
104
|
-
expect(Colors.values).to eq(%w
|
124
|
+
expect(Colors.values).to eq(%w[red green])
|
105
125
|
end
|
106
126
|
end
|
107
127
|
context '#to_h' do
|
@@ -129,4 +149,100 @@ describe Ruby::Enum do
|
|
129
149
|
end.to raise_error Ruby::Enum::Errors::DuplicateValueError, /The value red has already been defined./
|
130
150
|
end
|
131
151
|
end
|
152
|
+
|
153
|
+
describe 'Given a class that has not defined any enums' do
|
154
|
+
class EmptyEnums
|
155
|
+
include Ruby::Enum
|
156
|
+
end
|
157
|
+
it do
|
158
|
+
expect { EmptyEnums::ORANGE }.to raise_error Ruby::Enum::Errors::UninitializedConstantError
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'when a constant is redefined in a global namespace' do
|
163
|
+
before do
|
164
|
+
RED = 'black'
|
165
|
+
end
|
166
|
+
|
167
|
+
it { expect(Colors::RED).to eq 'red' }
|
168
|
+
end
|
169
|
+
|
170
|
+
describe 'Subclass behavior' do
|
171
|
+
it 'contains the enums defined in the parent class' do
|
172
|
+
expect(FirstSubclass::GREEN).to eq 'green'
|
173
|
+
expect(FirstSubclass::RED).to eq 'red'
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'contains its own enums' do
|
177
|
+
expect(FirstSubclass::ORANGE).to eq 'orange'
|
178
|
+
end
|
179
|
+
it 'parent class should not have enums defined in child classes' do
|
180
|
+
expect { Colors::ORANGE }.to raise_error Ruby::Enum::Errors::UninitializedConstantError
|
181
|
+
end
|
182
|
+
context 'Given a 2 level depth subclass' do
|
183
|
+
subject { SecondSubclass }
|
184
|
+
it 'contains its own enums and all the enums defined in the parent classes' do
|
185
|
+
expect(subject::RED).to eq 'red'
|
186
|
+
expect(subject::GREEN).to eq 'green'
|
187
|
+
expect(subject::ORANGE).to eq 'orange'
|
188
|
+
expect(subject::PINK).to eq 'pink'
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#values' do
|
192
|
+
subject { SecondSubclass.values }
|
193
|
+
|
194
|
+
it 'contains the values from all of the parent classes' do
|
195
|
+
expect(subject).to eq(%w[red green orange pink])
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
describe '#values' do
|
201
|
+
subject { FirstSubclass.values }
|
202
|
+
|
203
|
+
it 'contains the values from the parent class' do
|
204
|
+
expect(subject).to eq(%w[red green orange])
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
describe 'default value' do
|
210
|
+
class Default
|
211
|
+
include Ruby::Enum
|
212
|
+
define :KEY
|
213
|
+
end
|
214
|
+
|
215
|
+
subject { Default::KEY }
|
216
|
+
|
217
|
+
it 'equals the key' do
|
218
|
+
expect(subject).to eq(:KEY)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
describe 'non constant definitions' do
|
223
|
+
class States
|
224
|
+
include Ruby::Enum
|
225
|
+
define :created, 'Created'
|
226
|
+
define :published, 'Published'
|
227
|
+
define :undefined
|
228
|
+
end
|
229
|
+
subject { States }
|
230
|
+
it 'behaves like an enum' do
|
231
|
+
expect(subject.created).to eq 'Created'
|
232
|
+
expect(subject.published).to eq 'Published'
|
233
|
+
expect(subject.undefined).to eq :undefined
|
234
|
+
|
235
|
+
expect(subject.key?(:created)).to be true
|
236
|
+
expect(subject.key('Created')).to eq :created
|
237
|
+
|
238
|
+
expect(subject.value?('Created')).to be true
|
239
|
+
expect(subject.value(:created)).to eq 'Created'
|
240
|
+
|
241
|
+
expect(subject.key?(:undefined)).to be true
|
242
|
+
expect(subject.key(:undefined)).to eq :undefined
|
243
|
+
|
244
|
+
expect(subject.value?(:undefined)).to be true
|
245
|
+
expect(subject.value(:undefined)).to eq :undefined
|
246
|
+
end
|
247
|
+
end
|
132
248
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-enum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Doubrovkine
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
description:
|
27
|
+
description:
|
28
28
|
email: dblock@dblock.org
|
29
29
|
executables: []
|
30
30
|
extensions: []
|
@@ -32,12 +32,44 @@ extra_rdoc_files: []
|
|
32
32
|
files:
|
33
33
|
- CHANGELOG.md
|
34
34
|
- CONTRIBUTING.md
|
35
|
+
- Dangerfile
|
35
36
|
- Gemfile
|
36
37
|
- Gemfile.lock
|
37
38
|
- LICENSE.md
|
38
39
|
- README.md
|
39
40
|
- RELEASING.md
|
40
41
|
- Rakefile
|
42
|
+
- UPGRADING.md
|
43
|
+
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png
|
44
|
+
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png
|
45
|
+
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png
|
46
|
+
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png
|
47
|
+
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png
|
48
|
+
- coverage/assets/0.12.3/application.css
|
49
|
+
- coverage/assets/0.12.3/application.js
|
50
|
+
- coverage/assets/0.12.3/colorbox/border.png
|
51
|
+
- coverage/assets/0.12.3/colorbox/controls.png
|
52
|
+
- coverage/assets/0.12.3/colorbox/loading.gif
|
53
|
+
- coverage/assets/0.12.3/colorbox/loading_background.png
|
54
|
+
- coverage/assets/0.12.3/favicon_green.png
|
55
|
+
- coverage/assets/0.12.3/favicon_red.png
|
56
|
+
- coverage/assets/0.12.3/favicon_yellow.png
|
57
|
+
- coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png
|
58
|
+
- coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png
|
59
|
+
- coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png
|
60
|
+
- coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png
|
61
|
+
- coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png
|
62
|
+
- coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png
|
63
|
+
- coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png
|
64
|
+
- coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png
|
65
|
+
- coverage/assets/0.12.3/images/ui-icons_222222_256x240.png
|
66
|
+
- coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png
|
67
|
+
- coverage/assets/0.12.3/images/ui-icons_454545_256x240.png
|
68
|
+
- coverage/assets/0.12.3/images/ui-icons_888888_256x240.png
|
69
|
+
- coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png
|
70
|
+
- coverage/assets/0.12.3/loading.gif
|
71
|
+
- coverage/assets/0.12.3/magnify.png
|
72
|
+
- coverage/index.html
|
41
73
|
- lib/config/locales/en.yml
|
42
74
|
- lib/ruby-enum.rb
|
43
75
|
- lib/ruby-enum/enum.rb
|
@@ -47,6 +79,7 @@ files:
|
|
47
79
|
- lib/ruby-enum/errors/uninitialized_constant_error.rb
|
48
80
|
- lib/ruby-enum/version.rb
|
49
81
|
- lib/ruby_enum.rb
|
82
|
+
- pkg/ruby-enum-0.8.0.gem
|
50
83
|
- ruby-enum.gemspec
|
51
84
|
- spec/ruby-enum/enum_spec.rb
|
52
85
|
- spec/ruby-enum/version_spec.rb
|
@@ -55,7 +88,7 @@ homepage: http://github.com/dblock/ruby-enum
|
|
55
88
|
licenses:
|
56
89
|
- MIT
|
57
90
|
metadata: {}
|
58
|
-
post_install_message:
|
91
|
+
post_install_message:
|
59
92
|
rdoc_options: []
|
60
93
|
require_paths:
|
61
94
|
- lib
|
@@ -70,9 +103,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
103
|
- !ruby/object:Gem::Version
|
71
104
|
version: 1.3.6
|
72
105
|
requirements: []
|
73
|
-
|
74
|
-
|
75
|
-
signing_key:
|
106
|
+
rubygems_version: 3.0.3
|
107
|
+
signing_key:
|
76
108
|
specification_version: 4
|
77
109
|
summary: Enum-like behavior for Ruby.
|
78
110
|
test_files: []
|