freezer 0.5.0 → 0.6.0
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.
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'freezer/serialization'
|
2
1
|
require 'active_support/concern'
|
3
2
|
require 'active_support/core_ext/hash/reverse_merge'
|
4
3
|
require 'active_support/core_ext/string/inflections'
|
@@ -17,6 +16,14 @@ module Freezer
|
|
17
16
|
|
18
17
|
klass = options[:class_name].camelize.constantize
|
19
18
|
accessor_name = association_name.to_s.underscore
|
19
|
+
serializer = if self.columns_hash[options[:column_name].to_s].type == :hstore
|
20
|
+
require 'freezer/serialization/hstore'
|
21
|
+
::Freezer::Serialization::HStore
|
22
|
+
else
|
23
|
+
require 'freezer/serialization/serialize'
|
24
|
+
self.serialize options[:column_name].to_sym, Hash
|
25
|
+
::Freezer::Serialization::Serialize
|
26
|
+
end
|
20
27
|
|
21
28
|
# Reader
|
22
29
|
define_method(accessor_name) do
|
@@ -28,7 +35,7 @@ module Freezer
|
|
28
35
|
|
29
36
|
# On cache miss, try to read from the raw accessor
|
30
37
|
if hstore = read_attribute(options[:column_name])
|
31
|
-
@freezer_cache[accessor_name] =
|
38
|
+
@freezer_cache[accessor_name] = serializer.deserialize(options[:class_name], hstore, options[:slient])
|
32
39
|
else
|
33
40
|
@freezer_cache[accessor_name] = nil
|
34
41
|
end
|
@@ -46,7 +53,7 @@ module Freezer
|
|
46
53
|
@freezer_cache ||= {}
|
47
54
|
|
48
55
|
if record
|
49
|
-
write_attribute(options[:column_name],
|
56
|
+
write_attribute(options[:column_name], serializer.serialize(record))
|
50
57
|
else
|
51
58
|
write_attribute(options[:column_name], nil)
|
52
59
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'freezer/frozen_record_proxy'
|
2
|
+
require 'active_record/connection_adapters/column'
|
3
|
+
|
4
|
+
module Freezer
|
5
|
+
module Serialization
|
6
|
+
module HStore
|
7
|
+
SERIALIZABLE_TYPES = [
|
8
|
+
:primary_key, :string, :text, :integer, :float, :decimal,
|
9
|
+
:datetime,:timestamp, :time, :date, :boolean
|
10
|
+
].freeze
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# TODO give each version its own module or something
|
14
|
+
def serialize(record)
|
15
|
+
# Start with the serialization format version string
|
16
|
+
hstore = {':sv'=>'1'}
|
17
|
+
|
18
|
+
columns = record.class.columns
|
19
|
+
attributes = record.attributes
|
20
|
+
|
21
|
+
columns.each do |column|
|
22
|
+
key = serialize_key(column.name, column.type)
|
23
|
+
value = serialize_value(column.type, attributes[column.name])
|
24
|
+
hstore[key] = value
|
25
|
+
end
|
26
|
+
|
27
|
+
hstore
|
28
|
+
end
|
29
|
+
|
30
|
+
def deserialize(klass, attributes, silent = false)
|
31
|
+
attributes = attributes.dup
|
32
|
+
sv = attributes.delete(':sv')
|
33
|
+
raise ArgumentError, "Unknown serialization format #{sv.to_s}" unless sv == '1'
|
34
|
+
attributes = attributes.inject({}) do |hash,(key,value)|
|
35
|
+
real_key, type = deserialize_key(key)
|
36
|
+
hash[real_key] = deserialize_value(type, value)
|
37
|
+
hash
|
38
|
+
end
|
39
|
+
FrozenRecordFactory.build(klass, attributes, silent)
|
40
|
+
end
|
41
|
+
|
42
|
+
def serialize_key(key, type)
|
43
|
+
"#{key.gsub(':','::')}:#{type}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def deserialize_key(serialized)
|
47
|
+
m = serialized.match(/(.*):([^:]+)\z/)
|
48
|
+
[m[1].gsub('::',':'), m[2].to_sym]
|
49
|
+
end
|
50
|
+
|
51
|
+
def serialize_value(type, value)
|
52
|
+
raise ArgumentError, "Do not know how to serialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type
|
53
|
+
return nil if value.nil?
|
54
|
+
value.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
def deserialize_value(type, value)
|
58
|
+
raise ArgumentError, "Do not know how to deserialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type
|
59
|
+
return nil if value.nil?
|
60
|
+
# For now, we will let AR handle the casting for us
|
61
|
+
value.to_s
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'freezer/frozen_record_proxy'
|
2
|
+
require 'active_record/connection_adapters/column'
|
3
|
+
|
4
|
+
module Freezer
|
5
|
+
module Serialization
|
6
|
+
module HStore
|
7
|
+
SERIALIZABLE_TYPES = [
|
8
|
+
:primary_key, :string, :text, :integer, :float, :decimal,
|
9
|
+
:datetime,:timestamp, :time, :date, :boolean
|
10
|
+
].freeze
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# TODO give each version its own module or something
|
14
|
+
def serialize(record)
|
15
|
+
# Start with the serialization format version string
|
16
|
+
hstore = {':sv'=>'1'}
|
17
|
+
|
18
|
+
columns = record.class.columns
|
19
|
+
attributes = record.attributes
|
20
|
+
|
21
|
+
columns.each do |column|
|
22
|
+
key = serialize_key(column.name, column.type)
|
23
|
+
value = serialize_value(column.type, attributes[column.name])
|
24
|
+
hstore[key] = value
|
25
|
+
end
|
26
|
+
|
27
|
+
hstore
|
28
|
+
end
|
29
|
+
|
30
|
+
def deserialize(klass, attributes, silent = false)
|
31
|
+
attributes = attributes.dup
|
32
|
+
sv = attributes.delete(':sv')
|
33
|
+
raise ArgumentError, "Unknown serialization format #{sv.to_s}" unless sv == '1'
|
34
|
+
attributes = attributes.inject({}) do |hash,(key,value)|
|
35
|
+
real_key, type = deserialize_key(key)
|
36
|
+
hash[real_key] = deserialize_value(type, value)
|
37
|
+
hash
|
38
|
+
end
|
39
|
+
FrozenRecordFactory.build(klass, attributes, silent)
|
40
|
+
end
|
41
|
+
|
42
|
+
def serialize_key(key, type)
|
43
|
+
"#{key.gsub(':','::')}:#{type}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def deserialize_key(serialized)
|
47
|
+
m = serialized.match(/(.*):([^:]+)\z/)
|
48
|
+
[m[1].gsub('::',':'), m[2].to_sym]
|
49
|
+
end
|
50
|
+
|
51
|
+
def serialize_value(type, value)
|
52
|
+
raise ArgumentError, "Do not know how to serialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type
|
53
|
+
return nil if value.nil?
|
54
|
+
value.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
def deserialize_value(type, value)
|
58
|
+
raise ArgumentError, "Do not know how to deserialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type
|
59
|
+
return nil if value.nil?
|
60
|
+
# For now, we will let AR handle the casting for us
|
61
|
+
value.to_s
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'freezer/frozen_record_proxy'
|
2
|
+
|
3
|
+
module Freezer
|
4
|
+
module Serialization
|
5
|
+
module Serialize
|
6
|
+
class << self
|
7
|
+
def serialize(record)
|
8
|
+
record.attributes.dup
|
9
|
+
end
|
10
|
+
|
11
|
+
def deserialize(klass, attributes, silent = false)
|
12
|
+
FrozenRecordFactory.build(klass, attributes.dup, silent)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: freezer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -43,22 +43,6 @@ dependencies:
|
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 3.2.4
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: activerecord-postgres-hstore
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 0.4.0
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 0.4.0
|
62
46
|
description: ''
|
63
47
|
email:
|
64
48
|
- godfreykfc@gmail.com
|
@@ -68,7 +52,9 @@ extra_rdoc_files: []
|
|
68
52
|
files:
|
69
53
|
- lib/freezer/active_record_extensions.rb
|
70
54
|
- lib/freezer/frozen_record_proxy.rb
|
71
|
-
- lib/freezer/
|
55
|
+
- lib/freezer/hstore_serialization.rb
|
56
|
+
- lib/freezer/serialization/hstore.rb
|
57
|
+
- lib/freezer/serialization/serialize.rb
|
72
58
|
- lib/freezer.rb
|
73
59
|
- README.md
|
74
60
|
- CHANGELOG.md
|
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'freezer/frozen_record_proxy'
|
2
|
-
require 'active_record/connection_adapters/column'
|
3
|
-
|
4
|
-
module Freezer
|
5
|
-
module Serialization
|
6
|
-
SERIALIZABLE_TYPES = [
|
7
|
-
:primary_key, :string, :text, :integer, :float, :decimal,
|
8
|
-
:datetime,:timestamp, :time, :date, :boolean
|
9
|
-
].freeze
|
10
|
-
|
11
|
-
class << self
|
12
|
-
# TODO give each version its own module or something
|
13
|
-
def serialize(record)
|
14
|
-
# Start with the serialization format version string
|
15
|
-
hstore = {':sv'=>'1'}
|
16
|
-
|
17
|
-
columns = record.class.columns
|
18
|
-
attributes = record.attributes
|
19
|
-
|
20
|
-
columns.each do |column|
|
21
|
-
key = serialize_key(column.name, column.type)
|
22
|
-
value = serialize_value(column.type, attributes[column.name])
|
23
|
-
hstore[key] = value
|
24
|
-
end
|
25
|
-
|
26
|
-
hstore
|
27
|
-
end
|
28
|
-
|
29
|
-
def deserialize(klass, attributes, silent = false)
|
30
|
-
attributes = attributes.dup
|
31
|
-
sv = attributes.delete(':sv')
|
32
|
-
raise ArgumentError, "Unknown serialization format #{sv.to_s}" unless sv == '1'
|
33
|
-
attributes = attributes.inject({}) do |hash,(key,value)|
|
34
|
-
real_key, type = deserialize_key(key)
|
35
|
-
hash[real_key] = deserialize_value(type, value)
|
36
|
-
hash
|
37
|
-
end
|
38
|
-
FrozenRecordFactory.build(klass, attributes, silent)
|
39
|
-
end
|
40
|
-
|
41
|
-
def serialize_key(key, type)
|
42
|
-
"#{key.gsub(':','::')}:#{type}"
|
43
|
-
end
|
44
|
-
|
45
|
-
def deserialize_key(serialized)
|
46
|
-
m = serialized.match(/(.*):([^:]+)\z/)
|
47
|
-
[m[1].gsub('::',':'), m[2].to_sym]
|
48
|
-
end
|
49
|
-
|
50
|
-
def serialize_value(type, value)
|
51
|
-
raise ArgumentError, "Do not know how to serialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type
|
52
|
-
return nil if value.nil?
|
53
|
-
value.to_s
|
54
|
-
end
|
55
|
-
|
56
|
-
def deserialize_value(type, value)
|
57
|
-
raise ArgumentError, "Do not know how to deserialize #{type.to_s}" unless SERIALIZABLE_TYPES.include? type
|
58
|
-
return nil if value.nil?
|
59
|
-
# For now, we will let AR handle the casting for us
|
60
|
-
value.to_s
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|