acts_as_paranoid 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE +1 -1
- data/README.md +46 -19
- data/lib/acts_as_paranoid.rb +1 -1
- data/lib/acts_as_paranoid/associations.rb +10 -3
- data/lib/acts_as_paranoid/core.rb +14 -2
- data/lib/acts_as_paranoid/preloader_association.rb +3 -2
- data/lib/acts_as_paranoid/validations.rb +9 -5
- data/lib/acts_as_paranoid/version.rb +1 -1
- data/test/test_associations.rb +9 -6
- data/test/test_core.rb +15 -11
- data/test/test_default_scopes.rb +35 -35
- data/test/test_helper.rb +7 -7
- data/test/test_inheritance.rb +2 -2
- data/test/test_relations.rb +11 -11
- data/test/test_validations.rb +1 -0
- metadata +17 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 45239a76ba68990d6273016fdba8c582ecd44d93475ebabf5ae6717b5c58ddcc
|
4
|
+
data.tar.gz: 330ed8379df4137f3016de1db1def095ae268b3f99a6dce075b4fea8adf4eb42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2f9c1437125d81959809addcdbee54003711ad8f339b2d1f78987b81aaab3766ac813563c110879f594b127ca90d59186ba84ca0079eeec5e69005b9e0dae08
|
7
|
+
data.tar.gz: 51f5f32565a0ae3f90de5f7afe517372a55c63c887c9de7ed07791f196b03e568f9cc275586c43f9e19806c5f45ef1431de4f446c819344cfebda64c0608d997
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -4,17 +4,40 @@
|
|
4
4
|
|
5
5
|
A Rails plugin to add soft delete.
|
6
6
|
|
7
|
-
This gem can be used to hide records instead of deleting them, making them
|
7
|
+
This gem can be used to hide records instead of deleting them, making them
|
8
|
+
recoverable later.
|
8
9
|
|
9
10
|
## Support
|
10
11
|
|
11
|
-
**This branch targets Rails 4.
|
12
|
+
**This branch targets Rails 4.2, 5.0 and 5.1, with experimental support for 5.2**
|
12
13
|
|
13
|
-
If you're working with another version, switch to the corresponding branch, or
|
14
|
+
If you're working with another version, switch to the corresponding branch, or
|
15
|
+
require an older version of the `acts_as_paranoid` gem.
|
16
|
+
|
17
|
+
### Known issues with Rails 5.2
|
18
|
+
|
19
|
+
* Using acts_as_paranoid and ActiveStorage on the same model
|
20
|
+
[leads to a SystemStackError](https://github.com/ActsAsParanoid/acts_as_paranoid/issues/103).
|
21
|
+
* You cannot directly create a model in a deleted state.
|
14
22
|
|
15
23
|
## Usage
|
16
24
|
|
17
|
-
|
25
|
+
#### Install gem:
|
26
|
+
|
27
|
+
``` ruby
|
28
|
+
gem 'acts_as_paranoid', '~> 0.6.0'
|
29
|
+
```
|
30
|
+
``` shell
|
31
|
+
bundle install
|
32
|
+
```
|
33
|
+
|
34
|
+
#### Create migration
|
35
|
+
|
36
|
+
``` shell
|
37
|
+
bin/rails generate migration AddDeletedAtToParanoiac deleted_at:datetime:index
|
38
|
+
```
|
39
|
+
|
40
|
+
#### Enable ActsAsParanoid:
|
18
41
|
|
19
42
|
```ruby
|
20
43
|
class Paranoiac < ActiveRecord::Base
|
@@ -22,14 +45,19 @@ class Paranoiac < ActiveRecord::Base
|
|
22
45
|
end
|
23
46
|
```
|
24
47
|
|
25
|
-
|
26
|
-
|
27
|
-
You can also specify the name of the column to store it's *deletion* and the type of data it holds:
|
48
|
+
The default column name and type are as follows:
|
28
49
|
|
29
50
|
- `:column => 'deleted_at'`
|
30
51
|
- `:column_type => 'time'`
|
31
52
|
|
32
|
-
|
53
|
+
### Options
|
54
|
+
|
55
|
+
If you are using a different column name and type to store a record's *deletion*, you can specify them as follows:
|
56
|
+
|
57
|
+
- `:column => 'deleted'`
|
58
|
+
- `:column_type => 'boolean'`
|
59
|
+
|
60
|
+
While *column* can be anything (as long as it exists in your database), *type* is restricted to:
|
33
61
|
|
34
62
|
- `boolean`
|
35
63
|
- `time` or
|
@@ -69,11 +97,10 @@ Paranoiac.deleted_inside_time_window(time, 2.minutes)
|
|
69
97
|
In order to really delete a record, just use:
|
70
98
|
|
71
99
|
```ruby
|
72
|
-
paranoiac.
|
100
|
+
paranoiac.destroy_fully!
|
73
101
|
Paranoiac.delete_all!(conditions)
|
74
102
|
```
|
75
|
-
|
76
|
-
You can also permanently delete a record by calling `destroy_fully!` on the object.
|
103
|
+
**NOTE:** The `.destroy!` method is still usable, but equivalent to `.destroy`. It just hides the object.
|
77
104
|
|
78
105
|
Alternatively you can permanently delete a record by calling `destroy` or `delete_all` on the object **twice**.
|
79
106
|
|
@@ -84,7 +111,7 @@ Take this example:
|
|
84
111
|
```ruby
|
85
112
|
p = Paranoiac.first
|
86
113
|
p.destroy # does NOT delete the first record, just hides it
|
87
|
-
Paranoiac.only_deleted.where(:id => p.id).destroy # deletes the first record from the database
|
114
|
+
Paranoiac.only_deleted.where(:id => p.id).first.destroy # deletes the first record from the database
|
88
115
|
```
|
89
116
|
|
90
117
|
### Recovery
|
@@ -107,7 +134,7 @@ If you would like to change this default behavior for one model, you can use the
|
|
107
134
|
|
108
135
|
```ruby
|
109
136
|
class Paranoiac < ActiveRecord::Base
|
110
|
-
|
137
|
+
acts_as_paranoid :recover_dependent_associations => false
|
111
138
|
end
|
112
139
|
```
|
113
140
|
|
@@ -121,16 +148,16 @@ This window can be changed with the `dependent_recovery_window` option:
|
|
121
148
|
|
122
149
|
```ruby
|
123
150
|
class Paranoiac < ActiveRecord::Base
|
124
|
-
|
125
|
-
|
151
|
+
acts_as_paranoid
|
152
|
+
has_many :paranoids, :dependent => :destroy
|
126
153
|
end
|
127
154
|
|
128
155
|
class Paranoid < ActiveRecord::Base
|
129
|
-
|
156
|
+
belongs_to :paranoic
|
130
157
|
|
131
|
-
|
132
|
-
|
133
|
-
|
158
|
+
# Paranoid objects will be recovered alongside Paranoic objects
|
159
|
+
# if they were deleted within 10 minutes of the Paranoic object
|
160
|
+
acts_as_paranoid :dependent_recovery_window => 10.minutes
|
134
161
|
end
|
135
162
|
```
|
136
163
|
|
data/lib/acts_as_paranoid.rb
CHANGED
@@ -19,7 +19,7 @@ module ActsAsParanoid
|
|
19
19
|
|
20
20
|
class_attribute :paranoid_configuration, :paranoid_column_reference
|
21
21
|
|
22
|
-
self.paranoid_configuration = { :column => "deleted_at", :column_type => "time", :recover_dependent_associations => true, :dependent_recovery_window => 2.minutes }
|
22
|
+
self.paranoid_configuration = { :column => "deleted_at", :column_type => "time", :recover_dependent_associations => true, :dependent_recovery_window => 2.minutes, :recovery_value => nil }
|
23
23
|
self.paranoid_configuration.merge!({ :deleted_value => "deleted" }) if options[:column_type] == "string"
|
24
24
|
self.paranoid_configuration.merge!({ :allow_nulls => true }) if options[:column_type] == "boolean"
|
25
25
|
self.paranoid_configuration.merge!(options) # user options
|
@@ -3,13 +3,19 @@ module ActsAsParanoid
|
|
3
3
|
def self.included(base)
|
4
4
|
base.extend ClassMethods
|
5
5
|
class << base
|
6
|
-
|
6
|
+
alias_method :belongs_to_without_deleted, :belongs_to
|
7
|
+
alias_method :belongs_to, :belongs_to_with_deleted
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
11
|
module ClassMethods
|
11
12
|
def belongs_to_with_deleted(target, scope = nil, options = {})
|
12
|
-
|
13
|
+
if scope.is_a?(Hash)
|
14
|
+
options = scope
|
15
|
+
scope = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
with_deleted = options.delete(:with_deleted)
|
13
19
|
result = belongs_to_without_deleted(target, scope, options)
|
14
20
|
|
15
21
|
if with_deleted
|
@@ -27,7 +33,8 @@ module ActsAsParanoid
|
|
27
33
|
return #{target}_without_unscoped(*args) unless association.klass.paranoid?
|
28
34
|
association.klass.with_deleted.scoping { #{target}_without_unscoped(*args) }
|
29
35
|
end
|
30
|
-
|
36
|
+
alias_method :#{target}_without_unscoped, :#{target}
|
37
|
+
alias_method :#{target}, :#{target}_with_unscoped
|
31
38
|
RUBY
|
32
39
|
end
|
33
40
|
end
|
@@ -105,6 +105,13 @@ module ActsAsParanoid
|
|
105
105
|
self.send(self.class.paranoid_column)
|
106
106
|
end
|
107
107
|
|
108
|
+
# Straight from ActiveRecord 5.1!
|
109
|
+
def delete
|
110
|
+
self.class.delete(id) if persisted?
|
111
|
+
@destroyed = true
|
112
|
+
freeze
|
113
|
+
end
|
114
|
+
|
108
115
|
def destroy_fully!
|
109
116
|
with_transaction_returning_status do
|
110
117
|
run_callbacks :destroy do
|
@@ -122,7 +129,12 @@ module ActsAsParanoid
|
|
122
129
|
with_transaction_returning_status do
|
123
130
|
run_callbacks :destroy do
|
124
131
|
# Handle composite keys, otherwise we would just use `self.class.primary_key.to_sym => self.id`.
|
125
|
-
|
132
|
+
@_trigger_destroy_callback = if persisted?
|
133
|
+
self.class.delete_all(Hash[[Array(self.class.primary_key), Array(self.id)].transpose])
|
134
|
+
else
|
135
|
+
true
|
136
|
+
end
|
137
|
+
|
126
138
|
self.paranoid_value = self.class.delete_now_value
|
127
139
|
self
|
128
140
|
end
|
@@ -144,7 +156,7 @@ module ActsAsParanoid
|
|
144
156
|
run_callbacks :recover do
|
145
157
|
recover_dependent_associations(options[:recovery_window], options) if options[:recursive]
|
146
158
|
|
147
|
-
self.paranoid_value =
|
159
|
+
self.paranoid_value = self.class.paranoid_configuration[:recovery_value]
|
148
160
|
self.save
|
149
161
|
end
|
150
162
|
end
|
@@ -4,11 +4,12 @@ module ActsAsParanoid
|
|
4
4
|
base.class_eval do
|
5
5
|
def build_scope_with_deleted
|
6
6
|
scope = build_scope_without_deleted
|
7
|
-
scope = scope.with_deleted if options[:with_deleted] && klass.respond_to?(:with_deleted)
|
7
|
+
scope = scope.with_deleted if reflection.options[:with_deleted] && klass.respond_to?(:with_deleted)
|
8
8
|
scope
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
alias_method :build_scope_without_deleted, :build_scope
|
12
|
+
alias_method :build_scope, :build_scope_with_deleted
|
12
13
|
end
|
13
14
|
end
|
14
15
|
end
|
@@ -21,10 +21,7 @@ module ActsAsParanoid
|
|
21
21
|
finder_class = find_finder_class_for(record)
|
22
22
|
table = finder_class.arel_table
|
23
23
|
|
24
|
-
|
25
|
-
value = coder.type_cast_for_schema value if value && coder
|
26
|
-
|
27
|
-
relation = build_relation(finder_class, table, attribute, value)
|
24
|
+
relation = build_relation(finder_class, attribute, value)
|
28
25
|
[Array(finder_class.primary_key), Array(record.send(:id))].transpose.each do |pk_key, pk_value|
|
29
26
|
relation = relation.where(table[pk_key.to_sym].not_eq(pk_value))
|
30
27
|
end if record.persisted?
|
@@ -33,10 +30,17 @@ module ActsAsParanoid
|
|
33
30
|
relation = relation.where(table[scope_item].eq(record.public_send(scope_item)))
|
34
31
|
end
|
35
32
|
|
36
|
-
if relation.where(finder_class.paranoid_default_scope).
|
33
|
+
if relation.where(finder_class.paranoid_default_scope).exists?(relation)
|
37
34
|
record.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(:value => value))
|
38
35
|
end
|
39
36
|
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def build_relation(klass, attribute, value)
|
41
|
+
return super(klass, klass.arel_table, attribute, value) if ActiveRecord::VERSION::MINOR == 0
|
42
|
+
super
|
43
|
+
end
|
40
44
|
end
|
41
45
|
|
42
46
|
class V4 < ActiveRecord::Validations::UniquenessValidator
|
data/test/test_associations.rb
CHANGED
@@ -52,8 +52,8 @@ class AssociationsTest < ParanoidBaseTest
|
|
52
52
|
|
53
53
|
paranoid_time.destroy
|
54
54
|
|
55
|
-
assert_nil paranoid_has_many_dependant.paranoid_time
|
56
|
-
assert_equal paranoid_time, paranoid_has_many_dependant.paranoid_time_with_deleted
|
55
|
+
assert_nil paranoid_has_many_dependant.reload.paranoid_time
|
56
|
+
assert_equal paranoid_time, paranoid_has_many_dependant.reload.paranoid_time_with_deleted
|
57
57
|
end
|
58
58
|
|
59
59
|
def test_belongs_to_polymorphic_with_deleted
|
@@ -65,8 +65,8 @@ class AssociationsTest < ParanoidBaseTest
|
|
65
65
|
|
66
66
|
paranoid_time.destroy
|
67
67
|
|
68
|
-
assert_nil paranoid_has_many_dependant.paranoid_time
|
69
|
-
assert_equal paranoid_time, paranoid_has_many_dependant.paranoid_time_polymorphic_with_deleted
|
68
|
+
assert_nil paranoid_has_many_dependant.reload.paranoid_time
|
69
|
+
assert_equal paranoid_time, paranoid_has_many_dependant.reload.paranoid_time_polymorphic_with_deleted
|
70
70
|
end
|
71
71
|
|
72
72
|
def test_belongs_to_nil_polymorphic_with_deleted
|
@@ -78,8 +78,8 @@ class AssociationsTest < ParanoidBaseTest
|
|
78
78
|
|
79
79
|
paranoid_time.destroy
|
80
80
|
|
81
|
-
assert_nil paranoid_has_many_dependant.paranoid_time
|
82
|
-
assert_nil paranoid_has_many_dependant.paranoid_time_polymorphic_with_deleted
|
81
|
+
assert_nil paranoid_has_many_dependant.reload.paranoid_time
|
82
|
+
assert_nil paranoid_has_many_dependant.reload.paranoid_time_polymorphic_with_deleted
|
83
83
|
end
|
84
84
|
|
85
85
|
def test_belongs_to_options
|
@@ -228,6 +228,9 @@ class AssociationsTest < ParanoidBaseTest
|
|
228
228
|
end
|
229
229
|
|
230
230
|
def test_mass_assignment_of_paranoid_column_enabled
|
231
|
+
if ActiveRecord::VERSION::MAJOR > 4 && ActiveRecord::VERSION::MINOR > 1
|
232
|
+
skip 'Creation as deleted is not supported with Rails >= 5.2'
|
233
|
+
end
|
231
234
|
now = Time.now
|
232
235
|
record = ParanoidTime.create! :name => 'Foo', :deleted_at => now
|
233
236
|
assert_equal 'Foo', record.name
|
data/test/test_core.rb
CHANGED
@@ -186,15 +186,19 @@ class ParanoidTest < ParanoidBaseTest
|
|
186
186
|
def test_recursive_recovery_dependant_window
|
187
187
|
setup_recursive_tests
|
188
188
|
|
189
|
-
@paranoid_time_object.destroy
|
190
|
-
@paranoid_time_object.reload
|
191
|
-
|
192
189
|
# Stop the following from recovering:
|
193
190
|
# - ParanoidHasManyDependant and its ParanoidBelongsDependant
|
194
191
|
# - A single ParanoidBelongsDependant, but not its parent
|
195
|
-
|
196
|
-
|
197
|
-
|
192
|
+
Time.stub :now, 2.days.ago do
|
193
|
+
@paranoid_time_object.paranoid_has_many_dependants.first.destroy
|
194
|
+
end
|
195
|
+
Time.stub :now, 1.hour.ago do
|
196
|
+
@paranoid_time_object.paranoid_has_many_dependants.
|
197
|
+
last.paranoid_belongs_dependant.
|
198
|
+
destroy
|
199
|
+
end
|
200
|
+
@paranoid_time_object.destroy
|
201
|
+
@paranoid_time_object.reload
|
198
202
|
|
199
203
|
@paranoid_time_object.recover(:recursive => true)
|
200
204
|
|
@@ -211,13 +215,13 @@ class ParanoidTest < ParanoidBaseTest
|
|
211
215
|
child_1 = ParanoidAndroid.create
|
212
216
|
section_1 = ParanoidSection.create(:paranoid_thing => child_1)
|
213
217
|
|
214
|
-
child_2 =
|
218
|
+
child_2 = ParanoidPolygon.create(:sides => 3)
|
215
219
|
section_2 = ParanoidSection.create(:paranoid_thing => child_2)
|
216
220
|
|
217
221
|
assert_equal section_1.paranoid_thing, child_1
|
218
222
|
assert_equal section_1.paranoid_thing.class, ParanoidAndroid
|
219
223
|
assert_equal section_2.paranoid_thing, child_2
|
220
|
-
assert_equal section_2.paranoid_thing.class,
|
224
|
+
assert_equal section_2.paranoid_thing.class, ParanoidPolygon
|
221
225
|
|
222
226
|
parent = ParanoidTime.create(:name => "paranoid_parent")
|
223
227
|
parent.paranoid_sections << section_1
|
@@ -226,14 +230,14 @@ class ParanoidTest < ParanoidBaseTest
|
|
226
230
|
assert_equal 4, ParanoidTime.count
|
227
231
|
assert_equal 2, ParanoidSection.count
|
228
232
|
assert_equal 1, ParanoidAndroid.count
|
229
|
-
assert_equal 1,
|
233
|
+
assert_equal 1, ParanoidPolygon.count
|
230
234
|
|
231
235
|
parent.destroy
|
232
236
|
|
233
237
|
assert_equal 3, ParanoidTime.count
|
234
238
|
assert_equal 0, ParanoidSection.count
|
235
239
|
assert_equal 0, ParanoidAndroid.count
|
236
|
-
assert_equal 0,
|
240
|
+
assert_equal 0, ParanoidPolygon.count
|
237
241
|
|
238
242
|
parent.reload
|
239
243
|
parent.recover
|
@@ -241,7 +245,7 @@ class ParanoidTest < ParanoidBaseTest
|
|
241
245
|
assert_equal 4, ParanoidTime.count
|
242
246
|
assert_equal 2, ParanoidSection.count
|
243
247
|
assert_equal 1, ParanoidAndroid.count
|
244
|
-
assert_equal 1,
|
248
|
+
assert_equal 1, ParanoidPolygon.count
|
245
249
|
end
|
246
250
|
|
247
251
|
def test_non_recursive_recovery
|
data/test/test_default_scopes.rb
CHANGED
@@ -5,48 +5,48 @@ class MultipleDefaultScopesTest < ParanoidBaseTest
|
|
5
5
|
setup_db
|
6
6
|
|
7
7
|
# Naturally, the default scope for humans is male. Sexism++
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
ParanoidPolygon.create! :sides => 3
|
9
|
+
ParanoidPolygon.create! :sides => 3
|
10
|
+
ParanoidPolygon.create! :sides => 3
|
11
|
+
ParanoidPolygon.create! :sides => 8
|
12
12
|
|
13
|
-
assert_equal 3,
|
14
|
-
assert_equal 4,
|
13
|
+
assert_equal 3, ParanoidPolygon.count
|
14
|
+
assert_equal 4, ParanoidPolygon.unscoped.count
|
15
15
|
end
|
16
16
|
|
17
17
|
def test_fake_removal_with_multiple_default_scope
|
18
|
-
|
19
|
-
assert_equal 2,
|
20
|
-
assert_equal 3,
|
21
|
-
assert_equal 1,
|
22
|
-
assert_equal 4,
|
23
|
-
|
24
|
-
|
25
|
-
assert_equal 0,
|
26
|
-
assert_equal 3,
|
27
|
-
assert_equal 3,
|
28
|
-
assert_equal 4,
|
18
|
+
ParanoidPolygon.first.destroy
|
19
|
+
assert_equal 2, ParanoidPolygon.count
|
20
|
+
assert_equal 3, ParanoidPolygon.with_deleted.count
|
21
|
+
assert_equal 1, ParanoidPolygon.only_deleted.count
|
22
|
+
assert_equal 4, ParanoidPolygon.unscoped.count
|
23
|
+
|
24
|
+
ParanoidPolygon.destroy_all
|
25
|
+
assert_equal 0, ParanoidPolygon.count
|
26
|
+
assert_equal 3, ParanoidPolygon.with_deleted.count
|
27
|
+
assert_equal 3, ParanoidPolygon.with_deleted.count
|
28
|
+
assert_equal 4, ParanoidPolygon.unscoped.count
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_real_removal_with_multiple_default_scope
|
32
32
|
# two-step
|
33
|
-
|
34
|
-
|
35
|
-
assert_equal 2,
|
36
|
-
assert_equal 2,
|
37
|
-
assert_equal 0,
|
38
|
-
assert_equal 3,
|
39
|
-
|
40
|
-
|
41
|
-
assert_equal 1,
|
42
|
-
assert_equal 1,
|
43
|
-
assert_equal 0,
|
44
|
-
assert_equal 2,
|
45
|
-
|
46
|
-
|
47
|
-
assert_equal 0,
|
48
|
-
assert_equal 0,
|
49
|
-
assert_equal 0,
|
50
|
-
assert_equal 1,
|
33
|
+
ParanoidPolygon.first.destroy
|
34
|
+
ParanoidPolygon.only_deleted.first.destroy
|
35
|
+
assert_equal 2, ParanoidPolygon.count
|
36
|
+
assert_equal 2, ParanoidPolygon.with_deleted.count
|
37
|
+
assert_equal 0, ParanoidPolygon.only_deleted.count
|
38
|
+
assert_equal 3, ParanoidPolygon.unscoped.count
|
39
|
+
|
40
|
+
ParanoidPolygon.first.destroy_fully!
|
41
|
+
assert_equal 1, ParanoidPolygon.count
|
42
|
+
assert_equal 1, ParanoidPolygon.with_deleted.count
|
43
|
+
assert_equal 0, ParanoidPolygon.only_deleted.count
|
44
|
+
assert_equal 2, ParanoidPolygon.unscoped.count
|
45
|
+
|
46
|
+
ParanoidPolygon.delete_all!
|
47
|
+
assert_equal 0, ParanoidPolygon.count
|
48
|
+
assert_equal 0, ParanoidPolygon.with_deleted.count
|
49
|
+
assert_equal 0, ParanoidPolygon.only_deleted.count
|
50
|
+
assert_equal 1, ParanoidPolygon.unscoped.count
|
51
51
|
end
|
52
52
|
end
|
data/test/test_helper.rb
CHANGED
@@ -164,8 +164,8 @@ def setup_db
|
|
164
164
|
timestamps t
|
165
165
|
end
|
166
166
|
|
167
|
-
create_table :
|
168
|
-
t.
|
167
|
+
create_table :paranoid_polygons do |t|
|
168
|
+
t.integer :sides
|
169
169
|
t.datetime :deleted_at
|
170
170
|
|
171
171
|
timestamps t
|
@@ -193,20 +193,20 @@ def setup_db
|
|
193
193
|
t.integer :parent_id
|
194
194
|
t.datetime :deleted_at
|
195
195
|
|
196
|
-
t
|
196
|
+
timestamps t
|
197
197
|
end
|
198
198
|
|
199
199
|
create_table :not_paranoid_has_many_as_parents do |t|
|
200
200
|
t.string :name
|
201
201
|
|
202
|
-
t
|
202
|
+
timestamps t
|
203
203
|
end
|
204
204
|
|
205
205
|
create_table :paranoid_has_many_as_parents do |t|
|
206
206
|
t.string :name
|
207
207
|
t.datetime :deleted_at
|
208
208
|
|
209
|
-
t
|
209
|
+
timestamps t
|
210
210
|
end
|
211
211
|
end
|
212
212
|
end
|
@@ -451,9 +451,9 @@ class ParanoidTree < ActiveRecord::Base
|
|
451
451
|
validates_presence_of :name
|
452
452
|
end
|
453
453
|
|
454
|
-
class
|
454
|
+
class ParanoidPolygon < ActiveRecord::Base
|
455
455
|
acts_as_paranoid
|
456
|
-
default_scope { where('
|
456
|
+
default_scope { where('sides = ?', 3) }
|
457
457
|
end
|
458
458
|
|
459
459
|
class ParanoidAndroid < ActiveRecord::Base
|
data/test/test_inheritance.rb
CHANGED
@@ -5,10 +5,10 @@ class InheritanceTest < ParanoidBaseTest
|
|
5
5
|
has_many_inherited_super_paranoidz = HasManyInheritedSuperParanoidz.new
|
6
6
|
has_many_inherited_super_paranoidz.save
|
7
7
|
has_many_inherited_super_paranoidz.super_paranoidz.create
|
8
|
-
assert_nothing_raised
|
8
|
+
assert_nothing_raised { has_many_inherited_super_paranoidz.destroy }
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_class_instance_variables_are_inherited
|
12
|
-
assert_nothing_raised
|
12
|
+
assert_nothing_raised { InheritedParanoid.paranoid_column }
|
13
13
|
end
|
14
14
|
end
|
data/test/test_relations.rb
CHANGED
@@ -82,8 +82,8 @@ class RelationsTest < ParanoidBaseTest
|
|
82
82
|
|
83
83
|
# destroy_all: through a relation
|
84
84
|
@paranoid_forest_2.paranoid_trees.order(:id).destroy_all
|
85
|
-
assert_equal 0, @paranoid_forest_2.paranoid_trees
|
86
|
-
assert_equal 2, @paranoid_forest_2.paranoid_trees
|
85
|
+
assert_equal 0, @paranoid_forest_2.paranoid_trees.count
|
86
|
+
assert_equal 2, @paranoid_forest_2.paranoid_trees.with_deleted.count
|
87
87
|
end
|
88
88
|
|
89
89
|
def test_real_removal_through_relation
|
@@ -97,21 +97,21 @@ class RelationsTest < ParanoidBaseTest
|
|
97
97
|
paranoid_tree = @paranoid_forest_1.paranoid_trees.first
|
98
98
|
@paranoid_forest_1.paranoid_trees.order(:id).destroy(paranoid_tree.id)
|
99
99
|
@paranoid_forest_1.paranoid_trees.only_deleted.destroy(paranoid_tree.id)
|
100
|
-
assert_equal 1, @paranoid_forest_1.paranoid_trees
|
101
|
-
assert_equal 1, @paranoid_forest_1.paranoid_trees
|
102
|
-
assert_equal 0, @paranoid_forest_1.paranoid_trees
|
100
|
+
assert_equal 1, @paranoid_forest_1.paranoid_trees.count
|
101
|
+
assert_equal 1, @paranoid_forest_1.paranoid_trees.with_deleted.count
|
102
|
+
assert_equal 0, @paranoid_forest_1.paranoid_trees.only_deleted.count
|
103
103
|
|
104
104
|
# destroy_all: two-step through a relation
|
105
105
|
@paranoid_forest_1.paranoid_trees.order(:id).destroy_all
|
106
106
|
@paranoid_forest_1.paranoid_trees.only_deleted.destroy_all
|
107
|
-
assert_equal 0, @paranoid_forest_1.paranoid_trees
|
108
|
-
assert_equal 0, @paranoid_forest_1.paranoid_trees
|
109
|
-
assert_equal 0, @paranoid_forest_1.paranoid_trees
|
107
|
+
assert_equal 0, @paranoid_forest_1.paranoid_trees.count
|
108
|
+
assert_equal 0, @paranoid_forest_1.paranoid_trees.with_deleted.count
|
109
|
+
assert_equal 0, @paranoid_forest_1.paranoid_trees.only_deleted.count
|
110
110
|
|
111
111
|
# delete_all!: through a relation
|
112
112
|
@paranoid_forest_2.paranoid_trees.order(:id).delete_all!
|
113
|
-
assert_equal 0, @paranoid_forest_2.paranoid_trees
|
114
|
-
assert_equal 0, @paranoid_forest_2.paranoid_trees
|
115
|
-
assert_equal 0, @paranoid_forest_2.paranoid_trees
|
113
|
+
assert_equal 0, @paranoid_forest_2.paranoid_trees.count
|
114
|
+
assert_equal 0, @paranoid_forest_2.paranoid_trees.with_deleted.count
|
115
|
+
assert_equal 0, @paranoid_forest_2.paranoid_trees.only_deleted.count
|
116
116
|
end
|
117
117
|
end
|
data/test/test_validations.rb
CHANGED
@@ -13,6 +13,7 @@ class ValidatesUniquenessTest < ParanoidBaseTest
|
|
13
13
|
|
14
14
|
def test_should_validate_without_deleted
|
15
15
|
ParanoidBoolean.new(:name => 'paranoid').tap do |record|
|
16
|
+
refute record.valid?
|
16
17
|
ParanoidBoolean.first.destroy
|
17
18
|
assert record.valid?
|
18
19
|
ParanoidBoolean.only_deleted.first.destroy!
|
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.
|
4
|
+
version: 0.6.0
|
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:
|
13
|
+
date: 2018-06-07 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -18,40 +18,40 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '4.
|
21
|
+
version: '4.2'
|
22
22
|
- - "<"
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version: '
|
24
|
+
version: '6.0'
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
27
|
version_requirements: !ruby/object:Gem::Requirement
|
28
28
|
requirements:
|
29
29
|
- - ">="
|
30
30
|
- !ruby/object:Gem::Version
|
31
|
-
version: '4.
|
31
|
+
version: '4.2'
|
32
32
|
- - "<"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
34
|
+
version: '6.0'
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: activesupport
|
37
37
|
requirement: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '4.
|
41
|
+
version: '4.2'
|
42
42
|
- - "<"
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
version: '
|
44
|
+
version: '6.0'
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
47
|
version_requirements: !ruby/object:Gem::Requirement
|
48
48
|
requirements:
|
49
49
|
- - ">="
|
50
50
|
- !ruby/object:Gem::Version
|
51
|
-
version: '4.
|
51
|
+
version: '4.2'
|
52
52
|
- - "<"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '6.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -155,21 +155,20 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
155
|
requirements:
|
156
156
|
- - ">="
|
157
157
|
- !ruby/object:Gem::Version
|
158
|
-
version:
|
158
|
+
version: '0'
|
159
159
|
requirements: []
|
160
160
|
rubyforge_project:
|
161
|
-
rubygems_version: 2.
|
161
|
+
rubygems_version: 2.7.6
|
162
162
|
signing_key:
|
163
163
|
specification_version: 4
|
164
164
|
summary: Active Record plugin which allows you to hide and restore records without
|
165
165
|
actually deleting them.
|
166
166
|
test_files:
|
167
|
-
- test/test_inheritance.rb
|
168
|
-
- test/test_preloader_association.rb
|
169
|
-
- test/test_relations.rb
|
170
|
-
- test/test_core.rb
|
171
167
|
- test/test_validations.rb
|
168
|
+
- test/test_relations.rb
|
169
|
+
- test/test_inheritance.rb
|
170
|
+
- test/test_default_scopes.rb
|
172
171
|
- test/test_associations.rb
|
173
172
|
- test/test_helper.rb
|
174
|
-
- test/
|
175
|
-
|
173
|
+
- test/test_core.rb
|
174
|
+
- test/test_preloader_association.rb
|