has-bit-field 0.3.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,5 +1,4 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem "activerecord"
4
- gem "jeweler"
5
- gem "sqlite3-ruby"
3
+ # Specify your gem's dependencies in has-bit-field.gemspec
4
+ gemspec
@@ -0,0 +1,20 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ has-bit-field (1.0.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ activerecord (2.3.10)
10
+ activesupport (= 2.3.10)
11
+ activesupport (2.3.10)
12
+ sqlite3-ruby (1.3.2)
13
+
14
+ PLATFORMS
15
+ ruby
16
+
17
+ DEPENDENCIES
18
+ activerecord (~> 2.3.5)
19
+ has-bit-field!
20
+ sqlite3-ruby
data/Rakefile CHANGED
@@ -1,20 +1,7 @@
1
- require 'rubygems'
2
- require 'rake'
3
-
4
- begin
5
- require 'jeweler'
6
- Jeweler::Tasks.new do |gem|
7
- gem.name = "has-bit-field"
8
- gem.summary = %Q{Provides an easy way for dealing with bit fields and active record}
9
- gem.email = "mail@paulbarry.com"
10
- gem.homepage = "http://github.com/pjb3/has-bit-field"
11
- gem.authors = ["Paul Barry"]
12
- end
13
- Jeweler::GemcutterTasks.new
14
- rescue LoadError
15
- puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
16
- end
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
17
3
 
4
+ require 'rake'
18
5
  require 'rake/testtask'
19
6
  Rake::TestTask.new(:test) do |test|
20
7
  test.libs << 'lib' << 'test'
@@ -22,34 +9,4 @@ Rake::TestTask.new(:test) do |test|
22
9
  test.verbose = true
23
10
  end
24
11
 
25
- begin
26
- require 'rcov/rcovtask'
27
- Rcov::RcovTask.new do |test|
28
- test.libs << 'test'
29
- test.pattern = 'test/**/*_test.rb'
30
- test.verbose = true
31
- end
32
- rescue LoadError
33
- task :rcov do
34
- abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
35
- end
36
- end
37
-
38
-
39
12
  task :default => :test
40
-
41
- require 'rake/rdoctask'
42
- Rake::RDocTask.new do |rdoc|
43
- if File.exist?('VERSION.yml')
44
- config = YAML.load(File.read('VERSION.yml'))
45
- version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
46
- else
47
- version = ""
48
- end
49
-
50
- rdoc.rdoc_dir = 'rdoc'
51
- rdoc.title = "has-bit-field #{version}"
52
- rdoc.rdoc_files.include('README*')
53
- rdoc.rdoc_files.include('lib/**/*.rb')
54
- end
55
-
@@ -1,53 +1,23 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "has-bit-field/version"
5
4
 
6
5
  Gem::Specification.new do |s|
7
- s.name = %q{has-bit-field}
8
- s.version = "0.3.2"
6
+ s.name = "has-bit-field"
7
+ s.version = Has::Bit::Field::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Paul Barry"]
10
+ s.email = ["mail@paulbarry.com"]
11
+ s.homepage = "http://github.com/pjb3/has-bit-field"
12
+ s.summary = "Provides an easy way to work with bit fields in active record"
13
+ s.description = "Provides an easy way to work with bit fields in active record"
9
14
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Paul Barry"]
12
- s.date = %q{2010-08-03}
13
- s.email = %q{mail@paulbarry.com}
14
- s.extra_rdoc_files = [
15
- "LICENSE",
16
- "README.md"
17
- ]
18
- s.files = [
19
- ".document",
20
- ".gitignore",
21
- ".rvmrc",
22
- "Gemfile",
23
- "LICENSE",
24
- "README.md",
25
- "Rakefile",
26
- "VERSION",
27
- "has-bit-field.gemspec",
28
- "lib/has-bit-field.rb",
29
- "rails/init.rb",
30
- "test/has-bit-field_test.rb",
31
- "test/test_helper.rb"
32
- ]
33
- s.homepage = %q{http://github.com/pjb3/has-bit-field}
34
- s.rdoc_options = ["--charset=UTF-8"]
35
- s.require_paths = ["lib"]
36
- s.rubygems_version = %q{1.3.7}
37
- s.summary = %q{Provides an easy way for dealing with bit fields and active record}
38
- s.test_files = [
39
- "test/has-bit-field_test.rb",
40
- "test/test_helper.rb"
41
- ]
42
-
43
- if s.respond_to? :specification_version then
44
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
45
- s.specification_version = 3
15
+ s.rubyforge_project = "has-bit-field"
16
+ s.add_development_dependency "sqlite3-ruby"
17
+ s.add_development_dependency "activerecord", "~> 2.3.5"
46
18
 
47
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
48
- else
49
- end
50
- else
51
- end
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
52
23
  end
53
-
@@ -5,31 +5,47 @@ 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
- (class << self; self end).send(:define_method, "#{field}_bit") do
9
- (1 << i)
10
- end
11
- define_method(field) do
12
- (send(bit_field_attribute).to_i & self.class.send("#{field}_bit")) != 0
13
- end
14
- define_method("#{field}?") do
15
- send(field)
16
- end
17
- define_method("#{field}=") do |v|
18
- if v.to_s == "true" || v.to_s == "1"
19
- send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) | self.class.send("#{field}_bit")))
20
- else
21
- send("#{bit_field_attribute}=", ((send(bit_field_attribute) || 0) & ~self.class.send("#{field}_bit")))
8
+ class_eval %{
9
+ class << self
10
+ def #{field}_bit
11
+ (1 << #{i})
12
+ end
22
13
  end
23
- end
24
- define_method("#{field}_was") do
25
- (send("#{bit_field_attribute}_was") & self.class.send("#{field}_bit")) != 0
26
- end
27
- define_method("#{field}_changed?") do
28
- send(field) != send("#{field}_was")
29
- end
14
+
15
+ def #{field}
16
+ (#{bit_field_attribute} & self.class.#{field}_bit) != 0
17
+ end
18
+
19
+ alias #{field}? #{field}
20
+
21
+ def #{field}=(v)
22
+ if v.to_s == "true" || v.to_s == "1"
23
+ self.#{bit_field_attribute} = (#{bit_field_attribute} || 0) | self.class.#{field}_bit
24
+ else
25
+ self.#{bit_field_attribute} = (#{bit_field_attribute} || 0) & ~self.class.#{field}_bit
26
+ end
27
+ end
28
+
29
+ def #{field}_was
30
+ (#{bit_field_attribute}_was & self.class.#{field}_bit) != 0
31
+ end
32
+
33
+ def #{field}_changed?
34
+ #{field} != #{field}_was
35
+ end
36
+ }
30
37
  if(respond_to?(:named_scope))
31
- named_scope field, :conditions => ["#{table_name}.#{bit_field_attribute} IS NOT NULL AND (#{table_name}.#{bit_field_attribute} & ?) != 0", send("#{field}_bit")]
32
- named_scope "not_#{field}", :conditions => ["#{table_name}.#{bit_field_attribute} IS NULL OR (#{table_name}.#{bit_field_attribute} & ?) = 0", send("#{field}_bit")]
38
+ if columns_hash[bit_field_attribute.to_s].null
39
+ class_eval %{
40
+ named_scope :#{field}, :conditions => ["#{table_name}.#{bit_field_attribute} IS NOT NULL AND (#{table_name}.#{bit_field_attribute} & ?) != 0", #{field}_bit]
41
+ named_scope :not_#{field}, :conditions => ["#{table_name}.#{bit_field_attribute} IS NULL OR (#{table_name}.#{bit_field_attribute} & ?) = 0", #{field}_bit]
42
+ }
43
+ else
44
+ class_eval %{
45
+ named_scope :#{field}, :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) != 0", #{field}_bit]
46
+ named_scope :not_#{field}, :conditions => ["(#{table_name}.#{bit_field_attribute} & ?) = 0", #{field}_bit]
47
+ }
48
+ end
33
49
  end
34
50
  end
35
51
  end
@@ -0,0 +1,7 @@
1
+ module Has
2
+ module Bit
3
+ module Field
4
+ VERSION = "1.0.0"
5
+ end
6
+ end
7
+ end
@@ -8,7 +8,7 @@ ActiveRecord::Base.establish_connection(
8
8
  #ActiveRecord::Base.logger = Logger.new(STDOUT)
9
9
 
10
10
  ActiveRecord::Base.connection.create_table(:people) do |t|
11
- t.integer :bit_field
11
+ t.integer :bit_field, :null => true
12
12
  end
13
13
 
14
14
  class Person < ActiveRecord::Base
@@ -19,8 +19,8 @@ end
19
19
 
20
20
 
21
21
  ActiveRecord::Base.connection.create_table(:skills) do |t|
22
- t.integer :outdoor_bit_field, :default => 0
23
- t.integer :indoor_bit_field, :default => 0
22
+ t.integer :outdoor_bit_field, :default => 0, :null => false
23
+ t.integer :indoor_bit_field, :default => 0, :null => false
24
24
  end
25
25
 
26
26
  class Skill < ActiveRecord::Base
@@ -89,7 +89,7 @@ class HasBitFieldTest < Test::Unit::TestCase
89
89
  assert !p.reads_books?
90
90
  end
91
91
 
92
- def test_named_scopes
92
+ def test_named_scopes_on_nullable_column
93
93
  Person.delete_all
94
94
  a = Person.new
95
95
  a.plays_golf = true
@@ -101,9 +101,9 @@ class HasBitFieldTest < Test::Unit::TestCase
101
101
  b.watches_tv = true
102
102
  assert b.save
103
103
 
104
- c = Person.create!
104
+ c = Person.create! :bit_field => 0
105
105
 
106
- assert_equal [b], Person.likes_ice_cream.all(:order => "id")
106
+ assert_equal [b], Person.likes_ice_cream.all(:order => "id")
107
107
  assert_equal [a,c], Person.not_likes_ice_cream.all(:order => "id")
108
108
 
109
109
  assert_equal [a], Person.plays_golf.all(:order => "id")
@@ -116,6 +116,32 @@ class HasBitFieldTest < Test::Unit::TestCase
116
116
  assert_equal [b,c], Person.not_reads_books.all(:order => "id")
117
117
  end
118
118
 
119
+ def test_named_scopes_on_non_nullable_column
120
+ Skill.delete_all
121
+ a = Skill.new
122
+ a.plays_piano = true
123
+ a.chops_trees = true
124
+ a.mops_floors = true
125
+ assert a.save, a.errors.full_messages.join(", ")
126
+
127
+ b = Skill.new
128
+ b.plays_piano = true
129
+ b.chops_trees = true
130
+ b.makes_soup = true
131
+ assert b.save, b.errors.full_messages.join(", ")
132
+
133
+ c = Skill.create! :plays_piano => true, :chops_trees => true
134
+
135
+ assert_equal [a,b,c], Skill.plays_piano.all(:order => "id")
136
+ assert_equal [], Skill.not_plays_piano.all(:order => "id")
137
+
138
+ assert_equal [a], Skill.mops_floors.all(:order => "id")
139
+ assert_equal [b,c], Skill.not_mops_floors.all(:order => "id")
140
+
141
+ assert_equal [b], Skill.makes_soup.all(:order => "id")
142
+ assert_equal [a,c], Skill.not_makes_soup.all(:order => "id")
143
+ end
144
+
119
145
  def test_dirty_attributes
120
146
  Person.delete_all
121
147
  a = Person.new
@@ -142,17 +168,17 @@ class HasBitFieldTest < Test::Unit::TestCase
142
168
  assert !s.cuts_hedges
143
169
 
144
170
  assert !s.valid?
145
- assert s.errors.on(:chops_trees)
171
+ assert s.errors[:chops_trees]
146
172
 
147
173
  s.chops_trees = false
148
174
  assert !s.chops_trees?
149
175
  assert !s.valid?
150
- assert s.errors.on(:chops_trees)
176
+ assert s.errors[:chops_trees]
151
177
 
152
178
  s.chops_trees = true
153
179
  assert s.chops_trees?
154
180
  assert s.valid?
155
- assert !s.errors.on(:chops_trees)
181
+ assert !s.errors[:chops_trees]
156
182
  assert s.save
157
183
  end
158
184
 
@@ -166,17 +192,17 @@ class HasBitFieldTest < Test::Unit::TestCase
166
192
  assert !s.makes_soup
167
193
 
168
194
  assert !s.valid?
169
- assert s.errors.on(:plays_piano)
195
+ assert s.errors[:plays_piano]
170
196
 
171
197
  s.plays_piano = false
172
198
  assert !s.plays_piano?
173
199
  assert !s.valid?
174
- assert s.errors.on(:plays_piano)
200
+ assert s.errors[:plays_piano]
175
201
 
176
202
  s.plays_piano = true
177
203
  assert s.plays_piano?
178
204
  assert s.valid?
179
- assert !s.errors.on(:plays_piano)
205
+ assert !s.errors[:plays_piano]
180
206
  assert s.save
181
207
  end
182
208
 
@@ -9,3 +9,5 @@ require 'test/unit'
9
9
  require 'active_record'
10
10
  require File.join(File.dirname(__FILE__), "../rails/init")
11
11
  require 'has-bit-field'
12
+
13
+ #ActiveRecord::Base.logger = Logger.new($stdout)
metadata CHANGED
@@ -4,10 +4,10 @@ version: !ruby/object:Gem::Version
4
4
  hash: 23
5
5
  prerelease: false
6
6
  segments:
7
+ - 1
7
8
  - 0
8
- - 3
9
- - 2
10
- version: 0.3.2
9
+ - 0
10
+ version: 1.0.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Paul Barry
@@ -15,30 +15,60 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-03 00:00:00 -04:00
18
+ date: 2010-11-23 00:00:00 -05:00
19
19
  default_executable:
20
- dependencies: []
21
-
22
- description:
23
- email: mail@paulbarry.com
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: sqlite3-ruby
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: activerecord
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 9
44
+ segments:
45
+ - 2
46
+ - 3
47
+ - 5
48
+ version: 2.3.5
49
+ type: :development
50
+ version_requirements: *id002
51
+ description: Provides an easy way to work with bit fields in active record
52
+ email:
53
+ - mail@paulbarry.com
24
54
  executables: []
25
55
 
26
56
  extensions: []
27
57
 
28
- extra_rdoc_files:
29
- - LICENSE
30
- - README.md
58
+ extra_rdoc_files: []
59
+
31
60
  files:
32
61
  - .document
33
62
  - .gitignore
34
63
  - .rvmrc
35
64
  - Gemfile
65
+ - Gemfile.lock
36
66
  - LICENSE
37
67
  - README.md
38
68
  - Rakefile
39
- - VERSION
40
69
  - has-bit-field.gemspec
41
70
  - lib/has-bit-field.rb
71
+ - lib/has-bit-field/version.rb
42
72
  - rails/init.rb
43
73
  - test/has-bit-field_test.rb
44
74
  - test/test_helper.rb
@@ -47,8 +77,8 @@ homepage: http://github.com/pjb3/has-bit-field
47
77
  licenses: []
48
78
 
49
79
  post_install_message:
50
- rdoc_options:
51
- - --charset=UTF-8
80
+ rdoc_options: []
81
+
52
82
  require_paths:
53
83
  - lib
54
84
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -71,11 +101,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
71
101
  version: "0"
72
102
  requirements: []
73
103
 
74
- rubyforge_project:
104
+ rubyforge_project: has-bit-field
75
105
  rubygems_version: 1.3.7
76
106
  signing_key:
77
107
  specification_version: 3
78
- summary: Provides an easy way for dealing with bit fields and active record
108
+ summary: Provides an easy way to work with bit fields in active record
79
109
  test_files:
80
110
  - test/has-bit-field_test.rb
81
111
  - test/test_helper.rb
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.3.2