forklift_etl 1.1.7 → 1.1.8
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.
- data/Gemfile.lock +7 -7
- data/lib/forklift/patterns/mysql_patterns.rb +10 -2
- data/lib/forklift/transports/mysql.rb +11 -9
- data/lib/forklift/version.rb +1 -1
- data/spec/integration/mysql_spec.rb +20 -0
- metadata +17 -6
- checksums.yaml +0 -15
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
forklift_etl (1.1.
|
4
|
+
forklift_etl (1.1.8)
|
5
5
|
activesupport (~> 4.0, >= 4.0.0)
|
6
6
|
elasticsearch (~> 1.0, >= 1.0.0)
|
7
7
|
lumberjack (~> 1.0, >= 1.0.0)
|
@@ -11,7 +11,7 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
activesupport (4.1.
|
14
|
+
activesupport (4.1.5)
|
15
15
|
i18n (~> 0.6, >= 0.6.9)
|
16
16
|
json (~> 1.7, >= 1.7.7)
|
17
17
|
minitest (~> 5.1)
|
@@ -52,16 +52,16 @@ GEM
|
|
52
52
|
rspec-core (~> 3.0.0)
|
53
53
|
rspec-expectations (~> 3.0.0)
|
54
54
|
rspec-mocks (~> 3.0.0)
|
55
|
-
rspec-core (3.0.
|
55
|
+
rspec-core (3.0.4)
|
56
56
|
rspec-support (~> 3.0.0)
|
57
|
-
rspec-expectations (3.0.
|
57
|
+
rspec-expectations (3.0.4)
|
58
58
|
diff-lcs (>= 1.2.0, < 2.0)
|
59
59
|
rspec-support (~> 3.0.0)
|
60
|
-
rspec-mocks (3.0.
|
60
|
+
rspec-mocks (3.0.4)
|
61
61
|
rspec-support (~> 3.0.0)
|
62
|
-
rspec-support (3.0.
|
62
|
+
rspec-support (3.0.4)
|
63
63
|
thread_safe (0.3.4)
|
64
|
-
tzinfo (1.2.
|
64
|
+
tzinfo (1.2.2)
|
65
65
|
thread_safe (~> 0.1)
|
66
66
|
|
67
67
|
PLATFORMS
|
@@ -69,9 +69,17 @@ module Forklift
|
|
69
69
|
|
70
70
|
def self.can_incremental_pipe?(source, from_table, destination, to_table, matcher=source.default_matcher)
|
71
71
|
return false unless source.tables.include?(from_table)
|
72
|
-
return false unless source.columns(from_table, source.current_database).include?(matcher)
|
73
72
|
return false unless destination.tables.include?(to_table)
|
74
|
-
|
73
|
+
source_cols = source.columns(from_table, source.current_database)
|
74
|
+
destination_cols = destination.columns(to_table, destination.current_database)
|
75
|
+
return false unless source_cols.include?(matcher)
|
76
|
+
return false unless destination_cols.include?(matcher)
|
77
|
+
source_cols.each do |source_col|
|
78
|
+
return false unless destination_cols.include?(source_col)
|
79
|
+
end
|
80
|
+
destination_cols.each do |destination_col|
|
81
|
+
return false unless source_cols.include?(destination_col)
|
82
|
+
end
|
75
83
|
true
|
76
84
|
end
|
77
85
|
|
@@ -68,10 +68,20 @@ module Forklift
|
|
68
68
|
if data.length > 0
|
69
69
|
columns = columns(table, database)
|
70
70
|
data.each do |d|
|
71
|
-
|
71
|
+
|
72
|
+
if crash_on_extral_col == false
|
73
|
+
d.each do |k,v|
|
74
|
+
unless columns.include?(k.to_s)
|
75
|
+
q("ALTER TABLE `#{database}`.`#{table}` ADD `#{k}` #{sql_type(v)} NULL DEFAULT NULL;")
|
76
|
+
columns = columns(table, database)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
72
81
|
if(to_update == true && !d[primary_key.to_sym].nil?)
|
73
82
|
q("DELETE FROM `#{database}`.`#{table}` WHERE `#{primary_key}` = #{d[primary_key.to_sym]}")
|
74
83
|
end
|
84
|
+
|
75
85
|
insert_q = "INSERT INTO `#{database}`.`#{table}` (#{safe_columns(d.keys)}) VALUES (#{safe_values(d.values)});"
|
76
86
|
q(insert_q)
|
77
87
|
end
|
@@ -247,14 +257,6 @@ module Forklift
|
|
247
257
|
return a.join(', ')
|
248
258
|
end
|
249
259
|
|
250
|
-
def clean_to_columns(row, columns)
|
251
|
-
r = {}
|
252
|
-
row.each do |k,v|
|
253
|
-
r[k] = row[k] if columns.include?(k.to_s)
|
254
|
-
end
|
255
|
-
r
|
256
|
-
end
|
257
|
-
|
258
260
|
def safe_values(values)
|
259
261
|
a = []
|
260
262
|
values.each do |v|
|
data/lib/forklift/version.rb
CHANGED
@@ -135,6 +135,26 @@ describe 'mysql' do
|
|
135
135
|
expect(cols).to eql ['id', 'thing', 'number', 'updated_at']
|
136
136
|
end
|
137
137
|
|
138
|
+
it "can add columns to exiting tables when new keys are provided" do
|
139
|
+
table = "users"
|
140
|
+
raw = SpecClient.mysql('forklift_test_source_a')
|
141
|
+
|
142
|
+
count = raw.query("SHOW COLUMNS FROM #{table}").count
|
143
|
+
expect(count).to eql 6
|
144
|
+
|
145
|
+
data = [
|
146
|
+
{email: 'other@example.com', something_else: :abc123, first_name: 'other', last_name: 'n', created_at: Time.new.to_s(:db), updated_at: Time.new.to_s(:db)}
|
147
|
+
]
|
148
|
+
plan = SpecPlan.new
|
149
|
+
plan.do! {
|
150
|
+
destination = plan.connections[:mysql][:forklift_test_source_a]
|
151
|
+
destination.write(data, table)
|
152
|
+
}
|
153
|
+
|
154
|
+
count = raw.query("SHOW COLUMNS FROM #{table}").count
|
155
|
+
expect(count).to eql 7
|
156
|
+
end
|
157
|
+
|
138
158
|
it "can will seek further for null-ish values" do
|
139
159
|
data = [
|
140
160
|
{id: 1, thing: 'stuff a', number: nil, updated_at: Time.new},
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forklift_etl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.8
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Evan Tahler
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-
|
12
|
+
date: 2014-08-20 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: activesupport
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ~>
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -23,6 +25,7 @@ dependencies:
|
|
23
25
|
type: :runtime
|
24
26
|
prerelease: false
|
25
27
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
26
29
|
requirements:
|
27
30
|
- - ~>
|
28
31
|
- !ruby/object:Gem::Version
|
@@ -33,6 +36,7 @@ dependencies:
|
|
33
36
|
- !ruby/object:Gem::Dependency
|
34
37
|
name: mysql2
|
35
38
|
requirement: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
36
40
|
requirements:
|
37
41
|
- - ~>
|
38
42
|
- !ruby/object:Gem::Version
|
@@ -43,6 +47,7 @@ dependencies:
|
|
43
47
|
type: :runtime
|
44
48
|
prerelease: false
|
45
49
|
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
46
51
|
requirements:
|
47
52
|
- - ~>
|
48
53
|
- !ruby/object:Gem::Version
|
@@ -53,6 +58,7 @@ dependencies:
|
|
53
58
|
- !ruby/object:Gem::Dependency
|
54
59
|
name: elasticsearch
|
55
60
|
requirement: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
56
62
|
requirements:
|
57
63
|
- - ~>
|
58
64
|
- !ruby/object:Gem::Version
|
@@ -63,6 +69,7 @@ dependencies:
|
|
63
69
|
type: :runtime
|
64
70
|
prerelease: false
|
65
71
|
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
66
73
|
requirements:
|
67
74
|
- - ~>
|
68
75
|
- !ruby/object:Gem::Version
|
@@ -73,6 +80,7 @@ dependencies:
|
|
73
80
|
- !ruby/object:Gem::Dependency
|
74
81
|
name: pony
|
75
82
|
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
76
84
|
requirements:
|
77
85
|
- - ~>
|
78
86
|
- !ruby/object:Gem::Version
|
@@ -83,6 +91,7 @@ dependencies:
|
|
83
91
|
type: :runtime
|
84
92
|
prerelease: false
|
85
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
86
95
|
requirements:
|
87
96
|
- - ~>
|
88
97
|
- !ruby/object:Gem::Version
|
@@ -93,6 +102,7 @@ dependencies:
|
|
93
102
|
- !ruby/object:Gem::Dependency
|
94
103
|
name: lumberjack
|
95
104
|
requirement: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
96
106
|
requirements:
|
97
107
|
- - ~>
|
98
108
|
- !ruby/object:Gem::Version
|
@@ -103,6 +113,7 @@ dependencies:
|
|
103
113
|
type: :runtime
|
104
114
|
prerelease: false
|
105
115
|
version_requirements: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
106
117
|
requirements:
|
107
118
|
- - ~>
|
108
119
|
- !ruby/object:Gem::Version
|
@@ -191,26 +202,27 @@ files:
|
|
191
202
|
homepage: https://github.com/taskrabbit/forklift
|
192
203
|
licenses:
|
193
204
|
- MIT
|
194
|
-
metadata: {}
|
195
205
|
post_install_message:
|
196
206
|
rdoc_options: []
|
197
207
|
require_paths:
|
198
208
|
- lib
|
199
209
|
required_ruby_version: !ruby/object:Gem::Requirement
|
210
|
+
none: false
|
200
211
|
requirements:
|
201
212
|
- - ! '>='
|
202
213
|
- !ruby/object:Gem::Version
|
203
214
|
version: '0'
|
204
215
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
|
+
none: false
|
205
217
|
requirements:
|
206
218
|
- - ! '>='
|
207
219
|
- !ruby/object:Gem::Version
|
208
220
|
version: '0'
|
209
221
|
requirements: []
|
210
222
|
rubyforge_project: forklift_etl
|
211
|
-
rubygems_version:
|
223
|
+
rubygems_version: 1.8.23
|
212
224
|
signing_key:
|
213
|
-
specification_version:
|
225
|
+
specification_version: 3
|
214
226
|
summary: ! 'Forklift: Moving big databases around. A ruby ETL tool.'
|
215
227
|
test_files:
|
216
228
|
- spec/config/connections/csv/forklift_test_destination.yml
|
@@ -242,4 +254,3 @@ test_files:
|
|
242
254
|
- spec/unit/misc/error_spec.rb
|
243
255
|
- spec/unit/misc/pid_spec.rb
|
244
256
|
- spec/unit/misc/step_spec.rb
|
245
|
-
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
ZjM4NGIzZDIwMjQzNjg2MTI1ODU4NmUzZmIyZmI5YzVjODZkZjMwZA==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
YjU0MGQyNmU3ZGM3MzI4MjJkYzg4NDU4NGJiMjNiMWU0ZDU5NzVhYQ==
|
7
|
-
SHA512:
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
ZWU3MWM1OWM1MjAyMmVmNzRlYmVhZGJhMGY5N2Y3NTY5MTVlYzNlN2RhNzEy
|
10
|
-
NGIxMmEyYjRjNGM1NjcxYmVjZjIyM2FkM2FhY2ZjZjc1YmNmMDYzNDQ4MmEy
|
11
|
-
NDBiYTlmZWZiNDVlNjFjY2Y4OTMwYzRhMmFmZDgwOTlhOTUyMjM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
OGQ0ZjZiODA3OGMzZGMxMmY2ZDA5ZTQyZDNmYTQwMTQ2MWM4ODc3NGU4YjY1
|
14
|
-
MjYxMzQxOWQ0OWY0NjUzMzRkNTFmNjdiNDliNjVhMzI3ZDQ2YTg2YzVlOWQw
|
15
|
-
NGJmYzI1ZTE3Y2FlNzhiZGQ2YTA5MjQ2NWM1MjIwNzIyNGM1NjE=
|