deep_cloneable 1.2.3 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/deep_cloneable.gemspec +16 -24
- data/lib/deep_cloneable.rb +5 -0
- data/test/schema.rb +10 -0
- data/test/test_deep_cloneable.rb +13 -1
- data/test/test_helper.rb +15 -0
- metadata +10 -13
- data/.gitignore +0 -23
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.4
|
data/deep_cloneable.gemspec
CHANGED
@@ -1,49 +1,41 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{deep_cloneable}
|
8
|
-
s.version = "1.2.
|
8
|
+
s.version = "1.2.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Reinier de Lange"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-06-15}
|
13
13
|
s.description = %q{Extends the functionality of ActiveRecord::Base#clone to perform a deep clone that includes user specified associations. }
|
14
14
|
s.email = %q{r.j.delange@nedforce.nl}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
|
-
|
17
|
+
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
"test/test_helper.rb"
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"deep_cloneable.gemspec",
|
26
|
+
"init.rb",
|
27
|
+
"lib/deep_cloneable.rb",
|
28
|
+
"test/database.yml",
|
29
|
+
"test/schema.rb",
|
30
|
+
"test/test_deep_cloneable.rb",
|
31
|
+
"test/test_helper.rb"
|
33
32
|
]
|
34
33
|
s.homepage = %q{http://github.com/moiristo/deep_cloneable}
|
35
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
36
34
|
s.require_paths = ["lib"]
|
37
|
-
s.rubygems_version = %q{1.
|
35
|
+
s.rubygems_version = %q{1.6.2}
|
38
36
|
s.summary = %q{This gem gives every ActiveRecord::Base object the possibility to do a deep clone.}
|
39
|
-
s.test_files = [
|
40
|
-
"test/schema.rb",
|
41
|
-
"test/test_deep_cloneable.rb",
|
42
|
-
"test/test_helper.rb"
|
43
|
-
]
|
44
37
|
|
45
38
|
if s.respond_to? :specification_version then
|
46
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
47
39
|
s.specification_version = 3
|
48
40
|
|
49
41
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
data/lib/deep_cloneable.rb
CHANGED
@@ -73,6 +73,8 @@ class ActiveRecord::Base
|
|
73
73
|
opts.merge!(:dictionary => dict) if dict
|
74
74
|
|
75
75
|
association_reflection = self.class.reflect_on_association(association)
|
76
|
+
raise AssociationNotFoundException.new("#{self.class}##{association}") if association_reflection.nil?
|
77
|
+
|
76
78
|
cloned_object = case association_reflection.macro
|
77
79
|
when :belongs_to, :has_one
|
78
80
|
self.send(association) && self.send(association).clone(opts)
|
@@ -83,6 +85,7 @@ class ActiveRecord::Base
|
|
83
85
|
|
84
86
|
self.send(association).collect do |obj|
|
85
87
|
tmp = obj.clone(opts)
|
88
|
+
tmp.send("#{association_reflection.primary_key_name.to_s}=", nil)
|
86
89
|
tmp.send("#{reverse_association_name.to_s}=", kopy) if reverse_association_name
|
87
90
|
tmp
|
88
91
|
end
|
@@ -93,6 +96,8 @@ class ActiveRecord::Base
|
|
93
96
|
|
94
97
|
return kopy
|
95
98
|
end
|
99
|
+
|
100
|
+
class AssociationNotFoundException < StandardError; end
|
96
101
|
end
|
97
102
|
|
98
103
|
include DeepCloneable
|
data/test/schema.rb
CHANGED
@@ -38,4 +38,14 @@ ActiveRecord::Schema.define(:version => 1) do
|
|
38
38
|
create_table :humen, :force => true do |t|
|
39
39
|
t.column :name, :string
|
40
40
|
end
|
41
|
+
|
42
|
+
create_table :chickens, :force => true do |t|
|
43
|
+
t.column :name, :string
|
44
|
+
end
|
45
|
+
|
46
|
+
create_table :ownerships, :force => true do |t|
|
47
|
+
t.column :human_id, :integer
|
48
|
+
t.column :chicken_id, :integer
|
49
|
+
end
|
50
|
+
|
41
51
|
end
|
data/test/test_deep_cloneable.rb
CHANGED
@@ -133,7 +133,19 @@ class TestDeepCloneable < Test::Unit::TestCase
|
|
133
133
|
clone_human_2 = @human.clone :include => [:pigs]
|
134
134
|
assert clone_human_2.save
|
135
135
|
assert_equal 1, clone_human_2.pigs.count
|
136
|
-
end
|
136
|
+
end
|
137
137
|
|
138
|
+
def test_should_clone_many_to_many_associations
|
139
|
+
@human = Animal::Human.create :name => "Michael"
|
140
|
+
@human2 = Animal::Human.create :name => "Jack"
|
141
|
+
@chicken1 = Animal::Chicken.create :name => 'Chick1'
|
142
|
+
@chicken2 = Animal::Chicken.create :name => 'Chick2'
|
143
|
+
@human.chickens << [@chicken1, @chicken2]
|
144
|
+
@human2.chickens << [@chicken1, @chicken2]
|
145
|
+
|
146
|
+
clone_human = @human.clone :include => :ownerships
|
147
|
+
assert clone_human.save
|
148
|
+
assert_equal 2, clone_human.chickens.count
|
149
|
+
end
|
138
150
|
|
139
151
|
end
|
data/test/test_helper.rb
CHANGED
@@ -12,10 +12,25 @@ require File.dirname(__FILE__) + '/../init.rb'
|
|
12
12
|
module Animal
|
13
13
|
class Human < ActiveRecord::Base
|
14
14
|
has_many :pigs
|
15
|
+
|
16
|
+
has_many :ownerships
|
17
|
+
has_many :chickens, :through => :ownerships
|
15
18
|
end
|
16
19
|
class Pig < ActiveRecord::Base
|
17
20
|
belongs_to :human
|
18
21
|
end
|
22
|
+
|
23
|
+
class Chicken < ActiveRecord::Base
|
24
|
+
has_many :ownerships
|
25
|
+
has_many :humans, :through => :ownerships
|
26
|
+
end
|
27
|
+
|
28
|
+
class Ownership < ActiveRecord::Base
|
29
|
+
belongs_to :human
|
30
|
+
belongs_to :chicken
|
31
|
+
|
32
|
+
validates_uniqueness_of :chicken_id, :scope => :human_id
|
33
|
+
end
|
19
34
|
end
|
20
35
|
|
21
36
|
class GoldPiece < ActiveRecord::Base; belongs_to :treasure end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deep_cloneable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 1.2.
|
9
|
+
- 4
|
10
|
+
version: 1.2.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Reinier de Lange
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-15 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -30,7 +30,6 @@ extra_rdoc_files:
|
|
30
30
|
- README.rdoc
|
31
31
|
files:
|
32
32
|
- .document
|
33
|
-
- .gitignore
|
34
33
|
- LICENSE
|
35
34
|
- README.rdoc
|
36
35
|
- Rakefile
|
@@ -47,8 +46,8 @@ homepage: http://github.com/moiristo/deep_cloneable
|
|
47
46
|
licenses: []
|
48
47
|
|
49
48
|
post_install_message:
|
50
|
-
rdoc_options:
|
51
|
-
|
49
|
+
rdoc_options: []
|
50
|
+
|
52
51
|
require_paths:
|
53
52
|
- lib
|
54
53
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -72,11 +71,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
71
|
requirements: []
|
73
72
|
|
74
73
|
rubyforge_project:
|
75
|
-
rubygems_version: 1.
|
74
|
+
rubygems_version: 1.6.2
|
76
75
|
signing_key:
|
77
76
|
specification_version: 3
|
78
77
|
summary: This gem gives every ActiveRecord::Base object the possibility to do a deep clone.
|
79
|
-
test_files:
|
80
|
-
|
81
|
-
- test/test_deep_cloneable.rb
|
82
|
-
- test/test_helper.rb
|
78
|
+
test_files: []
|
79
|
+
|
data/.gitignore
DELETED