sequel_deep_dup 0.2.1 → 0.2.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 490afcfe5a51e4e24da754246b8a88d4f76d6ac9
4
- data.tar.gz: 8473904ed8790f08ab4808abb55843ae329851ba
3
+ metadata.gz: f6f02dab9f3b6c333a4de5c5fd5a5079a8cbd0c2
4
+ data.tar.gz: 590e586fd31aa82f8066adee879bfe1932f13436
5
5
  SHA512:
6
- metadata.gz: 57d4409e59d8a47cc099bc24db359628b3f9962b15985dbc201fb61becf9845a3fd3add1c34a810f0106ab05ca79ff6172aedfcf54fccb73d766f469a50423f1
7
- data.tar.gz: 3a50f39744efb83cd67c43b3e4d053ddce87356c11d4d9e8fa394bc33c7e75597d6110bf77a01be7e400f368c345eacd5e766d8df73538f9833b0f21cf422155
6
+ metadata.gz: 9e8d9e9803f74368d9379c3b876e816ae8bb4dbfb8f2357e3cf95717d0dacd66e45e301bfbbaecb7e6e1e517e13abf122fc9e5d72834a8d09bdf65fa117c4766
7
+ data.tar.gz: 318fa95ea899418e543bf103031bed282c5bd692b43e2f419c039dbc3ea29483490d8552441b174d245b019383de2738ee5356d1898a3f78625bd15bb2ada85c
@@ -28,19 +28,21 @@ module Sequel
28
28
  end
29
29
 
30
30
  def dup_associations instance, copy, includes = nil
31
- includes &&= includes.map { |item| [*item].flatten }
31
+ includes &&= normalize_graph(includes)
32
32
  associations = instance.class.associations
33
33
 
34
- ([*includes].map{ |i| i.first } - associations).each do |assoc|
35
- raise(Error, "no association named #{assoc} for #{instance}")
34
+ if includes
35
+ (includes.keys - associations).each do |assoc|
36
+ raise(Error, "no association named #{assoc} for #{instance}")
37
+ end
36
38
  end
37
39
 
38
40
  associations.each do |name|
39
41
  next unless refl = instance.class.association_reflection(name)
40
42
  [*instance.send(name)].compact.each do |rec|
41
43
  if includes
42
- next unless graph = includes.assoc(refl[:name])
43
- instantiate_associated(copy, refl, rec, graph[1..-1])
44
+ next unless includes.has_key?( refl_name = refl[:name] )
45
+ instantiate_associated copy, refl, rec, includes[refl_name]
44
46
  else
45
47
  next copy.values.delete(refl[:key]) if refl[:type] == :many_to_one
46
48
  instantiate_associated(copy, refl, rec, nil)
@@ -49,6 +51,17 @@ module Sequel
49
51
  end
50
52
  end
51
53
 
54
+ def normalize_graph(*enum)
55
+ enum.inject({}) do |hash, assoc|
56
+ case assoc
57
+ when Symbol then hash[assoc] = {}
58
+ when Hash then assoc.each { |k, v| hash[k] = normalize_graph(v) }
59
+ else hash.merge!(normalize_graph(*assoc) || next)
60
+ end
61
+ hash
62
+ end
63
+ end
64
+
52
65
  private
53
66
  def instantiate_associated copy, reflection, record, associations
54
67
  return if omit_records.detect { |to_omit| record.pk == to_omit.pk && record.class == to_omit.class }
@@ -1,7 +1,7 @@
1
1
  module Sequel
2
2
  module Plugins
3
3
  module DeepDup
4
- VERSION = "0.2.1"
4
+ VERSION = "0.2.2"
5
5
  end
6
6
  end
7
7
  end
@@ -18,12 +18,12 @@ describe Sequel::Plugins::DeepDup do
18
18
  describe 'duplication plain record' do
19
19
  context 'with regular pk' do
20
20
  it { program_copy.name.should == 'CS' }
21
- it { program_copy.pk.should be_nil }
21
+ it { program_copy.pk.should be_nil }
22
22
  end
23
23
 
24
24
  context 'with composite pks' do
25
- it { program_copy.should be_new }
26
- it { enrollment_copy.pk.should == [nil, nil] }
25
+ it { program_copy.should be_new }
26
+ it { enrollment_copy.pk.should == [nil, nil] }
27
27
  it { enrollment_copy.should be_new }
28
28
  end
29
29
  end
@@ -119,10 +119,12 @@ describe Sequel::Plugins::DeepDup do
119
119
  describe 'restrictions' do
120
120
  before do
121
121
  Program.plugin :deep_dup
122
+ Course.plugin :deep_dup
122
123
  end
123
124
 
124
125
  let!(:program) { create :program, :with_graph }
125
126
 
127
+
126
128
  describe 'validate graph' do
127
129
  it { Course.count.should be 3 }
128
130
  it { Assignment.count.should be 9 }
@@ -137,7 +139,7 @@ describe Sequel::Plugins::DeepDup do
137
139
  let(:program_copy) { program.deep_dup :courses }
138
140
  it { expect { program_copy.save }.to change{ Course.count }.by(3) }
139
141
  it { expect { program_copy.save }.not_to change{ Enrollment.count } }
140
- end
142
+ end
141
143
 
142
144
  describe 'restricts to children of children' do
143
145
  let(:program_copy) { program.deep_dup :courses => :assignments }
@@ -158,8 +160,67 @@ describe Sequel::Plugins::DeepDup do
158
160
  it { expect { program_copy.save }.not_to change { Category.count } }
159
161
  end
160
162
 
163
+ describe 'allows different graphs for same record with different graph format' do
164
+ let(:course) { program.courses.first }
165
+
166
+ let(:course_copy) { course.deep_dup({:categories => [], :enrollments => {:student => [:profile, :account]}}, :assignments) }
167
+ it { expect { course_copy.save }.to change { Course.count }.by(1) }
168
+ it { expect { course_copy.save }.to change { Assignment.count }.by(3) }
169
+ it { expect { course_copy.save }.to change { Enrollment.count }.by(3) }
170
+ it { expect { course_copy.save }.to change { Student.count }.by(3) }
171
+ it { expect { course_copy.save }.to change { Account.count }.by(3) }
172
+ it { expect { course_copy.save }.to change { Profile.count }.by(3) }
173
+ it { expect { course_copy.save }.to change { DB[:course_categories].count }.by(3) }
174
+ it { expect { course_copy.save }.not_to change { Category.count } }
175
+ end
176
+
177
+ describe 'normalizing graph' do
178
+ let(:dupper) { Sequel::Plugins::DeepDup::DeepDupper.new(nil) }
179
+
180
+ it 'maps symbols' do
181
+ parsed = dupper.normalize_graph( [:course, :assignments, :categories] )
182
+ parsed.should == {:course => {}, :assignments => {}, :categories => {}}
183
+ end
184
+
185
+ it 'maps symbols followed by hash' do
186
+ parsed = dupper.normalize_graph( [:course, {:assignments => :categories}] )
187
+ parsed.should == {:course => {}, :assignments => {:categories => {}}}
188
+ end
189
+
190
+ it 'omits processing a hash' do
191
+ parsed = dupper.normalize_graph( :assignments => [], :categories => [], :enrollments => [:student] )
192
+ parsed.should == { :assignments => {}, :categories => {}, :enrollments => {:student => {}} }
193
+ end
194
+
195
+ it 'maps array of symbol and hashes' do
196
+ parsed = dupper.normalize_graph( [:assignments, {:categories => [], :enrollments => [:student]}] )
197
+ parsed.should == {:assignments => {}, :categories => {}, :enrollments => {:student => {}}}
198
+ end
199
+
200
+ it 'maps array of symbol and hashes with nested assoc array' do
201
+ parsed = dupper.normalize_graph( [:assignments, {:enrollments => [:student, :course]}, :tags] )
202
+ parsed.should == {:assignments => {}, :enrollments => {:student => {}, :course => {}}, :tags => {}}
203
+ end
204
+
205
+ it 'maps nested hashes' do
206
+ parsed = dupper.normalize_graph([{:courses => [:assignments, {:enrollments => {:student => [:profile, :account]}}, :categories]}])
207
+ parsed.should == {
208
+ :courses => {
209
+ :assignments => {},
210
+ :enrollments => {
211
+ :student => {
212
+ :profile => {},
213
+ :account => {}
214
+ }
215
+ },
216
+ :categories => {}
217
+ }
218
+ }
219
+ end
220
+ end
221
+
161
222
  it 'raises exception when association present in graph is not defined in model' do
162
- expect { program.deep_dup :potatoes }.to raise_error(Sequel::Error)
223
+ expect { program.deep_dup :potatoes }.to raise_error(Sequel::Error)
163
224
  end
164
225
  end
165
226
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel_deep_dup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - macario
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-09 00:00:00.000000000 Z
11
+ date: 2014-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler