store_attribute 0.7.1 → 0.8.0

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: 941970a7a98bfa915d206d2fde758075a81bc610109426e0eaa74859d81bfde7
4
- data.tar.gz: 3bb9f5fa94b6f9f321006172e9f8cb4a4e7c9ba7030364f8468c829989a3f5d7
3
+ metadata.gz: a6d0060f9544a3e9e005c149cc189dd6647c0c83493bbb577bb67893e2b5a5fd
4
+ data.tar.gz: 0f9105dc411953cf7b3342117538e068c9ea7897220d573126bf0d4c01640726
5
5
  SHA512:
6
- metadata.gz: ac9e82f2c78173e0054ea97f1c3d1318fd36b671b531b71d3f1e73be96a3247d7565b43cd27b21d3c2f01b6585143eeddb75a9cec99ef43cd77e0d43a3035130
7
- data.tar.gz: edd8234b7dc2c704d8f3086e29641a9ff1fa866f6266341d71c6f566dfb8f72fed3d360b972b0c63c41a5c0a383af645655d75d8beabb731521ab97f4b38a8da
6
+ metadata.gz: 0521c55632478bc52bfcb03eab0fb9709ec2e63cc59c9eafa1dc3795742c88d7f2caf7019bb3eac3f3232006f49e0c9dc0cec4bcf619154b7f1873ccd7915201
7
+ data.tar.gz: e6644235407bd7481499dbb4bfc3fb9214ec0805ebf85be79914ddf8179f7b2f9837db1f33760c8af50236608820e0dc976fad74b3f9046e70f5996c86ec251c
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.8.0
6
+
7
+ - Add Rails 6.1 compatibility. ([@palkan][])
8
+
9
+ - Add support for `prefix` and `suffix` options. ([@palkan][])
10
+
5
11
  ## 0.7.1
6
12
 
7
13
  - Fixed bug with `store` called without accessors. ([@ioki-klaus][])
data/README.md CHANGED
@@ -1,3 +1,4 @@
1
+ [![Cult Of Martians](http://cultofmartians.com/assets/badges/badge.svg)](https://cultofmartians.com/tasks/store-attribute-defaults.html#task)
1
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
3
 
3
4
  ## Store Attribute
@@ -44,24 +44,29 @@ module ActiveRecord
44
44
  #
45
45
  # +typed_keys+ The key-to-type hash of the accesors with type to the store.
46
46
  #
47
+ # +prefix+ Accessor method name prefix
48
+ #
49
+ # +suffix+ Accessor method name suffix
50
+ #
47
51
  # Examples:
48
52
  #
49
53
  # class SuperUser < User
50
54
  # store_accessor :settings, :privileges, login_at: :datetime
51
55
  # end
52
- def store_accessor(store_name, *keys, **typed_keys)
56
+ def store_accessor(store_name, *keys, prefix: nil, suffix: nil, **typed_keys)
53
57
  keys = keys.flatten
54
58
  typed_keys = typed_keys.except(keys)
55
59
 
56
- _define_accessors_methods(store_name, *keys)
60
+ accessor_prefix, accessor_suffix = _normalize_prefix_suffix(store_name, prefix, suffix)
61
+
62
+ _define_accessors_methods(store_name, *keys, prefix: accessor_prefix, suffix: accessor_suffix)
57
63
 
58
- _define_dirty_tracking_methods(store_name, keys)
59
- _define_dirty_tracking_methods(store_name, typed_keys.keys)
64
+ _define_dirty_tracking_methods(store_name, keys + typed_keys.keys, prefix: accessor_prefix, suffix: accessor_suffix)
60
65
 
61
66
  _prepare_local_stored_attributes(store_name, *keys)
62
67
 
63
68
  typed_keys.each do |key, type|
64
- store_attribute(store_name, key, type)
69
+ store_attribute(store_name, key, type, prefix: prefix, suffix: suffix)
65
70
  end
66
71
  end
67
72
 
@@ -78,6 +83,10 @@ module ActiveRecord
78
83
  # +type+ A symbol such as +:string+ or +:integer+, or a type object
79
84
  # to be used for the accessor.
80
85
  #
86
+ # +prefix+ Accessor method name prefix
87
+ #
88
+ # +suffix+ Accessor method name suffix
89
+ #
81
90
  # +options+ A hash of cast type options such as +precision+, +limit+, +scale+.
82
91
  #
83
92
  # Examples:
@@ -85,13 +94,16 @@ module ActiveRecord
85
94
  # class MegaUser < User
86
95
  # store_attribute :settings, :ratio, :integer, limit: 1
87
96
  # store_attribute :settings, :login_at, :datetime
97
+ #
98
+ # store_attribute :extra, :version, :integer, prefix: :meta
88
99
  # end
89
100
  #
90
- # u = MegaUser.new(active: false, login_at: '2015-01-01 00:01', ratio: "63.4608")
101
+ # u = MegaUser.new(active: false, login_at: '2015-01-01 00:01', ratio: "63.4608", meta_version: "1")
91
102
  #
92
103
  # u.login_at.is_a?(DateTime) # => true
93
104
  # u.login_at = DateTime.new(2015,1,1,11,0,0)
94
105
  # u.ratio # => 63
106
+ # u.meta_version #=> 1
95
107
  # u.reload
96
108
  #
97
109
  # # After loading record from db store contains casted data
@@ -108,13 +120,24 @@ module ActiveRecord
108
120
  # u.settings['ratio'] # => 3
109
121
  #
110
122
  # For more examples on using types, see documentation for ActiveRecord::Attributes.
111
- def store_attribute(store_name, name, type, **options)
112
- _define_accessors_methods(store_name, name)
123
+ def store_attribute(store_name, name, type, prefix: nil, suffix: nil, **options)
124
+ prefix, suffix = _normalize_prefix_suffix(store_name, prefix, suffix)
125
+
126
+ _define_accessors_methods(store_name, name, prefix: prefix, suffix: suffix)
113
127
 
114
- _define_predicate_method(name) if type == :boolean
128
+ _define_predicate_method(name, prefix: prefix, suffix: suffix) if type == :boolean
115
129
 
116
- decorate_attribute_type(store_name, "typed_accessor_for_#{name}") do |subtype|
117
- Type::TypedStore.create_from_type(subtype, name, type, **options)
130
+ # Rails >6.0
131
+ if method(:decorate_attribute_type).parameters.count { |type, _| type == :req } == 1
132
+ attr_name = store_name.to_s
133
+ was_type = attributes_to_define_after_schema_loads[attr_name]&.first
134
+ attribute(attr_name) do |subtype|
135
+ Type::TypedStore.create_from_type(_lookup_cast_type(attr_name, was_type, {}), name, type, **options)
136
+ end
137
+ else
138
+ decorate_attribute_type(store_name, "typed_accessor_for_#{name}") do |subtype|
139
+ Type::TypedStore.create_from_type(subtype, name, type, **options)
140
+ end
118
141
  end
119
142
 
120
143
  _prepare_local_stored_attributes(store_name, name)
@@ -128,64 +151,69 @@ module ActiveRecord
128
151
  self.local_stored_attributes[store_name] |= keys
129
152
  end
130
153
 
131
- def _define_accessors_methods(store_name, *keys) # :nodoc:
154
+ def _define_accessors_methods(store_name, *keys, prefix: nil, suffix: nil) # :nodoc:
132
155
  _store_accessors_module.module_eval do
133
156
  keys.each do |key|
134
- define_method("#{key}=") do |value|
157
+ accessor_key = "#{prefix}#{key}#{suffix}"
158
+
159
+ define_method("#{accessor_key}=") do |value|
135
160
  write_store_attribute(store_name, key, value)
136
161
  end
137
162
 
138
- define_method(key) do
163
+ define_method(accessor_key) do
139
164
  read_store_attribute(store_name, key)
140
165
  end
141
166
  end
142
167
  end
143
168
  end
144
169
 
145
- def _define_predicate_method(name)
170
+ def _define_predicate_method(name, prefix: nil, suffix: nil)
146
171
  _store_accessors_module.module_eval do
172
+ name = "#{prefix}#{name}#{suffix}"
173
+
147
174
  define_method("#{name}?") do
148
175
  send(name) == true
149
176
  end
150
177
  end
151
178
  end
152
179
 
153
- def _define_dirty_tracking_methods(store_attribute, keys)
180
+ def _define_dirty_tracking_methods(store_attribute, keys, prefix: nil, suffix: nil)
154
181
  _store_accessors_module.module_eval do
155
182
  keys.flatten.each do |key|
156
183
  key = key.to_s
184
+ accessor_key = "#{prefix}#{key}#{suffix}"
157
185
 
158
- define_method("#{key}_changed?") do
186
+ define_method("#{accessor_key}_changed?") do
159
187
  return false unless attribute_changed?(store_attribute)
160
188
  prev_store, new_store = changes[store_attribute]
161
189
  prev_store&.dig(key) != new_store&.dig(key)
162
190
  end
163
191
 
164
- define_method("#{key}_change") do
192
+ define_method("#{accessor_key}_change") do
165
193
  return unless attribute_changed?(store_attribute)
166
194
  prev_store, new_store = changes[store_attribute]
167
195
  [prev_store&.dig(key), new_store&.dig(key)]
168
196
  end
169
197
 
170
- define_method("#{key}_was") do
198
+ define_method("#{accessor_key}_was") do
171
199
  return unless attribute_changed?(store_attribute)
172
200
  prev_store, _new_store = changes[store_attribute]
173
201
  prev_store&.dig(key)
174
202
  end
175
203
 
176
- define_method("saved_change_to_#{key}?") do
204
+ define_method("saved_change_to_#{accessor_key}?") do
177
205
  return false unless saved_change_to_attribute?(store_attribute)
178
206
  prev_store, new_store = saved_change_to_attribute(store_attribute)
179
207
  prev_store&.dig(key) != new_store&.dig(key)
180
208
  end
181
209
 
182
- define_method("saved_change_to_#{key}") do
210
+ define_method("saved_change_to_#{accessor_key}") do
183
211
  return unless saved_change_to_attribute?(store_attribute)
184
212
  prev_store, new_store = saved_change_to_attribute(store_attribute)
185
213
  [prev_store&.dig(key), new_store&.dig(key)]
186
214
  end
187
215
 
188
- define_method("#{key}_before_last_save") do
216
+ define_method("#{accessor_key}_before_last_save") do
189
217
  return unless saved_change_to_attribute?(store_attribute)
190
218
  prev_store, _new_store = saved_change_to_attribute(store_attribute)
191
219
  prev_store&.dig(key)
@@ -193,6 +221,26 @@ module ActiveRecord
193
221
  end
194
222
  end
195
223
  end
224
+
225
+ def _normalize_prefix_suffix(store_name, prefix, suffix)
226
+ prefix =
227
+ case prefix
228
+ when String, Symbol
229
+ "#{prefix}_"
230
+ when TrueClass
231
+ "#{store_name}_"
232
+ end
233
+
234
+ suffix =
235
+ case suffix
236
+ when String, Symbol
237
+ "_#{suffix}"
238
+ when TrueClass
239
+ "_#{store_name}"
240
+ end
241
+
242
+ [prefix, suffix]
243
+ end
196
244
  end
197
245
  end
198
246
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StoreAttribute # :nodoc:
4
- VERSION = "0.7.1"
4
+ VERSION = "0.8.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.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - palkan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-04 00:00:00.000000000 Z
11
+ date: 2020-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord