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 +4 -4
- data/CHANGELOG.md +20 -1
- data/README.md +6 -2
- data/lib/store_attribute/active_record/store.rb +34 -7
- data/lib/store_attribute/active_record/type/typed_store.rb +4 -0
- data/lib/store_attribute/version.rb +1 -1
- metadata +7 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30037caf4b9958aaeb466c389e8e59221c1f165758b98ea8935aeee305772351
|
4
|
+
data.tar.gz: 85326e5621d54adc901f281c9762a313b21053e4e3189fc49bb1fac025d76451
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
[](https://cultofmartians.com/tasks/store-attribute-defaults.html#task)
|
2
|
-
[](https://rubygems.org/gems/store_attribute)
|
2
|
+
[](https://rubygems.org/gems/store_attribute)
|
3
|
+

|
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.
|
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
|
-
|
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
|
-
|
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}"
|
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.
|
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:
|
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.
|
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.
|
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: []
|