td 0.11.6 → 0.11.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog +20 -0
- data/lib/td/command/import.rb +59 -6
- data/lib/td/command/job.rb +16 -16
- data/lib/td/command/list.rb +1 -1
- data/lib/td/command/sched.rb +2 -1
- data/lib/td/command/server.rb +1 -1
- data/lib/td/command/table.rb +7 -3
- data/lib/td/file_reader.rb +3 -1
- data/lib/td/version.rb +1 -1
- data/spec/file_reader/line_reader_spec.rb +13 -4
- data/spec/td/command/import_spec.rb +26 -0
- data/spec/td/command/job_spec.rb +43 -0
- data/spec/td/command_sched_spec.rb +28 -0
- data/spec/td/updater_spec.rb +9 -0
- data/td.gemspec +1 -1
- metadata +10 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4b7f5341cbcebd3487c7df38951a4275204507e
|
4
|
+
data.tar.gz: 9aad2c3285c7beb623a97410b62844ff41f74574
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24846c57a7df595675ca6999412b0c542ac7beb1850adda09de6f9832152954d33ff2be5335b293213f92e492e558ab711f132598587433b0249a4f803eedebc
|
7
|
+
data.tar.gz: 65eed33f8222fe6c3fb57067087d1cc477fb3a9bc64d9d427b0375964281c32726b11f8b65a0258ab77ce914a7530a0aadfaa92adb0d40ae243b5a63369294d9
|
data/ChangeLog
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
== 2015-02-16 version 0.11.7
|
2
|
+
|
3
|
+
* Fix server:endpoint command not working
|
4
|
+
* Experimental new feature: timeout for import subcommands. To prevent Java
|
5
|
+
process stall this option allows user to specify maximum execution seconds
|
6
|
+
for import subcommands by --bulk-import-timeout option. When execution
|
7
|
+
exceeds specified seconds the command fails after sending SIGQUIT to
|
8
|
+
internal java process if it's not running on Windows.
|
9
|
+
NOTE1: the execution time is measured against all subcommand execution. If
|
10
|
+
the command parameter designates perform and commit execution the whole
|
11
|
+
time could be longer than just uploading part files.
|
12
|
+
NOTE2: this option is not shown in help at this moment.
|
13
|
+
* Show full query text for CSV, TSV, and JSON output format (It's now only
|
14
|
+
truncated in table format)
|
15
|
+
* msgpack.gz to CSV/TSV perf optimization. It should be faster around 2 times
|
16
|
+
than before.
|
17
|
+
* Allow to disable table data expiration by setting the period to 0.
|
18
|
+
* Fix sched:history crash when scheduled_at == ""
|
19
|
+
* Several spec fixes. Thanks @yakitorii!
|
20
|
+
|
1
21
|
== 2014-12-03 version 0.11.6
|
2
22
|
|
3
23
|
* Support HTTP proxy for bulk import
|
data/lib/td/command/import.rb
CHANGED
@@ -101,6 +101,7 @@ module Command
|
|
101
101
|
show_help = ARGV.size == 0 || (ARGV.size == 1 || ARGV[0] =~ /^import:/)
|
102
102
|
|
103
103
|
# configure java command-line arguments
|
104
|
+
timeout = nil
|
104
105
|
java_args = []
|
105
106
|
java_args.concat build_sysprops
|
106
107
|
java_args.concat ["-cp", find_td_import_jar]
|
@@ -109,18 +110,70 @@ module Command
|
|
109
110
|
if show_help
|
110
111
|
java_args << "--help"
|
111
112
|
else
|
113
|
+
0.upto(ARGV.length - 1) do |idx|
|
114
|
+
if ARGV[idx] == '--bulk-import-timeout'
|
115
|
+
timeout = ARGV[idx + 1]
|
116
|
+
if timeout.nil?
|
117
|
+
raise ArgumentError, 'timeout not given'
|
118
|
+
end
|
119
|
+
timeout = Integer(timeout)
|
120
|
+
ARGV.slice!(idx, 2)
|
121
|
+
end
|
122
|
+
end
|
112
123
|
java_args.concat ARGV
|
113
124
|
end
|
114
|
-
|
115
125
|
cmd = [JAVA_COMMAND] + JVM_OPTS + java_args
|
116
|
-
|
117
|
-
|
118
|
-
raise BulkImportExecutionError,
|
119
|
-
"Bulk Import returned error #{$?.exitstatus}. Please check the 'td-bulk-import.log' logfile for details."
|
120
|
-
end
|
126
|
+
|
127
|
+
CommandExecutor.new(cmd, timeout).execute
|
121
128
|
end
|
122
129
|
|
130
|
+
class CommandExecutor
|
131
|
+
def initialize(cmd, timeout)
|
132
|
+
@cmd, @timeout = cmd, timeout
|
133
|
+
end
|
134
|
+
|
135
|
+
def execute
|
136
|
+
status = execute_command
|
137
|
+
if status.exitstatus != 0
|
138
|
+
raise BulkImportExecutionError,
|
139
|
+
"Bulk Import returned error #{status.exitstatus}. Please check the 'td-bulk-import.log' logfile for details."
|
140
|
+
end
|
141
|
+
status
|
142
|
+
end
|
143
|
+
|
123
144
|
private
|
145
|
+
|
146
|
+
def execute_command
|
147
|
+
if @timeout
|
148
|
+
require 'timeout'
|
149
|
+
pid = nil
|
150
|
+
begin
|
151
|
+
Timeout.timeout(@timeout) do
|
152
|
+
pid = Process.spawn(*@cmd)
|
153
|
+
Process.waitpid(pid)
|
154
|
+
return $?
|
155
|
+
end
|
156
|
+
rescue Timeout::Error
|
157
|
+
if pid
|
158
|
+
require 'rbconfig'
|
159
|
+
# win32 ruby does not support QUIT and TERM
|
160
|
+
if RbConfig::CONFIG['host_os'] !~ /mswin|mingw|cygwin/
|
161
|
+
Process.kill('QUIT', pid)
|
162
|
+
Process.kill('TERM', pid)
|
163
|
+
else
|
164
|
+
# just kill without thread dump on win32 platforms
|
165
|
+
Process.kill('KILL', pid)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
raise BulkImportExecutionError, "Bulk Import execution timed out: #{@timeout} [sec]"
|
169
|
+
end
|
170
|
+
else
|
171
|
+
system(*@cmd)
|
172
|
+
return $?
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
124
177
|
def check_java
|
125
178
|
if RbConfig::CONFIG["target_os"].downcase =~ /mswin(?!ce)|mingw|cygwin|bccwin/ # windows
|
126
179
|
cmd = "#{JAVA_COMMAND} -version > NUL 2>&1"
|
data/lib/td/command/job.rb
CHANGED
@@ -75,12 +75,13 @@ module Command
|
|
75
75
|
elapsed = Command.humanize_elapsed_time(start, job.end_at)
|
76
76
|
cpu_time = Command.humanize_time(job.cpu_time, true)
|
77
77
|
priority = job_priority_name_of(job.priority)
|
78
|
+
query = (op.render_format == 'table' || op.render_format.nil? ? job.query.to_s[0,50] + " ..." : job.query)
|
78
79
|
rows << {
|
79
80
|
:JobID => job.job_id,
|
80
81
|
:Database => job.db_name,
|
81
82
|
:Status => job.status,
|
82
83
|
:Type => job.type,
|
83
|
-
:Query =>
|
84
|
+
:Query => query,
|
84
85
|
:Start => (start ? start.localtime : ''),
|
85
86
|
:Elapsed => elapsed.rjust(11),
|
86
87
|
:CPUTime => cpu_time.rjust(17),
|
@@ -384,13 +385,15 @@ module Command
|
|
384
385
|
job.result_size, 0.1, 1)
|
385
386
|
end
|
386
387
|
job.result_each_with_compr_size {|row, compr_size|
|
387
|
-
indicator.update(compr_size) unless output.nil?
|
388
388
|
# TODO limit the # of columns
|
389
389
|
writer << row.map {|col|
|
390
390
|
dump_column(col)
|
391
391
|
}
|
392
392
|
n_rows += 1
|
393
|
-
|
393
|
+
if n_rows % 100 == 0 # flush every 100 recods
|
394
|
+
writer.flush
|
395
|
+
indicator.update(compr_size) unless output.nil?
|
396
|
+
end
|
394
397
|
break if output.nil? and !limit.nil? and n_rows == limit
|
395
398
|
}
|
396
399
|
indicator.finish unless output.nil?
|
@@ -415,17 +418,12 @@ module Command
|
|
415
418
|
job.result_size, 0.1, 1)
|
416
419
|
end
|
417
420
|
job.result_each_with_compr_size {|row, compr_size|
|
418
|
-
|
419
|
-
n_cols = 0
|
420
|
-
row.each {|col|
|
421
|
-
f.write "\t" if n_cols > 0
|
422
|
-
# TODO limit the # of columns
|
423
|
-
f.write dump_column(col)
|
424
|
-
n_cols += 1
|
425
|
-
}
|
426
|
-
f.write "\n"
|
421
|
+
f.write row.map {|col| dump_column(col)}.join("\t") + "\n"
|
427
422
|
n_rows += 1
|
428
|
-
|
423
|
+
if n_rows % 100 == 0
|
424
|
+
f.flush # flush every 100 recods
|
425
|
+
indicator.update(compr_size) unless output.nil?
|
426
|
+
end
|
429
427
|
break if output.nil? and !limit.nil? and n_rows == limit
|
430
428
|
}
|
431
429
|
indicator.finish unless output.nil?
|
@@ -495,7 +493,7 @@ module Command
|
|
495
493
|
job.result_each_with_compr_size {|row, compr_size|
|
496
494
|
indicator.update(compr_size)
|
497
495
|
rows << row.map {|v|
|
498
|
-
|
496
|
+
dump_column_safe_utf8(v)
|
499
497
|
}
|
500
498
|
n_rows += 1
|
501
499
|
break if !limit.nil? and n_rows == limit
|
@@ -517,9 +515,11 @@ module Command
|
|
517
515
|
end
|
518
516
|
|
519
517
|
def dump_column(v)
|
520
|
-
|
518
|
+
v.is_a?(String) ? v.to_s : Yajl.dump(v)
|
519
|
+
end
|
521
520
|
|
522
|
-
|
521
|
+
def dump_column_safe_utf8(v)
|
522
|
+
s = dump_column(v)
|
523
523
|
# Here does UTF-8 -> UTF-16LE -> UTF8 conversion:
|
524
524
|
# a) to make sure the string doesn't include invalid byte sequence
|
525
525
|
# b) to display multi-byte characters as it is
|
data/lib/td/command/list.rb
CHANGED
@@ -230,7 +230,7 @@ module List
|
|
230
230
|
add_list 'table:swap', %w[db table1 table2], 'Swap names of two tables', ['table:swap example_db table1 table2']
|
231
231
|
add_list 'table:tail', %w[db table], 'Get recently imported logs', ['table:tail example_db table1', 'table:tail example_db table1 -t "2011-01-02 03:04:05" -n 30']
|
232
232
|
add_list 'table:partial_delete', %w[db table], 'Delete logs from the table within the specified time range', ['table:partial_delete example_db table1 --from 1341000000 --to 1341003600']
|
233
|
-
add_list 'table:expire', %w[db table expire_days], 'Expire data in table after specified number of days', ['table:expire example_db table1 30']
|
233
|
+
add_list 'table:expire', %w[db table expire_days], 'Expire data in table after specified number of days. Set to 0 to disable the expiration.', ['table:expire example_db table1 30']
|
234
234
|
|
235
235
|
add_list 'bulk_import:list', %w[], 'List bulk import sessions', ['bulk_import:list']
|
236
236
|
add_list 'bulk_import:show', %w[name], 'Show list of uploaded parts', ['bulk_import:show']
|
data/lib/td/command/sched.rb
CHANGED
@@ -273,7 +273,8 @@ module Command
|
|
273
273
|
|
274
274
|
rows = []
|
275
275
|
history.each {|j|
|
276
|
-
|
276
|
+
scheduled_at = j.scheduled_at ? j.scheduled_at.localtime : nil
|
277
|
+
rows << {:Time => scheduled_at, :JobID => j.job_id, :Status => j.status, :Priority => job_priority_name_of(j.priority), :Result=>j.result_url}
|
277
278
|
}
|
278
279
|
|
279
280
|
puts cmd_render_table(rows, :fields => [:JobID, :Time, :Status, :Priority, :Result], :render_format => op.render_format)
|
data/lib/td/command/server.rb
CHANGED
data/lib/td/command/table.rb
CHANGED
@@ -412,15 +412,19 @@ module Command
|
|
412
412
|
db_name, table_name, expire_days = op.cmd_parse
|
413
413
|
|
414
414
|
expire_days = expire_days.to_i
|
415
|
-
if expire_days
|
416
|
-
$stderr.puts "Table expiration days must be greater
|
415
|
+
if expire_days < 0
|
416
|
+
$stderr.puts "Table expiration days must be greater or equal to 0."
|
417
417
|
return
|
418
418
|
end
|
419
419
|
|
420
420
|
client = get_client
|
421
421
|
client.update_expire(db_name, table_name, expire_days)
|
422
422
|
|
423
|
-
|
423
|
+
if expire_days == 0
|
424
|
+
puts "Data expiration disabled for this table."
|
425
|
+
else
|
426
|
+
puts "Table set to expire data older than #{expire_days} days."
|
427
|
+
end
|
424
428
|
end
|
425
429
|
|
426
430
|
|
data/lib/td/file_reader.rb
CHANGED
data/lib/td/version.rb
CHANGED
@@ -33,12 +33,21 @@ describe FileReader::LineReader do
|
|
33
33
|
|
34
34
|
it 'initialize with specifid encoding' do
|
35
35
|
if io.respond_to?(:external_encoding)
|
36
|
-
|
36
|
+
original_encoding = io.external_encoding
|
37
|
+
end
|
38
|
+
|
39
|
+
# when RUBY_VERSION >= 2.0, default encoding is utf-8.
|
40
|
+
# ensure that external_encoding is differ from the original external_encoding(original_encoding).
|
41
|
+
if original_encoding == Encoding.find('utf-8')
|
42
|
+
specified_encoding = 'sjis'
|
43
|
+
else
|
44
|
+
specified_encoding = 'utf-8'
|
37
45
|
end
|
38
|
-
|
46
|
+
|
47
|
+
FileReader::LineReader.new(io, error, {:encoding => specified_encoding})
|
39
48
|
if io.respond_to?(:external_encoding)
|
40
|
-
io.external_encoding.should_not ==
|
41
|
-
io.external_encoding.should == Encoding.find(
|
49
|
+
io.external_encoding.should_not == original_encoding
|
50
|
+
io.external_encoding.should == Encoding.find(specified_encoding)
|
42
51
|
end
|
43
52
|
end
|
44
53
|
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'td/command/common'
|
3
|
+
require 'td/command/import'
|
4
|
+
|
5
|
+
module TreasureData::Command
|
6
|
+
describe 'import commands' do
|
7
|
+
describe CommandExecutor do
|
8
|
+
it 'executes command' do
|
9
|
+
CommandExecutor.new(['echo'], nil).execute.exitstatus.should == 0
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'executes command' do
|
13
|
+
expect {
|
14
|
+
CommandExecutor.new(['exit', '1'], nil).execute
|
15
|
+
}.to raise_error BulkImportExecutionError, /td-bulk-import\.log/
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'terminates process on timeout' do
|
19
|
+
CommandExecutor.new(['sleep', '1'], 2).execute
|
20
|
+
expect {
|
21
|
+
CommandExecutor.new(['sleep', '2'], 1).execute
|
22
|
+
}.to raise_error BulkImportExecutionError, /timed out/
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'td/command/common'
|
3
|
+
require 'td/command/job'
|
4
|
+
require 'td/command/list'
|
5
|
+
require 'tempfile'
|
6
|
+
|
7
|
+
module TreasureData::Command
|
8
|
+
describe 'job commands' do
|
9
|
+
let :command do
|
10
|
+
Class.new { include TreasureData::Command }.new
|
11
|
+
end
|
12
|
+
|
13
|
+
let :job do
|
14
|
+
job = TreasureData::Job.new(nil, 12345, 'hive', 'select * from employee')
|
15
|
+
job.instance_eval do
|
16
|
+
@result = [[["1", 2.0, {key:3}], 1], [["4", 5.0, {key:6}], 2], [["7", 8.0, {key:9}], 3]]
|
17
|
+
@result_size = 3
|
18
|
+
@status = 'success'
|
19
|
+
end
|
20
|
+
job
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'write_result' do
|
24
|
+
it 'supports json output' do
|
25
|
+
file = Tempfile.new("job_spec")
|
26
|
+
command.send(:show_result, job, file, nil, 'json')
|
27
|
+
File.read(file.path).should == %Q([["1",2.0,{"key":3}],\n["4",5.0,{"key":6}],\n["7",8.0,{"key":9}]])
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'supports csv output' do
|
31
|
+
file = Tempfile.new("job_spec")
|
32
|
+
command.send(:show_result, job, file, nil, 'csv')
|
33
|
+
File.read(file.path).should == %Q(1,2.0,"{""key"":3}"\n4,5.0,"{""key"":6}"\n7,8.0,"{""key"":9}"\n)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'supports tsv output' do
|
37
|
+
file = Tempfile.new("job_spec")
|
38
|
+
command.send(:show_result, job, file, nil, 'tsv')
|
39
|
+
File.read(file.path).should == %Q(1\t2.0\t{"key":3}\n4\t5.0\t{"key":6}\n7\t8.0\t{"key":9}\n)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'td/command/common'
|
3
|
+
require 'td/config'
|
4
|
+
require 'td/command/list'
|
5
|
+
require 'td/command/sched'
|
6
|
+
require 'td/client/model'
|
7
|
+
require 'time'
|
8
|
+
|
9
|
+
module TreasureData::Command
|
10
|
+
|
11
|
+
describe 'sched_history' do
|
12
|
+
it 'runs' do
|
13
|
+
client = Object.new
|
14
|
+
time = Time.now.xmlschema
|
15
|
+
job_params = ['job_id', :type, 'query', 'status', nil, nil, time, time, 123, 456]
|
16
|
+
job1 = TreasureData::ScheduledJob.new(client, '2015-02-17 13:22:52 +0900', *job_params)
|
17
|
+
job2 = TreasureData::ScheduledJob.new(client, nil, *job_params)
|
18
|
+
client.stub(:schedules).and_return([])
|
19
|
+
client.stub(:history).and_return([job1, job2])
|
20
|
+
command = Class.new { include TreasureData::Command }.new
|
21
|
+
command.stub(:get_client).and_return(client)
|
22
|
+
op = List::CommandParser.new('sched:history', %w[], %w[], false, [], [])
|
23
|
+
expect {
|
24
|
+
command.sched_history(op)
|
25
|
+
}.to_not raise_exception
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/td/updater_spec.rb
CHANGED
@@ -162,6 +162,10 @@ module TreasureData::Updater
|
|
162
162
|
'/maven2/com/treasuredata/td-import/maven-metadata.xml',
|
163
163
|
WEBrick::HTTPServlet::ProcHandler.new(method(:metadata).to_proc)
|
164
164
|
)
|
165
|
+
@server.mount(
|
166
|
+
'/maven2/com/treasuredata/td-import/version/td-import-version-jar-with-dependencies.jar',
|
167
|
+
WEBrick::HTTPServlet::ProcHandler.new(method(:jar).to_proc)
|
168
|
+
)
|
165
169
|
@server_thread = start_server_thread(@server)
|
166
170
|
@server
|
167
171
|
end
|
@@ -181,6 +185,11 @@ module TreasureData::Updater
|
|
181
185
|
res.body = '<metadata><versioning><lastUpdated>20141204123456</lastUpdated><release>version</release></versioning></metadata>'
|
182
186
|
end
|
183
187
|
|
188
|
+
def jar
|
189
|
+
res['content-type'] = 'application/octet-stream'
|
190
|
+
res.body = File.read(fixture_file('tmp.zip'))
|
191
|
+
end
|
192
|
+
|
184
193
|
def start_server_thread(server)
|
185
194
|
t = Thread.new {
|
186
195
|
Thread.current.abort_on_exception = true
|
data/td.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |gem|
|
|
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.
|
24
|
+
gem.add_dependency "td-client", "~> 0.8.68"
|
25
25
|
gem.add_dependency "td-logger", "~> 0.3.21"
|
26
26
|
gem.add_dependency "rubyzip", "~> 0.9.9"
|
27
27
|
gem.add_development_dependency "rake", "~> 0.9"
|
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.11.
|
4
|
+
version: 0.11.7
|
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:
|
11
|
+
date: 2015-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -102,14 +102,14 @@ dependencies:
|
|
102
102
|
requirements:
|
103
103
|
- - ~>
|
104
104
|
- !ruby/object:Gem::Version
|
105
|
-
version: 0.8.
|
105
|
+
version: 0.8.68
|
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.
|
112
|
+
version: 0.8.68
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: td-logger
|
115
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -248,6 +248,9 @@ files:
|
|
248
248
|
- spec/file_reader/shared_context.rb
|
249
249
|
- spec/file_reader_spec.rb
|
250
250
|
- spec/spec_helper.rb
|
251
|
+
- spec/td/command/import_spec.rb
|
252
|
+
- spec/td/command/job_spec.rb
|
253
|
+
- spec/td/command_sched_spec.rb
|
251
254
|
- spec/td/common_spec.rb
|
252
255
|
- spec/td/fixture/ca.cert
|
253
256
|
- spec/td/fixture/server.cert
|
@@ -288,6 +291,9 @@ test_files:
|
|
288
291
|
- spec/file_reader/shared_context.rb
|
289
292
|
- spec/file_reader_spec.rb
|
290
293
|
- spec/spec_helper.rb
|
294
|
+
- spec/td/command/import_spec.rb
|
295
|
+
- spec/td/command/job_spec.rb
|
296
|
+
- spec/td/command_sched_spec.rb
|
291
297
|
- spec/td/common_spec.rb
|
292
298
|
- spec/td/fixture/ca.cert
|
293
299
|
- spec/td/fixture/server.cert
|