dependent_protect 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -8,5 +8,5 @@ group :development, :test do
8
8
  gem 'simplecov'
9
9
  gem 'simplecov-rcov'
10
10
  gem 'sqlite3'
11
- gem 'activerecord', '2.3.14'
11
+ gem 'activerecord', '~> 3.0'
12
12
  end
@@ -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.4'
17
- s.date = '2012-06-10'
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
@@ -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.4'
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::DeleteRestrictionError.new(reflection, self)
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 DeleteRestrictionError < ActiveRecordError #:nodoc:
6
- def initialize(reflection, record)
7
- @reflection = reflection
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
- single = @reflection.class_name.to_s.underscore.gsub('_', ' ')
14
- if [:has_many, :has_and_belongs_to_many].include?(@reflection.macro)
15
- count = @record.send(@reflection.name).count
16
- type = count == 1 ? single : single.pluralize
17
- exist = (count == 1 ? 'exists' : 'exist')
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 #{single} exists"
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(@reflection.name).count
26
- examples = @record.send(@reflection.name).all(:limit => 5).map{|o| "#{o.id}: #{o.to_s}"}
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
- lambda{category.reload.destroy}.should raise_error(ActiveRecord::DeleteRestrictionError, 'Cannot delete record because 5 dependent orders exist')
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::DeleteRestrictionError => e
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::DeleteRestrictionError => e
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
- lambda{category.reload.destroy}.should_not raise_error
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
- lambda{order.reload.destroy}.should raise_error(ActiveRecord::DeleteRestrictionError, 'Cannot delete record because dependent order invoice exists')
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
- lambda{order.reload.destroy}.should_not raise_error
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
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-06-10 00:00:00.000000000 Z
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.23
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.