bitfields 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fbae8863b34f3374742a6af0481aac9f284cf15b
4
- data.tar.gz: 394e4e9db360d7eecfa030cf072047d3b687a768
3
+ metadata.gz: 08330b3abc50142d13e76b375850bf801e726a62
4
+ data.tar.gz: 7e8000377a4d47a4c58efeb407f49ab416878e47
5
5
  SHA512:
6
- metadata.gz: b32ed7e44546be81ae203e252564c3286bf80ba275de4b8a695ebe3b6d14017a4dca244469443f3edde593475ed89d97954a04314c0a3cca1f25167705c2c6b3
7
- data.tar.gz: 7a63c7f78bb3d884fb9e88283ddc653d8963a1c347c17ec7b3f6a4efc27f345e8a8c5bf37027b4d5ff261e4cb65143c727532e6fc03e810625c95b4abe54af84
6
+ metadata.gz: 83a8a21cc1fb2507d5985c3b88eb88c61a0cfe91d75e18536eab8626bd864d2a8d658e75a2b64b547e9ba81c74dfa7c701f9cfaf4c17671ab147fb50a4c80bc8
7
+ data.tar.gz: 217bd3fca492ccdfac286537c5f228bb08c9ecacdbe6ce6dc1c0e767ca4ae1d4976b392a74eed737907e9c3d12cefd61331a3ce67240080a190d3a7ca5c8aebc
data/Readme.md CHANGED
@@ -7,17 +7,17 @@ class User < ActiveRecord::Base
7
7
  bitfield :my_bits, 1 => :seller, 2 => :insane, 4 => :stupid
8
8
  end
9
9
 
10
- user = User.new(:seller => true, :insane => true)
10
+ user = User.new(foo: true, insane: true)
11
11
  user.seller == true
12
12
  user.stupid? == false
13
13
  user.my_bits == 3
14
14
  ```
15
15
 
16
- - records changes `user.changes == {:seller => [false, true]}`
17
- - adds scopes `User.seller.stupid.first` (deactivate with `bitfield ..., :scopes => false`)
18
- - builds sql `User.bitfield_sql(:insane => true, :stupid => false) == '(users.my_bits & 3) = 1'`
19
- - builds index-using sql with `bitfield ... ,:query_mode => :in_list` and `User.bitfield_sql(:insane => true, :stupid => false) == 'users.my_bits IN (2, 3)'` (2 and 1+2), often slower than :bit_operator sql especially for high number of bits
20
- - builds update sql `User.set_bitfield_sql(:insane => true, :stupid => false) == 'my_bits = (my_bits | 6) - 4'`
16
+ - records bitfield_changes `user.bitfield_changes == {foo: [false, true]}` (also `foo_was` / `foo_change` / `foo_changed?`)
17
+ - adds scopes `User.foo.stupid.first` (deactivate with `bitfield ..., scopes: false`)
18
+ - builds sql `User.bitfield_sql(insane: true, stupid: false) == '(users.my_bits & 3) = 1'`
19
+ - builds index-using sql with `bitfield ... , query_mode: :in_list` and `User.bitfield_sql(insane: true, stupid: false) == 'users.my_bits IN (2, 3)'` (2 and 1+2), often slower than :bit_operator sql especially for high number of bits
20
+ - builds update sql `User.set_bitfield_sql(insane: true, stupid: false) == 'my_bits = (my_bits | 6) - 4'`
21
21
  - **faster sql than any other bitfield lib** through combination of multiple bits into a single sql statement
22
22
  - gives access to bits `User.bitfields[:my_bits][:stupid] == 4`
23
23
 
@@ -32,9 +32,9 @@ gem install bitfields
32
32
  ALWAYS set a default, bitfield queries will not work for NULL
33
33
 
34
34
  ```ruby
35
- t.integer :my_bits, :default => 0, :null => false
35
+ t.integer :my_bits, default: 0, null: false
36
36
  # OR
37
- add_column :users, :my_bits, :integer, :default => 0, :null => false
37
+ add_column :users, :my_bits, :integer, default: 0, null: false
38
38
  ```
39
39
 
40
40
  Examples
@@ -42,13 +42,13 @@ Examples
42
42
  Update all users
43
43
 
44
44
  ```ruby
45
- User.seller.not_stupid.update_all(User.set_bitfield_sql(:seller => true, :insane => true))
45
+ User.seller.not_stupid.update_all(User.set_bitfield_sql(seller: true, insane: true))
46
46
  ```
47
47
 
48
48
  Delete the shop when a user is no longer a seller
49
49
 
50
50
  ```ruby
51
- before_save :delete_shop, :if => lambda{|u| u.changes['seller'] == [true, false]}
51
+ before_save :delete_shop, if: -> { |u| u.seller_change == [true, false]}
52
52
  ```
53
53
 
54
54
  TIPS
@@ -56,14 +56,14 @@ TIPS
56
56
  - [Upgrading] in version 0.2.2 the first field(when not given as hash) used bit 2 -> add a bogus field in first position
57
57
  - [Defaults] afaik it is not possible to have some bits true by default (without monkeypatching AR/see [tests](https://github.com/grosser/bitfields/commit/2170dc546e2c4f1187089909a80e8602631d0796)) -> choose a good naming like `xxx_on` / `xxx_off` to use the default 'false'
58
58
  - Never do: "#{bitfield_sql(...)} AND #{bitfield_sql(...)}", merge both into one hash
59
- - bit_operator is faster in most cases, use :query_mode => :in_list sparingly
59
+ - bit_operator is faster in most cases, use query_mode: :in_list sparingly
60
60
  - Standard mysql integer is 4 byte -> 32 bitfields
61
61
  - If you are lazy or bad at math you can also do `bitfields :bits, :foo, :bar, :baz`
62
62
  - If you are want more readability and reduce clutter you can do `bitfields 2**0 => :foo, 2**1 => :bar, 2**32 => :baz`
63
63
 
64
64
  Query-mode Benchmark
65
65
  =========
66
- The `:query_mode => :in_list` is slower for most queries and scales mierably with the number of bits.<br/>
66
+ The `query_mode: :in_list` is slower for most queries and scales mierably with the number of bits.<br/>
67
67
  *Stay with the default query-mode*. Only use :in_list if your edge-case shows better performance.
68
68
 
69
69
  ![performance](http://chart.apis.google.com/chart?chtt=bit-operator+vs+IN+--+with+index&chd=s:CEGIKNPRUW,DEHJLOQSVX,CFHKMPSYXZ,DHJMPSVYbe,DHLPRVZbfi,FKOUZeinsx,FLQWbglqw2,HNTZfkqw19,BDEGHJLMOP,BDEGIKLNOQ,BDFGIKLNPQ,BDFGILMNPR,BDFHJKMOQR,BDFHJLMOQS,BDFHJLNPRT,BDFHJLNPRT&chxt=x,y&chxl=0:|100K|200K|300K|400K|500K|600K|700K|800K|900K|1000K|1:|0|1441.671ms&cht=lc&chs=600x500&chdl=2bits+%28in%29|3bits+%28in%29|4bits+%28in%29|6bits+%28in%29|8bits+%28in%29|10bits+%28in%29|12bits+%28in%29|14bits+%28in%29|2bits+%28bit%29|3bits+%28bit%29|4bits+%28bit%29|6bits+%28bit%29|8bits+%28bit%29|10bits+%28bit%29|12bits+%28bit%29|14bits+%28bit%29&chco=0000ff,0000ee,0000dd,0000cc,0000bb,0000aa,000099,000088,ff0000,ee0000,dd0000,cc0000,bb0000,aa0000,990000,880000)
@@ -83,7 +83,7 @@ end
83
83
 
84
84
  TODO
85
85
  ====
86
- - convenient named scope `User.with_bitfields(:xxx=>true, :yy=>false)`
86
+ - convenient named scope `User.with_bitfields(xxx: true, yyy: false)`
87
87
 
88
88
  Authors
89
89
  =======
data/lib/bitfields.rb CHANGED
@@ -84,6 +84,12 @@ module Bitfields
84
84
  define_method(bit_name) { bitfield_value(bit_name) }
85
85
  define_method("#{bit_name}?") { bitfield_value(bit_name) }
86
86
  define_method("#{bit_name}=") { |value| set_bitfield_value(bit_name, value) }
87
+ define_method("#{bit_name}_was") { bitfield_value_was(bit_name) }
88
+ define_method("#{bit_name}_changed?") { bitfield_value_was(bit_name) != bitfield_value(bit_name) }
89
+ define_method("#{bit_name}_change") do
90
+ values = [bitfield_value_was(bit_name), bitfield_value(bit_name)]
91
+ values unless values[0] == values[1]
92
+ end
87
93
 
88
94
  if options[:scopes] != false
89
95
  scope bit_name, bitfield_scope_options(bit_name => true)
@@ -1,3 +1,3 @@
1
1
  module Bitfields
2
- Version = VERSION = "0.5.0"
2
+ Version = VERSION = "0.5.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitfields
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Grosser