dependent_protect 0.0.4 → 0.0.5
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/Gemfile +1 -1
- data/dependent_protect.gemspec +2 -2
- data/lib/dependent_protect.rb +3 -2
- data/lib/dependent_protect/delete_restriction_error.rb +13 -12
- data/spec/dependent_protect_spec.rb +12 -6
- metadata +6 -3
data/Gemfile
CHANGED
data/dependent_protect.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
## If your rubyforge_project name is different, then edit it and comment out
|
14
14
|
## the sub! line in the Rakefile
|
15
15
|
s.name = 'dependent_protect'
|
16
|
-
s.version = '0.0.
|
17
|
-
s.date = '2012-
|
16
|
+
s.version = '0.0.5'
|
17
|
+
s.date = '2012-07-15'
|
18
18
|
s.rubyforge_project = 'dependent_protect'
|
19
19
|
|
20
20
|
## Make sure your summary is short. The description may be as long
|
data/lib/dependent_protect.rb
CHANGED
@@ -4,7 +4,7 @@ require 'active_record'
|
|
4
4
|
require 'dependent_protect/delete_restriction_error'
|
5
5
|
|
6
6
|
module DependentProtect
|
7
|
-
VERSION = '0.0.
|
7
|
+
VERSION = '0.0.5'
|
8
8
|
|
9
9
|
def self.included(base)
|
10
10
|
super
|
@@ -38,6 +38,7 @@ module DependentProtect
|
|
38
38
|
def has_and_belongs_to_many_with_protect(association_id, options = {}, &extension)
|
39
39
|
reflection = create_reflection(:has_and_belongs_to_many, association_id, options, self)
|
40
40
|
add_dependency_callback!(reflection, options)
|
41
|
+
options.delete(:dependent)
|
41
42
|
has_and_belongs_to_many_without_protect(association_id, options, &extension)
|
42
43
|
end
|
43
44
|
|
@@ -60,7 +61,7 @@ module DependentProtect
|
|
60
61
|
define_method(method_name) do
|
61
62
|
method = reflection.collection? ? :empty? : :nil?
|
62
63
|
unless send(reflection.name).send(method)
|
63
|
-
raise ActiveRecord::
|
64
|
+
raise ActiveRecord::DetailedDeleteRestrictionError.new(reflection.name, self)
|
64
65
|
end
|
65
66
|
end
|
66
67
|
before_destroy method_name
|
@@ -1,29 +1,30 @@
|
|
1
|
+
require 'active_record/associations'
|
2
|
+
|
1
3
|
module ActiveRecord
|
2
4
|
# This error is raised when trying to destroy a parent instance in N:1 or 1:1 associations
|
3
5
|
# (has_many, has_one) when there is at least 1 child associated instance.
|
4
6
|
# ex: if @project.tasks.size > 0, DeleteRestrictionError will be raised when trying to destroy @project
|
5
|
-
class
|
6
|
-
def initialize(
|
7
|
-
@
|
7
|
+
class DetailedDeleteRestrictionError < ActiveRecordError #:nodoc:
|
8
|
+
def initialize(name, record)
|
9
|
+
@name = name
|
8
10
|
@record = record
|
9
11
|
super(basic_message)
|
10
12
|
end
|
11
13
|
|
12
14
|
def basic_message
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
"Cannot delete record because #{count} dependent #{type} #{exist}"
|
15
|
+
name = @name.to_s.gsub('_', ' ')
|
16
|
+
assoc = @record.send(@name)
|
17
|
+
count = assoc.respond_to?(:count) ? assoc.count : (assoc ? 1 : 0)
|
18
|
+
if count == 1
|
19
|
+
"Cannot delete record because dependent #{name} exists"
|
19
20
|
else
|
20
|
-
"Cannot delete record because dependent #{
|
21
|
+
"Cannot delete record because #{count} dependent #{name.pluralize} exist"
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
25
|
def detailed_message
|
25
|
-
count = @record.send(@
|
26
|
-
examples = @record.send(@
|
26
|
+
count = @record.send(@name).count
|
27
|
+
examples = @record.send(@name).all(:limit => 5).map{|o| "#{o.id}: #{o.to_s}"}
|
27
28
|
examples[4] = "...and #{count - 4} more" if count > 5
|
28
29
|
basic_message + "\n\n\nThese include:\n#{examples.join("\n")}"
|
29
30
|
end
|
@@ -31,30 +31,36 @@ describe DependentProtect do
|
|
31
31
|
it 'should restrict has_many relationships' do
|
32
32
|
category = Category.create!
|
33
33
|
5.times { Order.create!(:category => category) }
|
34
|
-
|
34
|
+
expect { category.reload.destroy }.to raise_error(
|
35
|
+
ActiveRecord::DetailedDeleteRestrictionError,
|
36
|
+
'Cannot delete record because 5 dependent orders exist'
|
37
|
+
)
|
35
38
|
begin
|
36
39
|
category.destroy
|
37
|
-
rescue ActiveRecord::
|
40
|
+
rescue ActiveRecord::DetailedDeleteRestrictionError => e
|
38
41
|
e.detailed_message.should == "Cannot delete record because 5 dependent orders exist\n\n\nThese include:\n1: Order 1\n2: Order 2\n3: Order 3\n4: Order 4\n5: Order 5"
|
39
42
|
end
|
40
43
|
1.times { Order.create!(:category => category) }
|
41
44
|
begin
|
42
45
|
category.destroy
|
43
|
-
rescue ActiveRecord::
|
46
|
+
rescue ActiveRecord::DetailedDeleteRestrictionError => e
|
44
47
|
e.detailed_message.should == "Cannot delete record because 6 dependent orders exist\n\n\nThese include:\n1: Order 1\n2: Order 2\n3: Order 3\n4: Order 4\n...and 2 more"
|
45
48
|
end
|
46
49
|
|
47
50
|
Order.destroy_all
|
48
|
-
|
51
|
+
expect{category.reload.destroy}.to_not raise_error
|
49
52
|
end
|
50
53
|
|
51
54
|
it 'should restrict has_one relationships' do
|
52
55
|
order = Order.create!
|
53
56
|
order_invoice = OrderInvoice.create!(:order => order)
|
54
|
-
|
57
|
+
expect{order.reload.destroy}.to raise_error(
|
58
|
+
ActiveRecord::DetailedDeleteRestrictionError,
|
59
|
+
'Cannot delete record because dependent order invoice exists'
|
60
|
+
)
|
55
61
|
|
56
62
|
order_invoice.destroy
|
57
|
-
|
63
|
+
expect{order.reload.destroy}.to_not raise_error
|
58
64
|
end
|
59
65
|
end
|
60
66
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dependent_protect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -67,6 +67,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
67
67
|
- - ! '>='
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
hash: -4507460947827537024
|
70
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
74
|
none: false
|
72
75
|
requirements:
|
@@ -75,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
75
78
|
version: '0'
|
76
79
|
requirements: []
|
77
80
|
rubyforge_project: dependent_protect
|
78
|
-
rubygems_version: 1.8.
|
81
|
+
rubygems_version: 1.8.24
|
79
82
|
signing_key:
|
80
83
|
specification_version: 2
|
81
84
|
summary: Add dependent protect/restrict functionality to ActiveRecord 2.x.
|