td 0.13.1 → 0.13.2

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
2
  SHA1:
3
- metadata.gz: 578d2e406b4dc27d5b95c15ead295ee6ad177f1d
4
- data.tar.gz: 35c5f56731a8d9dade9e0992796af12af6a31e27
3
+ metadata.gz: e20abc2bf25fadf9daeac46efc09aa0278f9d8cb
4
+ data.tar.gz: 83dfdb2445a9279810a3c651f979fc8b1af12ae0
5
5
  SHA512:
6
- metadata.gz: ed9cd10e2fd21cf386d40d72b0799e828e812f83c531a92bfe98d8eeced6fd236b9590d89c7c8d6857d26b5d026fa2a4b42634880fe5548a832ddc562ff245ad
7
- data.tar.gz: 04314077f5d84ce559f975701d027d7762260fc5deccd96cda3bae3f6cb96b744538c4b0a42f62abcfe92db245d2dff73f01f7a2b63685e5c43ab2283ee1a501
6
+ metadata.gz: 8a78076ea4a0b05fdd923980e63e0a7836e9dac065baa76a16358e5b6b5cd3043f6f8a792f67ef5ed8ad01782ff237fa042b356d9685502cee1cb678412dba08
7
+ data.tar.gz: 4c25dd9af339f532470e8d32322c50bbcdce1b987cd2891269f3dae1bc38688a0a43963d97d210473217ca26787b2ba9d05990283b6904a6dd6044e94714ab36
@@ -3,9 +3,9 @@ language: ruby
3
3
  rvm:
4
4
  - 1.9.3
5
5
  - 2.0.0
6
- - 2.1.0
7
- - 2.1.1
8
- - 2.2.0
6
+ - 2.1.8
7
+ - 2.2.4
8
+ - 2.3.0
9
9
  - ruby-head
10
10
 
11
11
  gemfile:
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ == 2016-01-25 version 0.13.2
2
+
3
+ * Replace Infinity and NaN inside Array or Hash
4
+ * fix command line arguments handling on Windows
5
+
1
6
  == 2015-12-14 version 0.13.1
2
7
 
3
8
  * fix table:import with no '-t' or '--time-key' option
@@ -1,5 +1,6 @@
1
1
  = Treasure Data command line tool
2
2
  {<img src="https://travis-ci.org/treasure-data/td.svg?branch=master" alt="Build Status" />}[https://travis-ci.org/treasure-data/td]
3
+ {<img src="https://ci.appveyor.com/api/projects/status/github/treasure-data/td?branch=master&svg=true" alt="appveyor" />}[https://ci.appveyor.com/project/treasure-data/td/branch/master]
3
4
  {<img src="https://coveralls.io/repos/treasure-data/td/badge.svg?branch=master&service=github" alt="Coverage Status" />}[https://coveralls.io/github/treasure-data/td?branch=master]
4
5
 
5
6
  This CUI utility wraps the {Ruby Client Library td-client-ruby}[https://github.com/treasure-data/td-client-ruby]
@@ -510,7 +510,14 @@ private
510
510
  end
511
511
 
512
512
  def sanitize_infinite_value(v)
513
- (v.is_a?(Float) && !v.finite?) ? v.to_s : v
513
+ case v
514
+ when Float
515
+ v.finite? ? v : v.to_s
516
+ when Hash, Array
517
+ Marshal.load(Marshal.dump(v), ->(x){(x.is_a?(Float) && !x.finite?) ? x.to_s : x})
518
+ else
519
+ v
520
+ end
514
521
  end
515
522
 
516
523
  def job_priority_name_of(id)
@@ -1,3 +1,3 @@
1
1
  module TreasureData
2
- TOOLBELT_VERSION = '0.13.1'
2
+ TOOLBELT_VERSION = '0.13.2'
3
3
  end
@@ -5,21 +5,42 @@ require 'td/command/connector'
5
5
 
6
6
  module TreasureData::Command
7
7
  describe 'connector commands' do
8
- describe '#connector_guess' do
9
- let :command do
10
- Class.new { include TreasureData::Command }.new
8
+ let :command do
9
+ Class.new { include TreasureData::Command }.new
10
+ end
11
+ let(:bulk_load_yaml) { File.join("spec", "td", "fixture", "bulk_load.yml") }
12
+ let(:stdout_io) { StringIO.new }
13
+ let(:stderr_io) { StringIO.new }
14
+
15
+ around do |example|
16
+ stdout = $stdout.dup
17
+ stderr = $stderr.dup
18
+
19
+ begin
20
+ $stdout = stdout_io
21
+ $stderr = stderr_io
22
+
23
+ example.run
24
+ ensure
25
+ $stdout = stdout
26
+ $stderr = stderr
11
27
  end
28
+ end
12
29
 
30
+ describe '#connector_guess' do
13
31
  describe 'guess plugins' do
14
32
  let(:guess_plugins) { %w(json query_string) }
15
-
16
- let(:in_file) { Tempfile.new('in.yml').tap{|f| f.close } }
17
- let(:out_file) { Tempfile.new('out.yml').tap{|f| f.close } }
18
-
33
+ let(:stdout_io) { StringIO.new }
34
+ let(:stderr_io) { StringIO.new }
19
35
  let(:option) {
20
36
  List::CommandParser.new("connector:guess", ["config"], [], nil, [in_file.path, '-o', out_file.path, '--guess', guess_plugins.join(',')], true)
21
37
  }
22
- let(:client) { double(:client) }
38
+ let(:response) {
39
+ {'config' => {'in' => {}, 'out' => {}}}
40
+ }
41
+ let(:client) { double(:client) }
42
+ let(:in_file) { Tempfile.new('in.yml').tap{|f| f.close } }
43
+ let(:out_file) { Tempfile.new('out.yml').tap{|f| f.close } }
23
44
 
24
45
  before do
25
46
  command.stub(:get_client).and_return(client)
@@ -46,27 +67,37 @@ module TreasureData::Command
46
67
  command.connector_guess(option)
47
68
  end
48
69
  end
49
- end
50
70
 
51
- describe '#connector_preview' do
52
- let :command do
53
- Class.new { include TreasureData::Command }.new
54
- end
71
+ describe 'output config' do
72
+ let(:out_file) { Tempfile.new('out.yml').tap(&:close) }
73
+ let(:bulk_load_yaml) { File.join("spec", "td", "fixture", "bulk_load.yml") }
74
+ let(:option) {
75
+ List::CommandParser.new("connector:guess", ['config'], %w(access-id access-secret source out), nil, [bulk_load_yaml, '-o', out_file.path], true)
76
+ }
77
+ let(:response) {
78
+ {'config' => {'in' => {}, 'out' => {}}}
79
+ }
80
+ let(:client) {
81
+ double(:client, bulk_load_guess: response)
82
+ }
55
83
 
56
- subject do
57
- backup = $stdout.dup
58
- buf = StringIO.new
84
+ before do
85
+ command.stub(:get_client).and_return(client)
86
+ command.connector_guess(option)
87
+ end
59
88
 
60
- begin
61
- $stdout = buf
89
+ it 'output yaml has [in, out] key' do
90
+ expect(YAML.load_file(out_file.path).keys).to eq(%w(in out))
91
+ end
92
+ end
93
+ end
62
94
 
63
- op = List::CommandParser.new("connector:preview", ["config"], [], nil, [File.join("spec", "td", "fixture", "bulk_load.yml")], true)
64
- command.connector_preview(op)
95
+ describe '#connector_preview' do
96
+ subject do
97
+ op = List::CommandParser.new("connector:preview", ["config"], [], nil, [bulk_load_yaml], true)
98
+ command.connector_preview(op)
65
99
 
66
- buf.string
67
- ensure
68
- $stdout = backup
69
- end
100
+ stdout_io.string
70
101
  end
71
102
 
72
103
  let(:preview_result) do
@@ -97,30 +128,10 @@ module TreasureData::Command
97
128
  end
98
129
 
99
130
  describe '#connector_issue' do
100
- let :command do
101
- Class.new { include TreasureData::Command }.new
102
- end
103
-
104
- let(:stderr_io) do
105
- StringIO.new
106
- end
107
-
108
131
  subject do
109
- backup = $stdout.dup
110
- stderr_backup = $stderr.dup
111
- buf = StringIO.new
112
-
113
- begin
114
- $stdout = buf
115
- $stderr = stderr_io
116
-
117
132
  command.connector_issue(option)
118
133
 
119
- buf.string
120
- ensure
121
- $stdout = backup
122
- $stderr = stderr_backup
123
- end
134
+ stdout_io.string
124
135
  end
125
136
 
126
137
  describe 'queueing job' do
@@ -176,9 +187,6 @@ module TreasureData::Command
176
187
  describe '#connector_run' do
177
188
  include_context 'quiet_out'
178
189
 
179
- let :command do
180
- Class.new { include TreasureData::Command }.new
181
- end
182
190
  let(:client) { double(:client) }
183
191
  let(:job_name) { 'job_1' }
184
192
 
@@ -218,9 +226,6 @@ module TreasureData::Command
218
226
  describe 'connector history' do
219
227
  include_context 'quiet_out'
220
228
 
221
- let :command do
222
- Class.new { include TreasureData::Command }.new
223
- end
224
229
  let(:name) { 'connector_test' }
225
230
 
226
231
  subject do
@@ -282,5 +287,71 @@ module TreasureData::Command
282
287
  end
283
288
  end
284
289
  end
290
+
291
+ describe '#connector_list' do
292
+ let(:option) {
293
+ List::CommandParser.new("connector:list", [], [], nil, [], true)
294
+ }
295
+ let(:response) {
296
+ [{
297
+ 'name' => 'daily_mysql_import',
298
+ 'cron' => '10 0 * * *',
299
+ 'timezone' => 'UTC',
300
+ 'delay' => 0,
301
+ 'database' => 'td_sample_db',
302
+ 'table' => 'td_sample_table',
303
+ 'config' => {'type' => 'mysql'},
304
+ }]
305
+ }
306
+ let(:client) {
307
+ double(:client, bulk_load_list: response)
308
+ }
309
+
310
+ before do
311
+ command.stub(:get_client).and_return(client)
312
+ command.connector_list(option)
313
+ end
314
+
315
+ it 'show list use table format' do
316
+ expect(stdout_io.string).to include <<-EOL
317
+ | daily_mysql_import | 10 0 * * * | UTC | 0 | td_sample_db | td_sample_table |
318
+ EOL
319
+ end
320
+ end
321
+
322
+ describe '#connector_create' do
323
+ let(:name) { 'daily_mysql_import' }
324
+ let(:cron) { '10 0 * * *' }
325
+ let(:database) { 'td_sample_db' }
326
+ let(:table) { 'td_sample_table' }
327
+ let(:config_file) {
328
+ Tempfile.new('config.json').tap {|tf|
329
+ tf.puts({}.to_json)
330
+ tf.close
331
+ }
332
+ }
333
+ let(:option) {
334
+ List::CommandParser.new("connector:create", %w(name cron database table config_file), [], nil, [name, cron, database, table, config_file.path], true)
335
+ }
336
+ let(:response) {
337
+ {'name' => name, 'cron' => cron, 'timezone' => 'UTC', 'delay' => 0, 'database' => database, 'table' => table, 'config' => ''}
338
+ }
339
+ let(:client) {
340
+ double(:client, bulk_load_create: response)
341
+ }
342
+
343
+ before do
344
+ command.stub(:get_table)
345
+ command.stub(:get_client).and_return(client)
346
+ command.connector_create(option)
347
+ end
348
+
349
+ it 'show create result' do
350
+ expect(stdout_io.string).to include name
351
+ expect(stdout_io.string).to include cron
352
+ expect(stdout_io.string).to include database
353
+ expect(stdout_io.string).to include table
354
+ end
355
+ end
285
356
  end
286
357
  end
@@ -232,7 +232,13 @@ module TreasureData::Command
232
232
  let :job do
233
233
  job = TreasureData::Job.new(nil, 12345, 'hive', 'select * from employee')
234
234
  job.instance_eval do
235
- @result = [[[0.0/0.0, 1.0/0.0, 1.0/-0.0], 1], [["4", 5.0, {key:6}], 2], [["7", 8.0, {key:9}], 3]]
235
+ inf = Float::INFINITY
236
+ nan = Float::NAN
237
+ @result = [
238
+ [[nan, inf, -inf], 1],
239
+ [[[nan, inf, -inf], 5.0, {key:6}], 2],
240
+ [["7", 8.0, {key:9}], 3],
241
+ ]
236
242
  @result_size = 3
237
243
  @status = 'success'
238
244
  end
@@ -245,12 +251,20 @@ module TreasureData::Command
245
251
 
246
252
  it 'supports csv output' do
247
253
  command.send(:show_result, job, file, nil, 'csv')
248
- File.read(file.path).should == %Q("""NaN""","""Infinity""","""-Infinity"""\n4,5.0,"{""key"":6}"\n7,8.0,"{""key"":9}"\n)
254
+ File.read(file.path).should == <<text
255
+ """NaN""","""Infinity""","""-Infinity"""
256
+ "[""NaN"",""Infinity"",""-Infinity""]",5.0,"{""key"":6}"
257
+ 7,8.0,"{""key"":9}"
258
+ text
249
259
  end
250
260
 
251
261
  it 'supports tsv output' do
252
262
  command.send(:show_result, job, file, nil, 'tsv')
253
- File.read(file.path).should == %Q("NaN"\t"Infinity"\t"-Infinity"\n4\t5.0\t{"key":6}\n7\t8.0\t{"key":9}\n)
263
+ File.read(file.path).should == <<text
264
+ "NaN"\t"Infinity"\t"-Infinity"
265
+ ["NaN","Infinity","-Infinity"]\t5.0\t{"key":6}
266
+ 7\t8.0\t{"key":9}
267
+ text
254
268
  end
255
269
  end
256
270
  end
data/td.gemspec CHANGED
@@ -17,11 +17,11 @@ Gem::Specification.new do |gem|
17
17
  gem.require_paths = ['lib']
18
18
  gem.required_ruby_version = '>= 1.9'
19
19
 
20
- gem.add_dependency "msgpack", [">= 0.4.4", "!= 0.5.0", "!= 0.5.1", "!= 0.5.2", "!= 0.5.3", "< 0.5.12"]
20
+ gem.add_dependency "msgpack", [">= 0.4.4", "!= 0.5.0", "!= 0.5.1", "!= 0.5.2", "!= 0.5.3", "< 0.8.0"]
21
21
  gem.add_dependency "yajl-ruby", "~> 1.1"
22
22
  gem.add_dependency "hirb", ">= 0.4.5"
23
23
  gem.add_dependency "parallel", "~> 0.6.1"
24
- gem.add_dependency "td-client", "~> 0.8.77"
24
+ gem.add_dependency "td-client", "~> 0.8.78"
25
25
  gem.add_dependency "td-logger", "~> 0.3.21"
26
26
  gem.add_dependency "rubyzip", "~> 1.1.7"
27
27
  gem.add_dependency "zip-zip", "~> 0.3"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.13.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Treasure Data, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-17 00:00:00.000000000 Z
11
+ date: 2016-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -31,7 +31,7 @@ dependencies:
31
31
  version: 0.5.3
32
32
  - - "<"
33
33
  - !ruby/object:Gem::Version
34
- version: 0.5.12
34
+ version: 0.8.0
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
@@ -53,7 +53,7 @@ dependencies:
53
53
  version: 0.5.3
54
54
  - - "<"
55
55
  - !ruby/object:Gem::Version
56
- version: 0.5.12
56
+ version: 0.8.0
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: yajl-ruby
59
59
  requirement: !ruby/object:Gem::Requirement
@@ -102,14 +102,14 @@ dependencies:
102
102
  requirements:
103
103
  - - "~>"
104
104
  - !ruby/object:Gem::Version
105
- version: 0.8.77
105
+ version: 0.8.78
106
106
  type: :runtime
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - "~>"
111
111
  - !ruby/object:Gem::Version
112
- version: 0.8.77
112
+ version: 0.8.78
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: td-logger
115
115
  requirement: !ruby/object:Gem::Requirement