store_model 1.6.2 → 2.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ccb71e398694ddaf5061f4088a8172ec4c6df21e42934dc160d393948ed59882
4
- data.tar.gz: efe5e68f750c0bb31ef030de7a7a01f761f7c03b95875dd78dba95256fe7e0fa
3
+ metadata.gz: c15370c45ee576c10a8dacbf1ac740e0fb11e51fad7cb65dd7040e103bff70f0
4
+ data.tar.gz: 26aef12aa50c51dca2f9341986910a7bf88827491f41f393b73e1063c1fe0c4d
5
5
  SHA512:
6
- metadata.gz: 83f3624df6d013c1927eedcea35ef8c4abc1cfc95c4312a72af8d83d1e5e88f910527ca0ebdab99fce8db004e621dfc38f6b61e02abd3e684aea2c6d5615c334
7
- data.tar.gz: 6811e01828fb9c9464513793e369bb436c48cb9adb23d2a4b01ef59d21e7a97e8353f9b4493f64e8a711e8388c3cc59f6e6bcf376b1d133d81b9dbd440dd6034
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.2"
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.2
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-17 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