bitfields 0.5.0 → 0.5.1

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.
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