activerecord-import 1.2.0 → 1.5.0
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/.github/workflows/test.yaml +51 -11
- data/.rubocop.yml +74 -8
- data/.rubocop_todo.yml +6 -16
- data/Brewfile +3 -1
- data/CHANGELOG.md +37 -0
- data/Gemfile +8 -10
- data/README.markdown +14 -11
- data/Rakefile +2 -0
- data/activerecord-import.gemspec +4 -3
- data/benchmarks/benchmark.rb +10 -4
- data/benchmarks/lib/base.rb +4 -2
- data/benchmarks/lib/cli_parser.rb +4 -2
- data/benchmarks/lib/float.rb +2 -0
- data/benchmarks/lib/mysql2_benchmark.rb +2 -0
- data/benchmarks/lib/output_to_csv.rb +2 -0
- data/benchmarks/lib/output_to_html.rb +4 -2
- data/benchmarks/models/test_innodb.rb +2 -0
- data/benchmarks/models/test_memory.rb +2 -0
- data/benchmarks/models/test_myisam.rb +2 -0
- data/benchmarks/schema/mysql2_schema.rb +2 -0
- data/gemfiles/4.2.gemfile +2 -0
- data/gemfiles/5.0.gemfile +2 -0
- data/gemfiles/5.1.gemfile +2 -0
- data/gemfiles/5.2.gemfile +2 -0
- data/gemfiles/6.0.gemfile +2 -0
- data/gemfiles/6.1.gemfile +3 -0
- data/gemfiles/7.0.gemfile +4 -0
- data/lib/activerecord-import/active_record/adapters/abstract_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/jdbcmysql_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/jdbcpostgresql_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/jdbcsqlite3_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/mysql2_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/postgresql_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/seamless_database_pool_adapter.rb +2 -0
- data/lib/activerecord-import/active_record/adapters/sqlite3_adapter.rb +2 -0
- data/lib/activerecord-import/adapters/abstract_adapter.rb +8 -5
- data/lib/activerecord-import/adapters/em_mysql2_adapter.rb +2 -0
- data/lib/activerecord-import/adapters/mysql2_adapter.rb +2 -0
- data/lib/activerecord-import/adapters/mysql_adapter.rb +27 -19
- data/lib/activerecord-import/adapters/postgresql_adapter.rb +66 -47
- data/lib/activerecord-import/adapters/sqlite3_adapter.rb +36 -30
- data/lib/activerecord-import/base.rb +3 -1
- data/lib/activerecord-import/import.rb +85 -44
- data/lib/activerecord-import/mysql2.rb +2 -0
- data/lib/activerecord-import/postgresql.rb +2 -0
- data/lib/activerecord-import/sqlite3.rb +2 -0
- data/lib/activerecord-import/synchronize.rb +3 -1
- data/lib/activerecord-import/value_sets_parser.rb +3 -0
- data/lib/activerecord-import/version.rb +3 -1
- data/lib/activerecord-import.rb +3 -1
- data/test/adapters/jdbcmysql.rb +2 -0
- data/test/adapters/jdbcpostgresql.rb +2 -0
- data/test/adapters/jdbcsqlite3.rb +2 -0
- data/test/adapters/makara_postgis.rb +2 -0
- data/test/adapters/mysql2.rb +2 -0
- data/test/adapters/mysql2_makara.rb +2 -0
- data/test/adapters/mysql2spatial.rb +2 -0
- data/test/adapters/postgis.rb +2 -0
- data/test/adapters/postgresql.rb +2 -0
- data/test/adapters/postgresql_makara.rb +2 -0
- data/test/adapters/seamless_database_pool.rb +2 -0
- data/test/adapters/spatialite.rb +2 -0
- data/test/adapters/sqlite3.rb +2 -0
- data/test/import_test.rb +26 -1
- data/test/jdbcmysql/import_test.rb +5 -3
- data/test/jdbcpostgresql/import_test.rb +4 -2
- data/test/jdbcsqlite3/import_test.rb +4 -2
- data/test/makara_postgis/import_test.rb +4 -2
- data/test/models/account.rb +2 -0
- data/test/models/alarm.rb +2 -0
- data/test/models/animal.rb +2 -0
- data/test/models/bike_maker.rb +3 -0
- data/test/models/book.rb +2 -0
- data/test/models/car.rb +2 -0
- data/test/models/card.rb +2 -0
- data/test/models/chapter.rb +2 -0
- data/test/models/customer.rb +8 -0
- data/test/models/deck.rb +2 -0
- data/test/models/dictionary.rb +2 -0
- data/test/models/discount.rb +2 -0
- data/test/models/end_note.rb +2 -0
- data/test/models/group.rb +2 -0
- data/test/models/order.rb +8 -0
- data/test/models/playing_card.rb +2 -0
- data/test/models/promotion.rb +2 -0
- data/test/models/question.rb +2 -0
- data/test/models/rule.rb +2 -0
- data/test/models/tag.rb +3 -0
- data/test/models/tag_alias.rb +5 -0
- data/test/models/topic.rb +7 -0
- data/test/models/user.rb +2 -0
- data/test/models/user_token.rb +2 -0
- data/test/models/vendor.rb +2 -0
- data/test/models/widget.rb +2 -0
- data/test/mysql2/import_test.rb +5 -3
- data/test/mysql2_makara/import_test.rb +5 -3
- data/test/mysqlspatial2/import_test.rb +5 -3
- data/test/postgis/import_test.rb +4 -2
- data/test/postgresql/import_test.rb +4 -2
- data/test/schema/generic_schema.rb +20 -0
- data/test/schema/jdbcpostgresql_schema.rb +3 -1
- data/test/schema/mysql2_schema.rb +2 -0
- data/test/schema/postgis_schema.rb +3 -1
- data/test/schema/postgresql_schema.rb +2 -0
- data/test/schema/sqlite3_schema.rb +2 -0
- data/test/schema/version.rb +2 -0
- data/test/sqlite3/import_test.rb +4 -2
- data/test/support/active_support/test_case_extensions.rb +2 -0
- data/test/support/assertions.rb +2 -0
- data/test/support/factories.rb +2 -0
- data/test/support/generate.rb +4 -2
- data/test/support/mysql/import_examples.rb +2 -1
- data/test/support/postgresql/import_examples.rb +65 -2
- data/test/support/shared_examples/on_duplicate_key_ignore.rb +2 -0
- data/test/support/shared_examples/on_duplicate_key_update.rb +41 -10
- data/test/support/shared_examples/recursive_import.rb +23 -1
- data/test/support/sqlite3/import_examples.rb +2 -1
- data/test/synchronize_test.rb +2 -0
- data/test/test_helper.rb +21 -5
- data/test/value_sets_bytes_parser_test.rb +3 -1
- data/test/value_sets_records_parser_test.rb +3 -1
- metadata +16 -12
- data/gemfiles/3.2.gemfile +0 -2
- data/gemfiles/4.0.gemfile +0 -2
- data/gemfiles/4.1.gemfile +0 -2
|
@@ -1,18 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "ostruct"
|
|
2
4
|
|
|
3
5
|
module ActiveRecord::Import::ConnectionAdapters; end
|
|
4
6
|
|
|
5
|
-
module ActiveRecord::Import
|
|
7
|
+
module ActiveRecord::Import # :nodoc:
|
|
6
8
|
Result = Struct.new(:failed_instances, :num_inserts, :ids, :results)
|
|
7
9
|
|
|
8
|
-
module ImportSupport
|
|
9
|
-
def supports_import?
|
|
10
|
+
module ImportSupport # :nodoc:
|
|
11
|
+
def supports_import? # :nodoc:
|
|
10
12
|
true
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
|
|
14
|
-
module OnDuplicateKeyUpdateSupport
|
|
15
|
-
def supports_on_duplicate_key_update?
|
|
16
|
+
module OnDuplicateKeyUpdateSupport # :nodoc:
|
|
17
|
+
def supports_on_duplicate_key_update? # :nodoc:
|
|
16
18
|
true
|
|
17
19
|
end
|
|
18
20
|
end
|
|
@@ -34,7 +36,7 @@ module ActiveRecord::Import #:nodoc:
|
|
|
34
36
|
@validate_callbacks = klass._validate_callbacks.dup
|
|
35
37
|
|
|
36
38
|
@validate_callbacks.each_with_index do |callback, i|
|
|
37
|
-
filter = callback.raw_filter
|
|
39
|
+
filter = callback.respond_to?(:raw_filter) ? callback.raw_filter : callback.filter
|
|
38
40
|
next unless filter.class.name =~ /Validations::PresenceValidator/ ||
|
|
39
41
|
(!@options[:validate_uniqueness] &&
|
|
40
42
|
filter.is_a?(ActiveRecord::Validations::UniquenessValidator))
|
|
@@ -55,7 +57,7 @@ module ActiveRecord::Import #:nodoc:
|
|
|
55
57
|
end
|
|
56
58
|
end
|
|
57
59
|
|
|
58
|
-
filter.instance_variable_set(:@attributes, attrs)
|
|
60
|
+
filter.instance_variable_set(:@attributes, attrs.flatten)
|
|
59
61
|
|
|
60
62
|
if @validate_callbacks.respond_to?(:chain, true)
|
|
61
63
|
@validate_callbacks.send(:chain).tap do |chain|
|
|
@@ -71,7 +73,7 @@ module ActiveRecord::Import #:nodoc:
|
|
|
71
73
|
end
|
|
72
74
|
|
|
73
75
|
def valid_model?(model)
|
|
74
|
-
init_validations(model.class) unless model.
|
|
76
|
+
init_validations(model.class) unless model.instance_of?(@validator_class)
|
|
75
77
|
|
|
76
78
|
validation_context = @options[:validate_with_context]
|
|
77
79
|
validation_context ||= (model.new_record? ? :create : :update)
|
|
@@ -83,7 +85,11 @@ module ActiveRecord::Import #:nodoc:
|
|
|
83
85
|
|
|
84
86
|
model.run_callbacks(:validation) do
|
|
85
87
|
if defined?(ActiveSupport::Callbacks::Filters::Environment) # ActiveRecord >= 4.1
|
|
86
|
-
runner = @validate_callbacks.compile
|
|
88
|
+
runner = if @validate_callbacks.method(:compile).arity == 0
|
|
89
|
+
@validate_callbacks.compile
|
|
90
|
+
else # ActiveRecord >= 7.1
|
|
91
|
+
@validate_callbacks.compile(nil)
|
|
92
|
+
end
|
|
87
93
|
env = ActiveSupport::Callbacks::Filters::Environment.new(model, false, nil)
|
|
88
94
|
if runner.respond_to?(:call) # ActiveRecord < 5.1
|
|
89
95
|
runner.call(env)
|
|
@@ -163,7 +169,7 @@ class ActiveRecord::Associations::CollectionAssociation
|
|
|
163
169
|
m.public_send "#{reflection.type}=", owner.class.name if reflection.type
|
|
164
170
|
end
|
|
165
171
|
|
|
166
|
-
|
|
172
|
+
model_klass.bulk_import column_names, models, options
|
|
167
173
|
|
|
168
174
|
# supports array of hash objects
|
|
169
175
|
elsif args.last.is_a?( Array ) && args.last.first.is_a?(Hash)
|
|
@@ -202,11 +208,11 @@ class ActiveRecord::Associations::CollectionAssociation
|
|
|
202
208
|
end
|
|
203
209
|
end
|
|
204
210
|
|
|
205
|
-
|
|
211
|
+
model_klass.bulk_import column_names, array_of_attributes, options
|
|
206
212
|
|
|
207
213
|
# supports empty array
|
|
208
214
|
elsif args.last.is_a?( Array ) && args.last.empty?
|
|
209
|
-
|
|
215
|
+
ActiveRecord::Import::Result.new([], 0, [])
|
|
210
216
|
|
|
211
217
|
# supports 2-element array and array
|
|
212
218
|
elsif args.size == 2 && args.first.is_a?( Array ) && args.last.is_a?( Array )
|
|
@@ -237,7 +243,7 @@ class ActiveRecord::Associations::CollectionAssociation
|
|
|
237
243
|
end
|
|
238
244
|
end
|
|
239
245
|
|
|
240
|
-
|
|
246
|
+
model_klass.bulk_import column_names, array_of_attributes, options
|
|
241
247
|
else
|
|
242
248
|
raise ArgumentError, "Invalid arguments!"
|
|
243
249
|
end
|
|
@@ -547,7 +553,7 @@ class ActiveRecord::Base
|
|
|
547
553
|
alias import! bulk_import! unless ActiveRecord::Base.respond_to? :import!
|
|
548
554
|
|
|
549
555
|
def import_helper( *args )
|
|
550
|
-
options = { validate: true, timestamps: true, track_validation_failures: false }
|
|
556
|
+
options = { model: self, validate: true, timestamps: true, track_validation_failures: false }
|
|
551
557
|
options.merge!( args.pop ) if args.last.is_a? Hash
|
|
552
558
|
# making sure that current model's primary key is used
|
|
553
559
|
options[:primary_key] = primary_key
|
|
@@ -572,7 +578,7 @@ class ActiveRecord::Base
|
|
|
572
578
|
|
|
573
579
|
if models.first.id.nil?
|
|
574
580
|
Array(primary_key).each do |c|
|
|
575
|
-
if column_names.include?(c) &&
|
|
581
|
+
if column_names.include?(c) && schema_columns_hash[c].type == :uuid
|
|
576
582
|
column_names.delete(c)
|
|
577
583
|
end
|
|
578
584
|
end
|
|
@@ -695,7 +701,11 @@ class ActiveRecord::Base
|
|
|
695
701
|
return_obj = if is_validating
|
|
696
702
|
import_with_validations( column_names, array_of_attributes, options ) do |failed_instances|
|
|
697
703
|
if models
|
|
698
|
-
models.
|
|
704
|
+
models.each_with_index do |m, i|
|
|
705
|
+
next unless m.errors.any?
|
|
706
|
+
|
|
707
|
+
failed_instances << (options[:track_validation_failures] ? [i, m] : m)
|
|
708
|
+
end
|
|
699
709
|
else
|
|
700
710
|
# create instances for each of our column/value sets
|
|
701
711
|
arr = validations_array_for_column_names_and_attributes( column_names, array_of_attributes )
|
|
@@ -734,7 +744,10 @@ class ActiveRecord::Base
|
|
|
734
744
|
set_attributes_and_mark_clean(models, return_obj, timestamps, options)
|
|
735
745
|
|
|
736
746
|
# if there are auto-save associations on the models we imported that are new, import them as well
|
|
737
|
-
|
|
747
|
+
if options[:recursive]
|
|
748
|
+
options[:on_duplicate_key_update] = on_duplicate_key_update unless on_duplicate_key_update.nil?
|
|
749
|
+
import_associations(models, options.dup.merge(validate: false))
|
|
750
|
+
end
|
|
738
751
|
end
|
|
739
752
|
|
|
740
753
|
return_obj
|
|
@@ -769,7 +782,10 @@ class ActiveRecord::Base
|
|
|
769
782
|
def import_without_validations_or_callbacks( column_names, array_of_attributes, options = {} )
|
|
770
783
|
return ActiveRecord::Import::Result.new([], 0, [], []) if array_of_attributes.empty?
|
|
771
784
|
|
|
772
|
-
column_names = column_names.map
|
|
785
|
+
column_names = column_names.map do |name|
|
|
786
|
+
original_name = attribute_alias?(name) ? attribute_alias(name) : name
|
|
787
|
+
original_name.to_sym
|
|
788
|
+
end
|
|
773
789
|
scope_columns, scope_values = scope_attributes.to_a.transpose
|
|
774
790
|
|
|
775
791
|
unless scope_columns.blank?
|
|
@@ -781,15 +797,13 @@ class ActiveRecord::Base
|
|
|
781
797
|
end
|
|
782
798
|
end
|
|
783
799
|
|
|
784
|
-
if finder_needs_type_condition?
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
array_of_attributes.each { |attrs| attrs << sti_name }
|
|
788
|
-
end
|
|
800
|
+
if finder_needs_type_condition? && !column_names.include?(inheritance_column.to_sym)
|
|
801
|
+
column_names << inheritance_column.to_sym
|
|
802
|
+
array_of_attributes.each { |attrs| attrs << sti_name }
|
|
789
803
|
end
|
|
790
804
|
|
|
791
805
|
columns = column_names.each_with_index.map do |name, i|
|
|
792
|
-
column =
|
|
806
|
+
column = schema_columns_hash[name.to_s]
|
|
793
807
|
raise ActiveRecord::Import::MissingColumnError.new(name.to_s, i) if column.nil?
|
|
794
808
|
column
|
|
795
809
|
end
|
|
@@ -854,13 +868,13 @@ class ActiveRecord::Base
|
|
|
854
868
|
model.id = id
|
|
855
869
|
|
|
856
870
|
timestamps.each do |attr, value|
|
|
857
|
-
model.send(attr
|
|
871
|
+
model.send("#{attr}=", value) if model.send(attr).nil?
|
|
858
872
|
end
|
|
859
873
|
end
|
|
860
874
|
end
|
|
861
875
|
|
|
862
876
|
deserialize_value = lambda do |column, value|
|
|
863
|
-
column =
|
|
877
|
+
column = schema_columns_hash[column]
|
|
864
878
|
return value unless column
|
|
865
879
|
if respond_to?(:type_caster)
|
|
866
880
|
type = type_for_attribute(column.name)
|
|
@@ -872,19 +886,28 @@ class ActiveRecord::Base
|
|
|
872
886
|
end
|
|
873
887
|
end
|
|
874
888
|
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
889
|
+
set_value = lambda do |model, column, value|
|
|
890
|
+
val = deserialize_value.call(column, value)
|
|
891
|
+
if model.attribute_names.include?(column)
|
|
892
|
+
model.send("#{column}=", val)
|
|
893
|
+
else
|
|
894
|
+
attributes = attributes_builder.build_from_database(model.attributes.merge(column => val))
|
|
895
|
+
model.instance_variable_set(:@attributes, attributes)
|
|
896
|
+
end
|
|
897
|
+
end
|
|
898
|
+
|
|
899
|
+
columns = Array(options[:returning_columns])
|
|
900
|
+
results = Array(import_result.results)
|
|
901
|
+
if models.size == results.size
|
|
902
|
+
single_column = columns.first if columns.size == 1
|
|
903
|
+
results.each_with_index do |result, index|
|
|
879
904
|
model = models[index]
|
|
880
905
|
|
|
881
906
|
if single_column
|
|
882
|
-
|
|
883
|
-
model.send(single_column, val)
|
|
907
|
+
set_value.call(model, single_column, result)
|
|
884
908
|
else
|
|
885
909
|
columns.each_with_index do |column, col_index|
|
|
886
|
-
|
|
887
|
-
model.send("#{column}=", val)
|
|
910
|
+
set_value.call(model, column, result[col_index])
|
|
888
911
|
end
|
|
889
912
|
end
|
|
890
913
|
end
|
|
@@ -908,15 +931,19 @@ class ActiveRecord::Base
|
|
|
908
931
|
changed_columns = model.changed
|
|
909
932
|
association_reflections = model.class.reflect_on_all_associations(:belongs_to)
|
|
910
933
|
association_reflections.each do |association_reflection|
|
|
911
|
-
column_name = association_reflection.foreign_key
|
|
912
934
|
next if association_reflection.options[:polymorphic]
|
|
913
|
-
next if changed_columns.include?(column_name)
|
|
914
|
-
association = model.association(association_reflection.name)
|
|
915
|
-
association = association.target
|
|
916
|
-
next if association.blank? || model.public_send(column_name).present?
|
|
917
935
|
|
|
918
|
-
|
|
919
|
-
|
|
936
|
+
column_names = Array(association_reflection.foreign_key).map(&:to_s)
|
|
937
|
+
column_names.each_with_index do |column_name, column_index|
|
|
938
|
+
next if changed_columns.include?(column_name)
|
|
939
|
+
|
|
940
|
+
association = model.association(association_reflection.name)
|
|
941
|
+
association = association.target
|
|
942
|
+
next if association.blank? || model.public_send(column_name).present?
|
|
943
|
+
|
|
944
|
+
association_primary_key = Array(association_reflection.association_primary_key)[column_index]
|
|
945
|
+
model.public_send("#{column_name}=", association.send(association_primary_key))
|
|
946
|
+
end
|
|
920
947
|
end
|
|
921
948
|
end
|
|
922
949
|
|
|
@@ -929,8 +956,9 @@ class ActiveRecord::Base
|
|
|
929
956
|
associated_objects_by_class = {}
|
|
930
957
|
models.each { |model| find_associated_objects_for_import(associated_objects_by_class, model) }
|
|
931
958
|
|
|
932
|
-
# :on_duplicate_key_update
|
|
933
|
-
options.delete(:on_duplicate_key_update)
|
|
959
|
+
# :on_duplicate_key_update only supported for all fields
|
|
960
|
+
options.delete(:on_duplicate_key_update) unless options[:on_duplicate_key_update] == :all
|
|
961
|
+
# :returning not supported for associations
|
|
934
962
|
options.delete(:returning)
|
|
935
963
|
|
|
936
964
|
associated_objects_by_class.each_value do |associations|
|
|
@@ -940,6 +968,14 @@ class ActiveRecord::Base
|
|
|
940
968
|
end
|
|
941
969
|
end
|
|
942
970
|
|
|
971
|
+
def schema_columns_hash
|
|
972
|
+
@schema_columns_hash ||= if respond_to?(:ignored_columns) && ignored_columns.any?
|
|
973
|
+
connection.schema_cache.columns_hash(table_name)
|
|
974
|
+
else
|
|
975
|
+
columns_hash
|
|
976
|
+
end
|
|
977
|
+
end
|
|
978
|
+
|
|
943
979
|
# We are eventually going to call Class.import <objects> so we build up a hash
|
|
944
980
|
# of class => objects to import.
|
|
945
981
|
def find_associated_objects_for_import(associated_objects_by_class, model)
|
|
@@ -1029,7 +1065,12 @@ class ActiveRecord::Base
|
|
|
1029
1065
|
end
|
|
1030
1066
|
|
|
1031
1067
|
# use tz as set in ActiveRecord::Base
|
|
1032
|
-
|
|
1068
|
+
default_timezone = if ActiveRecord.respond_to?(:default_timezone)
|
|
1069
|
+
ActiveRecord.default_timezone
|
|
1070
|
+
else
|
|
1071
|
+
ActiveRecord::Base.default_timezone
|
|
1072
|
+
end
|
|
1073
|
+
timestamp = default_timezone == :utc ? Time.now.utc : Time.now
|
|
1033
1074
|
|
|
1034
1075
|
[:create, :update].each do |action|
|
|
1035
1076
|
timestamp_columns[action].each do |column|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ActiveRecord # :nodoc:
|
|
2
4
|
class Base # :nodoc:
|
|
3
5
|
# Synchronizes the passed in ActiveRecord instances with data
|
|
@@ -39,7 +41,7 @@ module ActiveRecord # :nodoc:
|
|
|
39
41
|
|
|
40
42
|
next unless matched_instance
|
|
41
43
|
|
|
42
|
-
instance.
|
|
44
|
+
instance.instance_variable_set :@association_cache, {}
|
|
43
45
|
instance.send :clear_aggregation_cache if instance.respond_to?(:clear_aggregation_cache, true)
|
|
44
46
|
instance.instance_variable_set :@attributes, matched_instance.instance_variable_get(:@attributes)
|
|
45
47
|
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'active_support/core_ext/array'
|
|
2
4
|
|
|
3
5
|
module ActiveRecord::Import
|
|
4
6
|
class ValueSetTooLargeError < StandardError
|
|
5
7
|
attr_reader :size
|
|
8
|
+
|
|
6
9
|
def initialize(msg = "Value set exceeds max size", size = 0)
|
|
7
10
|
@size = size
|
|
8
11
|
super(msg)
|
data/lib/activerecord-import.rb
CHANGED
data/test/adapters/jdbcmysql.rb
CHANGED
data/test/adapters/mysql2.rb
CHANGED
data/test/adapters/postgis.rb
CHANGED
data/test/adapters/postgresql.rb
CHANGED
data/test/adapters/spatialite.rb
CHANGED
data/test/adapters/sqlite3.rb
CHANGED
data/test/import_test.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require File.expand_path('../test_helper', __FILE__)
|
|
2
4
|
|
|
3
5
|
describe "#import" do
|
|
@@ -159,6 +161,25 @@ describe "#import" do
|
|
|
159
161
|
Tag.import columns, values, validate: false
|
|
160
162
|
end
|
|
161
163
|
end
|
|
164
|
+
|
|
165
|
+
it "should import models that are required to belong to models with composite primary keys" do
|
|
166
|
+
tag = Tag.create!(tag_id: 1, publisher_id: 1, tag: 'Mystery')
|
|
167
|
+
valid_tag_alias = TagAlias.new(tag_id: tag.tag_id, parent_id: tag.publisher_id, alias: 'Detective')
|
|
168
|
+
invalid_tag_aliases = [
|
|
169
|
+
TagAlias.new(tag_id: nil, parent_id: nil, alias: 'Detective'),
|
|
170
|
+
TagAlias.new(tag_id: tag.tag_id, parent_id: nil, alias: 'Detective'),
|
|
171
|
+
TagAlias.new(tag_id: nil, parent_id: tag.publisher_id, alias: 'Detective'),
|
|
172
|
+
]
|
|
173
|
+
|
|
174
|
+
assert_difference "TagAlias.count", +1 do
|
|
175
|
+
TagAlias.import [valid_tag_alias]
|
|
176
|
+
end
|
|
177
|
+
invalid_tag_aliases.each do |invalid_tag_alias|
|
|
178
|
+
assert_no_difference "TagAlias.count" do
|
|
179
|
+
TagAlias.import [invalid_tag_alias]
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
162
183
|
end
|
|
163
184
|
end
|
|
164
185
|
|
|
@@ -555,7 +576,11 @@ describe "#import" do
|
|
|
555
576
|
context "when the timestamps columns are present" do
|
|
556
577
|
setup do
|
|
557
578
|
@existing_book = Book.create(title: "Fell", author_name: "Curry", publisher: "Bayer", created_at: 2.years.ago.utc, created_on: 2.years.ago.utc, updated_at: 2.years.ago.utc, updated_on: 2.years.ago.utc)
|
|
558
|
-
ActiveRecord
|
|
579
|
+
if ActiveRecord.respond_to?(:default_timezone)
|
|
580
|
+
ActiveRecord.default_timezone = :utc
|
|
581
|
+
else
|
|
582
|
+
ActiveRecord::Base.default_timezone = :utc
|
|
583
|
+
end
|
|
559
584
|
Timecop.freeze(time) do
|
|
560
585
|
assert_difference "Book.count", +2 do
|
|
561
586
|
Book.import %w(title author_name publisher created_at created_on updated_at updated_on), [["LDAP", "Big Bird", "Del Rey", nil, nil, nil, nil], [@existing_book.title, @existing_book.author_name, @existing_book.publisher, @existing_book.created_at, @existing_book.created_on, @existing_book.updated_at, @existing_book.updated_on]]
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
require File.expand_path(File.dirname(__FILE__)
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
|
4
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../support/assertions")
|
|
5
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../support/mysql/import_examples")
|
|
4
6
|
|
|
5
7
|
should_support_mysql_import_functionality
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
|
4
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../support/postgresql/import_examples")
|
|
3
5
|
|
|
4
6
|
should_support_postgresql_import_functionality
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
|
4
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../support/sqlite3/import_examples")
|
|
3
5
|
|
|
4
6
|
should_support_sqlite3_import_functionality
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
|
4
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../support/postgresql/import_examples")
|
|
3
5
|
|
|
4
6
|
should_support_postgresql_import_functionality
|
|
5
7
|
|
data/test/models/account.rb
CHANGED
data/test/models/alarm.rb
CHANGED
data/test/models/animal.rb
CHANGED
data/test/models/bike_maker.rb
CHANGED
data/test/models/book.rb
CHANGED
data/test/models/car.rb
CHANGED
data/test/models/card.rb
CHANGED
data/test/models/chapter.rb
CHANGED
data/test/models/deck.rb
CHANGED
data/test/models/dictionary.rb
CHANGED
data/test/models/discount.rb
CHANGED
data/test/models/end_note.rb
CHANGED
data/test/models/group.rb
CHANGED
data/test/models/playing_card.rb
CHANGED
data/test/models/promotion.rb
CHANGED