duty_free 1.0.6 → 1.0.7
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 +4 -4
- data/lib/duty_free.rb +10 -1
- data/lib/duty_free/extensions.rb +44 -19
- data/lib/duty_free/suggest_template.rb +3 -3
- data/lib/duty_free/version_number.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b16ccd7258656d274fc6b1f8798c5b5d1f3822570bdd9600f10d55e486a1308d
|
4
|
+
data.tar.gz: 9174b6bb8521edfacd9ddde72decc8a5b9274f33049740914cdd5077f9d52c59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ba849219eca3426c396be95fc29828c9fe60cd4c538004796d9cc9c17d8be11541c1b18f3d6ed0a89e2980570caafe88dbfc9772ca2d48fe17239c5417d71d8
|
7
|
+
data.tar.gz: 54fa0c8b8bd4719863ebeb246f1d1fd21decec7ed1061b9ab8b447e2d38216a52ad427e2a3964564d19a6016ee572b6a95d7f269ed409e90df4c96cbbec01910
|
data/lib/duty_free.rb
CHANGED
@@ -137,7 +137,8 @@ ActiveSupport.on_load(:active_record) do
|
|
137
137
|
# This aliasing avoids the warning:
|
138
138
|
# "no type cast defined for type "numeric" with oid 1700. Please cast this type
|
139
139
|
# explicitly to TEXT to be safe for future changes."
|
140
|
-
PG::BasicTypeRegistry.alias_type(0, 'numeric', 'text')
|
140
|
+
PG::BasicTypeRegistry.alias_type(0, 'numeric', 'text') # oid 1700
|
141
|
+
PG::BasicTypeRegistry.alias_type(0, 'time', 'text') # oid 1083
|
141
142
|
PG::BasicTypeMapForResults.new(klass.connection.raw_connection)
|
142
143
|
end.call
|
143
144
|
rslt.to_a
|
@@ -244,6 +245,14 @@ ActiveSupport.on_load(:active_record) do
|
|
244
245
|
PGError = PG::Error
|
245
246
|
end
|
246
247
|
|
248
|
+
unless DateTime.instance_methods.include?(:nsec)
|
249
|
+
class DateTime < Date
|
250
|
+
def nsec
|
251
|
+
(sec_fraction * 1000000000).to_i
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
247
256
|
include ::DutyFree::Extensions
|
248
257
|
end
|
249
258
|
|
data/lib/duty_free/extensions.rb
CHANGED
@@ -59,6 +59,9 @@ module DutyFree
|
|
59
59
|
|
60
60
|
# So we can properly create the SELECT list, create a mapping between our
|
61
61
|
# column alias prefixes and the aliases AREL creates.
|
62
|
+
# %%% If with Rails 3.1 and older you get "NoMethodError: undefined method `eq' for nil:NilClass"
|
63
|
+
# when trying to call relation.arel, then somewhere along the line while navigating a has_many
|
64
|
+
# relationship it can't find the proper foreign key.
|
62
65
|
core = relation.arel.ast.cores.first
|
63
66
|
# Accommodate AR < 3.2
|
64
67
|
arel_alias_names = if core.froms.is_a?(Arel::Table)
|
@@ -284,7 +287,19 @@ module DutyFree
|
|
284
287
|
sub_next = klass.new(criteria || {})
|
285
288
|
to_be_saved << [sub_next, sub_obj, bt_name, sub_next]
|
286
289
|
end
|
290
|
+
# This wires it up in memory, but doesn't yet put the proper foreign key ID in
|
291
|
+
# place when the primary object is a new one (and thus not having yet been saved
|
292
|
+
# doesn't yet have an ID).
|
293
|
+
# binding.pry if !sub_next.new_record? && sub_next.name == 'Squidget Widget' # !sub_obj.changed?
|
294
|
+
# # %%% Question is -- does the above set changed? when a foreign key is not yet set
|
295
|
+
# # and only the in-memory object has changed?
|
296
|
+
is_yet_changed = sub_obj.changed?
|
287
297
|
sub_obj.send(bt_name, sub_next)
|
298
|
+
|
299
|
+
# We need this in the case of updating the primary object across a belongs_to when
|
300
|
+
# the foreign one already exists and is not otherwise changing, such as when it is
|
301
|
+
# not a new one, so wouldn't otherwise be getting saved.
|
302
|
+
to_be_saved << [sub_obj] if !sub_obj.new_record? && !is_yet_changed && sub_obj.changed?
|
288
303
|
# From a has_many or has_one?
|
289
304
|
# Rails 4.0 and later can do: sub_next.is_a?(ActiveRecord::Associations::CollectionProxy)
|
290
305
|
elsif [:has_many, :has_one].include?(assoc.macro) && !assoc.options[:through]
|
@@ -302,9 +317,11 @@ module DutyFree
|
|
302
317
|
if sub_hm
|
303
318
|
sub_next = sub_hm
|
304
319
|
elsif assoc.macro == :has_one
|
305
|
-
|
320
|
+
# assoc.active_record.name.underscore is only there to support older Rails
|
321
|
+
# that doesn't do automatic inverse_of
|
322
|
+
ho_name = "#{assoc.inverse_of&.name || assoc.active_record.name.underscore}="
|
306
323
|
sub_next = assoc.klass.new(criteria)
|
307
|
-
to_be_saved << [sub_next,
|
324
|
+
to_be_saved << [sub_next, sub_next, ho_name, sub_obj]
|
308
325
|
else
|
309
326
|
# Two other methods that are possible to check for here are :conditions and
|
310
327
|
# :sanitized_conditions, which do not exist in Rails 4.0 and later.
|
@@ -360,20 +377,18 @@ module DutyFree
|
|
360
377
|
row_errors[v.name] << "Boolean value \"#{row[key]}\" in column #{key + 1} not recognized"
|
361
378
|
end
|
362
379
|
end
|
380
|
+
|
381
|
+
is_yet_changed = sub_obj.changed?
|
363
382
|
sub_obj.send(sym, row[key])
|
383
|
+
# If this one is transitioning from having not changed to now having been changed,
|
384
|
+
# and is not a new one anyway that would already be lined up to get saved, then we
|
385
|
+
# mark it to now be saved.
|
386
|
+
to_be_saved << [sub_obj] if !sub_obj.new_record? && !is_yet_changed && sub_obj.changed?
|
364
387
|
# else
|
365
388
|
# puts " #{sub_obj.class.name} doesn't respond to #{sym}"
|
366
389
|
end
|
390
|
+
# Try to save final sub-object(s) if any exist
|
367
391
|
::DutyFree::Extensions._save_pending(to_be_saved)
|
368
|
-
# Try to save a final sub-object if one exists
|
369
|
-
# sub_obj.save if sub_obj && this_path && !is_has_one && sub_obj.valid?
|
370
|
-
|
371
|
-
# # Wire up has_one associations
|
372
|
-
# has_ones.each do |hasone|
|
373
|
-
# parent = sub_objects[hasone[0..-2].map(&:to_s).join(',')] || obj
|
374
|
-
# hasone_object = sub_objects[hasone.map(&:to_s).join(',')]
|
375
|
-
# parent.send("#{hasone[-1]}=", hasone_object) if parent.new_record? || hasone_object.valid?
|
376
|
-
# end
|
377
392
|
|
378
393
|
# Reinstate any missing polymorphic _type and _id values
|
379
394
|
polymorphics.each do |poly|
|
@@ -454,9 +469,13 @@ module DutyFree
|
|
454
469
|
# Don't let this fool you -- we really are in search of the foreign key name here,
|
455
470
|
# and Rails 3.0 and older used some fairly interesting conventions, calling it instead
|
456
471
|
# the "primary_key_name"!
|
457
|
-
if assoc.respond_to?(:primary_key_name)
|
458
|
-
|
459
|
-
|
472
|
+
if assoc.respond_to?(:primary_key_name)
|
473
|
+
if (fk_name = assoc.primary_key_name) && col_names.include?(fk_name.to_s)
|
474
|
+
return fk_name
|
475
|
+
end
|
476
|
+
if (fk_name = assoc.inverse_of.primary_key_name) && col_names.include?(fk_name.to_s)
|
477
|
+
return fk_name
|
478
|
+
end
|
460
479
|
end
|
461
480
|
|
462
481
|
puts "* Wow, had no luck at all finding a foreign key for #{assoc.inspect}"
|
@@ -721,6 +740,11 @@ module DutyFree
|
|
721
740
|
# can be added properly to those new objects. Finally at the end also called to save everything.
|
722
741
|
def self._save_pending(to_be_saved)
|
723
742
|
while (tbs = to_be_saved.pop)
|
743
|
+
# puts "Will be calling #{tbs[1].class.name} #{tbs[1]&.id} .#{tbs[2]} #{tbs[3].class.name} #{tbs[3]&.id}"
|
744
|
+
|
745
|
+
# Wire this one up if it had came from a has_one association
|
746
|
+
tbs[1].send(tbs[2], tbs[3]) if tbs[0] == tbs[1]
|
747
|
+
|
724
748
|
ais = (tbs.first.class.respond_to?(:around_import_save) && tbs.first.class.method(:around_import_save)) ||
|
725
749
|
(respond_to?(:around_import_save) && method(:around_import_save))
|
726
750
|
if ais
|
@@ -735,11 +759,12 @@ module DutyFree
|
|
735
759
|
else
|
736
760
|
puts "* Unable to save #{tbs.first.inspect}"
|
737
761
|
end
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
762
|
+
|
763
|
+
next if tbs[1].nil? || # From a has_many?
|
764
|
+
tbs[0] == tbs[1] || # From a has_one?
|
765
|
+
tbs.first.new_record?
|
766
|
+
|
767
|
+
tbs[1].send(tbs[2], tbs[3])
|
743
768
|
end
|
744
769
|
end
|
745
770
|
|
@@ -238,11 +238,11 @@ module DutyFree
|
|
238
238
|
if klass.columns.map(&:name).include?(attrib)
|
239
239
|
s << attrib
|
240
240
|
else
|
241
|
-
|
242
|
-
names << assoc.name.to_s if assoc.
|
241
|
+
ho_and_bt_names = klass.reflect_on_all_associations.each_with_object([]) do |assoc, names|
|
242
|
+
names << assoc.name.to_s if assoc.belongs_to? || assoc.macro == :has_one
|
243
243
|
names
|
244
244
|
end
|
245
|
-
unless
|
245
|
+
unless ho_and_bt_names.include?(attrib)
|
246
246
|
puts "* In the #{klass.name} model \"validates_presence_of :#{attrib}\" should be removed as it does not refer to any existing column."
|
247
247
|
errored_columns << klass_col
|
248
248
|
end
|