data_migrater 0.7.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/README.md +24 -51
- data/lib/data_migrater/csv.rb +6 -15
- data/lib/data_migrater/s3.rb +15 -16
- data/lib/data_migrater/version.rb +1 -1
- data/spec/csv/csv_delete_spec.rb +23 -0
- data/spec/csv/csv_spec.rb +8 -10
- data/spec/s3/delete_spec.rb +19 -0
- data/spec/s3/download_spec.rb +22 -15
- data/spec/s3/initialize_spec.rb +16 -36
- metadata +14 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d23aa11964d870b88a42f582ada1573f58a781d08a359cc25eea5e2dbf7dab62
|
4
|
+
data.tar.gz: cd3bbe075f0cc3ff091284ef1a00c23c27a8f725989f269cb33eebd2f7c07ebb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fadf53e7bd9f4eaeb709847d5f73b6a53369eca3a93ee766d0192e56195a940122cc330b687ff93a346f8ca550f7eeb150f2b71d0dd757818f4631330ed0d29
|
7
|
+
data.tar.gz: e6beaa0daecc1926844ee50fe15684a673e5710b7bb3e68ae7eefcc31b508e634079a4fc78649953b1ed1e07257a741bada5640e5327b792d556beb5cc5cccff
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## v1.0.0
|
2
|
+
|
3
|
+
### Break
|
4
|
+
|
5
|
+
- Removes the `tmp_dir` options, now the file will be download at `path` place.
|
6
|
+
|
7
|
+
### Fixes
|
8
|
+
|
9
|
+
- Do not raise error when S3 file does not exist;
|
10
|
+
|
11
|
+
### News
|
12
|
+
|
13
|
+
- Uses `us-east-1` as default region for S3 module;
|
14
|
+
- Adds `csv_delete` method to be able to delete the S3 file.
|
15
|
+
|
16
|
+
### Updates
|
17
|
+
|
18
|
+
- Uses new syntax of SDK S3.
|
19
|
+
|
1
20
|
## v0.7.0
|
2
21
|
|
3
22
|
### News
|
data/README.md
CHANGED
@@ -110,7 +110,7 @@ class MyDataMigration
|
|
110
110
|
def execute
|
111
111
|
# [
|
112
112
|
# { first_name: 'Washington', last_name: 'Botelho' },
|
113
|
-
# { first_name: '
|
113
|
+
# { first_name: 'Vanessa' , last_name: 'Queiroz' }
|
114
114
|
# ]
|
115
115
|
csv.each { |line| Object.create line }
|
116
116
|
end
|
@@ -134,14 +134,14 @@ end
|
|
134
134
|
```
|
135
135
|
|
136
136
|
#### Options
|
137
|
-
|
138
|
-
- `dir`: Directory where CSV is located
|
139
|
-
- `file`: File name
|
140
|
-
- `path`: Composition of `dir
|
137
|
+
|
138
|
+
- `dir`: Directory where CSV is located, by default `db/data_migrate/support/csv`;
|
139
|
+
- `file`: File name, by default is the class name underscored: `my_data_migration.csv`;
|
140
|
+
- `path`: Composition of `dir` + `/` + `file` when you want give a fully qualified path.
|
141
141
|
|
142
142
|
---
|
143
143
|
|
144
|
-
##### CSV Options
|
144
|
+
##### CSV Options
|
145
145
|
|
146
146
|
- `chunk_size`: Batch parse size;
|
147
147
|
- `key_mapping`: Key name alias.
|
@@ -150,14 +150,13 @@ For more CSV options, check the project [Smarter CSV](https://github.com/tilo/sm
|
|
150
150
|
|
151
151
|
## S3
|
152
152
|
|
153
|
-
You can download your CSV directly from [Amazon S3](https://aws.amazon.com/s3) using the module `DataMigrater::CSV` with some configs.
|
154
|
-
You *must* keep the path as `:s3` to activate S3 feature.
|
153
|
+
You can download your CSV directly from [Amazon S3](https://aws.amazon.com/s3) using the module `DataMigrater::CSV` with some configs. You *must* set `provider` as `:s3` to activate S3 feature.
|
155
154
|
|
156
155
|
```ruby
|
157
156
|
class MyDataMigration
|
158
157
|
include DataMigrater::CSV
|
159
158
|
|
160
|
-
data_csv
|
159
|
+
data_csv bucket: 'my-bucket', provider: :s3
|
161
160
|
|
162
161
|
def execute
|
163
162
|
csv.each { |line| Object.create line }
|
@@ -165,41 +164,20 @@ class MyDataMigration
|
|
165
164
|
end
|
166
165
|
```
|
167
166
|
|
168
|
-
|
169
|
-
|
170
|
-
```ruby
|
171
|
-
class MyDataMigration
|
172
|
-
include DataMigrater::CSV
|
173
|
-
|
174
|
-
data_csv path: :s3, file: 'custom-name.csv'
|
175
|
-
|
176
|
-
def execute
|
177
|
-
csv.each { |line| Object.create line }
|
178
|
-
end
|
179
|
-
end
|
180
|
-
```
|
181
|
-
|
182
|
-
By default, the bucket name is `data-migrater`, to change it, just declare the `bucket` options:
|
183
|
-
|
184
|
-
```ruby
|
185
|
-
class MyDataMigration
|
186
|
-
include DataMigrater::CSV
|
187
|
-
|
188
|
-
data_csv path: :s3, bucket: 'custom-bucket'
|
167
|
+
### Credentials
|
189
168
|
|
190
|
-
|
191
|
-
|
192
|
-
end
|
193
|
-
end
|
194
|
-
```
|
195
|
-
|
196
|
-
When file is downloaded, it is keeped in a temporary (`/tmp`) folder waiting to be parsed, using the options `tmp_dir` you change it:
|
169
|
+
By default, when you use the S3 feature, the envs `ACCESS_KEY_ID`, `REGION` (default `us-east-1`) and `SECRET_ACCESS_KEY` will be used.
|
170
|
+
If you do not want export it globally and need to pass it inside you class, just declare de `credentials` options:
|
197
171
|
|
198
172
|
```ruby
|
199
173
|
class MyDataMigration
|
200
174
|
include DataMigrater::CSV
|
201
175
|
|
202
|
-
data_csv
|
176
|
+
data_csv provider: :s3, credentials: {
|
177
|
+
access_key_id: 'foo',
|
178
|
+
region: 'us-east-1',
|
179
|
+
secret_access_key: 'bar'
|
180
|
+
}
|
203
181
|
|
204
182
|
def execute
|
205
183
|
csv.each { |line| Object.create line }
|
@@ -207,34 +185,29 @@ class MyDataMigration
|
|
207
185
|
end
|
208
186
|
```
|
209
187
|
|
210
|
-
|
188
|
+
### CSV Delete
|
211
189
|
|
212
|
-
|
213
|
-
If you do not want export it globally and need to pass it inside you class, just declare de `credentials` options:
|
190
|
+
You can delete the S3 file from your migration after process the CSV.
|
214
191
|
|
215
192
|
```ruby
|
216
193
|
class MyDataMigration
|
217
194
|
include DataMigrater::CSV
|
218
195
|
|
219
|
-
data_csv
|
220
|
-
access_key_id: 'foo',
|
221
|
-
region: 'us-east-1',
|
222
|
-
secret_access_key: 'bar'
|
223
|
-
}
|
196
|
+
data_csv provider: :s3
|
224
197
|
|
225
198
|
def execute
|
226
199
|
csv.each { |line| Object.create line }
|
200
|
+
|
201
|
+
csv_delete
|
227
202
|
end
|
228
203
|
end
|
229
204
|
```
|
230
205
|
|
231
|
-
#### Options
|
206
|
+
#### S3 Options
|
232
207
|
|
233
|
-
- `bucket`:
|
208
|
+
- `bucket`: The bucket name. By default `data-migrater`.
|
234
209
|
- `credentials`: AWS credentials: `access_key_id`, `region` and `secret_access_key`;
|
235
|
-
- `
|
236
|
-
- `path`: `:s3` to indicate the S3 support;
|
237
|
-
- `tmp_dir`: Directory where CSV will be keeped after download.
|
210
|
+
- `provider`: `:s3` to indicate the S3 provider;
|
238
211
|
|
239
212
|
#### Skip Run
|
240
213
|
|
data/lib/data_migrater/csv.rb
CHANGED
@@ -8,7 +8,7 @@ module DataMigrater
|
|
8
8
|
|
9
9
|
included do
|
10
10
|
def csv(processor: ::SmarterCSV)
|
11
|
-
|
11
|
+
s3.download if csv_options.delete(:provider) == :s3
|
12
12
|
|
13
13
|
processor.process csv_path, csv_options
|
14
14
|
end
|
@@ -19,6 +19,10 @@ module DataMigrater
|
|
19
19
|
@csv_path ||= [csv_dir, csv_file].join('/')
|
20
20
|
end
|
21
21
|
|
22
|
+
def csv_delete
|
23
|
+
s3.delete
|
24
|
+
end
|
25
|
+
|
22
26
|
private
|
23
27
|
|
24
28
|
def csv_bucket
|
@@ -37,25 +41,12 @@ module DataMigrater
|
|
37
41
|
self.class.csv_options
|
38
42
|
end
|
39
43
|
|
40
|
-
def csv_s3?
|
41
|
-
csv_path.to_s == 's3'
|
42
|
-
end
|
43
|
-
|
44
|
-
def csv_tmp_dir
|
45
|
-
csv_options.delete(:tmp_dir) || '/tmp'
|
46
|
-
end
|
47
|
-
|
48
44
|
def s3_credentials
|
49
45
|
csv_options.delete(:credentials) || {}
|
50
46
|
end
|
51
47
|
|
52
48
|
def s3
|
53
|
-
DataMigrater::S3.new(
|
54
|
-
credentials: s3_credentials,
|
55
|
-
bucket: csv_bucket,
|
56
|
-
file: csv_file,
|
57
|
-
tmp_dir: csv_tmp_dir
|
58
|
-
)
|
49
|
+
@s3 ||= DataMigrater::S3.new(csv_bucket, s3_credentials, csv_path)
|
59
50
|
end
|
60
51
|
end
|
61
52
|
|
data/lib/data_migrater/s3.rb
CHANGED
@@ -4,43 +4,42 @@ module DataMigrater
|
|
4
4
|
class S3
|
5
5
|
require 'aws-sdk-s3'
|
6
6
|
|
7
|
-
def initialize(bucket
|
7
|
+
def initialize(bucket, credentials, csv_path)
|
8
8
|
@bucket = bucket
|
9
|
-
@credentials =
|
10
|
-
@
|
11
|
-
@tmp_dir = tmp_dir
|
9
|
+
@credentials = default_credentials.merge(credentials)
|
10
|
+
@csv_path = csv_path
|
12
11
|
|
13
12
|
::Aws.config.update @credentials
|
14
13
|
end
|
15
14
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
15
|
+
def delete
|
16
|
+
client.delete_object options
|
17
|
+
end
|
18
|
+
|
19
|
+
def download
|
20
|
+
client.head_object options
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
+
client.get_object options.merge(response_target: @csv_path)
|
23
|
+
rescue Aws::S3::Errors::NotFound
|
24
|
+
[]
|
22
25
|
end
|
23
26
|
|
24
27
|
private
|
25
28
|
|
26
29
|
def client
|
27
|
-
Aws::S3::Client.new
|
30
|
+
@client ||= Aws::S3::Client.new
|
28
31
|
end
|
29
32
|
|
30
33
|
def default_credentials
|
31
34
|
{
|
32
35
|
access_key_id: ENV['AWS_ACCESS_KEY_ID'],
|
33
|
-
region: ENV
|
36
|
+
region: ENV.fetch('AWS_REGION', 'us-east-1'),
|
34
37
|
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
|
35
38
|
}
|
36
39
|
end
|
37
40
|
|
38
|
-
def file_path
|
39
|
-
[@tmp_dir, @file].join('/')
|
40
|
-
end
|
41
|
-
|
42
41
|
def options
|
43
|
-
{ bucket: @bucket, key: @
|
42
|
+
{ bucket: @bucket, key: @csv_path.split('/').last }
|
44
43
|
end
|
45
44
|
end
|
46
45
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe '#csv_delete' do
|
6
|
+
let!(:s3) { instance_double 'DataMigrater::S3' }
|
7
|
+
|
8
|
+
before do
|
9
|
+
stub_const 'Dummy', Class.new
|
10
|
+
|
11
|
+
Dummy.class_eval { include DataMigrater::CSV }
|
12
|
+
Dummy.class_eval { data_csv provider: :s3 }
|
13
|
+
|
14
|
+
allow(DataMigrater::S3).to receive(:new)
|
15
|
+
.with('data-migrater', {}, 'db/data_migrate/support/csv/dummy.csv').and_return s3
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'delegates delete to s3 object' do
|
19
|
+
expect(s3).to receive(:delete)
|
20
|
+
|
21
|
+
Dummy.new.csv_delete
|
22
|
+
end
|
23
|
+
end
|
data/spec/csv/csv_spec.rb
CHANGED
@@ -30,23 +30,21 @@ RSpec.describe '#data_csv' do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
context 'when
|
33
|
+
context 'when provider is s3' do
|
34
34
|
before do
|
35
35
|
stub_const 'Dummy', Class.new
|
36
36
|
|
37
37
|
Dummy.class_eval { include DataMigrater::CSV }
|
38
|
-
Dummy.class_eval { data_csv
|
39
|
-
|
40
|
-
allow(DataMigrater::S3).to receive(:new)
|
41
|
-
|
42
|
-
bucket: 'data-migrater',
|
43
|
-
file: 'dummy.csv',
|
44
|
-
tmp_dir: '/tmp'
|
45
|
-
) { double download: :result }
|
38
|
+
Dummy.class_eval { data_csv provider: :s3 }
|
39
|
+
|
40
|
+
allow(DataMigrater::S3).to receive(:new)
|
41
|
+
.with('data-migrater', {}, 'db/data_migrate/support/csv/dummy.csv').and_return double(download: true)
|
46
42
|
end
|
47
43
|
|
48
44
|
it 'reads csv from s3' do
|
49
|
-
expect(
|
45
|
+
expect(::SmarterCSV).to receive(:process).with('db/data_migrate/support/csv/dummy.csv', {})
|
46
|
+
|
47
|
+
Dummy.new.csv
|
50
48
|
end
|
51
49
|
end
|
52
50
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe DataMigrater::S3, '.delete' do
|
6
|
+
subject(:s3) { described_class.new 'bucket', {}, 'path/dummy.csv' }
|
7
|
+
|
8
|
+
let!(:client) { instance_double('Aws::S3::Client').as_null_object }
|
9
|
+
|
10
|
+
before { allow(Aws::S3::Client).to receive(:new) { client } }
|
11
|
+
|
12
|
+
context 'when file is found' do
|
13
|
+
it 'deletes the file' do
|
14
|
+
expect(client).to receive(:delete_object).with(bucket: 'bucket', key: 'dummy.csv')
|
15
|
+
|
16
|
+
s3.delete
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/spec/s3/download_spec.rb
CHANGED
@@ -3,27 +3,34 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe DataMigrater::S3, '.download' do
|
6
|
-
subject { described_class.new bucket
|
6
|
+
subject(:s3) { described_class.new options[:bucket], {}, 'csv_path' }
|
7
7
|
|
8
|
-
let!(:client)
|
9
|
-
let!(:
|
10
|
-
let!(:processor) { double.as_null_object }
|
11
|
-
let!(:temp_file) { double(File).as_null_object }
|
8
|
+
let!(:client) { double('Aws::S3::Client').as_null_object }
|
9
|
+
let!(:options) { { bucket: 'data-migrater', key: 'csv_path' } }
|
12
10
|
|
13
|
-
before
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
before { allow(Aws::S3::Client).to receive(:new) { client } }
|
12
|
+
|
13
|
+
context 'when file is found' do
|
14
|
+
it 'downloads the file' do
|
15
|
+
expect(client).to receive(:get_object).with(options.merge(response_target: 'csv_path'))
|
17
16
|
|
18
|
-
|
19
|
-
|
17
|
+
s3.download
|
18
|
+
end
|
20
19
|
|
21
|
-
|
20
|
+
it 'returns the value of get object' do
|
21
|
+
expect(client).to receive(:get_object).with(options.merge(response_target: 'csv_path')).and_return :success
|
22
|
+
|
23
|
+
expect(s3.download).to eq :success
|
24
|
+
end
|
22
25
|
end
|
23
26
|
|
24
|
-
|
25
|
-
|
27
|
+
context 'when file is not found' do
|
28
|
+
let!(:error) { Aws::S3::Errors::NotFound.new 'error', 'message' }
|
29
|
+
|
30
|
+
before { allow(client).to receive(:head_object).with(options).and_raise error }
|
26
31
|
|
27
|
-
|
32
|
+
it 'returns an empty array' do
|
33
|
+
expect(s3.download).to eq []
|
34
|
+
end
|
28
35
|
end
|
29
36
|
end
|
data/spec/s3/initialize_spec.rb
CHANGED
@@ -3,59 +3,39 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe DataMigrater::S3, 'initialize' do
|
6
|
+
subject(:s3) { described_class.new 'data-migrater', credentials, 'dummy.csv' }
|
7
|
+
|
6
8
|
before do
|
7
9
|
allow(ENV).to receive(:[]).with('AWS_ACCESS_KEY_ID') { 'AWS_ACCESS_KEY_ID' }
|
8
|
-
allow(ENV).to receive(:
|
10
|
+
allow(ENV).to receive(:fetch).with('AWS_REGION', 'us-east-1') { 'AWS_REGION' }
|
9
11
|
allow(ENV).to receive(:[]).with('AWS_SECRET_ACCESS_KEY') { 'AWS_SECRET_ACCESS_KEY' }
|
10
12
|
end
|
11
13
|
|
12
|
-
context 'when
|
13
|
-
|
14
|
+
context 'when credentials is not given' do
|
15
|
+
let!(:credentials) { {} }
|
16
|
+
|
17
|
+
let!(:credentials_env) do
|
18
|
+
{ access_key_id: 'AWS_ACCESS_KEY_ID', region: 'AWS_REGION', secret_access_key: 'AWS_SECRET_ACCESS_KEY' }
|
19
|
+
end
|
14
20
|
|
15
21
|
it 'caches default values and uses exported envs' do
|
16
|
-
expect(
|
17
|
-
expect(
|
18
|
-
expect(
|
19
|
-
|
20
|
-
expect(subject.instance_variable_get(:@credentials)).to eq(
|
21
|
-
access_key_id: 'AWS_ACCESS_KEY_ID',
|
22
|
-
region: 'AWS_REGION',
|
23
|
-
secret_access_key: 'AWS_SECRET_ACCESS_KEY'
|
24
|
-
)
|
22
|
+
expect(s3.instance_variable_get(:@bucket)).to eq 'data-migrater'
|
23
|
+
expect(s3.instance_variable_get(:@csv_path)).to eq 'dummy.csv'
|
24
|
+
expect(s3.instance_variable_get(:@credentials)).to eq credentials_env
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'updates the aws config' do
|
28
|
-
expect(::Aws.config).to receive(:update).with
|
29
|
-
access_key_id: 'AWS_ACCESS_KEY_ID',
|
30
|
-
region: 'AWS_REGION',
|
31
|
-
secret_access_key: 'AWS_SECRET_ACCESS_KEY'
|
32
|
-
)
|
28
|
+
expect(::Aws.config).to receive(:update).with credentials_env
|
33
29
|
|
34
30
|
subject
|
35
31
|
end
|
36
32
|
end
|
37
33
|
|
38
|
-
context 'when
|
39
|
-
|
40
|
-
described_class.new(
|
41
|
-
bucket: 'data-migrater',
|
42
|
-
file: 'dummy.csv',
|
43
|
-
tmp_dir: '/tmp',
|
44
|
-
|
45
|
-
credentials: {
|
46
|
-
access_key_id: 'access_key_id',
|
47
|
-
region: 'region',
|
48
|
-
secret_access_key: 'secret_access_key'
|
49
|
-
}
|
50
|
-
)
|
51
|
-
end
|
34
|
+
context 'when credentials is given' do
|
35
|
+
let!(:credentials) { { access_key_id: 'access_key_id', region: 'region', secret_access_key: 'secret_access_key' } }
|
52
36
|
|
53
37
|
it 'is used' do
|
54
|
-
expect(::Aws.config).to receive(:update).with
|
55
|
-
access_key_id: 'access_key_id',
|
56
|
-
region: 'region',
|
57
|
-
secret_access_key: 'secret_access_key'
|
58
|
-
)
|
38
|
+
expect(::Aws.config).to receive(:update).with credentials
|
59
39
|
|
60
40
|
subject
|
61
41
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: data_migrater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Washington Botelho
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-05-
|
12
|
+
date: 2019-05-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -162,6 +162,7 @@ files:
|
|
162
162
|
- lib/generators/data_migrater/templates/db/migrate/create_data_migrations.rb
|
163
163
|
- spec/collection_spec.rb
|
164
164
|
- spec/csv/converters_spec.rb
|
165
|
+
- spec/csv/csv_delete_spec.rb
|
165
166
|
- spec/csv/csv_path_spec.rb
|
166
167
|
- spec/csv/csv_spec.rb
|
167
168
|
- spec/csv/options_spec.rb
|
@@ -170,6 +171,7 @@ files:
|
|
170
171
|
- spec/logger/logger_path_spec.rb
|
171
172
|
- spec/migrater_spec.rb
|
172
173
|
- spec/migration_spec.rb
|
174
|
+
- spec/s3/delete_spec.rb
|
173
175
|
- spec/s3/download_spec.rb
|
174
176
|
- spec/s3/initialize_spec.rb
|
175
177
|
- spec/spec_helper.rb
|
@@ -201,20 +203,22 @@ signing_key:
|
|
201
203
|
specification_version: 4
|
202
204
|
summary: A Data Migrator gem
|
203
205
|
test_files:
|
206
|
+
- spec/spec_helper.rb
|
207
|
+
- spec/collection_spec.rb
|
208
|
+
- spec/s3/initialize_spec.rb
|
209
|
+
- spec/s3/delete_spec.rb
|
210
|
+
- spec/s3/download_spec.rb
|
204
211
|
- spec/logger/data_logger_spec.rb
|
205
212
|
- spec/logger/logger_path_spec.rb
|
206
|
-
- spec/
|
207
|
-
- spec/support/database_cleaner.rb
|
208
|
-
- spec/support/common.rb
|
213
|
+
- spec/migration_spec.rb
|
209
214
|
- spec/support/migrate.rb
|
215
|
+
- spec/support/common.rb
|
210
216
|
- spec/support/csv/dummy.csv
|
211
|
-
- spec/
|
217
|
+
- spec/support/database_cleaner.rb
|
212
218
|
- spec/migrater_spec.rb
|
213
|
-
- spec/s3/download_spec.rb
|
214
|
-
- spec/s3/initialize_spec.rb
|
215
|
-
- spec/data_migration_spec.rb
|
216
|
-
- spec/migration_spec.rb
|
217
219
|
- spec/csv/csv_spec.rb
|
218
220
|
- spec/csv/options_spec.rb
|
219
221
|
- spec/csv/csv_path_spec.rb
|
222
|
+
- spec/csv/csv_delete_spec.rb
|
220
223
|
- spec/csv/converters_spec.rb
|
224
|
+
- spec/data_migration_spec.rb
|