activerecord-import 0.14.1 → 0.15.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e0eab7d65f5982398dc619a9b74658f8686fca73
4
- data.tar.gz: e2eee39f139a44acf97c11f84a834c70e1833418
3
+ metadata.gz: 7c1b3ac9675567f96311618bfcf008c344559183
4
+ data.tar.gz: 796d923d2db2f0317c832081e2ea336b9f933a7c
5
5
  SHA512:
6
- metadata.gz: 4b12aea6f47a5f45920c58a227a1f62f445f9fb7f33e7226c17c1c3c0bfc0d680bac38d24342bcb3aa847f46c15cddfa1a8f10cc9e946ca0ba52e0ea43afced7
7
- data.tar.gz: 7ebeae0718cc45a693d986db6f544eadad3c10dcff580403634afbbcd87074cca999a67cf960ed5bb0b438d77737cf09154b88ff701b1068c70cd3a4586a46c7
6
+ metadata.gz: 17a0387cd93c752b91f8cee9bf0fa311463e927debf83141a759e277d5e632aa7f468fa0b36a082d54adad0596cae40f31002f699b6189c0b00ce1b072e666c9
7
+ data.tar.gz: 587d1a167feb65558bf10208404a23bc409c6a4f48e8dd64cc32e0e2af76e1f9b81247a17658c47de102d29a0b8b4619a021d1b78bde61aa00fa5403b38c2aaa
@@ -1,8 +1,24 @@
1
+ ## Changes in 0.15.0
2
+
3
+ ### New Features
4
+
5
+ * An ArgumentError is now raised if when no `conflict_target` or `conflict_name` is provided or can be determined when using the `on_duplicate_key_update` option for PostgreSQL. Thanks to @jkowens via \#290
6
+ * Support for Rails 5.0 final release for all except the JDBC driver which is not yet updated to support Rails 5.0
7
+
8
+ ### Fixes
9
+
10
+ * activerecord-import no longer modifies a value array inside of the given values array when called with `import(columns, values)`. Thanks to @jkowens via \#291
11
+
12
+ ### Misc
13
+
14
+ * `raise_error` is used to raise errors for ActiveRecord 5.0. Thanks to @couragecourag via \#294 `raise_record_invalid` has been
15
+
16
+
1
17
  ## Changes in 0.14.1
2
18
 
3
19
  ### Fixes
4
20
 
5
- * JRuby/JDBCDriver with PostgreSQL will no longer raise a JDBCDriver error when using the :no_returning boolean option. Thanks to @jkowens via \#287
21
+ * JRuby/JDBCDriver with PostgreSQL will no longer raise a JDBCDriver error when using the :no_returning boolean option. Thanks to @jkowens via \#287
6
22
 
7
23
  ## Changes in 0.14.0
8
24
 
@@ -26,7 +42,6 @@
26
42
  * Code cleanup, removal of deprecated `alias_method_chain`. Thanks to @codeodor via \#271
27
43
 
28
44
 
29
-
30
45
  ## Changes in 0.13.0
31
46
 
32
47
  ### New Features
@@ -1,3 +1,7 @@
1
1
  platforms :ruby do
2
2
  gem 'activerecord', '~> 4.2.0'
3
3
  end
4
+
5
+ platforms :jruby do
6
+ gem 'activerecord', '~> 4.2.0'
7
+ end
@@ -1,3 +1,3 @@
1
1
  platforms :ruby do
2
- gem 'activerecord', '~> 5.0.0.beta3'
2
+ gem 'activerecord', '~> 5.0.0'
3
3
  end
@@ -113,15 +113,16 @@ module ActiveRecord::Import::PostgreSQLAdapter
113
113
  def sql_for_conflict_target( args = {} )
114
114
  constraint_name = args[:constraint_name]
115
115
  conflict_target = args[:conflict_target]
116
- if constraint_name
116
+ if constraint_name.present?
117
117
  "ON CONSTRAINT #{constraint_name} "
118
- elsif conflict_target
119
- '(' << Array( conflict_target ).join( ', ' ) << ') '
118
+ elsif conflict_target.present?
119
+ '(' << Array( conflict_target ).reject( &:empty? ).join( ', ' ) << ') '
120
120
  end
121
121
  end
122
122
 
123
123
  def sql_for_default_conflict_target( table_name )
124
- "(#{primary_key( table_name )}) "
124
+ conflict_target = primary_key( table_name )
125
+ "(#{conflict_target}) " if conflict_target
125
126
  end
126
127
 
127
128
  # Return true if the statement is a duplicate key record error
@@ -367,13 +367,13 @@ class ActiveRecord::Base
367
367
  # supports 2-element array and array
368
368
  elsif args.size == 2 && args.first.is_a?( Array ) && args.last.is_a?( Array )
369
369
  column_names, array_of_attributes = args
370
+ array_of_attributes = array_of_attributes.map(&:dup)
370
371
  else
371
372
  raise ArgumentError, "Invalid arguments!"
372
373
  end
373
374
 
374
375
  # dup the passed in array so we don't modify it unintentionally
375
376
  column_names = column_names.dup
376
- array_of_attributes = array_of_attributes.dup
377
377
 
378
378
  # Force the primary key col into the insert if it's not
379
379
  # on the list and we are using a sequence and stuff a nil
@@ -394,7 +394,11 @@ class ActiveRecord::Base
394
394
  models.each_with_index do |model, i|
395
395
  model = model.dup if options[:recursive]
396
396
  next if model.valid?(options[:validate_with_context])
397
- model.send(:raise_record_invalid) if options[:raise_error]
397
+ if options[:raise_error] && model.respond_to?(:raise_validation_error, true) # Rails 5.0 and higher
398
+ model.send(:raise_validation_error)
399
+ elsif options[:raise_error] # Rails 3.2, 4.0, 4.1 and 4.2
400
+ model.send(:raise_record_invalid)
401
+ end
398
402
  array_of_attributes[i] = nil
399
403
  failed << model
400
404
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Import
3
- VERSION = "0.14.1".freeze
3
+ VERSION = "0.15.0".freeze
4
4
  end
5
5
  end
@@ -29,7 +29,8 @@ describe "#import" do
29
29
 
30
30
  it "should not modify the passed in values array" do
31
31
  assert_nothing_raised do
32
- values = [%w(foo bar)].freeze
32
+ record = %w(foo bar).freeze
33
+ values = [record].freeze
33
34
  Topic.import %w(title author_name), values
34
35
  end
35
36
  end
@@ -170,27 +170,56 @@ def should_support_postgresql_upsert_functionality
170
170
  should_update_fields_mentioned
171
171
  end
172
172
 
173
- context "with no :conflict_target or :constraint_name" do
173
+ context "default to the primary key" do
174
174
  let(:columns) { %w( id title author_name author_email_address parent_id ) }
175
175
  let(:values) { [[100, "Book", "John Doe", "john@doe.com", 17]] }
176
176
  let(:updated_values) { [[100, "Book - 2nd Edition", "Author Should Not Change", "johndoe@example.com", 57]] }
177
-
178
- macro(:perform_import) do |*opts|
179
- Topic.import columns, updated_values, opts.extract_options!.merge(on_duplicate_key_update: { columns: update_columns }, validate: false)
180
- end
177
+ let(:update_columns) { [:title, :author_email_address, :parent_id] }
181
178
 
182
179
  setup do
183
180
  Topic.import columns, values, validate: false
184
181
  @topic = Topic.find 100
185
182
  end
186
183
 
187
- context "default to the primary key" do
188
- let(:update_columns) { [:title, :author_email_address, :parent_id] }
184
+ context "with no :conflict_target or :constraint_name" do
185
+ macro(:perform_import) do |*opts|
186
+ Topic.import columns, updated_values, opts.extract_options!.merge(on_duplicate_key_update: { columns: update_columns }, validate: false)
187
+ end
188
+
189
+ should_support_on_duplicate_key_update
190
+ should_update_fields_mentioned
191
+ end
192
+
193
+ context "with empty value for :conflict_target" do
194
+ macro(:perform_import) do |*opts|
195
+ Topic.import columns, updated_values, opts.extract_options!.merge(on_duplicate_key_update: { conflict_target: [], columns: update_columns }, validate: false)
196
+ end
197
+
198
+ should_support_on_duplicate_key_update
199
+ should_update_fields_mentioned
200
+ end
201
+
202
+ context "with empty value for :constraint_name" do
203
+ macro(:perform_import) do |*opts|
204
+ Topic.import columns, updated_values, opts.extract_options!.merge(on_duplicate_key_update: { constraint_name: '', columns: update_columns }, validate: false)
205
+ end
206
+
189
207
  should_support_on_duplicate_key_update
190
208
  should_update_fields_mentioned
191
209
  end
192
210
  end
193
211
 
212
+ context "with no :conflict_target or :constraint_name" do
213
+ context "with no primary key" do
214
+ it "raises ArgumentError" do
215
+ error = assert_raises ArgumentError do
216
+ Widget.import Build(1, :widgets), on_duplicate_key_update: [:data], validate: false
217
+ end
218
+ assert_match(/Expected :conflict_target or :constraint_name to be specified/, error.message)
219
+ end
220
+ end
221
+ end
222
+
194
223
  context "with no :columns" do
195
224
  let(:columns) { %w( id title author_name author_email_address ) }
196
225
  let(:values) { [[100, "Book", "John Doe", "john@doe.com"]] }
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.14.1
4
+ version: 0.15.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-06-22 00:00:00.000000000 Z
11
+ date: 2016-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord