td 0.11.9 → 0.11.10
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/ChangeLog +13 -0
- data/lib/td/command/account.rb +5 -5
- data/lib/td/command/acl.rb +1 -1
- data/lib/td/command/apikey.rb +4 -4
- data/lib/td/command/bulk_import.rb +19 -7
- data/lib/td/command/common.rb +12 -10
- data/lib/td/command/connector.rb +35 -31
- data/lib/td/command/db.rb +2 -2
- data/lib/td/command/export.rb +6 -1
- data/lib/td/command/help.rb +3 -3
- data/lib/td/command/import.rb +3 -3
- data/lib/td/command/job.rb +60 -83
- data/lib/td/command/list.rb +19 -6
- data/lib/td/command/options.rb +61 -0
- data/lib/td/command/password.rb +7 -7
- data/lib/td/command/query.rb +14 -9
- data/lib/td/command/result.rb +5 -5
- data/lib/td/command/runner.rb +9 -9
- data/lib/td/command/sched.rb +97 -15
- data/lib/td/command/schema.rb +3 -3
- data/lib/td/command/server.rb +1 -1
- data/lib/td/command/status.rb +5 -5
- data/lib/td/command/table.rb +28 -23
- data/lib/td/command/update.rb +3 -3
- data/lib/td/command/user.rb +13 -13
- data/lib/td/helpers.rb +1 -6
- data/lib/td/updater.rb +9 -9
- data/lib/td/version.rb +1 -1
- data/spec/td/command/connector_spec.rb +54 -0
- data/spec/td/command/job_spec.rb +147 -0
- data/spec/td/command/sched_spec.rb +136 -14
- data/spec/td/command/table_spec.rb +1 -4
- data/spec/td/fixture/bulk_load.yml +24 -0
- data/td.gemspec +1 -1
- metadata +70 -40
- checksums.yaml +0 -7
data/lib/td/command/sched.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
require 'td/command/options'
|
2
|
+
|
1
3
|
module TreasureData
|
2
4
|
module Command
|
5
|
+
include Options
|
3
6
|
|
4
7
|
def sched_list(op)
|
5
8
|
require 'td/command/job' # job_priority_name_of
|
@@ -20,7 +23,7 @@ module Command
|
|
20
23
|
map[:Name]
|
21
24
|
}
|
22
25
|
|
23
|
-
puts cmd_render_table(rows, :fields => [:Name, :Cron, :Timezone, :"Next schedule", :Delay, :Priority, :Result, :Database, :Query], :max_width=>500, :render_format => op.render_format)
|
26
|
+
$stdout.puts cmd_render_table(rows, :fields => [:Name, :Cron, :Timezone, :"Next schedule", :Delay, :Priority, :Result, :Database, :Query], :max_width=>500, :render_format => op.render_format)
|
24
27
|
end
|
25
28
|
|
26
29
|
def sched_create(op)
|
@@ -218,9 +221,9 @@ module Command
|
|
218
221
|
end
|
219
222
|
|
220
223
|
if newname && curname != newname
|
221
|
-
puts "Schedule '#{curname}' is updated and its name changed to '#{newname}'."
|
224
|
+
$stdout.puts "Schedule '#{curname}' is updated and its name changed to '#{newname}'."
|
222
225
|
else
|
223
|
-
puts "Schedule '#{curname}' is updated."
|
226
|
+
$stdout.puts "Schedule '#{curname}' is updated."
|
224
227
|
end
|
225
228
|
end
|
226
229
|
|
@@ -259,16 +262,16 @@ module Command
|
|
259
262
|
|
260
263
|
scheds = client.schedules
|
261
264
|
if s = scheds.find {|s| s.name == name }
|
262
|
-
puts "Name : #{s.name}"
|
263
|
-
puts "Cron : #{s.cron}"
|
264
|
-
puts "Timezone : #{s.timezone}"
|
265
|
-
puts "Delay : #{s.delay} sec"
|
266
|
-
puts "Next : #{s.next_time}"
|
267
|
-
puts "Result : #{s.result_url}"
|
268
|
-
puts "Priority : #{job_priority_name_of(s.priority)}"
|
269
|
-
puts "Retry limit : #{s.retry_limit}"
|
270
|
-
puts "Database : #{s.database}"
|
271
|
-
puts "Query : #{s.query}"
|
265
|
+
$stdout.puts "Name : #{s.name}"
|
266
|
+
$stdout.puts "Cron : #{s.cron}"
|
267
|
+
$stdout.puts "Timezone : #{s.timezone}"
|
268
|
+
$stdout.puts "Delay : #{s.delay} sec"
|
269
|
+
$stdout.puts "Next : #{s.next_time}"
|
270
|
+
$stdout.puts "Result : #{s.result_url}"
|
271
|
+
$stdout.puts "Priority : #{job_priority_name_of(s.priority)}"
|
272
|
+
$stdout.puts "Retry limit : #{s.retry_limit}"
|
273
|
+
$stdout.puts "Database : #{s.database}"
|
274
|
+
$stdout.puts "Query : #{s.query}"
|
272
275
|
end
|
273
276
|
|
274
277
|
rows = []
|
@@ -277,7 +280,7 @@ module Command
|
|
277
280
|
rows << {:Time => scheduled_at, :JobID => j.job_id, :Status => j.status, :Priority => job_priority_name_of(j.priority), :Result=>j.result_url}
|
278
281
|
}
|
279
282
|
|
280
|
-
puts cmd_render_table(rows, :fields => [:JobID, :Time, :Status, :Priority, :Result], :render_format => op.render_format)
|
283
|
+
$stdout.puts cmd_render_table(rows, :fields => [:JobID, :Time, :Status, :Priority, :Result], :render_format => op.render_format)
|
281
284
|
end
|
282
285
|
|
283
286
|
def sched_run(op)
|
@@ -320,7 +323,86 @@ module Command
|
|
320
323
|
}
|
321
324
|
|
322
325
|
$stderr.puts "Scheduled #{num} jobs from #{t}."
|
323
|
-
puts cmd_render_table(rows, :fields => [:JobID, :Time], :max_width=>500, :render_format => op.render_format)
|
326
|
+
$stdout.puts cmd_render_table(rows, :fields => [:JobID, :Time], :max_width=>500, :render_format => op.render_format)
|
327
|
+
end
|
328
|
+
|
329
|
+
def sched_result(op)
|
330
|
+
options = job_show_options(op)
|
331
|
+
back_number = 1
|
332
|
+
op.on('--last [Number]', Integer, "show the result before N from the last. default: 1") do |n|
|
333
|
+
back_number = n ? n : 1
|
334
|
+
end
|
335
|
+
|
336
|
+
# save argv before calling cmd_parse, which removes flags from the argv array
|
337
|
+
argv_saved = op.argv.dup
|
338
|
+
name = op.cmd_parse
|
339
|
+
|
340
|
+
verbose = options[:verbose]
|
341
|
+
wait = options[:wait]
|
342
|
+
output = options[:output]
|
343
|
+
format = options[:format]
|
344
|
+
render_opts = options[:render_opts]
|
345
|
+
limit = options[:limit]
|
346
|
+
exclude = options[:exclude]
|
347
|
+
|
348
|
+
client = get_client
|
349
|
+
history = get_history(client, name, (back_number - 1), back_number)
|
350
|
+
|
351
|
+
job = history.first
|
352
|
+
|
353
|
+
if job.nil?
|
354
|
+
$stderr.puts "No jobs available for this query. Refer to 'sched:history'."
|
355
|
+
exit 1
|
356
|
+
end
|
357
|
+
|
358
|
+
# build the job:show command now
|
359
|
+
argv = job_show_option_argv(argv_saved, name, back_number)
|
360
|
+
argv << job.job_id
|
361
|
+
|
362
|
+
Runner.new.run(argv)
|
363
|
+
end
|
364
|
+
|
365
|
+
def job_show_option_argv(argv_saved, name, back_number)
|
366
|
+
argv = ['job:show']
|
367
|
+
argv += (argv_saved - [name]) if argv_saved.length > 0
|
368
|
+
|
369
|
+
# there are three argvs parters for sched_result.
|
370
|
+
# 1. without --last
|
371
|
+
# 2. --last (without Num)
|
372
|
+
# 3. --last Num
|
373
|
+
# 'back_number' is value of Num which was parsed by OptionParser.
|
374
|
+
# remove both "--last" and Num if they are.
|
375
|
+
|
376
|
+
index_of_last = argv.index("--last")
|
377
|
+
|
378
|
+
return argv unless index_of_last
|
379
|
+
|
380
|
+
index_of_next_of_last = index_of_last + 1
|
381
|
+
|
382
|
+
# the arg value following to "--last"
|
383
|
+
next_of_last = argv[index_of_next_of_last]
|
384
|
+
|
385
|
+
indexes_of_options_for_sched_result = [index_of_last]
|
386
|
+
indexes_of_options_for_sched_result << index_of_next_of_last if next_of_last == back_number.to_s
|
387
|
+
|
388
|
+
indexes_of_options_for_sched_result.each do |index|
|
389
|
+
argv[index] = nil
|
390
|
+
end
|
391
|
+
|
392
|
+
argv.compact
|
393
|
+
end
|
394
|
+
|
395
|
+
def get_history(client, name, from, to)
|
396
|
+
begin
|
397
|
+
history = client.history(name, from, to)
|
398
|
+
rescue NotFoundError
|
399
|
+
cmd_debug_error $!
|
400
|
+
$stderr.puts "Schedule '#{name}' does not exist."
|
401
|
+
$stderr.puts "Use '#{$prog} " + Config.cl_options_string + "sched:list' to show list of the schedules."
|
402
|
+
exit 1
|
403
|
+
end
|
404
|
+
|
405
|
+
history
|
324
406
|
end
|
325
407
|
|
326
408
|
end # module Command
|
data/lib/td/command/schema.rb
CHANGED
@@ -8,11 +8,11 @@ module Command
|
|
8
8
|
client = get_client
|
9
9
|
table = get_table(client, db_name, table_name)
|
10
10
|
|
11
|
-
puts "#{db_name}.#{table_name} ("
|
11
|
+
$stdout.puts "#{db_name}.#{table_name} ("
|
12
12
|
table.schema.fields.each {|f|
|
13
|
-
puts " #{f.name}:#{f.type}"
|
13
|
+
$stdout.puts " #{f.name}:#{f.type}"
|
14
14
|
}
|
15
|
-
puts ")"
|
15
|
+
$stdout.puts ")"
|
16
16
|
end
|
17
17
|
|
18
18
|
def schema_set(op)
|
data/lib/td/command/server.rb
CHANGED
data/lib/td/command/status.rb
CHANGED
@@ -57,9 +57,9 @@ module Command
|
|
57
57
|
x4, y4 = status_render(x3+2, y3, "[Results]", results, :fields => [:Name, :URL])
|
58
58
|
|
59
59
|
(y3-y4-1).times do
|
60
|
-
print "\eD"
|
60
|
+
$stdout.print "\eD"
|
61
61
|
end
|
62
|
-
print "\eE"
|
62
|
+
$stdout.print "\eE"
|
63
63
|
end
|
64
64
|
|
65
65
|
private
|
@@ -69,13 +69,13 @@ module Command
|
|
69
69
|
lines.unshift(msg)
|
70
70
|
#lines.unshift("")
|
71
71
|
|
72
|
-
print "\e[#{movey}A" if movey > 0
|
72
|
+
$stdout.print "\e[#{movey}A" if movey > 0
|
73
73
|
|
74
74
|
max_width = 0
|
75
75
|
height = 0
|
76
76
|
lines.each {|line|
|
77
|
-
print "\e[#{movex}C" if movex > 0
|
78
|
-
puts line
|
77
|
+
$stdout.print "\e[#{movex}C" if movex > 0
|
78
|
+
$stdout.puts line
|
79
79
|
width = line.length
|
80
80
|
max_width = width if max_width < width
|
81
81
|
height += 1
|
data/lib/td/command/table.rb
CHANGED
@@ -191,7 +191,7 @@ module Command
|
|
191
191
|
else
|
192
192
|
fields = [:Database, :Table, :Type, :Count, :Size, 'Last import', 'Last log timestamp', :Schema]
|
193
193
|
end
|
194
|
-
puts cmd_render_table(rows, :fields => fields, :max_width => 500, :render_format => op.render_format)
|
194
|
+
$stdout.puts cmd_render_table(rows, :fields => fields, :max_width => 500, :render_format => op.render_format)
|
195
195
|
|
196
196
|
if rows.empty?
|
197
197
|
if db_name
|
@@ -231,16 +231,16 @@ module Command
|
|
231
231
|
|
232
232
|
table = get_table(client, db_name, table_name)
|
233
233
|
|
234
|
-
puts "Name : #{table.db_name}.#{table.name}"
|
235
|
-
puts "Type : #{table.type}"
|
236
|
-
puts "Count : #{table.count}"
|
237
|
-
# p table.methods.each {|m| puts m}
|
238
|
-
puts "Primary key : #{table.primary_key}:#{table.primary_key_type}" if table.type == :item
|
239
|
-
puts "Schema : ("
|
234
|
+
$stdout.puts "Name : #{table.db_name}.#{table.name}"
|
235
|
+
$stdout.puts "Type : #{table.type}"
|
236
|
+
$stdout.puts "Count : #{table.count}"
|
237
|
+
# p table.methods.each {|m| $stdout.puts m}
|
238
|
+
$stdout.puts "Primary key : #{table.primary_key}:#{table.primary_key_type}" if table.type == :item
|
239
|
+
$stdout.puts "Schema : ("
|
240
240
|
table.schema.fields.each {|f|
|
241
|
-
puts " #{f.name}:#{f.type}"
|
241
|
+
$stdout.puts " #{f.name}:#{f.type}"
|
242
242
|
}
|
243
|
-
puts ")"
|
243
|
+
$stdout.puts ")"
|
244
244
|
end
|
245
245
|
|
246
246
|
def table_tail(op)
|
@@ -288,11 +288,11 @@ module Command
|
|
288
288
|
:space => ' '
|
289
289
|
}
|
290
290
|
rows.each {|row|
|
291
|
-
puts row.to_json(opts)
|
291
|
+
$stdout.puts row.to_json(opts)
|
292
292
|
}
|
293
293
|
else
|
294
294
|
rows.each {|row|
|
295
|
-
puts row.to_json
|
295
|
+
$stdout.puts row.to_json
|
296
296
|
}
|
297
297
|
end
|
298
298
|
end
|
@@ -301,6 +301,7 @@ module Command
|
|
301
301
|
from = nil
|
302
302
|
to = nil
|
303
303
|
wait = false
|
304
|
+
pool_name = nil
|
304
305
|
|
305
306
|
op.on('-t', '--to TIME', 'end time of logs to delete in Unix time multiple of 3600 (1 hour)',
|
306
307
|
' or Ruby time string format (e.g. \'2014-07-01 14:00:00 JST\') where',
|
@@ -326,6 +327,9 @@ module Command
|
|
326
327
|
op.on('-w', '--wait', 'wait for the job to finish', TrueClass) {|b|
|
327
328
|
wait = b
|
328
329
|
}
|
330
|
+
op.on('-O', '--pool-name NAME', 'specify resource pool by name') {|s|
|
331
|
+
pool_name = s
|
332
|
+
}
|
329
333
|
|
330
334
|
db_name, table_name = op.cmd_parse
|
331
335
|
|
@@ -350,6 +354,7 @@ module Command
|
|
350
354
|
table = get_table(client, db_name, table_name)
|
351
355
|
|
352
356
|
opts = {}
|
357
|
+
opts['pool_name'] = pool_name if pool_name
|
353
358
|
job = client.partial_delete(db_name, table_name, to, from, opts)
|
354
359
|
|
355
360
|
$stderr.puts "Partial delete job #{job.job_id} is queued."
|
@@ -357,7 +362,7 @@ module Command
|
|
357
362
|
|
358
363
|
if wait && !job.finished?
|
359
364
|
wait_job(job)
|
360
|
-
puts "Status : #{job.status}"
|
365
|
+
$stdout.puts "Status : #{job.status}"
|
361
366
|
end
|
362
367
|
end
|
363
368
|
|
@@ -374,9 +379,9 @@ module Command
|
|
374
379
|
client.update_expire(db_name, table_name, expire_days)
|
375
380
|
|
376
381
|
if expire_days == 0
|
377
|
-
puts "Data expiration disabled for this table."
|
382
|
+
$stdout.puts "Data expiration disabled for this table."
|
378
383
|
else
|
379
|
-
puts "Table set to expire data older than #{expire_days} days."
|
384
|
+
$stdout.puts "Table set to expire data older than #{expire_days} days."
|
380
385
|
end
|
381
386
|
end
|
382
387
|
|
@@ -488,12 +493,12 @@ module Command
|
|
488
493
|
begin
|
489
494
|
db = client.database(db_name)
|
490
495
|
rescue ForbiddenError => e
|
491
|
-
puts "Warning: database and table validation skipped - #{e.message}"
|
496
|
+
$stdout.puts "Warning: database and table validation skipped - #{e.message}"
|
492
497
|
else
|
493
498
|
begin
|
494
499
|
table = db.table(table_name)
|
495
500
|
rescue ForbiddenError => e
|
496
|
-
puts "Warning: table validation skipped - #{e.message}"
|
501
|
+
$stdout.puts "Warning: table validation skipped - #{e.message}"
|
497
502
|
end
|
498
503
|
end
|
499
504
|
|
@@ -522,12 +527,12 @@ module Command
|
|
522
527
|
import_log_file(file, path, client, db_name, table_name, parser)
|
523
528
|
}
|
524
529
|
|
525
|
-
puts "done."
|
530
|
+
$stdout.puts "done."
|
526
531
|
end
|
527
532
|
|
528
533
|
private
|
529
534
|
def import_log_file(file, path, client, db_name, table_name, parser)
|
530
|
-
puts "importing #{path}..."
|
535
|
+
$stdout.puts "importing #{path}..."
|
531
536
|
|
532
537
|
out = Tempfile.new('td-import')
|
533
538
|
out.binmode if out.respond_to?(:binmode)
|
@@ -549,17 +554,17 @@ module Command
|
|
549
554
|
n += 1
|
550
555
|
x += 1
|
551
556
|
if n % 10000 == 0 # by records imported
|
552
|
-
puts " imported #{n} entries from #{path}..."
|
557
|
+
$stdout.puts " imported #{n} entries from #{path}..."
|
553
558
|
|
554
559
|
# TODO size
|
555
560
|
elsif out.pos > 1024 * 1024 # by 1 MB chunks
|
556
|
-
puts " imported #{n} entries from #{path}..."
|
561
|
+
$stdout.puts " imported #{n} entries from #{path}..."
|
557
562
|
begin
|
558
563
|
writer.finish
|
559
564
|
size = out.pos
|
560
565
|
out.pos = 0
|
561
566
|
|
562
|
-
puts " uploading #{size} bytes..."
|
567
|
+
$stdout.puts " uploading #{size} bytes..."
|
563
568
|
client.import(db_name, table_name, "msgpack.gz", out, size)
|
564
569
|
|
565
570
|
out.truncate(0)
|
@@ -579,7 +584,7 @@ module Command
|
|
579
584
|
size = out.pos
|
580
585
|
out.pos = 0
|
581
586
|
|
582
|
-
puts " uploading #{size} bytes..."
|
587
|
+
$stdout.puts " uploading #{size} bytes..."
|
583
588
|
# TODO upload on background thread
|
584
589
|
client.import(db_name, table_name, "msgpack.gz", out, size)
|
585
590
|
end
|
@@ -589,7 +594,7 @@ module Command
|
|
589
594
|
raise ImportError, "no valid record to import from #{path}"
|
590
595
|
end
|
591
596
|
|
592
|
-
puts " imported #{n} entries from #{path}."
|
597
|
+
$stdout.puts " imported #{n} entries from #{path}."
|
593
598
|
$stderr.puts normalized_message if has_bignum
|
594
599
|
ensure
|
595
600
|
out.close rescue nil
|
data/lib/td/command/update.rb
CHANGED
@@ -12,11 +12,11 @@ module Command
|
|
12
12
|
end
|
13
13
|
|
14
14
|
start_time = Time.now
|
15
|
-
puts "Updating 'td' from #{TOOLBELT_VERSION}..."
|
15
|
+
$stdout.puts "Updating 'td' from #{TOOLBELT_VERSION}..."
|
16
16
|
if new_version = Updater.update
|
17
|
-
puts "Successfully updated to #{new_version} in #{Command.humanize_time((Time.now - start_time).to_i)}."
|
17
|
+
$stdout.puts "Successfully updated to #{new_version} in #{Command.humanize_time((Time.now - start_time).to_i)}."
|
18
18
|
else
|
19
|
-
puts "Nothing to update."
|
19
|
+
$stdout.puts "Nothing to update."
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
data/lib/td/command/user.rb
CHANGED
@@ -33,7 +33,7 @@ module Command
|
|
33
33
|
rows << {:Name => user.name, :Email => user.email}
|
34
34
|
}
|
35
35
|
|
36
|
-
puts cmd_render_table(rows, :fields => [:Name, :Email], :render_format => op.render_format)
|
36
|
+
$stdout.puts cmd_render_table(rows, :fields => [:Name, :Email], :render_format => op.render_format)
|
37
37
|
|
38
38
|
if rows.empty?
|
39
39
|
$stderr.puts "There are no users."
|
@@ -73,13 +73,13 @@ module Command
|
|
73
73
|
1.times { r << symbol.sort_by{rand}.first }
|
74
74
|
password = r.sort_by{rand}.join
|
75
75
|
|
76
|
-
puts "Password: #{password}"
|
76
|
+
$stdout.puts "Password: #{password}"
|
77
77
|
|
78
78
|
else
|
79
79
|
3.times do
|
80
80
|
begin
|
81
81
|
system "stty -echo" # TODO termios
|
82
|
-
print "Password (typing will be hidden): "
|
82
|
+
$stdout.print "Password (typing will be hidden): "
|
83
83
|
password = STDIN.gets || ""
|
84
84
|
password = password[0..-2] # strip \n
|
85
85
|
rescue Interrupt
|
@@ -87,7 +87,7 @@ module Command
|
|
87
87
|
exit 1
|
88
88
|
ensure
|
89
89
|
system "stty echo" # TODO termios
|
90
|
-
print "\n"
|
90
|
+
$stdout.print "\n"
|
91
91
|
end
|
92
92
|
|
93
93
|
if password.empty?
|
@@ -97,7 +97,7 @@ module Command
|
|
97
97
|
|
98
98
|
begin
|
99
99
|
system "stty -echo" # TODO termios
|
100
|
-
print "Retype password: "
|
100
|
+
$stdout.print "Retype password: "
|
101
101
|
password2 = STDIN.gets || ""
|
102
102
|
password2 = password2[0..-2] # strip \n
|
103
103
|
rescue Interrupt
|
@@ -105,14 +105,14 @@ module Command
|
|
105
105
|
exit 1
|
106
106
|
ensure
|
107
107
|
system "stty echo" # TODO termios
|
108
|
-
print "\n"
|
108
|
+
$stdout.print "\n"
|
109
109
|
end
|
110
110
|
|
111
111
|
if password == password2
|
112
112
|
break
|
113
113
|
end
|
114
114
|
|
115
|
-
puts "Doesn't match."
|
115
|
+
$stdout.puts "Doesn't match."
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
@@ -185,7 +185,7 @@ module Command
|
|
185
185
|
rows << {:Key => key}
|
186
186
|
}
|
187
187
|
|
188
|
-
puts cmd_render_table(rows, :fields => [:Key], :render_format => op.render_format)
|
188
|
+
$stdout.puts cmd_render_table(rows, :fields => [:Key], :render_format => op.render_format)
|
189
189
|
end
|
190
190
|
|
191
191
|
def user_password_change(op)
|
@@ -196,7 +196,7 @@ module Command
|
|
196
196
|
3.times do
|
197
197
|
begin
|
198
198
|
system "stty -echo" # TODO termios
|
199
|
-
print "New password (typing will be hidden): "
|
199
|
+
$stdout.print "New password (typing will be hidden): "
|
200
200
|
password = STDIN.gets || ""
|
201
201
|
password = password[0..-2] # strip \n
|
202
202
|
rescue Interrupt
|
@@ -204,7 +204,7 @@ module Command
|
|
204
204
|
exit 1
|
205
205
|
ensure
|
206
206
|
system "stty echo" # TODO termios
|
207
|
-
print "\n"
|
207
|
+
$stdout.print "\n"
|
208
208
|
end
|
209
209
|
|
210
210
|
if password.empty?
|
@@ -214,7 +214,7 @@ module Command
|
|
214
214
|
|
215
215
|
begin
|
216
216
|
system "stty -echo" # TODO termios
|
217
|
-
print "Retype new password: "
|
217
|
+
$stdout.print "Retype new password: "
|
218
218
|
password2 = STDIN.gets || ""
|
219
219
|
password2 = password2[0..-2] # strip \n
|
220
220
|
rescue Interrupt
|
@@ -222,14 +222,14 @@ module Command
|
|
222
222
|
exit 1
|
223
223
|
ensure
|
224
224
|
system "stty echo" # TODO termios
|
225
|
-
print "\n"
|
225
|
+
$stdout.print "\n"
|
226
226
|
end
|
227
227
|
|
228
228
|
if password == password2
|
229
229
|
break
|
230
230
|
end
|
231
231
|
|
232
|
-
puts "Doesn't match."
|
232
|
+
$stdout.puts "Doesn't match."
|
233
233
|
end
|
234
234
|
|
235
235
|
client = get_client(:ssl => true)
|
data/lib/td/helpers.rb
CHANGED
@@ -3,12 +3,7 @@ module TreasureData
|
|
3
3
|
module_function
|
4
4
|
|
5
5
|
def format_with_delimiter(number, delimiter = ',')
|
6
|
-
|
7
|
-
if formatted = num.gsub!(/(\d)(?=(?:\d{3})+(?!\d))/, "\\1#{delimiter}")
|
8
|
-
formatted
|
9
|
-
else
|
10
|
-
num
|
11
|
-
end
|
6
|
+
number.to_s.gsub(/(\d)(?=(?:\d{3})+(?!\d))/, "\\1#{delimiter}")
|
12
7
|
end
|
13
8
|
|
14
9
|
def home_directory
|
data/lib/td/updater.rb
CHANGED
@@ -166,14 +166,14 @@ module ModuleDefinition
|
|
166
166
|
# downloading the update compressed file
|
167
167
|
File.open("#{download_dir}/td-update.zip", "wb") do |file|
|
168
168
|
endpoint = update_package_endpoint
|
169
|
-
puts "\npackage '#{endpoint}'... " unless ENV['TD_TOOLBELT_DEBUG'].nil?
|
169
|
+
$stdout.puts "\npackage '#{endpoint}'... " unless ENV['TD_TOOLBELT_DEBUG'].nil?
|
170
170
|
stream_fetch(endpoint, file) {
|
171
171
|
indicator.update
|
172
172
|
}
|
173
173
|
end
|
174
174
|
indicator.finish
|
175
175
|
|
176
|
-
print "Unpacking updated toolbelt package..."
|
176
|
+
$stdout.print "Unpacking updated toolbelt package..."
|
177
177
|
Zip::ZipFile.open("#{download_dir}/td-update.zip") do |zip|
|
178
178
|
zip.each do |entry|
|
179
179
|
target = File.join(download_dir, entry.to_s)
|
@@ -181,7 +181,7 @@ module ModuleDefinition
|
|
181
181
|
zip.extract(entry, target) { true }
|
182
182
|
end
|
183
183
|
end
|
184
|
-
print "done\n"
|
184
|
+
$stdout.print "done\n"
|
185
185
|
|
186
186
|
FileUtils.rm "#{download_dir}/td-update.zip"
|
187
187
|
|
@@ -270,7 +270,7 @@ module ModuleDefinition
|
|
270
270
|
|
271
271
|
http.request_get(uri.path) {|response|
|
272
272
|
if response.class == Net::HTTPOK
|
273
|
-
# print a . every tick_period seconds
|
273
|
+
# $stdout.print a . every tick_period seconds
|
274
274
|
response.read_body do |chunk|
|
275
275
|
binfile.write chunk
|
276
276
|
progress.call unless progress.nil?
|
@@ -279,7 +279,7 @@ module ModuleDefinition
|
|
279
279
|
elsif response.class == Net::HTTPFound || \
|
280
280
|
response.class == Net::HTTPRedirection
|
281
281
|
unless ENV['TD_TOOLBELT_DEBUG'].nil?
|
282
|
-
puts "redirect '#{url}' to '#{response['Location']}'... "
|
282
|
+
$stdout.puts "redirect '#{url}' to '#{response['Location']}'... "
|
283
283
|
end
|
284
284
|
return stream_fetch(response['Location'], binfile, &progress)
|
285
285
|
else
|
@@ -353,15 +353,15 @@ end # module ModuleDefinition
|
|
353
353
|
indicator.finish()
|
354
354
|
|
355
355
|
if status
|
356
|
-
puts "Installed td-import.jar v#{version} in '#{Updater.jarfile_dest_path}'.\n"
|
356
|
+
$stdout.puts "Installed td-import.jar v#{version} in '#{Updater.jarfile_dest_path}'.\n"
|
357
357
|
File.rename 'td-import.jar.new', 'td-import.jar'
|
358
358
|
else
|
359
|
-
puts "Update of td-import.jar failed." unless ENV['TD_TOOLBELT_DEBUG'].nil?
|
359
|
+
$stdout.puts "Update of td-import.jar failed." unless ENV['TD_TOOLBELT_DEBUG'].nil?
|
360
360
|
File.delete 'td-import.jar.new' if File.exists? 'td-import.jar.new'
|
361
361
|
end
|
362
362
|
end
|
363
363
|
else
|
364
|
-
puts 'Installed td-import.jar is already at the latest version.' unless hourly
|
364
|
+
$stdout.puts 'Installed td-import.jar is already at the latest version.' unless hourly
|
365
365
|
end
|
366
366
|
end
|
367
367
|
|
@@ -370,7 +370,7 @@ end # module ModuleDefinition
|
|
370
370
|
if !ENV['TD_TOOLBELT_JAR_UPDATE'].nil?
|
371
371
|
# also validates the TD_TOOLBELT_JAR_UPDATE environment variable value
|
372
372
|
if ENV['TD_TOOLBELT_JAR_UPDATE'] == "0"
|
373
|
-
puts "Warning: Bulk Import JAR auto-update disabled by TD_TOOLBELT_JAR_UPDATE=0"
|
373
|
+
$stdout.puts "Warning: Bulk Import JAR auto-update disabled by TD_TOOLBELT_JAR_UPDATE=0"
|
374
374
|
return
|
375
375
|
elsif ENV['TD_TOOLBELT_JAR_UPDATE'] != "1"
|
376
376
|
raise UpdateError,
|
data/lib/td/version.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'td/command/common'
|
3
|
+
require 'td/command/list'
|
4
|
+
require 'td/command/connector'
|
5
|
+
|
6
|
+
module TreasureData::Command
|
7
|
+
describe 'connector commands' do
|
8
|
+
describe '#connector_preview' do
|
9
|
+
subject do
|
10
|
+
backup = $stdout.dup
|
11
|
+
buf = StringIO.new
|
12
|
+
|
13
|
+
begin
|
14
|
+
$stdout = buf
|
15
|
+
|
16
|
+
TreasureData::Command::Runner.new.run ["connector:preview", tempfile]
|
17
|
+
|
18
|
+
buf.string
|
19
|
+
ensure
|
20
|
+
$stdout = backup
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:tempfile) do
|
25
|
+
File.join("spec", "td", "fixture", "bulk_load.yml")
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:preview_result) do
|
29
|
+
{
|
30
|
+
"schema" => [
|
31
|
+
{"index" => 0, "name" => "c0_too_l#{'o' * 60}ng_column_name", "type" => "string"},
|
32
|
+
{"index" => 1, "name" => "c1", "type" => "long"},
|
33
|
+
{"index" => 2, "name" => "c2", "type" => "string"},
|
34
|
+
{"index" => 3, "name" => "c3", "type" => "string"}
|
35
|
+
],
|
36
|
+
"records" => [
|
37
|
+
["19920116", 32864, "06612", "00195"],
|
38
|
+
["19910729", 14824, "07706", "00058"],
|
39
|
+
["19881022", 26114, "06960", "00175"]
|
40
|
+
]
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
before do
|
45
|
+
TreasureData::Client.any_instance.stub(:bulk_load_preview).and_return(preview_result)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should include too_long_column_name without truncated' do
|
49
|
+
too_long_column_name = preview_result["schema"][0]["name"]
|
50
|
+
expect(subject).to include "#{too_long_column_name}:string"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|