soft_deletion 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- soft_deletion (0.1.6)
4
+ soft_deletion (0.1.7)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/mgrosser/code/tools/soft_deletion
3
3
  specs:
4
- soft_deletion (0.1.4)
4
+ soft_deletion (0.1.6)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/mgrosser/code/tools/soft_deletion
3
3
  specs:
4
- soft_deletion (0.1.4)
4
+ soft_deletion (0.1.6)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -1,3 +1,3 @@
1
1
  module SoftDeletion
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
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 soft_delete_default_scope_conditions
33
- {:deleted_at => nil}
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(["deleted_at = ?", Time.now], :id => ids)
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
- self.class.transaction do
84
- if ActiveRecord::VERSION::MAJOR > 2
85
- run_callbacks :soft_delete do
86
- _soft_delete!
87
- end
88
- else
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 _soft_delete!
110
- mark_as_deleted
111
- soft_delete_dependencies.each(&:soft_delete!)
112
- save!
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
@@ -92,9 +92,12 @@ end
92
92
 
93
93
  def clear_callbacks(model, callback)
94
94
  if ActiveRecord::VERSION::MAJOR > 2
95
- model.define_callbacks callback
95
+ model.reset_callbacks callback
96
96
  else
97
- model.class_eval{ instance_variable_set "@after_#{callback}_callbacks", nil }
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: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 6
10
- version: 0.1.6
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-26 00:00:00 Z
18
+ date: 2012-06-27 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
21
  description: