soft_deletion 1.2.1 → 1.6.0

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