store_attribute 0.8.1 → 0.9.3

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: 23a5221f6ede53f448653e54b3aa7432134c56e06369162a5370470e954fd1a1
4
- data.tar.gz: 8df0761793ef5c39cda9c97039ca501fa8f9393fcb3ecc8abf85367414e3533c
3
+ metadata.gz: 30037caf4b9958aaeb466c389e8e59221c1f165758b98ea8935aeee305772351
4
+ data.tar.gz: 85326e5621d54adc901f281c9762a313b21053e4e3189fc49bb1fac025d76451
5
5
  SHA512:
6
- metadata.gz: 2b4cedb5566a137159e863a59dc38797dcf7ddc590f779a957a6b6f6ac73e2c8f05f82876649304143f5160eefcbfc001773e9219d6d1d044fe9f483bad9c426
7
- data.tar.gz: f95f478824a19e55243ca1b1cda44c284db8429b9afcad333fb7933ebca2c2ef54f0fbe98095523f1564a15e31f3a236e1b5546a249023c0c196635d8ec175c7
6
+ metadata.gz: 2c638242092c8e601e17d9d45c603ca2135fa74cc44fa5b57466d37a1f83c43f870570abd27c44e3d7f6d8f2f335c67c16af5c61b1e89bacc4140e4c3a441749
7
+ data.tar.gz: 668a9a68039681b1e5e1812d762e95b08129b969d1b740e3bb80b1ad5aec1ac3bb8acd69ccff611da65b9718320f85f0ade4d2e89c2242ed87cb23e8deabb197
data/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.9.3 (2021-11-17)
6
+
7
+ - Fix keeping empty store hashes in the changes. ([@markedmondson][])
8
+
9
+ See [PR#22](https://github.com/palkan/store_attribute/pull/22).
10
+
11
+ ## 0.9.2 (2021-10-13)
12
+
13
+ - Fix bug with store mutation during changes calculation. ([@palkan][])
14
+
15
+ ## 0.9.1
16
+
17
+ - Fix bug with dirty nullable stores. ([@palkan][])
18
+
19
+ ## 0.9.0 (2021-08-17) 📉
20
+
21
+ - Default values no longer marked as dirty. ([@markedmondson][])
22
+
5
23
  ## 0.8.1 (2020-12-03)
6
24
 
7
25
  - Fix adding dirty tracking methods for `store_attribute`. ([@palkan][])
@@ -36,4 +54,5 @@
36
54
  [@dreikanter]: https://github.com/dreikanter
37
55
  [@SumLare]: https://github.com/SumLare
38
56
  [@glaszig]: https://github.com/glaszig
39
- [@ioki-klaus]: https://github.com/ioki-klaus
57
+ [@ioki-klaus]: https://github.com/ioki-klaus
58
+ [@markedmondson]: https://github.com/markedmondson
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  [![Cult Of Martians](http://cultofmartians.com/assets/badges/badge.svg)](https://cultofmartians.com/tasks/store-attribute-defaults.html#task)
2
- [![Gem Version](https://badge.fury.io/rb/store_attribute.svg)](https://rubygems.org/gems/store_attribute) [![Build Status](https://travis-ci.org/palkan/store_attribute.svg?branch=master)](https://travis-ci.org/palkan/store_attribute)
2
+ [![Gem Version](https://badge.fury.io/rb/store_attribute.svg)](https://rubygems.org/gems/store_attribute)
3
+ ![Build](https://github.com/palkan/store_attribute/workflows/Build/badge.svg)
3
4
 
4
5
  ## Store Attribute
5
6
 
@@ -15,7 +16,7 @@ In your Gemfile:
15
16
 
16
17
  ```ruby
17
18
  # for Rails 5+ (6 is supported)
18
- gem "store_attribute", "~> 0.5.0"
19
+ gem "store_attribute", "~> 0.8.0"
19
20
 
20
21
  # for Rails 4.2
21
22
  gem "store_attribute", "~> 0.4.0"
@@ -48,6 +49,7 @@ class MegaUser < User
48
49
  store_attribute :settings, :login_at, :datetime
49
50
  store_attribute :settings, :active, :boolean
50
51
  store_attribute :settings, :color, :string, default: "red"
52
+ store_attribute :settings, :colors, :json, default: ["red", "blue"]
51
53
  store_attribute :settings, :data, :datetime, default: -> { Time.now }
52
54
  end
53
55
 
@@ -59,6 +61,8 @@ u.ratio # => 63
59
61
  u.active # => false
60
62
  # Default value is set
61
63
  u.color # => red
64
+ # Default array is set
65
+ u.colors # => ["red", "blue"]
62
66
  # A dynamic default can also be provided
63
67
  u.data # => Current time
64
68
  # And we also have a predicate method
@@ -6,7 +6,7 @@ require "store_attribute/active_record/type/typed_store"
6
6
  module ActiveRecord
7
7
  module Store
8
8
  module ClassMethods # :nodoc:
9
- alias _orig_store store
9
+ alias_method :_orig_store, :store
10
10
  # Defines store on this model.
11
11
  #
12
12
  # +store_name+ The name of the store.
@@ -61,10 +61,10 @@ module ActiveRecord
61
61
 
62
62
  _define_accessors_methods(store_name, *keys, prefix: accessor_prefix, suffix: accessor_suffix)
63
63
 
64
- _define_dirty_tracking_methods(store_name, keys + typed_keys.keys, prefix: accessor_prefix, suffix: accessor_suffix)
65
-
66
64
  _prepare_local_stored_attributes(store_name, *keys)
67
65
 
66
+ _define_dirty_tracking_methods(store_name, keys + typed_keys.keys, prefix: accessor_prefix, suffix: accessor_suffix)
67
+
68
68
  typed_keys.each do |key, type|
69
69
  store_attribute(store_name, key, type, prefix: prefix, suffix: suffix)
70
70
  end
@@ -128,11 +128,15 @@ module ActiveRecord
128
128
  _define_predicate_method(name, prefix: prefix, suffix: suffix) if type == :boolean
129
129
 
130
130
  # Rails >6.0
131
- if method(:decorate_attribute_type).parameters.count { |type, _| type == :req } == 1
131
+ if !respond_to?(:decorate_attribute_type) || method(:decorate_attribute_type).parameters.count { |type, _| type == :req } == 1
132
132
  attr_name = store_name.to_s
133
133
  was_type = attributes_to_define_after_schema_loads[attr_name]&.first
134
134
  attribute(attr_name) do |subtype|
135
- Type::TypedStore.create_from_type(_lookup_cast_type(attr_name, was_type, {}), name, type, **options)
135
+ if defined?(_lookup_cast_type)
136
+ Type::TypedStore.create_from_type(_lookup_cast_type(attr_name, was_type, {}), name, type, **options)
137
+ else
138
+ Type::TypedStore.create_from_type(subtype, name, type, **options)
139
+ end
136
140
  end
137
141
  else
138
142
  decorate_attribute_type(store_name, "typed_accessor_for_#{name}") do |subtype|
@@ -140,9 +144,9 @@ module ActiveRecord
140
144
  end
141
145
  end
142
146
 
143
- _define_dirty_tracking_methods(store_name, [name], prefix: prefix, suffix: suffix)
144
-
145
147
  _prepare_local_stored_attributes(store_name, name)
148
+
149
+ _define_dirty_tracking_methods(store_name, [name], prefix: prefix, suffix: suffix)
146
150
  end
147
151
 
148
152
  def _prepare_local_stored_attributes(store_name, *keys) # :nodoc:
@@ -181,6 +185,29 @@ module ActiveRecord
181
185
 
182
186
  def _define_dirty_tracking_methods(store_attribute, keys, prefix: nil, suffix: nil)
183
187
  _store_accessors_module.module_eval do
188
+ define_method("changes") do
189
+ changes = super()
190
+ self.class.local_stored_attributes.each do |accessor, attributes|
191
+ next unless attribute_changed?(accessor)
192
+
193
+ prev_store, new_store = changes[accessor].map(&:dup)
194
+
195
+ prev_store&.each do |key, value|
196
+ if new_store[key] == value
197
+ prev_store.except!(key)
198
+ new_store&.except!(key)
199
+ end
200
+ end
201
+
202
+ if prev_store.present? || new_store.present?
203
+ changes[accessor] = prev_store, new_store
204
+ else
205
+ changes.delete(accessor)
206
+ end
207
+ end
208
+ changes
209
+ end
210
+
184
211
  keys.flatten.each do |key|
185
212
  key = key.to_s
186
213
  accessor_key = "#{prefix}#{key}#{suffix}"
@@ -43,6 +43,10 @@ module ActiveRecord
43
43
  hash
44
44
  end
45
45
 
46
+ def changed_in_place?(raw_old_value, new_value)
47
+ raw_old_value != serialize(new_value)
48
+ end
49
+
46
50
  def serialize(value)
47
51
  return super(value) unless value.is_a?(Hash)
48
52
  typed_casted = {}
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StoreAttribute # :nodoc:
4
- VERSION = "0.8.1"
4
+ VERSION = "0.9.3"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: store_attribute
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - palkan
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-03 00:00:00.000000000 Z
11
+ date: 2021-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -52,34 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '13.0'
55
- - !ruby/object:Gem::Dependency
56
- name: rubocop-md
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '0.3'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '0.3'
69
- - !ruby/object:Gem::Dependency
70
- name: standard
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 0.2.0
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: 0.2.0
83
55
  - !ruby/object:Gem::Dependency
84
56
  name: rspec
85
57
  requirement: !ruby/object:Gem::Requirement
@@ -118,7 +90,7 @@ metadata:
118
90
  documentation_uri: http://github.com/palkan/store_attribute
119
91
  homepage_uri: http://github.com/palkan/store_attribute
120
92
  source_code_uri: http://github.com/palkan/store_attribute
121
- post_install_message:
93
+ post_install_message:
122
94
  rdoc_options: []
123
95
  require_paths:
124
96
  - lib
@@ -126,15 +98,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
98
  requirements:
127
99
  - - ">="
128
100
  - !ruby/object:Gem::Version
129
- version: 2.4.0
101
+ version: 2.5.0
130
102
  required_rubygems_version: !ruby/object:Gem::Requirement
131
103
  requirements:
132
104
  - - ">="
133
105
  - !ruby/object:Gem::Version
134
106
  version: '0'
135
107
  requirements: []
136
- rubygems_version: 3.0.6
137
- signing_key:
108
+ rubygems_version: 3.2.22
109
+ signing_key:
138
110
  specification_version: 4
139
111
  summary: ActiveRecord extension which adds typecasting to store accessors
140
112
  test_files: []