paranoia 2.0.0 → 2.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/README.md +18 -2
- data/lib/paranoia.rb +36 -8
- data/lib/paranoia/version.rb +1 -1
- data/test/paranoia_test.rb +54 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3024de08e3ab1e77b80e2f9ad7b975f0b642d204
|
4
|
+
data.tar.gz: 05e1fa475bbc9a4db39cec410375d7f33d8f09b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f03869fc8a9c06d6fe005db5deaea540240b05aa65b707698e4a47bcaabef77fc24541777c90e3401060340afa1fc26940ef49e2ac3d0df66b8f6d2d7bf56389
|
7
|
+
data.tar.gz: d60317d533c98f1ca9cf157467fb122a969dc530f022f59a1a98006f4a6b2adef0e741993dd65ab84fb61d3fd63abed36bacffddded47dcfdc6c8a1eb3b13e5c
|
data/README.md
CHANGED
@@ -4,12 +4,28 @@ Paranoia is a re-implementation of [acts\_as\_paranoid](http://github.com/techno
|
|
4
4
|
|
5
5
|
You would use either plugin / gem if you wished that when you called `destroy` on an Active Record object that it didn't actually destroy it, but just "hid" the record. Paranoia does this by setting a `deleted_at` field to the current time when you `destroy` a record, and hides it by scoping all queries on your model to only include records which do not have a `deleted_at` field.
|
6
6
|
|
7
|
+
If you wish to actually destroy an object you may call destroy! on it or simply call destroy twice on the same object.
|
8
|
+
|
7
9
|
## Installation & Usage
|
8
10
|
|
9
|
-
|
11
|
+
For Rails 3, please use version 1 of Paranoia:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'paranoia', '~> 1.0'
|
15
|
+
```
|
16
|
+
|
17
|
+
For Rails 4, please use version 2 of Paranoia:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
gem 'paranoia', '~> 2.0'
|
21
|
+
```
|
22
|
+
|
23
|
+
Of course you can install this from GitHub as well:
|
10
24
|
|
11
25
|
```ruby
|
12
|
-
gem 'paranoia'
|
26
|
+
gem 'paranoia', :github => 'radar/paranoia', :branch => 'master'
|
27
|
+
# or
|
28
|
+
gem 'paranoia', :github => 'radar/paranoia', :branch => 'rails4'
|
13
29
|
```
|
14
30
|
|
15
31
|
Then run:
|
data/lib/paranoia.rb
CHANGED
@@ -1,17 +1,45 @@
|
|
1
1
|
module Paranoia
|
2
2
|
def self.included(klazz)
|
3
3
|
klazz.extend Query
|
4
|
+
klazz.extend Callbacks
|
4
5
|
end
|
5
6
|
|
6
7
|
module Query
|
7
8
|
def paranoid? ; true ; end
|
8
9
|
|
10
|
+
def with_deleted
|
11
|
+
all.tap { |x| x.default_scoped = false }
|
12
|
+
end
|
13
|
+
|
9
14
|
def only_deleted
|
10
|
-
|
15
|
+
with_deleted.where.not(deleted_at: nil)
|
11
16
|
end
|
17
|
+
alias :deleted :only_deleted
|
12
18
|
|
13
|
-
def
|
14
|
-
|
19
|
+
def restore(id)
|
20
|
+
if id.is_a?(Array)
|
21
|
+
id.map { |one_id| restore(one_id) }
|
22
|
+
else
|
23
|
+
only_deleted.find(id).restore!
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module Callbacks
|
29
|
+
def self.extended(klazz)
|
30
|
+
klazz.define_callbacks :restore
|
31
|
+
|
32
|
+
klazz.define_singleton_method("before_restore") do |*args, &block|
|
33
|
+
set_callback(:restore, :before, *args, &block)
|
34
|
+
end
|
35
|
+
|
36
|
+
klazz.define_singleton_method("around_restore") do |*args, &block|
|
37
|
+
set_callback(:restore, :around, *args, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
klazz.define_singleton_method("after_restore") do |*args, &block|
|
41
|
+
set_callback(:restore, :after, *args, &block)
|
42
|
+
end
|
15
43
|
end
|
16
44
|
end
|
17
45
|
|
@@ -20,16 +48,16 @@ module Paranoia
|
|
20
48
|
end
|
21
49
|
|
22
50
|
def delete
|
23
|
-
return if new_record?
|
24
|
-
|
51
|
+
return if new_record?
|
52
|
+
destroyed? ? destroy! : update_column(:deleted_at, Time.now)
|
25
53
|
end
|
26
54
|
|
27
55
|
def restore!
|
28
|
-
update_column :deleted_at, nil
|
56
|
+
run_callbacks(:restore) { update_column :deleted_at, nil }
|
29
57
|
end
|
30
58
|
|
31
59
|
def destroyed?
|
32
|
-
|
60
|
+
!!deleted_at
|
33
61
|
end
|
34
62
|
alias :deleted? :destroyed?
|
35
63
|
end
|
@@ -39,7 +67,7 @@ class ActiveRecord::Base
|
|
39
67
|
alias :destroy! :destroy
|
40
68
|
alias :delete! :delete
|
41
69
|
include Paranoia
|
42
|
-
default_scope { where(
|
70
|
+
default_scope { where(self.quoted_table_name + '.deleted_at IS NULL') }
|
43
71
|
end
|
44
72
|
|
45
73
|
def self.paranoid? ; false ; end
|
data/lib/paranoia/version.rb
CHANGED
data/test/paranoia_test.rb
CHANGED
@@ -71,7 +71,7 @@ class ParanoiaTest < Test::Unit::TestCase
|
|
71
71
|
assert_equal 0, model.class.count
|
72
72
|
assert_equal 1, model.class.unscoped.count
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
def test_scoping_behavior_for_paranoid_models
|
76
76
|
ParanoidModel.unscoped.delete_all
|
77
77
|
parent1 = ParentModel.create
|
@@ -82,6 +82,7 @@ class ParanoiaTest < Test::Unit::TestCase
|
|
82
82
|
p2.destroy
|
83
83
|
assert_equal 0, parent1.paranoid_models.count
|
84
84
|
assert_equal 1, parent1.paranoid_models.only_deleted.count
|
85
|
+
assert_equal 1, parent1.paranoid_models.deleted.count
|
85
86
|
p3 = ParanoidModel.create(:parent_model => parent1)
|
86
87
|
assert_equal 2, parent1.paranoid_models.with_deleted.count
|
87
88
|
assert_equal [p1,p3], parent1.paranoid_models.with_deleted
|
@@ -188,6 +189,30 @@ class ParanoiaTest < Test::Unit::TestCase
|
|
188
189
|
assert_equal false, model.destroyed?
|
189
190
|
end
|
190
191
|
|
192
|
+
def test_destroy_twice
|
193
|
+
model = ParanoidModel.new
|
194
|
+
model.save
|
195
|
+
model.destroy
|
196
|
+
model.destroy
|
197
|
+
|
198
|
+
assert_equal 0, ParanoidModel.unscoped.where(id: model.id).count
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_restore_behavior_for_callbacks
|
202
|
+
model = CallbackModel.new
|
203
|
+
model.save
|
204
|
+
id = model.id
|
205
|
+
model.destroy
|
206
|
+
|
207
|
+
assert model.destroyed?
|
208
|
+
|
209
|
+
model = CallbackModel.only_deleted.find(id)
|
210
|
+
model.restore!
|
211
|
+
model.reload
|
212
|
+
|
213
|
+
assert model.instance_variable_get(:@restore_callback_called)
|
214
|
+
end
|
215
|
+
|
191
216
|
def test_real_destroy
|
192
217
|
model = ParanoidModel.new
|
193
218
|
model.save
|
@@ -204,6 +229,33 @@ class ParanoiaTest < Test::Unit::TestCase
|
|
204
229
|
refute ParanoidModel.unscoped.exists?(model.id)
|
205
230
|
end
|
206
231
|
|
232
|
+
def test_multiple_restore
|
233
|
+
a = ParanoidModel.new
|
234
|
+
a.save
|
235
|
+
a_id = a.id
|
236
|
+
a.destroy
|
237
|
+
|
238
|
+
b = ParanoidModel.new
|
239
|
+
b.save
|
240
|
+
b_id = b.id
|
241
|
+
b.destroy
|
242
|
+
|
243
|
+
c = ParanoidModel.new
|
244
|
+
c.save
|
245
|
+
c_id = c.id
|
246
|
+
c.destroy
|
247
|
+
|
248
|
+
ParanoidModel.restore([a_id, c_id])
|
249
|
+
|
250
|
+
a.reload
|
251
|
+
b.reload
|
252
|
+
c.reload
|
253
|
+
|
254
|
+
refute a.destroyed?
|
255
|
+
assert b.destroyed?
|
256
|
+
refute c.destroyed?
|
257
|
+
end
|
258
|
+
|
207
259
|
private
|
208
260
|
def get_featureful_model
|
209
261
|
FeaturefulModel.new(:name => "not empty")
|
@@ -232,6 +284,7 @@ end
|
|
232
284
|
class CallbackModel < ActiveRecord::Base
|
233
285
|
acts_as_paranoid
|
234
286
|
before_destroy {|model| model.instance_variable_set :@callback_called, true }
|
287
|
+
before_restore {|model| model.instance_variable_set :@restore_callback_called, true }
|
235
288
|
end
|
236
289
|
|
237
290
|
class ParentModel < ActiveRecord::Base
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paranoia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- radarlistener@gmail.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -105,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
105
105
|
version: 1.3.6
|
106
106
|
requirements: []
|
107
107
|
rubyforge_project: paranoia
|
108
|
-
rubygems_version: 2.
|
108
|
+
rubygems_version: 2.1.0
|
109
109
|
signing_key:
|
110
110
|
specification_version: 4
|
111
111
|
summary: Paranoia is a re-implementation of acts_as_paranoid for Rails 3, using much,
|