has-bit-field 0.3.2 → 1.0.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/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