acts_as_paranoid 0.6.2 → 0.6.3

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
2
  SHA256:
3
- metadata.gz: 6bcd9a9f5f44fbc3890442360530b48ed39f94bd8cbe4f49d245a2c27510f7fd
4
- data.tar.gz: 47c9aceb7415a3704b69b3bcaf7c8db64d402ecc9d1ef41352a70d0a386a819c
3
+ metadata.gz: 5e2b91eb0df1ed0d8cfb306f7272860c3f03e1da75259b202d222c1fece04927
4
+ data.tar.gz: 6dc0038fd41642f40e774e32eebe18ee5da6eae6750077781902aed17975ad1e
5
5
  SHA512:
6
- metadata.gz: 78c376b394c50800f5f22db6a30a4dd607196a277266af7e24e04b209326e176471f916da360a1eb6e7e2c6573c506b211eccac42961a9a3ed686def7c105987
7
- data.tar.gz: b0025f38c28cfc80fb852673f4913edf25273912ca83a768e000a15a745edfa9069d6fda490e31cc8ffe39975651d339d7ce82ac07f1065936ef6832f6b5eef1
6
+ metadata.gz: 1587bb00c56acbb5daf5929ef4588f89622eb83141258c2f686ce5ed55719849fa17064bc011cf6cd3720d05f7900f1121442ba6abb71cdcc977f637800b00dc
7
+ data.tar.gz: 026be4a7b7eec225d6a1113af33aa610438bc4f895d8539e1bf6159f8bfe07bda3add7733ecdec982ac85a4b28f1e3abc9a4cd85ab56f07bc6f9fcb4bd20211b
@@ -2,6 +2,15 @@
2
2
 
3
3
  Notable changes to this project will be documented in this file.
4
4
 
5
+ ## 0.6.3
6
+
7
+ * Update Travis CI configuration ([#137], by [Matijs van Zuijlen][mvz]).
8
+ * Add predicate to check if record was soft deleted or hard deleted ([#136],
9
+ by [Aymeric Le Dorze][aymeric-ledorze]).
10
+ * Add support for recover! method ([#75], by [vinoth][avinoth]).
11
+ * Fix a record being dirty after destroying it ([#135], by
12
+ [Aymeric Le Dorze][aymeric-ledorze]).
13
+
5
14
  ## 0.6.2
6
15
 
7
16
  * Prevent recovery of non-deleted records
@@ -37,9 +46,14 @@ Notable changes to this project will be documented in this file.
37
46
  [AlexWheeler]: https://github.com/AlexWheeler
38
47
  [marycodes2]: https://github.com/marycodes2
39
48
  [valeriecodes]: https://github.com/valeriecodes
49
+ [aymeric-ledorze]: https://github.com/aymeric-ledorze
50
+ [avinoth]: https://github.com/avinoth
40
51
 
41
52
  <!-- issues & pull requests -->
42
53
 
54
+ [#137]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/137
55
+ [#136]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/136
56
+ [#135]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/135
43
57
  [#133]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/133
44
58
  [#131]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/131
45
59
  [#124]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/124
@@ -47,3 +61,4 @@ Notable changes to this project will be documented in this file.
47
61
  [#119]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/119
48
62
  [#116]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/116
49
63
  [#114]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/114
64
+ [#75]: https://github.com/ActsAsParanoid/acts_as_paranoid/pull/75
data/README.md CHANGED
@@ -171,6 +171,22 @@ or in the recover statement
171
171
  Paranoiac.only_deleted.where("name = ?", "not dead yet").first.recover(:recovery_window => 30.seconds)
172
172
  ```
173
173
 
174
+ ### recover!
175
+
176
+ You can invoke `recover!` if you wish to raise an error if the recovery fails. The error generally stems from ActiveRecord.
177
+
178
+ ```
179
+ Paranoiac.only_deleted.where("name = ?", "not dead yet").first.recover!
180
+
181
+ ### => ActiveRecord::RecordInvalid: Validation failed: Name already exists
182
+ ```
183
+
184
+ Optionally, you may also raise the error by passing `:raise_error => true` to the `recover` method. This behaves the same as `recover!`.
185
+
186
+ ```
187
+ Paranoiac.only_deleted.where("name = ?", "not dead yet").first.recover(:raise_error => true)
188
+ ```
189
+
174
190
  ### Validation
175
191
  ActiveRecord's built-in uniqueness validation does not account for records deleted by ActsAsParanoid. If you want to check for uniqueness among non-deleted records only, use the macro `validates_as_paranoid` in your model. Then, instead of using `validates_uniqueness_of`, use `validates_uniqueness_of_without_deleted`. This will keep deleted records from counting against the uniqueness check.
176
192
 
@@ -263,6 +279,22 @@ child.parent #=> nil
263
279
  child.parent_including_deleted #=> Parent (it works!)
264
280
  ```
265
281
 
282
+ ### Callbacks
283
+
284
+ There are couple of callbacks that you may use when dealing with deletion and recovery of objects. There is `before_recover` and `after_recover` which will be
285
+ triggered before and after the recovery of an object respectively.
286
+
287
+ Default ActiveRecord callbaks such as `before_destroy` and `after_destroy` will be triggered around `.destroy!` and `.destroy_fully!`.
288
+
289
+ ```
290
+ class Paranoiac < ActiveRecord::Base
291
+ acts_as_paranoid
292
+
293
+ before_recover :set_counts
294
+ after_recover :update_logs
295
+ end
296
+ ```
297
+
266
298
  ## Caveats
267
299
 
268
300
  Watch out for these caveats:
@@ -108,7 +108,7 @@ module ActsAsParanoid
108
108
  # Straight from ActiveRecord 5.1!
109
109
  def delete
110
110
  self.class.delete(id) if persisted?
111
- @destroyed = true
111
+ stale_paranoid_value
112
112
  freeze
113
113
  end
114
114
 
@@ -124,7 +124,8 @@ module ActsAsParanoid
124
124
  decrement_counters_on_associations
125
125
  end
126
126
 
127
- self.paranoid_value = self.class.delete_now_value
127
+ stale_paranoid_value
128
+ @destroyed = true
128
129
  freeze
129
130
  end
130
131
  end
@@ -144,7 +145,7 @@ module ActsAsParanoid
144
145
 
145
146
  @_trigger_destroy_callback = true
146
147
 
147
- self.paranoid_value = self.class.delete_now_value
148
+ stale_paranoid_value
148
149
  self
149
150
  end
150
151
  end
@@ -161,7 +162,8 @@ module ActsAsParanoid
161
162
  return if !self.deleted?
162
163
  options = {
163
164
  :recursive => self.class.paranoid_configuration[:recover_dependent_associations],
164
- :recovery_window => self.class.paranoid_configuration[:dependent_recovery_window]
165
+ :recovery_window => self.class.paranoid_configuration[:dependent_recovery_window],
166
+ :raise_error => false
165
167
  }.merge(options)
166
168
 
167
169
  self.class.transaction do
@@ -169,11 +171,21 @@ module ActsAsParanoid
169
171
  recover_dependent_associations(options[:recovery_window], options) if options[:recursive]
170
172
  increment_counters_on_associations
171
173
  self.paranoid_value = self.class.paranoid_configuration[:recovery_value]
172
- self.save
174
+ if options[:raise_error]
175
+ self.save!
176
+ else
177
+ self.save
178
+ end
173
179
  end
174
180
  end
175
181
  end
176
182
 
183
+ def recover!(options={})
184
+ options[:raise_error] = true
185
+
186
+ recover(options)
187
+ end
188
+
177
189
  def recover_dependent_associations(window, options)
178
190
  self.class.dependent_associations.each do |reflection|
179
191
  next unless (klass = get_reflection_class(reflection)).paranoid?
@@ -219,7 +231,7 @@ module ActsAsParanoid
219
231
  end
220
232
 
221
233
  def deleted?
222
- !if self.class.string_type_with_deleted_value?
234
+ @destroyed || !if self.class.string_type_with_deleted_value?
223
235
  paranoid_value != self.class.delete_now_value || paranoid_value.nil?
224
236
  elsif self.class.boolean_type_not_nullable?
225
237
  paranoid_value == false
@@ -230,6 +242,12 @@ module ActsAsParanoid
230
242
 
231
243
  alias_method :destroyed?, :deleted?
232
244
 
245
+ def deleted_fully?
246
+ @destroyed
247
+ end
248
+
249
+ alias_method :destroyed_fully?, :deleted_fully?
250
+
233
251
  private
234
252
 
235
253
  def get_reflection_class(reflection)
@@ -269,5 +287,10 @@ module ActsAsParanoid
269
287
  def decrement_counters_on_associations
270
288
  update_counters_on_associations :decrement_counter
271
289
  end
290
+
291
+ def stale_paranoid_value
292
+ self.paranoid_value = self.class.delete_now_value
293
+ clear_attribute_changes([self.class.paranoid_column])
294
+ end
272
295
  end
273
296
  end
@@ -1,3 +1,3 @@
1
1
  module ActsAsParanoid
2
- VERSION = "0.6.2"
2
+ VERSION = "0.6.3"
3
3
  end
@@ -69,6 +69,13 @@ class ParanoidTest < ParanoidBaseTest
69
69
  assert_not_nil pt.paranoid_value
70
70
  end
71
71
 
72
+ def test_non_persisted_delete
73
+ pt = ParanoidTime.new
74
+ assert_nil pt.paranoid_value
75
+ pt.delete
76
+ assert_not_nil pt.paranoid_value
77
+ end
78
+
72
79
  def test_non_persisted_destroy!
73
80
  pt = ParanoidTime.new
74
81
  assert_nil pt.paranoid_value
@@ -94,6 +101,15 @@ class ParanoidTest < ParanoidBaseTest
94
101
  assert_equal 1, ParanoidString.count
95
102
  end
96
103
 
104
+ def test_recovery!
105
+ ParanoidBoolean.first.destroy
106
+ ParanoidBoolean.create(:name => 'paranoid')
107
+
108
+ assert_raise do
109
+ ParanoidBoolean.only_deleted.first.recover!
110
+ end
111
+ end
112
+
97
113
  def setup_recursive_tests
98
114
  @paranoid_time_object = ParanoidTime.first
99
115
 
@@ -265,6 +281,24 @@ class ParanoidTest < ParanoidBaseTest
265
281
  assert_equal 0, HasOneNotParanoid.count
266
282
  end
267
283
 
284
+ def test_dirty
285
+ pt = ParanoidTime.create
286
+ pt.destroy
287
+ assert_not pt.changed?
288
+ end
289
+
290
+ def test_delete_dirty
291
+ pt = ParanoidTime.create
292
+ pt.delete
293
+ assert_not pt.changed?
294
+ end
295
+
296
+ def test_destroy_fully_dirty
297
+ pt = ParanoidTime.create
298
+ pt.destroy_fully!
299
+ assert_not pt.changed?
300
+ end
301
+
268
302
  def test_deleted?
269
303
  ParanoidTime.first.destroy
270
304
  assert ParanoidTime.with_deleted.first.deleted?
@@ -273,6 +307,43 @@ class ParanoidTest < ParanoidBaseTest
273
307
  assert ParanoidString.with_deleted.first.deleted?
274
308
  end
275
309
 
310
+ def test_delete_deleted?
311
+ ParanoidTime.first.delete
312
+ assert ParanoidTime.with_deleted.first.deleted?
313
+
314
+ ParanoidString.first.delete
315
+ assert ParanoidString.with_deleted.first.deleted?
316
+ end
317
+
318
+ def test_destroy_fully_deleted?
319
+ object = ParanoidTime.first
320
+ object.destroy_fully!
321
+ assert object.deleted?
322
+
323
+ object = ParanoidString.first
324
+ object.destroy_fully!
325
+ assert object.deleted?
326
+ end
327
+
328
+ def test_deleted_fully?
329
+ ParanoidTime.first.destroy
330
+ assert_not ParanoidTime.with_deleted.first.deleted_fully?
331
+
332
+ ParanoidString.first.destroy
333
+ assert ParanoidString.with_deleted.first.deleted?
334
+ end
335
+
336
+ def test_delete_deleted_fully?
337
+ ParanoidTime.first.delete
338
+ assert_not ParanoidTime.with_deleted.first.deleted_fully?
339
+ end
340
+
341
+ def test_destroy_fully_deleted_fully?
342
+ object = ParanoidTime.first
343
+ object.destroy_fully!
344
+ assert object.deleted_fully?
345
+ end
346
+
276
347
  def test_paranoid_destroy_callbacks
277
348
  @paranoid_with_callback = ParanoidWithCallback.first
278
349
  ParanoidWithCallback.transaction do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_paranoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zachary Scott
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-10-22 00:00:00.000000000 Z
13
+ date: 2020-01-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -178,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
178
178
  - !ruby/object:Gem::Version
179
179
  version: '0'
180
180
  requirements: []
181
- rubygems_version: 3.0.6
181
+ rubygems_version: 3.1.2
182
182
  signing_key:
183
183
  specification_version: 4
184
184
  summary: Active Record plugin which allows you to hide and restore records without