store_attribute 0.8.1 → 0.9.0

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: 23a5221f6ede53f448653e54b3aa7432134c56e06369162a5370470e954fd1a1
4
- data.tar.gz: 8df0761793ef5c39cda9c97039ca501fa8f9393fcb3ecc8abf85367414e3533c
3
+ metadata.gz: 8e666327899587f17df5c5196abd1f6094388d08c4ca4c020b9a67f182fa0660
4
+ data.tar.gz: 6a23e7d6122483843caaa7ae6d2da59e33e0c250c96306839bbb4cac8242ea87
5
5
  SHA512:
6
- metadata.gz: 2b4cedb5566a137159e863a59dc38797dcf7ddc590f779a957a6b6f6ac73e2c8f05f82876649304143f5160eefcbfc001773e9219d6d1d044fe9f483bad9c426
7
- data.tar.gz: f95f478824a19e55243ca1b1cda44c284db8429b9afcad333fb7933ebca2c2ef54f0fbe98095523f1564a15e31f3a236e1b5546a249023c0c196635d8ec175c7
6
+ metadata.gz: b61d2f76d32c9ddbe3c993896a1826662b8afc881e7b72674ab21d8954e70dbae25630996ab920eeeb752436e433949bec36914d3b6a3278909ca85fce889de5
7
+ data.tar.gz: 07bb42459a9925b247b6cea363df401c4c9a92787bf6aca1de2bf795575e5895f331a0d4cd983e9b82ee1d27d0a35b47cd6a791314a756fcf78b438e8a25aea0
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.9.0 (2021-08-17) 📉
6
+
7
+ - Default values no longer marked as dirty. ([@markedmondson][])
8
+
5
9
  ## 0.8.1 (2020-12-03)
6
10
 
7
11
  - Fix adding dirty tracking methods for `store_attribute`. ([@palkan][])
@@ -36,4 +40,5 @@
36
40
  [@dreikanter]: https://github.com/dreikanter
37
41
  [@SumLare]: https://github.com/SumLare
38
42
  [@glaszig]: https://github.com/glaszig
39
- [@ioki-klaus]: https://github.com/ioki-klaus
43
+ [@ioki-klaus]: https://github.com/ioki-klaus
44
+ [@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
@@ -61,10 +61,29 @@ 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
+ _store_accessors_module.module_eval do
67
+ define_method("changes") do
68
+ return @changes if defined?(@changes)
69
+ changes = super()
70
+ self.class.local_stored_attributes.each do |accessor, attributes|
71
+ next unless attribute_changed?(accessor)
72
+
73
+ prev_store, new_store = changes[accessor]
74
+ prev_store.each do |key, value|
75
+ if new_store[key] == value
76
+ changes[accessor][0].except!(key)
77
+ changes[accessor][1].except!(key)
78
+ end
79
+ end
80
+ end
81
+ @changes = changes
82
+ end
83
+ end
84
+
85
+ _define_dirty_tracking_methods(store_name, keys + typed_keys.keys, prefix: accessor_prefix, suffix: accessor_suffix)
86
+
68
87
  typed_keys.each do |key, type|
69
88
  store_attribute(store_name, key, type, prefix: prefix, suffix: suffix)
70
89
  end
@@ -128,11 +147,15 @@ module ActiveRecord
128
147
  _define_predicate_method(name, prefix: prefix, suffix: suffix) if type == :boolean
129
148
 
130
149
  # Rails >6.0
131
- if method(:decorate_attribute_type).parameters.count { |type, _| type == :req } == 1
150
+ if !respond_to?(:decorate_attribute_type) || method(:decorate_attribute_type).parameters.count { |type, _| type == :req } == 1
132
151
  attr_name = store_name.to_s
133
152
  was_type = attributes_to_define_after_schema_loads[attr_name]&.first
134
153
  attribute(attr_name) do |subtype|
135
- Type::TypedStore.create_from_type(_lookup_cast_type(attr_name, was_type, {}), name, type, **options)
154
+ if defined?(_lookup_cast_type)
155
+ Type::TypedStore.create_from_type(_lookup_cast_type(attr_name, was_type, {}), name, type, **options)
156
+ else
157
+ Type::TypedStore.create_from_type(subtype, name, type, **options)
158
+ end
136
159
  end
137
160
  else
138
161
  decorate_attribute_type(store_name, "typed_accessor_for_#{name}") do |subtype|
@@ -140,9 +163,9 @@ module ActiveRecord
140
163
  end
141
164
  end
142
165
 
143
- _define_dirty_tracking_methods(store_name, [name], prefix: prefix, suffix: suffix)
144
-
145
166
  _prepare_local_stored_attributes(store_name, name)
167
+
168
+ _define_dirty_tracking_methods(store_name, [name], prefix: prefix, suffix: suffix)
146
169
  end
147
170
 
148
171
  def _prepare_local_stored_attributes(store_name, *keys) # :nodoc:
@@ -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.0"
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.0
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-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -118,7 +118,7 @@ metadata:
118
118
  documentation_uri: http://github.com/palkan/store_attribute
119
119
  homepage_uri: http://github.com/palkan/store_attribute
120
120
  source_code_uri: http://github.com/palkan/store_attribute
121
- post_install_message:
121
+ post_install_message:
122
122
  rdoc_options: []
123
123
  require_paths:
124
124
  - lib
@@ -133,8 +133,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
133
  - !ruby/object:Gem::Version
134
134
  version: '0'
135
135
  requirements: []
136
- rubygems_version: 3.0.6
137
- signing_key:
136
+ rubygems_version: 3.2.15
137
+ signing_key:
138
138
  specification_version: 4
139
139
  summary: ActiveRecord extension which adds typecasting to store accessors
140
140
  test_files: []