hstore_accessor 0.4.0 → 0.4.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: 220ae624d098a1da52d11b5a2f80968e1b8f4aeb
4
- data.tar.gz: 686682a267560e4aa0e7b3c27e307449d5cf4446
3
+ metadata.gz: 762278330d698c66a6d2926e1595c539da4fbaf7
4
+ data.tar.gz: e4f38f9cb7e9b43384f2880a5b46860b63c3e0d9
5
5
  SHA512:
6
- metadata.gz: 58a6b38bb4d388e7d775cd2c0ed0e6cc268ff46981d12504db72e7a68a2f718d4f9abf2ef3179d73f523e88d1a421cf81a7db195982fbbe0f80e9dc88ea8ad20
7
- data.tar.gz: a396a35279696b767cc5b463244ac1fd38a087dc2d9af5f07fdd8a31c106c26f134d049fa1a459cd638614afe6931485fed3601fe6bccb7b85895dae0564102e
6
+ metadata.gz: 29530074370a555d44d91a2b60a5b7621935f4f062585e9c329a6ba508e762564f7548d2d6220a247b5c83779a6684545cc39668b48a0d44d905c5575ccce786
7
+ data.tar.gz: 7c9227822c95e61b23b900aebd2f93f76ba3302e095e202fd0e50376a2f229278b9bc603d5b0136211a5058b0e9a9ea9a82ed09d6d4384b5bf45713ad04404d2
data/README.md CHANGED
@@ -63,6 +63,19 @@ p.color #=> "green"
63
63
  p.tags #=> ["housewares", "kitchen"]
64
64
  ```
65
65
 
66
+ In order to reduce the storage overhead of hstore keys (especially when
67
+ indexed) you can specify an alternate key.
68
+
69
+ ```ruby
70
+ hstore_accessor :options,
71
+ color: { data_type: :string, store_key: "c" },
72
+ weight: { data_type: :integer, store_key: "w" }
73
+ ```
74
+
75
+ In the above example you can continue to interact with the fields using
76
+ their full name but when saved to the database the field will be set
77
+ using the `store_key`.
78
+
66
79
  ### Scopes
67
80
 
68
81
  The `hstore_accessor` macro also creates scopes for `string`, `integer`,
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency "pg", ">= 0.14.1"
22
22
  spec.add_dependency "activesupport", ">= 3.2.0"
23
23
 
24
- spec.add_development_dependency "activerecord", ">= 4.0.0.rc1"
24
+ spec.add_development_dependency "activerecord", ">= 4.0.0"
25
25
  spec.add_development_dependency "bundler", "~> 1.3"
26
26
  spec.add_development_dependency "rake"
27
27
  spec.add_development_dependency "rspec"
@@ -7,7 +7,7 @@ module HstoreAccessor
7
7
 
8
8
  InvalidDataTypeError = Class.new(StandardError)
9
9
 
10
- VALID_TYPES = [:string, :integer, :float, :time, :boolean, :array, :hash]
10
+ VALID_TYPES = [:string, :integer, :float, :time, :boolean, :array, :hash, :date]
11
11
 
12
12
  SEPARATOR = "||;||"
13
13
 
@@ -18,7 +18,8 @@ module HstoreAccessor
18
18
  :array => -> value { (value && value.join(SEPARATOR)) || nil },
19
19
  :hash => -> value { (value && value.to_json) || nil },
20
20
  :time => -> value { value.to_i },
21
- :boolean => -> value { (value == true).to_s }
21
+ :boolean => -> value { (value == true).to_s },
22
+ :date => -> value { (value && value.to_s) || nil }
22
23
  }
23
24
 
24
25
  DESERIALIZERS = {
@@ -27,7 +28,8 @@ module HstoreAccessor
27
28
  :integer => -> value { value.to_i },
28
29
  :float => -> value { value.to_f },
29
30
  :time => -> value { Time.at(value.to_i) },
30
- :boolean => -> value { value == "true" }
31
+ :boolean => -> value { value == "true" },
32
+ :date => -> value { (value && Date.parse(value)) || nil }
31
33
  }
32
34
 
33
35
  def serialize(type, value, serializer=nil)
@@ -82,6 +84,10 @@ module HstoreAccessor
82
84
  send(:scope, "#{key}_before", -> value { where("(#{query_field})::integer < ?", value.to_i) })
83
85
  send(:scope, "#{key}_eq", -> value { where("(#{query_field})::integer = ?", value.to_i) })
84
86
  send(:scope, "#{key}_after", -> value { where("(#{query_field})::integer > ?", value.to_i) })
87
+ when :date
88
+ send(:scope, "#{key}_before", -> value { where("#{query_field} < ?", value.to_s) })
89
+ send(:scope, "#{key}_eq", -> value { where("#{query_field} = ?", value.to_s) })
90
+ send(:scope, "#{key}_after", -> value { where("#{query_field} > ?", value.to_s) })
85
91
  when :boolean
86
92
  send(:scope, "is_#{key}", -> { where("#{query_field} = 'true'") })
87
93
  send(:scope, "not_#{key}", -> { where("#{query_field} = 'false'") })
@@ -1,3 +1,3 @@
1
1
  module HstoreAccessor
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -8,7 +8,8 @@ FIELDS = {
8
8
  popular: :boolean,
9
9
  build_timestamp: :time,
10
10
  tags: :array,
11
- reviews: :hash
11
+ reviews: :hash,
12
+ released_at: :date
12
13
  }
13
14
 
14
15
  class Product < ActiveRecord::Base
@@ -54,8 +55,9 @@ describe HstoreAccessor do
54
55
 
55
56
  context "nil values" do
56
57
  let!(:timestamp) { Time.now }
58
+ let!(:datestamp) { Date.today }
57
59
  let!(:product) { Product.new }
58
- let!(:product_a) { Product.create(color: "green", price: 10, weight: 10.1, tags: ["tag1", "tag2", "tag3"], popular: true, build_timestamp: (timestamp - 10.days)) }
60
+ let!(:product_a) { Product.create(color: "green", price: 10, weight: 10.1, tags: ["tag1", "tag2", "tag3"], popular: true, build_timestamp: (timestamp - 10.days), released_at: (datestamp - 8.days)) }
59
61
 
60
62
  FIELDS.keys.each do |field|
61
63
  it "reponds with nil when #{field} is not set" do
@@ -74,9 +76,10 @@ describe HstoreAccessor do
74
76
  describe "scopes" do
75
77
 
76
78
  let!(:timestamp) { Time.now }
77
- let!(:product_a) { Product.create(color: "green", price: 10, weight: 10.1, tags: ["tag1", "tag2", "tag3"], popular: true, build_timestamp: (timestamp - 10.days)) }
78
- let!(:product_b) { Product.create(color: "orange", price: 20, weight: 20.2, tags: ["tag2", "tag3", "tag4"], popular: false, build_timestamp: (timestamp - 5.days)) }
79
- let!(:product_c) { Product.create(color: "blue", price: 30, weight: 30.3, tags: ["tag3", "tag4", "tag5"], popular: true, build_timestamp: timestamp) }
79
+ let!(:datestamp) { Date.today }
80
+ let!(:product_a) { Product.create(color: "green", price: 10, weight: 10.1, tags: ["tag1", "tag2", "tag3"], popular: true, build_timestamp: (timestamp - 10.days), released_at: (datestamp - 8.days)) }
81
+ let!(:product_b) { Product.create(color: "orange", price: 20, weight: 20.2, tags: ["tag2", "tag3", "tag4"], popular: false, build_timestamp: (timestamp - 5.days), released_at: (datestamp - 4.days)) }
82
+ let!(:product_c) { Product.create(color: "blue", price: 30, weight: 30.3, tags: ["tag3", "tag4", "tag5"], popular: true, build_timestamp: timestamp, released_at: datestamp) }
80
83
 
81
84
  context "for string fields support" do
82
85
 
@@ -163,6 +166,22 @@ describe HstoreAccessor do
163
166
 
164
167
  end
165
168
 
169
+ context "for date fields support" do
170
+
171
+ it "before" do
172
+ expect(Product.released_at_before(datestamp)).to eq [product_a, product_b]
173
+ end
174
+
175
+ it "equality" do
176
+ expect(Product.released_at_eq(datestamp)).to eq [product_c]
177
+ end
178
+
179
+ it "after" do
180
+ expect(Product.released_at_after(datestamp - 6.days)).to eq [product_b, product_c]
181
+ end
182
+
183
+ end
184
+
166
185
  context "for boolean field support" do
167
186
 
168
187
  it "true" do
@@ -242,6 +261,15 @@ describe HstoreAccessor do
242
261
  expect(product.build_timestamp.to_i).to eq timestamp.to_i
243
262
  end
244
263
 
264
+ it "correctly stores date values" do
265
+ datestamp = Date.today - 9.days
266
+ product.released_at = datestamp
267
+ product.save
268
+ product.reload
269
+ expect(product.released_at.to_s).to eq datestamp.to_s
270
+ expect(product.released_at).to eq datestamp
271
+ end
272
+
245
273
  it "setters call the _will_change! method of the store attribute" do
246
274
  product.should_receive(:options_will_change!)
247
275
  product.color = "green"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hstore_accessor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Hirn
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-08-03 00:00:00.000000000 Z
13
+ date: 2013-09-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: pg
@@ -46,14 +46,14 @@ dependencies:
46
46
  requirements:
47
47
  - - '>='
48
48
  - !ruby/object:Gem::Version
49
- version: 4.0.0.rc1
49
+ version: 4.0.0
50
50
  type: :development
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - '>='
55
55
  - !ruby/object:Gem::Version
56
- version: 4.0.0.rc1
56
+ version: 4.0.0
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: bundler
59
59
  requirement: !ruby/object:Gem::Requirement
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
149
  version: '0'
150
150
  requirements: []
151
151
  rubyforge_project:
152
- rubygems_version: 2.0.2
152
+ rubygems_version: 2.0.3
153
153
  signing_key:
154
154
  specification_version: 4
155
155
  summary: Adds typed hstore backed fields to an ActiveRecord model.