activerecord-import 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cbf4c01d6a3f043ed541f7331d6a19e651cbc035fcc3030b17f1e741a6d4e8b7
4
- data.tar.gz: a740491de16c78d4d94ccb428c69342fd8a809f235ce9d42fc41237a4d15c7e6
3
+ metadata.gz: 123bf726b813b21067d888221d627a03796f262de7e1b70c318def898b26d3c0
4
+ data.tar.gz: d6e6a3031944ac841587a8c29c701bc1a15667a888771333ad7198b085b2e8b4
5
5
  SHA512:
6
- metadata.gz: 48e62637f6493cd5446cd78aee3db3b4a58e646fb0bc07d3583a662f89f52b03c2a079c83fc2cae807c5577f922e1e3219354cf36dff8ae8cc81ae68266e711f
7
- data.tar.gz: 2f40f5fd61975589f8af932a3dbf5b6d14d2cfc6884ebe7019c85956c8c380d3faebffb1b600a7fa04536fe262ed40688946c8d35b8cf5b1bfedd1ddff20af5a
6
+ metadata.gz: 4409c4e0f048ea6272329d34de680d6314168784fdd4f244712ea37725254c66e4f091d302c0598e8232c31fbb9b94152197ee5dd660aa36d5df937839bf197d
7
+ data.tar.gz: 5c0e49836fdf38e4f95c863aa5c0841592d169063b5a455a90d2a16c8a65736b8837e05f371227b9c8e4a23c406e990421e1e3f7a1cb37e1e4d3f9b91b36521e
@@ -1,3 +1,15 @@
1
+ ## Changes in 1.0.5
2
+
3
+ ### Fixes
4
+
5
+ * Allow serialized attributes to be returned from import. Thanks to @timanovsky, @jkowens via \#660.
6
+ * Return ActiveRecord::Connection from
7
+ ActiveREcord::Base#establish_connection. Thanks to @reverentF via
8
+ \#663.
9
+ * Support PostgreSQL array. Thanks to @ujihisa via \#669.
10
+ * Skip loading association ids when column changed. Thanks to @Aristat
11
+ via \#673.
12
+
1
13
  ## Changes in 1.0.4
2
14
 
3
15
  ### Fixes
data/Gemfile CHANGED
@@ -47,6 +47,7 @@ end
47
47
 
48
48
  platforms :ruby do
49
49
  gem "pry-byebug"
50
+ gem "pry", "~> 0.12.0"
50
51
  gem "rb-readline"
51
52
  end
52
53
 
data/LICENSE CHANGED
@@ -1,56 +1,21 @@
1
- Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
2
- You can redistribute it and/or modify it under either the terms of the
3
- 2-clause BSDL (see the file BSDL), or the conditions below:
4
-
5
- 1. You may make and give away verbatim copies of the source form of the
6
- software without restriction, provided that you duplicate all of the
7
- original copyright notices and associated disclaimers.
8
-
9
- 2. You may modify your copy of the software in any way, provided that
10
- you do at least ONE of the following:
11
-
12
- a) place your modifications in the Public Domain or otherwise
13
- make them Freely Available, such as by posting said
14
- modifications to Usenet or an equivalent medium, or by allowing
15
- the author to include your modifications in the software.
16
-
17
- b) use the modified software only within your corporation or
18
- organization.
19
-
20
- c) give non-standard binaries non-standard names, with
21
- instructions on where to get the original software distribution.
22
-
23
- d) make other distribution arrangements with the author.
24
-
25
- 3. You may distribute the software in object code or binary form,
26
- provided that you do at least ONE of the following:
27
-
28
- a) distribute the binaries and library files of the software,
29
- together with instructions (in the manual page or equivalent)
30
- on where to get the original distribution.
31
-
32
- b) accompany the distribution with the machine-readable source of
33
- the software.
34
-
35
- c) give non-standard binaries non-standard names, with
36
- instructions on where to get the original software distribution.
37
-
38
- d) make other distribution arrangements with the author.
39
-
40
- 4. You may modify and include the part of the software into any other
41
- software (possibly commercial). But some files in the distribution
42
- are not written by the author, so that they are not under these terms.
43
-
44
- For the list of those files and their copying conditions, see the
45
- file LEGAL.
46
-
47
- 5. The scripts and library files supplied as input to or produced as
48
- output from the software do not automatically fall under the
49
- copyright of the software, but belong to whomever generated them,
50
- and may be sold commercially, and may be aggregated with this
51
- software.
52
-
53
- 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
54
- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
55
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56
- PURPOSE.
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Zach Dennis <zach.dennis@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -60,6 +60,8 @@ The gem provides the following high-level features:
60
60
 
61
61
  #### Introduction
62
62
 
63
+ This gem adds an `import` method (or `bulk_import`, for compatibility with gems like `elasticsearch-model`; see [Conflicts With Other Gems](#conflicts-with-other-gems)) to ActiveRecord classes.
64
+
63
65
  Without `activerecord-import`, you'd write something like this:
64
66
 
65
67
  ```ruby
@@ -231,7 +233,8 @@ Book.import columns, books, batch_size: 2
231
233
 
232
234
  #### Recursive
233
235
 
234
- NOTE: This only works with PostgreSQL.
236
+ NOTE: This only works with PostgreSQL and ActiveRecord objects. This won't work with
237
+ hashes or arrays as recursive inputs.
235
238
 
236
239
  Assume that Books <code>has_many</code> Reviews.
237
240
 
@@ -613,7 +616,7 @@ You can triage issues which may include reproducing bug reports or asking for vi
613
616
 
614
617
  # License
615
618
 
616
- This is licensed under the ruby license.
619
+ This is licensed under the MIT license.
617
620
 
618
621
  # Author
619
622
 
@@ -7,7 +7,7 @@ Gem::Specification.new do |gem|
7
7
  gem.summary = "Bulk insert extension for ActiveRecord"
8
8
  gem.description = "A library for bulk inserting data using ActiveRecord."
9
9
  gem.homepage = "http://github.com/zdennis/activerecord-import"
10
- gem.license = "Ruby"
10
+ gem.license = "MIT"
11
11
 
12
12
  gem.files = `git ls-files`.split($\)
13
13
  gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
16
16
  gem.require_paths = ["lib"]
17
17
  gem.version = ActiveRecord::Import::VERSION
18
18
 
19
- gem.required_ruby_version = ">= 1.9.2"
19
+ gem.required_ruby_version = ">= 2.0.0"
20
20
 
21
21
  gem.add_runtime_dependency "activerecord", ">= 3.2"
22
22
  gem.add_development_dependency "rake"
@@ -241,8 +241,9 @@ end
241
241
 
242
242
  module ActiveRecord::Import::Connection
243
243
  def establish_connection(args = nil)
244
- super(args)
244
+ conn = super(args)
245
245
  ActiveRecord::Import.load_from_connection_pool connection_pool
246
+ conn
246
247
  end
247
248
  end
248
249
 
@@ -835,6 +836,19 @@ class ActiveRecord::Base
835
836
  end
836
837
  end
837
838
 
839
+ deserialize_value = lambda do |column, value|
840
+ column = columns_hash[column]
841
+ return value unless column
842
+ if respond_to?(:type_caster)
843
+ type = type_for_attribute(column.name)
844
+ type.deserialize(value)
845
+ elsif column.respond_to?(:type_cast_from_database)
846
+ column.type_cast_from_database(value)
847
+ else
848
+ value
849
+ end
850
+ end
851
+
838
852
  if models.size == import_result.results.size
839
853
  columns = Array(options[:returning])
840
854
  single_column = "#{columns.first}=" if columns.size == 1
@@ -842,10 +856,12 @@ class ActiveRecord::Base
842
856
  model = models[index]
843
857
 
844
858
  if single_column
845
- model.send(single_column, result)
859
+ val = deserialize_value.call(columns.first, result)
860
+ model.send(single_column, val)
846
861
  else
847
862
  columns.each_with_index do |column, col_index|
848
- model.send("#{column}=", result[col_index])
863
+ val = deserialize_value.call(column, result[col_index])
864
+ model.send("#{column}=", val)
849
865
  end
850
866
  end
851
867
  end
@@ -866,10 +882,12 @@ class ActiveRecord::Base
866
882
 
867
883
  # Sync belongs_to association ids with foreign key field
868
884
  def load_association_ids(model)
885
+ changed_columns = model.changed
869
886
  association_reflections = model.class.reflect_on_all_associations(:belongs_to)
870
887
  association_reflections.each do |association_reflection|
871
888
  column_name = association_reflection.foreign_key
872
889
  next if association_reflection.options[:polymorphic]
890
+ next if changed_columns.include?(column_name)
873
891
  association = model.association(association_reflection.name)
874
892
  association = association.target
875
893
  next if association.blank? || model.public_send(column_name).present?
@@ -949,7 +967,7 @@ class ActiveRecord::Base
949
967
  elsif column
950
968
  if respond_to?(:type_caster) # Rails 5.0 and higher
951
969
  type = type_for_attribute(column.name)
952
- val = type.type == :boolean ? type.cast(val) : type.serialize(val)
970
+ val = !type.respond_to?(:subtype) && type.type == :boolean ? type.cast(val) : type.serialize(val)
953
971
  connection_memo.quote(val)
954
972
  elsif column.respond_to?(:type_cast_from_user) # Rails 4.2
955
973
  connection_memo.quote(column.type_cast_from_user(val), column)
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Import
3
- VERSION = "1.0.4".freeze
3
+ VERSION = "1.0.5".freeze
4
4
  end
5
5
  end
@@ -16,6 +16,7 @@ ActiveRecord::Schema.define do
16
16
 
17
17
  create_table :vendors, id: :uuid, force: :cascade do |t|
18
18
  t.string :name, null: true
19
+ t.text :hours
19
20
  t.text :preferences
20
21
 
21
22
  if t.respond_to?(:json)
@@ -127,6 +127,15 @@ def should_support_postgresql_import_functionality
127
127
  end
128
128
  end
129
129
 
130
+ context "when a returning column is a serialized attribute" do
131
+ let(:vendor) { Vendor.new(hours: { monday: '8-5' }) }
132
+ let(:result) { Vendor.import([vendor], returning: %w(hours)) }
133
+
134
+ it "creates records" do
135
+ assert_difference("Vendor.count", +1) { result }
136
+ end
137
+ end
138
+
130
139
  context "when primary key and returning overlap" do
131
140
  let(:result) { Book.import(books, returning: %w(id title)) }
132
141
 
@@ -138,6 +138,15 @@ def should_support_recursive_import
138
138
  books.each do |book|
139
139
  assert_equal book.topic_id, second_new_topic.id
140
140
  end
141
+
142
+ books.each { |book| book.topic_id = nil }
143
+ assert_no_difference "Book.count", books.size do
144
+ Book.import books, validate: false, on_duplicate_key_update: [:topic_id]
145
+ end
146
+
147
+ books.each do |book|
148
+ assert_equal book.topic_id, nil
149
+ end
141
150
  end
142
151
 
143
152
  unless ENV["SKIP_COMPOSITE_PK"]
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.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zach Dennis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-24 00:00:00.000000000 Z
11
+ date: 2020-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -168,7 +168,7 @@ files:
168
168
  - test/value_sets_records_parser_test.rb
169
169
  homepage: http://github.com/zdennis/activerecord-import
170
170
  licenses:
171
- - Ruby
171
+ - MIT
172
172
  metadata: {}
173
173
  post_install_message:
174
174
  rdoc_options: []
@@ -178,7 +178,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
178
178
  requirements:
179
179
  - - ">="
180
180
  - !ruby/object:Gem::Version
181
- version: 1.9.2
181
+ version: 2.0.0
182
182
  required_rubygems_version: !ruby/object:Gem::Requirement
183
183
  requirements:
184
184
  - - ">="