hstore_accessor 0.5.1 → 0.5.2
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 +4 -4
- data/lib/hstore_accessor.rb +28 -13
- data/lib/hstore_accessor/time_helper.rb +31 -0
- data/lib/hstore_accessor/version.rb +1 -1
- data/spec/hstore_accessor_spec.rb +34 -0
- metadata +23 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c81705ab4bfeff9568f1f9e580411a1a8fb52387
|
4
|
+
data.tar.gz: bf60a484be88e5f63a5d08165bc76db186b05b33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a8cb7b16656ef6cf9e12677d1206a9b5663e3d6b97bac6267fba3bacef27e24ec675c06d8173eac0434ad14a128b9f73da0e9b2d8fa55c7fae3b84ed6aecb82
|
7
|
+
data.tar.gz: 819667a3a55d48918d2e6b79dd52a71bbf43c3ff91752f389d66c8a020e29f1feb58d114c31df69b46592dc0aeb9092c9996161171816bcc07ab1b399e6a4834
|
data/lib/hstore_accessor.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "hstore_accessor/version"
|
2
|
+
require "hstore_accessor/time_helper"
|
2
3
|
require "active_support"
|
3
4
|
require "active_record"
|
4
5
|
|
@@ -15,21 +16,21 @@ module HstoreAccessor
|
|
15
16
|
DEFAULT_DESERIALIZER = DEFAULT_SERIALIZER
|
16
17
|
|
17
18
|
SERIALIZERS = {
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
19
|
+
array: -> value { (value && value.join(SEPARATOR)) || nil },
|
20
|
+
hash: -> value { (value && value.to_json) || nil },
|
21
|
+
time: -> value { value.to_i },
|
22
|
+
boolean: -> value { (value.to_s == "true").to_s },
|
23
|
+
date: -> value { (value && value.to_s) || nil }
|
23
24
|
}
|
24
25
|
|
25
26
|
DESERIALIZERS = {
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
27
|
+
array: -> value { (value && value.split(SEPARATOR)) || nil },
|
28
|
+
hash: -> value { (value && JSON.parse(value)) || nil },
|
29
|
+
integer: -> value { value.to_i },
|
30
|
+
float: -> value { value.to_f },
|
31
|
+
time: -> value { Time.at(value.to_i) },
|
32
|
+
boolean: -> value { value == "true" },
|
33
|
+
date: -> value { (value && Date.parse(value)) || nil }
|
33
34
|
}
|
34
35
|
|
35
36
|
def serialize(type, value, serializer=nil)
|
@@ -44,6 +45,20 @@ module HstoreAccessor
|
|
44
45
|
deserializer.call(value)
|
45
46
|
end
|
46
47
|
|
48
|
+
def type_cast(type, value)
|
49
|
+
return nil if value.nil?
|
50
|
+
column_class = ActiveRecord::ConnectionAdapters::Column
|
51
|
+
case type
|
52
|
+
when :string,:hash,:array then value
|
53
|
+
when :integer then column_class.value_to_integer(value)
|
54
|
+
when :float then value.to_f
|
55
|
+
when :time then TimeHelper.string_to_time(value)
|
56
|
+
when :date then column_class.value_to_date(value)
|
57
|
+
when :boolean then column_class.value_to_boolean(value)
|
58
|
+
else value
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
47
62
|
module ClassMethods
|
48
63
|
|
49
64
|
def hstore_accessor(hstore_attribute, fields)
|
@@ -66,7 +81,7 @@ module HstoreAccessor
|
|
66
81
|
end
|
67
82
|
|
68
83
|
define_method("#{key}=") do |value|
|
69
|
-
send("#{hstore_attribute}=", (send(hstore_attribute) || {}).merge(store_key.to_s => serialize(data_type, value)))
|
84
|
+
send("#{hstore_attribute}=", (send(hstore_attribute) || {}).merge(store_key.to_s => serialize(data_type, type_cast(type, value))))
|
70
85
|
send("#{hstore_attribute}_will_change!")
|
71
86
|
end
|
72
87
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module HstoreAccessor
|
2
|
+
module TimeHelper
|
3
|
+
|
4
|
+
# There is a bug in ActiveRecord::ConnectionAdapters::Column#string_to_time
|
5
|
+
# which drops the timezone. This has been fixed, but not released.
|
6
|
+
# This method includes the fix. See: https://github.com/rails/rails/pull/12290
|
7
|
+
|
8
|
+
def self.string_to_time(string)
|
9
|
+
return string unless string.is_a?(String)
|
10
|
+
return nil if string.empty?
|
11
|
+
|
12
|
+
time_hash = Date._parse(string)
|
13
|
+
time_hash[:sec_fraction] = ActiveRecord::ConnectionAdapters::Column.send(:microseconds, time_hash)
|
14
|
+
(year, mon, mday, hour, min, sec, microsec, offset) = *time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction, :offset)
|
15
|
+
|
16
|
+
# Treat 0000-00-00 00:00:00 as nil.
|
17
|
+
return nil if year.nil? || (year == 0 && mon == 0 && mday == 0)
|
18
|
+
|
19
|
+
if offset
|
20
|
+
time = Time.utc(year, mon, mday, hour, min, sec, microsec) rescue nil
|
21
|
+
return nil unless time
|
22
|
+
|
23
|
+
time -= offset
|
24
|
+
ActiveRecord::Base.default_timezone == :utc ? time : time.getlocal
|
25
|
+
else
|
26
|
+
Time.public_send(ActiveRecord::Base.default_timezone, year, mon, mday, hour, min, sec, microsec) rescue nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -325,6 +325,40 @@ describe HstoreAccessor do
|
|
325
325
|
product.color = "green"
|
326
326
|
end
|
327
327
|
|
328
|
+
describe "type casting" do
|
329
|
+
it "type casts integer values" do
|
330
|
+
product.price = '468'
|
331
|
+
expect(product.price).to eq 468
|
332
|
+
end
|
333
|
+
it "type casts float values" do
|
334
|
+
product.weight = '93.45'
|
335
|
+
expect(product.weight).to eq 93.45
|
336
|
+
end
|
337
|
+
it "type casts time values" do
|
338
|
+
timestamp = Time.now - 10.days
|
339
|
+
product.build_timestamp = timestamp.to_s
|
340
|
+
expect(product.build_timestamp.to_i).to eq timestamp.to_i
|
341
|
+
end
|
342
|
+
it "type casts date values" do
|
343
|
+
datestamp = Date.today - 9.days
|
344
|
+
product.released_at = datestamp.to_s
|
345
|
+
expect(product.released_at).to eq datestamp
|
346
|
+
end
|
347
|
+
|
348
|
+
it "type casts boolean values" do
|
349
|
+
ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.each do |value|
|
350
|
+
product.popular = value
|
351
|
+
expect(product.popular).to be_true
|
352
|
+
end
|
353
|
+
ActiveRecord::ConnectionAdapters::Column::FALSE_VALUES.each do |value|
|
354
|
+
product.popular = value
|
355
|
+
expect(product.popular).to be_false
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
|
360
|
+
end
|
361
|
+
|
328
362
|
end
|
329
363
|
|
330
364
|
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.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Hirn
|
@@ -10,118 +10,118 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2014-01-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: pg
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- -
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 0.14.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
version: 0.14.1
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: activesupport
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: 3.2.0
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
42
|
version: 3.2.0
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: activerecord
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- -
|
47
|
+
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
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
56
|
version: 4.0.0
|
57
57
|
- !ruby/object:Gem::Dependency
|
58
58
|
name: bundler
|
59
59
|
requirement: !ruby/object:Gem::Requirement
|
60
60
|
requirements:
|
61
|
-
- - ~>
|
61
|
+
- - "~>"
|
62
62
|
- !ruby/object:Gem::Version
|
63
63
|
version: '1.3'
|
64
64
|
type: :development
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
|
-
- - ~>
|
68
|
+
- - "~>"
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
version: '1.3'
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: rake
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
74
74
|
requirements:
|
75
|
-
- -
|
75
|
+
- - ">="
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
80
|
version_requirements: !ruby/object:Gem::Requirement
|
81
81
|
requirements:
|
82
|
-
- -
|
82
|
+
- - ">="
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '0'
|
85
85
|
- !ruby/object:Gem::Dependency
|
86
86
|
name: rspec
|
87
87
|
requirement: !ruby/object:Gem::Requirement
|
88
88
|
requirements:
|
89
|
-
- -
|
89
|
+
- - ">="
|
90
90
|
- !ruby/object:Gem::Version
|
91
91
|
version: '0'
|
92
92
|
type: :development
|
93
93
|
prerelease: false
|
94
94
|
version_requirements: !ruby/object:Gem::Requirement
|
95
95
|
requirements:
|
96
|
-
- -
|
96
|
+
- - ">="
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '0'
|
99
99
|
- !ruby/object:Gem::Dependency
|
100
100
|
name: pry
|
101
101
|
requirement: !ruby/object:Gem::Requirement
|
102
102
|
requirements:
|
103
|
-
- -
|
103
|
+
- - ">="
|
104
104
|
- !ruby/object:Gem::Version
|
105
105
|
version: '0'
|
106
106
|
type: :development
|
107
107
|
prerelease: false
|
108
108
|
version_requirements: !ruby/object:Gem::Requirement
|
109
109
|
requirements:
|
110
|
-
- -
|
110
|
+
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: '0'
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: database_cleaner
|
115
115
|
requirement: !ruby/object:Gem::Requirement
|
116
116
|
requirements:
|
117
|
-
- -
|
117
|
+
- - ">="
|
118
118
|
- !ruby/object:Gem::Version
|
119
119
|
version: '0'
|
120
120
|
type: :development
|
121
121
|
prerelease: false
|
122
122
|
version_requirements: !ruby/object:Gem::Requirement
|
123
123
|
requirements:
|
124
|
-
- -
|
124
|
+
- - ">="
|
125
125
|
- !ruby/object:Gem::Version
|
126
126
|
version: '0'
|
127
127
|
description: Adds typed hstore backed fields to an ActiveRecord model.
|
@@ -133,13 +133,14 @@ executables: []
|
|
133
133
|
extensions: []
|
134
134
|
extra_rdoc_files: []
|
135
135
|
files:
|
136
|
-
- .gitignore
|
136
|
+
- ".gitignore"
|
137
137
|
- Gemfile
|
138
138
|
- LICENSE.txt
|
139
139
|
- README.md
|
140
140
|
- Rakefile
|
141
141
|
- hstore_accessor.gemspec
|
142
142
|
- lib/hstore_accessor.rb
|
143
|
+
- lib/hstore_accessor/time_helper.rb
|
143
144
|
- lib/hstore_accessor/version.rb
|
144
145
|
- spec/hstore_accessor_spec.rb
|
145
146
|
- spec/spec_helper.rb
|
@@ -153,17 +154,17 @@ require_paths:
|
|
153
154
|
- lib
|
154
155
|
required_ruby_version: !ruby/object:Gem::Requirement
|
155
156
|
requirements:
|
156
|
-
- -
|
157
|
+
- - ">="
|
157
158
|
- !ruby/object:Gem::Version
|
158
159
|
version: '0'
|
159
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
161
|
requirements:
|
161
|
-
- -
|
162
|
+
- - ">="
|
162
163
|
- !ruby/object:Gem::Version
|
163
164
|
version: '0'
|
164
165
|
requirements: []
|
165
166
|
rubyforge_project:
|
166
|
-
rubygems_version: 2.0
|
167
|
+
rubygems_version: 2.2.0
|
167
168
|
signing_key:
|
168
169
|
specification_version: 4
|
169
170
|
summary: Adds typed hstore backed fields to an ActiveRecord model.
|