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 CHANGED
@@ -1 +1 @@
1
- 1.0.2
1
+ 1.0.3
@@ -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.2"
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-14"
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"])
@@ -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
- attributes = self.attributes.reject{ |(k, v)|
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
- attributes[relationship.name] = self.send(relationship.name).map do |related_object|
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 attributes[relationship.name].empty?
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
- attributes.delete(relationship.name)
68
+ attrs.delete(relationship.name)
65
69
  end
66
70
  when DataMapper::Associations::ManyToOne::Relationship
67
- attributes[relationship.name] = self.send(relationship.name).deep_clone(mode, clone_relations[relationship.name])
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 '#{relationship.class}' for relation '#{relationship.name}' in '#{self.class}'"
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, attributes)
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
 
@@ -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: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 2
10
- version: 1.0.2
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-14 00:00:00 Z
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: *id006
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: &id007 !ruby/object:Gem::Requirement
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: *id007
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: &id008 !ruby/object:Gem::Requirement
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: *id008
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: &id009 !ruby/object:Gem::Requirement
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: *id009
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: &id010 !ruby/object:Gem::Requirement
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: *id010
234
+ requirement: *id014
171
235
  type: :development
172
236
  name: rspec
173
237
  prerelease: false
174
238
  - !ruby/object:Gem::Dependency
175
- version_requirements: &id011 !ruby/object:Gem::Requirement
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: *id011
250
+ requirement: *id015
187
251
  type: :development
188
252
  name: dm-migrations
189
253
  prerelease: false