store_model 3.0.2 → 4.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: c7053cb5a3a84cc30ec1e8697c526bf433e13ac5974f65f580a4af39a50e9571
4
- data.tar.gz: 44ee1c662c29687d960ebbc18b640700f6d2156f1f57c09d92522d646bc2d6cc
3
+ metadata.gz: e3a1d792e0b67515ef121219d4568ef05a2589cb7bf1df33ac36af0f5e0b0efb
4
+ data.tar.gz: 98f11df54c5f5b6cd9d4604e889faf95e7b3f3dd85e97c37fe707c112565fc72
5
5
  SHA512:
6
- metadata.gz: 2a052f5254c66d11c3c1465cb277271dbc4459065eea2e6a66e24cd127183c8592f00f36d96325b9c275bfbf7d65c801ecc14662d8422d19cf018b62aec02e75
7
- data.tar.gz: d903a10321ddfcfe297ba2e2ab7c9659eccca30c016ffa1152ae95fa5dda1b52617d6834d46b46d9788ba8e0767c7c968d97dfbb5b5876d087395f9f5ed7c4e6
6
+ metadata.gz: 01a49de46f09b2bff6e25f760b2067e4984cf32851feea67bab4c95ff25bd1dd64f31346e286df2f532bbc6f4d37f9d6d8a3a16be1cacde32f64ccbc24fdc2bd
7
+ data.tar.gz: 73b1a450ba0f2eaca9f66c0761d30725af3403fa425bd8b7dca15b5d4d7c794948c9671ab6d6c78304a547db6401ba6388db0f703750483c47bc530995c6c1d5
data/README.md CHANGED
@@ -22,6 +22,8 @@ class Product < ApplicationRecord
22
22
  end
23
23
  ```
24
24
 
25
+ You can support my open–source work [here](https://boosty.to/dmitry_tsepelev).
26
+
25
27
  ## Why should I wrap my JSON columns?
26
28
 
27
29
  Imagine that you have a model `Product` with a `jsonb` column called `configuration`. This is how you likely gonna work with this column:
@@ -228,7 +228,7 @@ module StoreModel
228
228
  .attribute_types
229
229
  .select { |_, type| type.is_a?(StoreModel::Types::EnumType) }
230
230
 
231
- enum_mappings.each do |name, _|
231
+ enum_mappings.each_key do |name|
232
232
  next unless json.key?(name)
233
233
 
234
234
  json[name] = public_send(name).as_json unless json[name].nil?
@@ -60,19 +60,20 @@ module StoreModel
60
60
  # If schema loaded the attribute_types already populated and we can safely use it
61
61
  # See ActiveRecord::ModelSchema#load_schema!
62
62
  def nested_attribute_type(attribute)
63
- if self < ActiveRecord::Base && !schema_loaded?
64
- attributes_to_define_after_schema_loads[attribute.to_s]&.first
65
- else
66
- attribute_types[attribute.to_s]
67
- end
63
+ attribute_types[attribute.to_s]
68
64
  end
69
65
 
70
- def define_store_model_attr_accessors(attribute, options)
66
+ def define_store_model_attr_accessors(attribute, options) # rubocop:disable Metrics/MethodLength
71
67
  case nested_attribute_type(attribute)
72
68
  when Types::OneBase
73
69
  define_association_setter_for_single(attribute, options)
74
70
  define_method "#{attribute}_attributes=" do |*args, **kwargs|
75
- send("#{attribute}=", *args, **kwargs)
71
+ existing_model = send(attribute)
72
+ if existing_model && options[:update_only]
73
+ existing_model.assign_attributes(*args, **kwargs)
74
+ else
75
+ send("#{attribute}=", *args, **kwargs)
76
+ end
76
77
  end
77
78
  when Types::ManyBase
78
79
  define_association_setter_for_many(attribute, options)
@@ -99,7 +100,7 @@ module StoreModel
99
100
  return unless options&.dig(:allow_destroy)
100
101
 
101
102
  define_method "#{association}=" do |attributes|
102
- if ActiveRecord::Type::Boolean.new.cast(attributes.stringify_keys.dig("_destroy"))
103
+ if ActiveRecord::Type::Boolean.new.cast(attributes.stringify_keys["_destroy"])
103
104
  super(nil)
104
105
  else
105
106
  super(attributes)
@@ -116,7 +117,7 @@ module StoreModel
116
117
 
117
118
  if options&.dig(:allow_destroy)
118
119
  attributes.reject! do |attribute|
119
- ActiveRecord::Type::Boolean.new.cast(attribute.stringify_keys.dig("_destroy"))
120
+ ActiveRecord::Type::Boolean.new.cast(attribute.stringify_keys["_destroy"])
120
121
  end
121
122
  end
122
123
 
@@ -14,6 +14,7 @@ module StoreModel
14
14
  def initialize(mapping, raise_on_invalid_values)
15
15
  @mapping = mapping
16
16
  @raise_on_invalid_values = raise_on_invalid_values
17
+ super()
17
18
  end
18
19
 
19
20
  # Returns type
@@ -14,6 +14,7 @@ module StoreModel
14
14
  # @return [StoreModel::Types::Many]
15
15
  def initialize(model_klass)
16
16
  @model_klass = model_klass
17
+ super()
17
18
  end
18
19
 
19
20
  # Returns type
@@ -16,6 +16,7 @@ module StoreModel
16
16
  # @return [StoreModel::Types::PolymorphicArrayType ]
17
17
  def initialize(model_wrapper)
18
18
  @model_wrapper = model_wrapper
19
+ super()
19
20
  end
20
21
 
21
22
  # Returns type
@@ -13,6 +13,7 @@ module StoreModel
13
13
  # @return [StoreModel::Types::One]
14
14
  def initialize(model_klass)
15
15
  @model_klass = model_klass
16
+ super()
16
17
  end
17
18
 
18
19
  # Returns type
@@ -27,12 +28,17 @@ module StoreModel
27
28
  # @param value [Object] a value to cast
28
29
  #
29
30
  # @return StoreModel::Model
30
- def cast_value(value)
31
- case value
32
- when String then decode_and_initialize(value)
33
- when Hash then model_instance(value)
34
- when @model_klass, nil then value
35
- else raise_cast_error(value)
31
+ def cast_value(value) # rubocop:disable Metrics/MethodLength
32
+ return nil if value.nil?
33
+
34
+ if value.is_a?(String)
35
+ decode_and_initialize(value)
36
+ elsif value.is_a?(@model_klass)
37
+ value
38
+ elsif value.respond_to?(:to_h) # Hash itself included
39
+ model_instance(value.to_h)
40
+ else
41
+ raise_cast_error(value)
36
42
  end
37
43
  rescue ActiveModel::UnknownAttributeError => e
38
44
  handle_unknown_attribute(value, e)
@@ -15,6 +15,7 @@ module StoreModel
15
15
  # @return [StoreModel::Types::OnePolymorphic ]
16
16
  def initialize(model_wrapper)
17
17
  @model_wrapper = model_wrapper
18
+ super()
18
19
  end
19
20
 
20
21
  # Returns type
@@ -29,11 +30,13 @@ module StoreModel
29
30
  # @param value [Object] a value to cast
30
31
  #
31
32
  # @return StoreModel::Model
32
- def cast_value(value)
33
- case value
34
- when String then decode_and_initialize(value)
35
- when Hash then extract_model_klass(value).new(value)
36
- when nil then value
33
+ def cast_value(value) # rubocop:disable Metrics/MethodLength
34
+ return nil if value.nil?
35
+
36
+ if value.is_a?(String)
37
+ decode_and_initialize(value)
38
+ elsif value.respond_to?(:to_h) # Hash itself included
39
+ extract_model_klass(value).new(value.to_h)
37
40
  else
38
41
  raise_cast_error(value) unless value.class.ancestors.include?(StoreModel::Model)
39
42
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StoreModel # :nodoc:
4
- VERSION = "3.0.2"
4
+ VERSION = "4.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: 3.0.2
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - DmitryTsepelev
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-05 00:00:00.000000000 Z
11
+ date: 2024-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5.2'
19
+ version: '7.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '5.2'
26
+ version: '7.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 0.64.0
61
+ version: 1.65.1
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 0.64.0
68
+ version: 1.65.1
69
69
  description: Gem for working with JSON-backed attributes as ActiveRecord models
70
70
  email:
71
71
  - dmitry.a.tsepelev@gmail.com
@@ -107,7 +107,7 @@ homepage: https://github.com/DmitryTsepelev/store_model
107
107
  licenses:
108
108
  - MIT
109
109
  metadata: {}
110
- post_install_message:
110
+ post_install_message:
111
111
  rdoc_options: []
112
112
  require_paths:
113
113
  - lib
@@ -115,15 +115,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - ">="
117
117
  - !ruby/object:Gem::Version
118
- version: '2.6'
118
+ version: '3.0'
119
119
  required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  requirements:
121
121
  - - ">="
122
122
  - !ruby/object:Gem::Version
123
123
  version: '0'
124
124
  requirements: []
125
- rubygems_version: 3.1.6
126
- signing_key:
125
+ rubygems_version: 3.5.11
126
+ signing_key:
127
127
  specification_version: 4
128
128
  summary: Gem for working with JSON-backed attributes as ActiveRecord models
129
129
  test_files: []