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 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