presto-client 0.5.6 → 0.5.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ab5325ef43e73961c5e9736fe204f2a081e178c7
4
- data.tar.gz: 6a168ca482d78e69760c032ebf2f92af37b1b18b
3
+ metadata.gz: 5c323f1555c8b8911022378e1b6b5c3ab32ea198
4
+ data.tar.gz: dad8f48273aa312ff3c89809698f6bf4955d54b1
5
5
  SHA512:
6
- metadata.gz: 44eae00fff8f16da24337bb6b740b6e77e4212c8a28e62506146f15f0d2a2719f8703c81b3bccf6c932f3235cbf51e9a442686e835830db5bf57e4dcdf8d77b7
7
- data.tar.gz: 79f2fd6d22e241de0ba42977eee74b669d90ccc419dd2d64bd593b723626735b419739bdab3da23f2c994f9fdd1cd3761f6167da123486b24d4f15692c35dd11
6
+ metadata.gz: 7ef2fa5dd5e59a1d5a68f064bf3af0cabbae98b72ab9c64764297491c60de03f5ce7a7f00b527f5763b8eb92bdf2f5ffe2a9c01c4dc57a1da17b0f6c773d6368
7
+ data.tar.gz: fe6c1fc26dff277531c8334b6feaf299b66f4cebdfc9b752ceda5e26c5edd3a4b95888c0b4292f22d526a364f61c1f1bcfb18f55c28e82b78e1bae32d9f2c35e
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ 2017-08-28 version 0.5.7
2
+ * Support a password option with HTTP basic auth
3
+ * Changed retry timeout from hard coded 2h to configurable default 2min
4
+ * Fix too deep nested json failure
5
+
1
6
  2017-07-03 version 0.5.6:
2
7
  * Added missing inner class models for version 0.178
3
8
 
data/README.md CHANGED
@@ -19,6 +19,7 @@ client = Presto::Client.new(
19
19
  catalog: "native",
20
20
  schema: "default",
21
21
  user: "frsyuki",
22
+ password: "********",
22
23
  time_zone: "US/Pacific",
23
24
  language: "English",
24
25
  properties: {
@@ -81,6 +82,7 @@ $ bundle exec rake modelgen:latest
81
82
  * **schema** sets default schema name of Presto. You need to use qualified name like `FROM myschema.table1` to use non-default schemas.
82
83
  * **source** sets source name to connect to a Presto. This name is shown on Presto web interface.
83
84
  * **user** sets user name to connect to a Presto.
85
+ * **password** sets a password to connect to Presto using basic auth.
84
86
  * **time_zone** sets time zone of queries. Time zone affects some functions such as `format_datetime`.
85
87
  * **language** sets language of queries. Language affects some functions such as `format_datetime`.
86
88
  * **properties** set session properties. Session properties affect internal behavior such as `hive.force_local_scheduling: true`, `raptor.reader_stream_buffer_size: "32MB"`, etc.
@@ -37,6 +37,10 @@ module Presto::Client
37
37
 
38
38
  ssl = faraday_ssl_options(options)
39
39
 
40
+ if options[:password] && !ssl
41
+ raise ArgumentError, "Protocol must be https when passing a password"
42
+ end
43
+
40
44
  url = "#{ssl ? "https" : "http"}://#{server}"
41
45
  proxy = options[:http_proxy] || options[:proxy] # :proxy is obsoleted
42
46
 
@@ -45,6 +49,11 @@ module Presto::Client
45
49
 
46
50
  faraday = Faraday.new(faraday_options) do |faraday|
47
51
  #faraday.request :url_encoded
52
+
53
+ if options[:user] && options[:password]
54
+ faraday.basic_auth(options[:user], options[:password])
55
+ end
56
+
48
57
  faraday.response :logger if options[:http_debug]
49
58
  faraday.adapter Faraday.default_adapter
50
59
  end
@@ -15,7 +15,7 @@
15
15
  #
16
16
  module Presto::Client
17
17
 
18
- require 'multi_json'
18
+ require 'json'
19
19
  require 'msgpack'
20
20
  require 'presto/client/models'
21
21
  require 'presto/client/errors'
@@ -40,6 +40,11 @@ module Presto::Client
40
40
  "User-Agent" => "presto-ruby/#{VERSION}",
41
41
  }
42
42
 
43
+ # Presto can return too deep nested JSON
44
+ JSON_OPTIONS = {
45
+ :max_nesting => false
46
+ }
47
+
43
48
  def initialize(faraday, query, options, next_uri=nil)
44
49
  @faraday = faraday
45
50
  @faraday.headers.merge!(HEADERS)
@@ -48,7 +53,7 @@ module Presto::Client
48
53
  @query = query
49
54
  @closed = false
50
55
  @exception = nil
51
-
56
+ @retry_timeout = options[:retry_timeout] || 120
52
57
  if model_version = @options[:model_version]
53
58
  @models = ModelVersions.const_get("V#{model_version.gsub(".", "_")}")
54
59
  else
@@ -195,7 +200,7 @@ module Presto::Client
195
200
  when 'application/x-msgpack'
196
201
  MessagePack.load(response.body)
197
202
  else
198
- MultiJson.load(response.body)
203
+ JSON.parse(response.body, opts = JSON_OPTIONS)
199
204
  end
200
205
  end
201
206
 
@@ -230,7 +235,7 @@ module Presto::Client
230
235
 
231
236
  attempts += 1
232
237
  sleep attempts * 0.1
233
- end while (Time.now - start) < 2*60*60 && !@closed
238
+ end while (Time.now - start) < @retry_timeout && !@closed
234
239
 
235
240
  @exception = PrestoHttpError.new(408, "Presto API error due to timeout")
236
241
  raise @exception
@@ -15,6 +15,6 @@
15
15
  #
16
16
  module Presto
17
17
  module Client
18
- VERSION = "0.5.6"
18
+ VERSION = "0.5.7"
19
19
  end
20
20
  end
@@ -20,12 +20,11 @@ Gem::Specification.new do |gem|
20
20
  gem.required_ruby_version = ">= 1.9.1"
21
21
 
22
22
  gem.add_dependency "faraday", ["~> 0.12"]
23
- gem.add_dependency "multi_json", ["~> 1.0"]
24
- gem.add_dependency "msgpack", [">= 0.7.0"]
23
+ gem.add_dependency "msgpack", [">= 0.7.0"]
25
24
 
26
25
  gem.add_development_dependency "rake", [">= 0.9.2", "< 11.0"]
27
26
  gem.add_development_dependency "rspec", ["~> 2.13.0"]
28
- gem.add_development_dependency "webmock", ["~> 1.16.1"]
27
+ gem.add_development_dependency "webmock", ["~> 2.0.0"]
29
28
  gem.add_development_dependency "addressable", ["~> 2.4.0"] # 2.5.0 doesn't support Ruby 1.9.3
30
29
  gem.add_development_dependency "simplecov", ["~> 0.10.0"]
31
30
  end
@@ -136,6 +136,38 @@ describe Presto::Client::StatementClient do
136
136
  end.should raise_error(TypeError, /String to Hash/)
137
137
  end
138
138
 
139
+ describe 'HTTP basic auth' do
140
+ let(:password) { 'abcd' }
141
+
142
+ it "adds basic auth headers when ssl is enabled and a password is given" do
143
+ stub_request(:post, "https://localhost/v1/statement").
144
+ with(body: query,
145
+ headers: {
146
+ "User-Agent" => "presto-ruby/#{VERSION}",
147
+ "X-Presto-Catalog" => options[:catalog],
148
+ "X-Presto-Schema" => options[:schema],
149
+ "X-Presto-User" => options[:user],
150
+ "X-Presto-Language" => options[:language],
151
+ "X-Presto-Time-Zone" => options[:time_zone],
152
+ "X-Presto-Session" => options[:properties].map {|k,v| "#{k}=#{v}"}.join("\r\nX-Presto-Session: ")
153
+ },
154
+ basic_auth: [options[:user], password]
155
+ ).to_return(body: response_json.to_json)
156
+
157
+ faraday = Query.__send__(:faraday_client, options.merge(ssl: { verify: true }, password: password))
158
+ StatementClient.new(faraday, query, options)
159
+ end
160
+
161
+ it "forbids using basic auth when ssl is disabled" do
162
+ lambda do
163
+ Query.__send__(:faraday_client, {
164
+ server: 'localhost',
165
+ password: 'abcd'
166
+ })
167
+ end.should raise_error(ArgumentError)
168
+ end
169
+ end
170
+
139
171
  describe "ssl" do
140
172
  it "is disabled by default" do
141
173
  f = Query.__send__(:faraday_client, {
@@ -230,5 +262,35 @@ describe Presto::Client::StatementClient do
230
262
  StatementClient.new(faraday, query, options.merge(model_version: "0.111"))
231
263
  end.should raise_error(NameError)
232
264
  end
265
+
266
+
267
+ let :nested_json do
268
+ nested_stats = {createTime: Time.now}
269
+ # JSON max nesting default value is 100
270
+ for i in 0..100 do
271
+ nested_stats = {stats: nested_stats}
272
+ end
273
+ {
274
+ id: "queryid",
275
+ stats: nested_stats
276
+ }
277
+ end
278
+
279
+ it "parse nested json properly" do
280
+ stub_request(:post, "localhost/v1/statement").
281
+ with(body: query,
282
+ headers: {
283
+ "User-Agent" => "presto-ruby/#{VERSION}",
284
+ "X-Presto-Catalog" => options[:catalog],
285
+ "X-Presto-Schema" => options[:schema],
286
+ "X-Presto-User" => options[:user],
287
+ "X-Presto-Language" => options[:language],
288
+ "X-Presto-Time-Zone" => options[:time_zone],
289
+ "X-Presto-Session" => options[:properties].map {|k,v| "#{k}=#{v}"}.join("\r\nX-Presto-Session: ")
290
+ }).to_return(body: nested_json.to_json(:max_nesting => false))
291
+
292
+ faraday = Faraday.new(url: "http://localhost")
293
+ StatementClient.new(faraday, query, options)
294
+ end
233
295
  end
234
296
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: presto-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.5.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-03 00:00:00.000000000 Z
11
+ date: 2017-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.12'
27
- - !ruby/object:Gem::Dependency
28
- name: multi_json
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: msgpack
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -92,14 +78,14 @@ dependencies:
92
78
  requirements:
93
79
  - - "~>"
94
80
  - !ruby/object:Gem::Version
95
- version: 1.16.1
81
+ version: 2.0.0
96
82
  type: :development
97
83
  prerelease: false
98
84
  version_requirements: !ruby/object:Gem::Requirement
99
85
  requirements:
100
86
  - - "~>"
101
87
  - !ruby/object:Gem::Version
102
- version: 1.16.1
88
+ version: 2.0.0
103
89
  - !ruby/object:Gem::Dependency
104
90
  name: addressable
105
91
  requirement: !ruby/object:Gem::Requirement
@@ -182,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
182
168
  version: '0'
183
169
  requirements: []
184
170
  rubyforge_project:
185
- rubygems_version: 2.6.10
171
+ rubygems_version: 2.6.11
186
172
  signing_key:
187
173
  specification_version: 4
188
174
  summary: Presto client library