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.
- checksums.yaml +4 -4
- data/.github/workflows/test.yaml +7 -1
- data/.rubocop.yml +74 -8
- data/.rubocop_todo.yml +6 -16
- data/Brewfile +3 -1
- data/CHANGELOG.md +18 -0
- data/Gemfile +5 -3
- data/README.markdown +8 -6
- data/Rakefile +2 -0
- data/activerecord-import.gemspec +2 -1
- data/benchmarks/benchmark.rb +5 -3
- 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 +2 -0
- data/gemfiles/7.0.gemfile +3 -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 +26 -18
- data/lib/activerecord-import/adapters/postgresql_adapter.rb +63 -42
- data/lib/activerecord-import/adapters/sqlite3_adapter.rb +33 -25
- data/lib/activerecord-import/base.rb +3 -1
- data/lib/activerecord-import/import.rb +60 -32
- 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 +2 -0
- 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 +21 -0
- 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 +2 -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 +2 -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 +9 -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 +40 -1
- 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 +2 -0
- data/test/support/sqlite3/import_examples.rb +2 -1
- data/test/synchronize_test.rb +2 -0
- data/test/test_helper.rb +11 -3
- data/test/value_sets_bytes_parser_test.rb +3 -1
- data/test/value_sets_records_parser_test.rb +3 -1
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
data/test/synchronize_test.rb
CHANGED
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/
|
|
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__)
|
|
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__)
|
|
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)
|
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
|
+
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:
|
|
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
|