soft_deletion 1.2.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3a883342b62d3d6cac6e36c1f35f35be2afc8ee3
4
- data.tar.gz: 70d6426a71b9cfef3381785825912dcf816c2af3
2
+ SHA256:
3
+ metadata.gz: 5ca056615af191c4edb5663f3b1c56067930777172ec9a02fe2b58180b7319ae
4
+ data.tar.gz: 214ea720e110dbde3fe8bd0e86c9a3a970abd48ae1e0001b339b8fbf2a06e408
5
5
  SHA512:
6
- metadata.gz: 4f102e7785e14d602d78d95f5b380ab5094e5038acf69120974f5d0b827b5112f1fd6595b08324cd7ee5b68310ccd6294b7daaaa6191753948b9efa7f1e16208
7
- data.tar.gz: 191eeb73ace4df8d2e3392b09052a0ce72b5742adfdd6018cd33c5185d754a5bf35e5a511bc6d5d37fb16acff75d4962f1a8efe0c29b07575c5e0086736b1ab1
6
+ metadata.gz: 0152d17ffb4687a319e95de937f0205baf0fd310af7eb42d881f38654d64217b1fb6fd82c4a5a6b4b9a5a6c84c0e0d7f96bf1aae85d7d71385459ed40f63fc12
7
+ data.tar.gz: f1f871ef34ce9f46819ee2c02ca3333a8525d0ac90678fb7dd8069458b146e1a64bda07a43ce9b4cf537c7dbf21e86a443dea3bed263f86bde335d0f1060ff8a
data/Readme.md CHANGED
@@ -26,7 +26,7 @@ end
26
26
  # soft delete them including all soft-deletable dependencies that are marked as :destroy, :delete_all, :nullify
27
27
  user = User.first
28
28
  user.products.count == 10
29
- user.soft_delete!
29
+ user.soft_delete!(validate: false)
30
30
  user.deleted? # true
31
31
 
32
32
  # use special with_deleted scope to find them ...
@@ -48,7 +48,6 @@ User.soft_delete_all!(1,2,3,4)
48
48
 
49
49
  TODO
50
50
  ====
51
- - nullify should use update_all on has_many on soft_delete (performance)
52
51
  - has_many :through should delete join associations on soft_delete
53
52
  - cascading soft_deletes should use the same timestamp for easy reverts
54
53
 
@@ -62,8 +61,9 @@ Authors
62
61
  - [Noel Dellofano](https://github.com/pinkvelociraptor)
63
62
  - [Oliver Nightingale](https://github.com/olivernn)
64
63
  - [Kumar Pandya](https://github.com/kpandya91)
64
+ - [Alex Pauly](https://github.com/apauly)
65
65
 
66
66
  [Zendesk](http://zendesk.com)<br/>
67
67
  michael@grosser.it<br/>
68
68
  License: MIT<br/>
69
- [![Build Status](https://travis-ci.org/grosser/soft_deletion.png)](https://travis-ci.org/grosser/soft_deletion)
69
+ ![CI](https://github.com/grosser/soft_deletion/workflows/CI/badge.svg)
@@ -38,22 +38,14 @@ module SoftDeletion
38
38
  models = ids_or_models
39
39
  else
40
40
  ids = ids_or_models
41
- models = if ActiveRecord::VERSION::MAJOR >= 4
42
- where(:id => ids)
43
- else
44
- all(:conditions => { :id => ids })
45
- end
41
+ models = where(:id => ids)
46
42
  end
47
43
 
48
44
  transaction do
49
- if ActiveRecord::VERSION::MAJOR >= 4
50
- where(:id => ids).update_all(mark_as_soft_deleted_sql)
51
- else
52
- update_all(mark_as_soft_deleted_sql, :id => ids)
53
- end
45
+ where(:id => ids).update_all(mark_as_soft_deleted_sql)
54
46
 
55
47
  models.each do |model|
56
- model.soft_delete_dependencies.each(&:soft_delete!)
48
+ model.soft_delete_dependencies.each { |dep| dep.execute_soft_delete(:soft_delete!, []) }
57
49
  model.run_callbacks :soft_delete
58
50
  end
59
51
  end
@@ -73,11 +65,11 @@ module SoftDeletion
73
65
  end
74
66
 
75
67
  def soft_delete!(*args)
76
- _run_soft_delete { save!(*args) } || soft_delete_hook_failed(:before_soft_delete)
68
+ _run_soft_delete(:soft_delete!, args) { save!(*args) } || soft_delete_hook_failed(:before_soft_delete)
77
69
  end
78
70
 
79
71
  def soft_delete(*args)
80
- _run_soft_delete{ save(*args) }
72
+ _run_soft_delete(:soft_delete, args) { save(*args) }
81
73
  end
82
74
 
83
75
  def soft_undelete
@@ -94,16 +86,9 @@ module SoftDeletion
94
86
 
95
87
  protected
96
88
 
97
- if ActiveRecord::VERSION::MAJOR < 4
98
- def each_counter_cached_associations
99
- reflections.each do |name, reflection|
100
- yield association(name.to_sym) if reflection.belongs_to? && reflection.counter_cache_column
101
- end
102
- end
103
- end
104
-
105
89
  def update_soft_delete_counter_caches(value)
106
90
  each_counter_cached_associations do |association|
91
+ association.load_target unless association.loaded?
107
92
  if association.target
108
93
  target = association.target
109
94
  target.class.update_counters(target.id, association.reflection.counter_cache_column => value)
@@ -111,19 +96,21 @@ module SoftDeletion
111
96
  end
112
97
  end
113
98
 
114
- def _run_soft_delete(&block)
99
+ def _run_soft_delete(method, args, &block)
115
100
  result = false
116
- internal = lambda do
117
- mark_as_deleted
118
- soft_delete_dependencies.each(&:soft_delete!)
119
- result = block.call
120
- update_soft_delete_counter_caches(-1)
121
- end
122
-
123
101
  self.class.transaction do
102
+ internal = lambda do
103
+ mark_as_deleted
104
+ raise ActiveRecord::Rollback unless soft_delete_dependencies.all? { |dep| dep.execute_soft_delete(method, args) }
105
+ result = block.call
106
+ raise ActiveRecord::Rollback unless result
107
+ update_soft_delete_counter_caches(-1)
108
+ end
109
+
124
110
  run_callbacks :soft_delete, &internal
125
- end
126
111
 
112
+ result
113
+ end
127
114
  result
128
115
  end
129
116
 
@@ -134,7 +121,7 @@ module SoftDeletion
134
121
  limit = deleted_at - 1.hour
135
122
  internal = lambda do
136
123
  mark_as_undeleted
137
- soft_delete_dependencies.each { |m| m.soft_undelete!(limit)}
124
+ soft_delete_dependencies.each { |m| m.soft_undelete!(limit) }
138
125
  result = block.call
139
126
  update_soft_delete_counter_caches(1)
140
127
  end
@@ -7,14 +7,15 @@ module SoftDeletion
7
7
  @association_name = association_name
8
8
  end
9
9
 
10
- def soft_delete!
10
+ def execute_soft_delete(method, args)
11
11
  case association.options[:dependent]
12
12
  when :nullify
13
- nullify_dependencies
13
+ dependency.update_all(association.foreign_key => nil)
14
14
  when :delete_all
15
15
  dependency.update_all(dependency.mark_as_soft_deleted_sql)
16
+ true
16
17
  else
17
- dependencies.each(&:soft_delete!)
18
+ dependencies.all? { |dep| dep.send(method, *args) }
18
19
  end
19
20
  end
20
21
 
@@ -26,12 +27,6 @@ module SoftDeletion
26
27
 
27
28
  protected
28
29
 
29
- def nullify_dependencies
30
- dependencies.each do |dependency|
31
- dependency.update_column(association.foreign_key, nil)
32
- end
33
- end
34
-
35
30
  def klass
36
31
  association.klass
37
32
  end
@@ -1,3 +1,3 @@
1
1
  module SoftDeletion
2
- VERSION = '1.2.1'
2
+ VERSION = '1.6.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: soft_deletion
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
- - Zendesk
7
+ - Michael Grosser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-28 00:00:00.000000000 Z
11
+ date: 2020-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.2.0
19
+ version: 4.2.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: 5.2.0
22
+ version: 6.2.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 3.2.0
29
+ version: 4.2.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: 5.2.0
32
+ version: 6.2.0
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rake
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -100,20 +100,6 @@ dependencies:
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0'
103
- - !ruby/object:Gem::Dependency
104
- name: wwtd
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: '0'
117
103
  - !ruby/object:Gem::Dependency
118
104
  name: single_cov
119
105
  requirement: !ruby/object:Gem::Requirement
@@ -166,15 +152,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
166
152
  requirements:
167
153
  - - ">="
168
154
  - !ruby/object:Gem::Version
169
- version: 2.0.0
155
+ version: 2.5.0
170
156
  required_rubygems_version: !ruby/object:Gem::Requirement
171
157
  requirements:
172
158
  - - ">="
173
159
  - !ruby/object:Gem::Version
174
160
  version: '0'
175
161
  requirements: []
176
- rubyforge_project:
177
- rubygems_version: 2.5.1
162
+ rubygems_version: 3.1.3
178
163
  signing_key:
179
164
  specification_version: 4
180
165
  summary: Explicit soft deletion for ActiveRecord via deleted_at and default scope.