duty_free 1.0.6 → 1.0.7
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.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
|