bitmask_attributes 0.2.2 → 0.2.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.
- data/.rvmrc +1 -1
- data/Gemfile +2 -1
- data/Gemfile.lock +21 -17
- data/README.md +8 -1
- data/lib/bitmask_attributes/definition.rb +16 -7
- data/lib/bitmask_attributes/value_proxy.rb +6 -0
- data/lib/bitmask_attributes/version.rb +1 -1
- data/test/bitmask_attributes_test.rb +8 -0
- metadata +5 -5
data/.rvmrc
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
rvm use 1.9.
|
|
1
|
+
rvm use 1.9.3@bitmask_attributes --create --install
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,37 +1,41 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
bitmask_attributes (0.2.
|
|
4
|
+
bitmask_attributes (0.2.2)
|
|
5
5
|
activerecord (~> 3.0)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: http://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
activemodel (3.
|
|
11
|
-
activesupport (= 3.
|
|
12
|
-
builder (~>
|
|
13
|
-
i18n (~> 0.
|
|
14
|
-
activerecord (3.
|
|
15
|
-
activemodel (= 3.
|
|
16
|
-
activesupport (= 3.
|
|
17
|
-
arel (~> 2.
|
|
18
|
-
tzinfo (~> 0.3.
|
|
19
|
-
activesupport (3.
|
|
10
|
+
activemodel (3.1.1)
|
|
11
|
+
activesupport (= 3.1.1)
|
|
12
|
+
builder (~> 3.0.0)
|
|
13
|
+
i18n (~> 0.6)
|
|
14
|
+
activerecord (3.1.1)
|
|
15
|
+
activemodel (= 3.1.1)
|
|
16
|
+
activesupport (= 3.1.1)
|
|
17
|
+
arel (~> 2.2.1)
|
|
18
|
+
tzinfo (~> 0.3.29)
|
|
19
|
+
activesupport (3.1.1)
|
|
20
|
+
multi_json (~> 1.0)
|
|
20
21
|
ansi (1.3.0)
|
|
21
|
-
arel (2.
|
|
22
|
-
builder (
|
|
23
|
-
i18n (0.
|
|
22
|
+
arel (2.2.1)
|
|
23
|
+
builder (3.0.0)
|
|
24
|
+
i18n (0.6.0)
|
|
25
|
+
multi_json (1.0.3)
|
|
26
|
+
rake (0.9.2.2)
|
|
24
27
|
shoulda (2.11.3)
|
|
25
|
-
sqlite3 (1.3.
|
|
28
|
+
sqlite3 (1.3.4)
|
|
26
29
|
turn (0.8.2)
|
|
27
30
|
ansi (>= 1.2.2)
|
|
28
|
-
tzinfo (0.3.
|
|
31
|
+
tzinfo (0.3.30)
|
|
29
32
|
|
|
30
33
|
PLATFORMS
|
|
31
34
|
ruby
|
|
32
35
|
|
|
33
36
|
DEPENDENCIES
|
|
34
37
|
bitmask_attributes!
|
|
38
|
+
rake
|
|
35
39
|
shoulda
|
|
36
|
-
sqlite3
|
|
40
|
+
sqlite3 (>= 1.3.4)
|
|
37
41
|
turn
|
data/README.md
CHANGED
|
@@ -77,8 +77,15 @@ Find records without any bitmask set:
|
|
|
77
77
|
|
|
78
78
|
User.without_roles
|
|
79
79
|
# => (all users without a role)
|
|
80
|
+
User.no_roles
|
|
81
|
+
# => (all users without a role)
|
|
82
|
+
|
|
83
|
+
Find records without a specific attribute.
|
|
84
|
+
|
|
85
|
+
User.without_roles(:editor)
|
|
86
|
+
# => (all users who are not editors)
|
|
80
87
|
|
|
81
|
-
|
|
88
|
+
Note that "without_" only supports a single attribute argument, and the "no_" method does not support arguments.
|
|
82
89
|
|
|
83
90
|
Adding Methods
|
|
84
91
|
--------------
|
|
@@ -109,35 +109,44 @@ module BitmaskAttributes
|
|
|
109
109
|
scope :with_#{attribute},
|
|
110
110
|
proc { |*values|
|
|
111
111
|
if values.blank?
|
|
112
|
-
|
|
112
|
+
where('#{attribute} > 0 OR #{attribute} IS NOT NULL')
|
|
113
113
|
else
|
|
114
114
|
sets = values.map do |value|
|
|
115
115
|
mask = #{model}.bitmask_for_#{attribute}(value)
|
|
116
116
|
"#{attribute} & \#{mask} <> 0"
|
|
117
117
|
end
|
|
118
|
-
|
|
118
|
+
where(sets.join(' AND '))
|
|
119
119
|
end
|
|
120
120
|
}
|
|
121
|
-
scope :without_#{attribute},
|
|
122
|
-
|
|
121
|
+
scope :without_#{attribute},
|
|
122
|
+
proc { |value|
|
|
123
|
+
if value
|
|
124
|
+
mask = #{model}.bitmask_for_#{attribute}(value)
|
|
125
|
+
where("#{attribute} IS NULL OR #{attribute} & ? = 0", mask)
|
|
126
|
+
else
|
|
127
|
+
where("#{attribute} IS NULL OR #{attribute} = 0")
|
|
128
|
+
end
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
scope :no_#{attribute}, where("#{attribute} = 0 OR #{attribute} IS NULL")
|
|
123
132
|
|
|
124
133
|
scope :with_any_#{attribute},
|
|
125
134
|
proc { |*values|
|
|
126
135
|
if values.blank?
|
|
127
|
-
|
|
136
|
+
where('#{attribute} > 0 OR #{attribute} IS NOT NULL')
|
|
128
137
|
else
|
|
129
138
|
sets = values.map do |value|
|
|
130
139
|
mask = #{model}.bitmask_for_#{attribute}(value)
|
|
131
140
|
"#{attribute} & \#{mask} <> 0"
|
|
132
141
|
end
|
|
133
|
-
|
|
142
|
+
where(sets.join(' OR '))
|
|
134
143
|
end
|
|
135
144
|
}
|
|
136
145
|
)
|
|
137
146
|
values.each do |value|
|
|
138
147
|
model.class_eval %(
|
|
139
148
|
scope :#{attribute}_for_#{value},
|
|
140
|
-
|
|
149
|
+
where('#{attribute} & ? <> 0', #{model}.bitmask_for_#{attribute}(:#{value}))
|
|
141
150
|
)
|
|
142
151
|
end
|
|
143
152
|
end
|
|
@@ -13,6 +13,7 @@ module BitmaskAttributes
|
|
|
13
13
|
# = OVERRIDE TO SERIALIZE =
|
|
14
14
|
# =========================
|
|
15
15
|
|
|
16
|
+
alias_method :orig_replace, :replace
|
|
16
17
|
%w(push << delete replace reject! select!).each do |override|
|
|
17
18
|
class_eval(<<-EOEVAL)
|
|
18
19
|
def #{override}(*args)
|
|
@@ -39,8 +40,13 @@ module BitmaskAttributes
|
|
|
39
40
|
end
|
|
40
41
|
end
|
|
41
42
|
|
|
43
|
+
def symbolize!
|
|
44
|
+
orig_replace(map(&:to_sym))
|
|
45
|
+
end
|
|
46
|
+
|
|
42
47
|
def updated!
|
|
43
48
|
validate!
|
|
49
|
+
symbolize!
|
|
44
50
|
uniq!
|
|
45
51
|
serialize!
|
|
46
52
|
end
|
|
@@ -34,7 +34,10 @@ class BitmaskAttributesTest < ActiveSupport::TestCase
|
|
|
34
34
|
assert_stored campaign, :web, :print, :phone
|
|
35
35
|
campaign.medium << :phone
|
|
36
36
|
assert_stored campaign, :web, :print, :phone
|
|
37
|
+
campaign.medium << "phone"
|
|
38
|
+
assert_stored campaign, :web, :print, :phone
|
|
37
39
|
assert_equal 1, campaign.medium.select { |value| value == :phone }.size
|
|
40
|
+
assert_equal 0, campaign.medium.select { |value| value == "phone" }.size
|
|
38
41
|
end
|
|
39
42
|
|
|
40
43
|
should "can assign new values at once to bitmask" do
|
|
@@ -152,6 +155,11 @@ class BitmaskAttributesTest < ActiveSupport::TestCase
|
|
|
152
155
|
|
|
153
156
|
should "support retrieval for no values" do
|
|
154
157
|
assert_equal [@campaign2], @company.campaigns.without_medium
|
|
158
|
+
assert_equal [@campaign2], @company.campaigns.no_medium
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
should "support retrieval without a specific value" do
|
|
162
|
+
assert_equal [@campaign2, @campaign3], @company.campaigns.without_medium(:print)
|
|
155
163
|
end
|
|
156
164
|
end
|
|
157
165
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bitmask_attributes
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.3
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,11 +9,11 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2011-
|
|
12
|
+
date: 2011-11-05 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activerecord
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &70135687914640 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ~>
|
|
@@ -21,7 +21,7 @@ dependencies:
|
|
|
21
21
|
version: '3.0'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *70135687914640
|
|
25
25
|
description: Simple bitmask attribute support for ActiveRecord
|
|
26
26
|
email: joel@developwithstyle.com
|
|
27
27
|
executables: []
|
|
@@ -65,7 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
65
65
|
version: '0'
|
|
66
66
|
requirements: []
|
|
67
67
|
rubyforge_project:
|
|
68
|
-
rubygems_version: 1.8.
|
|
68
|
+
rubygems_version: 1.8.10
|
|
69
69
|
signing_key:
|
|
70
70
|
specification_version: 3
|
|
71
71
|
summary: Simple bitmask attribute support for ActiveRecord
|