pjb3-has-bit-field 0.1.1 → 0.2.0
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/VERSION +1 -1
- data/has-bit-field.gemspec +2 -2
- data/lib/has-bit-field.rb +10 -4
- data/test/has-bit-field_test.rb +48 -2
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/has-bit-field.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{has-bit-field}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Paul Barry"]
|
9
|
-
s.date = %q{2009-07-
|
9
|
+
s.date = %q{2009-07-19}
|
10
10
|
s.email = %q{mail@paulbarry.com}
|
11
11
|
s.extra_rdoc_files = [
|
12
12
|
"LICENSE",
|
data/lib/has-bit-field.rb
CHANGED
@@ -5,20 +5,26 @@ module HasBitField
|
|
5
5
|
# which will be the name of each flag in the bit field
|
6
6
|
def has_bit_field(bit_field_attribute, *args)
|
7
7
|
args.each_with_index do |field,i|
|
8
|
-
|
8
|
+
define_method("#{field}_bit") do
|
9
|
+
(1 << i)
|
10
|
+
end
|
9
11
|
define_method(field) do
|
10
|
-
(send(bit_field_attribute) &
|
12
|
+
(send(bit_field_attribute) & send("#{field}_bit")) != 0
|
11
13
|
end
|
12
14
|
define_method("#{field}?") do
|
13
15
|
send(field)
|
14
16
|
end
|
15
17
|
define_method("#{field}=") do |v|
|
16
18
|
if v.to_s == "true" || v.to_s == "1"
|
17
|
-
send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) |
|
19
|
+
send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) | send("#{field}_bit")))
|
18
20
|
else
|
19
|
-
send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) & ~
|
21
|
+
send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) & ~send("#{field}_bit")))
|
20
22
|
end
|
21
23
|
end
|
24
|
+
if(respond_to?(:named_scope))
|
25
|
+
named_scope field, :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) != 0", (1 << i)]
|
26
|
+
named_scope "not_#{field}", :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) = 0", (1 << i)]
|
27
|
+
end
|
22
28
|
end
|
23
29
|
end
|
24
30
|
end
|
data/test/has-bit-field_test.rb
CHANGED
@@ -1,8 +1,23 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
2
|
|
3
|
-
|
3
|
+
require 'rubygems'
|
4
|
+
require 'activerecord'
|
5
|
+
require File.join(File.dirname(__FILE__), "../rails/init")
|
6
|
+
|
7
|
+
ActiveRecord::Base.establish_connection(
|
8
|
+
:adapter => "sqlite3",
|
9
|
+
:database => ":memory:"
|
10
|
+
)
|
11
|
+
|
12
|
+
#ActiveRecord::Base.logger = Logger.new(STDOUT)
|
13
|
+
|
14
|
+
ActiveRecord::Base.connection.create_table(:people) do |t|
|
15
|
+
t.integer :bit_field, :default => 0
|
16
|
+
end
|
17
|
+
|
18
|
+
class Person < ActiveRecord::Base
|
4
19
|
extend HasBitField
|
5
|
-
attr_accessor :bit_field
|
20
|
+
#attr_accessor :bit_field
|
6
21
|
has_bit_field :bit_field, :likes_ice_cream, :plays_golf, :watches_tv, :reads_books
|
7
22
|
end
|
8
23
|
|
@@ -14,6 +29,11 @@ class HasBitFieldTest < Test::Unit::TestCase
|
|
14
29
|
assert p.respond_to?("#{f}="), "Expected #{p.inspect} to respond to #{f}="
|
15
30
|
end
|
16
31
|
|
32
|
+
assert_equal p.likes_ice_cream_bit, (1 << 0)
|
33
|
+
assert_equal p.plays_golf_bit, (1 << 1)
|
34
|
+
assert_equal p.watches_tv_bit, (1 << 2)
|
35
|
+
assert_equal p.reads_books_bit, (1 << 3)
|
36
|
+
|
17
37
|
p.likes_ice_cream = true
|
18
38
|
assert p.likes_ice_cream?
|
19
39
|
assert !p.plays_golf?
|
@@ -56,4 +76,30 @@ class HasBitFieldTest < Test::Unit::TestCase
|
|
56
76
|
assert !p.reads_books?
|
57
77
|
end
|
58
78
|
|
79
|
+
def test_named_scopes
|
80
|
+
a = Person.new
|
81
|
+
a.plays_golf = true
|
82
|
+
a.reads_books = true
|
83
|
+
assert a.save
|
84
|
+
|
85
|
+
b = Person.new
|
86
|
+
b.likes_ice_cream = true
|
87
|
+
b.watches_tv = true
|
88
|
+
assert b.save
|
89
|
+
|
90
|
+
c = Person.create!
|
91
|
+
|
92
|
+
assert_equal [b], Person.likes_ice_cream.all(:order => "id")
|
93
|
+
assert_equal [a,c], Person.not_likes_ice_cream.all(:order => "id")
|
94
|
+
|
95
|
+
assert_equal [a], Person.plays_golf.all(:order => "id")
|
96
|
+
assert_equal [b,c], Person.not_plays_golf.all(:order => "id")
|
97
|
+
|
98
|
+
assert_equal [b], Person.watches_tv.all(:order => "id")
|
99
|
+
assert_equal [a,c], Person.not_watches_tv.all(:order => "id")
|
100
|
+
|
101
|
+
assert_equal [a], Person.reads_books.all(:order => "id")
|
102
|
+
assert_equal [b,c], Person.not_reads_books.all(:order => "id")
|
103
|
+
end
|
104
|
+
|
59
105
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pjb3-has-bit-field
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Barry
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-19 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|