td 0.13.1 → 0.13.2

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.
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