store_attribute 0.8.0 → 0.9.2

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: a6d0060f9544a3e9e005c149cc189dd6647c0c83493bbb577bb67893e2b5a5fd
4
- data.tar.gz: 0f9105dc411953cf7b3342117538e068c9ea7897220d573126bf0d4c01640726
3
+ metadata.gz: adaa8107d5917cf34ec29623a75a16fd14b7c5231ee57c7b6c0d3fdac1632b42
4
+ data.tar.gz: 8b7a96bc6da2779a1c7812d453374b312a52c77068511796c0199617f875d2e7
5
5
  SHA512:
6
- metadata.gz: 0521c55632478bc52bfcb03eab0fb9709ec2e63cc59c9eafa1dc3795742c88d7f2caf7019bb3eac3f3232006f49e0c9dc0cec4bcf619154b7f1873ccd7915201
7
- data.tar.gz: e6644235407bd7481499dbb4bfc3fb9214ec0805ebf85be79914ddf8179f7b2f9837db1f33760c8af50236608820e0dc976fad74b3f9046e70f5996c86ec251c
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
  [![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|
@@ -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}"
@@ -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.0"
4
+ VERSION = "0.9.2"
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.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: 2020-09-21 00:00:00.000000000 Z
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.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: []