activerecord-import 1.4.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.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yaml +7 -1
  3. data/.rubocop.yml +74 -8
  4. data/.rubocop_todo.yml +6 -16
  5. data/Brewfile +3 -1
  6. data/CHANGELOG.md +18 -0
  7. data/Gemfile +5 -3
  8. data/README.markdown +8 -6
  9. data/Rakefile +2 -0
  10. data/activerecord-import.gemspec +2 -1
  11. data/benchmarks/benchmark.rb +5 -3
  12. data/benchmarks/lib/base.rb +4 -2
  13. data/benchmarks/lib/cli_parser.rb +4 -2
  14. data/benchmarks/lib/float.rb +2 -0
  15. data/benchmarks/lib/mysql2_benchmark.rb +2 -0
  16. data/benchmarks/lib/output_to_csv.rb +2 -0
  17. data/benchmarks/lib/output_to_html.rb +4 -2
  18. data/benchmarks/models/test_innodb.rb +2 -0
  19. data/benchmarks/models/test_memory.rb +2 -0
  20. data/benchmarks/models/test_myisam.rb +2 -0
  21. data/benchmarks/schema/mysql2_schema.rb +2 -0
  22. data/gemfiles/4.2.gemfile +2 -0
  23. data/gemfiles/5.0.gemfile +2 -0
  24. data/gemfiles/5.1.gemfile +2 -0
  25. data/gemfiles/5.2.gemfile +2 -0
  26. data/gemfiles/6.0.gemfile +2 -0
  27. data/gemfiles/6.1.gemfile +2 -0
  28. data/gemfiles/7.0.gemfile +3 -0
  29. data/lib/activerecord-import/active_record/adapters/abstract_adapter.rb +2 -0
  30. data/lib/activerecord-import/active_record/adapters/jdbcmysql_adapter.rb +2 -0
  31. data/lib/activerecord-import/active_record/adapters/jdbcpostgresql_adapter.rb +2 -0
  32. data/lib/activerecord-import/active_record/adapters/jdbcsqlite3_adapter.rb +2 -0
  33. data/lib/activerecord-import/active_record/adapters/mysql2_adapter.rb +2 -0
  34. data/lib/activerecord-import/active_record/adapters/postgresql_adapter.rb +2 -0
  35. data/lib/activerecord-import/active_record/adapters/seamless_database_pool_adapter.rb +2 -0
  36. data/lib/activerecord-import/active_record/adapters/sqlite3_adapter.rb +2 -0
  37. data/lib/activerecord-import/adapters/abstract_adapter.rb +8 -5
  38. data/lib/activerecord-import/adapters/em_mysql2_adapter.rb +2 -0
  39. data/lib/activerecord-import/adapters/mysql2_adapter.rb +2 -0
  40. data/lib/activerecord-import/adapters/mysql_adapter.rb +26 -18
  41. data/lib/activerecord-import/adapters/postgresql_adapter.rb +63 -42
  42. data/lib/activerecord-import/adapters/sqlite3_adapter.rb +33 -25
  43. data/lib/activerecord-import/base.rb +3 -1
  44. data/lib/activerecord-import/import.rb +60 -32
  45. data/lib/activerecord-import/mysql2.rb +2 -0
  46. data/lib/activerecord-import/postgresql.rb +2 -0
  47. data/lib/activerecord-import/sqlite3.rb +2 -0
  48. data/lib/activerecord-import/synchronize.rb +2 -0
  49. data/lib/activerecord-import/value_sets_parser.rb +3 -0
  50. data/lib/activerecord-import/version.rb +3 -1
  51. data/lib/activerecord-import.rb +3 -1
  52. data/test/adapters/jdbcmysql.rb +2 -0
  53. data/test/adapters/jdbcpostgresql.rb +2 -0
  54. data/test/adapters/jdbcsqlite3.rb +2 -0
  55. data/test/adapters/makara_postgis.rb +2 -0
  56. data/test/adapters/mysql2.rb +2 -0
  57. data/test/adapters/mysql2_makara.rb +2 -0
  58. data/test/adapters/mysql2spatial.rb +2 -0
  59. data/test/adapters/postgis.rb +2 -0
  60. data/test/adapters/postgresql.rb +2 -0
  61. data/test/adapters/postgresql_makara.rb +2 -0
  62. data/test/adapters/seamless_database_pool.rb +2 -0
  63. data/test/adapters/spatialite.rb +2 -0
  64. data/test/adapters/sqlite3.rb +2 -0
  65. data/test/import_test.rb +21 -0
  66. data/test/jdbcmysql/import_test.rb +5 -3
  67. data/test/jdbcpostgresql/import_test.rb +4 -2
  68. data/test/jdbcsqlite3/import_test.rb +4 -2
  69. data/test/makara_postgis/import_test.rb +4 -2
  70. data/test/models/account.rb +2 -0
  71. data/test/models/alarm.rb +2 -0
  72. data/test/models/animal.rb +2 -0
  73. data/test/models/bike_maker.rb +3 -0
  74. data/test/models/book.rb +2 -0
  75. data/test/models/car.rb +2 -0
  76. data/test/models/card.rb +2 -0
  77. data/test/models/chapter.rb +2 -0
  78. data/test/models/customer.rb +2 -0
  79. data/test/models/deck.rb +2 -0
  80. data/test/models/dictionary.rb +2 -0
  81. data/test/models/discount.rb +2 -0
  82. data/test/models/end_note.rb +2 -0
  83. data/test/models/group.rb +2 -0
  84. data/test/models/order.rb +2 -0
  85. data/test/models/playing_card.rb +2 -0
  86. data/test/models/promotion.rb +2 -0
  87. data/test/models/question.rb +2 -0
  88. data/test/models/rule.rb +2 -0
  89. data/test/models/tag.rb +3 -0
  90. data/test/models/tag_alias.rb +5 -0
  91. data/test/models/topic.rb +7 -0
  92. data/test/models/user.rb +2 -0
  93. data/test/models/user_token.rb +2 -0
  94. data/test/models/vendor.rb +2 -0
  95. data/test/models/widget.rb +2 -0
  96. data/test/mysql2/import_test.rb +5 -3
  97. data/test/mysql2_makara/import_test.rb +5 -3
  98. data/test/mysqlspatial2/import_test.rb +5 -3
  99. data/test/postgis/import_test.rb +4 -2
  100. data/test/postgresql/import_test.rb +4 -2
  101. data/test/schema/generic_schema.rb +9 -0
  102. data/test/schema/jdbcpostgresql_schema.rb +3 -1
  103. data/test/schema/mysql2_schema.rb +2 -0
  104. data/test/schema/postgis_schema.rb +3 -1
  105. data/test/schema/postgresql_schema.rb +2 -0
  106. data/test/schema/sqlite3_schema.rb +2 -0
  107. data/test/schema/version.rb +2 -0
  108. data/test/sqlite3/import_test.rb +4 -2
  109. data/test/support/active_support/test_case_extensions.rb +2 -0
  110. data/test/support/assertions.rb +2 -0
  111. data/test/support/factories.rb +2 -0
  112. data/test/support/generate.rb +4 -2
  113. data/test/support/mysql/import_examples.rb +2 -1
  114. data/test/support/postgresql/import_examples.rb +40 -1
  115. data/test/support/shared_examples/on_duplicate_key_ignore.rb +2 -0
  116. data/test/support/shared_examples/on_duplicate_key_update.rb +41 -10
  117. data/test/support/shared_examples/recursive_import.rb +2 -0
  118. data/test/support/sqlite3/import_examples.rb +2 -1
  119. data/test/synchronize_test.rb +2 -0
  120. data/test/test_helper.rb +11 -3
  121. data/test/value_sets_bytes_parser_test.rb +3 -1
  122. data/test/value_sets_records_parser_test.rb +3 -1
  123. metadata +5 -3
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  def should_support_basic_on_duplicate_key_update
2
4
  describe "#import" do
3
5
  extend ActiveSupport::TestCase::ImportAssertions
@@ -24,7 +26,7 @@ def should_support_basic_on_duplicate_key_update
24
26
  User.import(updated_users, on_duplicate_key_update: [:name])
25
27
  assert User.count == updated_users.length
26
28
  User.all.each_with_index do |user, i|
27
- assert_equal user.name, users[i].name + ' Rothschild'
29
+ assert_equal user.name, "#{users[i].name} Rothschild"
28
30
  assert_equal 1, user.lock_version
29
31
  end
30
32
  end
@@ -48,7 +50,7 @@ def should_support_basic_on_duplicate_key_update
48
50
  User.import(columns, updated_values, on_duplicate_key_update: [:name])
49
51
  assert User.count == updated_values.length
50
52
  User.all.each_with_index do |user, i|
51
- assert_equal user.name, users[i].name + ' Rothschild'
53
+ assert_equal user.name, "#{users[i].name} Rothschild"
52
54
  assert_equal 1, user.lock_version
53
55
  end
54
56
  end
@@ -70,7 +72,7 @@ def should_support_basic_on_duplicate_key_update
70
72
  User.import(updated_values, on_duplicate_key_update: [:name])
71
73
  assert User.count == updated_values.length
72
74
  User.all.each_with_index do |user, i|
73
- assert_equal user.name, users[i].name + ' Rothschild'
75
+ assert_equal user.name, "#{users[i].name} Rothschild"
74
76
  assert_equal 1, user.lock_version
75
77
  end
76
78
  updated_values2 = User.all.map do |user|
@@ -80,7 +82,7 @@ def should_support_basic_on_duplicate_key_update
80
82
  User.import(updated_values2, on_duplicate_key_update: [:name])
81
83
  assert User.count == updated_values2.length
82
84
  User.all.each_with_index do |user, i|
83
- assert_equal user.name, users[i].name + ' Rothschild jr.'
85
+ assert_equal user.name, "#{users[i].name} Rothschild jr."
84
86
  assert_equal 2, user.lock_version
85
87
  end
86
88
  end
@@ -102,7 +104,7 @@ def should_support_basic_on_duplicate_key_update
102
104
  Account.import(updated_accounts, on_duplicate_key_update: [:id, :name])
103
105
  assert Account.count == updated_accounts.length
104
106
  Account.all.each_with_index do |user, i|
105
- assert_equal user.name, accounts[i].name + ' Rothschild'
107
+ assert_equal user.name, "#{accounts[i].name} Rothschild"
106
108
  assert_equal 1, user.lock
107
109
  end
108
110
  end
@@ -126,7 +128,7 @@ def should_support_basic_on_duplicate_key_update
126
128
  Account.import(columns, updated_values, on_duplicate_key_update: [:name])
127
129
  assert Account.count == updated_values.length
128
130
  Account.all.each_with_index do |user, i|
129
- assert_equal user.name, accounts[i].name + ' Rothschild'
131
+ assert_equal user.name, "#{accounts[i].name} Rothschild"
130
132
  assert_equal 1, user.lock
131
133
  end
132
134
  end
@@ -148,7 +150,7 @@ def should_support_basic_on_duplicate_key_update
148
150
  Account.import(updated_values, on_duplicate_key_update: [:name])
149
151
  assert Account.count == updated_values.length
150
152
  Account.all.each_with_index do |user, i|
151
- assert_equal user.name, accounts[i].name + ' Rothschild'
153
+ assert_equal user.name, "#{accounts[i].name} Rothschild"
152
154
  assert_equal 1, user.lock
153
155
  end
154
156
  end
@@ -170,10 +172,11 @@ def should_support_basic_on_duplicate_key_update
170
172
  Bike::Maker.import(updated_makers, on_duplicate_key_update: [:name])
171
173
  assert Bike::Maker.count == updated_makers.length
172
174
  Bike::Maker.all.each_with_index do |maker, i|
173
- assert_equal maker.name, makers[i].name + ' bikes'
175
+ assert_equal maker.name, "#{makers[i].name} bikes"
174
176
  assert_equal 1, maker.lock_version
175
177
  end
176
178
  end
179
+
177
180
  it 'update the lock_version of models separated by namespaces by array' do
178
181
  makers = [
179
182
  Bike::Maker.new(name: 'Yamaha'),
@@ -193,7 +196,7 @@ def should_support_basic_on_duplicate_key_update
193
196
  Bike::Maker.import(columns, updated_values, on_duplicate_key_update: [:name])
194
197
  assert Bike::Maker.count == updated_values.length
195
198
  Bike::Maker.all.each_with_index do |maker, i|
196
- assert_equal maker.name, makers[i].name + ' bikes'
199
+ assert_equal maker.name, "#{makers[i].name} bikes"
197
200
  assert_equal 1, maker.lock_version
198
201
  end
199
202
  end
@@ -215,7 +218,7 @@ def should_support_basic_on_duplicate_key_update
215
218
  Bike::Maker.import(updated_values, on_duplicate_key_update: [:name])
216
219
  assert Bike::Maker.count == updated_values.length
217
220
  Bike::Maker.all.each_with_index do |maker, i|
218
- assert_equal maker.name, makers[i].name + ' bikes'
221
+ assert_equal maker.name, "#{makers[i].name} bikes"
219
222
  assert_equal 1, maker.lock_version
220
223
  end
221
224
  end
@@ -314,6 +317,34 @@ def should_support_basic_on_duplicate_key_update
314
317
  should_support_on_duplicate_key_update
315
318
  should_update_fields_mentioned
316
319
  end
320
+
321
+ context "using column aliases" do
322
+ let(:columns) { %w( id title author_name author_email_address parent_id ) }
323
+ let(:update_columns) { %w(title author_email_address parent_id) }
324
+
325
+ context "with column aliases in column list" do
326
+ let(:columns) { %w( id name author_name author_email_address parent_id ) }
327
+ should_support_on_duplicate_key_update
328
+ should_update_fields_mentioned
329
+ end
330
+
331
+ context "with column aliases in update columns list" do
332
+ let(:update_columns) { %w(name author_email_address parent_id) }
333
+ should_support_on_duplicate_key_update
334
+ should_update_fields_mentioned
335
+ end
336
+ end
337
+
338
+ if ENV['AR_VERSION'].to_i >= 6.0
339
+ context "using ignored columns" do
340
+ let(:columns) { %w( id title author_name author_email_address parent_id priority ) }
341
+ let(:values) { [[99, "Book", "John Doe", "john@doe.com", 17, 1]] }
342
+ let(:update_columns) { %w(name author_email_address parent_id priority) }
343
+ let(:updated_values) { [[99, "Book - 2nd Edition", "Author Should Not Change", "johndoe@example.com", 57, 2]] }
344
+ should_support_on_duplicate_key_update
345
+ should_update_fields_mentioned
346
+ end
347
+ end
317
348
  end
318
349
 
319
350
  context "with a table that has a non-standard primary key" do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  def should_support_recursive_import
2
4
  describe "importing objects with associations" do
3
5
  let(:new_topics) { Build(num_topics, :topic_with_book) }
@@ -1,4 +1,5 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
+
2
3
  def should_support_sqlite3_import_functionality
3
4
  if ActiveRecord::Base.connection.supports_on_duplicate_key_update?
4
5
  should_support_sqlite_upsert_functionality
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('../test_helper', __FILE__)
2
4
 
3
5
  describe ".synchronize" do
data/test/test_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathname'
2
4
  require 'rake'
3
5
  test_dir = Pathname.new File.dirname(__FILE__)
@@ -22,7 +24,7 @@ if ActiveSupport::VERSION::STRING < "4.0"
22
24
  require 'mocha/test_unit'
23
25
  else
24
26
  require 'active_support/testing/autorun'
25
- require "mocha/mini_test"
27
+ require "mocha/minitest"
26
28
  end
27
29
 
28
30
  require 'timecop'
@@ -50,6 +52,12 @@ FileUtils.mkdir_p 'log'
50
52
  ActiveRecord::Base.logger = Logger.new("log/test.log")
51
53
  ActiveRecord::Base.logger.level = Logger::DEBUG
52
54
 
55
+ if ActiveRecord.respond_to?(:use_yaml_unsafe_load)
56
+ ActiveRecord.use_yaml_unsafe_load = true
57
+ elsif ActiveRecord::Base.respond_to?(:use_yaml_unsafe_load)
58
+ ActiveRecord::Base.use_yaml_unsafe_load = true
59
+ end
60
+
53
61
  if ENV['AR_VERSION'].to_f >= 6.0
54
62
  yaml_config = if Gem::Version.new(Psych::VERSION) >= Gem::Version.new('3.2.1')
55
63
  YAML.safe_load_file(test_dir.join("database.yml"), aliases: true)[adapter]
@@ -76,7 +84,7 @@ ActiveSupport::Notifications.subscribe(/active_record.sql/) do |_, _, _, _, hsh|
76
84
  end
77
85
 
78
86
  require "factory_bot"
79
- Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each { |file| require file }
87
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |file| require file }
80
88
 
81
89
  # Load base/generic schema
82
90
  require test_dir.join("schema/version")
@@ -84,7 +92,7 @@ require test_dir.join("schema/generic_schema")
84
92
  adapter_schema = test_dir.join("schema/#{adapter}_schema.rb")
85
93
  require adapter_schema if File.exist?(adapter_schema)
86
94
 
87
- Dir[File.dirname(__FILE__) + "/models/*.rb"].each { |file| require file }
95
+ Dir["#{File.dirname(__FILE__)}/models/*.rb"].sort.each { |file| require file }
88
96
 
89
97
  # Prevent this deprecation warning from breaking the tests.
90
98
  Rake::FileList.send(:remove_method, :import)
@@ -1,4 +1,6 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/test_helper')
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
2
4
 
3
5
  require 'activerecord-import/value_sets_parser'
4
6
 
@@ -1,4 +1,6 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/test_helper')
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path("#{File.dirname(__FILE__)}/test_helper")
2
4
 
3
5
  require 'activerecord-import/value_sets_parser'
4
6
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-import
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zach Dennis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-31 00:00:00.000000000 Z
11
+ date: 2023-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -138,6 +138,7 @@ files:
138
138
  - test/models/question.rb
139
139
  - test/models/rule.rb
140
140
  - test/models/tag.rb
141
+ - test/models/tag_alias.rb
141
142
  - test/models/topic.rb
142
143
  - test/models/user.rb
143
144
  - test/models/user_token.rb
@@ -189,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
190
  - !ruby/object:Gem::Version
190
191
  version: '0'
191
192
  requirements: []
192
- rubygems_version: 3.0.3
193
+ rubygems_version: 3.0.3.1
193
194
  signing_key:
194
195
  specification_version: 4
195
196
  summary: Bulk insert extension for ActiveRecord
@@ -234,6 +235,7 @@ test_files:
234
235
  - test/models/question.rb
235
236
  - test/models/rule.rb
236
237
  - test/models/tag.rb
238
+ - test/models/tag_alias.rb
237
239
  - test/models/topic.rb
238
240
  - test/models/user.rb
239
241
  - test/models/user_token.rb