enum_set 0.0.2 → 0.0.3
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 +18 -1
- data/lib/enum_set.rb +22 -11
- data/lib/enum_set/version.rb +1 -1
- data/spec/enum_set_spec.rb +108 -0
- metadata +4 -4
- data/spec/enum_many_spec.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3682009c6b023e8c935a2227c7d4304f0956b595
|
4
|
+
data.tar.gz: 5ba288b5a0c68ae9f95470e4f309d3c44d8386e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 620ec3609ae8b28ba87d669b37ae73316d54ec2e52a7d810982717d637b20bc84a8a15638196b1599f9285f6fe358e4ccb7b542dd8c563782dcc0126d3128250
|
7
|
+
data.tar.gz: 4754ead9b98b762babe767f12054e6c19f35c4a8fc16de8ffd4fee98862dbb948bba7fa447b0c9dd3a1ffa17e9f16a2267a89f111edd67d9ce806a886e39ae4b
|
data/README.md
CHANGED
@@ -18,14 +18,30 @@ as well as an array setter.
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
+
### Array Specification
|
22
|
+
|
21
23
|
```ruby
|
22
24
|
# user.rb
|
23
25
|
class User < ActiveRecord::Base
|
24
26
|
include EnumSet
|
25
27
|
enum_set roles: [:admin, :super_user, :kaiser]
|
26
28
|
end
|
29
|
+
```
|
30
|
+
|
31
|
+
### Hash Specification
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
# user.rb
|
35
|
+
class User < ActiveRecord::Base
|
36
|
+
include EnumSet
|
37
|
+
# N.B.: values must be powers of 2
|
38
|
+
enum_set roles: { admin: 1, super_user: 4, kaiser: 256 }
|
39
|
+
end
|
40
|
+
```
|
41
|
+
|
42
|
+
### Elsewhere
|
27
43
|
|
28
|
-
|
44
|
+
```ruby
|
29
45
|
user = User.create(roles: [:super_user])
|
30
46
|
|
31
47
|
user.super_user? # => true
|
@@ -35,6 +51,7 @@ super_users = User.super_user.all # will include `user`
|
|
35
51
|
|
36
52
|
user.roles <<= :kaiser # Adds `:kaiser` role to `user`
|
37
53
|
user.roles # => [:super_user, :kaiser]
|
54
|
+
user.roles <<= :gender # raises `EnumSet::EnumError`, since `:gender` isn't a role
|
38
55
|
```
|
39
56
|
|
40
57
|
## Notes
|
data/lib/enum_set.rb
CHANGED
@@ -10,8 +10,15 @@ module EnumSet
|
|
10
10
|
module ClassMethods
|
11
11
|
def enum_set(enums)
|
12
12
|
enums.each do |column, names|
|
13
|
-
names.
|
14
|
-
|
13
|
+
if !names.is_a?(Hash)
|
14
|
+
names = Hash[
|
15
|
+
names.each_with_index.map do |name, i|
|
16
|
+
[name, 1 << i]
|
17
|
+
end
|
18
|
+
]
|
19
|
+
end
|
20
|
+
|
21
|
+
names_with_bits = names.symbolize_keys
|
15
22
|
|
16
23
|
define_method :"#{column}_bitfield" do
|
17
24
|
self[column] || 0
|
@@ -27,16 +34,20 @@ module EnumSet
|
|
27
34
|
}
|
28
35
|
end
|
29
36
|
|
30
|
-
define_method :"#{column}=" do |
|
31
|
-
|
37
|
+
define_method :"#{column}=" do |values|
|
38
|
+
case values
|
39
|
+
when Array
|
40
|
+
values.each do |val|
|
41
|
+
raise EnumError.new("Unrecognized value for #{column}: #{val.inspect}") unless names.include?(val)
|
42
|
+
end
|
32
43
|
|
33
|
-
|
34
|
-
raise EnumError.new("Unrecognized value for #{column}: #{val.inspect}") unless names.include?(val)
|
35
|
-
end
|
44
|
+
current_value = send("#{column}_bitfield")
|
36
45
|
|
37
|
-
|
38
|
-
|
39
|
-
|
46
|
+
new_value = values.reduce(current_value) do |acc, val|
|
47
|
+
acc | names_with_bits[val.to_sym]
|
48
|
+
end
|
49
|
+
when Fixnum
|
50
|
+
new_value = values
|
40
51
|
end
|
41
52
|
|
42
53
|
self[column] = new_value
|
@@ -44,7 +55,7 @@ module EnumSet
|
|
44
55
|
end
|
45
56
|
|
46
57
|
define_method column do
|
47
|
-
|
58
|
+
names_with_bits.keys.select { |name| send(:"#{name}?") }
|
48
59
|
end
|
49
60
|
end
|
50
61
|
end
|
data/lib/enum_set/version.rb
CHANGED
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'database'
|
2
|
+
require 'enum_set'
|
3
|
+
|
4
|
+
describe EnumSet do
|
5
|
+
class User < ActiveRecord::Base
|
6
|
+
end
|
7
|
+
|
8
|
+
context 'when the enum is defined with a hash' do
|
9
|
+
class UserWithHashRoles < User
|
10
|
+
include EnumSet
|
11
|
+
|
12
|
+
enum_set roles: { king: 16, kaiser: 256 }
|
13
|
+
end
|
14
|
+
|
15
|
+
let!(:user) { UserWithHashRoles.create!(:roles => [:kaiser]) }
|
16
|
+
|
17
|
+
it 'defines a boolean method for each value' do
|
18
|
+
expect(user).to be_kaiser
|
19
|
+
expect(user).to_not be_king
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'retrieves applicable enum values' do
|
23
|
+
expect(user.roles).to eq [:kaiser]
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'array setters' do
|
27
|
+
it 'lets enum values be set' do
|
28
|
+
user.roles <<= :king
|
29
|
+
user.save!
|
30
|
+
expect(user.reload).to be_king
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when a nonexistent enum value is provided' do
|
34
|
+
it 'raises a NameError' do
|
35
|
+
expect {
|
36
|
+
user.roles <<= :gender
|
37
|
+
}.to raise_error EnumSet::EnumError
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'integer setters' do
|
43
|
+
let(:kaiser) { 256 }
|
44
|
+
|
45
|
+
it 'lets enum values be set by integers' do
|
46
|
+
user.roles = kaiser
|
47
|
+
expect(user).to be_kaiser
|
48
|
+
expect(user).to_not be_king
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'scopes by enum value' do
|
53
|
+
expect(UserWithHashRoles.kaiser).to include user
|
54
|
+
expect(UserWithHashRoles.king).to_not include user
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when the enum is defined with an array' do
|
60
|
+
class UserWithArrayRoles < User
|
61
|
+
include EnumSet
|
62
|
+
|
63
|
+
enum_set roles: [:admin, :super_user, :basic_user]
|
64
|
+
end
|
65
|
+
|
66
|
+
let!(:user) { UserWithArrayRoles.create!(:roles => [:super_user]) }
|
67
|
+
|
68
|
+
it 'defines a boolean method for each value' do
|
69
|
+
expect(user).to be_super_user
|
70
|
+
expect(user).to_not be_admin
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'retrieves applicable enum values' do
|
74
|
+
expect(user.roles).to eq [:super_user]
|
75
|
+
end
|
76
|
+
|
77
|
+
describe 'array setters' do
|
78
|
+
it 'lets enum values be set' do
|
79
|
+
user.roles <<= :admin
|
80
|
+
user.save!
|
81
|
+
expect(user.reload).to be_admin
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'when a nonexistent enum value is provided' do
|
85
|
+
it 'raises a NameError' do
|
86
|
+
expect {
|
87
|
+
user.roles <<= :gender
|
88
|
+
}.to raise_error EnumSet::EnumError
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe 'integer setters' do
|
94
|
+
let(:admin_and_basic_user) { 0b101 }
|
95
|
+
|
96
|
+
it 'lets enum values be set by integers' do
|
97
|
+
user.roles = admin_and_basic_user
|
98
|
+
expect(user).to be_admin
|
99
|
+
expect(user).to be_basic_user
|
100
|
+
expect(user).to_not be_super_user
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'scopes by enum value' do
|
105
|
+
expect(UserWithArrayRoles.super_user).to include user
|
106
|
+
expect(UserWithArrayRoles.admin).to_not include user
|
107
|
+
end
|
108
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enum_set
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bree Stanwyck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -111,7 +111,7 @@ files:
|
|
111
111
|
- lib/enum_set.rb
|
112
112
|
- lib/enum_set/version.rb
|
113
113
|
- spec/database.rb
|
114
|
-
- spec/
|
114
|
+
- spec/enum_set_spec.rb
|
115
115
|
homepage: https://github.com/breestanwyck/enum_set
|
116
116
|
licenses:
|
117
117
|
- MIT
|
@@ -139,5 +139,5 @@ summary: Allows using a single integer column as a set of booleans, with bitfiel
|
|
139
139
|
storage.
|
140
140
|
test_files:
|
141
141
|
- spec/database.rb
|
142
|
-
- spec/
|
142
|
+
- spec/enum_set_spec.rb
|
143
143
|
has_rdoc:
|
data/spec/enum_many_spec.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'database'
|
2
|
-
require 'enum_set'
|
3
|
-
|
4
|
-
describe EnumSet do
|
5
|
-
class User < ActiveRecord::Base
|
6
|
-
include EnumSet
|
7
|
-
|
8
|
-
enum_set roles: [:admin, :super_user, :basic_user]
|
9
|
-
end
|
10
|
-
|
11
|
-
let!(:user) { User.create!(:roles => [:super_user]) }
|
12
|
-
|
13
|
-
it 'defines a boolean method for each value' do
|
14
|
-
expect(user).to be_super_user
|
15
|
-
expect(user).to_not be_admin
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'retrieves applicable enum values' do
|
19
|
-
expect(user.roles).to eq [:super_user]
|
20
|
-
end
|
21
|
-
|
22
|
-
describe 'array setters' do
|
23
|
-
it 'lets enum values be set' do
|
24
|
-
user.roles <<= :admin
|
25
|
-
user.save!
|
26
|
-
expect(user.reload).to be_admin
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'when a nonexistent enum value is provided' do
|
30
|
-
it 'raises a NameError' do
|
31
|
-
expect {
|
32
|
-
user.roles <<= :gender
|
33
|
-
}.to raise_error EnumSet::EnumError
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'scopes by enum value' do
|
39
|
-
expect(User.super_user).to include user
|
40
|
-
expect(User.admin).to_not include user
|
41
|
-
end
|
42
|
-
end
|