ruby-enum 0.6.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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: []