bitfields 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
@@ -80,9 +80,11 @@ end
80
80
  def test_speed(bit_counts, query_mode)
81
81
  result = bit_counts.map do |bit_count|
82
82
  sql = User.bitfield_sql({"bit_#{bit_count}_1" => true}, :query_mode => query_mode)
83
- # puts sql[0..100]
83
+ sql = "select SQL_NO_CACHE count(*) from users where #{sql}"
84
+ # puts User.connection.select_all("EXPLAIN #{sql}").inspect
85
+ # puts sql[0..100]
84
86
  time = benchmark do
85
- User.count sql
87
+ User.connection.execute sql
86
88
  end
87
89
  puts "#{bit_count} -> #{time}"
88
90
  [bit_count, time]
data/bitfields.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{bitfields}
8
- s.version = "0.2.0"
8
+ s.version = "0.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Michael Grosser"]
12
- s.date = %q{2011-01-19}
12
+ s.date = %q{2011-01-22}
13
13
  s.email = %q{grosser.michael@gmail.com}
14
14
  s.extra_rdoc_files = [
15
15
  "README.markdown"
data/lib/bitfields.rb CHANGED
@@ -115,7 +115,12 @@ module Bitfields
115
115
  end
116
116
 
117
117
  module InstanceMethods
118
+ def bitfield_values(column)
119
+ Hash[bitfields[column.to_sym].map{|bit_name, bit| [bit_name, bitfield_value(bit_name)]}]
120
+ end
121
+
118
122
  private
123
+
119
124
  def bitfield_value(bit_name)
120
125
  column, bit, current_value = bitfield_info(bit_name)
121
126
  current_value & bit != 0
@@ -36,6 +36,10 @@ class BitOperatorMode < ActiveRecord::Base
36
36
  bitfield :bits, 1 => :seller, 2 => :insane, :query_mode => :bit_operator
37
37
  end
38
38
 
39
+ class ManyBitsUser < User
40
+ set_table_name 'users'
41
+ end
42
+
39
43
  describe Bitfields do
40
44
  before do
41
45
  User.delete_all
@@ -45,6 +49,17 @@ describe Bitfields do
45
49
  it "parses them correctly" do
46
50
  User.bitfields.should == {:bits => {:seller => 1, :insane => 2, :stupid => 4}}
47
51
  end
52
+
53
+ it "is fast for huge number of bits" do
54
+ bits = {}
55
+ 0.upto(20) do |bit|
56
+ bits[2**bit] = "my_bit_#{bit}"
57
+ end
58
+
59
+ Timeout.timeout(0.2) do
60
+ ManyBitsUser.class_eval{ bitfield :bits, bits }
61
+ end
62
+ end
48
63
  end
49
64
 
50
65
  describe :bitfield_options do
@@ -65,6 +80,13 @@ describe Bitfields do
65
80
  end
66
81
  end
67
82
 
83
+ describe :bitfield_values do
84
+ it "contains all bits with values" do
85
+ User.new.bitfield_values(:bits).should == {:insane=>false, :stupid=>false, :seller=>false}
86
+ User.new(:bits => 15).bitfield_values(:bits).should == {:insane=>true, :stupid=>true, :seller=>true}
87
+ end
88
+ end
89
+
68
90
  describe 'attribute accessors' do
69
91
  it "has everything on false by default" do
70
92
  User.new.seller.should == false
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,7 @@ if ENV['VERSION']
5
5
  end
6
6
  $LOAD_PATH << 'lib'
7
7
  require 'bitfields'
8
+ require 'timeout'
8
9
 
9
10
  require 'active_record'
10
11
  puts "Using ActiveRecord #{ActiveRecord::VERSION::STRING}"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitfields
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 0
10
- version: 0.2.0
9
+ - 1
10
+ version: 0.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michael Grosser
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-19 00:00:00 +01:00
18
+ date: 2011-01-22 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies: []
21
21