embulk-output-bigquery 0.2.3 → 0.3.0.pre1

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -12
  3. data/CHANGELOG.md +18 -0
  4. data/Gemfile +8 -0
  5. data/LICENSE.txt +20 -0
  6. data/README.md +165 -39
  7. data/Rakefile +11 -0
  8. data/embulk-output-bigquery.gemspec +20 -0
  9. data/example/config_client_options.yml +33 -0
  10. data/example/config_csv.yml +30 -0
  11. data/example/config_delete_in_advance.yml +29 -0
  12. data/example/config_expose_errors.yml +30 -0
  13. data/example/config_guess_from_embulk_schema.yml +29 -0
  14. data/example/config_guess_with_column_options.yml +40 -0
  15. data/example/config_gzip.yml +30 -0
  16. data/example/config_jsonl.yml +30 -0
  17. data/example/config_mode_append.yml +30 -0
  18. data/example/config_mode_append_direct.yml +30 -0
  19. data/example/config_payload_column.yml +20 -0
  20. data/example/config_payload_column_index.yml +20 -0
  21. data/example/config_prevent_duplicate_insert.yml +30 -0
  22. data/example/config_replace.yml +30 -0
  23. data/example/config_replace_backup.yml +32 -0
  24. data/example/config_skip_file_generation.yml +32 -0
  25. data/example/config_table_strftime.yml +30 -0
  26. data/example/config_template_table.yml +21 -0
  27. data/example/config_uncompressed.yml +30 -0
  28. data/example/config_with_rehearsal.yml +32 -0
  29. data/example/example.csv +17 -0
  30. data/example/example.jsonl +16 -0
  31. data/example/example.yml +30 -0
  32. data/example/json_key.json +12 -0
  33. data/example/nested_example.jsonl +16 -0
  34. data/example/schema.json +30 -0
  35. data/example/schema_expose_errors.json +30 -0
  36. data/lib/embulk/output/bigquery.rb +388 -3
  37. data/lib/embulk/output/bigquery/bigquery_client.rb +396 -0
  38. data/lib/embulk/output/bigquery/file_writer.rb +103 -0
  39. data/lib/embulk/output/bigquery/helper.rb +78 -0
  40. data/lib/embulk/output/bigquery/value_converter_factory.rb +292 -0
  41. data/test/helper.rb +13 -0
  42. data/test/test_bigquery_client.rb +166 -0
  43. data/test/test_configure.rb +254 -0
  44. data/test/test_example.rb +34 -0
  45. data/test/test_file_writer.rb +129 -0
  46. data/test/test_helper.rb +103 -0
  47. data/test/test_transaction.rb +129 -0
  48. data/test/test_value_converter_factory.rb +316 -0
  49. metadata +114 -45
  50. data/build.gradle +0 -80
  51. data/config/checkstyle/checkstyle.xml +0 -128
  52. data/config/checkstyle/default.xml +0 -108
  53. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  54. data/gradle/wrapper/gradle-wrapper.properties +0 -6
  55. data/gradlew +0 -164
  56. data/gradlew.bat +0 -90
  57. data/settings.gradle +0 -2
  58. data/src/main/java/org/embulk/output/BigqueryAuthentication.java +0 -117
  59. data/src/main/java/org/embulk/output/BigqueryOutputPlugin.java +0 -508
  60. data/src/main/java/org/embulk/output/BigqueryWriter.java +0 -575
  61. data/src/test/java/org/embulk/output/TestBigqueryAuthentication.java +0 -5
  62. data/src/test/java/org/embulk/output/TestBigqueryOutputPlugin.java +0 -5
  63. data/src/test/java/org/embulk/output/TestBigqueryWriter.java +0 -5
@@ -0,0 +1,129 @@
1
+ require_relative './helper'
2
+ require 'embulk/output/bigquery'
3
+
4
+ Bigquery = Embulk::Output::Bigquery unless defined?(Bigquery)
5
+
6
+ module Embulk
7
+ class Output::Bigquery
8
+ class TestTransaction < Test::Unit::TestCase
9
+ def least_config
10
+ DataSource.new({
11
+ 'project' => 'your_project_name',
12
+ 'dataset' => 'your_dataset_name',
13
+ 'table' => 'your_table_name',
14
+ 'p12_keyfile' => __FILE__, # fake
15
+ })
16
+ end
17
+
18
+ def schema
19
+ Schema.new([
20
+ Column.new({index: 0, name: 'boolean', type: :boolean}),
21
+ Column.new({index: 1, name: 'long', type: :long}),
22
+ Column.new({index: 2, name: 'double', type: :double}),
23
+ Column.new({index: 3, name: 'string', type: :string}),
24
+ Column.new({index: 4, name: 'timestamp', type: :timestamp}),
25
+ Column.new({index: 5, name: 'json', type: :json}),
26
+ ])
27
+ end
28
+
29
+ def processor_count
30
+ 1
31
+ end
32
+
33
+ def control
34
+ Proc.new {|task| task_reports = [] }
35
+ end
36
+
37
+ def test_append
38
+ config = least_config.merge('mode' => 'append', 'temp_table' => 'temp_table')
39
+ any_instance_of(BigqueryClient) do |obj|
40
+ mock(obj).get_dataset(config['dataset'])
41
+ mock(obj).create_table(config['temp_table'])
42
+ mock(obj).load_in_parallel(anything, config['temp_table']) { [] }
43
+ mock(obj).copy(config['temp_table'], config['table'], write_disposition: 'WRITE_APPEND')
44
+ mock(obj).delete_table(config['temp_table'])
45
+ end
46
+ Bigquery.transaction(config, schema, processor_count, &control)
47
+ end
48
+
49
+ sub_test_case "append_direct" do
50
+ def test_append_direct
51
+ config = least_config.merge('mode' => 'append_direct')
52
+ any_instance_of(BigqueryClient) do |obj|
53
+ mock(obj).get_dataset(config['dataset'])
54
+ mock(obj).get_table(config['table'])
55
+ mock(obj).load_in_parallel(anything, config['table']) { [] }
56
+ end
57
+ Bigquery.transaction(config, schema, processor_count, &control)
58
+ end
59
+
60
+ def test_append_direct_with_auto_create
61
+ config = least_config.merge('mode' => 'append_direct', 'auto_create_dataset' => true, 'auto_create_table' => true)
62
+ any_instance_of(BigqueryClient) do |obj|
63
+ mock(obj).create_dataset(config['dataset'])
64
+ mock(obj).create_table(config['table'])
65
+ mock(obj).load_in_parallel(anything, config['table']) { [] }
66
+ end
67
+ Bigquery.transaction(config, schema, processor_count, &control)
68
+ end
69
+ end
70
+
71
+ def test_delete_in_advance
72
+ config = least_config.merge('mode' => 'delete_in_advance')
73
+ any_instance_of(BigqueryClient) do |obj|
74
+ mock(obj).get_dataset(config['dataset'])
75
+ mock(obj).delete_table(config['table'])
76
+ mock(obj).create_table(config['table'])
77
+ mock(obj).load_in_parallel(anything, config['table']) { [] }
78
+ end
79
+ Bigquery.transaction(config, schema, processor_count, &control)
80
+ end
81
+
82
+ def test_replace
83
+ config = least_config.merge('mode' => 'replace', 'temp_table' => 'temp_table')
84
+ any_instance_of(BigqueryClient) do |obj|
85
+ mock(obj).get_dataset(config['dataset'])
86
+ mock(obj).create_table(config['temp_table'])
87
+ mock(obj).load_in_parallel(anything, config['temp_table']) { [] }
88
+ mock(obj).copy(config['temp_table'], config['table'], write_disposition: 'WRITE_TRUNCATE')
89
+ mock(obj).delete_table(config['temp_table'])
90
+ end
91
+ Bigquery.transaction(config, schema, processor_count, &control)
92
+ end
93
+
94
+ sub_test_case "replace_backup" do
95
+ def test_replace_backup
96
+ config = least_config.merge('mode' => 'replace_backup', 'dataset_old' => 'dataset_old', 'table_old' => 'table_old', 'temp_table' => 'temp_table')
97
+ any_instance_of(BigqueryClient) do |obj|
98
+ mock(obj).get_dataset(config['dataset'])
99
+ mock(obj).get_dataset(config['dataset_old'])
100
+ mock(obj).create_table(config['temp_table'])
101
+ mock(obj).load_in_parallel(anything, config['temp_table']) { [] }
102
+
103
+ mock(obj).copy(config['table'], config['table_old'], config['dataset_old'])
104
+
105
+ mock(obj).copy(config['temp_table'], config['table'], write_disposition: 'WRITE_TRUNCATE')
106
+ mock(obj).delete_table(config['temp_table'])
107
+ end
108
+ Bigquery.transaction(config, schema, processor_count, &control)
109
+ end
110
+
111
+ def test_replace_backup_auto_create_dataset
112
+ config = least_config.merge('mode' => 'replace_backup', 'dataset_old' => 'dataset_old', 'table_old' => 'table_old', 'temp_table' => 'temp_table', 'auto_create_dataset' => true)
113
+ any_instance_of(BigqueryClient) do |obj|
114
+ mock(obj).create_dataset(config['dataset'])
115
+ mock(obj).create_dataset(config['dataset_old'], reference: config['dataset'])
116
+ mock(obj).create_table(config['temp_table'])
117
+ mock(obj).load_in_parallel(anything, config['temp_table']) { [] }
118
+
119
+ mock(obj).copy(config['table'], config['table_old'], config['dataset_old'])
120
+
121
+ mock(obj).copy(config['temp_table'], config['table'], write_disposition: 'WRITE_TRUNCATE')
122
+ mock(obj).delete_table(config['temp_table'])
123
+ end
124
+ Bigquery.transaction(config, schema, processor_count, &control)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,316 @@
1
+ require_relative './helper'
2
+ require 'embulk/output/bigquery/value_converter_factory'
3
+
4
+ module Embulk
5
+ class Output::Bigquery
6
+ class TestValueConverterFactory < Test::Unit::TestCase
7
+
8
+ class TestCreateConverters < Test::Unit::TestCase
9
+ def test_create_default_converter
10
+ schema = Schema.new([
11
+ Column.new({index: 0, name: 'boolean', type: :boolean}),
12
+ Column.new({index: 1, name: 'long', type: :long}),
13
+ Column.new({index: 2, name: 'double', type: :double}),
14
+ Column.new({index: 3, name: 'string', type: :string}),
15
+ Column.new({index: 4, name: 'timestamp', type: :timestamp}),
16
+ Column.new({index: 5, name: 'json', type: :json}),
17
+ ])
18
+ converters = ValueConverterFactory.create_converters({}, schema)
19
+ assert_equal schema.size, converters.size
20
+ # Check correct converters are created
21
+ # Proc can not have names, so we have to execute to check...
22
+ assert_equal true, converters[0].call(true)
23
+ assert_equal 1, converters[1].call(1)
24
+ assert_equal 1.1, converters[2].call(1.1)
25
+ assert_equal 'foo', converters[3].call('foo')
26
+ timestamp = Time.parse("2016-02-26 00:00:00.100000 UTC")
27
+ assert_equal 1456444800.1, converters[4].call(timestamp)
28
+ assert_equal %Q[{"foo":"foo"}], converters[5].call({'foo'=>'foo'})
29
+ end
30
+
31
+ def test_create_custom_converter
32
+ schema = Schema.new([
33
+ Column.new({index: 0, name: 'boolean', type: :boolean}),
34
+ Column.new({index: 1, name: 'long', type: :long}),
35
+ Column.new({index: 2, name: 'double', type: :double}),
36
+ Column.new({index: 3, name: 'string', type: :string}),
37
+ Column.new({index: 4, name: 'timestamp', type: :timestamp}),
38
+ Column.new({index: 5, name: 'json', type: :json}),
39
+ ])
40
+ task = {
41
+ 'column_options' => [
42
+ {'name' => 'boolean', 'type' => 'STRING'},
43
+ {'name' => 'long', 'type' => 'STRING'},
44
+ {'name' => 'double', 'type' => 'STRING'},
45
+ {'name' => 'string', 'type' => 'INTEGER'},
46
+ {'name' => 'timestamp', 'type' => 'INTEGER'},
47
+ {'name' => 'json', 'type' => 'RECORD'},
48
+ ],
49
+ }
50
+ converters = ValueConverterFactory.create_converters(task, schema)
51
+ assert_equal schema.size, converters.size
52
+ # Check correct converters are created
53
+ # Proc can not have names, so we have to execute to check...
54
+ assert_equal 'true', converters[0].call(true)
55
+ assert_equal '1', converters[1].call(1)
56
+ assert_equal '1.1', converters[2].call(1.1)
57
+ assert_equal 1, converters[3].call('1')
58
+ timestamp = Time.parse("2016-02-26 00:00:00.100000 UTC")
59
+ assert_equal 1456444800, converters[4].call(timestamp)
60
+ assert_equal({'foo'=>'foo'}, converters[5].call({'foo'=>'foo'}))
61
+ end
62
+ end
63
+
64
+ class TestBooleanConverter < Test::Unit::TestCase
65
+ SCHEMA_TYPE = :boolean
66
+
67
+ def test_boolean
68
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'BOOLEAN').create_converter
69
+ assert_equal nil, converter.call(nil)
70
+ assert_equal true, converter.call(true)
71
+ assert_equal false, converter.call(false)
72
+ end
73
+
74
+ def test_integer
75
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'INTEGER').create_converter }
76
+ end
77
+
78
+ def test_float
79
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'FLOAT').create_converter }
80
+ end
81
+
82
+ def test_string
83
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'STRING').create_converter
84
+ assert_equal nil, converter.call(nil)
85
+ assert_equal "true", converter.call(true)
86
+ assert_equal "false", converter.call(false)
87
+ end
88
+
89
+ def test_timestamp
90
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'TIMESTAMP').create_converter }
91
+ end
92
+
93
+ def test_record
94
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'RECORD').create_converter }
95
+ end
96
+ end
97
+
98
+ class TestLongConverter < Test::Unit::TestCase
99
+ SCHEMA_TYPE = :long
100
+
101
+ def test_boolean
102
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'BOOLEAN').create_converter
103
+ assert_equal nil, converter.call(nil)
104
+ assert_equal true, converter.call(1)
105
+ assert_equal false, converter.call(0)
106
+ assert_raise { converter.call(2) }
107
+ end
108
+
109
+ def test_integer
110
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'INTEGER').create_converter
111
+ assert_equal nil, converter.call(nil)
112
+ assert_equal 1, converter.call(1)
113
+ end
114
+
115
+ def test_float
116
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'FLOAT').create_converter
117
+ assert_equal nil, converter.call(nil)
118
+ assert_equal 1.0, converter.call(1)
119
+ end
120
+
121
+ def test_string
122
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'STRING').create_converter
123
+ assert_equal nil, converter.call(nil)
124
+ assert_equal "1", converter.call(1)
125
+ end
126
+
127
+ def test_timestamp
128
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'TIMESTAMP').create_converter
129
+ assert_equal nil, converter.call(nil)
130
+ assert_equal 1408452095, converter.call(1408452095)
131
+ end
132
+
133
+ def test_record
134
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'RECORD').create_converter }
135
+ end
136
+ end
137
+
138
+ class TestDoubleConverter < Test::Unit::TestCase
139
+ SCHEMA_TYPE = :double
140
+
141
+ def test_boolean
142
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'BOOLEAN').create_converter }
143
+ end
144
+
145
+ def test_integer
146
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'INTEGER').create_converter
147
+ assert_equal nil, converter.call(nil)
148
+ assert_equal 1, converter.call(1.1)
149
+ end
150
+
151
+ def test_float
152
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'FLOAT').create_converter
153
+ assert_equal nil, converter.call(nil)
154
+ assert_equal 1.1, converter.call(1.1)
155
+ end
156
+
157
+ def test_string
158
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'STRING').create_converter
159
+ assert_equal nil, converter.call(nil)
160
+ assert_equal "1.1", converter.call(1.1)
161
+ end
162
+
163
+ def test_timestamp
164
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'TIMESTAMP').create_converter
165
+ assert_equal nil, converter.call(nil)
166
+ assert_equal 1408452095.188766, converter.call(1408452095.188766)
167
+ end
168
+
169
+ def test_record
170
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'RECORD').create_converter }
171
+ end
172
+ end
173
+
174
+ class TestStringConverter < Test::Unit::TestCase
175
+ SCHEMA_TYPE = :string
176
+
177
+ def test_boolean
178
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'BOOLEAN').create_converter
179
+ assert_equal nil, converter.call(nil)
180
+ assert_equal true, converter.call('true')
181
+ assert_equal false, converter.call('false')
182
+ assert_raise { converter.call('foo') }
183
+ end
184
+
185
+ def test_integer
186
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'INTEGER').create_converter
187
+ assert_equal nil, converter.call(nil)
188
+ assert_equal 1, converter.call('1')
189
+ assert_raise { converter.call('1.1') }
190
+ end
191
+
192
+ def test_float
193
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'FLOAT').create_converter
194
+ assert_equal nil, converter.call(nil)
195
+ assert_equal 1.1, converter.call('1.1')
196
+ assert_raise { converter.call('foo') }
197
+ end
198
+
199
+ def test_string
200
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'STRING').create_converter
201
+ assert_equal nil, converter.call(nil)
202
+ assert_equal "foo", converter.call("foo")
203
+ end
204
+
205
+ def test_timestamp
206
+ converter = ValueConverterFactory.new(
207
+ SCHEMA_TYPE, 'TIMESTAMP',
208
+ timestamp_format: '%Y-%m-%d', timezone: 'Asia/Tokyo'
209
+ ).create_converter
210
+ assert_equal nil, converter.call(nil)
211
+ assert_equal 1456412400.0, converter.call("2016-02-26")
212
+
213
+ # Users must care of BQ timestamp format by themselves with no timestamp_format
214
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'TIMESTAMP').create_converter
215
+ assert_equal nil, converter.call(nil)
216
+ assert_equal "2016-02-26 00:00:00", converter.call("2016-02-26 00:00:00")
217
+ end
218
+
219
+ def test_record
220
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'RECORD').create_converter
221
+ assert_equal({'foo'=>'foo'}, converter.call(%Q[{"foo":"foo"}]))
222
+ assert_raise { converter.call('foo') }
223
+ end
224
+ end
225
+
226
+ class TestTimestampConverter < Test::Unit::TestCase
227
+ SCHEMA_TYPE = :timestamp
228
+
229
+ def test_boolean
230
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'BOOLEAN').create_converter }
231
+ end
232
+
233
+ def test_integer
234
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'INTEGER').create_converter
235
+ assert_equal nil, converter.call(nil)
236
+ expected = 1456444800
237
+ assert_equal expected, converter.call(Time.at(expected))
238
+ end
239
+
240
+ def test_float
241
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'FLOAT').create_converter
242
+ assert_equal nil, converter.call(nil)
243
+ expected = 1456444800.100000
244
+ assert_equal expected, converter.call(Time.at(expected))
245
+ end
246
+
247
+ def test_string
248
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'STRING').create_converter
249
+ assert_equal nil, converter.call(nil)
250
+ timestamp = Time.parse("2016-02-26 00:00:00.100000 UTC")
251
+ expected = "2016-02-26 00:00:00.100000"
252
+ assert_equal expected, converter.call(timestamp)
253
+
254
+ converter = ValueConverterFactory.new(
255
+ SCHEMA_TYPE, 'STRING',
256
+ timestamp_format: '%Y-%m-%d', timezone: 'Asia/Tokyo'
257
+ ).create_converter
258
+ timestamp = Time.parse("2016-02-25 15:00:00.100000 UTC")
259
+ expected = "2016-02-26"
260
+ assert_equal expected, converter.call(timestamp)
261
+ end
262
+
263
+ def test_timestamp
264
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'TIMESTAMP').create_converter
265
+ assert_equal nil, converter.call(nil)
266
+ expected = 1456444800.100000
267
+ assert_equal expected, converter.call(Time.at(expected))
268
+ end
269
+
270
+ def test_record
271
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'RECORD').create_converter }
272
+ end
273
+ end
274
+
275
+ class TestJsonConverter < Test::Unit::TestCase
276
+ SCHEMA_TYPE = :json
277
+
278
+ def test_boolean
279
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'BOOLEAN').create_converter }
280
+ end
281
+
282
+ def test_integer
283
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'INTEGER').create_converter }
284
+ end
285
+
286
+ def test_float
287
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'FLOAT').create_converter }
288
+ end
289
+
290
+ def test_string
291
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'STRING').create_converter
292
+ assert_equal nil, converter.call(nil)
293
+ assert_equal(%Q[{"foo":"foo"}], converter.call({'foo'=>'foo'}))
294
+ end
295
+
296
+ def test_timestamp
297
+ assert_raise { ValueConverterFactory.new(SCHEMA_TYPE, 'TIMESTAMP').create_converter }
298
+ end
299
+
300
+ def test_record
301
+ converter = ValueConverterFactory.new(SCHEMA_TYPE, 'RECORD').create_converter
302
+ assert_equal nil, converter.call(nil)
303
+ assert_equal({'foo'=>'foo'}, converter.call({'foo'=>'foo'}))
304
+ end
305
+ end
306
+
307
+ def test_strict_false
308
+ converter = ValueConverterFactory.new(:string, 'BOOLEAN', strict: false).create_converter
309
+ assert_equal nil, converter.call('foo')
310
+
311
+ converter = ValueConverterFactory.new(:string, 'INTEGER', strict: false).create_converter
312
+ assert_equal nil, converter.call('foo')
313
+ end
314
+ end
315
+ end
316
+ end
metadata CHANGED
@@ -1,83 +1,144 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-output-bigquery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Satoshi Akama
8
+ - Naotoshi Seo
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-02-19 00:00:00.000000000 Z
12
+ date: 2016-03-14 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
15
+ name: google-api-client
16
+ version_requirements: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
14
21
  requirement: !ruby/object:Gem::Requirement
15
22
  requirements:
16
- - - ~>
23
+ - - ">="
17
24
  - !ruby/object:Gem::Version
18
- version: '1.0'
19
- name: bundler
25
+ version: '0'
20
26
  prerelease: false
21
- type: :development
27
+ type: :runtime
28
+ - !ruby/object:Gem::Dependency
29
+ name: tzinfo
22
30
  version_requirements: !ruby/object:Gem::Requirement
23
31
  requirements:
24
- - - ~>
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
25
38
  - !ruby/object:Gem::Version
26
- version: '1.0'
39
+ version: '0'
40
+ prerelease: false
41
+ type: :runtime
27
42
  - !ruby/object:Gem::Dependency
43
+ name: embulk
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: 0.8.2
28
49
  requirement: !ruby/object:Gem::Requirement
29
50
  requirements:
30
- - - '>='
51
+ - - ">="
31
52
  - !ruby/object:Gem::Version
32
- version: '10.0'
33
- name: rake
53
+ version: 0.8.2
54
+ prerelease: false
55
+ type: :development
56
+ - !ruby/object:Gem::Dependency
57
+ name: bundler
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.10.6
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 1.10.6
34
68
  prerelease: false
35
69
  type: :development
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake
36
72
  version_requirements: !ruby/object:Gem::Requirement
37
73
  requirements:
38
- - - '>='
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '10.0'
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
39
80
  - !ruby/object:Gem::Version
40
81
  version: '10.0'
82
+ prerelease: false
83
+ type: :development
41
84
  description: Embulk plugin that insert records to Google BigQuery.
42
85
  email:
43
86
  - satoshiakama@gmail.com
87
+ - sonots@gmail.com
44
88
  executables: []
45
89
  extensions: []
46
90
  extra_rdoc_files: []
47
91
  files:
48
- - .gitignore
92
+ - ".gitignore"
49
93
  - CHANGELOG.md
94
+ - Gemfile
95
+ - LICENSE.txt
50
96
  - README.md
51
- - build.gradle
52
- - config/checkstyle/checkstyle.xml
53
- - config/checkstyle/default.xml
54
- - gradle/wrapper/gradle-wrapper.jar
55
- - gradle/wrapper/gradle-wrapper.properties
56
- - gradlew
57
- - gradlew.bat
97
+ - Rakefile
98
+ - embulk-output-bigquery.gemspec
99
+ - example/config_client_options.yml
100
+ - example/config_csv.yml
101
+ - example/config_delete_in_advance.yml
102
+ - example/config_expose_errors.yml
103
+ - example/config_guess_from_embulk_schema.yml
104
+ - example/config_guess_with_column_options.yml
105
+ - example/config_gzip.yml
106
+ - example/config_jsonl.yml
107
+ - example/config_mode_append.yml
108
+ - example/config_mode_append_direct.yml
109
+ - example/config_payload_column.yml
110
+ - example/config_payload_column_index.yml
111
+ - example/config_prevent_duplicate_insert.yml
112
+ - example/config_replace.yml
113
+ - example/config_replace_backup.yml
114
+ - example/config_skip_file_generation.yml
115
+ - example/config_table_strftime.yml
116
+ - example/config_template_table.yml
117
+ - example/config_uncompressed.yml
118
+ - example/config_with_rehearsal.yml
119
+ - example/example.csv
120
+ - example/example.jsonl
121
+ - example/example.yml
122
+ - example/json_key.json
123
+ - example/nested_example.jsonl
124
+ - example/schema.json
125
+ - example/schema_expose_errors.json
58
126
  - lib/embulk/output/bigquery.rb
59
- - settings.gradle
60
- - src/main/java/org/embulk/output/BigqueryAuthentication.java
61
- - src/main/java/org/embulk/output/BigqueryOutputPlugin.java
62
- - src/main/java/org/embulk/output/BigqueryWriter.java
63
- - src/test/java/org/embulk/output/TestBigqueryAuthentication.java
64
- - src/test/java/org/embulk/output/TestBigqueryOutputPlugin.java
65
- - src/test/java/org/embulk/output/TestBigqueryWriter.java
66
- - classpath/commons-codec-1.3.jar
67
- - classpath/commons-logging-1.1.1.jar
68
- - classpath/embulk-output-bigquery-0.2.3.jar
69
- - classpath/google-api-client-1.20.0.jar
70
- - classpath/google-api-services-bigquery-v2-rev205-1.20.0.jar
71
- - classpath/google-http-client-1.20.0.jar
72
- - classpath/google-http-client-jackson2-1.20.0.jar
73
- - classpath/google-oauth-client-1.20.0.jar
74
- - classpath/guava-jdk5-13.0.jar
75
- - classpath/httpclient-4.0.1.jar
76
- - classpath/httpcore-4.0.1.jar
77
- - classpath/jsr305-1.3.9.jar
127
+ - lib/embulk/output/bigquery/bigquery_client.rb
128
+ - lib/embulk/output/bigquery/file_writer.rb
129
+ - lib/embulk/output/bigquery/helper.rb
130
+ - lib/embulk/output/bigquery/value_converter_factory.rb
131
+ - test/helper.rb
132
+ - test/test_bigquery_client.rb
133
+ - test/test_configure.rb
134
+ - test/test_example.rb
135
+ - test/test_file_writer.rb
136
+ - test/test_helper.rb
137
+ - test/test_transaction.rb
138
+ - test/test_value_converter_factory.rb
78
139
  homepage: https://github.com/embulk/embulk-output-bigquery
79
140
  licenses:
80
- - Apache-2.0
141
+ - MIT
81
142
  metadata: {}
82
143
  post_install_message:
83
144
  rdoc_options: []
@@ -85,18 +146,26 @@ require_paths:
85
146
  - lib
86
147
  required_ruby_version: !ruby/object:Gem::Requirement
87
148
  requirements:
88
- - - '>='
149
+ - - ">="
89
150
  - !ruby/object:Gem::Version
90
151
  version: '0'
91
152
  required_rubygems_version: !ruby/object:Gem::Requirement
92
153
  requirements:
93
- - - '>='
154
+ - - ">"
94
155
  - !ruby/object:Gem::Version
95
- version: '0'
156
+ version: 1.3.1
96
157
  requirements: []
97
158
  rubyforge_project:
98
- rubygems_version: 2.1.9
159
+ rubygems_version: 2.4.8
99
160
  signing_key:
100
161
  specification_version: 4
101
162
  summary: Google BigQuery output plugin for Embulk
102
- test_files: []
163
+ test_files:
164
+ - test/helper.rb
165
+ - test/test_bigquery_client.rb
166
+ - test/test_configure.rb
167
+ - test/test_example.rb
168
+ - test/test_file_writer.rb
169
+ - test/test_helper.rb
170
+ - test/test_transaction.rb
171
+ - test/test_value_converter_factory.rb