duty_free 1.0.8 → 1.0.10

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
  SHA256:
3
- metadata.gz: 714b772aa09eb15409cd7c58d4ccb64f967caf41f2a13e7813e90cc94d7eb48f
4
- data.tar.gz: 750dfe36b729979a0356f14f8588568822ae22911c142d294358231504daa78e
3
+ metadata.gz: aa24c207ea3302cdd1cb04bf479c8140c63b4854a3ca628cb9a9f2b02ca9db19
4
+ data.tar.gz: 2d01e88512109b271209cb95f5b2b3e8f3b4222fda500e0d5f7b8ab06f6a0c11
5
5
  SHA512:
6
- metadata.gz: 9d77a228b4e4990dad39882a4e67d1009f3c16114bc0e9b24280e1f8e9437c7fc55a8884eb37e8f6c15898958833c7f79bb7984d721f4dbd1fce7311ca6421d0
7
- data.tar.gz: 1d35f3197ab500a6210eecc561190c02a04d87e3d4b2634a9a62695488d4e2ed0825f7240836aa9d32fe8ce01e06be38ddccda1955ca3d3669fd7ad18e8335f2
6
+ metadata.gz: 025a2518dd7b88156e77be76697eeb0480b0a3fe7930fda9d4f2509b4d718e9d17744a6f5fb4ffdf8709ea7a80a0056fdb525d19ade89e3da1af084a9feb7a54
7
+ data.tar.gz: c1fd873299cb7bfca3f265d949c9e7bcc2788b5d2854a92c409ac4c5d7248827f07c4e21c2b353c10115d97201103b3e78dbbd119b2b61ae3b1a2f1659533649
@@ -9,6 +9,7 @@ module DutyFree
9
9
  # rubocop:disable Style/CommentedKeyword
10
10
  module Extensions
11
11
  MAX_ID = Arel.sql('MAX(id)')
12
+ IS_AMOEBA = Gem.loaded_specs['amoeba']
12
13
 
13
14
  def self.included(base)
14
15
  base.send :extend, ClassMethods
@@ -111,8 +112,8 @@ module DutyFree
111
112
  rows
112
113
  end
113
114
 
114
- def df_import(data, import_template = nil)
115
- ::DutyFree::Extensions.import(self, data, import_template)
115
+ def df_import(data, import_template = nil, insert_only = false)
116
+ ::DutyFree::Extensions.import(self, data, import_template, insert_only)
116
117
  end
117
118
 
118
119
  private
@@ -159,7 +160,7 @@ module DutyFree
159
160
  # For use with importing, based on the provided column list calculate all valid combinations
160
161
  # of unique columns. If there is no valid combination, throws an error.
161
162
  # Returns an object found by this means, as well as the criteria that was used to find it.
162
- def _find_existing(uniques, cols, starred, import_template, keepers, train_we_came_in_here_on,
163
+ def _find_existing(uniques, cols, starred, import_template, keepers, train_we_came_in_here_on, insert_only,
163
164
  row = nil, klass_or_collection = nil, template_all = nil, trim_prefix = '',
164
165
  assoc = nil, base_obj = nil)
165
166
  unless trim_prefix.blank?
@@ -262,7 +263,8 @@ module DutyFree
262
263
  # If we're processing a row then this list of foreign key column name entries, named such as
263
264
  # "order_id" or "product_id" instead of column-specific stuff like "Order Date" and "Product Name",
264
265
  # is kept until the last and then gets merged on top of the other criteria before being returned.
265
- bt_criteria[(fk_name = sn_bt.foreign_key)] = fk_id
266
+ fk_name = sn_bt.foreign_key
267
+ bt_criteria[fk_name] = fk_id unless bt_criteria.include?(fk_name)
266
268
 
267
269
  # Check to see if belongs_tos are generally required on this specific table
268
270
  bt_req_by_default = sn_bt.klass.respond_to?(:belongs_to_required_by_default) &&
@@ -282,7 +284,7 @@ module DutyFree
282
284
  (sn_bt.options[:optional] || !bt_req_by_default)
283
285
 
284
286
  # Add to the criteria
285
- criteria[fk_name] = fk_id
287
+ criteria[fk_name] = fk_id if insert_only && !criteria.include?(fk_name)
286
288
  end
287
289
  end
288
290
 
@@ -332,14 +334,15 @@ module DutyFree
332
334
  # Find by all corresponding columns
333
335
  if (row_value = row[v])
334
336
  new_criteria_all_nil = false
335
- criteria[k_sym] = row_value # The data, or how to look up the data
337
+ criteria[k_sym] = row_value # The data
336
338
  end
337
339
  end
338
340
  end
341
+ # puts uniq_lookups.inspect
339
342
 
340
- return uniq_lookups.merge(criteria) if only_valid_uniques
343
+ return [uniq_lookups.merge(criteria), bt_criteria] if only_valid_uniques
341
344
  # If there's nothing to match upon then we're out
342
- return [nil, {}] if new_criteria_all_nil
345
+ return [nil, {}, {}] if new_criteria_all_nil
343
346
 
344
347
  # With this criteria, find any matching has_many row we can so we can update it.
345
348
  # First try directly looking it up through ActiveRecord.
@@ -410,12 +413,12 @@ module DutyFree
410
413
  # Standard criteria as well as foreign key column name detail with exact foreign keys
411
414
  # that match up to a primary key so that if needed a new related object can be built,
412
415
  # complete with all its association detail.
413
- [found_object, criteria.merge(bt_criteria)]
416
+ [found_object, criteria, bt_criteria]
414
417
  end # _find_existing
415
418
  end # module ClassMethods
416
419
 
417
420
  # With an array of incoming data, the first row having column names, perform the import
418
- def self.import(obj_klass, data, import_template = nil)
421
+ def self.import(obj_klass, data, import_template = nil, insert_only)
419
422
  instance_variable_set(:@defined_uniques, nil)
420
423
  instance_variable_set(:@valid_uniques, nil)
421
424
 
@@ -559,7 +562,7 @@ module DutyFree
559
562
  raise ::DutyFree::LessThanHalfAreMatchingColumnsError, I18n.t('import.altered_import_template_coumns') if keepers.length < (cols.length / 2) - 1
560
563
 
561
564
  # Returns just the first valid unique lookup set if there are multiple
562
- valid_unique = obj_klass.send(:_find_existing, uniques, cols, starred, import_template, keepers, false)
565
+ valid_unique, bt_criteria = obj_klass.send(:_find_existing, uniques, cols, starred, import_template, keepers, false, insert_only)
563
566
  # Make a lookup from unique values to specific IDs
564
567
  existing = obj_klass.pluck(*([:id] + valid_unique.keys)).each_with_object(existing) do |v, s|
565
568
  s[v[1..-1].map(&:to_s)] = v.first
@@ -578,16 +581,17 @@ module DutyFree
578
581
  to_be_saved = []
579
582
  # Check to see if they want to preprocess anything
580
583
  existing_unique = @before_process.call(valid_unique, existing_unique) if @before_process ||= import_template[:before_process]
581
- if (criteria = existing[existing_unique])
582
- obj = obj_klass.find(criteria)
583
- else
584
- is_insert = true
585
- # unless build_tables.empty? # include?()
586
- # binding.pry
587
- # x = 5
588
- # end
589
- to_be_saved << [obj = obj_klass.new]
590
- end
584
+ obj = if (criteria = existing[existing_unique])
585
+ obj_klass.find(criteria)
586
+ else
587
+ is_insert = true
588
+ # unless build_tables.empty? # include?()
589
+ # binding.pry
590
+ # x = 5
591
+ # end
592
+ obj_klass.new
593
+ end
594
+ to_be_saved << [obj] unless criteria # || this one has any belongs_to that will be modified here
591
595
  sub_obj = nil
592
596
  polymorphics = []
593
597
  sub_objects = {}
@@ -623,18 +627,21 @@ module DutyFree
623
627
  start = 0
624
628
  trim_prefix = v.titleize[start..-(v.name.length + 2)]
625
629
  trim_prefix << ' ' unless trim_prefix.blank?
626
- if (sub_next = sub_obj.send(path_part)).nil? && assoc.belongs_to?
630
+ if assoc.belongs_to?
627
631
  klass = Object.const_get(assoc&.class_name)
628
632
  # Try to find a unique item if one is referenced
629
633
  sub_next = nil
630
634
  begin
631
- sub_next, criteria = klass.send(:_find_existing, uniques, cols, starred, import_template, keepers, nil, row, klass, all, trim_prefix, assoc)
635
+ sub_next, criteria, bt_criteria = klass.send(:_find_existing, uniques, cols, starred, import_template, keepers, nil,
636
+ false, # insert_only
637
+ row, klass, all, trim_prefix, assoc)
632
638
  rescue ::DutyFree::NoUniqueColumnError
633
639
  end
634
- # puts "#{v.path} #{criteria.inspect}"
635
640
  bt_name = "#{path_part}="
636
- unless sub_next || (klass == sub_obj.class && criteria.empty?)
637
- sub_next = klass.new(criteria || {})
641
+ # Not yet wired up to the right one, or going to the parent of a self-referencing model?
642
+ # puts "#{v.path} #{criteria.inspect}"
643
+ unless sub_next || (klass == sub_obj.class && (all_criteria = criteria.merge(bt_criteria)).empty?)
644
+ sub_next = klass.new(all_criteria || {})
638
645
  to_be_saved << [sub_next, sub_obj, bt_name, sub_next]
639
646
  end
640
647
  # This wires it up in memory, but doesn't yet put the proper foreign key ID in
@@ -654,15 +661,17 @@ module DutyFree
654
661
  # Rails 4.0 and later can do: sub_next.is_a?(ActiveRecord::Associations::CollectionProxy)
655
662
  elsif [:has_many, :has_one, :has_and_belongs_to_many].include?(assoc.macro) # && !assoc.options[:through]
656
663
  ::DutyFree::Extensions._save_pending(to_be_saved)
664
+ sub_next = sub_obj.send(path_part)
657
665
  # Try to find a unique item if one is referenced
658
666
  # %%% There is possibility that when bringing in related classes using a nil
659
667
  # in IMPORT_TEMPLATE[:all] that this will break. Need to test deeply nested things.
660
668
 
661
669
  # assoc.inverse_of is the belongs_to side of the has_many train we came in here on.
662
- sub_hm, criteria = assoc.klass.send(:_find_existing, uniques, cols, starred, import_template, keepers, assoc.inverse_of,
663
- row, sub_next, all, trim_prefix, assoc,
664
- # Just in case we're running Rails < 4.0 and this is a haas_*
665
- sub_obj)
670
+ sub_hm, criteria, bt_criteria = assoc.klass.send(:_find_existing, uniques, cols, starred, import_template, keepers, assoc.inverse_of,
671
+ false, # insert_only
672
+ row, sub_next, all, trim_prefix, assoc,
673
+ # Just in case we're running Rails < 4.0 and this is a has_*
674
+ sub_obj)
666
675
  # If still not found then create a new related object using this has_many collection
667
676
  # (criteria.empty? ? nil : sub_next.new(criteria))
668
677
  if sub_hm