delete_softly 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest CHANGED
@@ -1,6 +1,7 @@
1
1
  MIT-LICENSE
2
2
  README
3
3
  Rakefile
4
+ delete_softly.gemspec
4
5
  init.rb
5
6
  install.rb
6
7
  lib/class_methods.rb
data/README CHANGED
@@ -1,7 +1,8 @@
1
1
  DeleteSoftly
2
2
  ============
3
3
 
4
- Add soft delete functionality to ActiveRecord models
4
+ Add soft delete functionality to ActiveRecord models. Important information:
5
+ This is Rails3 only, no backwards compatibility.
5
6
 
6
7
  Example
7
8
  =======
@@ -19,7 +20,7 @@ Now the following stuff works:
19
20
  Post.count #=> 2
20
21
  p2.destroy
21
22
  Post.count #=> 1
22
- Post.at(1.year.ago).count #=> 0
23
+ Post.at_time(1.year.ago).count #=> 0
23
24
 
24
25
  c1 = Comment.create
25
26
  c2 = Comment.create
data/Rakefile CHANGED
@@ -15,7 +15,7 @@ Rake::TestTask.new(:test) do |t|
15
15
  end
16
16
 
17
17
  desc 'Echoe'
18
- Echoe.new('delete_softly', '0.0.1') do |p|
18
+ Echoe.new('delete_softly', '0.0.2') do |p|
19
19
  p.description = "Add soft delete functionality to your ActiveRecord models"
20
20
  p.url = "http://github.com/bterkuile/delete_softly"
21
21
  p.author = "Benjamin ter Kuile"
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{delete_softly}
5
- s.version = "0.0.1"
5
+ s.version = "0.0.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Benjamin ter Kuile"]
9
- s.date = %q{2010-10-31}
9
+ s.date = %q{2010-11-05}
10
10
  s.description = %q{Add soft delete functionality to your ActiveRecord models}
11
11
  s.email = %q{bterkuile@gmail.com}
12
12
  s.extra_rdoc_files = ["README", "lib/class_methods.rb", "lib/delete_softly.rb", "lib/instance_methods.rb"]
13
- s.files = ["MIT-LICENSE", "README", "Rakefile", "init.rb", "install.rb", "lib/class_methods.rb", "lib/delete_softly.rb", "lib/instance_methods.rb", "test/delete_softly_test.rb", "test/test_helper.rb", "uninstall.rb", "Manifest", "delete_softly.gemspec"]
13
+ s.files = ["MIT-LICENSE", "README", "Rakefile", "delete_softly.gemspec", "init.rb", "install.rb", "lib/class_methods.rb", "lib/delete_softly.rb", "lib/instance_methods.rb", "test/delete_softly_test.rb", "test/test_helper.rb", "uninstall.rb", "Manifest"]
14
14
  s.homepage = %q{http://github.com/bterkuile/delete_softly}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Delete_softly", "--main", "README"]
16
16
  s.require_paths = ["lib"]
data/lib/class_methods.rb CHANGED
@@ -1,17 +1,76 @@
1
1
  module DeleteSoftly
2
2
  module ClassMethods
3
+
4
+ # Give the representation of items at a certain date/time.
5
+ # class Item
6
+ # delete_softly
7
+ # end
8
+ # Will result in:
9
+ # Item.at_time(DateTime.parse('2010-01-01')) #=> (SELECT "items".* FROM "items" WHERE (((("items"."deleted_at" > '2010-01-01 00:00:00') OR ("items"."deleted_at" IS NULL)) AND ("items"."created_at" < '2010-01-01 00:00:00')))
3
10
  def at_date(date = Time.now.utc)
4
- with_deleted.where(({:deleted_at.gt => date} | {:deleted_at => nil}) & {:created_at.lt => date})
11
+ with_deleted do
12
+ where(({:deleted_at.gt => date} | {:deleted_at => nil}) & {:created_at.lt => date})
13
+ end
5
14
  end
6
- alias_method :at, :at_date
7
15
  alias_method :at_time, :at_date
8
16
 
17
+ # Give the currently active items. When delete_soflty is added this is invoked by default
18
+ # But when false is added, items are shown by default
19
+ # class Item
20
+ # delete_softly false
21
+ # end
22
+ # Or similar:
23
+ # class Item
24
+ # delete_softly :default => false
25
+ # end
26
+ # You need to call active on the model where you want to hide deleted items
27
+ # Item.all #=> SELECT "items".* FROM "items"
28
+ # Item.active #=> SELECT "items".* FROM "items" WHERE ("items"."deleted_at" IS NULL)
9
29
  def active
10
30
  where(:deleted_at => nil)
11
31
  end
12
32
 
13
- def with_deleted
14
- unscoped
33
+ # Include deleted items when performing queries
34
+ # class Item
35
+ # default_scope order(:content)
36
+ # delete_softly
37
+ # end
38
+ # Will result in:
39
+ # Item.first #=> SELECT "items".* FROM "items" WHERE ("items"."deleted_at" IS NULL) ORDER BY "items"."content" LIMIT 1
40
+ # Item.with_deleted.first #=> SELECT "items".* FROM "items" ORDER BY "items"."content" LIMIT 1
41
+ # Item.where(:content.matches => 'a%') #=> SELECT "items".* FROM "items" WHERE ("items"."deleted_at" IS NULL) AND ("items"."content" ILIKE 'a%') ORDER BY "items"."content"
42
+ # Item.with_deleted do
43
+ # Item.where(:content.matches => 'a%') #=> SELECT "items".* FROM "items" WHERE ("items"."content" ILIKE 'a%') ORDER BY "items"."content"
44
+ # end
45
+ # IHaveManyItems.items #=> SELECT "items".* FROM "items" WHERE ("items"."deleted_at" IS NULL) AND ("items".i_have_many_items_id = 1) ORDER BY "items"."content"
46
+ def with_deleted(&block)
47
+ if scoped_methods.any? # There are scoped methods in place
48
+
49
+ # remove deleted at condition if present
50
+ del = scoped_methods.last.where_values.delete(:deleted_at => nil)
51
+
52
+ # Execute block with deleted or just run scoped
53
+ r = block_given? ? yield : scoped
54
+
55
+ # Add deleted condition if it was present
56
+ scoped_methods.last.where_values << del if del
57
+
58
+ # Return de relation generated without deleted_at => nil
59
+ r
60
+ else
61
+ # Do not do anything special when there are no scoped_methods
62
+ r = block_given? ? yield : scoped
63
+ end
64
+ end
65
+
66
+ # Support for paper_trail if it is installed as well
67
+ def version_at(time)
68
+ if respond_to?(:at_time)
69
+ at_time(time).map{|i| i.respond_to?(:version_at) ? i.version_at(time) : i}.compact
70
+ else
71
+ scoped.map{|i| i.respond_to?(:version_at) ? i.version_at(time) : i}.compact
72
+ end
15
73
  end
16
74
  end
75
+
17
76
  end
data/lib/delete_softly.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  # DeleteSoftly
2
+ require 'active_record'
3
+ require 'meta_where'
2
4
  require 'class_methods'
3
5
  require 'instance_methods'
4
- require 'meta_where'
5
6
  module DeleteSoftly
6
7
  module ARExtender
7
8
 
@@ -36,3 +37,14 @@ module DeleteSoftly
36
37
  end
37
38
 
38
39
  ActiveRecord::Base.send(:extend, DeleteSoftly::ARExtender)
40
+
41
+ # Overwrite ActiveRecord::Base#default_scope
42
+ class ActiveRecord::Base
43
+ # default_scope fix discussed in ticket:
44
+ # https://rails.lighthouseapp.com/projects/8994/tickets/4583-merge-default-scopes-by-default#ticket-4583-11
45
+ def self.default_scope(options = {})
46
+ key = :"#{self}_scoped_methods"
47
+ Thread.current[key] = nil
48
+ self.default_scoping << construct_finder_arel(options, default_scoping.pop)
49
+ end
50
+ end
@@ -12,5 +12,18 @@ module DeleteSoftly
12
12
  @destroyed = true
13
13
  freeze
14
14
  end
15
+
16
+ def revive
17
+ if self.class.respond_to?(:paper_trail_active) && self.class.paper_trail_active
18
+ self.class.paper_trail_off
19
+ update_attribute :deleted_at, nil
20
+ self.class.paper_trail_on
21
+ else
22
+ update_attribute :deleted_at, nil
23
+ end
24
+ end
25
+ alias_method :undelete, :revive
26
+ alias_method :undestroy, :revive
27
+
15
28
  end
16
29
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delete_softly
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Benjamin ter Kuile
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-31 00:00:00 +02:00
18
+ date: 2010-11-05 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -47,6 +47,7 @@ files:
47
47
  - MIT-LICENSE
48
48
  - README
49
49
  - Rakefile
50
+ - delete_softly.gemspec
50
51
  - init.rb
51
52
  - install.rb
52
53
  - lib/class_methods.rb
@@ -56,7 +57,6 @@ files:
56
57
  - test/test_helper.rb
57
58
  - uninstall.rb
58
59
  - Manifest
59
- - delete_softly.gemspec
60
60
  has_rdoc: true
61
61
  homepage: http://github.com/bterkuile/delete_softly
62
62
  licenses: []