paranoia 2.0.4 → 2.0.5
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 +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +9 -0
- data/Gemfile +1 -1
- data/README.md +3 -1
- data/lib/paranoia.rb +14 -3
- data/lib/paranoia/rspec.rb +15 -5
- data/lib/paranoia/version.rb +1 -1
- data/test/paranoia_test.rb +66 -8
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1bd7736219b3968e111105e25de4553f328a744c
|
4
|
+
data.tar.gz: 3df48b961122c079b3565a2b3cc1f48b7b940fea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1df4bb3d86bcf7dcb932a11139acc9d68b8edadea446f64acdf370e9cde9b455684bf261f839949a826fcba3a77490252c6b15d027ad1cc4dc7853ca6ad702a7
|
7
|
+
data.tar.gz: 61751265887e6a270b906433b9b3b03688344d683492abb2cbf4d91fa03f10f2b3db9c02b9e506b66175366e0581702671d2c54311b960dcdcba93238d2e9856
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# paranoia Changelog
|
2
2
|
|
3
|
+
## 2.0.5 (2015-01-22)
|
4
|
+
|
5
|
+
### Bug fixes
|
6
|
+
|
7
|
+
* Fix restoring polymorphic has_one relationships [#189](https://github.com/radar/paranoia/pull/189) [#174](https://github.com/radar/paranoia/issues/174) [Patrick Koperwas](https://github.com/PatKoperwas)
|
8
|
+
* Fix errors when restoring a model with a has_one against a non-paranoid model. [#168](https://github.com/radar/paranoia/pull/168) [Shreyas Agarwal](https://github.com/shreyas123)
|
9
|
+
* Fix rspec 2 compatibility [#197](https://github.com/radar/paranoia/pull/197) [Emil Sågfors](https://github.com/lime)
|
10
|
+
* Fix some deprecation warnings on rails 4.2 [Sergey Alekseev](https://github.com/sergey-alekseev)
|
11
|
+
|
3
12
|
## 2.0.4 (2014-12-02)
|
4
13
|
|
5
14
|
### Features
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,7 +4,7 @@ Paranoia is a re-implementation of [acts\_as\_paranoid](http://github.com/techno
|
|
4
4
|
|
5
5
|
You would use either plugin / gem if you wished that when you called `destroy` on an Active Record object that it didn't actually destroy it, but just *hide* the record. Paranoia does this by setting a `deleted_at` field to the current time when you `destroy` a record, and hides it by scoping all queries on your model to only include records which do not have a `deleted_at` field.
|
6
6
|
|
7
|
-
If you wish to actually destroy an object you may call `really_destroy!`. **WARNING**: This will also *really destroy* all `dependent: destroy` records, so please aim this method away from face when using
|
7
|
+
If you wish to actually destroy an object you may call `really_destroy!`. **WARNING**: This will also *really destroy* all `dependent: destroy` records, so please aim this method away from face when using.
|
8
8
|
|
9
9
|
If a record has `has_many` associations defined AND those associations have `dependent: :destroy` set on them, then they will also be soft-deleted if `acts_as_paranoid` is set, otherwise the normal destroy will be called.
|
10
10
|
|
@@ -140,6 +140,8 @@ If you want to check if a record is soft-deleted:
|
|
140
140
|
|
141
141
|
``` ruby
|
142
142
|
client.destroyed?
|
143
|
+
# or
|
144
|
+
client.deleted?
|
143
145
|
```
|
144
146
|
|
145
147
|
If you want to restore a record:
|
data/lib/paranoia.rb
CHANGED
@@ -142,9 +142,20 @@ module Paranoia
|
|
142
142
|
end
|
143
143
|
|
144
144
|
if association_data.nil? && association.macro.to_s == "has_one"
|
145
|
-
association_class_name = association.
|
146
|
-
association_foreign_key = association.
|
147
|
-
|
145
|
+
association_class_name = association.class_name
|
146
|
+
association_foreign_key = association.foreign_key
|
147
|
+
|
148
|
+
if association.type
|
149
|
+
association_polymorphic_type = association.type
|
150
|
+
association_find_conditions = { association_polymorphic_type => self.class.name.to_s, association_foreign_key => self.id }
|
151
|
+
else
|
152
|
+
association_find_conditions = { association_foreign_key => self.id }
|
153
|
+
end
|
154
|
+
|
155
|
+
association_class = Object.const_get(association_class_name)
|
156
|
+
if association_class.paranoid?
|
157
|
+
association_class.only_deleted.where(association_find_conditions).first.try!(:restore, recursive: true)
|
158
|
+
end
|
148
159
|
end
|
149
160
|
end
|
150
161
|
|
data/lib/paranoia/rspec.rb
CHANGED
@@ -4,10 +4,20 @@ require 'rspec/expectations'
|
|
4
4
|
RSpec::Matchers.define :act_as_paranoid do
|
5
5
|
match { |subject| subject.class.ancestors.include?(Paranoia) }
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
failure_message_proc = lambda do
|
8
|
+
"expected #{subject.class} to use `acts_as_paranoid`"
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
11
|
+
failure_message_when_negated_proc = lambda do
|
12
|
+
"expected #{subject.class} not to use `acts_as_paranoid`"
|
13
|
+
end
|
14
|
+
|
15
|
+
if respond_to?(:failure_message_when_negated)
|
16
|
+
failure_message(&failure_message_proc)
|
17
|
+
failure_message_when_negated(&failure_message_when_negated_proc)
|
18
|
+
else
|
19
|
+
# RSpec 2 compatibility:
|
20
|
+
failure_message_for_should(&failure_message_proc)
|
21
|
+
failure_message_for_should_not(&failure_message_when_negated_proc)
|
22
|
+
end
|
13
23
|
end
|
data/lib/paranoia/version.rb
CHANGED
data/test/paranoia_test.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_record'
|
2
|
+
ActiveRecord::Base.raise_in_transactional_callbacks = true if ActiveRecord::VERSION::STRING >= '4.2'
|
2
3
|
|
3
4
|
test_framework = if ActiveRecord::VERSION::STRING >= "4.1"
|
4
5
|
require 'minitest/autorun'
|
@@ -20,6 +21,7 @@ def setup!
|
|
20
21
|
ActiveRecord::Base.connection.execute 'CREATE TABLE paranoid_model_with_belongs (id INTEGER NOT NULL PRIMARY KEY, parent_model_id INTEGER, deleted_at DATETIME, paranoid_model_with_has_one_id INTEGER)'
|
21
22
|
ActiveRecord::Base.connection.execute 'CREATE TABLE paranoid_model_with_anthor_class_name_belongs (id INTEGER NOT NULL PRIMARY KEY, parent_model_id INTEGER, deleted_at DATETIME, paranoid_model_with_has_one_id INTEGER)'
|
22
23
|
ActiveRecord::Base.connection.execute 'CREATE TABLE paranoid_model_with_foreign_key_belongs (id INTEGER NOT NULL PRIMARY KEY, parent_model_id INTEGER, deleted_at DATETIME, has_one_foreign_key_id INTEGER)'
|
24
|
+
ActiveRecord::Base.connection.execute 'CREATE TABLE not_paranoid_model_with_belongs (id INTEGER NOT NULL PRIMARY KEY, parent_model_id INTEGER, paranoid_model_with_has_one_id INTEGER)'
|
23
25
|
ActiveRecord::Base.connection.execute 'CREATE TABLE featureful_models (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME, name VARCHAR(32))'
|
24
26
|
ActiveRecord::Base.connection.execute 'CREATE TABLE plain_models (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME)'
|
25
27
|
ActiveRecord::Base.connection.execute 'CREATE TABLE callback_models (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME)'
|
@@ -32,6 +34,7 @@ def setup!
|
|
32
34
|
ActiveRecord::Base.connection.execute 'CREATE TABLE custom_column_models (id INTEGER NOT NULL PRIMARY KEY, destroyed_at DATETIME)'
|
33
35
|
ActiveRecord::Base.connection.execute 'CREATE TABLE custom_sentinel_models (id INTEGER NOT NULL PRIMARY KEY, deleted_at DATETIME NOT NULL)'
|
34
36
|
ActiveRecord::Base.connection.execute 'CREATE TABLE non_paranoid_models (id INTEGER NOT NULL PRIMARY KEY, parent_model_id INTEGER)'
|
37
|
+
ActiveRecord::Base.connection.execute 'CREATE TABLE polymorphic_models (id INTEGER NOT NULL PRIMARY KEY, parent_id INTEGER, parent_type STRING, deleted_at DATETIME)'
|
35
38
|
end
|
36
39
|
|
37
40
|
class WithDifferentConnection < ActiveRecord::Base
|
@@ -454,9 +457,12 @@ class ParanoiaTest < test_framework
|
|
454
457
|
belongsTo = ParanoidModelWithBelong.create
|
455
458
|
anthorClassName = ParanoidModelWithAnthorClassNameBelong.create
|
456
459
|
foreignKey = ParanoidModelWithForeignKeyBelong.create
|
460
|
+
notParanoidModel = NotParanoidModelWithBelong.create
|
461
|
+
|
457
462
|
hasOne.paranoid_model_with_belong = belongsTo
|
458
463
|
hasOne.class_name_belong = anthorClassName
|
459
464
|
hasOne.paranoid_model_with_foreign_key_belong = foreignKey
|
465
|
+
hasOne.not_paranoid_model_with_belong = notParanoidModel
|
460
466
|
hasOne.save!
|
461
467
|
|
462
468
|
hasOne.destroy
|
@@ -469,6 +475,7 @@ class ParanoiaTest < test_framework
|
|
469
475
|
|
470
476
|
assert_equal true, hasOne.reload.deleted_at.nil?
|
471
477
|
assert_equal true, belongsTo.reload.deleted_at.nil?, "#{belongsTo.deleted_at}"
|
478
|
+
assert_equal true, notParanoidModel.destroyed?
|
472
479
|
assert ParanoidModelWithBelong.with_deleted.reload.count != 0, "There should be a record"
|
473
480
|
assert ParanoidModelWithAnthorClassNameBelong.with_deleted.reload.count != 0, "There should be an other record"
|
474
481
|
assert ParanoidModelWithForeignKeyBelong.with_deleted.reload.count != 0, "There should be a foreign_key record"
|
@@ -480,9 +487,12 @@ class ParanoiaTest < test_framework
|
|
480
487
|
belongsTo = ParanoidModelWithBelong.create
|
481
488
|
anthorClassName = ParanoidModelWithAnthorClassNameBelong.create
|
482
489
|
foreignKey = ParanoidModelWithForeignKeyBelong.create
|
490
|
+
notParanoidModel = NotParanoidModelWithBelong.create
|
491
|
+
|
483
492
|
hasOne.paranoid_model_with_belong = belongsTo
|
484
493
|
hasOne.class_name_belong = anthorClassName
|
485
494
|
hasOne.paranoid_model_with_foreign_key_belong = foreignKey
|
495
|
+
hasOne.not_paranoid_model_with_belong = notParanoidModel
|
486
496
|
hasOne.save!
|
487
497
|
|
488
498
|
hasOne.destroy
|
@@ -496,6 +506,7 @@ class ParanoiaTest < test_framework
|
|
496
506
|
|
497
507
|
assert_equal true, hasOne.reload.deleted_at.nil?
|
498
508
|
assert_equal true, belongsTo.reload.deleted_at.nil?, "#{belongsTo.deleted_at}"
|
509
|
+
assert_equal true, notParanoidModel.destroyed?
|
499
510
|
assert ParanoidModelWithBelong.with_deleted.reload.count != 0, "There should be a record"
|
500
511
|
assert ParanoidModelWithAnthorClassNameBelong.with_deleted.reload.count != 0, "There should be an other record"
|
501
512
|
assert ParanoidModelWithForeignKeyBelong.with_deleted.reload.count != 0, "There should be a foreign_key record"
|
@@ -507,9 +518,12 @@ class ParanoiaTest < test_framework
|
|
507
518
|
belongsTo = ParanoidModelWithBelong.create
|
508
519
|
anthorClassName = ParanoidModelWithAnthorClassNameBelong.create
|
509
520
|
foreignKey = ParanoidModelWithForeignKeyBelong.create
|
521
|
+
notParanoidModel = NotParanoidModelWithBelong.create
|
522
|
+
|
510
523
|
hasOne.paranoid_model_with_belong = belongsTo
|
511
524
|
hasOne.class_name_belong = anthorClassName
|
512
525
|
hasOne.paranoid_model_with_foreign_key_belong = foreignKey
|
526
|
+
hasOne.not_paranoid_model_with_belong = notParanoidModel
|
513
527
|
hasOne.save!
|
514
528
|
|
515
529
|
hasOne.destroy
|
@@ -522,6 +536,7 @@ class ParanoiaTest < test_framework
|
|
522
536
|
|
523
537
|
assert_equal true, hasOne.reload.deleted_at.nil?
|
524
538
|
assert_equal true, belongsTo.reload.deleted_at.nil?, "#{belongsTo.deleted_at}"
|
539
|
+
assert_equal true, notParanoidModel.destroyed?
|
525
540
|
assert ParanoidModelWithBelong.with_deleted.reload.count != 0, "There should be a record"
|
526
541
|
assert ParanoidModelWithAnthorClassNameBelong.with_deleted.reload.count != 0, "There should be an other record"
|
527
542
|
assert ParanoidModelWithForeignKeyBelong.with_deleted.reload.count != 0, "There should be a foreign_key record"
|
@@ -535,7 +550,7 @@ class ParanoiaTest < test_framework
|
|
535
550
|
|
536
551
|
# Does it raise NoMethodException on restore of nil
|
537
552
|
hasOne.restore(:recursive => true)
|
538
|
-
|
553
|
+
|
539
554
|
assert hasOne.reload.deleted_at.nil?
|
540
555
|
end
|
541
556
|
|
@@ -549,7 +564,7 @@ class ParanoiaTest < test_framework
|
|
549
564
|
|
550
565
|
hasOnes.each(&:destroy)
|
551
566
|
|
552
|
-
ParanoidModelWithHasOne.restore(hasOnes[1], :recursive => true)
|
567
|
+
ParanoidModelWithHasOne.restore(hasOnes[1].id, :recursive => true)
|
553
568
|
hasOnes.each(&:reload)
|
554
569
|
belongsTos.each(&:reload)
|
555
570
|
|
@@ -564,14 +579,14 @@ class ParanoiaTest < test_framework
|
|
564
579
|
def test_has_one_really_destroy_with_nil
|
565
580
|
model = ParanoidModelWithHasOne.create
|
566
581
|
model.really_destroy!
|
567
|
-
|
582
|
+
|
568
583
|
refute ParanoidModelWithBelong.unscoped.exists?(model.id)
|
569
584
|
end
|
570
|
-
|
585
|
+
|
571
586
|
def test_has_one_really_destroy_with_record
|
572
587
|
model = ParanoidModelWithHasOne.create { |record| record.build_paranoid_model_with_belong }
|
573
588
|
model.really_destroy!
|
574
|
-
|
589
|
+
|
575
590
|
refute ParanoidModelWithBelong.unscoped.exists?(model.id)
|
576
591
|
end
|
577
592
|
|
@@ -592,12 +607,14 @@ class ParanoiaTest < test_framework
|
|
592
607
|
end
|
593
608
|
|
594
609
|
def test_i_am_the_destroyer
|
595
|
-
|
596
|
-
assert_equal %Q{
|
610
|
+
expected = %Q{
|
597
611
|
Sharon: "There should be a method called I_AM_THE_DESTROYER!"
|
598
612
|
Ryan: "What should this method do?"
|
599
613
|
Sharon: "It should fix all the spelling errors on the page!"
|
600
|
-
}
|
614
|
+
}
|
615
|
+
assert_output expected do
|
616
|
+
ParanoidModel.I_AM_THE_DESTROYER!
|
617
|
+
end
|
601
618
|
end
|
602
619
|
|
603
620
|
def test_destroy_fails_if_callback_raises_exception
|
@@ -654,6 +671,34 @@ class ParanoiaTest < test_framework
|
|
654
671
|
setup!
|
655
672
|
end
|
656
673
|
|
674
|
+
def test_restore_recursive_on_polymorphic_has_one_association
|
675
|
+
parent = ParentModel.create
|
676
|
+
polymorphic = PolymorphicModel.create(parent: parent)
|
677
|
+
|
678
|
+
parent.destroy
|
679
|
+
|
680
|
+
assert_equal 0, polymorphic.class.count
|
681
|
+
|
682
|
+
parent.restore(recursive: true)
|
683
|
+
|
684
|
+
assert_equal 1, polymorphic.class.count
|
685
|
+
end
|
686
|
+
|
687
|
+
# Ensure that we're checking parent_type when restoring
|
688
|
+
def test_missing_restore_recursive_on_polymorphic_has_one_association
|
689
|
+
parent = ParentModel.create
|
690
|
+
polymorphic = PolymorphicModel.create(parent_id: parent.id, parent_type: 'ParanoidModel')
|
691
|
+
|
692
|
+
parent.destroy
|
693
|
+
polymorphic.destroy
|
694
|
+
|
695
|
+
assert_equal 0, polymorphic.class.count
|
696
|
+
|
697
|
+
parent.restore(recursive: true)
|
698
|
+
|
699
|
+
assert_equal 0, polymorphic.class.count
|
700
|
+
end
|
701
|
+
|
657
702
|
private
|
658
703
|
def get_featureful_model
|
659
704
|
FeaturefulModel.new(:name => "not empty")
|
@@ -706,6 +751,7 @@ class ParentModel < ActiveRecord::Base
|
|
706
751
|
has_many :very_related_models, :class_name => 'RelatedModel', dependent: :destroy
|
707
752
|
has_many :non_paranoid_models, dependent: :destroy
|
708
753
|
has_many :asplode_models, dependent: :destroy
|
754
|
+
has_one :polymorphic_model, as: :parent, dependent: :destroy
|
709
755
|
end
|
710
756
|
|
711
757
|
class RelatedModel < ActiveRecord::Base
|
@@ -761,6 +807,7 @@ class ParanoidModelWithHasOne < ParanoidModel
|
|
761
807
|
has_one :paranoid_model_with_belong, :dependent => :destroy
|
762
808
|
has_one :class_name_belong, :dependent => :destroy, :class_name => "ParanoidModelWithAnthorClassNameBelong"
|
763
809
|
has_one :paranoid_model_with_foreign_key_belong, :dependent => :destroy, :foreign_key => "has_one_foreign_key_id"
|
810
|
+
has_one :not_paranoid_model_with_belong, :dependent => :destroy
|
764
811
|
end
|
765
812
|
|
766
813
|
class ParanoidModelWithBelong < ActiveRecord::Base
|
@@ -778,6 +825,10 @@ class ParanoidModelWithForeignKeyBelong < ActiveRecord::Base
|
|
778
825
|
belongs_to :paranoid_model_with_has_one
|
779
826
|
end
|
780
827
|
|
828
|
+
class NotParanoidModelWithBelong < ActiveRecord::Base
|
829
|
+
belongs_to :paranoid_model_with_has_one
|
830
|
+
end
|
831
|
+
|
781
832
|
class FlaggedModel < PlainModel
|
782
833
|
acts_as_paranoid :flag_column => :is_deleted
|
783
834
|
end
|
@@ -786,6 +837,8 @@ class FlaggedModelWithCustomIndex < PlainModel
|
|
786
837
|
acts_as_paranoid :flag_column => :is_deleted, :indexed_column => :is_deleted
|
787
838
|
end
|
788
839
|
|
840
|
+
|
841
|
+
|
789
842
|
class AsplodeModel < ActiveRecord::Base
|
790
843
|
acts_as_paranoid
|
791
844
|
before_destroy do |r|
|
@@ -795,3 +848,8 @@ end
|
|
795
848
|
|
796
849
|
class NoConnectionModel < ActiveRecord::Base
|
797
850
|
end
|
851
|
+
|
852
|
+
class PolymorphicModel < ActiveRecord::Base
|
853
|
+
acts_as_paranoid
|
854
|
+
belongs_to :parent, polymorphic: true
|
855
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: paranoia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- radarlistener@gmail.com
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
94
|
version: 1.3.6
|
95
95
|
requirements: []
|
96
96
|
rubyforge_project: paranoia
|
97
|
-
rubygems_version: 2.
|
97
|
+
rubygems_version: 2.4.5
|
98
98
|
signing_key:
|
99
99
|
specification_version: 4
|
100
100
|
summary: Paranoia is a re-implementation of acts_as_paranoid for Rails 3, using much,
|