paranoid 0.0.3 → 0.0.4

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.
@@ -1,5 +1,5 @@
1
1
  ---
2
- :minor: 0
3
- :patch: 3
2
+ :patch: 4
4
3
  :major: 0
5
4
  :build:
5
+ :minor: 0
@@ -15,16 +15,35 @@ module Paranoid
15
15
  # === Options
16
16
  #
17
17
  # [:field]
18
- # Must be a 3 element array in the form
19
- # [:field_name, 'destroyed value', 'not destroyed value']
20
- # Default: [:deleted_at, Proc.new{Time.now.utc}, nil]
18
+ # The field used to recognize a record as destroyed.
19
+ # Default: :deleted_at
20
+ # IsParanoid Compatibility: Also accepts an Array of form
21
+ # [field_name, destroyed_value, not_destroyed_value]
22
+ # however :destroyed_value and :not_destroyed_value will
23
+ # be ignored
24
+ #
25
+ # [:destroyed_value]
26
+ # The value to set the paranoid field to on destroy.
27
+ # Can be either a static value or a Proc which will be
28
+ # evaluated when destroy is called.
29
+ # Default: Proc.new{Time.now.utc}
30
+ #
31
+ # [:not_destroyed_value]
32
+ # The value used to recognize a record as not destroyed.
33
+ # Default: nil
21
34
  def paranoid(opts = {})
22
35
  return if paranoid?
23
36
  @paranoid = true
24
37
 
25
38
  opts[:field] ||= [:deleted_at, Proc.new{Time.now.utc}, nil]
26
39
  class_inheritable_accessor :destroyed_field, :field_destroyed, :field_not_destroyed
27
- self.destroyed_field, self.field_destroyed, self.field_not_destroyed = opts[:field]
40
+ if opts[:field].is_a?(Array)
41
+ self.destroyed_field, self.field_destroyed, self.field_not_destroyed = opts[:field]
42
+ else
43
+ self.destroyed_field = opts.key?(:field) ? opts[:field] : :deleted_at
44
+ self.field_destroyed = opts.key?(:destroyed_value) ? opts[:destroyed_value] : Proc.new{Time.now.utc}
45
+ self.field_not_destroyed = opts.key?(:not_destroyed_value) ? opts[:not_destroyed_value] : nil
46
+ end
28
47
 
29
48
  include Paranoid::ParanoidMethods
30
49
 
@@ -51,7 +51,7 @@ module Paranoid
51
51
 
52
52
  # Returns a new relation scoped to include soft deleted records
53
53
  def with_destroyed
54
- spawn.tap {|relation| relation.skip_paranoid_condition }
54
+ clone.tap {|relation| relation.skip_paranoid_condition }
55
55
  end
56
56
 
57
57
  # Returns a new relation scoped to include only deleted records
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{paranoid}
8
- s.version = "0.0.3"
8
+ s.version = "0.0.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["David Genord II"]
12
- s.date = %q{2010-02-22}
12
+ s.date = %q{2010-03-23}
13
13
  s.description = %q{}
14
14
  s.email = %q{github@xspond.com}
15
15
  s.extra_rdoc_files = [
@@ -38,7 +38,7 @@ Gem::Specification.new do |s|
38
38
  s.homepage = %q{http://github.com/xspond/paranoid/}
39
39
  s.rdoc_options = ["--charset=UTF-8"]
40
40
  s.require_paths = ["lib"]
41
- s.rubygems_version = %q{1.3.5}
41
+ s.rubygems_version = %q{1.3.6}
42
42
  s.summary = %q{Enable soft delete of ActiveRecord records. Based off defunct ActsAsParanoid and IsParanoid}
43
43
  s.test_files = [
44
44
  "spec/models.rb",
@@ -30,7 +30,7 @@ class Dent < ActiveRecord::Base #:nodoc:
30
30
  end
31
31
 
32
32
  class Ding < ActiveRecord::Base #:nodoc:
33
- paranoid :field => [:not_deleted, true, false]
33
+ paranoid :field => :not_deleted, :destroyed_value => true, :not_destroyed_value => false
34
34
  belongs_to :dent
35
35
  end
36
36
 
@@ -83,6 +83,13 @@ end
83
83
  class Place < ActiveRecord::Base #:nodoc:
84
84
  paranoid
85
85
  has_and_belongs_to_many :androids
86
+
87
+ # this code is to ensure that our destroy and restore methods
88
+ # work without triggering before/after_update callbacks
89
+ before_update :raise_hell
90
+ def raise_hell
91
+ raise "hell"
92
+ end
86
93
  end
87
94
 
88
95
  class AndroidsPlaces < ActiveRecord::Base #:nodoc:
@@ -91,17 +98,31 @@ end
91
98
  class Ninja < ActiveRecord::Base #:nodoc:
92
99
  validates_uniqueness_of :name, :scope => :visible
93
100
  paranoid :field => [:visible, false, true]
94
-
101
+
95
102
  alias_method :vanish, :destroy
103
+
104
+ # this code is to ensure that our destroy and restore methods
105
+ # work without triggering before/after_update callbacks
106
+ before_update :raise_hell
107
+ def raise_hell
108
+ raise "hell"
109
+ end
96
110
  end
97
111
 
98
112
  class Pirate < ActiveRecord::Base #:nodoc:
99
- paranoid :field => [:alive, false, true]
113
+ paranoid :field => :alive, :destroyed_value => false, :not_destroyed_value => true
114
+
115
+ # this code is to ensure that our destroy and restore methods
116
+ # work without triggering before/after_update callbacks
117
+ before_update :raise_hell
118
+ def raise_hell
119
+ raise "hell"
120
+ end
100
121
  end
101
122
 
102
123
  class DeadPirate < ActiveRecord::Base #:nodoc:
103
124
  set_table_name :pirates
104
- paranoid :field => [:alive, true, false]
125
+ paranoid :field => :alive, :destroyed_value => true, :not_destroyed_value => false
105
126
  end
106
127
 
107
128
  class RandomPirate < ActiveRecord::Base #:nodoc:
@@ -115,7 +136,7 @@ end
115
136
 
116
137
  class UndestroyablePirate < ActiveRecord::Base #:nodoc:
117
138
  set_table_name :pirates
118
- paranoid :field => [:alive, false, true]
139
+ paranoid :field => :alive, :destroyed_value => false, :not_destroyed_value => true
119
140
 
120
141
  before_destroy :ret_false
121
142
  def ret_false
@@ -35,17 +35,17 @@ describe Paranoid do
35
35
  end
36
36
 
37
37
  it 'should hide destroyed records' do
38
- @tatooine.update_attribute('deleted_at', Time.now)
38
+ @tatooine.destroy
39
39
  Place.first(:conditions => {:name => 'Tatooine'}).should be_nil
40
40
  end
41
41
 
42
42
  it 'should reveal destroyed records when with_destroyed' do
43
- @tatooine.update_attribute('deleted_at', Time.now)
43
+ @tatooine.destroy
44
44
  Place.with_destroyed.first(:conditions => {:name => 'Tatooine'}).should_not be_nil
45
45
  end
46
46
 
47
47
  it 'should restore the destroyed record' do
48
- @tatooine.update_attribute('deleted_at', Time.now)
48
+ @tatooine.destroy
49
49
 
50
50
  @tatooine = Place.with_destroyed.first(:conditions => {:name => 'Tatooine'})
51
51
  @tatooine.restore
@@ -89,6 +89,58 @@ describe Paranoid do
89
89
  end
90
90
 
91
91
  describe 'for alternate field information' do
92
+ before(:each) do
93
+ Pirate.delete_all
94
+ @roberts, @jack, @hook = Pirate.create([{:name => 'Roberts'}, {:name => 'Jack'}, {:name => 'Hook'}])
95
+ end
96
+
97
+ it 'should have 3 alive pirates' do
98
+ Pirate.all.size.should == 3
99
+ end
100
+
101
+ it 'should kill the pirate' do
102
+ @roberts.destroy
103
+
104
+ record = Pirate.first(:conditions => {:name => 'Roberts'})
105
+ record.should be_nil
106
+ end
107
+
108
+ it 'should not remove the pirate record' do
109
+ @roberts.destroy
110
+
111
+ record = Pirate.with_destroyed.first(:conditions => {:name => 'Roberts'})
112
+ record.should_not be_nil
113
+ record.alive.should be_false
114
+ end
115
+
116
+ it 'should mark the pirate dead' do
117
+ @roberts.destroy
118
+ @roberts.destroyed?.should be_true
119
+ end
120
+
121
+ it 'should set alive to false' do
122
+ @roberts.destroy
123
+ @roberts.alive.should be_false
124
+ end
125
+
126
+ it 'should show deleted_only' do
127
+ @roberts.destroy
128
+ destroyed = Pirate.with_destroyed_only.all
129
+ destroyed.size.should == 1
130
+ destroyed[0].should == @roberts
131
+ end
132
+
133
+ it 'should properly count records' do
134
+ Pirate.count.should == 3
135
+
136
+ @roberts.destroy
137
+ Pirate.count.should == 2
138
+ Pirate.with_destroyed.count.should == 3
139
+ Pirate.with_destroyed_only.count.should == 1
140
+ end
141
+ end
142
+
143
+ describe 'for alternate field information with is_paranoid format field information' do
92
144
  before(:each) do
93
145
  Ninja.delete_all
94
146
  @steve, @bob, @tim = Ninja.create([{:name => 'Steve', :visible => true}, {:name => 'Bob', :visible => true}, {:name => 'Tim', :visible => true}])
@@ -192,4 +244,25 @@ describe Paranoid do
192
244
  @nil.should be_nil
193
245
  end
194
246
  end
247
+
248
+ describe 'callbacks' do
249
+ before(:each) do
250
+ Pirate.delete_all
251
+ end
252
+
253
+ it 'should not destroy the record when before_destroy returns false' do
254
+ pirate = UndestroyablePirate.create!(:name => 'Roberts')
255
+ lambda { pirate.destroy }.should_not change(UndestroyablePirate, :count)
256
+ end
257
+
258
+ it 'should run after_destroy callbacks' do
259
+ pirate = RandomPirate.create!(:name => 'Roberts')
260
+ lambda { pirate.destroy }.should raise_error(/after_destroy works/)
261
+ end
262
+
263
+ it 'should rollback on after_destroy error' do
264
+ pirate = RandomPirate.create!(:name => 'Roberts')
265
+ lambda { pirate.destroy rescue nil }.should_not change(RandomPirate, :count)
266
+ end
267
+ end
195
268
  end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paranoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 4
9
+ version: 0.0.4
5
10
  platform: ruby
6
11
  authors:
7
12
  - David Genord II
@@ -9,19 +14,24 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-22 00:00:00 -05:00
17
+ date: 2010-03-23 00:00:00 -04:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: activerecord
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ~>
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 3
29
+ - 0
30
+ - 0
31
+ - beta
23
32
  version: 3.0.0.beta
24
- version:
33
+ type: :runtime
34
+ version_requirements: *id001
25
35
  description: ""
26
36
  email: github@xspond.com
27
37
  executables: []
@@ -62,18 +72,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
62
72
  requirements:
63
73
  - - ">="
64
74
  - !ruby/object:Gem::Version
75
+ segments:
76
+ - 0
65
77
  version: "0"
66
- version:
67
78
  required_rubygems_version: !ruby/object:Gem::Requirement
68
79
  requirements:
69
80
  - - ">="
70
81
  - !ruby/object:Gem::Version
82
+ segments:
83
+ - 0
71
84
  version: "0"
72
- version:
73
85
  requirements: []
74
86
 
75
87
  rubyforge_project:
76
- rubygems_version: 1.3.5
88
+ rubygems_version: 1.3.6
77
89
  signing_key:
78
90
  specification_version: 3
79
91
  summary: Enable soft delete of ActiveRecord records. Based off defunct ActsAsParanoid and IsParanoid