permanent_records 3.2.0 → 3.3.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,4 +1,7 @@
1
1
  ---
2
+ SHA1:
3
+ metadata.gz: 04a19ebb7eaed9a5f5269e95e0655b1c3beb7d59
4
+ data.tar.gz: 24b041c8d21fb99043f5593eed109a5d372ed2dd
2
5
  SHA512:
3
- metadata.gz: be9cd9f51f282ac7959ef28b582ce21f6ea5fb324d08974bc290a6a3f826ee2fa8d753a31f8b66def452efaa612804e05f512ad966d431f44274af5f98291bbd
4
- data.tar.gz: eaa35e4b1c6e95590e0ac67f4109464d8d5609cf7b8b024d74cfef90657fb34d57ed9aa26f37d93795a75c8faa458899cb348c8ee703915d29c4f19c86198b50
6
+ metadata.gz: 06d0fed27670e3a7f4342af120ef8464a5e560afdce3c357129bfcffeb7e5ec423405afcea8d75e880d2c389e605152a27dfc9755f1d10a5f30e713e51fe3b72
7
+ data.tar.gz: 5e4c127d4485362f7ccf12ce5fba120109dbe5201585b15603086985e98b7f209d8abb7e182d649b80d04670333cc3d1c8dfef561ab0eeeff9de2ea20779d079
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ spec/support/debug.log
2
+ Gemfile.lock
3
+ pkg
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ env:
6
+ - AR_TEST_VERSION: 3.1.0
7
+ - AR_TEST_VERSION: 3.2.12
8
+ - AR_TEST_VERSION: 4.0.0
9
+ - AR_TEST_VERSION: 4.2.0
data/CONTRIBUTORS.md ADDED
@@ -0,0 +1,12 @@
1
+ Folks who gave their time and effort and didn't have to:
2
+
3
+ * [David Sulc](https://github.com/davidsulc)
4
+ * [Joe Nelson](https://github.com/begriffs)
5
+ * [Trond Arve Nordheim](https://github.com/tanordheim)
6
+ * [Josh Teneycke](https://github.com/jteneycke)
7
+ * [Maximilian Herold](https://github.com/mherold)
8
+
9
+ To join this list just open a GH issue with some code you'd like to
10
+ change in this project. New features are fine, bug fixes are better. No
11
+ experience or credentials necessary to begin contributing - if you can
12
+ read this you're welcome to join.
data/README.markdown CHANGED
@@ -1,4 +1,4 @@
1
- # PermanentRecords (Rails 3+)
1
+ # PermanentRecords (Rails 3.1+)
2
2
 
3
3
  [http://github.com/JackDanger/permanent_records/](http://github.com/JackDanger/permanent_records/)
4
4
 
@@ -8,12 +8,12 @@ Any model that you've given a "deleted_at" datetime column will have that column
8
8
  ## What methods does it give me?
9
9
 
10
10
  ```ruby
11
- User.find(3).destroy # Sets the 'deleted_at' attribute to Time.now
11
+ User.find(3).destroy # Sets the 'deleted_at' attribute to Time.now
12
12
  # and returns a frozen record.
13
-
14
- User.find(3).destroy(:force) # Executes the real destroy method, the record
13
+
14
+ User.find(3).destroy(:force) # Executes the real destroy method, the record
15
15
  # will be removed from the database.
16
-
16
+
17
17
  User.destroy_all # Soft-deletes all User records.
18
18
 
19
19
  User.delete_all # bye bye everything (no soft-deleting here)
@@ -53,7 +53,7 @@ end
53
53
 
54
54
  User.find(3).destroy # All the comments are destroyed as well.
55
55
 
56
- User.find(3).revive # All the comments that were just destroyed
56
+ User.find(3).revive # All the comments that were just destroyed
57
57
  # are now back in pristine condition.
58
58
  ```
59
59
 
@@ -75,7 +75,7 @@ end
75
75
 
76
76
  ## Is Everything Automated?
77
77
 
78
- Yes. You don't have to change ANY of your code to get permanent archiving of all your data with this gem.
78
+ Yes. You don't have to change ANY of your code to get permanent archiving of all your data with this gem.
79
79
  When you call `destroy` on any record (or `destroy_all` on a class or association) your records will
80
80
  all have a deleted_at timestamp set on them.
81
81
 
@@ -88,4 +88,4 @@ value that works for you.
88
88
 
89
89
  Patches welcome, forks celebrated.
90
90
 
91
- Copyright (c) 2013 Jack Danger Canty @ [http://jåck.com](http://jåck.com) released under the MIT license
91
+ Copyright 2015 Jack Danger Canty @ [https://jdanger.com](https://jdanger.com) released under the MIT license
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.2.0
1
+ 3.3.0
@@ -33,15 +33,20 @@ module PermanentRecords
33
33
  end
34
34
 
35
35
  def revive(validate = nil)
36
- run_callbacks(:revive) { set_deleted_at(nil, validate) }
37
- self
36
+ with_transaction_returning_status do
37
+ run_callbacks(:revive) { set_deleted_at(nil, validate) }
38
+ self
39
+ end
38
40
  end
39
41
 
40
42
  def destroy(force = nil)
41
- if !is_permanent? || PermanentRecords.should_force_destroy?(force)
42
- return permanently_delete_records_after { super() }
43
+ with_transaction_returning_status do
44
+ if !is_permanent? || PermanentRecords.should_force_destroy?(force)
45
+ permanently_delete_records_after { super() }
46
+ else
47
+ destroy_with_permanent_records force
48
+ end
43
49
  end
44
- destroy_with_permanent_records force
45
50
  end
46
51
 
47
52
  private
@@ -60,16 +65,15 @@ module PermanentRecords
60
65
  record.save!
61
66
  end
62
67
  if ::Gem::Version.new(::ActiveRecord::VERSION::STRING) < ::Gem::Version.new('4.2.0')
63
- @attributes, @attributes_cache = record.attributes, record.attributes
68
+ @attributes = record.attributes
69
+ @attributes_cache = record.attributes.except(record.class.serialized_attributes.keys)
64
70
  # workaround for active_record >= 3.2.0: re-wrap values of serialized attributes
65
71
  # (record.attributes returns the plain values but in the instance variables they are expected to be wrapped)
66
72
  if defined?(::ActiveRecord::AttributeMethods::Serialization::Attribute)
67
73
  serialized_attribute_class = ::ActiveRecord::AttributeMethods::Serialization::Attribute
68
74
  self.class.serialized_attributes.each do |key, coder|
69
75
  if @attributes.key?(key)
70
- attr = serialized_attribute_class.new(coder, @attributes[key], :unserialized)
71
- @attributes[key] = attr
72
- @attributes_cache[key] = attr
76
+ @attributes[key] = serialized_attribute_class.new(coder, @attributes[key], :unserialized)
73
77
  end
74
78
  end
75
79
  end
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
11
11
  s.license = 'MIT'
12
12
 
13
13
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
14
- s.authors = ["Jack Danger Canty", "David Sulc", "Joe Nelson", "Trond Arve Nordheim", "Josh Teneycke"]
14
+ s.authors = ["Jack Danger Canty", "David Sulc", "Joe Nelson", "Trond Arve Nordheim", "Josh Teneycke", "Maximilian Herold"]
15
15
  s.date = Date.today.to_s
16
16
  s.description = "Never Lose Data. Rather than deleting rows this sets Record#deleted_at and gives you all the scopes you need to work with your data."
17
17
  s.email = "gems@6brand.com"
@@ -19,30 +19,7 @@ Gem::Specification.new do |s|
19
19
  "LICENSE",
20
20
  "README.markdown"
21
21
  ]
22
- s.files = [
23
- ".document",
24
- "Gemfile",
25
- "LICENSE",
26
- "README.markdown",
27
- "Rakefile",
28
- "VERSION",
29
- "lib/permanent_records.rb",
30
- "permanent_records.gemspec",
31
- "spec/spec_helper.rb",
32
- "spec/permanent_records_spec.rb",
33
- "spec/support/comment.rb",
34
- "spec/support/database.yml",
35
- "spec/support/difficulty.rb",
36
- "spec/support/dirt.rb",
37
- "spec/support/earthworm.rb",
38
- "spec/support/hole.rb",
39
- "spec/support/kitty.rb",
40
- "spec/support/location.rb",
41
- "spec/support/mole.rb",
42
- "spec/support/muskrat.rb",
43
- "spec/support/schema.rb",
44
- "spec/support/unused_model.rb"
45
- ]
22
+ s.files = `git ls-files`.split($\)
46
23
  s.homepage = "https://github.com/JackDanger/permanent_records"
47
24
  s.require_paths = ["lib"]
48
25
  s.rubygems_version = "1.8.17"
@@ -5,7 +5,7 @@ describe PermanentRecords do
5
5
  let!(:frozen_moment) { Time.now }
6
6
  let!(:dirt) { Dirt.create! }
7
7
  let!(:earthworm) { dirt.create_earthworm }
8
- let!(:hole) { dirt.create_hole }
8
+ let!(:hole) { dirt.create_hole(:options => {}) }
9
9
  let!(:muskrat) { hole.muskrats.create! }
10
10
  let!(:mole) { hole.moles.create! }
11
11
  let!(:location) { hole.create_location }
@@ -38,8 +38,8 @@ describe PermanentRecords do
38
38
  end
39
39
 
40
40
  it 'handles serialized attributes correctly' do
41
- expect { subject.options }.to_not raise_error
42
- expect { subject.size }.to_not raise_error if record.respond_to?(:size)
41
+ expect(subject.options).to eq({})
42
+ expect(subject.size).to be_nil if record.respond_to?(:size)
43
43
  end
44
44
 
45
45
  context 'with force argument set to truthy' do
@@ -77,7 +77,6 @@ describe PermanentRecords do
77
77
  end
78
78
  end
79
79
 
80
-
81
80
  context 'when model has no deleted_at column' do
82
81
  let(:record) { kitty }
83
82
 
@@ -100,10 +99,25 @@ describe PermanentRecords do
100
99
  it 'marks records as deleted' do
101
100
  subject.muskrats.each {|m| m.should be_deleted }
102
101
  end
102
+
103
+ context 'when error occurs' do
104
+ before { Hole.any_instance.stub(:valid?).and_return(false) }
105
+ it 'does not mark records as deleted' do
106
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
107
+ expect(record.muskrats.not_deleted.count).to eq(1)
108
+ end
109
+ end
110
+
103
111
  context 'with force delete' do
104
112
  let(:should_force) { :force }
105
113
  it('') { expect { subject }.to change { Muskrat.count }.by(-1) }
106
114
  it('') { expect { subject }.to change { Comment.count }.by(-2) }
115
+
116
+ context 'when error occurs' do
117
+ before { Difficulty.any_instance.stub(:destroy).and_return(false) }
118
+ it('') { expect { subject }.not_to change { Muskrat.count } }
119
+ it('') { expect { subject }.not_to change { Comment.count } }
120
+ end
107
121
  end
108
122
  end
109
123
 
@@ -111,18 +125,59 @@ describe PermanentRecords do
111
125
  it 'marks records as deleted' do
112
126
  subject.location.should be_deleted
113
127
  end
128
+
129
+ context 'when error occurs' do
130
+ before { Hole.any_instance.stub(:valid?).and_return(false) }
131
+ it('does not mark records as deleted') do
132
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
133
+ expect(record.location(true)).not_to be_deleted
134
+ end
135
+ end
136
+
114
137
  context 'with force delete' do
115
138
  let(:should_force) { :force }
116
139
  it('') { expect { subject }.to change { Muskrat.count }.by(-1) }
117
140
  it('') { expect { subject }.to change { Location.count }.by(-1) }
141
+
142
+ context 'when error occurs' do
143
+ before { Difficulty.any_instance.stub(:destroy).and_return(false) }
144
+ it('') { expect { subject }.not_to change { Muskrat.count } }
145
+ it('') { expect { subject }.not_to change { Location.count } }
146
+ end
147
+ end
148
+ end
149
+
150
+ context 'with belongs_to cardinality' do
151
+ it 'marks records as deleted' do
152
+ subject.dirt.should be_deleted
153
+ end
154
+
155
+ context 'when error occurs' do
156
+ before { Hole.any_instance.stub(:valid?).and_return(false) }
157
+ it 'does not mark records as deleted' do
158
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
159
+ expect(record.dirt(true)).not_to be_deleted
160
+ end
161
+ end
162
+
163
+ context 'with force delete' do
164
+ let(:should_force) { :force }
165
+ it('') { expect { subject }.to change { Dirt.count }.by(-1) }
166
+
167
+ context 'when error occurs' do
168
+ before { Difficulty.any_instance.stub(:destroy).and_return(false) }
169
+ it('') { expect { subject }.not_to change { Dirt.count } }
170
+ end
118
171
  end
119
172
  end
120
173
  end
174
+
121
175
  context 'that are non-permanent' do
122
176
  it 'removes them' do
123
177
  expect { subject }.to change { Mole.count }.by(-1)
124
178
  end
125
179
  end
180
+
126
181
  context 'as default scope' do
127
182
  let(:load_comments) { Comment.unscoped.where(:hole_id => subject.id) }
128
183
  context 'with :has_many cardinality' do
@@ -131,11 +186,7 @@ describe PermanentRecords do
131
186
  }
132
187
  it 'deletes them' do
133
188
  load_comments.all?(&:deleted?).should be_true
134
- # Doesn't change the default scope
135
- # (in versions with non-broken default scope)
136
- if ActiveRecord::VERSION::STRING > '3.0.0'
137
- subject.comments.should be_blank
138
- end
189
+ subject.comments.should be_blank
139
190
  end
140
191
  end
141
192
  context 'with :has_one cardinality' do
@@ -205,19 +256,49 @@ describe PermanentRecords do
205
256
  it 'revives them' do
206
257
  subject.muskrats.each {|m| m.should_not be_deleted }
207
258
  end
259
+ context 'when error occurs' do
260
+ before { Hole.any_instance.stub(:valid?).and_return(false) }
261
+ it 'does not revive them' do
262
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
263
+ expect(record.muskrats.deleted.count).to eq(1)
264
+ end
265
+ end
208
266
  end
209
267
 
210
268
  context 'with has_one cardinality' do
211
269
  it 'revives them' do
212
270
  subject.location.should_not be_deleted
213
271
  end
272
+ context 'when error occurs' do
273
+ before { Hole.any_instance.stub(:valid?).and_return(false) }
274
+ it('does not mark records as deleted') do
275
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
276
+ expect(record.location(true)).to be_deleted
277
+ end
278
+ end
279
+ end
280
+
281
+ context 'with belongs_to cardinality' do
282
+ it 'revives them' do
283
+ subject.dirt.should_not be_deleted
284
+ end
285
+
286
+ context 'when error occurs' do
287
+ before { Hole.any_instance.stub(:valid?).and_return(false) }
288
+ it 'does not revive them' do
289
+ expect { subject }.to raise_error(ActiveRecord::RecordInvalid)
290
+ expect(record.dirt(true)).to be_deleted
291
+ end
292
+ end
214
293
  end
215
294
  end
295
+
216
296
  context 'that are non-permanent' do
217
297
  it 'cannot revive them' do
218
298
  expect { subject }.to_not change { Mole.count }
219
299
  end
220
300
  end
301
+
221
302
  context 'as default scope' do
222
303
  context 'with :has_many cardinality' do
223
304
  its('comments.size') { should == 2 }
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.2.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jack Danger Canty
@@ -9,10 +9,11 @@ authors:
9
9
  - Joe Nelson
10
10
  - Trond Arve Nordheim
11
11
  - Josh Teneycke
12
+ - Maximilian Herold
12
13
  autorequire:
13
14
  bindir: bin
14
15
  cert_chain: []
15
- date: 2015-01-17 00:00:00.000000000 Z
16
+ date: 2015-03-10 00:00:00.000000000 Z
16
17
  dependencies:
17
18
  - !ruby/object:Gem::Dependency
18
19
  name: activerecord
@@ -52,6 +53,9 @@ extra_rdoc_files:
52
53
  - README.markdown
53
54
  files:
54
55
  - ".document"
56
+ - ".gitignore"
57
+ - ".travis.yml"
58
+ - CONTRIBUTORS.md
55
59
  - Gemfile
56
60
  - LICENSE
57
61
  - README.markdown
@@ -93,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
97
  version: '0'
94
98
  requirements: []
95
99
  rubyforge_project:
96
- rubygems_version: 2.4.3
100
+ rubygems_version: 2.4.5
97
101
  signing_key:
98
102
  specification_version: 3
99
103
  summary: Soft-delete your ActiveRecord records