permanent_records 3.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.0.1
1
+ 3.0.2
@@ -43,15 +43,27 @@ module PermanentRecords
43
43
  end
44
44
 
45
45
  def destroy(force = nil)
46
- if !is_permanent? || (:force == force)
46
+ if !is_permanent? || PermanentRecords.should_force_destroy?(force)
47
47
  return permanently_delete_records_after { super() }
48
48
  end
49
49
  destroy_with_permanent_records force
50
50
  end
51
51
 
52
+ def self.should_force_destroy?(force)
53
+ if Hash === force
54
+ force[:force]
55
+ else
56
+ :force == force
57
+ end
58
+ end
59
+
60
+ def self.should_ignore_validations?(force)
61
+ Hash === force && false == force[:validate]
62
+ end
63
+
52
64
  protected
53
65
 
54
- def set_deleted_at(value)
66
+ def set_deleted_at(value, force = nil)
55
67
  return self unless is_permanent?
56
68
  record = self.class.unscoped.find(id)
57
69
  record.deleted_at = value
@@ -59,7 +71,11 @@ module PermanentRecords
59
71
  # we call save! instead of update_attribute so an ActiveRecord::RecordInvalid
60
72
  # error will be raised if the record isn't valid. (This prevents reviving records that
61
73
  # disregard validation constraints,)
62
- record.save!
74
+ if PermanentRecords.should_ignore_validations?(force)
75
+ record.save(:validate => false)
76
+ else
77
+ record.save!
78
+ end
63
79
  @attributes, @attributes_cache = record.attributes, record.attributes
64
80
  rescue Exception => e
65
81
  # trigger dependent record destruction (they were revived before this record,
@@ -71,7 +87,7 @@ module PermanentRecords
71
87
 
72
88
  def destroy_with_permanent_records(force = nil)
73
89
  _run_destroy_callbacks do
74
- deleted? || new_record? ? save : set_deleted_at(Time.now)
90
+ deleted? || new_record? ? save : set_deleted_at(Time.now, force)
75
91
  end
76
92
  self
77
93
  end
@@ -45,6 +45,34 @@ describe PermanentRecords do
45
45
  end
46
46
  end
47
47
 
48
+ context 'with hash-style :force argument' do
49
+ let(:should_force) {{ force: true }}
50
+
51
+ it 'does really remove the record' do
52
+ expect { subject }.to change { record.class.count }.by(-1)
53
+ end
54
+ end
55
+
56
+ context 'when validations fail' do
57
+ before {
58
+ Hole.any_instance.stub(:valid?).and_return(false)
59
+ }
60
+ it 'raises' do
61
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
62
+ end
63
+
64
+ context 'with validation opt-out' do
65
+ let(:should_force) {{ validate: false }}
66
+ it 'doesnt raise' do
67
+ expect { subject }.to_not raise_error
68
+ end
69
+ it 'soft-deletes the invalid record' do
70
+ subject.should be_deleted
71
+ end
72
+ end
73
+ end
74
+
75
+
48
76
  context 'when model has no deleted_at column' do
49
77
  let(:record) { kitty }
50
78
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: permanent_records
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -90,7 +90,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
90
  version: '0'
91
91
  segments:
92
92
  - 0
93
- hash: 2162955961777207463
93
+ hash: 1685930428738744402
94
94
  required_rubygems_version: !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements: