enum_set 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|