td-client 0.8.1 → 0.8.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.
data/ChangeLog CHANGED
@@ -1,4 +1,11 @@
1
1
 
2
+ == 2011-09-13 version 0.8.2
3
+
4
+ * Added APIs for scheduled queries
5
+ * Set 'Content-Length: 0' header to POST request if no parameters are
6
+ provided
7
+
8
+
2
9
  == 2011-09-09 version 0.8.1
3
10
 
4
11
  * Added Client#kill method
@@ -105,10 +105,10 @@ class Client
105
105
  Job.new(self, job_id, :hive, q) # TODO url
106
106
  end
107
107
 
108
- # => [Job=]
108
+ # => [Job]
109
109
  def jobs(from=nil, to=nil)
110
- js = @api.list_jobs(from, to)
111
- js.map {|job_id,type,status,query,start_at,end_at|
110
+ result = @api.list_jobs(from, to)
111
+ result.map {|job_id,type,status,query,start_at,end_at|
112
112
  Job.new(self, job_id, type, query, status, nil, nil, start_at, end_at)
113
113
  }
114
114
  end
@@ -146,6 +146,35 @@ class Client
146
146
  @api.kill(job_id)
147
147
  end
148
148
 
149
+ # => first_time:Time
150
+ def create_schedule(name, opts)
151
+ raise ArgumentError, "'cron' option is required" unless opts[:cron] || opts['cron']
152
+ raise ArgumentError, "'query' option is required" unless opts[:query] || opts['query']
153
+ start = @api.create_schedule(name, opts)
154
+ return Time.parse(start)
155
+ end
156
+
157
+ # => true
158
+ def delete_schedule(name)
159
+ @api.delete_schedule(name)
160
+ end
161
+
162
+ # [Schedule]
163
+ def schedules
164
+ result = @api.list_schedules
165
+ result.map {|name,cron,query,database|
166
+ Schedule.new(self, name, cron, query, database)
167
+ }
168
+ end
169
+
170
+ # [ScheduledJob]
171
+ def history(name, from=nil, to=nil)
172
+ result = @api.history(name, from, to)
173
+ result.map {|scheduled_at,job_id,type,status,query,start_at,end_at|
174
+ ScheduledJob.new(self, scheduled_at, job_id, type, query, status, nil, nil, start_at, end_at)
175
+ }
176
+ end
177
+
149
178
  # => time:Flaot
150
179
  def import(db_name, table_name, format, stream, size)
151
180
  @api.import(db_name, table_name, format, stream, size)
@@ -297,6 +297,76 @@ class API
297
297
  end
298
298
 
299
299
 
300
+ ####
301
+ ## Schedule API
302
+ ##
303
+
304
+ # => start:String
305
+ def create_schedule(name, opts)
306
+ params = opts.update({'type'=>'hive'})
307
+ code, body, res = post("/v3/schedule/create/#{e name}", params)
308
+ if code != "200"
309
+ raise_error("Create schedule failed", res)
310
+ end
311
+ # TODO format check
312
+ js = JSON.load(body)
313
+ return js['start']
314
+ end
315
+
316
+ # => cron:String, query:String
317
+ def delete_schedule(name)
318
+ code, body, res = post("/v3/schedule/delete/#{e name}")
319
+ if code != "200"
320
+ raise_error("Delete schedule failed", res)
321
+ end
322
+ # TODO format check
323
+ js = JSON.load(body)
324
+ return js['cron'], js["query"]
325
+ end
326
+
327
+ def list_schedules
328
+ code, body, res = get("/v3/schedule/list")
329
+ if code != "200"
330
+ raise_error("List schedules failed", res)
331
+ end
332
+ # TODO format check
333
+ js = JSON.load(body)
334
+ result = []
335
+ js['schedules'].each {|m|
336
+ name = m['name']
337
+ cron = m['cron']
338
+ query = m['query']
339
+ database = m['database']
340
+ result << [name, cron, query, database]
341
+ }
342
+ return result
343
+ end
344
+
345
+ def history(name, from=0, to=nil)
346
+ params = {}
347
+ params['from'] = from.to_s if from
348
+ params['to'] = to.to_s if to
349
+ code, body, res = get("/v3/schedule/history/#{e name}", params)
350
+ if code != "200"
351
+ raise_error("List history failed", res)
352
+ end
353
+ # TODO format check
354
+ js = JSON.load(body)
355
+ result = []
356
+ js['history'].each {|m|
357
+ job_id = m['job_id']
358
+ type = (m['type'] || '?').to_sym
359
+ status = m['status']
360
+ query = m['query']
361
+ start_at = m['start_at']
362
+ end_at = m['end_at']
363
+ scheduled_at = m['scheduled_at']
364
+ result << [scheduled_at, job_id, type, status, query, start_at, end_at]
365
+ }
366
+ return result
367
+ end
368
+
369
+
300
370
  ####
301
371
  ## Import API
302
372
  ##
@@ -385,8 +455,13 @@ class API
385
455
 
386
456
  path = BASE_URL + url
387
457
 
388
- request = Net::HTTP::Post.new(path, header)
389
- request.set_form_data(params) if params
458
+ if params && !params.empty?
459
+ request = Net::HTTP::Post.new(path, header)
460
+ request.set_form_data(params)
461
+ else
462
+ header['Content-Length'] = 0.to_s
463
+ request = Net::HTTP::Post.new(path, header)
464
+ end
390
465
 
391
466
  response = http.request(request)
392
467
  return [response.code, response.body, response]
@@ -250,5 +250,30 @@ class Job < Model
250
250
  end
251
251
 
252
252
 
253
+ class ScheduledJob < Job
254
+ def initialize(client, scheduled_at, *super_args)
255
+ super(client, *super_args)
256
+ @scheduled_at = scheduled_at
257
+ end
258
+
259
+ def scheduled_at
260
+ @scheduled_at ? Time.parse(@scheduled_at) : nil
261
+ end
262
+ end
263
+
264
+
265
+ class Schedule < Model
266
+ def initialize(client, name, cron, query, database=nil)
267
+ super(client)
268
+ @name = name
269
+ @cron = cron
270
+ @query = query
271
+ @database = database
272
+ end
273
+
274
+ attr_reader :name, :cron, :query, :database
275
+ end
276
+
277
+
253
278
  end
254
279
 
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
 
3
- VERSION = '0.8.1'
3
+ VERSION = '0.8.2'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 61
4
+ hash: 59
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
- - 1
10
- version: 0.8.1
9
+ - 2
10
+ version: 0.8.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sadayuki Furuhashi
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-09 00:00:00 +09:00
18
+ date: 2011-09-13 00:00:00 +09:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency