store_attribute 0.8.0 → 0.9.2
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 +18 -1
- data/README.md +6 -2
- data/lib/store_attribute/active_record/store.rb +30 -5
- 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: adaa8107d5917cf34ec29623a75a16fd14b7c5231ee57c7b6c0d3fdac1632b42
|
|
4
|
+
data.tar.gz: 8b7a96bc6da2779a1c7812d453374b312a52c77068511796c0199617f875d2e7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9fb0f5ae8ac985d43c909df92930e8a60dcf8910d967a563b23524021ab8acc014fa6e83cbcca6687855c2372c48450a65b5ebb801475f1dd0a7100a9a7a8a6c
|
|
7
|
+
data.tar.gz: 54703853d6172fd22bd54bec3460045dd298aeb12984bd6763b45a8a48943f6ff20329cef4b744bfd36732bb5e1a3ff0bac97f82fb15cf06b170b1592025d577
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
## master
|
|
4
4
|
|
|
5
|
+
## 0.9.2 (2021-10-13)
|
|
6
|
+
|
|
7
|
+
- Fix bug with store mutation during changes calculation. ([@palkan][])
|
|
8
|
+
|
|
9
|
+
## 0.9.1
|
|
10
|
+
|
|
11
|
+
- Fix bug with dirty nullable stores. ([@palkan][])
|
|
12
|
+
|
|
13
|
+
## 0.9.0 (2021-08-17) 📉
|
|
14
|
+
|
|
15
|
+
- Default values no longer marked as dirty. ([@markedmondson][])
|
|
16
|
+
|
|
17
|
+
## 0.8.1 (2020-12-03)
|
|
18
|
+
|
|
19
|
+
- Fix adding dirty tracking methods for `store_attribute`. ([@palkan][])
|
|
20
|
+
|
|
5
21
|
## 0.8.0
|
|
6
22
|
|
|
7
23
|
- Add Rails 6.1 compatibility. ([@palkan][])
|
|
@@ -32,4 +48,5 @@
|
|
|
32
48
|
[@dreikanter]: https://github.com/dreikanter
|
|
33
49
|
[@SumLare]: https://github.com/SumLare
|
|
34
50
|
[@glaszig]: https://github.com/glaszig
|
|
35
|
-
[@ioki-klaus]: https://github.com/ioki-klaus
|
|
51
|
+
[@ioki-klaus]: https://github.com/ioki-klaus
|
|
52
|
+
[@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|
|
|
@@ -141,6 +145,8 @@ module ActiveRecord
|
|
|
141
145
|
end
|
|
142
146
|
|
|
143
147
|
_prepare_local_stored_attributes(store_name, name)
|
|
148
|
+
|
|
149
|
+
_define_dirty_tracking_methods(store_name, [name], prefix: prefix, suffix: suffix)
|
|
144
150
|
end
|
|
145
151
|
|
|
146
152
|
def _prepare_local_stored_attributes(store_name, *keys) # :nodoc:
|
|
@@ -179,6 +185,25 @@ module ActiveRecord
|
|
|
179
185
|
|
|
180
186
|
def _define_dirty_tracking_methods(store_attribute, keys, prefix: nil, suffix: nil)
|
|
181
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
|
+
changes[accessor] = prev_store, new_store
|
|
203
|
+
end
|
|
204
|
+
changes
|
|
205
|
+
end
|
|
206
|
+
|
|
182
207
|
keys.flatten.each do |key|
|
|
183
208
|
key = key.to_s
|
|
184
209
|
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.2
|
|
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-10-13 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: []
|