hstore_accessor 0.9.3 → 1.0.0

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: a9947ed783eebb9457fc7ec4e47df6278dc1e9e8
4
- data.tar.gz: aeb90a29e1da91b8bec4bcb8fa68678c4a5434bb
3
+ metadata.gz: a3b755ac2d804d78400da381e4cad63a68647145
4
+ data.tar.gz: 7737c2ce560de5ab95fd750234bd7293386b1ab6
5
5
  SHA512:
6
- metadata.gz: ac8573daf232752241a7238afee768809b7b69de96bc63959736122a930b93009a97d818d136acc8ef98c866a5146ebd5444bd30f4eabe7976f2ba3df5730628
7
- data.tar.gz: dfed111a025d41a09370f25193c4990aa1fe06d5dee6d5a330b6e2588c270c06bfcedb8db9c418c9009be096781c2f16db4bfc796bfac1d0dfb2b1ef45f77174
6
+ metadata.gz: 099b5d22584a1734c72760a026dd42898be87ed7d0df5bd2abc0be60d742df11efa341cb6596c3618524db9bf6d0fd5358a98d1d29fed9429d5fb47c2b5da2e2
7
+ data.tar.gz: eb978d8c446b53413fd04737a920e7961d61481687cf2de0235c588fc22469c0db949ee4e55e901ef1e388fec2baf8e16d7ae7a96d149696ede082027189e6e6
@@ -31,5 +31,5 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency "rubocop"
32
32
  spec.add_development_dependency "shoulda-matchers"
33
33
 
34
- spec.post_install_message = "Please note that the `array` and `hash` types will no longer be supported in version 1.0.0"
34
+ spec.post_install_message = "Please note that the `array` and `hash` types are no longer supported in version 1.0.0"
35
35
  end
@@ -5,8 +5,8 @@ require "hstore_accessor/version"
5
5
  if ::ActiveRecord::VERSION::STRING.to_f >= 4.2
6
6
  require "hstore_accessor/active_record_4.2/type_helpers"
7
7
  else
8
- require "hstore_accessor/active_record_pre_4.2/type_helpers"
9
- require "hstore_accessor/active_record_pre_4.2/time_helper"
8
+ require "hstore_accessor/active_record_<_4.2/type_helpers"
9
+ require "hstore_accessor/active_record_<_4.2/time_helper"
10
10
  end
11
11
 
12
12
  require "hstore_accessor/serialization"
@@ -21,7 +21,7 @@ module HstoreAccessor
21
21
  return nil if value.nil?
22
22
 
23
23
  case type
24
- when :string, :hash, :array, :decimal
24
+ when :string, :decimal
25
25
  value
26
26
  when :integer, :float, :datetime, :date, :boolean
27
27
  TYPES[type].new.type_cast_from_user(value)
@@ -21,7 +21,7 @@ module HstoreAccessor
21
21
  column_class = ActiveRecord::ConnectionAdapters::Column
22
22
 
23
23
  case type
24
- when :string, :hash, :array, :decimal
24
+ when :string, :decimal
25
25
  value
26
26
  when :integer
27
27
  column_class.value_to_integer(value)
@@ -92,7 +92,7 @@ module HstoreAccessor
92
92
  hstore_changes = send("#{hstore_attribute}_change")
93
93
  return if hstore_changes.nil?
94
94
  attribute_changes = hstore_changes.map { |change| change.try(:[], store_key.to_s) }
95
- attribute_changes.uniq.size == 1 ? nil : attribute_changes
95
+ attribute_changes.compact.present? ? attribute_changes : nil
96
96
  end
97
97
 
98
98
  define_method("restore_#{key}!") do
@@ -115,8 +115,8 @@ module HstoreAccessor
115
115
  end
116
116
  end
117
117
 
118
- query_field = "#{table_name}.#{hstore_attribute} -> '#{store_key}'"
119
- eq_query_field = "#{table_name}.#{hstore_attribute} @> hstore('#{store_key}', ?)"
118
+ query_field = "#{hstore_attribute} -> '#{store_key}'"
119
+ eq_query_field = "#{hstore_attribute} @> hstore('#{store_key}', ?)"
120
120
 
121
121
  case data_type
122
122
  when :string
@@ -144,9 +144,6 @@ module HstoreAccessor
144
144
  when :boolean
145
145
  send(:scope, "is_#{key}", -> { where(eq_query_field, "true") })
146
146
  send(:scope, "not_#{key}", -> { where(eq_query_field, "false") })
147
- when :array
148
- send(:scope, "#{key}_eq", -> value { where("#{query_field} = ?", value.join(Serialization::SEPARATOR)) })
149
- send(:scope, "#{key}_contains", -> value { where("string_to_array(#{query_field}, '#{Serialization::SEPARATOR}') @> string_to_array(?, '#{Serialization::SEPARATOR}')", Array[value].flatten.join(Serialization::SEPARATOR)) })
150
147
  end
151
148
  end
152
149
 
@@ -3,13 +3,11 @@ module HstoreAccessor
3
3
  InvalidDataTypeError = Class.new(StandardError)
4
4
 
5
5
  VALID_TYPES = [
6
- :array,
7
6
  :boolean,
8
7
  :date,
9
8
  :datetime,
10
9
  :decimal,
11
10
  :float,
12
- :hash,
13
11
  :integer,
14
12
  :string
15
13
  ]
@@ -17,24 +15,18 @@ module HstoreAccessor
17
15
  DEFAULT_SERIALIZER = ->(value) { value.to_s }
18
16
  DEFAULT_DESERIALIZER = DEFAULT_SERIALIZER
19
17
 
20
- SEPARATOR = "||;||"
21
-
22
18
  SERIALIZERS = {
23
- array: -> value { (value && value.join(SEPARATOR)) || nil },
24
19
  boolean: -> value { (value.to_s == "true").to_s },
25
20
  date: -> value { value && value.to_s },
26
- hash: -> value { (value && value.to_json) || nil },
27
21
  datetime: -> value { value && value.to_i }
28
22
  }
29
23
  SERIALIZERS.default = DEFAULT_SERIALIZER
30
24
 
31
25
  DESERIALIZERS = {
32
- array: -> value { (value && value.split(SEPARATOR)) || nil },
33
26
  boolean: -> value { TypeHelpers.cast(:boolean, value) },
34
27
  date: -> value { value && Date.parse(value) },
35
28
  decimal: -> value { value && BigDecimal.new(value) },
36
29
  float: -> value { value && value.to_f },
37
- hash: -> value { (value && JSON.parse(value)) || nil },
38
30
  integer: -> value { value && value.to_i },
39
31
  datetime: -> value { value && Time.at(value.to_i).in_time_zone }
40
32
  }
@@ -1,3 +1,3 @@
1
1
  module HstoreAccessor
2
- VERSION = "0.9.3"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -2,17 +2,13 @@ require "spec_helper"
2
2
  require "active_support/all"
3
3
 
4
4
  FIELDS = {
5
- name: :string,
6
5
  color: :string,
7
6
  price: :integer,
8
7
  published: { data_type: :boolean, store_key: "p" },
9
8
  weight: { data_type: :float, store_key: "w" },
10
9
  popular: :boolean,
11
10
  build_timestamp: :datetime,
12
- tags: :array,
13
- reviews: :hash,
14
11
  released_at: :date,
15
- likes: :integer,
16
12
  miles: :decimal
17
13
  }
18
14
 
@@ -20,15 +16,9 @@ DATA_FIELDS = {
20
16
  color_data: :string
21
17
  }
22
18
 
23
- class ProductCategory < ActiveRecord::Base
24
- hstore_accessor :options, name: :string, likes: :integer
25
- has_many :products
26
- end
27
-
28
19
  class Product < ActiveRecord::Base
29
20
  hstore_accessor :options, FIELDS
30
21
  hstore_accessor :data, DATA_FIELDS
31
- belongs_to :product_category
32
22
  end
33
23
 
34
24
  class SuperProduct < Product
@@ -85,7 +75,7 @@ describe HstoreAccessor do
85
75
  let!(:timestamp) { Time.now }
86
76
  let!(:datestamp) { Date.today }
87
77
  let(:product) { Product.new }
88
- let(:persisted_product) { Product.create!(color: "green", price: 10, weight: 10.1, tags: %w(tag1 tag2 tag3), popular: true, build_timestamp: (timestamp - 10.days), released_at: (datestamp - 8.days), miles: BigDecimal.new("9.133790001")) }
78
+ let(:persisted_product) { Product.create!(color: "green", price: 10, weight: 10.1, popular: true, build_timestamp: (timestamp - 10.days), released_at: (datestamp - 8.days), miles: BigDecimal.new("9.133790001")) }
89
79
 
90
80
  FIELDS.keys.each do |field|
91
81
  it "responds with nil when #{field} is not set" do
@@ -155,35 +145,9 @@ describe HstoreAccessor do
155
145
  describe "scopes" do
156
146
  let!(:timestamp) { Time.now }
157
147
  let!(:datestamp) { Date.today }
158
- let!(:product_a) { Product.create(likes: 3, name: "widget", color: "green", price: 10, weight: 10.1, tags: %w(tag1 tag2 tag3), popular: true, build_timestamp: (timestamp - 10.days), released_at: (datestamp - 8.days), miles: BigDecimal.new("10.113379001")) }
159
- let!(:product_b) { Product.create(color: "orange", price: 20, weight: 20.2, tags: %w(tag2 tag3 tag4), popular: false, build_timestamp: (timestamp - 5.days), released_at: (datestamp - 4.days), miles: BigDecimal.new("20.213379001")) }
160
- let!(:product_c) { Product.create(color: "blue", price: 30, weight: 30.3, tags: %w(tag3 tag4 tag5), popular: true, build_timestamp: timestamp, released_at: datestamp, miles: BigDecimal.new("30.313379001")) }
161
-
162
- context "ambiguous column names" do
163
- let!(:product_category) { ProductCategory.create!(name: "widget", likes: 2) }
164
-
165
- before do
166
- Product.all.to_a.each do |product|
167
- product_category.products << product
168
- end
169
- end
170
-
171
- context "eq query" do
172
- let!(:query) { Product.all.joins(:product_category).merge(ProductCategory.with_name("widget")).with_name("widget") }
173
-
174
- it "qualifies the table name to prevent ambiguous column name references" do
175
- expect { query.to_a }.to_not raise_error
176
- end
177
- end
178
-
179
- context "query" do
180
- let!(:query) { Product.all.joins(:product_category).merge(ProductCategory.likes_lt(4)).likes_lt(4) }
181
-
182
- it "qualifies the table name to prevent ambiguous column name references" do
183
- expect { query.to_a }.to_not raise_error
184
- end
185
- end
186
- end
148
+ let!(:product_a) { Product.create(color: "green", price: 10, weight: 10.1, popular: true, build_timestamp: (timestamp - 10.days), released_at: (datestamp - 8.days), miles: BigDecimal.new("10.113379001")) }
149
+ let!(:product_b) { Product.create(color: "orange", price: 20, weight: 20.2, popular: false, build_timestamp: (timestamp - 5.days), released_at: (datestamp - 4.days), miles: BigDecimal.new("20.213379001")) }
150
+ let!(:product_c) { Product.create(color: "blue", price: 30, weight: 30.3, popular: true, build_timestamp: timestamp, released_at: datestamp, miles: BigDecimal.new("30.313379001")) }
187
151
 
188
152
  context "for string fields support" do
189
153
  it "equality" do
@@ -257,20 +221,7 @@ describe HstoreAccessor do
257
221
  end
258
222
  end
259
223
 
260
- context "for array fields support" do
261
- it "equality" do
262
- expect(Product.tags_eq(%w(tag1 tag2 tag3)).to_a).to eq [product_a]
263
- end
264
-
265
- it "contains" do
266
- expect(Product.tags_contains("tag2").to_a).to eq [product_a, product_b]
267
- expect(Product.tags_contains(%w(tag2 tag3)).to_a).to eq [product_a, product_b]
268
- expect(Product.tags_contains(%w(tag1 tag2 tag3)).to_a).to eq [product_a]
269
- expect(Product.tags_contains(%w(tag1 tag2 tag3 tag4)).to_a).to eq []
270
- end
271
- end
272
-
273
- context "for time fields support" do
224
+ context "for datetime fields support" do
274
225
  it "before" do
275
226
  expect(Product.build_timestamp_before(timestamp)).to eq [product_a, product_b]
276
227
  end
@@ -357,8 +308,6 @@ describe HstoreAccessor do
357
308
  it_returns_the_properly_typed_column :datetime, :build_timestamp, ActiveRecord::Type::DateTime
358
309
  it_returns_the_properly_typed_column :date, :released_at, ActiveRecord::Type::Date
359
310
  it_returns_the_properly_typed_column :decimal, :miles, ActiveRecord::Type::Decimal
360
- it_returns_the_properly_typed_column :array, :tags, ActiveRecord::Type::Value
361
- it_returns_the_properly_typed_column :hash, :reviews, ActiveRecord::Type::Value
362
311
  else
363
312
  def self.it_returns_the_properly_typed_column(hstore_type, attribute_name, active_record_type)
364
313
  context "#{hstore_type}" do
@@ -422,39 +371,6 @@ describe HstoreAccessor do
422
371
  expect(product.weight).to eq 93.45
423
372
  end
424
373
 
425
- context "array values" do
426
- it "correctly stores nothing" do
427
- product.tags = nil
428
- product.save
429
- product.reload
430
- expect(product.tags).to be_nil
431
- end
432
-
433
- it "correctly stores strings" do
434
- product.tags = ["household", "living room", "kitchen"]
435
- product.save
436
- product.reload
437
- expect(product.tags).to eq ["household", "living room", "kitchen"]
438
- end
439
- end
440
-
441
- context "hash values" do
442
- it "correctly stores nothing" do
443
- product.reviews = nil
444
- product.save
445
- product.reload
446
- expect(product.reviews).to be_nil
447
- end
448
-
449
- it "correctly stores hash values as json" do
450
- hash = product.reviews = { "user_123" => "4 stars", "user_994" => "3 stars" }
451
- product.save
452
- product.reload
453
- expect(product.reviews).to eq("user_123" => "4 stars", "user_994" => "3 stars")
454
- expect(product.options["reviews"]).to eq(hash.to_json)
455
- end
456
- end
457
-
458
374
  context "multipart values" do
459
375
  it "stores multipart dates correctly" do
460
376
  product.update_attributes!(
@@ -493,7 +409,7 @@ describe HstoreAccessor do
493
409
  product.save!
494
410
  product.reload
495
411
  Time.use_zone(new_york_timezone) do
496
- expect(product.build_timestamp.to_s).to eq timestamp.in_time_zone(new_york_timezone).to_s
412
+ expect(product.build_timestamp.utc_offset).to eq new_york_timezone.utc_offset
497
413
  end
498
414
  end
499
415
  end
@@ -676,14 +592,12 @@ describe HstoreAccessor do
676
592
  product.color = "GREEN"
677
593
  expect(product.color_change).to eq %w(ORANGE GREEN)
678
594
  end
679
-
680
595
  context "when store_key differs from key" do
681
596
  it "returns the old and new values" do
682
597
  product.weight = 100.01
683
598
  expect(product.weight_change[1]).to eq "100.01"
684
599
  end
685
600
  end
686
-
687
601
  context "hstore attribute was nil" do
688
602
  it "returns old and new values" do
689
603
  product.options = nil
@@ -700,18 +614,6 @@ describe HstoreAccessor do
700
614
  product.price = 6
701
615
  expect(product.color_change).to be_nil
702
616
  end
703
-
704
- it "returns nil when other attributes were changed" do
705
- product.price = 5
706
- product.save!
707
- product = Product.first
708
-
709
- expect(product.price_change).to be_nil
710
-
711
- product.color = "red"
712
-
713
- expect(product.price_change).to be_nil
714
- end
715
617
  end
716
618
 
717
619
  context "not persisted" do
@@ -26,7 +26,6 @@ def create_database
26
26
 
27
27
  ActiveRecord::Base.connection.execute("CREATE EXTENSION hstore;") rescue ActiveRecord::StatementInvalid
28
28
  ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS products;")
29
- ActiveRecord::Base.connection.execute("DROP TABLE IF EXISTS product_categories;")
30
29
 
31
30
  ActiveRecord::Base.connection.create_table(:products) do |t|
32
31
  t.hstore :options
@@ -34,18 +33,11 @@ def create_database
34
33
 
35
34
  t.string :string_type
36
35
  t.integer :integer_type
37
- t.integer :product_category_id
38
36
  t.boolean :boolean_type
39
37
  t.float :float_type
40
38
  t.time :time_type
41
- t.string :array_type, array: true
42
39
  t.date :date_type
43
40
  t.datetime :datetime_type
44
41
  t.decimal :decimal_type
45
- t.hstore :hash_type
46
- end
47
-
48
- ActiveRecord::Base.connection.create_table(:product_categories) do |t|
49
- t.hstore :options
50
42
  end
51
43
  end
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.9.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Hirn
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2015-04-22 00:00:00.000000000 Z
15
+ date: 2015-02-10 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: activerecord
@@ -181,7 +181,6 @@ extra_rdoc_files: []
181
181
  files:
182
182
  - ".gitignore"
183
183
  - ".rubocop.yml"
184
- - ".ruby-version"
185
184
  - Appraisals
186
185
  - Gemfile
187
186
  - LICENSE.txt
@@ -193,8 +192,8 @@ files:
193
192
  - hstore_accessor.gemspec
194
193
  - lib/hstore_accessor.rb
195
194
  - lib/hstore_accessor/active_record_4.2/type_helpers.rb
196
- - lib/hstore_accessor/active_record_pre_4.2/time_helper.rb
197
- - lib/hstore_accessor/active_record_pre_4.2/type_helpers.rb
195
+ - lib/hstore_accessor/active_record_<_4.2/time_helper.rb
196
+ - lib/hstore_accessor/active_record_<_4.2/type_helpers.rb
198
197
  - lib/hstore_accessor/macro.rb
199
198
  - lib/hstore_accessor/serialization.rb
200
199
  - lib/hstore_accessor/version.rb
@@ -204,8 +203,8 @@ homepage: http://github.com/devmynd/hstore_accessor
204
203
  licenses:
205
204
  - MIT
206
205
  metadata: {}
207
- post_install_message: Please note that the `array` and `hash` types will no longer
208
- be supported in version 1.0.0
206
+ post_install_message: Please note that the `array` and `hash` types are no longer
207
+ supported in version 1.0.0
209
208
  rdoc_options: []
210
209
  require_paths:
211
210
  - lib
@@ -1 +0,0 @@
1
- 2.1.5