dm-deep_cloning 1.0.2 → 1.0.3
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/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
|