store_model 1.6.2 → 2.0.1

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: ccb71e398694ddaf5061f4088a8172ec4c6df21e42934dc160d393948ed59882
4
- data.tar.gz: efe5e68f750c0bb31ef030de7a7a01f761f7c03b95875dd78dba95256fe7e0fa
3
+ metadata.gz: 5678f8d809e7ed7745c5bd21b10bb455ecef32fac89cbc0fe9d5928c99dcf7c8
4
+ data.tar.gz: 13fd4acba36ff7b96d8111043de74e94442f63a02d718571fdda3682521e0dab
5
5
  SHA512:
6
- metadata.gz: 83f3624df6d013c1927eedcea35ef8c4abc1cfc95c4312a72af8d83d1e5e88f910527ca0ebdab99fce8db004e621dfc38f6b61e02abd3e684aea2c6d5615c334
7
- data.tar.gz: 6811e01828fb9c9464513793e369bb436c48cb9adb23d2a4b01ef59d21e7a97e8353f9b4493f64e8a711e8388c3cc59f6e6bcf376b1d133d81b9dbd440dd6034
6
+ metadata.gz: e57e9ebc4b7e6547c75c8b0375742194eafa6104d2abfd2b55e9e657c64e2af935e99505bb712e8e1ef3d38123f4852d89603f10bfacfa620ec2cb38751995b6
7
+ data.tar.gz: a2c9e761568bc100697c7240762ed27aac4d8ccde2429f4e037357121351f120a1b9a17909f6670f0215691f909032131979ebbe0001d67bba1d2cadeebaadeb
@@ -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]) if hash.key?(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.1"
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.1
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-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord