activerecord-import 0.11.0 → 0.12.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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/Gemfile +4 -2
  4. data/README.markdown +8 -7
  5. data/Rakefile +1 -1
  6. data/benchmarks/benchmark.rb +2 -1
  7. data/benchmarks/lib/cli_parser.rb +1 -1
  8. data/benchmarks/lib/{mysql_benchmark.rb → mysql2_benchmark.rb} +6 -7
  9. data/gemfiles/3.1.gemfile +0 -2
  10. data/gemfiles/3.2.gemfile +0 -2
  11. data/gemfiles/4.0.gemfile +0 -2
  12. data/gemfiles/4.1.gemfile +0 -2
  13. data/gemfiles/4.2.gemfile +0 -2
  14. data/gemfiles/5.0.gemfile +0 -2
  15. data/lib/activerecord-import/adapters/abstract_adapter.rb +11 -2
  16. data/lib/activerecord-import/adapters/mysql_adapter.rb +14 -2
  17. data/lib/activerecord-import/adapters/postgresql_adapter.rb +105 -1
  18. data/lib/activerecord-import/base.rb +0 -1
  19. data/lib/activerecord-import/import.rb +92 -21
  20. data/lib/activerecord-import/version.rb +1 -1
  21. data/test/database.yml.sample +0 -12
  22. data/test/import_test.rb +1 -1
  23. data/test/jdbcmysql/import_test.rb +2 -2
  24. data/test/jdbcpostgresql/import_test.rb +0 -1
  25. data/test/models/book.rb +4 -4
  26. data/test/models/promotion.rb +3 -0
  27. data/test/models/question.rb +3 -0
  28. data/test/models/rule.rb +3 -0
  29. data/test/models/topic.rb +1 -1
  30. data/test/mysql2/import_test.rb +2 -3
  31. data/test/mysqlspatial2/import_test.rb +2 -2
  32. data/test/postgresql/import_test.rb +4 -0
  33. data/test/schema/generic_schema.rb +19 -2
  34. data/test/support/{mysql/assertions.rb → assertions.rb} +12 -3
  35. data/test/support/factories.rb +14 -0
  36. data/test/support/mysql/import_examples.rb +28 -119
  37. data/test/support/postgresql/import_examples.rb +156 -1
  38. data/test/support/shared_examples/on_duplicate_key_update.rb +92 -0
  39. data/test/test_helper.rb +5 -1
  40. data/test/travis/build.sh +12 -8
  41. data/test/travis/database.yml +0 -12
  42. metadata +14 -23
  43. data/lib/activerecord-import/active_record/adapters/em_mysql2_adapter.rb +0 -8
  44. data/lib/activerecord-import/active_record/adapters/mysql_adapter.rb +0 -6
  45. data/lib/activerecord-import/em_mysql2.rb +0 -7
  46. data/lib/activerecord-import/mysql.rb +0 -7
  47. data/test/adapters/em_mysql2.rb +0 -1
  48. data/test/adapters/mysql.rb +0 -1
  49. data/test/adapters/mysqlspatial.rb +0 -1
  50. data/test/em_mysql2/import_test.rb +0 -6
  51. data/test/mysql/import_test.rb +0 -6
  52. data/test/mysqlspatial/import_test.rb +0 -6
  53. data/test/support/em-synchrony_extensions.rb +0 -13
@@ -0,0 +1,92 @@
1
+ def should_support_basic_on_duplicate_key_update
2
+ describe "#import" do
3
+ extend ActiveSupport::TestCase::ImportAssertions
4
+
5
+ macro(:perform_import){ raise "supply your own #perform_import in a context below" }
6
+ macro(:updated_topic){ Topic.find(@topic.id) }
7
+
8
+ context "with :on_duplicate_key_update and validation checks turned off" do
9
+ asssertion_group(:should_support_on_duplicate_key_update) do
10
+ should_not_update_fields_not_mentioned
11
+ should_update_foreign_keys
12
+ should_not_update_created_at_on_timestamp_columns
13
+ should_update_updated_at_on_timestamp_columns
14
+ end
15
+
16
+ let(:columns){ %w( id title author_name author_email_address parent_id ) }
17
+ let(:values){ [ [ 99, "Book", "John Doe", "john@doe.com", 17 ] ] }
18
+ let(:updated_values){ [ [ 99, "Book - 2nd Edition", "Author Should Not Change", "johndoe@example.com", 57 ] ] }
19
+
20
+ macro(:perform_import) do |*opts|
21
+ Topic.import columns, updated_values, opts.extract_options!.merge(:on_duplicate_key_update => update_columns , :validate => false)
22
+ end
23
+
24
+ setup do
25
+ Topic.import columns, values, :validate => false
26
+ @topic = Topic.find 99
27
+ end
28
+
29
+ context "using an empty array" do
30
+ let(:update_columns){ [] }
31
+ should_not_update_fields_not_mentioned
32
+ should_update_updated_at_on_timestamp_columns
33
+ end
34
+
35
+ context "using string column names" do
36
+ let(:update_columns){ [ "title", "author_email_address", "parent_id" ] }
37
+ should_support_on_duplicate_key_update
38
+ should_update_fields_mentioned
39
+ end
40
+
41
+ context "using symbol column names" do
42
+ let(:update_columns){ [ :title, :author_email_address, :parent_id ] }
43
+ should_support_on_duplicate_key_update
44
+ should_update_fields_mentioned
45
+ end
46
+ end
47
+
48
+ context "with a table that has a non-standard primary key" do
49
+ let(:columns){ [ :promotion_id, :code ] }
50
+ let(:values){ [ [ 1, 'DISCOUNT1' ] ] }
51
+ let(:updated_values){ [ [ 1, 'DISCOUNT2'] ] }
52
+ let(:update_columns){ [ :code ] }
53
+
54
+ macro(:perform_import) do |*opts|
55
+ Promotion.import columns, updated_values, opts.extract_options!.merge(:on_duplicate_key_update => update_columns, :validate => false)
56
+ end
57
+ macro(:updated_promotion){ Promotion.find(@promotion.promotion_id) }
58
+
59
+ setup do
60
+ Promotion.import columns, values, :validate => false
61
+ @promotion = Promotion.find 1
62
+ end
63
+
64
+ it "should update specified columns" do
65
+ perform_import
66
+ assert_equal 'DISCOUNT2', updated_promotion.code
67
+ end
68
+ end
69
+
70
+ context "with :on_duplicate_key_update turned off" do
71
+ let(:columns){ %w( id title author_name author_email_address parent_id ) }
72
+ let(:values){ [ [ 100, "Book", "John Doe", "john@doe.com", 17 ] ] }
73
+ let(:updated_values){ [ [ 100, "Book - 2nd Edition", "This should raise an exception", "john@nogo.com", 57 ] ] }
74
+
75
+ macro(:perform_import) do |*opts|
76
+ # `:on_duplicate_key_update => false` is the tested feature
77
+ Topic.import columns, updated_values, opts.extract_options!.merge(:on_duplicate_key_update => false, :validate => false)
78
+ end
79
+
80
+ setup do
81
+ Topic.import columns, values, :validate => false
82
+ @topic = Topic.find 100
83
+ end
84
+
85
+ it "should raise ActiveRecord::RecordNotUnique" do
86
+ assert_raise ActiveRecord::RecordNotUnique do
87
+ perform_import
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -10,7 +10,7 @@ ENV["RAILS_ENV"] = "test"
10
10
  require "bundler"
11
11
  Bundler.setup
12
12
 
13
- require 'pry'
13
+ require 'pry' unless RbConfig::CONFIG["RUBY_INSTALL_NAME"] =~ /jruby/
14
14
 
15
15
  require "active_record"
16
16
  require "active_record/fixtures"
@@ -55,3 +55,7 @@ Dir[File.dirname(__FILE__) + "/models/*.rb"].each{ |file| require file }
55
55
 
56
56
  # Prevent this deprecation warning from breaking the tests.
57
57
  Rake::FileList.send(:remove_method, :import)
58
+
59
+ if ENV['AR_VERSION'].to_f >= 4.2
60
+ ActiveSupport::TestCase.test_order = :sorted
61
+ end
@@ -1,22 +1,26 @@
1
1
  #!/bin/bash
2
- set -e
3
- set +x
2
+ # set -e
3
+ # set +x
4
4
 
5
5
  function run {
6
- echo "Running: AR_VERSION=$AR_VERSION $@"
7
- $@
6
+ statement=$@
7
+ logfile=$4.log
8
+ $statement &> $logfile
9
+ if [ $? != 0 ] ; then
10
+ printf "AR_VERSION=$AR_VERSION $statement \e[31mFAILED\e[0m\n"
11
+ cat $logfile
12
+ else
13
+ printf "AR_VERSION=$AR_VERSION $statement \e[32mPASSED\e[0m\n"
14
+ fi
8
15
  }
9
16
 
10
17
  for activerecord_version in "3.1" "3.2" "4.0" "4.1" "4.2" "5.0" ; do
11
18
  export AR_VERSION=$activerecord_version
12
19
 
13
- bundle update activerecord
20
+ bundle update activerecord > /dev/null
14
21
 
15
- run bundle exec rake test:em_mysql2 # Run tests for em_mysql2
16
- run bundle exec rake test:mysql # Run tests for mysql
17
22
  run bundle exec rake test:mysql2 # Run tests for mysql2
18
23
  run bundle exec rake test:mysql2spatial # Run tests for mysql2spatial
19
- run bundle exec rake test:mysqlspatial # Run tests for mysqlspatial
20
24
  run bundle exec rake test:postgis # Run tests for postgis
21
25
  run bundle exec rake test:postgresql # Run tests for postgresql
22
26
  run bundle exec rake test:seamless_database_pool # Run tests for seamless_database_pool
@@ -5,25 +5,13 @@ common: &common
5
5
  host: localhost
6
6
  database: activerecord_import_test
7
7
 
8
- mysql: &mysql
9
- <<: *common
10
- adapter: mysql
11
-
12
8
  mysql2: &mysql2
13
9
  <<: *common
14
10
  adapter: mysql2
15
11
 
16
- mysqlspatial:
17
- <<: *mysql
18
-
19
12
  mysql2spatial:
20
13
  <<: *mysql2
21
14
 
22
- em_mysql2:
23
- <<: *common
24
- adapter: em_mysql2
25
- pool: 5
26
-
27
15
  seamless_database_pool:
28
16
  <<: *common
29
17
  adapter: seamless_database_pool
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: 0.11.0
4
+ version: 0.12.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: 2016-01-23 00:00:00.000000000 Z
11
+ date: 2016-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -49,6 +49,7 @@ files:
49
49
  - ".gitignore"
50
50
  - ".travis.yml"
51
51
  - Brewfile
52
+ - CHANGELOG.md
52
53
  - Gemfile
53
54
  - LICENSE
54
55
  - README.markdown
@@ -59,7 +60,7 @@ files:
59
60
  - benchmarks/lib/base.rb
60
61
  - benchmarks/lib/cli_parser.rb
61
62
  - benchmarks/lib/float.rb
62
- - benchmarks/lib/mysql_benchmark.rb
63
+ - benchmarks/lib/mysql2_benchmark.rb
63
64
  - benchmarks/lib/output_to_csv.rb
64
65
  - benchmarks/lib/output_to_html.rb
65
66
  - benchmarks/models/test_innodb.rb
@@ -74,11 +75,9 @@ files:
74
75
  - gemfiles/5.0.gemfile
75
76
  - lib/activerecord-import.rb
76
77
  - lib/activerecord-import/active_record/adapters/abstract_adapter.rb
77
- - lib/activerecord-import/active_record/adapters/em_mysql2_adapter.rb
78
78
  - lib/activerecord-import/active_record/adapters/jdbcmysql_adapter.rb
79
79
  - lib/activerecord-import/active_record/adapters/jdbcpostgresql_adapter.rb
80
80
  - lib/activerecord-import/active_record/adapters/mysql2_adapter.rb
81
- - lib/activerecord-import/active_record/adapters/mysql_adapter.rb
82
81
  - lib/activerecord-import/active_record/adapters/postgresql_adapter.rb
83
82
  - lib/activerecord-import/active_record/adapters/seamless_database_pool_adapter.rb
84
83
  - lib/activerecord-import/active_record/adapters/sqlite3_adapter.rb
@@ -89,29 +88,23 @@ files:
89
88
  - lib/activerecord-import/adapters/postgresql_adapter.rb
90
89
  - lib/activerecord-import/adapters/sqlite3_adapter.rb
91
90
  - lib/activerecord-import/base.rb
92
- - lib/activerecord-import/em_mysql2.rb
93
91
  - lib/activerecord-import/import.rb
94
- - lib/activerecord-import/mysql.rb
95
92
  - lib/activerecord-import/mysql2.rb
96
93
  - lib/activerecord-import/postgresql.rb
97
94
  - lib/activerecord-import/sqlite3.rb
98
95
  - lib/activerecord-import/synchronize.rb
99
96
  - lib/activerecord-import/value_sets_parser.rb
100
97
  - lib/activerecord-import/version.rb
101
- - test/adapters/em_mysql2.rb
102
98
  - test/adapters/jdbcmysql.rb
103
99
  - test/adapters/jdbcpostgresql.rb
104
- - test/adapters/mysql.rb
105
100
  - test/adapters/mysql2.rb
106
101
  - test/adapters/mysql2spatial.rb
107
- - test/adapters/mysqlspatial.rb
108
102
  - test/adapters/postgis.rb
109
103
  - test/adapters/postgresql.rb
110
104
  - test/adapters/seamless_database_pool.rb
111
105
  - test/adapters/spatialite.rb
112
106
  - test/adapters/sqlite3.rb
113
107
  - test/database.yml.sample
114
- - test/em_mysql2/import_test.rb
115
108
  - test/import_test.rb
116
109
  - test/jdbcmysql/import_test.rb
117
110
  - test/jdbcpostgresql/import_test.rb
@@ -119,11 +112,12 @@ files:
119
112
  - test/models/chapter.rb
120
113
  - test/models/end_note.rb
121
114
  - test/models/group.rb
115
+ - test/models/promotion.rb
116
+ - test/models/question.rb
117
+ - test/models/rule.rb
122
118
  - test/models/topic.rb
123
119
  - test/models/widget.rb
124
- - test/mysql/import_test.rb
125
120
  - test/mysql2/import_test.rb
126
- - test/mysqlspatial/import_test.rb
127
121
  - test/mysqlspatial2/import_test.rb
128
122
  - test/postgis/import_test.rb
129
123
  - test/postgresql/import_test.rb
@@ -132,12 +126,12 @@ files:
132
126
  - test/schema/version.rb
133
127
  - test/sqlite3/import_test.rb
134
128
  - test/support/active_support/test_case_extensions.rb
135
- - test/support/em-synchrony_extensions.rb
129
+ - test/support/assertions.rb
136
130
  - test/support/factories.rb
137
131
  - test/support/generate.rb
138
- - test/support/mysql/assertions.rb
139
132
  - test/support/mysql/import_examples.rb
140
133
  - test/support/postgresql/import_examples.rb
134
+ - test/support/shared_examples/on_duplicate_key_update.rb
141
135
  - test/synchronize_test.rb
142
136
  - test/test_helper.rb
143
137
  - test/travis/build.sh
@@ -169,20 +163,16 @@ signing_key:
169
163
  specification_version: 4
170
164
  summary: Bulk-loading extension for ActiveRecord
171
165
  test_files:
172
- - test/adapters/em_mysql2.rb
173
166
  - test/adapters/jdbcmysql.rb
174
167
  - test/adapters/jdbcpostgresql.rb
175
- - test/adapters/mysql.rb
176
168
  - test/adapters/mysql2.rb
177
169
  - test/adapters/mysql2spatial.rb
178
- - test/adapters/mysqlspatial.rb
179
170
  - test/adapters/postgis.rb
180
171
  - test/adapters/postgresql.rb
181
172
  - test/adapters/seamless_database_pool.rb
182
173
  - test/adapters/spatialite.rb
183
174
  - test/adapters/sqlite3.rb
184
175
  - test/database.yml.sample
185
- - test/em_mysql2/import_test.rb
186
176
  - test/import_test.rb
187
177
  - test/jdbcmysql/import_test.rb
188
178
  - test/jdbcpostgresql/import_test.rb
@@ -190,11 +180,12 @@ test_files:
190
180
  - test/models/chapter.rb
191
181
  - test/models/end_note.rb
192
182
  - test/models/group.rb
183
+ - test/models/promotion.rb
184
+ - test/models/question.rb
185
+ - test/models/rule.rb
193
186
  - test/models/topic.rb
194
187
  - test/models/widget.rb
195
- - test/mysql/import_test.rb
196
188
  - test/mysql2/import_test.rb
197
- - test/mysqlspatial/import_test.rb
198
189
  - test/mysqlspatial2/import_test.rb
199
190
  - test/postgis/import_test.rb
200
191
  - test/postgresql/import_test.rb
@@ -203,12 +194,12 @@ test_files:
203
194
  - test/schema/version.rb
204
195
  - test/sqlite3/import_test.rb
205
196
  - test/support/active_support/test_case_extensions.rb
206
- - test/support/em-synchrony_extensions.rb
197
+ - test/support/assertions.rb
207
198
  - test/support/factories.rb
208
199
  - test/support/generate.rb
209
- - test/support/mysql/assertions.rb
210
200
  - test/support/mysql/import_examples.rb
211
201
  - test/support/postgresql/import_examples.rb
202
+ - test/support/shared_examples/on_duplicate_key_update.rb
212
203
  - test/synchronize_test.rb
213
204
  - test/test_helper.rb
214
205
  - test/travis/build.sh
@@ -1,8 +0,0 @@
1
- require "em-synchrony"
2
- require "em-synchrony/mysql2"
3
- require "em-synchrony/activerecord"
4
- require "activerecord-import/adapters/em_mysql2_adapter"
5
-
6
- class ActiveRecord::ConnectionAdapters::EMMysql2Adapter
7
- include ActiveRecord::Import::EMMysql2Adapter
8
- end
@@ -1,6 +0,0 @@
1
- require "active_record/connection_adapters/mysql_adapter"
2
- require "activerecord-import/adapters/mysql_adapter"
3
-
4
- class ActiveRecord::ConnectionAdapters::MysqlAdapter
5
- include ActiveRecord::Import::MysqlAdapter
6
- end
@@ -1,7 +0,0 @@
1
- warn <<-MSG
2
- [DEPRECATION] loading activerecord-import via 'require "activerecord-import/<adapter-name>"'
3
- is deprecated. Update to autorequire using 'require "activerecord-import"'. See
4
- http://github.com/zdennis/activerecord-import/wiki/Requiring for more information
5
- MSG
6
-
7
- require "activerecord-import"
@@ -1,7 +0,0 @@
1
- warn <<-MSG
2
- [DEPRECATION] loading activerecord-import via 'require "activerecord-import/<adapter-name>"'
3
- is deprecated. Update to autorequire using 'require "activerecord-import"'. See
4
- http://github.com/zdennis/activerecord-import/wiki/Requiring for more information
5
- MSG
6
-
7
- require "activerecord-import"
@@ -1 +0,0 @@
1
- ENV["ARE_DB"] = "em_mysql2"
@@ -1 +0,0 @@
1
- ENV["ARE_DB"] = "mysql"
@@ -1 +0,0 @@
1
- ENV["ARE_DB"] = "mysqlspatial"
@@ -1,6 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/../support/mysql/assertions')
4
- require File.expand_path(File.dirname(__FILE__) + '/../support/mysql/import_examples')
5
-
6
- should_support_mysql_import_functionality
@@ -1,6 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/../support/mysql/assertions')
4
- require File.expand_path(File.dirname(__FILE__) + '/../support/mysql/import_examples')
5
-
6
- should_support_mysql_import_functionality
@@ -1,6 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
-
3
- require File.expand_path(File.dirname(__FILE__) + '/../support/mysql/assertions')
4
- require File.expand_path(File.dirname(__FILE__) + '/../support/mysql/import_examples')
5
-
6
- should_support_mysql_import_functionality
@@ -1,13 +0,0 @@
1
- if defined?(EM::Synchrony) && ActiveRecord::VERSION::STRING >= "4.0"
2
- module EM::Synchrony
3
- module ActiveRecord
4
- module Adapter
5
- def reset_transaction
6
- @transaction_manager = ::ActiveRecord::ConnectionAdapters::TransactionManager.new(self)
7
- end
8
-
9
- delegate :open_transactions, :current_transaction, :begin_transaction, :commit_transaction, :rollback_transaction, to: :transaction_manager
10
- end
11
- end
12
- end
13
- end