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.
Files changed (54) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +32 -6
  3. data/Dangerfile +4 -0
  4. data/Gemfile +14 -2
  5. data/Gemfile.lock +116 -33
  6. data/LICENSE.md +1 -1
  7. data/README.md +176 -64
  8. data/RELEASING.md +5 -12
  9. data/Rakefile +3 -1
  10. data/UPGRADING.md +44 -0
  11. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png +0 -0
  12. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png +0 -0
  13. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png +0 -0
  14. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png +0 -0
  15. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png +0 -0
  16. data/coverage/assets/0.12.3/application.css +1 -0
  17. data/coverage/assets/0.12.3/application.js +7 -0
  18. data/coverage/assets/0.12.3/colorbox/border.png +0 -0
  19. data/coverage/assets/0.12.3/colorbox/controls.png +0 -0
  20. data/coverage/assets/0.12.3/colorbox/loading.gif +0 -0
  21. data/coverage/assets/0.12.3/colorbox/loading_background.png +0 -0
  22. data/coverage/assets/0.12.3/favicon_green.png +0 -0
  23. data/coverage/assets/0.12.3/favicon_red.png +0 -0
  24. data/coverage/assets/0.12.3/favicon_yellow.png +0 -0
  25. data/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  26. data/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  27. data/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  28. data/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  29. data/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  30. data/coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  31. data/coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  32. data/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  33. data/coverage/assets/0.12.3/images/ui-icons_222222_256x240.png +0 -0
  34. data/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png +0 -0
  35. data/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png +0 -0
  36. data/coverage/assets/0.12.3/images/ui-icons_888888_256x240.png +0 -0
  37. data/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png +0 -0
  38. data/coverage/assets/0.12.3/loading.gif +0 -0
  39. data/coverage/assets/0.12.3/magnify.png +0 -0
  40. data/coverage/index.html +3841 -0
  41. data/lib/ruby-enum.rb +2 -0
  42. data/lib/ruby-enum/enum.rb +59 -21
  43. data/lib/ruby-enum/errors/base.rb +3 -1
  44. data/lib/ruby-enum/errors/duplicate_key_error.rb +2 -0
  45. data/lib/ruby-enum/errors/duplicate_value_error.rb +2 -0
  46. data/lib/ruby-enum/errors/uninitialized_constant_error.rb +2 -0
  47. data/lib/ruby-enum/version.rb +3 -1
  48. data/lib/ruby_enum.rb +2 -0
  49. data/pkg/ruby-enum-0.8.0.gem +0 -0
  50. data/ruby-enum.gemspec +3 -1
  51. data/spec/ruby-enum/enum_spec.rb +125 -9
  52. data/spec/ruby-enum/version_spec.rb +2 -0
  53. data/spec/spec_helper.rb +6 -0
  54. metadata +40 -8
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'i18n'
2
4
 
3
5
  require 'ruby-enum/version'
@@ -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
- new_instance = new(key, value)
29
- @_enum_hash[key] = new_instance
30
- @_enums_by_value[value] = new_instance
31
- end
32
+ store_new_instance(key, value)
32
33
 
33
- def validate_key!(key)
34
- return unless @_enum_hash.key?(key)
35
-
36
- fail Ruby::Enum::Errors::DuplicateKeyError, name: name, key: key
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 validate_value!(value)
40
- return unless @_enums_by_value.key?(value)
41
-
42
- fail Ruby::Enum::Errors::DuplicateValueError, name: name, value: value
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
- if @_enum_hash[key]
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.value if 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.key if 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.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruby
2
4
  module Enum
3
5
  module Errors
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruby
2
4
  module Enum
3
5
  module Errors
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruby
2
4
  module Enum
3
5
  module Errors
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ruby
2
4
  module Enum
3
- VERSION = '0.6.0'
5
+ VERSION = '0.9.0'
4
6
  end
5
7
  end
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ruby-enum'
Binary file
@@ -1,4 +1,6 @@
1
- $LOAD_PATH.push File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
2
4
  require 'ruby-enum/version'
3
5
 
4
6
  Gem::Specification.new do |s|
@@ -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 [:RED, :GREEN]
29
- expect(enum_keys).to eq [:RED, :GREEN]
30
- expect(enum_values).to eq %w(red green)
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([:RED, :GREEN])
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(red green))
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Ruby::Enum do
@@ -1,6 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
4
 
3
5
  require 'rubygems'
6
+
7
+ require 'simplecov'
8
+ SimpleCov.start
9
+
4
10
  require 'rspec'
5
11
  require 'ruby-enum'
6
12
 
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.6.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: 2016-12-05 00:00:00.000000000 Z
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
- rubyforge_project:
74
- rubygems_version: 2.5.1
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: []