simple_soft_delete 0.0.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.
- data/.gitignore +5 -0
- data/.rbenv-version +1 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/README.md +51 -0
- data/Rakefile +1 -0
- data/lib/simple_soft_delete.rb +30 -0
- data/lib/simple_soft_delete/version.rb +3 -0
- data/simple_soft_delete.gemspec +27 -0
- data/spec/database.yml +3 -0
- data/spec/fixtures/bar.rb +5 -0
- data/spec/fixtures/foo.rb +4 -0
- data/spec/schema.rb +11 -0
- data/spec/simple_soft_delete_spec.rb +85 -0
- data/spec/spec_helper.rb +37 -0
- metadata +121 -0
data/.gitignore
ADDED
data/.rbenv-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.9.3-p0
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# Simple Soft Delete
|
2
|
+
|
3
|
+
Simple soft delete is a rails 3 gem for flagging models once they have
|
4
|
+
been deleted/destroyed with the following commands:
|
5
|
+
|
6
|
+
- Model.delete_all
|
7
|
+
- Model.destroy_all
|
8
|
+
- model.delete
|
9
|
+
- model.destroy
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add a deleted column to the model you want to soft delete
|
14
|
+
|
15
|
+
```
|
16
|
+
class AddDeletedToModel < ActiveRecord::Migration
|
17
|
+
def change
|
18
|
+
add_column :models, :deleted, :boolean, :null => false, :default => false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
```
|
22
|
+
|
23
|
+
Add SimpleSoftDelete module to the model
|
24
|
+
|
25
|
+
```
|
26
|
+
class Model < ActiveRecord::Base
|
27
|
+
include SimpleSoftDelete
|
28
|
+
|
29
|
+
# Scope any uniqueness validations
|
30
|
+
validates_uniqueness_of :attribute_name, :scope => :deleted
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
## Example usage
|
35
|
+
|
36
|
+
```
|
37
|
+
Model.count => 10
|
38
|
+
model = Model.find 3
|
39
|
+
model.delete # UPDATE `models` SET `deleted` = 1, `updated_at` = '2012-01-27 22:34:52' WHERE `models`.`id` = 3
|
40
|
+
Model.count => 9 # SELECT COUNT(*) FROM `models` WHERE `models`.`deleted` = 0
|
41
|
+
Model.unscoped.count => 10 # SELECT COUNT(*) FROM `models`
|
42
|
+
Model.with_deleted.count => 10
|
43
|
+
```
|
44
|
+
|
45
|
+
```
|
46
|
+
Model.count => 10
|
47
|
+
Model.delete_all
|
48
|
+
Model.count => 0
|
49
|
+
Model.with_deleted.count => 10
|
50
|
+
```
|
51
|
+
*it also works the same for destroy which just aliases their delete counterparts*
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "simple_soft_delete/version"
|
2
|
+
require 'active_support/concern'
|
3
|
+
|
4
|
+
module SimpleSoftDelete
|
5
|
+
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
alias_method :destroy, :delete
|
10
|
+
default_scope where(:deleted => false)
|
11
|
+
end
|
12
|
+
|
13
|
+
def delete
|
14
|
+
update_attribute(:deleted, true)
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
|
19
|
+
def delete_all
|
20
|
+
update_all(:deleted => true)
|
21
|
+
end
|
22
|
+
|
23
|
+
def with_deleted
|
24
|
+
unscoped
|
25
|
+
end
|
26
|
+
|
27
|
+
alias_method :destroy_all, :delete_all
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "simple_soft_delete/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "simple_soft_delete"
|
7
|
+
s.version = SimpleSoftDelete::VERSION
|
8
|
+
s.authors = ["David Batey"]
|
9
|
+
s.email = ["davidlbatey@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/davidlbatey/simple_soft_delete"
|
11
|
+
s.summary = "Simple soft delete for rails"
|
12
|
+
s.description = "Flags records as deleted instead of removing them"
|
13
|
+
|
14
|
+
s.rubyforge_project = "simple_soft_delete"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_dependency "activerecord", " > 3.0.0"
|
22
|
+
s.add_development_dependency "bundler", "~> 1.0.0"
|
23
|
+
s.add_development_dependency "rspec", "~> 2.8.0"
|
24
|
+
s.add_development_dependency "database_cleaner", "~> 0.7.1"
|
25
|
+
s.add_development_dependency "sqlite3-ruby", "~> 1.3.3"
|
26
|
+
|
27
|
+
end
|
data/spec/database.yml
ADDED
data/spec/schema.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
ActiveRecord::Schema.define do
|
2
|
+
create_table "foos", :force => true do |t|
|
3
|
+
t.string "name"
|
4
|
+
t.boolean "deleted", :null => false, :default => false
|
5
|
+
end
|
6
|
+
|
7
|
+
create_table "bars", :force => true do |t|
|
8
|
+
t.string "name"
|
9
|
+
t.boolean "deleted", :null => false, :default => false
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe SimpleSoftDelete do
|
4
|
+
|
5
|
+
context "an instance of a model" do
|
6
|
+
|
7
|
+
it "flags foo as deleted on delete" do
|
8
|
+
foo = Foo.create :name => "david"
|
9
|
+
foo.delete
|
10
|
+
|
11
|
+
Foo.find_by_name("david").should be_nil
|
12
|
+
Foo.unscoped.find_by_name("david").should == foo
|
13
|
+
end
|
14
|
+
|
15
|
+
it "flags foo as deleted on destroy" do
|
16
|
+
foo = Foo.create :name => "bob"
|
17
|
+
foo.destroy
|
18
|
+
|
19
|
+
Foo.find_by_name("bob").should be_nil
|
20
|
+
Foo.unscoped.find_by_name("bob").should == foo
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
context "all instances of a model" do
|
26
|
+
|
27
|
+
it "flags all of the models as deleted" do
|
28
|
+
Foo.create :name => "john"
|
29
|
+
Foo.create :name => "kieran"
|
30
|
+
Foo.delete_all
|
31
|
+
|
32
|
+
Foo.count.should == 0
|
33
|
+
Foo.unscoped.count.should == 2
|
34
|
+
end
|
35
|
+
|
36
|
+
it "flags all of the models as deleted on destroy" do
|
37
|
+
Foo.create :name => "fraser"
|
38
|
+
Foo.create :name => "dean"
|
39
|
+
Foo.create :name => "steve"
|
40
|
+
Foo.destroy_all
|
41
|
+
|
42
|
+
Foo.count.should == 0
|
43
|
+
Foo.unscoped.count.should == 3
|
44
|
+
end
|
45
|
+
|
46
|
+
it "aliases unscoped as with_deleted" do
|
47
|
+
Foo.create :name => "bob"
|
48
|
+
Foo.create :name => "mike"
|
49
|
+
Foo.delete_all
|
50
|
+
|
51
|
+
Foo.count.should == 0
|
52
|
+
Foo.with_deleted.count.should == 2
|
53
|
+
end
|
54
|
+
|
55
|
+
it "flags a subsection" do
|
56
|
+
Foo.create :name => "chris"
|
57
|
+
Foo.create :name => "andy"
|
58
|
+
|
59
|
+
Foo.where("name = 'andy'").delete_all
|
60
|
+
|
61
|
+
Foo.count.should == 1
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with uniqueness validations" do
|
67
|
+
|
68
|
+
it "validates name with the scope undeleted" do
|
69
|
+
Bar.create :name => "chris"
|
70
|
+
|
71
|
+
Bar.create(:name => "chris").should_not be_valid
|
72
|
+
Bar.count.should == 1
|
73
|
+
end
|
74
|
+
|
75
|
+
it "scopes to deleted correctly" do
|
76
|
+
bar = Bar.create :name => "lucius"
|
77
|
+
bar.delete
|
78
|
+
|
79
|
+
Bar.create(:name => "lucius").should be_valid
|
80
|
+
Bar.count.should == 1
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'simple_soft_delete'
|
4
|
+
require 'active_record'
|
5
|
+
require 'database_cleaner'
|
6
|
+
|
7
|
+
require File.expand_path(File.dirname(__FILE__) + '/fixtures/foo')
|
8
|
+
require File.expand_path(File.dirname(__FILE__) + '/fixtures/bar')
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
12
|
+
config.run_all_when_everything_filtered = true
|
13
|
+
config.filter_run :focus
|
14
|
+
|
15
|
+
def connect(environment)
|
16
|
+
conf = YAML::load(File.open(File.dirname(__FILE__) + '/database.yml'))
|
17
|
+
ActiveRecord::Base.establish_connection(conf[environment])
|
18
|
+
end
|
19
|
+
|
20
|
+
connect('test')
|
21
|
+
|
22
|
+
load(File.dirname(__FILE__) + "/schema.rb")
|
23
|
+
|
24
|
+
config.before(:suite) do
|
25
|
+
DatabaseCleaner.strategy = :transaction
|
26
|
+
DatabaseCleaner.clean_with(:truncation)
|
27
|
+
end
|
28
|
+
|
29
|
+
config.before(:each) do
|
30
|
+
DatabaseCleaner.start
|
31
|
+
end
|
32
|
+
|
33
|
+
config.after(:each) do
|
34
|
+
DatabaseCleaner.clean
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple_soft_delete
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- David Batey
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-27 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: &70094299639000 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>'
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70094299639000
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: bundler
|
27
|
+
requirement: &70094299637820 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.0.0
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70094299637820
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70094299631180 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.8.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70094299631180
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: database_cleaner
|
49
|
+
requirement: &70094299630220 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.7.1
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70094299630220
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: sqlite3-ruby
|
60
|
+
requirement: &70094299628860 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 1.3.3
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70094299628860
|
69
|
+
description: Flags records as deleted instead of removing them
|
70
|
+
email:
|
71
|
+
- davidlbatey@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- .gitignore
|
77
|
+
- .rbenv-version
|
78
|
+
- .rspec
|
79
|
+
- Gemfile
|
80
|
+
- README.md
|
81
|
+
- Rakefile
|
82
|
+
- lib/simple_soft_delete.rb
|
83
|
+
- lib/simple_soft_delete/version.rb
|
84
|
+
- simple_soft_delete.gemspec
|
85
|
+
- spec/database.yml
|
86
|
+
- spec/fixtures/bar.rb
|
87
|
+
- spec/fixtures/foo.rb
|
88
|
+
- spec/schema.rb
|
89
|
+
- spec/simple_soft_delete_spec.rb
|
90
|
+
- spec/spec_helper.rb
|
91
|
+
homepage: https://github.com/davidlbatey/simple_soft_delete
|
92
|
+
licenses: []
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
requirements: []
|
110
|
+
rubyforge_project: simple_soft_delete
|
111
|
+
rubygems_version: 1.8.11
|
112
|
+
signing_key:
|
113
|
+
specification_version: 3
|
114
|
+
summary: Simple soft delete for rails
|
115
|
+
test_files:
|
116
|
+
- spec/database.yml
|
117
|
+
- spec/fixtures/bar.rb
|
118
|
+
- spec/fixtures/foo.rb
|
119
|
+
- spec/schema.rb
|
120
|
+
- spec/simple_soft_delete_spec.rb
|
121
|
+
- spec/spec_helper.rb
|