paranoia 3.0.0 → 3.0.1
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/.github/workflows/build.yml +1 -1
- data/CHANGELOG.md +6 -0
- data/README.md +28 -0
- data/lib/paranoia/version.rb +1 -1
- data/lib/paranoia.rb +77 -20
- metadata +3 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e7ad759d079b1e2bea13d47f092005677c98dee88423a12666fc77db15e8249
|
4
|
+
data.tar.gz: f95c4af13b076d6d235d3b6d0b7057595742a8dcd177e71b0ada70cb11674f91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b42a61dde0a3e2c417f2d7a0c71c23ad4b1c6980fe4a0a232313625017fe5c5e24065405a28e202bb3751d34e379753ae70a908d552f6704c7b1e78fb18862a
|
7
|
+
data.tar.gz: 45fc5b4fe5c4705f29e9bd208dd18d1fcec907c79649167467dc76ae883e002da9b2db93ac41148ab7a47872a39aa3c7545c754e7627dd8b5348e519654806ee
|
data/.github/workflows/build.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# paranoia Changelog
|
2
2
|
|
3
|
+
## 3.0.1 - January 19, 2025
|
4
|
+
|
5
|
+
- [#566](https://github.com/rubysherpas/paranoia/pull/566) Handle #delete_all
|
6
|
+
- [#559](https://github.com/rubysherpas/paranoia/pull/559) Trigger an after_commit callback when restoring a record
|
7
|
+
- [#567](https://github.com/rubysherpas/paranoia/pull/567) Fix typo in newly added readme
|
8
|
+
|
3
9
|
## 3.0.0 - August 13, 2024
|
4
10
|
|
5
11
|
_Tagged as 3.0 as Ruby + Rails version constraints have been modernised._
|
data/README.md
CHANGED
@@ -206,6 +206,19 @@ Client.restore(id, :recursive => true, :recovery_window => 2.minutes)
|
|
206
206
|
client.restore(:recursive => true, :recovery_window => 2.minutes)
|
207
207
|
```
|
208
208
|
|
209
|
+
If you want to trigger an after_commit callback when restoring a record:
|
210
|
+
|
211
|
+
``` ruby
|
212
|
+
class Client < ActiveRecord::Base
|
213
|
+
acts_as_paranoid after_restore_commit: true
|
214
|
+
|
215
|
+
after_commit :commit_called, on: :restore
|
216
|
+
# or
|
217
|
+
after_restore_commit :commit_called
|
218
|
+
...
|
219
|
+
end
|
220
|
+
```
|
221
|
+
|
209
222
|
Note that by default paranoia will not prevent that a soft destroyed object can't be associated with another object of a different model.
|
210
223
|
A Rails validator is provided should you require this functionality:
|
211
224
|
``` ruby
|
@@ -348,6 +361,21 @@ end
|
|
348
361
|
# => NoMethodError: undefined method `with_deleted' for #<Class:0x0123456>
|
349
362
|
```
|
350
363
|
|
364
|
+
#### delete_all:
|
365
|
+
|
366
|
+
The gem supports `delete_all` method, however it is disabled by default, to enable it add this in your `environment` file
|
367
|
+
|
368
|
+
``` ruby
|
369
|
+
Paranoia.delete_all_enabled = true
|
370
|
+
```
|
371
|
+
alternatively, you can enable/disable it for specific models as follow:
|
372
|
+
|
373
|
+
``` ruby
|
374
|
+
class User < ActiveRecord::Base
|
375
|
+
acts_as_paranoid(delete_all_enabled: true)
|
376
|
+
end
|
377
|
+
```
|
378
|
+
|
351
379
|
## Acts As Paranoid Migration
|
352
380
|
|
353
381
|
You can replace the older `acts_as_paranoid` methods as follows:
|
data/lib/paranoia/version.rb
CHANGED
data/lib/paranoia.rb
CHANGED
@@ -6,15 +6,11 @@ if [ActiveRecord::VERSION::MAJOR, ActiveRecord::VERSION::MINOR] == [5, 2] ||
|
|
6
6
|
end
|
7
7
|
|
8
8
|
module Paranoia
|
9
|
-
@@default_sentinel_value = nil
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def self.default_sentinel_value
|
17
|
-
@@default_sentinel_value
|
10
|
+
class << self
|
11
|
+
# Change default values in a rails initializer
|
12
|
+
attr_accessor :default_sentinel_value,
|
13
|
+
:delete_all_enabled
|
18
14
|
end
|
19
15
|
|
20
16
|
def self.included(klazz)
|
@@ -58,6 +54,16 @@ module Paranoia
|
|
58
54
|
end
|
59
55
|
ids.map { |id| only_deleted.find(id).restore!(opts) }
|
60
56
|
end
|
57
|
+
|
58
|
+
def paranoia_destroy_attributes
|
59
|
+
{
|
60
|
+
paranoia_column => current_time_from_proper_timezone
|
61
|
+
}.merge(timestamp_attributes_with_current_time)
|
62
|
+
end
|
63
|
+
|
64
|
+
def timestamp_attributes_with_current_time
|
65
|
+
timestamp_attributes_for_update_in_model.each_with_object({}) { |attr,hash| hash[attr] = current_time_from_proper_timezone }
|
66
|
+
end
|
61
67
|
end
|
62
68
|
|
63
69
|
def paranoia_destroy
|
@@ -88,7 +94,16 @@ module Paranoia
|
|
88
94
|
end
|
89
95
|
|
90
96
|
def trigger_transactional_callbacks?
|
91
|
-
super || @_trigger_destroy_callback && paranoia_destroyed?
|
97
|
+
super || @_trigger_destroy_callback && paranoia_destroyed? ||
|
98
|
+
@_trigger_restore_callback && !paranoia_destroyed?
|
99
|
+
end
|
100
|
+
|
101
|
+
def transaction_include_any_action?(actions)
|
102
|
+
super || actions.any? do |action|
|
103
|
+
if action == :restore
|
104
|
+
paranoia_after_restore_commit && @_trigger_restore_callback
|
105
|
+
end
|
106
|
+
end
|
92
107
|
end
|
93
108
|
|
94
109
|
def paranoia_delete
|
@@ -115,6 +130,10 @@ module Paranoia
|
|
115
130
|
if within_recovery_window?(recovery_window_range) && ((noop_if_frozen && !@attributes.frozen?) || !noop_if_frozen)
|
116
131
|
@_disable_counter_cache = !paranoia_destroyed?
|
117
132
|
write_attribute paranoia_column, paranoia_sentinel_value
|
133
|
+
if paranoia_after_restore_commit
|
134
|
+
@_trigger_restore_callback = true
|
135
|
+
add_to_transaction
|
136
|
+
end
|
118
137
|
update_columns(paranoia_restore_attributes)
|
119
138
|
each_counter_cached_associations do |association|
|
120
139
|
if send(association.reflection.name)
|
@@ -128,6 +147,10 @@ module Paranoia
|
|
128
147
|
end
|
129
148
|
|
130
149
|
self
|
150
|
+
ensure
|
151
|
+
if paranoia_after_restore_commit
|
152
|
+
@_trigger_restore_callback = false
|
153
|
+
end
|
131
154
|
end
|
132
155
|
alias :restore :restore!
|
133
156
|
|
@@ -200,18 +223,10 @@ module Paranoia
|
|
200
223
|
def paranoia_restore_attributes
|
201
224
|
{
|
202
225
|
paranoia_column => paranoia_sentinel_value
|
203
|
-
}.merge(timestamp_attributes_with_current_time)
|
226
|
+
}.merge(self.class.timestamp_attributes_with_current_time)
|
204
227
|
end
|
205
228
|
|
206
|
-
|
207
|
-
{
|
208
|
-
paranoia_column => current_time_from_proper_timezone
|
209
|
-
}.merge(timestamp_attributes_with_current_time)
|
210
|
-
end
|
211
|
-
|
212
|
-
def timestamp_attributes_with_current_time
|
213
|
-
timestamp_attributes_for_update_in_model.each_with_object({}) { |attr,hash| hash[attr] = current_time_from_proper_timezone }
|
214
|
-
end
|
229
|
+
delegate :paranoia_destroy_attributes, to: 'self.class'
|
215
230
|
|
216
231
|
def paranoia_find_has_one_target(association)
|
217
232
|
association_foreign_key = association.options[:through].present? ? association.klass.primary_key : association.foreign_key
|
@@ -262,6 +277,31 @@ module Paranoia
|
|
262
277
|
end
|
263
278
|
end
|
264
279
|
|
280
|
+
module ActiveRecord
|
281
|
+
module Transactions
|
282
|
+
module RestoreSupport
|
283
|
+
def self.included(base)
|
284
|
+
base::ACTIONS << :restore unless base::ACTIONS.include?(:restore)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
module ClassMethods
|
289
|
+
def after_restore_commit(*args, &block)
|
290
|
+
set_options_for_callbacks!(args, on: :restore)
|
291
|
+
set_callback(:commit, :after, *args, &block)
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
module Paranoia::Relation
|
298
|
+
def paranoia_delete_all
|
299
|
+
update_all(klass.paranoia_destroy_attributes)
|
300
|
+
end
|
301
|
+
|
302
|
+
alias_method :delete_all, :paranoia_delete_all
|
303
|
+
end
|
304
|
+
|
265
305
|
ActiveSupport.on_load(:active_record) do
|
266
306
|
class ActiveRecord::Base
|
267
307
|
def self.acts_as_paranoid(options={})
|
@@ -276,12 +316,15 @@ ActiveSupport.on_load(:active_record) do
|
|
276
316
|
alias_method :really_destroyed?, :destroyed?
|
277
317
|
alias_method :really_delete, :delete
|
278
318
|
alias_method :destroy_without_paranoia, :destroy
|
319
|
+
class << self; delegate :really_delete_all, to: :all end
|
279
320
|
|
280
321
|
include Paranoia
|
281
|
-
class_attribute :paranoia_column, :paranoia_sentinel_value
|
322
|
+
class_attribute :paranoia_column, :paranoia_sentinel_value, :paranoia_after_restore_commit,
|
323
|
+
:delete_all_enabled
|
282
324
|
|
283
325
|
self.paranoia_column = (options[:column] || :deleted_at).to_s
|
284
326
|
self.paranoia_sentinel_value = options.fetch(:sentinel_value) { Paranoia.default_sentinel_value }
|
327
|
+
self.paranoia_after_restore_commit = options.fetch(:after_restore_commit) { false }
|
285
328
|
def self.paranoia_scope
|
286
329
|
where(paranoia_column => paranoia_sentinel_value)
|
287
330
|
end
|
@@ -297,6 +340,20 @@ ActiveSupport.on_load(:active_record) do
|
|
297
340
|
after_restore {
|
298
341
|
self.class.notify_observers(:after_restore, self) if self.class.respond_to?(:notify_observers)
|
299
342
|
}
|
343
|
+
|
344
|
+
if paranoia_after_restore_commit
|
345
|
+
ActiveRecord::Transactions.send(:include, ActiveRecord::Transactions::RestoreSupport)
|
346
|
+
end
|
347
|
+
|
348
|
+
self.delete_all_enabled = options[:delete_all_enabled] || Paranoia.delete_all_enabled
|
349
|
+
|
350
|
+
if self.delete_all_enabled
|
351
|
+
"#{self}::ActiveRecord_Relation".constantize.class_eval do
|
352
|
+
alias_method :really_delete_all, :delete_all
|
353
|
+
|
354
|
+
include Paranoia::Relation
|
355
|
+
end
|
356
|
+
end
|
300
357
|
end
|
301
358
|
|
302
359
|
# Please do not use this method in production.
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paranoia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- radarlistener@gmail.com
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-01-19 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: activerecord
|
@@ -91,7 +90,6 @@ homepage: https://github.com/rubysherpas/paranoia
|
|
91
90
|
licenses:
|
92
91
|
- MIT
|
93
92
|
metadata: {}
|
94
|
-
post_install_message:
|
95
93
|
rdoc_options: []
|
96
94
|
require_paths:
|
97
95
|
- lib
|
@@ -106,8 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
104
|
- !ruby/object:Gem::Version
|
107
105
|
version: 1.3.6
|
108
106
|
requirements: []
|
109
|
-
rubygems_version: 3.
|
110
|
-
signing_key:
|
107
|
+
rubygems_version: 3.6.2
|
111
108
|
specification_version: 4
|
112
109
|
summary: Paranoia is a re-implementation of acts_as_paranoid for Rails 3, 4, and 5,
|
113
110
|
using much, much, much less code.
|