permanent_records 3.1.6 → 3.2.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 +2 -5
- data/Gemfile +2 -2
- data/README.markdown +41 -40
- data/VERSION +1 -1
- data/lib/permanent_records.rb +22 -15
- data/permanent_records.gemspec +1 -1
- data/spec/permanent_records_spec.rb +5 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/support/comment.rb +1 -1
- data/spec/support/database.yml +2 -2
- data/spec/support/difficulty.rb +6 -2
- metadata +13 -11
checksums.yaml
CHANGED
@@ -1,7 +1,4 @@
|
|
1
1
|
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 78b0fb28d98b7b5a68bb591b23eaded91bba6f87
|
4
|
-
data.tar.gz: 756981d277d14d61780c49250f6c9893e01f6a6b
|
5
2
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be9cd9f51f282ac7959ef28b582ce21f6ea5fb324d08974bc290a6a3f826ee2fa8d753a31f8b66def452efaa612804e05f512ad966d431f44274af5f98291bbd
|
4
|
+
data.tar.gz: eaa35e4b1c6e95590e0ac67f4109464d8d5609cf7b8b024d74cfef90657fb34d57ed9aa26f37d93795a75c8faa458899cb348c8ee703915d29c4f19c86198b50
|
data/Gemfile
CHANGED
data/README.markdown
CHANGED
@@ -1,83 +1,84 @@
|
|
1
|
-
# PermanentRecords
|
1
|
+
# PermanentRecords (Rails 3+)
|
2
2
|
|
3
3
|
[http://github.com/JackDanger/permanent_records/](http://github.com/JackDanger/permanent_records/)
|
4
4
|
|
5
5
|
This gem prevents any of your ActiveRecord data from being destroyed.
|
6
6
|
Any model that you've given a "deleted_at" datetime column will have that column set rather than let the record be deleted.
|
7
7
|
|
8
|
-
##
|
9
|
-
|
10
|
-
## Does it make a lot of sense?
|
11
|
-
|
12
|
-
Yes.
|
8
|
+
## What methods does it give me?
|
13
9
|
|
14
10
|
```ruby
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
User.find(3).destroy # Sets the 'deleted_at' attribute to Time.now
|
12
|
+
# and returns a frozen record.
|
13
|
+
|
14
|
+
User.find(3).destroy(:force) # Executes the real destroy method, the record
|
15
|
+
# will be removed from the database.
|
16
|
+
|
17
|
+
User.destroy_all # Soft-deletes all User records.
|
18
|
+
|
19
|
+
User.delete_all # bye bye everything (no soft-deleting here)
|
19
20
|
```
|
20
21
|
There are also two scopes provided for easily searching deleted and not deleted records:
|
21
22
|
|
22
23
|
```ruby
|
23
|
-
|
24
|
-
User.not_deleted.find(...) # only returns non-deleted records.
|
25
|
-
```
|
24
|
+
User.deleted.find(...) # Only returns deleted records.
|
26
25
|
|
27
|
-
|
28
|
-
|
29
|
-
```ruby
|
30
|
-
User.find(1) # will find record number 1, even if it's deleted
|
31
|
-
User.not_deleted.find(1) # This is probably what you want, it doesn't find deleted records
|
26
|
+
User.not_deleted.find(...) # Only returns non-deleted records.
|
32
27
|
```
|
33
28
|
|
34
|
-
|
35
|
-
|
29
|
+
Note: Your normal finds will, by default, _include_ deleted records. You'll have to manually use the ```not_deleted``` scope to avoid this:
|
36
30
|
|
37
|
-
|
38
|
-
|
39
|
-
all have a deleted_at timestamp set on them.
|
31
|
+
```ruby
|
32
|
+
User.find(1) # Will find record number 1, even if it's deleted.
|
40
33
|
|
34
|
+
User.not_deleted.find(1) # This is probably what you want, it doesn't find deleted records.
|
35
|
+
```
|
41
36
|
|
42
37
|
## Can I easily undelete records?
|
43
38
|
|
44
39
|
Yes. All you need to do is call the 'revive' method.
|
45
40
|
|
46
41
|
```ruby
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
# the user is back to it's original state
|
42
|
+
User.find(3).destroy # The user is now deleted.
|
43
|
+
|
44
|
+
User.find(3).revive # The user is back to it's original state.
|
51
45
|
```
|
52
46
|
|
53
47
|
And if you had dependent records that were set to be destroyed along with the parent record:
|
54
48
|
|
55
49
|
```ruby
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
# forcing deletion works the same way: fi you hard delete a record, its dependent records will also be hard deleted
|
50
|
+
class User < ActiveRecord::Base
|
51
|
+
has_many :comments, :dependent => :destroy
|
52
|
+
end
|
53
|
+
|
54
|
+
User.find(3).destroy # All the comments are destroyed as well.
|
55
|
+
|
56
|
+
User.find(3).revive # All the comments that were just destroyed
|
57
|
+
# are now back in pristine condition.
|
65
58
|
```
|
66
59
|
|
60
|
+
Forcing deletion works the same way: if you hard delete a record, its dependent records will also be hard deleted.
|
61
|
+
|
67
62
|
## Can I use default scopes?
|
68
63
|
|
69
64
|
```ruby
|
70
|
-
|
65
|
+
default_scope where(:deleted_at => nil)
|
71
66
|
```
|
72
67
|
|
73
68
|
If you use such a default scope, you will need to simulate the `deleted` scope with a method
|
74
69
|
|
75
70
|
```ruby
|
76
|
-
|
77
|
-
|
78
|
-
|
71
|
+
def self.deleted
|
72
|
+
self.unscoped.where('deleted_at IS NOT NULL')
|
73
|
+
end
|
79
74
|
```
|
80
75
|
|
76
|
+
## Is Everything Automated?
|
77
|
+
|
78
|
+
Yes. You don't have to change ANY of your code to get permanent archiving of all your data with this gem.
|
79
|
+
When you call `destroy` on any record (or `destroy_all` on a class or association) your records will
|
80
|
+
all have a deleted_at timestamp set on them.
|
81
|
+
|
81
82
|
## Productionizing
|
82
83
|
|
83
84
|
If you operate a system where destroying or reviving a record takes more
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.2.0
|
data/lib/permanent_records.rb
CHANGED
@@ -6,7 +6,7 @@ module PermanentRecords
|
|
6
6
|
# * is_permanent? #=> true/false, depending if you have a deleted_at column
|
7
7
|
# * deleted? #=> true/false, depending if you've called .destroy
|
8
8
|
# * destroy #=> sets deleted_at, your record is now in the .destroyed scope
|
9
|
-
# *
|
9
|
+
# * revive #=> undo the destroy
|
10
10
|
module ActiveRecord
|
11
11
|
def self.included(base)
|
12
12
|
|
@@ -25,7 +25,11 @@ module PermanentRecords
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def deleted?
|
28
|
-
|
28
|
+
if is_permanent?
|
29
|
+
!!deleted_at
|
30
|
+
else
|
31
|
+
destroyed?
|
32
|
+
end
|
29
33
|
end
|
30
34
|
|
31
35
|
def revive(validate = nil)
|
@@ -55,18 +59,22 @@ module PermanentRecords
|
|
55
59
|
else
|
56
60
|
record.save!
|
57
61
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
62
|
+
if ::Gem::Version.new(::ActiveRecord::VERSION::STRING) < ::Gem::Version.new('4.2.0')
|
63
|
+
@attributes, @attributes_cache = record.attributes, record.attributes
|
64
|
+
# workaround for active_record >= 3.2.0: re-wrap values of serialized attributes
|
65
|
+
# (record.attributes returns the plain values but in the instance variables they are expected to be wrapped)
|
66
|
+
if defined?(::ActiveRecord::AttributeMethods::Serialization::Attribute)
|
67
|
+
serialized_attribute_class = ::ActiveRecord::AttributeMethods::Serialization::Attribute
|
68
|
+
self.class.serialized_attributes.each do |key, coder|
|
69
|
+
if @attributes.key?(key)
|
70
|
+
attr = serialized_attribute_class.new(coder, @attributes[key], :unserialized)
|
71
|
+
@attributes[key] = attr
|
72
|
+
@attributes_cache[key] = attr
|
73
|
+
end
|
68
74
|
end
|
69
75
|
end
|
76
|
+
else # AR >= 4.2.0
|
77
|
+
@attributes = record.instance_variable_get('@attributes')
|
70
78
|
end
|
71
79
|
rescue Exception => e
|
72
80
|
# trigger dependent record destruction (they were revived before this record,
|
@@ -89,9 +97,8 @@ module PermanentRecords
|
|
89
97
|
end.each do |name, reflection|
|
90
98
|
cardinality = reflection.macro.to_s.gsub('has_', '')
|
91
99
|
if cardinality == 'many'
|
92
|
-
records = send(name).unscoped.
|
93
|
-
|
94
|
-
:conditions => [
|
100
|
+
records = send(name).unscoped.where(
|
101
|
+
[
|
95
102
|
"#{reflection.quoted_table_name}.deleted_at > ?" +
|
96
103
|
" AND " +
|
97
104
|
"#{reflection.quoted_table_name}.deleted_at < ?",
|
data/permanent_records.gemspec
CHANGED
@@ -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"]
|
14
|
+
s.authors = ["Jack Danger Canty", "David Sulc", "Joe Nelson", "Trond Arve Nordheim", "Josh Teneycke"]
|
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"
|
@@ -84,6 +84,10 @@ describe PermanentRecords do
|
|
84
84
|
it 'really removes the record' do
|
85
85
|
expect { subject }.to change { record.class.count }.by(-1)
|
86
86
|
end
|
87
|
+
|
88
|
+
it 'makes deleted? return true' do
|
89
|
+
subject.should be_deleted
|
90
|
+
end
|
87
91
|
end
|
88
92
|
|
89
93
|
context 'with dependent records' do
|
@@ -120,7 +124,7 @@ describe PermanentRecords do
|
|
120
124
|
end
|
121
125
|
end
|
122
126
|
context 'as default scope' do
|
123
|
-
let(:load_comments) { Comment.unscoped.
|
127
|
+
let(:load_comments) { Comment.unscoped.where(:hole_id => subject.id) }
|
124
128
|
context 'with :has_many cardinality' do
|
125
129
|
before {
|
126
130
|
load_comments.size.should == 2
|
data/spec/spec_helper.rb
CHANGED
@@ -17,6 +17,10 @@ module Rails
|
|
17
17
|
def self.env; 'test'end
|
18
18
|
end
|
19
19
|
|
20
|
+
if I18n.config.respond_to?(:enforce_available_locales)
|
21
|
+
I18n.config.enforce_available_locales = true
|
22
|
+
end
|
23
|
+
|
20
24
|
require 'logger'
|
21
25
|
ActiveRecord::Base.logger = Logger.new support.join("debug.log")
|
22
26
|
ActiveRecord::Base.configurations = YAML::load_file support.join('database.yml')
|
data/spec/support/comment.rb
CHANGED
data/spec/support/database.yml
CHANGED
data/spec/support/difficulty.rb
CHANGED
metadata
CHANGED
@@ -1,44 +1,45 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: permanent_records
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jack Danger Canty
|
8
8
|
- David Sulc
|
9
9
|
- Joe Nelson
|
10
10
|
- Trond Arve Nordheim
|
11
|
+
- Josh Teneycke
|
11
12
|
autorequire:
|
12
13
|
bindir: bin
|
13
14
|
cert_chain: []
|
14
|
-
date:
|
15
|
+
date: 2015-01-17 00:00:00.000000000 Z
|
15
16
|
dependencies:
|
16
17
|
- !ruby/object:Gem::Dependency
|
17
18
|
name: activerecord
|
18
19
|
requirement: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
20
|
-
- -
|
21
|
+
- - ">="
|
21
22
|
- !ruby/object:Gem::Version
|
22
23
|
version: 3.0.0
|
23
24
|
type: :runtime
|
24
25
|
prerelease: false
|
25
26
|
version_requirements: !ruby/object:Gem::Requirement
|
26
27
|
requirements:
|
27
|
-
- -
|
28
|
+
- - ">="
|
28
29
|
- !ruby/object:Gem::Version
|
29
30
|
version: 3.0.0
|
30
31
|
- !ruby/object:Gem::Dependency
|
31
32
|
name: rake
|
32
33
|
requirement: !ruby/object:Gem::Requirement
|
33
34
|
requirements:
|
34
|
-
- -
|
35
|
+
- - ">="
|
35
36
|
- !ruby/object:Gem::Version
|
36
37
|
version: '0'
|
37
38
|
type: :development
|
38
39
|
prerelease: false
|
39
40
|
version_requirements: !ruby/object:Gem::Requirement
|
40
41
|
requirements:
|
41
|
-
- -
|
42
|
+
- - ">="
|
42
43
|
- !ruby/object:Gem::Version
|
43
44
|
version: '0'
|
44
45
|
description: Never Lose Data. Rather than deleting rows this sets Record#deleted_at
|
@@ -50,7 +51,7 @@ extra_rdoc_files:
|
|
50
51
|
- LICENSE
|
51
52
|
- README.markdown
|
52
53
|
files:
|
53
|
-
- .document
|
54
|
+
- ".document"
|
54
55
|
- Gemfile
|
55
56
|
- LICENSE
|
56
57
|
- README.markdown
|
@@ -58,8 +59,8 @@ files:
|
|
58
59
|
- VERSION
|
59
60
|
- lib/permanent_records.rb
|
60
61
|
- permanent_records.gemspec
|
61
|
-
- spec/spec_helper.rb
|
62
62
|
- spec/permanent_records_spec.rb
|
63
|
+
- spec/spec_helper.rb
|
63
64
|
- spec/support/comment.rb
|
64
65
|
- spec/support/database.yml
|
65
66
|
- spec/support/difficulty.rb
|
@@ -82,18 +83,19 @@ require_paths:
|
|
82
83
|
- lib
|
83
84
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
85
|
requirements:
|
85
|
-
- -
|
86
|
+
- - ">="
|
86
87
|
- !ruby/object:Gem::Version
|
87
88
|
version: '0'
|
88
89
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
90
|
requirements:
|
90
|
-
- -
|
91
|
+
- - ">="
|
91
92
|
- !ruby/object:Gem::Version
|
92
93
|
version: '0'
|
93
94
|
requirements: []
|
94
95
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.
|
96
|
+
rubygems_version: 2.4.3
|
96
97
|
signing_key:
|
97
98
|
specification_version: 3
|
98
99
|
summary: Soft-delete your ActiveRecord records
|
99
100
|
test_files: []
|
101
|
+
has_rdoc:
|