td-client 0.8.65 → 0.8.66

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.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- OWU5OGRlNzY1MWVjOTk3YzY2OTMyNzg2Nzc2ZmIzMTgwNjM3NmRiOA==
5
- data.tar.gz: !binary |-
6
- MjEzZDA5YzUzYmRmNWFjNzA4Y2JmZDA3ZTc5OTc5YmI1YTI5NTg5Nw==
2
+ SHA1:
3
+ metadata.gz: 68f45b7f8ac2b35437c0c67488cccc901b244efa
4
+ data.tar.gz: e15152f3edc04a66e74579f2fb31afa161fe87e0
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ZWZhZTI2Mjc1NzRjZDQ4YmVjODRiMGMxZWYwNzE2MzA1MjFjZmFiY2E0Zjdh
10
- NzFlM2Q5NDU1ZTVlMjFmNzM5MjI0ZGIzYmMwZDg5YWJjYTM5OTI3NTg2NGI0
11
- NzBlY2EyNTYzYWRlNzFhNzI5NjFhYzY4ZGUwNzI2OTIzMzZkZTY=
12
- data.tar.gz: !binary |-
13
- YTQ1NzFjYmZhZWY5OTM5MmFhNjdiNzJmMjUxMzhmNzc3ZGZjMjNhYjg1YjMy
14
- ZTFiNjNmODljOWI4NzQ4M2EzNDU1MDNhYjg0NmU1Njg1YWFmZTM4ZDcwY2Zk
15
- NzkzNjQ1YjJhZTRkOTJjZTFhM2JjZDFjY2VhZGVjZGM4ZTJmMDE=
6
+ metadata.gz: 889a0f5ec860113c7afc442915e4ef3d6d8a43b79d9bb3839874976354488ecedc8282bdc798788fbeffa74242e31d1d9ccf2c9b50b4753766991264bf20ef4d
7
+ data.tar.gz: 492c0632ffbcd8d9c0cb8b6e7f02228a47d5f73c9500d1cd74104ee70e680dc024060dd201a9abff7fce857d3910bfa2fb73ad0e2e60d1ba0020069cda0a1d6e
@@ -359,7 +359,7 @@ class Client
359
359
 
360
360
  # => true
361
361
  def remove_apikey(user, apikey)
362
- @api.remove_apikey(user, g)
362
+ @api.remove_apikey(user, apikey)
363
363
  end
364
364
 
365
365
  # => true
@@ -54,6 +54,7 @@ class API
54
54
  @read_timeout = opts[:read_timeout] || 600
55
55
  @send_timeout = opts[:send_timeout] || 600
56
56
  @retry_post_requests = opts[:retry_post_requests] || false
57
+ @max_cumul_retry_delay = opts[:max_cumul_retry_delay] || 600
57
58
 
58
59
  case uri.scheme
59
60
  when 'http', 'https'
@@ -962,7 +963,7 @@ class API
962
963
  raise_error("Import failed", res)
963
964
  end
964
965
  js = checked_json(body, %w[])
965
- time = js['time'].to_f
966
+ time = js['elapsed_time'].to_f
966
967
  return time
967
968
  end
968
969
 
@@ -1189,6 +1190,10 @@ class API
1189
1190
  return status
1190
1191
  end
1191
1192
 
1193
+ def ssl_ca_file=(ssl_ca_file)
1194
+ @ssl_ca_file = ssl_ca_file
1195
+ end
1196
+
1192
1197
  private
1193
1198
  module DeflateReadBodyMixin
1194
1199
  attr_accessor :gzip
@@ -1217,6 +1222,12 @@ class API
1217
1222
  end
1218
1223
 
1219
1224
  def get(url, params=nil, &block)
1225
+ guard_no_sslv3 do
1226
+ do_get(url, params, &block)
1227
+ end
1228
+ end
1229
+
1230
+ def do_get(url, params=nil, &block)
1220
1231
  http, header = new_http
1221
1232
 
1222
1233
  path = @base_path + url
@@ -1238,7 +1249,6 @@ class API
1238
1249
 
1239
1250
  # up to 7 retries with exponential (base 2) back-off starting at 'retry_delay'
1240
1251
  retry_delay = 5
1241
- max_cumul_retry_delay = 600
1242
1252
  cumul_retry_delay = 0
1243
1253
 
1244
1254
  # for both exceptions and 500+ errors retrying is enabled by default.
@@ -1256,7 +1266,7 @@ class API
1256
1266
 
1257
1267
  status = response.code.to_i
1258
1268
  # retry if the HTTP error code is 500 or higher and we did not run out of retrying attempts
1259
- if !block_given? && status >= 500 && cumul_retry_delay <= max_cumul_retry_delay
1269
+ if !block_given? && status >= 500 && cumul_retry_delay <= @max_cumul_retry_delay
1260
1270
  $stderr.puts "Error #{status}: #{get_error(response)}. Retrying after #{retry_delay} seconds..."
1261
1271
  sleep retry_delay
1262
1272
  cumul_retry_delay += retry_delay
@@ -1268,14 +1278,14 @@ class API
1268
1278
  raise e
1269
1279
  end
1270
1280
  $stderr.print "#{e.class}: #{e.message}. "
1271
- if cumul_retry_delay <= max_cumul_retry_delay
1281
+ if cumul_retry_delay <= @max_cumul_retry_delay
1272
1282
  $stderr.puts "Retrying after #{retry_delay} seconds..."
1273
1283
  sleep retry_delay
1274
1284
  cumul_retry_delay += retry_delay
1275
1285
  retry_delay *= 2
1276
1286
  retry
1277
1287
  else
1278
- $stderr.puts "Retrying stopped after #{max_cumul_retry_delay} seconds."
1288
+ $stderr.puts "Retrying stopped after #{@max_cumul_retry_delay} seconds."
1279
1289
  raise e
1280
1290
  end
1281
1291
  rescue => e
@@ -1311,6 +1321,12 @@ class API
1311
1321
  end
1312
1322
 
1313
1323
  def post(url, params=nil)
1324
+ guard_no_sslv3 do
1325
+ do_post(url, params)
1326
+ end
1327
+ end
1328
+
1329
+ def do_post(url, params=nil)
1314
1330
  http, header = new_http
1315
1331
 
1316
1332
  path = @base_path + url
@@ -1332,7 +1348,6 @@ class API
1332
1348
 
1333
1349
  # up to 7 retries with exponential (base 2) back-off starting at 'retry_delay'
1334
1350
  retry_delay = 5
1335
- max_cumul_retry_delay = 600
1336
1351
  cumul_retry_delay = 0
1337
1352
 
1338
1353
  # for both exceptions and 500+ errors retrying can be enabled by initialization
@@ -1346,7 +1361,7 @@ class API
1346
1361
  # if the HTTP error code is 500 or higher and the user requested retrying
1347
1362
  # on post request, attempt a retry
1348
1363
  status = response.code.to_i
1349
- if @retry_post_requests && status >= 500 && cumul_retry_delay <= max_cumul_retry_delay
1364
+ if @retry_post_requests && status >= 500 && cumul_retry_delay <= @max_cumul_retry_delay
1350
1365
  $stderr.puts "Error #{status}: #{get_error(response)}. Retrying after #{retry_delay} seconds..."
1351
1366
  sleep retry_delay
1352
1367
  cumul_retry_delay += retry_delay
@@ -1355,14 +1370,14 @@ class API
1355
1370
  end
1356
1371
  rescue Errno::ECONNREFUSED, Errno::ECONNRESET, Timeout::Error, EOFError, OpenSSL::SSL::SSLError, SocketError => e
1357
1372
  $stderr.print "#{e.class}: #{e.message}. "
1358
- if @retry_post_requests && cumul_retry_delay <= max_cumul_retry_delay
1373
+ if @retry_post_requests && cumul_retry_delay <= @max_cumul_retry_delay
1359
1374
  $stderr.puts "Retrying after #{retry_delay} seconds..."
1360
1375
  sleep retry_delay
1361
1376
  cumul_retry_delay += retry_delay
1362
1377
  retry_delay *= 2
1363
1378
  retry
1364
1379
  else
1365
- $stderr.puts "Retrying stopped after #{max_cumul_retry_delay} seconds."
1380
+ $stderr.puts "Retrying stopped after #{@max_cumul_retry_delay} seconds."
1366
1381
  raise e
1367
1382
  end
1368
1383
  rescue => e
@@ -1419,6 +1434,19 @@ class API
1419
1434
  "#{schema}://#{host}:#{@port}/#{@base_path + url}"
1420
1435
  end
1421
1436
 
1437
+ def guard_no_sslv3
1438
+ key = :SET_SSL_OP_NO_SSLv3
1439
+ backup = Thread.current[key]
1440
+ begin
1441
+ # Disable SSLv3 connection: See Net::HTTP hack at the bottom
1442
+ Thread.current[key] = true
1443
+ yield
1444
+ ensure
1445
+ # backup could be nil, but assigning nil to TLS means 'delete'
1446
+ Thread.current[key] = backup
1447
+ end
1448
+ end
1449
+
1422
1450
  def new_http(opts = {})
1423
1451
  host = opts[:host] || @host
1424
1452
  http = @http_class.new(host, @port)
@@ -1429,6 +1457,12 @@ class API
1429
1457
  #store = OpenSSL::X509::Store.new
1430
1458
  #http.cert_store = store
1431
1459
  http.ca_file = File.join(ssl_ca_file)
1460
+ # Disable SSLv3 connection in favor of POODLE Attack protection
1461
+ # ruby 1.8.7 uses own @ssl_context instead of calling
1462
+ # SSLContext#set_params.
1463
+ if ctx = http.instance_eval { @ssl_context }
1464
+ ctx.options = OpenSSL::SSL::OP_ALL | OpenSSL::SSL::OP_NO_SSLv3
1465
+ end
1432
1466
  end
1433
1467
 
1434
1468
  header = {}
@@ -1450,6 +1484,8 @@ class API
1450
1484
  if @ssl
1451
1485
  client.ssl_config.add_trust_ca(ssl_ca_file)
1452
1486
  client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_PEER
1487
+ # Disable SSLv3 connection in favor of POODLE Attack protection
1488
+ client.ssl_config.options |= OpenSSL::SSL::OP_NO_SSLv3
1453
1489
  end
1454
1490
 
1455
1491
  header = {}
@@ -1529,3 +1565,22 @@ class API
1529
1565
  end
1530
1566
 
1531
1567
  end # module TreasureData
1568
+
1569
+ require 'openssl'
1570
+ module OpenSSL
1571
+ module SSL
1572
+ class SSLContext
1573
+
1574
+ # For disabling SSLv3 connection in favor of POODLE Attack protection
1575
+ #
1576
+ # Allow 'options' customize through Thread local storage since
1577
+ # Net::HTTP does not support 'options' configuration.
1578
+ #
1579
+ alias original_set_params set_params
1580
+ def set_params(params={})
1581
+ original_set_params(params)
1582
+ self.options |= OP_NO_SSLv3 if Thread.current[:SET_SSL_OP_NO_SSLv3]
1583
+ end
1584
+ end
1585
+ end
1586
+ end
@@ -1,5 +1,5 @@
1
1
  module TreasureData
2
2
  class Client
3
- VERSION = '0.8.65'
3
+ VERSION = '0.8.66'
4
4
  end
5
5
  end
@@ -8,6 +8,7 @@ end
8
8
 
9
9
  require 'rspec'
10
10
  require 'webmock/rspec'
11
+ WebMock.disable_net_connect!(:allow_localhost => true)
11
12
 
12
13
  include WebMock::API
13
14
 
@@ -24,12 +25,12 @@ shared_context 'common helper' do
24
25
  end
25
26
 
26
27
  let :headers do
27
- {'Accept' => '*/*', 'Accept-Encoding' => 'deflate, gzip', 'Date' => /.*/, 'User-Agent' => 'Ruby'}
28
+ {'Accept' => '*/*', 'Accept-Encoding' => /gzip/, 'Date' => /.*/, 'User-Agent' => /Ruby/}
28
29
  end
29
30
 
30
31
  def stub_api_request(method, path, opts = nil)
31
32
  scheme = 'http'
32
- with_opts = {:header => headers}
33
+ with_opts = {:headers => headers}
33
34
  if opts
34
35
  scheme = 'https' if opts[:ssl]
35
36
  with_opts[:query] = opts[:query] if opts[:query]
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+ require 'td/client/api'
3
+ require 'logger'
4
+ require 'webrick'
5
+ require 'webrick/https'
6
+
7
+ describe 'API SSL connection' do
8
+ DIR = File.dirname(File.expand_path(__FILE__))
9
+
10
+ after :each do
11
+ @server.shutdown
12
+ end
13
+
14
+ it 'should fail to connect SSLv3 only server' do
15
+ @server = setup_server(:SSLv3)
16
+ api = API.new(nil, :endpoint => "https://localhost:#{@serverport}", :retry_post_requests => false)
17
+ api.ssl_ca_file = File.join(DIR, 'ca-all.cert')
18
+ expect {
19
+ api.delete_database('no_such_database')
20
+ }.to raise_error OpenSSL::SSL::SSLError
21
+ end
22
+
23
+ it 'should success to connect TLSv1 only server' do
24
+ @server = setup_server(:TLSv1)
25
+ api = API.new(nil, :endpoint => "https://localhost:#{@serverport}", :retry_post_requests => false)
26
+ api.ssl_ca_file = File.join(DIR, 'ca-all.cert')
27
+ expect {
28
+ api.delete_database('no_such_database')
29
+ }.to raise_error TreasureData::NotFoundError
30
+ end
31
+
32
+ def setup_server(ssl_version)
33
+ logger = Logger.new(STDERR)
34
+ logger.level = Logger::Severity::FATAL # avoid logging SSLError (ERROR level)
35
+ @server = WEBrick::HTTPServer.new(
36
+ :BindAddress => "localhost",
37
+ :Logger => logger,
38
+ :Port => 0,
39
+ :AccessLog => [],
40
+ :DocumentRoot => '.',
41
+ :SSLEnable => true,
42
+ :SSLCACertificateFile => File.join(DIR, 'ca.cert'),
43
+ :SSLCertificate => cert('server.cert'),
44
+ :SSLPrivateKey => key('server.key')
45
+ )
46
+ @serverport = @server.config[:Port]
47
+ @server.mount(
48
+ '/hello',
49
+ WEBrick::HTTPServlet::ProcHandler.new(method(:do_hello).to_proc)
50
+ )
51
+ @server.ssl_context.ssl_version = ssl_version
52
+ @server_thread = start_server_thread(@server)
53
+ return @server
54
+ end
55
+
56
+ def do_hello(req, res)
57
+ res['content-type'] = 'text/html'
58
+ res.body = "hello"
59
+ end
60
+
61
+ def start_server_thread(server)
62
+ t = Thread.new {
63
+ Thread.current.abort_on_exception = true
64
+ server.start
65
+ }
66
+ while server.status != :Running
67
+ sleep 0.1
68
+ unless t.alive?
69
+ t.join
70
+ raise
71
+ end
72
+ end
73
+ t
74
+ end
75
+
76
+ def cert(filename)
77
+ OpenSSL::X509::Certificate.new(File.read(File.join(DIR, filename)))
78
+ end
79
+
80
+ def key(filename)
81
+ OpenSSL::PKey::RSA.new(File.read(File.join(DIR, filename)))
82
+ end
83
+ end
@@ -18,7 +18,7 @@ describe 'Database API' do
18
18
  stub_api_request(:post, "/v3/database/create/#{e(db_name)}")
19
19
  .to_return(:body => {'database' => db_name}.to_json)
20
20
 
21
- api.create_database(db_name).should be_true
21
+ api.create_database(db_name).should be true
22
22
  end
23
23
 
24
24
  it 'should return 400 error with invalid name' do
@@ -10,11 +10,14 @@ describe 'Job API' do
10
10
  API.new(nil)
11
11
  end
12
12
 
13
+ let :api_with_short_retry do
14
+ API.new(nil, {:max_cumul_retry_delay => 10})
15
+ end
16
+
13
17
  describe 'list_jobs' do
14
18
  it 'should returns 20 jobs by default' do
15
19
  stub_api_request(:get, "/v3/job/list", :query => {'from' => '0'}).to_return(:body => {'jobs' => raw_jobs}.to_json)
16
20
  jobs = api.list_jobs
17
- puts jobs.size
18
21
  jobs.size.should == 20
19
22
  end
20
23
 
@@ -102,7 +105,7 @@ describe 'Job API' do
102
105
  stub_api_request(:get, "/v3/job/show/#{e(invalid_id)}").to_return(:status => 500, :body => body.to_json)
103
106
 
104
107
  expect {
105
- api.show_job(invalid_id)
108
+ api_with_short_retry.show_job(invalid_id)
106
109
  }.to raise_error(TreasureData::APIError, /'job_id' parameter is required but missing/)
107
110
  end
108
111
  end
@@ -14,7 +14,7 @@ describe 'Result API' do
14
14
  params = {'url' => result_url}
15
15
  stub_api_request(:post, "/v3/result/create/#{e(result_name)}").with(:body => params).to_return(:body => {'result' => result_name})
16
16
 
17
- api.create_result(result_name, result_url).should be_true
17
+ api.create_result(result_name, result_url).should be true
18
18
  end
19
19
 
20
20
  it 'should return 422 error with invalid name' do
@@ -17,21 +17,21 @@ describe 'Schedule API' do
17
17
  it 'should create a new schedule' do
18
18
  start = Time.now
19
19
  stub_api_request(:post, "/v3/schedule/create/#{e(sched_name)}")
20
- .with(opts.merge('type' => 'hive'))
20
+ .with(:body => opts.merge('type' => 'hive'))
21
21
  .to_return(:body => {'name' => sched_name, 'start' => start.to_s}.to_json)
22
22
 
23
- api.create_schedule(sched_name, opts).should == start.to_s
23
+ api.create_schedule(sched_name, opts.merge('type' => 'hive')).should == start.to_s
24
24
  end
25
25
 
26
26
  it 'should return 422 error with invalid name' do
27
27
  name = '1'
28
28
  err_msg = "Validation failed: Name is too short" # " (minimum is 3 characters)"
29
29
  stub_api_request(:post, "/v3/schedule/create/#{e(name)}")
30
- .with(opts.merge('type' => 'hive'))
30
+ .with(:body => opts.merge('type' => 'hive'))
31
31
  .to_return(:status => 422, :body => {'message' => err_msg}.to_json)
32
32
 
33
33
  expect {
34
- api.create_schedule(name, opts)
34
+ api.create_schedule(name, opts.merge('type' => 'hive'))
35
35
  }.to raise_error(TreasureData::APIError, /#{err_msg}/)
36
36
  end
37
37
  end
@@ -46,18 +46,17 @@ describe 'Schedule API' do
46
46
 
47
47
  it 'should not return 414 even if the query text is very long' do
48
48
  stub_api_request(:post, "/v3/schedule/update/#{e(sched_name)}")
49
- .with(opts.merge('type' => 'pig'))
49
+ .with(:body => opts.merge('type' => 'pig'))
50
50
  .to_return(:body => {'name' => sched_name, 'query' => pig_query}.to_json)
51
51
 
52
- err_msg = "Update schedule failed: Request-URI Too Long"
53
52
  expect {
54
- api.update_schedule(sched_name, opts)
53
+ api.update_schedule(sched_name, opts.merge('type' => 'pig'))
55
54
  }.not_to raise_error
56
55
  end
57
56
 
58
57
  it 'should update the schedule with the new query' do
59
58
  stub_api_request(:post, "/v3/schedule/update/#{e(sched_name)}")
60
- .with(opts.merge('type' => 'pig'))
59
+ .with(:body => opts.merge('type' => 'pig'))
61
60
  .to_return(:body => {'name' => sched_name, 'query' => pig_query}.to_json)
62
61
 
63
62
  stub_api_request(:get, "/v3/schedule/list")
@@ -27,7 +27,7 @@ describe 'Table API' do
27
27
  it 'should create a new table if the database exists' do
28
28
  stub_api_request(:post, "/v3/table/create/#{e db_name}/#{e(table_name)}/log")
29
29
  .to_return(:body => {'database' => db_name, 'table' => table_name, 'type' => 'log'}.to_json)
30
- api.create_log_table(db_name, table_name).should be_true
30
+ api.create_log_table(db_name, table_name).should be true
31
31
  end
32
32
 
33
33
  it 'should return 400 error with invalid name' do
metadata CHANGED
@@ -1,141 +1,141 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: td-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.65
4
+ version: 0.8.66
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: 2014-10-15 00:00:00.000000000 Z
11
+ date: 2014-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.4.4
20
- - - ! '!='
20
+ - - "!="
21
21
  - !ruby/object:Gem::Version
22
22
  version: 0.5.0
23
- - - ! '!='
23
+ - - "!="
24
24
  - !ruby/object:Gem::Version
25
25
  version: 0.5.1
26
- - - ! '!='
26
+ - - "!="
27
27
  - !ruby/object:Gem::Version
28
28
  version: 0.5.2
29
- - - ! '!='
29
+ - - "!="
30
30
  - !ruby/object:Gem::Version
31
31
  version: 0.5.3
32
- - - <
32
+ - - "<"
33
33
  - !ruby/object:Gem::Version
34
34
  version: 0.6.0
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ! '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: 0.4.4
42
- - - ! '!='
42
+ - - "!="
43
43
  - !ruby/object:Gem::Version
44
44
  version: 0.5.0
45
- - - ! '!='
45
+ - - "!="
46
46
  - !ruby/object:Gem::Version
47
47
  version: 0.5.1
48
- - - ! '!='
48
+ - - "!="
49
49
  - !ruby/object:Gem::Version
50
50
  version: 0.5.2
51
- - - ! '!='
51
+ - - "!="
52
52
  - !ruby/object:Gem::Version
53
53
  version: 0.5.3
54
- - - <
54
+ - - "<"
55
55
  - !ruby/object:Gem::Version
56
56
  version: 0.6.0
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: json
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - ! '>='
61
+ - - ">="
62
62
  - !ruby/object:Gem::Version
63
63
  version: 1.7.6
64
64
  type: :runtime
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - ! '>='
68
+ - - ">="
69
69
  - !ruby/object:Gem::Version
70
70
  version: 1.7.6
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: httpclient
73
73
  requirement: !ruby/object:Gem::Requirement
74
74
  requirements:
75
- - - ~>
75
+ - - "~>"
76
76
  - !ruby/object:Gem::Version
77
77
  version: 2.4.0
78
78
  type: :runtime
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
- - - ~>
82
+ - - "~>"
83
83
  - !ruby/object:Gem::Version
84
84
  version: 2.4.0
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: rspec
87
87
  requirement: !ruby/object:Gem::Requirement
88
88
  requirements:
89
- - - ~>
89
+ - - "~>"
90
90
  - !ruby/object:Gem::Version
91
91
  version: '2.8'
92
92
  type: :development
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
- - - ~>
96
+ - - "~>"
97
97
  - !ruby/object:Gem::Version
98
98
  version: '2.8'
99
99
  - !ruby/object:Gem::Dependency
100
100
  name: webmock
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
- - - ~>
103
+ - - "~>"
104
104
  - !ruby/object:Gem::Version
105
105
  version: '1.16'
106
106
  type: :development
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
- - - ~>
110
+ - - "~>"
111
111
  - !ruby/object:Gem::Version
112
112
  version: '1.16'
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: simplecov
115
115
  requirement: !ruby/object:Gem::Requirement
116
116
  requirements:
117
- - - ! '>='
117
+ - - ">="
118
118
  - !ruby/object:Gem::Version
119
119
  version: 0.5.4
120
120
  type: :development
121
121
  prerelease: false
122
122
  version_requirements: !ruby/object:Gem::Requirement
123
123
  requirements:
124
- - - ! '>='
124
+ - - ">="
125
125
  - !ruby/object:Gem::Version
126
126
  version: 0.5.4
127
127
  - !ruby/object:Gem::Dependency
128
128
  name: rake
129
129
  requirement: !ruby/object:Gem::Requirement
130
130
  requirements:
131
- - - ! '>='
131
+ - - ">="
132
132
  - !ruby/object:Gem::Version
133
133
  version: '0'
134
134
  type: :development
135
135
  prerelease: false
136
136
  version_requirements: !ruby/object:Gem::Requirement
137
137
  requirements:
138
- - - ! '>='
138
+ - - ">="
139
139
  - !ruby/object:Gem::Version
140
140
  version: '0'
141
141
  description: Treasure Data API library for Ruby
@@ -153,6 +153,7 @@ files:
153
153
  - lib/td/client/version.rb
154
154
  - spec/spec_helper.rb
155
155
  - spec/td/client/api_spec.rb
156
+ - spec/td/client/api_ssl_connection_spec.rb
156
157
  - spec/td/client/bulk_import_spec.rb
157
158
  - spec/td/client/db_api_spec.rb
158
159
  - spec/td/client/export_api_spec.rb
@@ -171,12 +172,12 @@ require_paths:
171
172
  - lib
172
173
  required_ruby_version: !ruby/object:Gem::Requirement
173
174
  requirements:
174
- - - ! '>='
175
+ - - ">="
175
176
  - !ruby/object:Gem::Version
176
177
  version: '0'
177
178
  required_rubygems_version: !ruby/object:Gem::Requirement
178
179
  requirements:
179
- - - ! '>='
180
+ - - ">="
180
181
  - !ruby/object:Gem::Version
181
182
  version: '0'
182
183
  requirements: []
@@ -187,6 +188,7 @@ specification_version: 4
187
188
  summary: Treasure Data API library for Ruby
188
189
  test_files:
189
190
  - spec/td/client/api_spec.rb
191
+ - spec/td/client/api_ssl_connection_spec.rb
190
192
  - spec/td/client/bulk_import_spec.rb
191
193
  - spec/td/client/db_api_spec.rb
192
194
  - spec/td/client/export_api_spec.rb