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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 490f7a3dc76517686a72eac0e8ddb6d09bc44efc
4
- data.tar.gz: 5eec2d3ed8f99f8cda35914b12ce88e1cab2b7a0
3
+ metadata.gz: 3682009c6b023e8c935a2227c7d4304f0956b595
4
+ data.tar.gz: 5ba288b5a0c68ae9f95470e4f309d3c44d8386e1
5
5
  SHA512:
6
- metadata.gz: 8bb1aa81251e9dd0d7a15e72ff75aaddaf988d5cddceda1cc6c8baf05a64f256ac034d8286c0dcc32ec62c8b15d1e42fc73e3c51975420b75286f3ec58c11222
7
- data.tar.gz: 56f0f8a5cca344fca525be8189d2905b5c0472de361a40ff6e910da8602db8135b5eb6c0e567f2c2ab53ad140714a8dde93e3bdf5d42a520dc1b1c8a7fb07bbd
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
- # elsewhere.rb
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.map!(&:to_sym)
14
- names_with_bits = names.each_with_index.map { |name, i| [name, 1 << i] }
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 |array|
31
- new_value = send("#{column}_bitfield")
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
- array.each do |val|
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
- array.each do |val|
38
- bit = names_with_bits.find { |name,_| name == val.to_sym }.last
39
- new_value |= bit
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
- names.select { |name| send(:"#{name}?") }
58
+ names_with_bits.keys.select { |name| send(:"#{name}?") }
48
59
  end
49
60
  end
50
61
  end
@@ -1,3 +1,3 @@
1
1
  module EnumSet
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -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.2
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-06 00:00:00.000000000 Z
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/enum_many_spec.rb
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/enum_many_spec.rb
142
+ - spec/enum_set_spec.rb
143
143
  has_rdoc:
@@ -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