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 ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ simple_soft_delete.db
3
+ .bundle
4
+ Gemfile.lock
5
+ pkg/*
data/.rbenv-version ADDED
@@ -0,0 +1 @@
1
+ 1.9.3-p0
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in simple_soft_delete.gemspec
4
+ gemspec
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,3 @@
1
+ module SimpleSoftDelete
2
+ VERSION = "0.0.1"
3
+ 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
@@ -0,0 +1,3 @@
1
+ test:
2
+ :adapter: sqlite3
3
+ :database: simple_soft_delete.db
@@ -0,0 +1,5 @@
1
+ class Bar < ActiveRecord::Base
2
+ include SimpleSoftDelete
3
+
4
+ validates_uniqueness_of :name, :scope => :deleted
5
+ end
@@ -0,0 +1,4 @@
1
+ class Foo < ActiveRecord::Base
2
+ include SimpleSoftDelete
3
+
4
+ end
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
@@ -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