store_model 1.6.1 → 2.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
  SHA256:
3
- metadata.gz: f4731608dcbfcf457b9e0cce52d04766ccbc7ea38fc061a6af61ef3b6edc2a3c
4
- data.tar.gz: d5a84b08a03420aece94ea78a0c620d3e486ac4046173d6b6091974f94f4c507
3
+ metadata.gz: c15370c45ee576c10a8dacbf1ac740e0fb11e51fad7cb65dd7040e103bff70f0
4
+ data.tar.gz: 26aef12aa50c51dca2f9341986910a7bf88827491f41f393b73e1063c1fe0c4d
5
5
  SHA512:
6
- metadata.gz: 9e78d0f1f95f9982ed599f5701e06d48936f2be349189764b5fa7df6fc7a0c9ee71a17d1ae50a74c1a70bcbb037feb8e33db43131de1e880efb74c9a2c0e9c9d
7
- data.tar.gz: 7d5d82c70fe870f3abc767faae918a2a8f11bc6a9d645a8d36d12800da19951b9a8f018cdc336e5c35979a5e21847a034d1d9b76196a87c6bd1a1d0389062a80
6
+ metadata.gz: 509d1ea5ae2f710e4e04a89c1b7a52676e389edd6953fddc2dccab3a015c6f18d03e6e0c64639e2499fde389a0dc3e311a20c65afebbf4e2d6f01ae9d860b3a1
7
+ data.tar.gz: e8aa0b70959e32431d4352124cfa9834fc614c67417c53d90d935daec4ce6eb1f91606610260a46f1338cdbe9244cf5ee08348102d4e552210463f326f002fef
@@ -167,6 +167,17 @@ module StoreModel
167
167
  @unknown_attributes ||= {}
168
168
  end
169
169
 
170
+ # Serialized values for storing in db
171
+ #
172
+ # @return [Hash]
173
+ def values_for_database
174
+ result = @attributes.keys.each_with_object({}) do |key, values|
175
+ values[key] = @attributes.fetch(key).value_for_database
176
+ end
177
+ result.merge!(unknown_attributes)
178
+ result
179
+ end
180
+
170
181
  private
171
182
 
172
183
  def attribute?(attribute)
@@ -46,13 +46,36 @@ module StoreModel
46
46
  # @return [String] serialized value
47
47
  def serialize(value)
48
48
  case value
49
- when Hash, @model_klass
50
- ActiveSupport::JSON.encode(value, serialize_unknown_attributes: true)
49
+ when @model_klass
50
+ ActiveSupport::JSON.encode(value.values_for_database)
51
+ when Hash
52
+ ActiveSupport::JSON.encode(value)
51
53
  else
52
54
  super
53
55
  end
54
56
  end
55
57
 
58
+ # Converts a value from database input to the appropriate ruby type.
59
+ #
60
+ # @param value [String] value to deserialize
61
+ #
62
+ # @return [Object] deserialized value
63
+
64
+ # rubocop:disable Style/RescueModifier
65
+ def deserialize(value)
66
+ case value
67
+ when String
68
+ payload = ActiveSupport::JSON.decode(value) rescue nil
69
+ model_instance(deserialize_by_types(payload))
70
+ when Hash
71
+ model_instance(deserialize_by_types(value))
72
+ when nil
73
+ nil
74
+ else raise_cast_error(value)
75
+ end
76
+ end
77
+ # rubocop:enable Style/RescueModifier
78
+
56
79
  private
57
80
 
58
81
  def raise_cast_error(value)
@@ -63,6 +86,14 @@ module StoreModel
63
86
 
64
87
  def model_instance(value)
65
88
  @model_klass.new(value)
89
+ rescue ActiveModel::UnknownAttributeError => e
90
+ handle_unknown_attribute(value, e)
91
+ end
92
+
93
+ def deserialize_by_types(hash)
94
+ @model_klass.attribute_types.each.with_object(hash.dup) do |(key, type), value|
95
+ value[key] = type.deserialize(hash[key])
96
+ end
66
97
  end
67
98
  end
68
99
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StoreModel # :nodoc:
4
- VERSION = "1.6.1"
4
+ VERSION = "2.0.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: store_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DmitryTsepelev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-10 00:00:00.000000000 Z
11
+ date: 2023-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord