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 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.