destroyed_at 0.1.0 → 0.1.1
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/.gitignore +2 -0
- data/CONTRIBUTING.md +24 -0
- data/README.md +50 -18
- data/lib/destroyed_at.rb +10 -8
- data/lib/destroyed_at/version.rb +1 -1
- data/test/destroyed_at_test.rb +16 -11
- data/test/test_helper.rb +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0cbd15c416464ff4ef00e2af5b0a037bf72691e
|
4
|
+
data.tar.gz: 7f0cdd43d097e1f28b8c557ba444fa1f0befc6f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb3d75a9b8ab6488912479cc5623556f4f23e84d2235ecd6b668e1a2417037abf43ee377aa27b26504fb32a8878e0cb8c92540f3a6188d231dc917c2e5b9f2aa
|
7
|
+
data.tar.gz: ca2b3311fcec370efa0d5ab14d0fa6c5b11b7a36e8282f931f54501f399c173c2c0d0d18af81f124e49afb66351510ac268631eb89fbf239f990712133c32079
|
data/.gitignore
CHANGED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Contribution Guidelines #
|
2
|
+
|
3
|
+
## Submitting a new issue ##
|
4
|
+
|
5
|
+
If you want to ensure that your issue gets fixed *fast* you should
|
6
|
+
attempt to reproduce the issue in an isolated example application that
|
7
|
+
you can share.
|
8
|
+
|
9
|
+
## Making a pull request ##
|
10
|
+
|
11
|
+
If you'd like to submit a pull request please adhere to the following:
|
12
|
+
|
13
|
+
1. Your code *must* be tested. Please TDD your code!
|
14
|
+
2. No single-character variables
|
15
|
+
3. Two-spaces instead of tabs
|
16
|
+
4. Single-quotes instead of double-quotes unless you are using string
|
17
|
+
interpolation or escapes.
|
18
|
+
5. General Rails/Ruby naming conventions for files and classes
|
19
|
+
|
20
|
+
Please note that you must adhere to each of the aforementioned rules.
|
21
|
+
Failure to do so will result in an immediate closing of the pull
|
22
|
+
request. If you update and rebase the pull request to follow the
|
23
|
+
guidelines your pull request will be re-opened and considered for
|
24
|
+
inclusion.
|
data/README.md
CHANGED
@@ -32,6 +32,8 @@ class ActiveRecord::Base
|
|
32
32
|
end
|
33
33
|
```
|
34
34
|
|
35
|
+
**Please note you will need to make a migration**
|
36
|
+
|
35
37
|
Each model's table that is expected to have this behavior **must** have
|
36
38
|
a `destroyed_at` column of type `DateTime`.
|
37
39
|
|
@@ -40,50 +42,80 @@ Allows you to "destroy" an object without deleting the record or
|
|
40
42
|
associated records.
|
41
43
|
|
42
44
|
### Destroying ###
|
43
|
-
Overides
|
45
|
+
Overides `#destroy` to set `#destroyed_at` to the current time on an object. The
|
44
46
|
default scope of the class is then set to return objects that have not
|
45
47
|
been destroyed (i.e., have `nil` for their destroyed_at value).
|
46
48
|
|
47
49
|
`#destroyed?` will be `true` when your model is destroyed; it will be
|
48
|
-
`false` when your model has been
|
50
|
+
`false` when your model has been restored.
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
class User < ActiveRecord::Base
|
54
|
+
include DestroyedAt
|
55
|
+
end
|
49
56
|
|
50
|
-
|
51
|
-
|
52
|
-
|
57
|
+
user = User.create
|
58
|
+
user.destroy
|
59
|
+
# => true
|
60
|
+
user.destroyed_at
|
61
|
+
# => <DateTime>
|
62
|
+
```
|
63
|
+
|
64
|
+
### Restoring ####
|
65
|
+
When you'd like to "restore" a record, call the `#restore` method on
|
66
|
+
the instance. This will set its `#destroyed_at` value to `nil`, thereby
|
53
67
|
including it in the default scope of the class again.
|
54
68
|
|
55
69
|
To include this functionality on `has_many through` relationships,
|
56
70
|
be sure to `include DestroyedAt` on the through model, as well as the
|
57
71
|
parent model.
|
58
72
|
|
59
|
-
#### Callbacks ####
|
60
|
-
`before_undestroy` and `after_undestroy` callbacks are added to your
|
61
|
-
model. They work similarly to the `before_destroy` and `after_destroy`
|
62
|
-
callbacks.
|
63
|
-
|
64
|
-
### Destroying ###
|
65
73
|
```ruby
|
66
74
|
class User < ActiveRecord::Base
|
67
75
|
include DestroyedAt
|
68
76
|
end
|
69
77
|
|
70
78
|
user = User.create
|
71
|
-
user.destroy
|
79
|
+
user.destroy
|
80
|
+
user.restore
|
72
81
|
# => true
|
82
|
+
user.destroyed_at
|
83
|
+
# => nil
|
73
84
|
```
|
74
85
|
|
75
|
-
###
|
86
|
+
### Callbacks ###
|
87
|
+
`before_restore` and `after_restore` callbacks are added to your
|
88
|
+
model. They work similarly to the `before_destroy` and `after_destroy`
|
89
|
+
callbacks.
|
90
|
+
|
76
91
|
```ruby
|
77
92
|
class User < ActiveRecord::Base
|
78
|
-
|
93
|
+
before_restore :before_restore_action
|
94
|
+
after_restore :after_restore_action
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def before_restore_action
|
99
|
+
...
|
100
|
+
end
|
101
|
+
|
102
|
+
def after_restore_action
|
103
|
+
...
|
104
|
+
end
|
79
105
|
end
|
106
|
+
```
|
80
107
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
108
|
+
### Validations ###
|
109
|
+
|
110
|
+
If you are using the `uniqueness` validator you will need to run it as:
|
111
|
+
|
112
|
+
```ruby
|
113
|
+
validates :email, uniqueness: { conditions: -> { where(destroyed_at: nil) } }
|
85
114
|
```
|
86
115
|
|
116
|
+
Rails will by default not include default_scopes when querying for uniqueness. Rather than monkey
|
117
|
+
patching the validator we believe this is the best solution.
|
118
|
+
|
87
119
|
## Authors ##
|
88
120
|
|
89
121
|
* [Michael Dupuis](http://twitter.com/michaeldupuisjr)
|
data/lib/destroyed_at.rb
CHANGED
@@ -5,7 +5,7 @@ module DestroyedAt
|
|
5
5
|
klass.instance_eval do
|
6
6
|
default_scope { where(destroyed_at: nil) }
|
7
7
|
after_initialize :_set_destruction_state
|
8
|
-
define_model_callbacks :
|
8
|
+
define_model_callbacks :restore
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -18,13 +18,13 @@ module DestroyedAt
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
# Set an object's
|
22
|
-
def
|
21
|
+
# Set an object's destroyed_at time to nil.
|
22
|
+
def restore
|
23
23
|
state = nil
|
24
|
-
run_callbacks(:
|
24
|
+
run_callbacks(:restore) do
|
25
25
|
if state = self.update_attribute(:destroyed_at, nil)
|
26
26
|
@destroyed = false
|
27
|
-
|
27
|
+
_restore_associations
|
28
28
|
end
|
29
29
|
end
|
30
30
|
state
|
@@ -33,16 +33,18 @@ module DestroyedAt
|
|
33
33
|
private
|
34
34
|
|
35
35
|
def _set_destruction_state
|
36
|
-
@destroyed = destroyed_at.present?
|
36
|
+
@destroyed = destroyed_at.present? if respond_to?(:destroyed_at)
|
37
|
+
# Don't stop the other callbacks from running
|
38
|
+
true
|
37
39
|
end
|
38
40
|
|
39
|
-
def
|
41
|
+
def _restore_associations
|
40
42
|
reflections.select { |key, value| value.options[:dependent] == :destroy }.keys.each do |key|
|
41
43
|
assoc = association(key)
|
42
44
|
if assoc.options[:through] && assoc.options[:dependent] == :destroy
|
43
45
|
assoc = association(assoc.options[:through])
|
44
46
|
end
|
45
|
-
assoc.scoped.unscoped.each { |r| r.
|
47
|
+
assoc.scoped.unscoped.each { |r| r.restore if r.respond_to? :restore }
|
46
48
|
end
|
47
49
|
end
|
48
50
|
end
|
data/lib/destroyed_at/version.rb
CHANGED
data/test/destroyed_at_test.rb
CHANGED
@@ -17,11 +17,11 @@ describe 'Destroying AR models' do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
it 'can
|
20
|
+
it 'can restore records' do
|
21
21
|
user = User.create(:destroyed_at => DateTime.current)
|
22
22
|
User.all.must_be_empty
|
23
23
|
user.reload
|
24
|
-
user.
|
24
|
+
user.restore
|
25
25
|
User.all.wont_be_empty
|
26
26
|
end
|
27
27
|
|
@@ -34,11 +34,11 @@ describe 'Destroying AR models' do
|
|
34
34
|
person.after_flag.must_equal true
|
35
35
|
end
|
36
36
|
|
37
|
-
it 'will run
|
37
|
+
it 'will run restore callbacks' do
|
38
38
|
person = Person.create(:destroyed_at => DateTime.current)
|
39
39
|
person.before_flag.wont_equal true
|
40
40
|
person.after_flag.wont_equal true
|
41
|
-
person.
|
41
|
+
person.restore
|
42
42
|
person.before_flag.must_equal true
|
43
43
|
person.after_flag.must_equal true
|
44
44
|
end
|
@@ -55,18 +55,18 @@ describe 'Destroying AR models' do
|
|
55
55
|
Car.unscoped.count.must_equal 0
|
56
56
|
end
|
57
57
|
|
58
|
-
it 'can
|
58
|
+
it 'can restore relationships' do
|
59
59
|
user = User.create(:destroyed_at => DateTime.current)
|
60
60
|
Profile.create(:destroyed_at => DateTime.current, :user => user)
|
61
61
|
Profile.count.must_equal 0
|
62
|
-
user.
|
62
|
+
user.restore
|
63
63
|
Profile.count.must_equal 1
|
64
64
|
end
|
65
65
|
|
66
|
-
it 'will not
|
66
|
+
it 'will not restore relationships that have no destroy dependency' do
|
67
67
|
user = User.create(:destroyed_at => DateTime.current, :show => Show.new(:destroyed_at => DateTime.current))
|
68
68
|
Show.count.must_equal 0
|
69
|
-
user.
|
69
|
+
user.restore
|
70
70
|
Show.count.must_equal 0
|
71
71
|
end
|
72
72
|
|
@@ -74,7 +74,7 @@ describe 'Destroying AR models' do
|
|
74
74
|
user = User.create(:destroyed_at => DateTime.current)
|
75
75
|
Dinner.create(:destroyed_at => DateTime.current, :user => user)
|
76
76
|
Dinner.count.must_equal 0
|
77
|
-
user.
|
77
|
+
user.restore
|
78
78
|
Dinner.count.must_equal 1
|
79
79
|
end
|
80
80
|
|
@@ -85,7 +85,7 @@ describe 'Destroying AR models' do
|
|
85
85
|
fleet = Fleet.create(:destroyed_at => DateTime.current, :car => car)
|
86
86
|
user.fleets = [fleet]
|
87
87
|
user.cars.count.must_equal 0
|
88
|
-
user.
|
88
|
+
user.restore
|
89
89
|
user.cars.count.must_equal 1
|
90
90
|
end
|
91
91
|
|
@@ -95,7 +95,12 @@ describe 'Destroying AR models' do
|
|
95
95
|
user.destroyed?.must_equal true
|
96
96
|
user = User.unscoped.last
|
97
97
|
user.destroyed?.must_equal true
|
98
|
-
user.
|
98
|
+
user.restore
|
99
99
|
user.destroyed?.must_equal false
|
100
100
|
end
|
101
|
+
|
102
|
+
it 'properly selects columns' do
|
103
|
+
User.create
|
104
|
+
User.select(:id).must_be_kind_of ActiveRecord::Relation
|
105
|
+
end
|
101
106
|
end
|
data/test/test_helper.rb
CHANGED
@@ -48,8 +48,8 @@ class Person < User
|
|
48
48
|
before_destroy :set_before_flag
|
49
49
|
after_destroy :set_after_flag
|
50
50
|
|
51
|
-
|
52
|
-
|
51
|
+
before_restore :set_before_flag
|
52
|
+
after_restore :set_after_flag
|
53
53
|
|
54
54
|
attr_accessor :before_flag, :after_flag
|
55
55
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: destroyed_at
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Dupuis Jr.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -145,6 +145,7 @@ extra_rdoc_files: []
|
|
145
145
|
files:
|
146
146
|
- .gitignore
|
147
147
|
- .travis.yml
|
148
|
+
- CONTRIBUTING.md
|
148
149
|
- Gemfile
|
149
150
|
- README.md
|
150
151
|
- Rakefile
|
@@ -173,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
174
|
version: '0'
|
174
175
|
requirements: []
|
175
176
|
rubyforge_project:
|
176
|
-
rubygems_version: 2.0.
|
177
|
+
rubygems_version: 2.0.3
|
177
178
|
signing_key:
|
178
179
|
specification_version: 4
|
179
180
|
summary: Safe destroy for ActiveRecord.
|