td 0.10.22 → 0.10.23

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,4 +1,12 @@
1
1
 
2
+ == 2012-04-26 version 0.10.23
3
+
4
+ * Added result:list, result:create and result:delete subcommands
5
+ * query subcommand supports -r <result URL> option
6
+ * sched:create subcommand supports -r <result URL> option
7
+ * Added table:export subcommand
8
+
9
+
2
10
  == 2012-04-04 version 0.10.22
3
11
 
4
12
  * Added missing data/sample_apache.json file
@@ -15,12 +15,17 @@ module Command
15
15
  @render_indent = ''
16
16
  end
17
17
 
18
- def get_client
18
+ def get_client(opts={})
19
19
  apikey = Config.apikey
20
20
  unless apikey
21
21
  raise ConfigError, "Account is not configured."
22
22
  end
23
- Client.new(apikey)
23
+ Client.new(apikey, opts)
24
+ end
25
+
26
+ def get_ssl_client(opts={})
27
+ opts[:ssl] = true
28
+ get_client(opts)
24
29
  end
25
30
 
26
31
  def cmd_render_table(rows, *opts)
@@ -96,5 +101,29 @@ module Command
96
101
  table
97
102
  end
98
103
 
104
+ def ask_password(max=3, &block)
105
+ 3.times do
106
+ begin
107
+ system "stty -echo" # TODO termios
108
+ print "Password (typing will be hidden): "
109
+ password = STDIN.gets || ""
110
+ password = password[0..-2] # strip \n
111
+ rescue Interrupt
112
+ $stderr.print "\ncanceled."
113
+ exit 1
114
+ ensure
115
+ system "stty echo" # TODO termios
116
+ print "\n"
117
+ end
118
+
119
+ if password.empty?
120
+ $stderr.puts "canceled."
121
+ exit 0
122
+ end
123
+
124
+ yield password
125
+ end
126
+ end
127
+
99
128
  end
100
129
  end
@@ -0,0 +1,84 @@
1
+
2
+ module TreasureData
3
+ module Command
4
+
5
+ def table_export(op)
6
+ from = nil
7
+ to = nil
8
+ s3_bucket = nil
9
+ aws_access_key_id = nil
10
+ aws_secret_access_key = nil
11
+ file_format = "json.gz"
12
+
13
+ op.on('-f', '--from TIME', 'export data which is newer than or same with the TIME') {|s|
14
+ from = export_parse_time(s)
15
+ }
16
+ op.on('-t', '--to TIME', 'export data which is older than the TIME') {|s|
17
+ to = export_parse_time(s)
18
+ }
19
+ op.on('-b', '--s3-bucket NAME', 'name of the destination S3 bucket (required)') {|s|
20
+ s3_bucket = s
21
+ }
22
+ op.on('-k', '--aws-key-id KEY_ID', 'AWS access key id to export data (required)') {|s|
23
+ aws_access_key_id = s
24
+ }
25
+ op.on('-s', '--aws-secret-key SECRET_KEY', 'AWS secret access key to export data (required)') {|s|
26
+ aws_secret_access_key = s
27
+ }
28
+
29
+ db_name, table_name = op.cmd_parse
30
+
31
+ unless s3_bucket
32
+ $stderr.puts "-b, --s3-bucket NAME option is required."
33
+ exit 1
34
+ end
35
+
36
+ unless aws_access_key_id
37
+ $stderr.puts "-k, --aws-key-id KEY_ID option is required."
38
+ exit 1
39
+ end
40
+
41
+ unless aws_secret_access_key
42
+ $stderr.puts "-s, --aws-secret-key SECRET_KEY option is required."
43
+ exit 1
44
+ end
45
+
46
+ client = get_client
47
+
48
+ get_table(client, db_name, table_name)
49
+
50
+ client = get_ssl_client
51
+
52
+ s3_opts = {}
53
+ s3_opts['from'] = from.to_s if from
54
+ s3_opts['to'] = to.to_s if to
55
+ s3_opts['file_format'] = file_format
56
+ s3_opts['bucket'] = s3_bucket
57
+ s3_opts['access_key_id'] = aws_access_key_id
58
+ s3_opts['secret_access_key'] = aws_secret_access_key
59
+
60
+ job = client.export(db_name, table_name, "s3", s3_opts)
61
+
62
+ $stderr.puts "Export job #{job.job_id} is queued."
63
+ $stderr.puts "Use '#{$prog} job:show #{job.job_id}' to show the status."
64
+ end
65
+
66
+ private
67
+ def export_parse_time(time)
68
+ if time.to_i.to_s == time.to_s
69
+ # UNIX time
70
+ return time.to_i
71
+ else
72
+ require 'time'
73
+ begin
74
+ return Time.parse(time).to_i
75
+ rescue
76
+ $stderr.puts "invalid time format: #{time}"
77
+ exit 1
78
+ end
79
+ end
80
+ end
81
+
82
+ end
83
+ end
84
+
@@ -5,14 +5,21 @@ module Command
5
5
  def help(op)
6
6
  cmd = op.cmd_parse
7
7
 
8
- usage = List.cmd_usage(cmd)
9
- unless usage
10
- $stderr.puts "'#{cmd}' is not a td command. Run '#{$prog}' to show the list."
11
- List.show_guess(cmd)
8
+ c = List.get_option(cmd)
9
+ if c == nil
10
+ $stderr.puts "'#{cmd}' is not a td command. Run '#{$prog}' to show the list."
11
+ List.show_guess(cmd)
12
+ exit 1
13
+
14
+ elsif c.name != cmd && c.group == cmd
15
+ # group command
16
+ puts List.cmd_usage(cmd)
12
17
  exit 1
13
- end
14
18
 
15
- puts usage
19
+ else
20
+ method = List.get_method(cmd)
21
+ method.call(['--help'])
22
+ end
16
23
  end
17
24
 
18
25
  def help_all(op)
@@ -38,7 +38,7 @@ module Command
38
38
  next if error && !job.error?
39
39
  start = job.start_at
40
40
  elapsed = cmd_format_elapsed(start, job.end_at)
41
- rows << {:JobID => job.job_id, :Status => job.status, :Query => job.query.to_s, :Start => (start ? start.localtime : ''), :Elapsed => elapsed, :Result => job.rset_name}
41
+ rows << {:JobID => job.job_id, :Status => job.status, :Query => job.query.to_s, :Start => (start ? start.localtime : ''), :Elapsed => elapsed, :Result => job.result_url}
42
42
  }
43
43
 
44
44
  puts cmd_render_table(rows, :fields => [:JobID, :Status, :Start, :Elapsed, :Result, :Query])
@@ -76,7 +76,7 @@ module Command
76
76
  puts "URL : #{job.url}"
77
77
  puts "Status : #{job.status}"
78
78
  puts "Query : #{job.query}"
79
- puts "Result table : #{job.rset_name}"
79
+ puts "Result table : #{job.result_url}"
80
80
 
81
81
  if wait && !job.finished?
82
82
  wait_job(job)
@@ -143,9 +143,10 @@ module List
143
143
 
144
144
  def self.cmd_usage(name)
145
145
  if c = COMMAND[name]
146
- c.create_optparse([]).cmd_usage
146
+ c.create_optparse([]).to_s
147
+ else
148
+ nil
147
149
  end
148
- nil
149
150
  end
150
151
 
151
152
  def self.get_method(name)
@@ -211,24 +212,22 @@ module List
211
212
  end
212
213
 
213
214
  add_list 'db:list', %w[], 'Show list of tables in a database', 'db:list', 'dbs'
214
- add_list 'db:show', %w[db], 'Describe a information of a database', 'db example_db'
215
+ add_list 'db:show', %w[db], 'Describe information of a database', 'db example_db'
215
216
  add_list 'db:create', %w[db], 'Create a database', 'db:create example_db'
216
217
  add_list 'db:delete', %w[db], 'Delete a database', 'db:delete example_db'
217
218
 
218
219
  add_list 'table:list', %w[db?], 'Show list of tables', 'table:list', 'table:list example_db', 'tables'
219
- add_list 'table:show', %w[db table], 'Describe a information of a table', 'table example_db table1'
220
+ add_list 'table:show', %w[db table], 'Describe information of a table', 'table example_db table1'
220
221
  add_list 'table:create', %w[db table], 'Create a table', 'table:create example_db table1'
221
222
  add_list 'table:delete', %w[db table], 'Delete a table', 'table:delete example_db table1'
222
223
  add_list 'table:import', %w[db table files_], 'Parse and import files to a table', 'table:import example_db table1 --apache access.log', 'table:import example_db table1 --json -t time - < test.json'
223
- add_list 'table:export', %w[db table], 'Dump logs in a table to the specified storage', 'table:export example_db table1 --s3-bucket mybucket'
224
+ add_list 'table:export', %w[db table], 'Dump logs in a table to the specified storage', 'table:export example_db table1 --s3-bucket mybucket -k KEY_ID -s SECRET_KEY'
224
225
  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'
225
226
 
226
- add_list 'result:info', %w[], 'Show information of the MySQL server', 'result:info'
227
- add_list 'result:list', %w[], 'Show list of result tables', 'result:list', 'results'
228
- add_list 'result:create', %w[name], 'Create a result table', 'result:create rset1'
229
- add_list 'result:delete', %w[name], 'Delete a result table', 'result:delete rset1'
230
- add_list 'result:connect', %w[sql?], 'Connect to the server using mysql command', 'result:connect'
231
- #add_list 'result:get', %w[name], 'Download dump of the result table'
227
+ add_list 'result:list', %w[], 'Show list of result URLs', 'result:list', 'results'
228
+ add_list 'result:show', %w[name], 'Describe information of a result URL', 'result mydb'
229
+ add_list 'result:create', %w[name URL], 'Create a result URL', 'result:create mydb mysql://my-server/mydb'
230
+ add_list 'result:delete', %w[name], 'Delete a result URL', 'result:delete mydb'
232
231
 
233
232
  add_list 'status', %w[], 'Show schedules, jobs, tables and results', 'status', 's'
234
233
 
@@ -284,7 +283,7 @@ module List
284
283
  add_alias 'table', 'table:show'
285
284
  add_alias 'tables', 'table:list'
286
285
 
287
- add_alias 'result', 'help' # dummy
286
+ add_alias 'result', 'result:show'
288
287
  add_alias 'results', 'result:list'
289
288
 
290
289
  add_alias 'schema', 'schema:show'
@@ -7,7 +7,9 @@ module Command
7
7
  wait = false
8
8
  output = nil
9
9
  format = 'tsv'
10
- result = nil
10
+ result_url = nil
11
+ result_user = nil
12
+ result_ask_password = false
11
13
 
12
14
  op.on('-d', '--database DB_NAME', 'use the database (required)') {|s|
13
15
  db_name = s
@@ -15,9 +17,6 @@ module Command
15
17
  op.on('-w', '--wait', 'wait for finishing the job', TrueClass) {|b|
16
18
  wait = b
17
19
  }
18
- op.on('-r', '--result RESULT_TABLE', 'write result to the result table (use result:create command)') {|s|
19
- result = s
20
- }
21
20
  op.on('-o', '--output PATH', 'write result to the file') {|s|
22
21
  output = s
23
22
  }
@@ -27,6 +26,15 @@ module Command
27
26
  end
28
27
  format = s
29
28
  }
29
+ op.on('-r', '--result RESULT_URL', 'write result to the URL (see also result:create subcommand)') {|s|
30
+ result_url = s
31
+ }
32
+ op.on('-u', '--user NAME', 'set user name for the result URL') {|s|
33
+ result_user = s
34
+ }
35
+ op.on('-p', '--password', 'ask password for the result URL') {|s|
36
+ result_ask_password = true
37
+ }
30
38
 
31
39
  sql = op.cmd_parse
32
40
 
@@ -35,12 +43,17 @@ module Command
35
43
  exit 1
36
44
  end
37
45
 
46
+ if result_url
47
+ require 'td/command/result'
48
+ result_url = build_result_url(result_url, result_user, result_ask_password)
49
+ end
50
+
38
51
  client = get_client
39
52
 
40
53
  # local existance check
41
54
  get_database(client, db_name)
42
55
 
43
- job = client.query(db_name, sql, result)
56
+ job = client.query(db_name, sql, result_url)
44
57
 
45
58
  $stderr.puts "Job #{job.job_id} is queued."
46
59
  $stderr.puts "Use '#{$prog} job:show #{job.job_id}' to show the status."
@@ -2,19 +2,22 @@
2
2
  module TreasureData
3
3
  module Command
4
4
 
5
- def result_info(op)
6
- op.cmd_parse
5
+ def result_show(op)
6
+ name = op.cmd_parse
7
7
 
8
8
  client = get_client
9
9
 
10
- info = client.result_set_info
10
+ rs = client.results
11
+ r = rs.find {|r| name == r.name }
12
+
13
+ unless r
14
+ $stderr.puts "Result URL '#{name}' does not exist."
15
+ $stderr.puts "Use '#{$prog} result:create #{name} <URL>' to create the URL."
16
+ exit 1
17
+ end
11
18
 
12
- puts "Type : #{info.type}"
13
- puts "Host : #{info.host}"
14
- puts "Port : #{info.port}"
15
- puts "User : #{info.user}"
16
- puts "Password : #{info.password}"
17
- puts "Database : #{info.database}"
19
+ puts "Name : #{r.name}"
20
+ puts "URL : #{r.url}"
18
21
  end
19
22
 
20
23
  def result_list(op)
@@ -22,39 +25,51 @@ module Command
22
25
 
23
26
  client = get_client
24
27
 
25
- rsets = client.result_sets
28
+ rs = client.results
26
29
 
27
30
  rows = []
28
- rsets.each {|rset|
29
- rows << {:Name => rset.name}
31
+ rs.each {|r|
32
+ rows << {:Name => r.name, :URL => r.url}
30
33
  }
31
34
  rows = rows.sort_by {|map|
32
35
  map[:Name]
33
36
  }
34
37
 
35
- puts cmd_render_table(rows, :fields => [:Name])
38
+ puts cmd_render_table(rows, :fields => [:Name, :URL])
36
39
 
37
- if rsets.empty?
38
- $stderr.puts "There are result tables."
39
- $stderr.puts "Use '#{$prog} result:create <name>' to create a result table."
40
+ if rs.empty?
41
+ $stderr.puts "There are no result URLs."
42
+ $stderr.puts "Use '#{$prog} result:create <name> <url>' to create a result URL."
40
43
  end
41
44
  end
42
45
 
43
46
  def result_create(op)
44
- name = op.cmd_parse
47
+ result_user = nil
48
+ result_ask_password = false
49
+
50
+ op.on('-u', '--user NAME', 'set user name for authentication') {|s|
51
+ result_user = s
52
+ }
53
+ op.on('-p', '--password', 'ask password for authentication') {|s|
54
+ result_ask_password = true
55
+ }
56
+
57
+ name, url = op.cmd_parse
45
58
 
46
59
  API.validate_database_name(name)
47
60
 
48
61
  client = get_client
49
62
 
63
+ url = build_result_url(url, result_user, result_ask_password)
64
+
50
65
  begin
51
- client.create_result_set(name)
66
+ client.create_result(name, url)
52
67
  rescue AlreadyExistsError
53
- $stderr.puts "Result table '#{name}' already exists."
68
+ $stderr.puts "Result URL '#{name}' already exists."
54
69
  exit 1
55
70
  end
56
71
 
57
- $stderr.puts "Result table '#{name}' is created."
72
+ $stderr.puts "Result URL '#{name}' is created."
58
73
  end
59
74
 
60
75
  def result_delete(op)
@@ -63,49 +78,49 @@ module Command
63
78
  client = get_client
64
79
 
65
80
  begin
66
- client.delete_result_set(name)
81
+ client.delete_result(name)
67
82
  rescue NotFoundError
68
- $stderr.puts "Result table '#{name}' does not exist."
83
+ $stderr.puts "Result URL '#{name}' does not exist."
69
84
  exit 1
70
85
  end
71
86
 
72
- $stderr.puts "Result table '#{name}' is deleted."
87
+ $stderr.puts "Result URL '#{name}' is deleted."
73
88
  end
74
89
 
75
- def result_connect(op)
76
- mysql = 'mysql'
77
-
78
- op.on('-e', '--execute MYSQL', 'mysql command') {|s|
79
- mysql = s
80
- }
81
-
82
- sql = op.cmd_parse
83
-
84
- client = get_client
85
-
86
- info = client.result_set_info
87
-
88
- cmd = [mysql, '-h', info.host, '-P', info.port.to_s, '-u', info.user, "--password=#{info.password}", info.database]
89
-
90
- cmd_start = Time.now
91
-
92
- if sql
93
- IO.popen(cmd, "w") {|io|
94
- io.write sql
95
- io.close
96
- }
97
- else
98
- STDERR.puts "> #{cmd.join(' ')}"
99
- system(*cmd)
90
+ private
91
+ def build_result_url(url, user, ask_password)
92
+ if ask_password
93
+ begin
94
+ system "stty -echo" # TODO termios
95
+ print "Password (typing will be hidden): "
96
+ password = STDIN.gets || ""
97
+ password = password[0..-2] # strip \n
98
+ rescue Interrupt
99
+ $stderr.print "\ncanceled."
100
+ exit 1
101
+ ensure
102
+ system "stty echo" # TODO termios
103
+ print "\n"
104
+ end
100
105
  end
101
106
 
102
- cmd_alive = Time.now - cmd_start
103
- if $?.to_i != 0 && cmd_alive < 1.0
104
- STDERR.puts "Command died within 1 second with exit code #{$?.to_i}."
105
- STDERR.puts "Please confirm mysql command is installed."
107
+ ups = nil
108
+ if user && password
109
+ require 'cgi'
110
+ ups = "#{CGI.escape(user)}:#{CGI.escape(password)}@"
111
+ elsif user
112
+ require 'cgi'
113
+ ups = "#{CGI.escape(user)}@"
114
+ elsif password
115
+ require 'cgi'
116
+ ups = ":#{CGI.escape(password)}@"
117
+ end
118
+ if ups
119
+ url = url.sub(/\A([\w]+:(?:\/\/)?)/, "\\1#{ups}")
106
120
  end
107
- end
108
121
 
122
+ url
123
+ end
109
124
  end
110
125
  end
111
126
 
@@ -37,10 +37,10 @@ EOF
37
37
  Basic commands:
38
38
 
39
39
  db # create/delete/list databases
40
- table # create/delete/list/import/tail tables
40
+ table # create/delete/list/import/export/tail tables
41
41
  query # issue a query
42
42
  job # show/kill/list jobs
43
- result # create/delete/list/connect/get MySQL result set
43
+ result # create/delete/list result URLs
44
44
 
45
45
  Additional commands:
46
46
 
@@ -83,6 +83,10 @@ EOF
83
83
  # $debug = b
84
84
  #}
85
85
 
86
+ op.on('-h', '--help', "show help") {
87
+ usage nil
88
+ }
89
+
86
90
  begin
87
91
  op.order!(argv)
88
92
  usage nil if argv.empty?
@@ -11,7 +11,7 @@ module Command
11
11
 
12
12
  rows = []
13
13
  scheds.each {|sched|
14
- rows << {:Name => sched.name, :Cron => sched.cron, :Timezone => sched.timezone, :Delay => sched.delay, :Result => sched.rset_name, :Database => sched.database, :Query => sched.query, :"Next schedule" => sched.next_time ? sched.next_time.localtime : nil }
14
+ rows << {:Name => sched.name, :Cron => sched.cron, :Timezone => sched.timezone, :Delay => sched.delay, :Result => sched.result_url, :Database => sched.database, :Query => sched.query, :"Next schedule" => sched.next_time ? sched.next_time.localtime : nil }
15
15
  }
16
16
  rows = rows.sort_by {|map|
17
17
  map[:Name]
@@ -22,22 +22,30 @@ module Command
22
22
 
23
23
  def sched_create(op)
24
24
  db_name = nil
25
- result = nil
26
25
  timezone = nil
27
26
  delay = 0
27
+ result_url = nil
28
+ result_user = nil
29
+ result_ask_password = false
28
30
 
29
31
  op.on('-d', '--database DB_NAME', 'use the database (required)') {|s|
30
32
  db_name = s
31
33
  }
32
- op.on('-r', '--result RESULT_TABLE', 'write result to the result table (use result:create command)') {|s|
33
- result = s
34
- }
35
34
  op.on('-t', '--timezone TZ', 'name of the timezone (like Asia/Tokyo)') {|s|
36
35
  timezone = s
37
36
  }
38
37
  op.on('-D', '--delay SECONDS', 'delay time of the schedule', Integer) {|i|
39
38
  delay = i
40
39
  }
40
+ op.on('-r', '--result RESULT_URL', 'write result to the URL (see also result:create subcommand)') {|s|
41
+ result_url = s
42
+ }
43
+ op.on('-u', '--user NAME', 'set user name for the result URL') {|s|
44
+ result_user = s
45
+ }
46
+ op.on('-p', '--password', 'ask password for the result URL') {|s|
47
+ result_ask_password = true
48
+ }
41
49
 
42
50
  name, cron, sql = op.cmd_parse
43
51
 
@@ -46,13 +54,18 @@ module Command
46
54
  exit 1
47
55
  end
48
56
 
57
+ if result_url
58
+ require 'td/command/result'
59
+ result_url = build_result_url(result_url, result_user, result_ask_password)
60
+ end
61
+
49
62
  client = get_client
50
63
 
51
64
  # local existance check
52
65
  get_database(client, db_name)
53
66
 
54
67
  begin
55
- first_time = client.create_schedule(name, :cron=>cron, :query=>sql, :database=>db_name, :result=>result, :timezone=>timezone, :delay=>delay)
68
+ first_time = client.create_schedule(name, :cron=>cron, :query=>sql, :database=>db_name, :result=>result_url, :timezone=>timezone, :delay=>delay)
56
69
  rescue AlreadyExistsError
57
70
  cmd_debug_error $!
58
71
  $stderr.puts "Schedule '#{name}' already exists."
@@ -172,14 +185,14 @@ module Command
172
185
  puts "Timezone : #{s.timezone}"
173
186
  puts "Delay : #{s.delay} sec"
174
187
  puts "Next : #{s.next_time}"
175
- puts "Result : #{s.rset_name}"
188
+ puts "Result : #{s.result_url}"
176
189
  puts "Database : #{s.database}"
177
190
  puts "Query : #{s.query}"
178
191
  end
179
192
 
180
193
  rows = []
181
194
  history.each {|j|
182
- rows << {:Time => j.scheduled_at.localtime, :JobID => j.job_id, :Status => j.status, :Result=>j.rset_name}
195
+ rows << {:Time => j.scheduled_at.localtime, :JobID => j.job_id, :Status => j.status, :Result=>j.result_url}
183
196
  }
184
197
 
185
198
  puts cmd_render_table(rows, :fields => [:JobID, :Time, :Status, :Result])
@@ -239,6 +239,7 @@ module Command
239
239
  end
240
240
 
241
241
  require 'td/command/import' # table:import
242
+ require 'td/command/export' # table:export
242
243
  require 'td/command/job' # wait_job
243
244
  end
244
245
  end
data/lib/td/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
 
3
- VERSION = '0.10.22'
3
+ VERSION = '0.10.23'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.22
4
+ version: 0.10.23
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-04 00:00:00.000000000Z
12
+ date: 2012-04-27 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack
16
- requirement: &70323068907380 !ruby/object:Gem::Requirement
16
+ requirement: &70287442084840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.4.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70323068907380
24
+ version_requirements: *70287442084840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70323068906820 !ruby/object:Gem::Requirement
27
+ requirement: &70287442084360 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.4.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70323068906820
35
+ version_requirements: *70287442084360
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: hirb
38
- requirement: &70323068906340 !ruby/object:Gem::Requirement
38
+ requirement: &70287442083880 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,21 +43,21 @@ dependencies:
43
43
  version: 0.4.5
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70323068906340
46
+ version_requirements: *70287442083880
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: td-client
49
- requirement: &70323068905860 !ruby/object:Gem::Requirement
49
+ requirement: &70287442083400 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 0.8.14
54
+ version: 0.8.15
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70323068905860
57
+ version_requirements: *70287442083400
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: td-logger
60
- requirement: &70323068905360 !ruby/object:Gem::Requirement
60
+ requirement: &70287442082860 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: 0.3.8
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70323068905360
68
+ version_requirements: *70287442082860
69
69
  description:
70
70
  email:
71
71
  executables:
@@ -83,6 +83,7 @@ files:
83
83
  - lib/td/command/apikey.rb
84
84
  - lib/td/command/common.rb
85
85
  - lib/td/command/db.rb
86
+ - lib/td/command/export.rb
86
87
  - lib/td/command/help.rb
87
88
  - lib/td/command/import.rb
88
89
  - lib/td/command/job.rb