dm-deep_cloning 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/dm-deep_cloning.gemspec +14 -2
- data/lib/dm-deep_cloning.rb +13 -9
- data/spec/dm-deep_cloning_spec.rb +11 -0
- data/spec/spec_helper.rb +6 -0
- metadata +79 -15
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.3
|
data/dm-deep_cloning.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "dm-deep_cloning"
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Till Schulte-Coerne"]
|
12
|
-
s.date = "2012-08-
|
12
|
+
s.date = "2012-08-15"
|
13
13
|
s.description = "A library that lets you clone objects and object graphs"
|
14
14
|
s.email = "till.schulte-coerne@innoq.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -51,6 +51,10 @@ Gem::Specification.new do |s|
|
|
51
51
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
52
52
|
s.add_development_dependency(%q<jeweler>, ["~> 1.4"])
|
53
53
|
s.add_development_dependency(%q<rspec>, ["~> 1.3"])
|
54
|
+
s.add_development_dependency(%q<data_objects>, ["~> 0.10.6"])
|
55
|
+
s.add_development_dependency(%q<do_mysql>, ["~> 0.10.6"])
|
56
|
+
s.add_development_dependency(%q<dm-do-adapter>, ["~> 1.2.0"])
|
57
|
+
s.add_development_dependency(%q<dm-mysql-adapter>, ["~> 1.2.0"])
|
54
58
|
s.add_development_dependency(%q<dm-migrations>, ["~> 1.2.0"])
|
55
59
|
s.add_development_dependency(%q<dm-timestamps>, ["~> 1.2.0"])
|
56
60
|
s.add_runtime_dependency(%q<dm-core>, ["~> 1.0"])
|
@@ -63,6 +67,10 @@ Gem::Specification.new do |s|
|
|
63
67
|
s.add_dependency(%q<rake>, [">= 0"])
|
64
68
|
s.add_dependency(%q<jeweler>, ["~> 1.4"])
|
65
69
|
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
70
|
+
s.add_dependency(%q<data_objects>, ["~> 0.10.6"])
|
71
|
+
s.add_dependency(%q<do_mysql>, ["~> 0.10.6"])
|
72
|
+
s.add_dependency(%q<dm-do-adapter>, ["~> 1.2.0"])
|
73
|
+
s.add_dependency(%q<dm-mysql-adapter>, ["~> 1.2.0"])
|
66
74
|
s.add_dependency(%q<dm-migrations>, ["~> 1.2.0"])
|
67
75
|
s.add_dependency(%q<dm-timestamps>, ["~> 1.2.0"])
|
68
76
|
s.add_dependency(%q<dm-core>, ["~> 1.0"])
|
@@ -76,6 +84,10 @@ Gem::Specification.new do |s|
|
|
76
84
|
s.add_dependency(%q<rake>, [">= 0"])
|
77
85
|
s.add_dependency(%q<jeweler>, ["~> 1.4"])
|
78
86
|
s.add_dependency(%q<rspec>, ["~> 1.3"])
|
87
|
+
s.add_dependency(%q<data_objects>, ["~> 0.10.6"])
|
88
|
+
s.add_dependency(%q<do_mysql>, ["~> 0.10.6"])
|
89
|
+
s.add_dependency(%q<dm-do-adapter>, ["~> 1.2.0"])
|
90
|
+
s.add_dependency(%q<dm-mysql-adapter>, ["~> 1.2.0"])
|
79
91
|
s.add_dependency(%q<dm-migrations>, ["~> 1.2.0"])
|
80
92
|
s.add_dependency(%q<dm-timestamps>, ["~> 1.2.0"])
|
81
93
|
s.add_dependency(%q<dm-core>, ["~> 1.0"])
|
data/lib/dm-deep_cloning.rb
CHANGED
@@ -24,8 +24,6 @@ module DataMapper
|
|
24
24
|
DEFAULT_MODE = :new
|
25
25
|
|
26
26
|
def deep_clone(*args)
|
27
|
-
args_size = args.size # For error messages
|
28
|
-
|
29
27
|
mode = args.shift if [:new, :create].include?(args.first)
|
30
28
|
mode ||= DEFAULT_MODE
|
31
29
|
|
@@ -45,7 +43,7 @@ module DataMapper
|
|
45
43
|
end
|
46
44
|
end
|
47
45
|
|
48
|
-
|
46
|
+
attrs = self.attributes.reject{ |(k, v)|
|
49
47
|
self.class.properties[k].key? || k.to_s =~ /^(updated|created)_(at|on)$/
|
50
48
|
}
|
51
49
|
|
@@ -54,23 +52,29 @@ module DataMapper
|
|
54
52
|
|
55
53
|
case relationship
|
56
54
|
when DataMapper::Associations::OneToMany::Relationship, DataMapper::Associations::ManyToMany::Relationship
|
57
|
-
|
55
|
+
attrs[relationship.name] = self.send(relationship.name).to_a.map do |related_object|
|
56
|
+
# Q: Why `to_a`????
|
57
|
+
# A: This is used to indirectly disable `eager_load` in the `attributes` method called in the following recursive call.
|
58
|
+
# Q: Aha!!! But why???
|
59
|
+
# A: It simply doesn't work with STI.
|
60
|
+
# Q: f***!
|
61
|
+
# A: Yea! Took me 3 hours.
|
58
62
|
related_object.deep_clone(mode, clone_relations[relationship.name])
|
59
63
|
end
|
60
|
-
if
|
64
|
+
if attrs[relationship.name].empty?
|
61
65
|
# Delete the atrribute if no objects need to be assigned to the relation.
|
62
66
|
# dm-core seems to have a problem with Foo.new(:bars => []). Sadly
|
63
67
|
# this was not reproduceable in the specs.
|
64
|
-
|
68
|
+
attrs.delete(relationship.name)
|
65
69
|
end
|
66
70
|
when DataMapper::Associations::ManyToOne::Relationship
|
67
|
-
|
71
|
+
attrs[relationship.name] = self.send(relationship.name).deep_clone(mode, clone_relations[relationship.name])
|
68
72
|
else
|
69
|
-
raise "Deep cloning failed: Unknown relationship '#{
|
73
|
+
raise "Deep cloning failed: Unknown relationship '#{relationship_name}' in '#{self.class}'"
|
70
74
|
end
|
71
75
|
end
|
72
76
|
|
73
|
-
self.class.send(mode,
|
77
|
+
self.class.send(mode, attrs)
|
74
78
|
end
|
75
79
|
|
76
80
|
end # mod DeepCloning
|
@@ -90,6 +90,17 @@ describe DataMapper::DeepCloning do
|
|
90
90
|
cloned_blog.posts.should be_empty
|
91
91
|
end
|
92
92
|
|
93
|
+
it "should work with STI" do
|
94
|
+
blog = Blog.create(:name => "test")
|
95
|
+
blog.posts << special_post = SpecialPost.create(:title => 'Special', :text => "Post", :secret => "Psst...", :blog => blog)
|
96
|
+
|
97
|
+
cloned_blog = blog.deep_clone(:create, :posts)
|
98
|
+
|
99
|
+
cloned_blog.posts.last.class.should be(SpecialPost)
|
100
|
+
cloned_blog.posts.last.should_not be(special_post)
|
101
|
+
cloned_blog.posts.last.secret.should be(special_post.secret)
|
102
|
+
end
|
103
|
+
|
93
104
|
it "should not save new objects if not specified" do
|
94
105
|
*old_counts = Blog.count, Post.count
|
95
106
|
|
data/spec/spec_helper.rb
CHANGED
@@ -27,6 +27,8 @@ class Post
|
|
27
27
|
include DataMapper::Resource
|
28
28
|
|
29
29
|
property :id, Serial
|
30
|
+
property :type, Discriminator
|
31
|
+
|
30
32
|
property :author, String
|
31
33
|
property :title, String
|
32
34
|
property :text, Text
|
@@ -38,6 +40,10 @@ class Post
|
|
38
40
|
has n, :related_posts, "Post", :through => Resource
|
39
41
|
end
|
40
42
|
|
43
|
+
class SpecialPost < Post
|
44
|
+
property :secret, String
|
45
|
+
end
|
46
|
+
|
41
47
|
class Blog
|
42
48
|
include DataMapper::Resource
|
43
49
|
property :id, Serial
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-deep_cloning
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 3
|
10
|
+
version: 1.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Till Schulte-Coerne
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-08-
|
18
|
+
date: 2012-08-15 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
@@ -95,6 +95,38 @@ dependencies:
|
|
95
95
|
prerelease: false
|
96
96
|
- !ruby/object:Gem::Dependency
|
97
97
|
version_requirements: &id006 !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ~>
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
hash: 59
|
103
|
+
segments:
|
104
|
+
- 0
|
105
|
+
- 10
|
106
|
+
- 6
|
107
|
+
version: 0.10.6
|
108
|
+
requirement: *id006
|
109
|
+
type: :development
|
110
|
+
name: data_objects
|
111
|
+
prerelease: false
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ~>
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 59
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
- 10
|
122
|
+
- 6
|
123
|
+
version: 0.10.6
|
124
|
+
requirement: *id007
|
125
|
+
type: :development
|
126
|
+
name: do_mysql
|
127
|
+
prerelease: false
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
98
130
|
none: false
|
99
131
|
requirements:
|
100
132
|
- - ~>
|
@@ -105,12 +137,44 @@ dependencies:
|
|
105
137
|
- 2
|
106
138
|
- 0
|
107
139
|
version: 1.2.0
|
108
|
-
requirement: *
|
140
|
+
requirement: *id008
|
141
|
+
type: :development
|
142
|
+
name: dm-do-adapter
|
143
|
+
prerelease: false
|
144
|
+
- !ruby/object:Gem::Dependency
|
145
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
147
|
+
requirements:
|
148
|
+
- - ~>
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
hash: 31
|
151
|
+
segments:
|
152
|
+
- 1
|
153
|
+
- 2
|
154
|
+
- 0
|
155
|
+
version: 1.2.0
|
156
|
+
requirement: *id009
|
157
|
+
type: :development
|
158
|
+
name: dm-mysql-adapter
|
159
|
+
prerelease: false
|
160
|
+
- !ruby/object:Gem::Dependency
|
161
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
163
|
+
requirements:
|
164
|
+
- - ~>
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
hash: 31
|
167
|
+
segments:
|
168
|
+
- 1
|
169
|
+
- 2
|
170
|
+
- 0
|
171
|
+
version: 1.2.0
|
172
|
+
requirement: *id010
|
109
173
|
type: :development
|
110
174
|
name: dm-migrations
|
111
175
|
prerelease: false
|
112
176
|
- !ruby/object:Gem::Dependency
|
113
|
-
version_requirements: &
|
177
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
114
178
|
none: false
|
115
179
|
requirements:
|
116
180
|
- - ~>
|
@@ -121,12 +185,12 @@ dependencies:
|
|
121
185
|
- 2
|
122
186
|
- 0
|
123
187
|
version: 1.2.0
|
124
|
-
requirement: *
|
188
|
+
requirement: *id011
|
125
189
|
type: :development
|
126
190
|
name: dm-timestamps
|
127
191
|
prerelease: false
|
128
192
|
- !ruby/object:Gem::Dependency
|
129
|
-
version_requirements: &
|
193
|
+
version_requirements: &id012 !ruby/object:Gem::Requirement
|
130
194
|
none: false
|
131
195
|
requirements:
|
132
196
|
- - ~>
|
@@ -136,12 +200,12 @@ dependencies:
|
|
136
200
|
- 1
|
137
201
|
- 0
|
138
202
|
version: "1.0"
|
139
|
-
requirement: *
|
203
|
+
requirement: *id012
|
140
204
|
type: :runtime
|
141
205
|
name: dm-core
|
142
206
|
prerelease: false
|
143
207
|
- !ruby/object:Gem::Dependency
|
144
|
-
version_requirements: &
|
208
|
+
version_requirements: &id013 !ruby/object:Gem::Requirement
|
145
209
|
none: false
|
146
210
|
requirements:
|
147
211
|
- - ~>
|
@@ -151,12 +215,12 @@ dependencies:
|
|
151
215
|
- 1
|
152
216
|
- 0
|
153
217
|
version: "1.0"
|
154
|
-
requirement: *
|
218
|
+
requirement: *id013
|
155
219
|
type: :runtime
|
156
220
|
name: dm-transactions
|
157
221
|
prerelease: false
|
158
222
|
- !ruby/object:Gem::Dependency
|
159
|
-
version_requirements: &
|
223
|
+
version_requirements: &id014 !ruby/object:Gem::Requirement
|
160
224
|
none: false
|
161
225
|
requirements:
|
162
226
|
- - ~>
|
@@ -167,12 +231,12 @@ dependencies:
|
|
167
231
|
- 2
|
168
232
|
- 9
|
169
233
|
version: 1.2.9
|
170
|
-
requirement: *
|
234
|
+
requirement: *id014
|
171
235
|
type: :development
|
172
236
|
name: rspec
|
173
237
|
prerelease: false
|
174
238
|
- !ruby/object:Gem::Dependency
|
175
|
-
version_requirements: &
|
239
|
+
version_requirements: &id015 !ruby/object:Gem::Requirement
|
176
240
|
none: false
|
177
241
|
requirements:
|
178
242
|
- - ~>
|
@@ -183,7 +247,7 @@ dependencies:
|
|
183
247
|
- 2
|
184
248
|
- 9
|
185
249
|
version: 1.2.9
|
186
|
-
requirement: *
|
250
|
+
requirement: *id015
|
187
251
|
type: :development
|
188
252
|
name: dm-migrations
|
189
253
|
prerelease: false
|