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