activerecord-import 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +2 -0
- data/LICENSE +56 -0
- data/README.markdown +38 -0
- data/Rakefile +1 -1
- data/activerecord-import.gemspec +1 -0
- data/lib/activerecord-import.rb +2 -1
- data/lib/activerecord-import/active_record/adapters/jdbcpostgresql_adapter.rb +6 -0
- data/lib/activerecord-import/adapters/em_mysql2_adapter.rb +1 -1
- data/lib/activerecord-import/adapters/mysql2_adapter.rb +2 -2
- data/lib/activerecord-import/base.rb +10 -8
- data/lib/activerecord-import/em_mysql2.rb +1 -1
- data/lib/activerecord-import/import.rb +1 -1
- data/lib/activerecord-import/mysql.rb +1 -2
- data/lib/activerecord-import/mysql2.rb +1 -2
- data/lib/activerecord-import/postgresql.rb +1 -2
- data/lib/activerecord-import/sqlite3.rb +1 -2
- data/lib/activerecord-import/synchronize.rb +1 -0
- data/lib/activerecord-import/version.rb +1 -1
- data/test/adapters/jdbcpostgresql.rb +1 -0
- data/test/jdbcpostgresql/import_test.rb +6 -0
- data/test/support/active_support/test_case_extensions.rb +3 -3
- data/test/synchronize_test.rb +12 -1
- data/test/test_helper.rb +1 -1
- metadata +11 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d8742c99d2600b0f4e4c425ef0a427f46f5f220
|
4
|
+
data.tar.gz: 2c421e2f980400b03efc42f087bd68179edd5f78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 092393e90fe7bebb3eed9a5c51aca467afe5b64d664d5b1888b25cc6b9c5e2cfdcdbd04505c736e22a4e8d40d9be0a5bd26f2c7f709213927d530f575b81d115
|
7
|
+
data.tar.gz: d130c2a565701477b2344599b267f0bc45f0f2e99f0bc88ac81e54f35b152993558d06340888a12a8245db963e51249b9885ba68d7532d01760c3c626e1f662f
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/LICENSE
ADDED
@@ -0,0 +1,56 @@
|
|
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.
|
data/README.markdown
CHANGED
@@ -18,6 +18,44 @@ Use activerecord-import 0.2.11. As of activerecord-import 0.3.0 we are relying o
|
|
18
18
|
|
19
19
|
For more information on activerecord-import please see its wiki: https://github.com/zdennis/activerecord-import/wiki
|
20
20
|
|
21
|
+
## Additional Adapters
|
22
|
+
Additional adapters can be provided by gems external to activerecord-import by providing an adapter that matches the naming convention setup by activerecord-import (and subsequently activerecord) for dynamically loading adapters. This involves also providing a folder on the load path that follows the activerecord-import naming convention to allow activerecord-import to dynamically load the file.
|
23
|
+
|
24
|
+
When `ActiveRecord::Import.require_adapter("fake_name")` is called the require will be:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
require 'activerecord-import/active_record/adapters/fake_name_adapter'
|
28
|
+
```
|
29
|
+
|
30
|
+
This allows an external gem to dyanmically add an adapter without the need to add any file/code to the core activerecord-import gem.
|
31
|
+
|
32
|
+
### Load Path Setup
|
33
|
+
To understand how rubygems loads code you can reference the following:
|
34
|
+
|
35
|
+
http://guides.rubygems.org/patterns/#loading_code
|
36
|
+
|
37
|
+
And an example of how active_record dynamically load adapters:
|
38
|
+
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/connection_specification.rb
|
39
|
+
|
40
|
+
In summary, when a gem is loaded rubygems adds the `lib` folder of the gem to the global load path `$LOAD_PATH` so that all `require` lookups will not propegate through all of the folders on the load path. When a `require` is issued each folder on the `$LOAD_PATH` is checked for the file and/or folder referenced. This allows a gem (like activerecord-import) to define push the activerecord-import folder (or namespace) on the `$LOAD_PATH` and any adapters provided by activerecord-import will be found by rubygems when the require is issued.
|
41
|
+
|
42
|
+
If `fake_name` adapter is needed by a gem (potentially called `activerecord-import-fake_name`) then the folder structure should look as follows:
|
43
|
+
|
44
|
+
```bash
|
45
|
+
activerecord-import-fake_name/
|
46
|
+
|-- activerecord-import-fake_name.gemspec
|
47
|
+
|-- lib
|
48
|
+
| |-- activerecord-import-fake_name
|
49
|
+
| | |-- version.rb
|
50
|
+
| |-- activerecord-import
|
51
|
+
| | |-- active_record
|
52
|
+
| | | |-- adapters
|
53
|
+
| | | |-- fake_name_adapter.rb
|
54
|
+
|--activerecord-import-fake_name.rb
|
55
|
+
```
|
56
|
+
|
57
|
+
When rubygems pushes the `lib` folder onto the load path a `require` will now find `activerecord-import/active_record/adapters/fake_name_adapter` as it runs through the lookup process for a ruby file under that path in `$LOAD_PATH`
|
58
|
+
|
21
59
|
# License
|
22
60
|
|
23
61
|
This is licensed under the ruby license.
|
data/Rakefile
CHANGED
@@ -13,7 +13,7 @@ namespace :display do
|
|
13
13
|
end
|
14
14
|
task :default => ["display:notice"]
|
15
15
|
|
16
|
-
ADAPTERS = %w(mysql mysql2 em_mysql2 jdbcmysql postgresql sqlite3 seamless_database_pool mysqlspatial mysql2spatial spatialite postgis)
|
16
|
+
ADAPTERS = %w(mysql mysql2 em_mysql2 jdbcmysql jdbcpostgresql postgresql sqlite3 seamless_database_pool mysqlspatial mysql2spatial spatialite postgis)
|
17
17
|
ADAPTERS.each do |adapter|
|
18
18
|
namespace :test do
|
19
19
|
desc "Runs #{adapter} database tests."
|
data/activerecord-import.gemspec
CHANGED
@@ -7,6 +7,7 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.summary = "Bulk-loading extension for ActiveRecord"
|
8
8
|
gem.description = "Extraction of the ActiveRecord::Base#import functionality from ar-extensions for Rails 3 and beyond"
|
9
9
|
gem.homepage = "http://github.com/zdennis/activerecord-import"
|
10
|
+
gem.license = "Ruby"
|
10
11
|
|
11
12
|
gem.files = `git ls-files`.split($\)
|
12
13
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
data/lib/activerecord-import.rb
CHANGED
@@ -10,7 +10,8 @@ end
|
|
10
10
|
|
11
11
|
ActiveSupport.on_load(:active_record_connection_established) do |connection_pool|
|
12
12
|
if !ActiveRecord.const_defined?(:Import) || !ActiveRecord::Import.respond_to?(:load_from_connection_pool)
|
13
|
-
require
|
13
|
+
require "activerecord-import/base"
|
14
14
|
end
|
15
|
+
|
15
16
|
ActiveRecord::Import.load_from_connection_pool connection_pool
|
16
17
|
end
|
@@ -3,7 +3,7 @@ require "active_record"
|
|
3
3
|
require "active_record/version"
|
4
4
|
|
5
5
|
module ActiveRecord::Import
|
6
|
-
AdapterPath =
|
6
|
+
AdapterPath = "activerecord-import/active_record/adapters"
|
7
7
|
|
8
8
|
def self.base_adapter(adapter)
|
9
9
|
case adapter
|
@@ -18,7 +18,11 @@ module ActiveRecord::Import
|
|
18
18
|
# Loads the import functionality for a specific database adapter
|
19
19
|
def self.require_adapter(adapter)
|
20
20
|
require File.join(AdapterPath,"/abstract_adapter")
|
21
|
-
|
21
|
+
begin
|
22
|
+
require File.join(AdapterPath,"/#{base_adapter(adapter)}_adapter")
|
23
|
+
rescue LoadError
|
24
|
+
# fallback
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
# Loads the import functionality for the passed in ActiveRecord connection
|
@@ -27,9 +31,7 @@ module ActiveRecord::Import
|
|
27
31
|
end
|
28
32
|
end
|
29
33
|
|
30
|
-
|
31
|
-
|
32
|
-
require
|
33
|
-
require
|
34
|
-
require this_dir.join("synchronize").to_s
|
35
|
-
require this_dir.join("value_sets_parser").to_s
|
34
|
+
require 'activerecord-import/import'
|
35
|
+
require 'activerecord-import/active_record/adapters/abstract_adapter'
|
36
|
+
require 'activerecord-import/synchronize'
|
37
|
+
require 'activerecord-import/value_sets_parser'
|
@@ -370,7 +370,7 @@ class ActiveRecord::Base
|
|
370
370
|
|
371
371
|
if supports_on_duplicate_key_update?
|
372
372
|
if options[:on_duplicate_key_update]
|
373
|
-
options[:on_duplicate_key_update] << key.to_sym if options[:on_duplicate_key_update].is_a?(Array)
|
373
|
+
options[:on_duplicate_key_update] << key.to_sym if options[:on_duplicate_key_update].is_a?(Array) && !options[:on_duplicate_key_update].include?(key.to_sym)
|
374
374
|
options[:on_duplicate_key_update][key.to_sym] = key.to_sym if options[:on_duplicate_key_update].is_a?(Hash)
|
375
375
|
else
|
376
376
|
options[:on_duplicate_key_update] = [ key.to_sym ]
|
@@ -44,6 +44,7 @@ module ActiveRecord # :nodoc:
|
|
44
44
|
instance.clear_association_cache
|
45
45
|
instance.instance_variable_set '@attributes', matched_instance.attributes
|
46
46
|
instance.instance_variable_set '@attributes_cache', {}
|
47
|
+
instance.changed_attributes.clear
|
47
48
|
# Since the instance now accurately reflects the record in
|
48
49
|
# the database, ensure that instance.persisted? is true.
|
49
50
|
instance.instance_variable_set '@new_record', false
|
@@ -0,0 +1 @@
|
|
1
|
+
ENV["ARE_DB"] = "jdbcpostgresql"
|
@@ -0,0 +1,6 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
#require File.expand_path(File.dirname(__FILE__) + '/../support/postgresql/assertions')
|
4
|
+
require File.expand_path(File.dirname(__FILE__) + '/../support/postgresql/import_examples')
|
5
|
+
|
6
|
+
should_support_postgresql_import_functionality
|
@@ -47,10 +47,10 @@ class ActiveSupport::TestCase
|
|
47
47
|
alias_method :context, :describe
|
48
48
|
|
49
49
|
def let(name, &blk)
|
50
|
-
values = {}
|
51
50
|
define_method(name) do
|
52
|
-
|
53
|
-
|
51
|
+
instance_variable_name = "@__let_#{name}"
|
52
|
+
return instance_variable_get(instance_variable_name) if instance_variable_defined?(instance_variable_name)
|
53
|
+
instance_variable_set(instance_variable_name, instance_eval(&blk))
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
data/test/synchronize_test.rb
CHANGED
@@ -12,11 +12,22 @@ describe ".synchronize" do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "reloads data for the specified records" do
|
15
|
-
|
15
|
+
Topic.synchronize topics
|
16
16
|
|
17
17
|
actual_titles = topics.map(&:title)
|
18
18
|
assert_equal "#{titles[0]}_haha", actual_titles[0], "the first record was not correctly updated"
|
19
19
|
assert_equal "#{titles[1]}_haha", actual_titles[1], "the second record was not correctly updated"
|
20
20
|
assert_equal "#{titles[2]}_haha", actual_titles[2], "the third record was not correctly updated"
|
21
21
|
end
|
22
|
+
|
23
|
+
it "the synchronized records aren't dirty" do
|
24
|
+
# Update the in memory records so they're dirty
|
25
|
+
topics.each { |topic| topic.title = 'dirty title' }
|
26
|
+
|
27
|
+
Topic.synchronize topics
|
28
|
+
|
29
|
+
assert_equal false, topics[0].changed?, "the first record was dirty"
|
30
|
+
assert_equal false, topics[1].changed?, "the second record was dirty"
|
31
|
+
assert_equal false, topics[2].changed?, "the third record was dirty"
|
32
|
+
end
|
22
33
|
end
|
data/test/test_helper.rb
CHANGED
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.
|
4
|
+
version: 0.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: 2014-03-13 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
|
- Brewfile
|
51
51
|
- Gemfile
|
52
|
+
- LICENSE
|
52
53
|
- README.markdown
|
53
54
|
- Rakefile
|
54
55
|
- activerecord-import.gemspec
|
@@ -72,6 +73,7 @@ files:
|
|
72
73
|
- lib/activerecord-import/active_record/adapters/abstract_adapter.rb
|
73
74
|
- lib/activerecord-import/active_record/adapters/em_mysql2_adapter.rb
|
74
75
|
- lib/activerecord-import/active_record/adapters/jdbcmysql_adapter.rb
|
76
|
+
- lib/activerecord-import/active_record/adapters/jdbcpostgresql_adapter.rb
|
75
77
|
- lib/activerecord-import/active_record/adapters/mysql2_adapter.rb
|
76
78
|
- lib/activerecord-import/active_record/adapters/mysql_adapter.rb
|
77
79
|
- lib/activerecord-import/active_record/adapters/postgresql_adapter.rb
|
@@ -95,6 +97,7 @@ files:
|
|
95
97
|
- lib/activerecord-import/version.rb
|
96
98
|
- test/adapters/em_mysql2.rb
|
97
99
|
- test/adapters/jdbcmysql.rb
|
100
|
+
- test/adapters/jdbcpostgresql.rb
|
98
101
|
- test/adapters/mysql.rb
|
99
102
|
- test/adapters/mysql2.rb
|
100
103
|
- test/adapters/mysql2spatial.rb
|
@@ -108,6 +111,7 @@ files:
|
|
108
111
|
- test/em_mysql2/import_test.rb
|
109
112
|
- test/import_test.rb
|
110
113
|
- test/jdbcmysql/import_test.rb
|
114
|
+
- test/jdbcpostgresql/import_test.rb
|
111
115
|
- test/models/book.rb
|
112
116
|
- test/models/group.rb
|
113
117
|
- test/models/topic.rb
|
@@ -133,7 +137,8 @@ files:
|
|
133
137
|
- test/value_sets_bytes_parser_test.rb
|
134
138
|
- test/value_sets_records_parser_test.rb
|
135
139
|
homepage: http://github.com/zdennis/activerecord-import
|
136
|
-
licenses:
|
140
|
+
licenses:
|
141
|
+
- Ruby
|
137
142
|
metadata: {}
|
138
143
|
post_install_message:
|
139
144
|
rdoc_options: []
|
@@ -151,13 +156,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
156
|
version: '0'
|
152
157
|
requirements: []
|
153
158
|
rubyforge_project:
|
154
|
-
rubygems_version: 2.
|
159
|
+
rubygems_version: 2.2.1
|
155
160
|
signing_key:
|
156
161
|
specification_version: 4
|
157
162
|
summary: Bulk-loading extension for ActiveRecord
|
158
163
|
test_files:
|
159
164
|
- test/adapters/em_mysql2.rb
|
160
165
|
- test/adapters/jdbcmysql.rb
|
166
|
+
- test/adapters/jdbcpostgresql.rb
|
161
167
|
- test/adapters/mysql.rb
|
162
168
|
- test/adapters/mysql2.rb
|
163
169
|
- test/adapters/mysql2spatial.rb
|
@@ -171,6 +177,7 @@ test_files:
|
|
171
177
|
- test/em_mysql2/import_test.rb
|
172
178
|
- test/import_test.rb
|
173
179
|
- test/jdbcmysql/import_test.rb
|
180
|
+
- test/jdbcpostgresql/import_test.rb
|
174
181
|
- test/models/book.rb
|
175
182
|
- test/models/group.rb
|
176
183
|
- test/models/topic.rb
|