soft_deletion 0.1.6 → 0.1.7
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.
- data/Gemfile.lock +1 -1
- data/gemfiles/rails2.gemfile.lock +1 -1
- data/gemfiles/rails3.gemfile.lock +1 -1
- data/lib/soft_deletion/version.rb +1 -1
- data/lib/soft_deletion.rb +39 -23
- data/test/soft_deletion_test.rb +14 -2
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/lib/soft_deletion.rb
CHANGED
@@ -8,29 +8,33 @@ module SoftDeletion
|
|
8
8
|
raise "You can only include this if #{base} extends ActiveRecord::Base"
|
9
9
|
end
|
10
10
|
base.extend(ClassMethods)
|
11
|
-
|
12
|
-
# Avoids a bad SQL request with versions of code without the colun deleted_at (for example a migration prior to the migration
|
13
|
-
# that adds deleted_at)
|
14
|
-
if base.column_names.include?('deleted_at')
|
15
|
-
base.send(:default_scope, :conditions => base.soft_delete_default_scope_conditions)
|
16
|
-
end
|
11
|
+
base.define_default_soft_delete_scope
|
17
12
|
|
18
13
|
# backport after_soft_delete so we can safely upgrade to rails 3
|
19
14
|
if ActiveRecord::VERSION::MAJOR > 2
|
20
15
|
base.define_callbacks :soft_delete
|
21
16
|
class << base
|
17
|
+
def before_soft_delete(*callbacks)
|
18
|
+
set_callback :soft_delete, :before, *callbacks
|
19
|
+
end
|
20
|
+
|
22
21
|
def after_soft_delete(*callbacks)
|
23
22
|
set_callback :soft_delete, :after, *callbacks
|
24
23
|
end
|
25
24
|
end
|
26
25
|
else
|
26
|
+
base.define_callbacks :before_soft_delete
|
27
27
|
base.define_callbacks :after_soft_delete
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
module ClassMethods
|
32
|
-
def
|
33
|
-
|
32
|
+
def define_default_soft_delete_scope
|
33
|
+
# Avoids a bad SQL request with versions of code without the column deleted_at (for example a migration prior to the migration
|
34
|
+
# that adds deleted_at)
|
35
|
+
if column_names.include?('deleted_at')
|
36
|
+
default_scope :conditions => { :deleted_at => nil }
|
37
|
+
end
|
34
38
|
end
|
35
39
|
|
36
40
|
def soft_delete_dependents
|
@@ -45,6 +49,10 @@ module SoftDeletion
|
|
45
49
|
end
|
46
50
|
end
|
47
51
|
|
52
|
+
def mark_as_soft_deleted_sql
|
53
|
+
["deleted_at = ?", Time.now]
|
54
|
+
end
|
55
|
+
|
48
56
|
def soft_delete_all!(ids_or_models)
|
49
57
|
ids_or_models = Array.wrap(ids_or_models)
|
50
58
|
|
@@ -57,8 +65,7 @@ module SoftDeletion
|
|
57
65
|
end
|
58
66
|
|
59
67
|
transaction do
|
60
|
-
update_all(
|
61
|
-
|
68
|
+
update_all(mark_as_soft_deleted_sql, :id => ids)
|
62
69
|
models.each do |model|
|
63
70
|
model.soft_delete_dependencies.each(&:soft_delete!)
|
64
71
|
model.run_callbacks ActiveRecord::VERSION::MAJOR > 2 ? :soft_delete : :after_soft_delete
|
@@ -80,15 +87,12 @@ module SoftDeletion
|
|
80
87
|
end
|
81
88
|
|
82
89
|
def soft_delete!
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
_soft_delete!
|
90
|
-
run_callbacks :after_soft_delete
|
91
|
-
end
|
90
|
+
_run_soft_delete { save! }
|
91
|
+
end
|
92
|
+
|
93
|
+
def soft_delete(*args)
|
94
|
+
_run_soft_delete do
|
95
|
+
return false unless save(*args)
|
92
96
|
end
|
93
97
|
end
|
94
98
|
|
@@ -106,9 +110,21 @@ module SoftDeletion
|
|
106
110
|
|
107
111
|
protected
|
108
112
|
|
109
|
-
def
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
+
def _run_soft_delete(&block)
|
114
|
+
self.class.transaction do
|
115
|
+
if ActiveRecord::VERSION::MAJOR > 2
|
116
|
+
run_callbacks :soft_delete do
|
117
|
+
mark_as_deleted
|
118
|
+
soft_delete_dependencies.each(&:soft_delete!)
|
119
|
+
block.call
|
120
|
+
end
|
121
|
+
else
|
122
|
+
run_callbacks :before_soft_delete
|
123
|
+
mark_as_deleted
|
124
|
+
soft_delete_dependencies.each(&:soft_delete!)
|
125
|
+
block.call
|
126
|
+
run_callbacks :after_soft_delete
|
127
|
+
end
|
128
|
+
end
|
113
129
|
end
|
114
130
|
end
|
data/test/soft_deletion_test.rb
CHANGED
@@ -92,9 +92,12 @@ end
|
|
92
92
|
|
93
93
|
def clear_callbacks(model, callback)
|
94
94
|
if ActiveRecord::VERSION::MAJOR > 2
|
95
|
-
model.
|
95
|
+
model.reset_callbacks callback
|
96
96
|
else
|
97
|
-
model.class_eval
|
97
|
+
model.class_eval do
|
98
|
+
instance_variable_set "@before_#{callback}_callbacks", nil
|
99
|
+
instance_variable_set "@after_#{callback}_callbacks", nil
|
100
|
+
end
|
98
101
|
end
|
99
102
|
end
|
100
103
|
|
@@ -147,6 +150,15 @@ class SoftDeletionTest < ActiveSupport::TestCase
|
|
147
150
|
clear_callbacks Category, :soft_delete
|
148
151
|
end
|
149
152
|
|
153
|
+
context ".before_soft_delete" do
|
154
|
+
should "be called on soft-deletion" do
|
155
|
+
Category.before_soft_delete :foo
|
156
|
+
category = Category.create!
|
157
|
+
category.expects(:foo)
|
158
|
+
category.soft_delete!
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
150
162
|
context ".after_soft_delete" do
|
151
163
|
should "be called after soft-deletion" do
|
152
164
|
Category.after_soft_delete :foo
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soft_deletion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 7
|
10
|
+
version: 0.1.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Zendesk
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-06-
|
18
|
+
date: 2012-06-27 00:00:00 Z
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description:
|