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 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: