td-client 0.8.42 → 0.8.43

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,3 +1,9 @@
1
+ == 2012-01-23 version 0.8.43
2
+
3
+ * Add organization parameter support to create_database, query,
4
+ partial_delete, create_bulk_import, create_result
5
+
6
+
1
7
  == 2012-01-16 version 0.8.42
2
8
 
3
9
  * Added retry_limit to job and schedule APIs
data/lib/td/client.rb CHANGED
@@ -32,8 +32,8 @@ class Client
32
32
  end
33
33
 
34
34
  # => true
35
- def create_database(db_name)
36
- @api.create_database(db_name)
35
+ def create_database(db_name, opts={})
36
+ @api.create_database(db_name, opts)
37
37
  end
38
38
 
39
39
  # => true
@@ -120,8 +120,8 @@ class Client
120
120
  end
121
121
 
122
122
  # => Job
123
- def query(db_name, q, result_url=nil, priority=nil, retry_limit=nil)
124
- job_id = @api.hive_query(q, db_name, result_url, priority, retry_limit)
123
+ def query(db_name, q, result_url=nil, priority=nil, retry_limit=nil, opts={})
124
+ job_id = @api.hive_query(q, db_name, result_url, priority, retry_limit, opts)
125
125
  Job.new(self, job_id, :hive, q)
126
126
  end
127
127
 
@@ -174,14 +174,14 @@ class Client
174
174
  end
175
175
 
176
176
  # => Job
177
- def partial_delete(db_name, table_name, to, from)
178
- job_id = @api.partial_delete(db_name, table_name, to, from)
177
+ def partial_delete(db_name, table_name, to, from, opts={})
178
+ job_id = @api.partial_delete(db_name, table_name, to, from, opts)
179
179
  Job.new(self, job_id, :partialdelete, nil)
180
180
  end
181
181
 
182
182
  # => nil
183
- def create_bulk_import(name, database, table)
184
- @api.create_bulk_import(name, database, table)
183
+ def create_bulk_import(name, database, table, opts={})
184
+ @api.create_bulk_import(name, database, table, opts)
185
185
  end
186
186
 
187
187
  # => nil
@@ -294,8 +294,8 @@ class Client
294
294
  end
295
295
 
296
296
  # => true
297
- def create_result(name, url)
298
- @api.create_result(name, url)
297
+ def create_result(name, url, opts={})
298
+ @api.create_result(name, url, opts)
299
299
  end
300
300
 
301
301
  # => true
data/lib/td/client/api.rb CHANGED
@@ -216,8 +216,9 @@ class API
216
216
  end
217
217
 
218
218
  # => true
219
- def create_database(db)
220
- code, body, res = post("/v3/database/create/#{e db}")
219
+ def create_database(db, opts={})
220
+ params = opts.dup
221
+ code, body, res = post("/v3/database/create/#{e db}", params)
221
222
  if code != "200"
222
223
  raise_error("Create database failed", res)
223
224
  end
@@ -462,8 +463,8 @@ class API
462
463
  end
463
464
 
464
465
  # => jobId:String
465
- def hive_query(q, db=nil, result_url=nil, priority=nil, retry_limit=nil)
466
- params = {'query' => q}
466
+ def hive_query(q, db=nil, result_url=nil, priority=nil, retry_limit=nil, opts={})
467
+ params = {'query' => q}.merge(opts)
467
468
  params['result'] = result_url if result_url
468
469
  params['priority'] = priority if priority
469
470
  params['retry_limit'] = retry_limit if retry_limit
@@ -496,8 +497,8 @@ class API
496
497
  ## Partial delete API
497
498
  ##
498
499
 
499
- def partial_delete(db, table, to, from)
500
- params = {}
500
+ def partial_delete(db, table, to, from, opts={})
501
+ params = opts.dup
501
502
  params['to'] = to.to_s
502
503
  params['from'] = from.to_s
503
504
  code, body, res = post("/v3/table/partialdelete/#{e db}/#{e table}", params)
@@ -791,8 +792,9 @@ class API
791
792
  end
792
793
 
793
794
  # => true
794
- def create_result(name, url)
795
- code, body, res = post("/v3/result/create/#{e name}", {'url'=>url})
795
+ def create_result(name, url, opts={})
796
+ params = {'url'=>url}.merge(opts)
797
+ code, body, res = post("/v3/result/create/#{e name}", params)
796
798
  if code != "200"
797
799
  raise_error("Create result table failed", res)
798
800
  end
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
 
3
- VERSION = '0.8.42'
3
+ VERSION = '0.8.43'
4
4
 
5
5
  end
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,42 @@
1
+ require 'rubygems'
2
+
1
3
  begin
2
4
  require 'simplecov'
3
5
  SimpleCov.start
4
6
  rescue LoadError
5
7
  end
6
8
 
9
+ require 'rspec'
10
+ require 'webmock/rspec'
11
+
12
+ include WebMock::API
13
+
7
14
  $LOAD_PATH << File.dirname(__FILE__)+"../lib"
8
15
  require 'td-client'
9
16
 
10
17
  include TreasureData
11
18
 
19
+ shared_context 'common helper' do
20
+ let :account_id do
21
+ 1
22
+ end
23
+
24
+ let :headers do
25
+ {'Accept' => '*/*', 'Accept-Encoding' => 'deflate, gzip', 'Date' => /.*/, 'User-Agent' => 'Ruby'}
26
+ end
27
+
28
+ def stub_api_request(method, path, opts = nil)
29
+ scheme = 'http'
30
+ with_opts = {:header => headers}
31
+ if opts
32
+ scheme = 'https' if opts[:ssl]
33
+ with_opts[:query] = opts[:query] if opts[:query]
34
+ end
35
+ stub_request(method, "#{scheme}://api.treasure-data.com#{path}").with(with_opts)
36
+ end
37
+
38
+ def e(s)
39
+ require 'cgi'
40
+ CGI.escape(s.to_s)
41
+ end
42
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe API do
4
+ it 'initialize should raise an error with invalid endpoint' do
5
+ expect {
6
+ API.new(nil, :endpoint => 'smtp://api.tester.com:1000')
7
+ }.to raise_error(RuntimeError, /Invalid endpoint:/)
8
+ end
9
+
10
+ VALID_NAMES = [
11
+ 'abc',
12
+ 'abc_cd',
13
+ '_abc_cd',
14
+ '_abc_',
15
+ 'ab0_',
16
+ 'ab0',
17
+ ]
18
+
19
+ INVALID_NAMES = {
20
+ 'a' => 'a__',
21
+ 'a'*257 => 'a'*254+'__',
22
+ 'abcD' => 'abcd',
23
+ 'a-b*' => 'a_b_',
24
+ }
25
+
26
+ describe 'normalizer' do
27
+ it 'normalize_database_name should return normalized data' do
28
+ INVALID_NAMES.each_pair {|ng,ok|
29
+ API.normalize_database_name(ng).should == ok
30
+ }
31
+ lambda {
32
+ API.normalize_database_name('')
33
+ }.should raise_error(RuntimeError)
34
+ end
35
+
36
+ it 'normalize_table_name should return normalized data' do
37
+ INVALID_NAMES.each_pair {|ng,ok|
38
+ API.normalize_table_name(ng).should == ok
39
+ }
40
+ lambda {
41
+ API.normalize_table_name('')
42
+ }.should raise_error(RuntimeError)
43
+ end
44
+
45
+ it 'normalize_database_name should return valid data' do
46
+ VALID_NAMES.each {|ok|
47
+ API.normalize_database_name(ok).should == ok
48
+ }
49
+ end
50
+ end
51
+
52
+ describe 'validator' do
53
+ it 'validate_database_name should raise errors' do
54
+ INVALID_NAMES.each_pair {|ng,ok|
55
+ lambda {
56
+ API.validate_database_name(ng)
57
+ }.should raise_error(RuntimeError)
58
+ }
59
+ lambda {
60
+ API.validate_database_name('')
61
+ }.should raise_error(RuntimeError)
62
+ end
63
+
64
+ it 'validate_table_name should raise errors' do
65
+ INVALID_NAMES.each_pair {|ng,ok|
66
+ lambda {
67
+ API.validate_table_name(ng)
68
+ }.should raise_error(RuntimeError)
69
+ }
70
+ lambda {
71
+ API.validate_table_name('')
72
+ }.should raise_error(RuntimeError)
73
+ end
74
+
75
+ it 'validate_database_name should return valid data' do
76
+ VALID_NAMES.each {|ok|
77
+ API.validate_database_name(ok)
78
+ }
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ require 'td/client/spec_resources'
3
+
4
+ describe 'BulkImport API' do
5
+ include_context 'spec symbols'
6
+ include_context 'common helper'
7
+
8
+ let :api do
9
+ API.new(nil)
10
+ end
11
+
12
+ describe 'create_bulk_import' do
13
+ it 'should create a new bulk_import' do
14
+ stub_api_request(:post, "/v3/bulk_import/create/#{e(bi_name)}/#{e(db_name)}/#{e(table_name)}")
15
+ .to_return(:body => {'bulk_import' => bi_name}.to_json)
16
+
17
+ api.create_bulk_import(bi_name, db_name, table_name).should be_nil
18
+ end
19
+
20
+ it 'should return 422 error with invalid name' do
21
+ name = '1'
22
+ err_msg = "Validation failed: Name is too short" # " (minimum is 3 characters)"
23
+ stub_api_request(:post, "/v3/bulk_import/create/#{e(name)}/#{e(db_name)}/#{e(table_name)}")
24
+ .to_return(:status => 404, :body => {'message' => err_msg}.to_json)
25
+
26
+ expect {
27
+ api.create_bulk_import(name, db_name, table_name)
28
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
29
+ end
30
+
31
+ it 'should return 404 error with non exist database name' do
32
+ db = 'no_such_db'
33
+ err_msg = "Couldn't find UserDatabase with name = #{db}"
34
+ stub_api_request(:post, "/v3/bulk_import/create/#{e(bi_name)}/#{e(db)}/#{e(table_name)}")
35
+ .to_return(:status => 404, :body => {'message' => err_msg}.to_json)
36
+
37
+ expect {
38
+ api.create_bulk_import(bi_name, db, table_name)
39
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
40
+ end
41
+
42
+ it 'should return 404 error with non exist table name' do
43
+ table = 'no_such_table'
44
+ err_msg = "Couldn't find UserTableReference with name = #{table}"
45
+ stub_api_request(:post, "/v3/bulk_import/create/#{e(bi_name)}/#{e(db_name)}/#{e(table)}")
46
+ .to_return(:status => 404, :body => {'message' => err_msg}.to_json)
47
+
48
+ expect {
49
+ api.create_bulk_import(bi_name, db_name, table)
50
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ require 'td/client/spec_resources'
3
+
4
+ describe 'Database API' do
5
+ include_context 'spec symbols'
6
+ include_context 'common helper'
7
+
8
+ let :api do
9
+ API.new(nil)
10
+ end
11
+
12
+ describe 'create_database' do
13
+ it 'should create a new database' do
14
+ stub_api_request(:post, "/v3/database/create/#{e(db_name)}").to_return(:body => {'database' => db_name}.to_json)
15
+
16
+ api.create_database(db_name).should be_true
17
+ end
18
+
19
+ it 'should return 400 error with invalid name' do
20
+ invalid_name = 'a'
21
+ err_msg = "Name must be 3 to 256 characters, got #{invalid_name.length} characters. name = '#{invalid_name}'"
22
+ stub_api_request(:post, "/v3/database/create/#{e(invalid_name)}").to_return(:status => 400, :body => {'message' => err_msg}.to_json)
23
+
24
+ expect {
25
+ api.create_database(invalid_name)
26
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
27
+ end
28
+
29
+ it 'should return 409 error with duplicated name' do
30
+ err_msg = "Database #{db_name} already exists"
31
+ stub_api_request(:post, "/v3/database/create/#{e(db_name)}").to_return(:status => 409, :body => {'message' => err_msg}.to_json)
32
+
33
+ expect {
34
+ api.create_database(db_name)
35
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'td/client/spec_resources'
3
+
4
+ describe 'Export API' do
5
+ include_context 'spec symbols'
6
+ include_context 'common helper'
7
+
8
+ let :api do
9
+ API.new(nil)
10
+ end
11
+
12
+ describe 'export' do
13
+ let :storage_type do
14
+ 's3'
15
+ end
16
+
17
+ it 'should export successfully' do
18
+ # TODO: Use correnty values
19
+ params = {'file_format' => 'json.gz', 'bucket' => 'bin', 'access_key_id' => 'id', 'secret_access_key' => 'secret'}
20
+ stub_api_request(:post, "/v3/export/run/#{e(db_name)}/#{e(table_name)}").with(:body => params.merge('storage_type' => storage_type))
21
+ .to_return(:body => {'database' => db_name, 'job_id' => '1', 'debug' => {}}.to_json)
22
+
23
+ api.export(db_name, table_name, storage_type, params).should == '1'
24
+ end
25
+
26
+ it 'should return 400 error with invalid storage type' do
27
+ invalid_type = 'gridfs'
28
+ params = {'storage_type' => invalid_type}
29
+ err_msg = "Only s3 output type is supported: #{invalid_type}"
30
+ stub_api_request(:post, "/v3/export/run/#{e(db_name)}/#{e(table_name)}").with(:body => params)
31
+ .to_return(:status => 400, :body => {'message' => err_msg}.to_json)
32
+
33
+ expect {
34
+ api.export(db_name, table_name, invalid_type)
35
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
36
+ end
37
+
38
+ # TODO: Add other parameters spec
39
+ end
40
+ end
41
+
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+ require 'td/client/spec_resources'
3
+
4
+ describe 'Job API' do
5
+ include_context 'spec symbols'
6
+ include_context 'job resources'
7
+
8
+ let :api do
9
+ API.new(nil)
10
+ end
11
+
12
+ describe 'list_jobs' do
13
+ it 'should returns 20 jobs by default' do
14
+ stub_api_request(:get, "/v3/job/list", :query => {'from' => '0'}).to_return(:body => {'jobs' => raw_jobs}.to_json)
15
+ jobs = api.list_jobs
16
+ jobs.size.should == 20
17
+ end
18
+
19
+ it 'should returns 10 jobs with to parameter' do
20
+ stub_api_request(:get, "/v3/job/list", :query => {'from' => '0', 'to' => '10'}).to_return(:body => {'jobs' => raw_jobs[0...10]}.to_json)
21
+ jobs = api.list_jobs(0, 10)
22
+ jobs.size.should == 10
23
+ end
24
+
25
+ it 'should returns 10 jobs with to status parameter' do
26
+ error_jobs = raw_jobs.select { |j| j['status'] == 'error' }
27
+ stub_api_request(:get, "/v3/job/list", :query => {'from' => '0', 'status' => 'error'}).to_return(:body => {'jobs' => error_jobs}.to_json)
28
+ jobs = api.list_jobs(0, nil, 'error')
29
+ jobs.size.should == error_jobs.size
30
+ end
31
+ end
32
+
33
+ describe 'show_job' do
34
+ (0...MAX_JOB).each { |i|
35
+ it "should get a job of id #{i}" do
36
+ job = raw_jobs[i]
37
+ stub_api_request(:get, "/v3/job/show/#{e(i)}").to_return(:body => job.to_json)
38
+
39
+ type, query, status, url, debug, start_at, end_at, result_url, hive_result_schema, priority, retry_limit, org, db = api.show_job(i)
40
+ type.should == job['type']
41
+ query.should == job['query']
42
+ status.should == job['status']
43
+ url.should == job['url']
44
+ debug.should == job['debug']
45
+ start_at.should == job['start_at']
46
+ end_at.should == job['end_at']
47
+ result_url.should == job['result_url']
48
+ hive_result_schema.should == job['hive_result_schema']
49
+ result_url.should == job['result_url']
50
+ priority.should == job['priority']
51
+ org.should == job['organization']
52
+ db.should == job['database']
53
+ end
54
+ }
55
+
56
+ it 'should return an error with unknown id' do
57
+ unknown_id = 10000000000
58
+ body = {"message" => "Couldn't find Job with account_id = #{account_id}, id = #{unknown_id}"}
59
+ stub_api_request(:get, "/v3/job/show/#{e(unknown_id)}").to_return(:status => 404, :body => body.to_json)
60
+
61
+ expect {
62
+ api.show_job(unknown_id)
63
+ }.to raise_error(TreasureData::NotFoundError, /^Couldn't find Job with account_id = #{account_id}, id = #{unknown_id}/)
64
+ end
65
+
66
+ it 'should return an error with invalid id' do
67
+ invalid_id = 'bomb!'
68
+ body = {"message" => "'job_id' parameter is required but missing"}
69
+ stub_api_request(:get, "/v3/job/show/#{e(invalid_id)}").to_return(:status => 500, :body => body.to_json)
70
+
71
+ expect {
72
+ api.show_job(invalid_id)
73
+ }.to raise_error(TreasureData::APIError, /^'job_id' parameter is required but missing/)
74
+ end
75
+ end
76
+
77
+ describe 'hive_query' do
78
+ let :return_body do
79
+ {:body => {'job_id' => '1'}.to_json}
80
+ end
81
+
82
+ it 'issue a query' do
83
+ params = {'query' => query}
84
+ stub_api_request(:post, "/v3/job/issue/hive/#{e(db_name)}").with(:body => params).to_return(return_body)
85
+
86
+ job_id = api.hive_query(query, db_name)
87
+ job_id.should == '1'
88
+ end
89
+
90
+ it 'issue a query with result_url' do
91
+ params = {'query' => query, 'result' => 'td://@/test/table'}
92
+ stub_api_request(:post, "/v3/job/issue/hive/#{e(db_name)}").with(:body => params).to_return(return_body)
93
+
94
+ job_id = api.hive_query(query, db_name, 'td://@/test/table')
95
+ job_id.should == '1'
96
+ end
97
+
98
+ it 'issue a query with priority' do
99
+ params = {'query' => query, 'priority' => '1'}
100
+ stub_api_request(:post, "/v3/job/issue/hive/#{e(db_name)}").with(:body => params).to_return(return_body)
101
+
102
+ job_id = api.hive_query(query, db_name, nil, 1)
103
+ job_id.should == '1'
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+ require 'td/client/spec_resources'
3
+
4
+ describe 'PartialDelete API' do
5
+ include_context 'spec symbols'
6
+ include_context 'common helper'
7
+
8
+ let :api do
9
+ API.new(nil)
10
+ end
11
+
12
+ describe 'partialdelete' do
13
+ let :from do
14
+ 0
15
+ end
16
+
17
+ let :to do
18
+ 3600 * 10
19
+ end
20
+
21
+ let :from_to do
22
+ {'from' => from.to_s, 'to' => to.to_s}
23
+ end
24
+
25
+ it 'should partial_delete successfully' do
26
+ # TODO: Use correnty values
27
+ stub_api_request(:post, "/v3/table/partialdelete/#{e(db_name)}/#{e(table_name)}").with(:body => from_to)
28
+ .to_return(:body => {'database' => db_name, 'table' => table_name, 'job_id' => '1'}.to_json)
29
+
30
+ api.partial_delete(db_name, table_name, to, from).should == '1'
31
+ end
32
+
33
+ it 'should return 404 error with non exist database name' do
34
+ db = 'no_such_db'
35
+ err_msg = "Couldn't find UserDatabase with name = #{db}"
36
+ stub_api_request(:post, "/v3/table/partialdelete/#{e(db)}/#{e(table_name)}").with(:body => from_to)
37
+ .to_return(:status => 404, :body => {'message' => err_msg}.to_json)
38
+
39
+ expect {
40
+ api.partial_delete(db, table_name, to, from)
41
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
42
+ end
43
+
44
+ it 'should return 404 error with non exist table name' do
45
+ table = 'no_such_table'
46
+ err_msg = "Unknown table: #{table}"
47
+ stub_api_request(:post, "/v3/table/partialdelete/#{e(db_name)}/#{e(table)}").with(:body => from_to)
48
+ .to_return(:status => 404, :body => {'message' => err_msg}.to_json)
49
+
50
+ expect {
51
+ api.partial_delete(db_name, table, to, from)
52
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
53
+ end
54
+
55
+ # TODO: Add from / to parameters spec
56
+ end
57
+ end
58
+
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+ require 'td/client/spec_resources'
3
+
4
+ describe 'Result API' do
5
+ include_context 'spec symbols'
6
+ include_context 'common helper'
7
+
8
+ let :api do
9
+ API.new(nil)
10
+ end
11
+
12
+ describe 'create_result' do
13
+ it 'should create a new result' do
14
+ params = {'url' => result_url}
15
+ stub_api_request(:post, "/v3/result/create/#{e(result_name)}").with(:body => params).to_return(:body => {'result' => result_name})
16
+
17
+ api.create_result(result_name, result_url).should be_true
18
+ end
19
+
20
+ it 'should return 422 error with invalid name' do
21
+ name = '1'
22
+ params = {'url' => result_url}
23
+ err_msg = "Validation failed: Name is too short" # " (minimum is 3 characters)"
24
+ stub_api_request(:post, "/v3/result/create/#{e(name)}").with(:body => params)
25
+ .to_return(:status => 422, :body => {'message' => err_msg}.to_json)
26
+
27
+ expect {
28
+ api.create_result(name, result_url)
29
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
30
+ end
31
+
32
+ it 'should return 422 error without url' do
33
+ params = {'url' => 'false'} # I want to use nil, but nil doesn't work on WebMock...
34
+ err_msg = "'url' parameter is required"
35
+ stub_api_request(:post, "/v3/result/create/#{e(result_name)}").with(:body => params)
36
+ .to_return(:status => 422, :body => {'message' => err_msg}.to_json)
37
+
38
+ expect {
39
+ api.create_result(result_name, false)
40
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
41
+ end
42
+
43
+ it 'should return 409 error with duplicated name' do
44
+ params = {'url' => result_url}
45
+ err_msg = "Result must be unique"
46
+ stub_api_request(:post, "/v3/result/create/#{e(result_name)}").with(:body => params)
47
+ .to_return(:status => 409, :body => {'message' => err_msg}.to_json)
48
+
49
+ expect {
50
+ api.create_result(result_name, result_url)
51
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'td/client/spec_resources'
3
+
4
+ describe 'Schedule API' do
5
+ include_context 'spec symbols'
6
+ include_context 'common helper'
7
+
8
+ let :api do
9
+ API.new(nil)
10
+ end
11
+
12
+ describe 'create_schedule' do
13
+ let :opts do
14
+ {'cron' => cron, 'query' => query, 'database' => db_name}
15
+ end
16
+
17
+ it 'should create a new schedule' do
18
+ start = Time.now
19
+ stub_api_request(:post, "/v3/schedule/create/#{e(sched_name)}").with(opts.merge('type' => 'hive'))
20
+ .to_return(:body => {'name' => sched_name, 'start' => start.to_s}.to_json)
21
+
22
+ api.create_schedule(sched_name, opts).should == start.to_s
23
+ end
24
+
25
+ it 'should return 422 error with invalid name' do
26
+ name = '1'
27
+ err_msg = "Validation failed: Name is too short" # " (minimum is 3 characters)"
28
+ stub_api_request(:post, "/v3/schedule/create/#{e(name)}").with(opts.merge('type' => 'hive'))
29
+ .to_return(:status => 422, :body => {'message' => err_msg}.to_json)
30
+
31
+ expect {
32
+ api.create_schedule(name, opts)
33
+ }.to raise_error(TreasureData::APIError, /^#{err_msg}/)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+ require 'td/client/model'
3
+
4
+ shared_context 'spec symbols' do
5
+ let :db_name do
6
+ 'db_test'
7
+ end
8
+
9
+ let :table_name do
10
+ 'table_test'
11
+ end
12
+
13
+ let :sched_name do
14
+ 'sched_test'
15
+ end
16
+
17
+ let :result_name do
18
+ 'test'
19
+ end
20
+
21
+ let :bi_name do
22
+ 'bi_test'
23
+ end
24
+
25
+ let :cron do
26
+ '* * * * *'
27
+ end
28
+
29
+ let :query do
30
+ 'select 1'
31
+ end
32
+ let :result_url do
33
+ 'td://@/test/table'
34
+ end
35
+ end
36
+
37
+ shared_context 'database resources' do
38
+ include_context 'common helper'
39
+
40
+ let :db_names do
41
+ [
42
+ 'cloud', 'yuffie', 'vincent', 'cid'
43
+ ]
44
+ end
45
+ end
46
+
47
+ shared_context 'job resources' do
48
+ include_context 'database resources'
49
+
50
+ MAX_JOB = 20
51
+
52
+ let :job_types do
53
+ [
54
+ ['HiveJob', 'hive'],
55
+ ['ExportJob', 'export'],
56
+ ['BulkImportJob', 'bulk_import'],
57
+ ['PartialDeleteJob', 'partialdelete']
58
+ ]
59
+ end
60
+
61
+ let :raw_jobs do
62
+ created_at = Time.at(1356966000)
63
+ types = job_types
64
+ dbs = db_names
65
+ (0...MAX_JOB).map { |i|
66
+ job_type = types[i % types.size]
67
+ status = i.odd? ? 'success' : 'error'
68
+ {
69
+ "job_id" => i,
70
+ "url" => "https://console.treasure-data.com/jobs/#{i.to_s}?target=query",
71
+ "database" => dbs[i % dbs.size].to_s,
72
+ "status" => status,
73
+ "type" => job_type[0].to_sym,
74
+ "query" => "select #{i}",
75
+ "priority" => i % 3,
76
+ "result" => nil,
77
+ "created_at" => created_at.to_s,
78
+ "updated_at" => (created_at + (i * 10)).to_s,
79
+ "start_at" => (created_at + (i * 10 * 60)).to_s,
80
+ "end_at" => (created_at + (i * 10 * 3600)).to_s,
81
+ 'retry_limit' => 10,
82
+ 'organization' => nil,
83
+ 'hive_result_schema' => nil,
84
+ 'debug' => {
85
+ 'stderr' => "job #{i} #{status}",
86
+ 'cmdout' => "job #{i} command",
87
+ }
88
+ }
89
+ }
90
+ end
91
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.42
4
+ version: 0.8.43
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-16 00:00:00.000000000 Z
12
+ date: 2013-01-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: msgpack
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
45
  version: 2.8.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: webmock
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 1.9.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.9.0
46
62
  description:
47
63
  email:
48
64
  executables: []
@@ -60,6 +76,15 @@ files:
60
76
  - lib/td/client/version.rb
61
77
  - spec/api_spec.rb
62
78
  - spec/spec_helper.rb
79
+ - spec/td/client/api_spec.rb
80
+ - spec/td/client/bulk_import_spec.rb
81
+ - spec/td/client/db_api_spec.rb
82
+ - spec/td/client/export_api_spec.rb
83
+ - spec/td/client/job_api_spec.rb
84
+ - spec/td/client/partial_delete_api_spec.rb
85
+ - spec/td/client/result_api_spec.rb
86
+ - spec/td/client/sched_api_spec.rb
87
+ - spec/td/client/spec_resources.rb
63
88
  - ChangeLog
64
89
  - README.rdoc
65
90
  homepage:
@@ -88,3 +113,11 @@ specification_version: 3
88
113
  summary: Treasure Data API library for Ruby
89
114
  test_files:
90
115
  - spec/api_spec.rb
116
+ - spec/td/client/api_spec.rb
117
+ - spec/td/client/bulk_import_spec.rb
118
+ - spec/td/client/db_api_spec.rb
119
+ - spec/td/client/export_api_spec.rb
120
+ - spec/td/client/job_api_spec.rb
121
+ - spec/td/client/partial_delete_api_spec.rb
122
+ - spec/td/client/result_api_spec.rb
123
+ - spec/td/client/sched_api_spec.rb