paranoia 1.3.1 → 1.3.2
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/.travis.yml +4 -0
- data/README.md +3 -1
- data/lib/paranoia.rb +53 -13
- data/lib/paranoia/version.rb +1 -1
- data/paranoia.gemspec +18 -19
- data/test/paranoia_test.rb +61 -9
- metadata +4 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74da60de8afe27c56c43f9a2ad74eec282f1d0d7
|
4
|
+
data.tar.gz: fc3b097f03211f08ba1ad711e82d7c6ef20231ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b98a9b12106d88e02d0d059143b56d7fe63dfa12d0362a83da656aef59b5940e5e9e9514caa2c6f51881f2ad306e76977d75efc22a8dcf60a2df04bebe931ce
|
7
|
+
data.tar.gz: 29a1b849c690b46339e75e5bdd2761bd6f070025c55f543abc7603a1104ebb0feb59b4cc04d70d5ed363f2f38a04de50fc630c5a26d8e31ae1b61287f73d56e4
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -4,6 +4,8 @@ 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:
|
@@ -23,7 +25,7 @@ Of course you can install this from GitHub as well:
|
|
23
25
|
```ruby
|
24
26
|
gem 'paranoia', :github => 'radar/paranoia', :branch => 'master'
|
25
27
|
# or
|
26
|
-
gem 'paranoia', :github => 'radar/paranoia', :branch => '
|
28
|
+
gem 'paranoia', :github => 'radar/paranoia', :branch => 'rails4'
|
27
29
|
```
|
28
30
|
|
29
31
|
Then run:
|
data/lib/paranoia.rb
CHANGED
@@ -1,18 +1,49 @@
|
|
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
|
-
def paranoid?
|
8
|
-
|
9
|
-
def only_deleted
|
10
|
-
scoped.tap { |x| x.default_scoped = false }.where("#{self.table_name}.deleted_at is not null")
|
8
|
+
def paranoid?
|
9
|
+
true
|
11
10
|
end
|
12
11
|
|
12
|
+
|
13
13
|
def with_deleted
|
14
14
|
scoped.tap { |x| x.default_scoped = false }
|
15
15
|
end
|
16
|
+
|
17
|
+
def only_deleted
|
18
|
+
with_deleted.where("#{self.table_name}.deleted_at IS NOT NULL")
|
19
|
+
end
|
20
|
+
alias :deleted :only_deleted
|
21
|
+
|
22
|
+
def restore(id)
|
23
|
+
if id.is_a?(Array)
|
24
|
+
id.map { |one_id| restore(one_id) }
|
25
|
+
else
|
26
|
+
only_deleted.find(id).restore!
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module Callbacks
|
32
|
+
def self.extended(klazz)
|
33
|
+
klazz.define_callbacks :restore
|
34
|
+
|
35
|
+
klazz.define_singleton_method("before_restore") do |*args, &block|
|
36
|
+
set_callback(:restore, :before, *args, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
klazz.define_singleton_method("around_restore") do |*args, &block|
|
40
|
+
set_callback(:restore, :around, *args, &block)
|
41
|
+
end
|
42
|
+
|
43
|
+
klazz.define_singleton_method("after_restore") do |*args, &block|
|
44
|
+
set_callback(:restore, :after, *args, &block)
|
45
|
+
end
|
46
|
+
end
|
16
47
|
end
|
17
48
|
|
18
49
|
def destroy
|
@@ -20,37 +51,46 @@ module Paranoia
|
|
20
51
|
end
|
21
52
|
|
22
53
|
def delete
|
23
|
-
return if new_record?
|
24
|
-
|
54
|
+
return if new_record?
|
55
|
+
destroyed? ? destroy! : update_attribute_or_column(:deleted_at, Time.now)
|
25
56
|
end
|
26
57
|
|
27
58
|
def restore!
|
28
|
-
|
59
|
+
run_callbacks(:restore) { update_column :deleted_at, nil }
|
29
60
|
end
|
61
|
+
alias :restore :restore!
|
30
62
|
|
31
63
|
def destroyed?
|
32
|
-
|
64
|
+
!!deleted_at
|
33
65
|
end
|
66
|
+
|
34
67
|
alias :deleted? :destroyed?
|
35
68
|
|
36
69
|
private
|
37
70
|
|
38
71
|
# Rails 3.1 adds update_column. Rails > 3.2.6 deprecates update_attribute, gone in Rails 4.
|
39
72
|
def update_attribute_or_column(*args)
|
40
|
-
|
73
|
+
self.class.unscoped do
|
74
|
+
respond_to?(:update_column) ? update_column(*args) : update_attribute(*args)
|
75
|
+
end
|
41
76
|
end
|
42
77
|
end
|
43
78
|
|
44
79
|
class ActiveRecord::Base
|
45
80
|
def self.acts_as_paranoid
|
46
81
|
alias :destroy! :destroy
|
47
|
-
alias :delete!
|
82
|
+
alias :delete! :delete
|
48
83
|
include Paranoia
|
49
|
-
default_scope { where(
|
84
|
+
default_scope { where(self.quoted_table_name + '.deleted_at IS NULL') }
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.paranoid?
|
88
|
+
false
|
50
89
|
end
|
51
90
|
|
52
|
-
def
|
53
|
-
|
91
|
+
def paranoid?
|
92
|
+
self.class.paranoid?
|
93
|
+
end
|
54
94
|
|
55
95
|
# Override the persisted method to allow for the paranoia gem.
|
56
96
|
# If a paranoid record is selected, then we only want to check
|
data/lib/paranoia/version.rb
CHANGED
data/paranoia.gemspec
CHANGED
@@ -1,27 +1,26 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
require File.expand_path(
|
2
|
+
require File.expand_path('../lib/paranoia/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
|
-
s.name
|
6
|
-
s.version
|
7
|
-
s.platform
|
8
|
-
s.authors
|
9
|
-
s.email
|
10
|
-
s.homepage
|
11
|
-
s.summary
|
5
|
+
s.name = 'paranoia'
|
6
|
+
s.version = Paranoia::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = %w(radarlistener@gmail.com)
|
9
|
+
s.email = []
|
10
|
+
s.homepage = 'http://rubygems.org/gems/paranoia'
|
11
|
+
s.summary = 'Paranoia is a re-implementation of acts_as_paranoid for Rails 3, using much, much, much less code.'
|
12
12
|
s.description = "Paranoia is a re-implementation of acts_as_paranoid for Rails 3, using much, much, much less code. 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."
|
13
13
|
|
14
|
-
s.required_rubygems_version =
|
15
|
-
s.rubyforge_project
|
16
|
-
|
17
|
-
s.add_dependency "activerecord", "~> 3.2"
|
14
|
+
s.required_rubygems_version = '>= 1.3.6'
|
15
|
+
s.rubyforge_project = 'paranoia'
|
18
16
|
|
19
|
-
s.
|
20
|
-
|
21
|
-
s.add_development_dependency
|
22
|
-
s.add_development_dependency
|
23
|
-
|
24
|
-
|
25
|
-
s.
|
17
|
+
s.add_dependency 'activerecord', '~> 3.2'
|
18
|
+
|
19
|
+
s.add_development_dependency 'bundler', '>= 1.0.0'
|
20
|
+
s.add_development_dependency 'sqlite3'
|
21
|
+
s.add_development_dependency 'rake'
|
22
|
+
|
23
|
+
s.files = `git ls-files`.split("\n")
|
24
|
+
s.executables = `git ls-files`.split("\n").map { |f| f =~ /^bin\/(.*)/ ? $1 : nil }.compact
|
26
25
|
s.require_path = 'lib'
|
27
26
|
end
|
data/test/paranoia_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'active_record'
|
3
|
-
require File.expand_path(File.dirname(__FILE__) +
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/../lib/paranoia')
|
4
4
|
|
5
5
|
DB_FILE = 'tmp/test_db'
|
6
6
|
|
@@ -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,9 +82,10 @@ 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
|
-
assert_equal [p1,p3], parent1.paranoid_models.with_deleted
|
88
|
+
assert_equal [p1, p3], parent1.paranoid_models.with_deleted
|
88
89
|
end
|
89
90
|
|
90
91
|
def test_destroy_behavior_for_featureful_paranoid_models
|
@@ -102,9 +103,8 @@ class ParanoiaTest < Test::Unit::TestCase
|
|
102
103
|
|
103
104
|
# Regression test for #24
|
104
105
|
def test_chaining_for_paranoid_models
|
105
|
-
scope = FeaturefulModel.where(:name =>
|
106
|
-
|
107
|
-
assert_equal "foo", scope.where_values_hash["name"]
|
106
|
+
scope = FeaturefulModel.where(:name => 'foo').only_deleted
|
107
|
+
assert_equal 'foo', scope.where_values_hash['name']
|
108
108
|
assert_equal 2, scope.where_values.count
|
109
109
|
end
|
110
110
|
|
@@ -117,6 +117,7 @@ class ParanoiaTest < Test::Unit::TestCase
|
|
117
117
|
|
118
118
|
assert_equal model, ParanoidModel.only_deleted.last
|
119
119
|
assert_equal false, ParanoidModel.only_deleted.include?(model2)
|
120
|
+
assert_equal false, ParanoidModel.deleted.include?(model2)
|
120
121
|
end
|
121
122
|
|
122
123
|
def test_default_scope_for_has_many_relationships
|
@@ -189,25 +190,75 @@ class ParanoiaTest < Test::Unit::TestCase
|
|
189
190
|
assert_equal false, model.destroyed?
|
190
191
|
end
|
191
192
|
|
193
|
+
def test_destroy_twice
|
194
|
+
model = ParanoidModel.new
|
195
|
+
model.save
|
196
|
+
model.destroy
|
197
|
+
model.destroy
|
198
|
+
|
199
|
+
assert_equal 0, ParanoidModel.unscoped.where(id: model.id).count
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_restore_behavior_for_callbacks
|
203
|
+
model = CallbackModel.new
|
204
|
+
model.save
|
205
|
+
id = model.id
|
206
|
+
model.destroy
|
207
|
+
|
208
|
+
assert model.destroyed?
|
209
|
+
|
210
|
+
model = CallbackModel.only_deleted.find(id)
|
211
|
+
model.restore!
|
212
|
+
model.reload
|
213
|
+
|
214
|
+
assert model.instance_variable_get(:@restore_callback_called)
|
215
|
+
end
|
216
|
+
|
192
217
|
def test_real_destroy
|
193
218
|
model = ParanoidModel.new
|
194
219
|
model.save
|
195
220
|
model.destroy!
|
196
221
|
|
197
|
-
assert_equal
|
222
|
+
assert_equal 0, ParanoidModel.unscoped.where(id: model.id).count
|
198
223
|
end
|
199
224
|
|
200
225
|
def test_real_delete
|
201
226
|
model = ParanoidModel.new
|
202
227
|
model.save
|
203
228
|
model.delete!
|
229
|
+
assert_equal 0, ParanoidModel.unscoped.where(id: model.id).count
|
230
|
+
end
|
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
|
204
253
|
|
205
|
-
|
254
|
+
refute a.destroyed?
|
255
|
+
assert b.destroyed?
|
256
|
+
refute c.destroyed?
|
206
257
|
end
|
207
258
|
|
208
259
|
private
|
209
260
|
def get_featureful_model
|
210
|
-
FeaturefulModel.new(:name =>
|
261
|
+
FeaturefulModel.new(:name => 'not empty')
|
211
262
|
end
|
212
263
|
end
|
213
264
|
|
@@ -233,6 +284,7 @@ end
|
|
233
284
|
class CallbackModel < ActiveRecord::Base
|
234
285
|
acts_as_paranoid
|
235
286
|
before_destroy {|model| model.instance_variable_set :@callback_called, true }
|
287
|
+
before_restore {|model| model.instance_variable_set :@restore_callback_called, true }
|
236
288
|
end
|
237
289
|
|
238
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: 1.3.
|
4
|
+
version: 1.3.2
|
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
|
@@ -54,20 +54,6 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - '='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 0.8.7
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - '='
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 0.8.7
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: pry
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
59
|
- - '>='
|
@@ -92,6 +78,7 @@ extensions: []
|
|
92
78
|
extra_rdoc_files: []
|
93
79
|
files:
|
94
80
|
- .gitignore
|
81
|
+
- .travis.yml
|
95
82
|
- Gemfile
|
96
83
|
- LICENSE
|
97
84
|
- README.md
|
@@ -119,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
106
|
version: 1.3.6
|
120
107
|
requirements: []
|
121
108
|
rubyforge_project: paranoia
|
122
|
-
rubygems_version: 2.
|
109
|
+
rubygems_version: 2.1.0
|
123
110
|
signing_key:
|
124
111
|
specification_version: 4
|
125
112
|
summary: Paranoia is a re-implementation of acts_as_paranoid for Rails 3, using much,
|