duty_free 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/duty_free/extensions.rb +62 -26
- data/lib/duty_free/version_number.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4451cbb29d90fb32347b1ff91e91a249da97769e7a64f2524efa912b8971bf86
|
4
|
+
data.tar.gz: ee3b06059aa89be48329ef48605287e8cb1725dd9f61460d9b3d044354405540
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 953bb38945daf16d0f22daa921ad1e0f46881583d51145a59b1983869da8d79c0675640677f1774dbdb9321695aeb69dc29dd4f66250704be0199fed33ab84b6
|
7
|
+
data.tar.gz: 8e3a0c166acb9bc22919218764e1e39ffa9d495e22ea93eaeb8ef6810b545a99f6af08bf594cc3958e7d9169ccfe5a7841c08b2799e4981066cb47968daaf26b
|
data/lib/duty_free/extensions.rb
CHANGED
@@ -14,6 +14,7 @@ module DutyFree
|
|
14
14
|
|
15
15
|
# :nodoc:
|
16
16
|
module ClassMethods
|
17
|
+
MAX_ID = Arel.sql('MAX(id)')
|
17
18
|
# def self.extended(model)
|
18
19
|
# end
|
19
20
|
|
@@ -203,8 +204,9 @@ module DutyFree
|
|
203
204
|
is_do_save = true
|
204
205
|
existing_unique = valid_unique.inject([]) do |s, v|
|
205
206
|
s << if v.last.is_a?(Array)
|
206
|
-
v.last[0].where(v.last[1] => row[v.last[2]]).limit(1).pluck(
|
207
|
+
v.last[0].where(v.last[1] => row[v.last[2]]).limit(1).pluck(MAX_ID).first.to_s
|
207
208
|
else
|
209
|
+
binding.pry if v.last.nil?
|
208
210
|
row[v.last].to_s
|
209
211
|
end
|
210
212
|
end
|
@@ -292,19 +294,21 @@ module DutyFree
|
|
292
294
|
if klass == sub_obj.class # Self-referencing thing pointing to us?
|
293
295
|
# %%% This should be more general than just for self-referencing things.
|
294
296
|
sub_cols = cols.map { |c| c.start_with?(trim_prefix) ? c[trim_prefix.length..-1] : nil }
|
295
|
-
|
297
|
+
# assoc
|
298
|
+
sub_bt, criteria = klass.find_existing(uniques, sub_cols, starred, import_template, keepers, nil, row, klass, all, '')
|
296
299
|
else
|
297
300
|
sub_bt, criteria = klass.find_existing(uniques, cols, starred, import_template, keepers, nil, row, klass, all, trim_prefix)
|
298
301
|
end
|
299
302
|
rescue ::DutyFree::NoUniqueColumnError
|
300
303
|
sub_unique = nil
|
301
304
|
end
|
302
|
-
#
|
303
|
-
# sub_bt.is_a?(Employee)
|
305
|
+
# Self-referencing shouldn't build a new one if it couldn't find one
|
304
306
|
# %%% Can criteria really ever be nil anymore?
|
305
|
-
|
307
|
+
unless klass == sub_obj.class && criteria.empty?
|
308
|
+
sub_bt ||= klass.new(criteria || {})
|
309
|
+
end
|
306
310
|
sub_obj.send("#{path_part}=", sub_bt)
|
307
|
-
sub_bt
|
311
|
+
sub_bt
|
308
312
|
end
|
309
313
|
end
|
310
314
|
# Look for possible missing polymorphic detail
|
@@ -328,6 +332,7 @@ module DutyFree
|
|
328
332
|
sub_hm, criteria = klass.find_existing(uniques, cols, starred, import_template, keepers, assoc.inverse_of, row, sub_next, all, trim_prefix)
|
329
333
|
|
330
334
|
# If still not found then create a new related object using this has_many collection
|
335
|
+
# (criteria.empty? ? nil : sub_next.new(criteria))
|
331
336
|
sub_next = sub_hm || sub_next.new(criteria)
|
332
337
|
end
|
333
338
|
unless sub_next.nil?
|
@@ -342,8 +347,10 @@ module DutyFree
|
|
342
347
|
sub_objects[this_path] = sub_next if this_path.present?
|
343
348
|
end
|
344
349
|
end
|
345
|
-
|
350
|
+
# binding.pry if sub_obj.reports_to
|
351
|
+
sub_obj = sub_next #if sub_next
|
346
352
|
end
|
353
|
+
# binding.pry if sub_obj.nil?
|
347
354
|
next if sub_obj.nil?
|
348
355
|
|
349
356
|
sym = "#{v.name}=".to_sym
|
@@ -366,6 +373,7 @@ module DutyFree
|
|
366
373
|
row_errors[v.name] << "Boolean value \"#{row[key]}\" in column #{key + 1} not recognized"
|
367
374
|
end
|
368
375
|
end
|
376
|
+
# binding.pry if v.name.to_s == 'first_name' && sub_obj.first_name == 'Nancy'
|
369
377
|
sub_obj.send(sym, row[key])
|
370
378
|
# else
|
371
379
|
# puts " #{sub_class.name} doesn't respond to #{sym}"
|
@@ -475,48 +483,76 @@ module DutyFree
|
|
475
483
|
# Might have to do a deferred save kind of thing, and also make sure the product stuff came first
|
476
484
|
# before the other stuff
|
477
485
|
|
486
|
+
# Find by all corresponding columns
|
487
|
+
|
478
488
|
# Add in any foreign key stuff we can find from other belongs_to associations
|
479
489
|
# %%% This is starting to look like the other BelongsToAssociation code above around line
|
480
490
|
# 697, so it really needs to be turned into something recursive instead of this two-layer
|
481
491
|
# thick thing at best.
|
492
|
+
|
493
|
+
# First check the belongs_tos
|
494
|
+
criteria = {}
|
495
|
+
bt_criteria = {}
|
496
|
+
bt_criteria_all_nil = true
|
497
|
+
bt_col_indexes = []
|
498
|
+
only_valid_uniques = (train_we_came_in_here_on == false)
|
482
499
|
bts = reflect_on_all_associations.each_with_object([]) do |sn_assoc, s|
|
483
500
|
if sn_assoc.is_a?(ActiveRecord::Reflection::BelongsToReflection) &&
|
484
|
-
(!train_we_came_in_here_on || sn_assoc != train_we_came_in_here_on) &&
|
485
|
-
sn_assoc.klass != self # Omit stuff pointing to us (like self-referencing stuff)
|
501
|
+
(!train_we_came_in_here_on || sn_assoc != train_we_came_in_here_on) # &&
|
502
|
+
# sn_assoc.klass != self # Omit stuff pointing to us (like self-referencing stuff)
|
486
503
|
# %%% Make sure there's a starred column we know about from this one
|
487
|
-
ret[sn_assoc.foreign_key] = nil if
|
504
|
+
ret[sn_assoc.foreign_key] = nil if only_valid_uniques
|
488
505
|
s << sn_assoc
|
489
506
|
end
|
490
507
|
s
|
491
508
|
end
|
492
|
-
|
493
|
-
# Find by all corresponding columns
|
494
|
-
criteria = {}
|
495
|
-
if train_we_came_in_here_on != false
|
496
|
-
criteria = ret.each_with_object({}) do |v, s|
|
497
|
-
s[v.first.to_sym] = row[v.last]
|
498
|
-
s
|
499
|
-
end
|
500
|
-
end
|
501
|
-
|
502
509
|
bts.each do |sn_bt|
|
503
510
|
# This search prefix becomes something like "Order Details Product "
|
511
|
+
# binding.pry
|
504
512
|
cols.each_with_index do |bt_col, idx|
|
505
|
-
next
|
513
|
+
next if bt_col_indexes.include?(idx) ||
|
514
|
+
!bt_col&.start_with?(trim_prefix + "#{sn_bt.name.to_s.underscore.tr('_', ' ').titleize} ")
|
506
515
|
|
507
516
|
fk_id = if row
|
508
517
|
# Max ID so if there are multiple, only the most recent one is picked.
|
509
|
-
# %%% Need to stack these up in case there are multiple
|
510
|
-
|
518
|
+
# %%% Need to stack these up in case there are multiple
|
519
|
+
# (like first_name, last_name on a referenced employee)
|
520
|
+
# binding.pry
|
521
|
+
sn_bt.klass.where(keepers[idx].name => row[idx]).limit(1).pluck(MAX_ID).first
|
511
522
|
else
|
512
523
|
[sn_bt.klass, keepers[idx].name, idx]
|
513
524
|
end
|
514
|
-
|
525
|
+
if fk_id
|
526
|
+
bt_col_indexes << idx
|
527
|
+
bt_criteria_all_nil = false
|
528
|
+
end
|
529
|
+
bt_criteria[(fk_name = sn_bt.foreign_key)] = fk_id
|
530
|
+
# Add to our criteria if this belongs_to is required
|
531
|
+
# %%% Rails older than 5.0 handles this stuff differently!
|
532
|
+
unless sn_bt.options[:optional] || !sn_bt.klass.belongs_to_required_by_default
|
533
|
+
criteria[fk_name] = fk_id
|
534
|
+
else # Should not have this fk as a requirement
|
535
|
+
ret.delete(fk_name) if only_valid_uniques && ret.include?(fk_name)
|
536
|
+
end
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
540
|
+
new_criteria_all_nil = bt_criteria_all_nil
|
541
|
+
if train_we_came_in_here_on != false
|
542
|
+
criteria = ret.each_with_object({}) do |v, s|
|
543
|
+
next if bt_col_indexes.include?(v.last)
|
544
|
+
|
545
|
+
new_criteria_all_nil = false if (s[v.first.to_sym] = row[v.last])
|
546
|
+
s
|
515
547
|
end
|
516
548
|
end
|
517
549
|
|
518
550
|
# Short-circuiting this to only get back the valid_uniques?
|
519
|
-
return ret.merge(criteria) if
|
551
|
+
return ret.merge(criteria) if only_valid_uniques
|
552
|
+
|
553
|
+
# binding.pry if obj.is_a?(Order)
|
554
|
+
# If there's nothing to match upon then we're out
|
555
|
+
return [nil, {}] if new_criteria_all_nil
|
520
556
|
|
521
557
|
# With this criteria, find any matching has_many row we can so we can update it
|
522
558
|
sub_hm = obj.find do |hm_obj|
|
@@ -532,7 +568,7 @@ module DutyFree
|
|
532
568
|
# Try looking it up through ActiveRecord
|
533
569
|
# %%% Should we perhaps do this first before the more intensive find routine above?
|
534
570
|
sub_hm = obj.find_by(criteria) if sub_hm.nil?
|
535
|
-
[sub_hm, criteria]
|
571
|
+
[sub_hm, criteria.merge(bt_criteria)]
|
536
572
|
end
|
537
573
|
|
538
574
|
private
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: duty_free
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorin Thwaits
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -45,19 +45,19 @@ dependencies:
|
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: '2.2'
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
|
-
name: byebug
|
48
|
+
name: pry-byebug
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
|
-
- - "
|
51
|
+
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
53
|
+
version: 3.7.0
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
|
-
- - "
|
58
|
+
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version:
|
60
|
+
version: 3.7.0
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: ffaker
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|