redshift-connector 7.0.2 → 7.2.1

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
- SHA1:
3
- metadata.gz: 4869945b94bf612693b98677cc3e4e9387f42533
4
- data.tar.gz: f920bd5ee6f860615cbfa4926b5a82f59642235c
2
+ SHA256:
3
+ metadata.gz: 6d05034adedce4cea33f24328428eb4823e89224eba62cd3548bf41e329cfe5d
4
+ data.tar.gz: 85b98e33059fcac9e50e505f9eea6cfc53665cf31b66a1de1fc676199150687d
5
5
  SHA512:
6
- metadata.gz: ca4ba82a836040efab25cd5c3484aab7fbc9881833bcb6dc1c8afb391d2b00348b577ac1a722e3d964e9f57a62a602bce38bf6e97917da9b095fa06fe622e477
7
- data.tar.gz: 505f1dd2b14ee460e46c274232d673bad58bd55b88a4558225a54c292177765b72f07514dfc0e59f5f7de4e8b78f373a0ea4c13dfcbc7404e03586e1c4431fa8
6
+ metadata.gz: 6ab6e0528d17951481902ed37679f110bed1718848a17cb962598524e5439e3784dc46b9293222fdf93e0c74ab820d58243e92fc3268172e91019140e99d92dc
7
+ data.tar.gz: 9800067fa5f06ea4268702519650b1155cdb71c212852402e7cf539f9e25a9408a2987f2e77b97ac6551dd8f5d7511e12fca10d9ebabfcaf07653f5f1feac464
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ # Packaging
2
+ *.gem
3
+ /spec/reports/
4
+ /spec/examples.txt
5
+
6
+ # Documents
7
+ /.yardoc/
8
+ /_yardoc/
9
+ /doc/
10
+ /rdoc/
11
+
12
+ # Bundler
13
+ /.bundle/
14
+ /vendor/bundle
15
+ /lib/bundler/man/
16
+ Gemfile.lock
17
+
18
+ # Gem Specific
19
+ test/database.yml
20
+ test/config.rb
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+ gemspec
3
+
4
+ # We need explicit version specification (4 or 5) here,
5
+ # to resolve version dependencies correctly.
6
+ gem 'activerecord', '~> 5.0'
7
+ gem 'mysql2'
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016,2017 Minero Aoki
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/RELEASE.md ADDED
@@ -0,0 +1,76 @@
1
+ # Release Note
2
+
3
+ ## version 7.2.1
4
+
5
+ - no change.
6
+
7
+ ## version 7.2.0
8
+
9
+ - Removes aws-sdk dependency
10
+
11
+ ## version 7.0.2
12
+
13
+ - [fix] RedshiftConnector.foreach did not work
14
+
15
+ ## version 7.0.1
16
+
17
+ - [fix] RedshiftConnector.transport_delta_from_s3, .transport_all_from_s3 were wrongly dropped, restore them.
18
+
19
+ ## version 7.0.0
20
+
21
+ - [INCOMPATIBLE] Library hierarchy changed: redshift-connector/* -> redshift_connector/*. redshift-connector.rb still exists as an entry point for bundler.
22
+ - [new] Exporter becomes pluggable. You can implement your own exporter data source instead of ActiveRecord.
23
+
24
+ ## version 6.0.0
25
+
26
+ - version number change only.
27
+
28
+ ## version 5.6.0
29
+
30
+ - Unifies version 4.x (supports Rails 4) and 5.x (supports Rails 5).
31
+
32
+ ## version 4.5.0 / 5.5.0
33
+
34
+ - [new] Separates S3 access layer to another gem: redshift-connector-data_file
35
+
36
+ ## version 4.4.1 / 5.4.1
37
+
38
+ - [new] New option enable_sort for Connector.foreach, to enforce global sorting.
39
+
40
+ ## version 4.4.0 / 5.4.0
41
+
42
+ - [CHANGE] Drops export-only-once feature (and FORCE environment switch), it is not so useful.
43
+ Exporter now always exports data.
44
+
45
+ ## version 4.3.2 / 5.3.2
46
+
47
+ - [new] Allows reading from S3 signed URL (for separated export/import processes)
48
+
49
+ ## version 4.3.1 / 5.3.1
50
+
51
+ - First release for Rails 5 series.
52
+ - [fix] Add option for AWS multi-regions support
53
+
54
+ ## version 4.3.0
55
+
56
+ - [new] New method RedshiftConnector.foreach to read rows with UNLOAD
57
+
58
+ ## version 4.2.0
59
+
60
+ - [new] New methods RedshiftConnector.transport_delta_from_s3, .transport_all_from_s3 to read from S3
61
+
62
+ ## version 4.1.0
63
+
64
+ - [new] Introduces rebuild operator. New facade method Connector.transport_all.
65
+
66
+ ## version 4.0.2
67
+
68
+ - [fix] Correctly parses UNLOAD-generated CSV (dangerous characeters are escaped by backslash).
69
+
70
+ ## version 4.0.1
71
+
72
+ - [new] Allow configure the default logger by RedshiftConnector.logger=.
73
+
74
+ ## version 4.0.0
75
+
76
+ First release for Rails 4 series.
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ task :test do
2
+ load "#{__dir__}/test/all.rb"
3
+ end
@@ -1,3 +1,3 @@
1
1
  module RedshiftConnector
2
- VERSION = '7.0.2'
2
+ VERSION = '7.2.1'
3
3
  end
@@ -0,0 +1,26 @@
1
+ require_relative 'lib/redshift_connector/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.platform = Gem::Platform::RUBY
5
+ s.name = 'redshift-connector'
6
+ s.version = RedshiftConnector::VERSION
7
+ s.summary = 'Redshift bulk data connector'
8
+ s.description = 'redshift-connector is a bulk data connector for Rails (ActiveRecord).'
9
+ s.license = 'MIT'
10
+
11
+ s.author = ['Minero Aoki']
12
+ s.email = 'aamine@loveruby.net'
13
+ s.homepage = 'https://github.com/bricolages/redshift-connector'
14
+
15
+ s.files = `git ls-files -z`.split("\x0").reject {|f| f.match(%r{^(test|spec|features)/}) }
16
+ s.require_path = 'lib'
17
+
18
+ s.required_ruby_version = '>= 2.1.0'
19
+ s.add_dependency 'redshift-connector-data_file', '>= 7.0.0'
20
+ s.add_dependency 'activerecord'
21
+ s.add_dependency 'activerecord-redshift'
22
+ s.add_dependency 'pg', '~> 0.18.0'
23
+ s.add_dependency 'activerecord-import'
24
+ s.add_development_dependency 'test-unit'
25
+ s.add_development_dependency 'rake'
26
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redshift-connector
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.2
4
+ version: 7.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Minero Aoki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-22 00:00:00.000000000 Z
11
+ date: 2018-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redshift-connector-data_file
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: aws-sdk
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '2.0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '2.0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: test-unit
99
85
  requirement: !ruby/object:Gem::Requirement
@@ -108,20 +94,6 @@ dependencies:
108
94
  - - ">="
109
95
  - !ruby/object:Gem::Version
110
96
  version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: pry
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
97
  - !ruby/object:Gem::Dependency
126
98
  name: rake
127
99
  requirement: !ruby/object:Gem::Requirement
@@ -142,7 +114,12 @@ executables: []
142
114
  extensions: []
143
115
  extra_rdoc_files: []
144
116
  files:
117
+ - ".gitignore"
118
+ - Gemfile
119
+ - LICENSE
145
120
  - README.md
121
+ - RELEASE.md
122
+ - Rakefile
146
123
  - lib/redshift-connector.rb
147
124
  - lib/redshift_connector.rb
148
125
  - lib/redshift_connector/active_record_data_source.rb
@@ -161,18 +138,7 @@ files:
161
138
  - lib/redshift_connector/importer/upsert.rb
162
139
  - lib/redshift_connector/query.rb
163
140
  - lib/redshift_connector/version.rb
164
- - test/all.rb
165
- - test/config.rb
166
- - test/config.rb.example
167
- - test/database.yml
168
- - test/database.yml.example
169
- - test/foreach.rb
170
- - test/helper.rb
171
- - test/item_pvs.ct.mysql
172
- - test/item_pvs.ct.redshift
173
- - test/reader/test_redshift_csv.rb
174
- - test/test_connector.rb
175
- - test/test_s3_import.rb
141
+ - redshift-connector.gemspec
176
142
  homepage: https://github.com/bricolages/redshift-connector
177
143
  licenses:
178
144
  - MIT
@@ -193,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
193
159
  version: '0'
194
160
  requirements: []
195
161
  rubyforge_project:
196
- rubygems_version: 2.6.8
162
+ rubygems_version: 2.7.6
197
163
  signing_key:
198
164
  specification_version: 4
199
165
  summary: Redshift bulk data connector
data/test/all.rb DELETED
@@ -1,3 +0,0 @@
1
- Dir.glob("#{__dir__}/**/test_*.rb").each do |path|
2
- load path
3
- end
data/test/config.rb DELETED
@@ -1,13 +0,0 @@
1
- $TEST_SCHEMA = 'aamine'
2
-
3
- module RedshiftConnector
4
- Exporter.default_data_source = RedshiftConnector::ActiveRecordDataSource.new(Redshift)
5
-
6
- S3Bucket.add(
7
- 'redshift-copy-buffer',
8
- bucket: 'redshift-copy-buffer',
9
- prefix: 'development',
10
- iam_role: 'arn:aws:iam::789035092620:role/RedshiftDevelopers',
11
- default: true
12
- )
13
- end
@@ -1,18 +0,0 @@
1
- module RedshiftConnector
2
- # For test only
3
- $TEST_SCHEMA = 'test'
4
-
5
- Exporter.default_data_source = Redshift
6
-
7
- S3Bucket.add(
8
- 'ENTRY_NAME',
9
- bucket: 'YOUR_BUCKET_NAME',
10
- prefix: 'development',
11
- # When using IAM role
12
- iam_role: 'arn:aws:iam::NNNNNNNNNNNN:role/RRRRRRRRR',
13
- # When using explicit access key
14
- #access_key_id: 'AAAAAAAAAA',
15
- #secret_access_key: 'SSSSSSSSSS',
16
- default: true
17
- )
18
- end
data/test/database.yml DELETED
@@ -1,15 +0,0 @@
1
- mysql:
2
- adapter: mysql2
3
- host: localhost
4
- username: minero-aoki
5
- database: test
6
- encoding: utf8
7
-
8
- redshift:
9
- adapter: redshift
10
- host: dwh.ckpd.co
11
- port: 5439
12
- database: production
13
- username: aamine
14
- password: "3edCVfr$"
15
- encoding: utf8
@@ -1,15 +0,0 @@
1
- mysql:
2
- adapter: mysql2
3
- host: localhost
4
- username: USER_NAME
5
- database: test
6
- encoding: utf8
7
-
8
- redshift:
9
- adapter: redshift
10
- host: HOST_NAME
11
- port: 5439
12
- database: DATABASE_NAME
13
- username: USER_NAME
14
- password: PASSWORD
15
- encoding: utf8
data/test/foreach.rb DELETED
@@ -1,5 +0,0 @@
1
- require_relative 'helper'
2
-
3
- RedshiftConnector.foreach(schema: 'tabemiru', table: 'items', query: 'select id from tabemiru.items where id < 50 order by 1', enable_sort: true) do |row|
4
- p row
5
- end
data/test/helper.rb DELETED
@@ -1,25 +0,0 @@
1
- require 'active_record'
2
- require 'yaml'
3
- require 'logger'
4
-
5
- YAML.load_file("#{__dir__}/database.yml").each do |name, ent|
6
- ActiveRecord::Base.configurations[name] = ent
7
- end
8
-
9
- class BaseConn < ActiveRecord::Base
10
- establish_connection :mysql
11
- self.abstract_class = true
12
- end
13
- class ItemPv < BaseConn
14
- connection
15
- end
16
- class Redshift < ActiveRecord::Base
17
- establish_connection :redshift
18
- end
19
-
20
- require 'redshift-connector'
21
- # This IS REQUIRED to ensure to load mysql2 driver, at least outside of Rails.
22
- ActiveRecord::Import.require_adapter 'mysql2'
23
- require_relative 'config'
24
-
25
- RedshiftConnector.logger = Logger.new($stderr)
@@ -1,11 +0,0 @@
1
- create table item_pvs
2
- ( id bigint(20) primary key
3
- , data_date date not null
4
- , item_id int(11) not null
5
- , pv bigint(20) not null default 0
6
- , uu bigint(20) not null default 0
7
- )
8
- ;
9
-
10
- create unique index item_pvs_idx on item_pvs (id, data_date, item_id) using btree
11
- ;
@@ -1,9 +0,0 @@
1
- create table item_pvs
2
- ( id bigint encode lzo
3
- , data_date date encode lzo
4
- , item_id integer encode lzo
5
- , pv bigint encode lzo
6
- , uu bigint encode lzo
7
- )
8
- sortkey (data_date, item_id)
9
- ;
@@ -1,30 +0,0 @@
1
- require 'test/unit'
2
- require 'redshift-connector/data_file'
3
-
4
- module RedshiftConnector
5
- module Reader
6
- class TestRedshiftCSV < Test::Unit::TestCase
7
- def parse_row(line)
8
- r = RedshiftCSV.new(nil)
9
- r.parse_row(line, 1)
10
- end
11
-
12
- def test_parse_row
13
- assert_equal ['xxx', 'yyyy', 'zzz'],
14
- parse_row(%Q("xxx","yyyy","zzz"\n))
15
-
16
- assert_equal ['xxx', 'yyyy', 'zzz'],
17
- parse_row(%Q( "xxx" , "yyyy","zzz"\t\n))
18
-
19
- assert_equal ['x,x', "y\r\ny", 'z"z', 'a\\a'],
20
- parse_row(%Q("x\\,x","y\\r\\ny","z\\"z","a\\\\a"\n))
21
-
22
- assert_equal ['981179', '2017-01-07', '6', 'show', '99', '3'],
23
- parse_row(%Q("981179","2017-01-07","6","show","99","3"\r\n))
24
-
25
- assert_equal ['981179', '2017-01-07', '6', '852', 'show', '{"page"=>"4"}', '1', '1'],
26
- parse_row(%Q("981179","2017-01-07","6","852","show","{\\"page\\"=>\\"4\\"}","1","1"\n))
27
- end
28
- end
29
- end
30
- end
@@ -1,148 +0,0 @@
1
- require_relative 'helper'
2
- require 'test/unit'
3
-
4
- class TestConnector < Test::Unit::TestCase
5
- def test_connector_upsert
6
- data_date = '2016-11-03'
7
- job = RedshiftConnector.transport_delta(
8
- schema: $TEST_SCHEMA,
9
- table: 'item_pvs',
10
-
11
- txn_id: data_date,
12
- condition: %Q(data_date = date '#{data_date}'),
13
-
14
- columns: %w[id data_date item_id pv uu],
15
- upsert_columns: %w[pv uu],
16
- filter: -> (id, data_date, item_id, pv, uu) {
17
- [id.to_i, data_date, item_id.to_i, pv.to_i, uu.to_i]
18
- }
19
- )
20
- job.execute
21
- end
22
-
23
- def test_connector_delete_insert
24
- data_date = '2016-11-03'
25
- job = RedshiftConnector.transport_delta(
26
- schema: $TEST_SCHEMA,
27
- table: 'item_pvs',
28
-
29
- txn_id: data_date,
30
- condition: %Q(data_date = date '#{data_date}'),
31
- delete_cond: %Q(data_date = date '#{data_date}'),
32
-
33
- columns: %w[id data_date item_id pv uu],
34
- filter: -> (id, data_date, item_id, pv, uu) {
35
- [id.to_i, data_date, item_id.to_i, pv.to_i, uu.to_i]
36
- }
37
- )
38
- job.execute
39
- end
40
-
41
- def test_dup_options
42
- data_date = '2016-11-03'
43
- assert_raise(ArgumentError) {
44
- RedshiftConnector.transport_delta(
45
- schema: $TEST_SCHEMA,
46
- table: 'item_pvs',
47
-
48
- txn_id: data_date,
49
- condition: %Q(data_date = date '#{data_date}'),
50
- delete_cond: %Q(data_date = date '#{data_date}'),
51
-
52
- # Conflicts with delete_cond option
53
- upsert_columns: %w[pv uu],
54
-
55
- columns: %w[id data_date item_id pv uu],
56
- filter: -> (id, data_date, item_id, pv, uu) {
57
- [id.to_i, data_date, item_id.to_i, pv.to_i, uu.to_i]
58
- }
59
- )
60
- }
61
- end
62
-
63
- def test_no_required_option
64
- data_date = '2016-11-03'
65
- assert_raise(ArgumentError) {
66
- RedshiftConnector.transport_delta(
67
- schema: $TEST_SCHEMA,
68
- table: 'item_pvs',
69
-
70
- txn_id: data_date,
71
- condition: %Q(data_date = date '#{data_date}'),
72
-
73
- columns: %w[id data_date item_id pv uu],
74
- filter: -> (id, data_date, item_id, pv, uu) {
75
- [id.to_i, data_date, item_id.to_i, pv.to_i, uu.to_i]
76
- }
77
- )
78
- }
79
- end
80
-
81
- def test_connector_rebuild_truncate
82
- data_date = '2016-11-03'
83
- job = RedshiftConnector.transport_all(
84
- strategy: 'truncate',
85
- schema: $TEST_SCHEMA,
86
- table: 'item_pvs',
87
- txn_id: data_date,
88
- columns: %w[id data_date item_id pv uu],
89
- filter: -> (id, data_date, item_id, pv, uu) {
90
- [id.to_i, data_date, item_id.to_i, pv.to_i, uu.to_i]
91
- }
92
- )
93
- job.execute
94
- end
95
-
96
- def test_connector_rebuild_rename
97
- data_date = '2016-11-03'
98
- job = RedshiftConnector.transport_all(
99
- strategy: 'rename',
100
- schema: $TEST_SCHEMA,
101
- table: 'item_pvs',
102
- txn_id: data_date,
103
- columns: %w[id data_date item_id pv uu],
104
- filter: -> (id, data_date, item_id, pv, uu) {
105
- [id.to_i, data_date, item_id.to_i, pv.to_i, uu.to_i]
106
- }
107
- )
108
- job.execute
109
- end
110
-
111
- def test_connector_src_dest_table
112
- data_date = '2016-11-03'
113
- job = RedshiftConnector.transport_delta(
114
- schema: $TEST_SCHEMA,
115
- src_table: 'item_pvs',
116
- dest_table: 'item_pvs',
117
-
118
- txn_id: data_date,
119
- condition: %Q(data_date = date '#{data_date}'),
120
-
121
- columns: %w[id data_date item_id pv uu],
122
- upsert_columns: %w[pv uu],
123
- filter: -> (id, data_date, item_id, pv, uu) {
124
- [id.to_i, data_date, item_id.to_i, pv.to_i, uu.to_i]
125
- }
126
- )
127
- job.execute
128
- end
129
-
130
- def test_connector_missing_src_dest
131
- data_date = '2016-11-03'
132
- assert_raise(ArgumentError) {
133
- RedshiftConnector.transport_delta(
134
- schema: $TEST_SCHEMA,
135
- src_table: 'item_pvs',
136
-
137
- txn_id: data_date,
138
- condition: %Q(data_date = date '#{data_date}'),
139
-
140
- columns: %w[id data_date item_id pv uu],
141
- upsert_columns: %w[pv uu],
142
- filter: -> (id, data_date, item_id, pv, uu) {
143
- [id.to_i, data_date, item_id.to_i, pv.to_i, uu.to_i]
144
- }
145
- )
146
- }
147
- end
148
- end
@@ -1,32 +0,0 @@
1
- require_relative 'helper'
2
- require 'test/unit'
3
- require 'redshift-connector'
4
-
5
- class TestS3Import < Test::Unit::TestCase
6
- def test_import_delta_tsv
7
- data_date = '2016-11-03'
8
- job = RedshiftConnector.transport_delta_from_s3(
9
- prefix: "#{$TEST_SCHEMA}_export/item_pvs_tsv/#{data_date}/item_pvs.tsv.",
10
- format: :tsv,
11
-
12
- table: 'item_pvs',
13
- columns: %w[id data_date item_id pv uu],
14
- upsert_columns: %w[pv uu]
15
- )
16
- job.execute
17
- end
18
-
19
- def test_import_all
20
- data_date = '2016-11-03'
21
- job = RedshiftConnector.transport_all_from_s3(
22
- strategy: 'truncate',
23
-
24
- prefix: "#{$TEST_SCHEMA}_export/item_pvs_tsv/#{data_date}/item_pvs.tsv.",
25
- format: :tsv,
26
-
27
- table: 'item_pvs',
28
- columns: %w[id data_date item_id pv uu]
29
- )
30
- job.execute
31
- end
32
- end