ibm_watson 0.5.1 → 0.6.0

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.
@@ -39,6 +39,7 @@ class WatsonService
39
39
  @password = nil
40
40
  @token_manager = nil
41
41
  @temp_headers = nil
42
+ @icp_prefix = vars[:password]&.start_with?("icp-") ? true : false
42
43
 
43
44
  user_agent_string = "watson-apis-ruby-sdk-" + IBMWatson::VERSION
44
45
  user_agent_string += " #{RbConfig::CONFIG["host"]}"
@@ -60,10 +61,10 @@ class WatsonService
60
61
  end
61
62
 
62
63
  if !vars[:iam_access_token].nil? || !vars[:iam_apikey].nil?
63
- _token_manager(iam_apikey: vars[:iam_apikey], iam_access_token: vars[:iam_access_token], iam_url: vars[:iam_url])
64
+ set_token_manager(iam_apikey: vars[:iam_apikey], iam_access_token: vars[:iam_access_token], iam_url: vars[:iam_url])
64
65
  elsif !vars[:username].nil? && !vars[:password].nil?
65
- if vars[:username] == "apikey"
66
- _iam_apikey(iam_apikey: vars[:password])
66
+ if vars[:username] == "apikey" && !@icp_prefix
67
+ iam_apikey(iam_apikey: vars[:password])
67
68
  else
68
69
  @username = vars[:username]
69
70
  @password = vars[:password]
@@ -86,24 +87,16 @@ class WatsonService
86
87
 
87
88
  def add_default_headers(headers: {})
88
89
  raise TypeError unless headers.instance_of?(Hash)
89
- headers.each_pair { |k, v| @conn.default_options.headers.add(k, v) }
90
- end
91
90
 
92
- def _token_manager(iam_apikey: nil, iam_access_token: nil, iam_url: nil)
93
- @iam_apikey = iam_apikey
94
- @iam_access_token = iam_access_token
95
- @iam_url = iam_url
96
- @token_manager = IAMTokenManager.new(iam_apikey: iam_apikey, iam_access_token: iam_access_token, iam_url: iam_url)
91
+ headers.each_pair { |k, v| @conn.default_options.headers.add(k, v) }
97
92
  end
98
93
 
99
- def _iam_access_token(iam_access_token:)
100
- @token_manager&._access_token(iam_access_token: iam_access_token)
94
+ def iam_access_token(iam_access_token:)
101
95
  @token_manager = IAMTokenManager.new(iam_access_token: iam_access_token) if @token_manager.nil?
102
96
  @iam_access_token = iam_access_token
103
97
  end
104
98
 
105
- def _iam_apikey(iam_apikey:)
106
- @token_manager&._iam_apikey(iam_apikey: iam_apikey)
99
+ def iam_apikey(iam_apikey:)
107
100
  @token_manager = IAMTokenManager.new(iam_apikey: iam_apikey) if @token_manager.nil?
108
101
  @iam_apikey = iam_apikey
109
102
  end
@@ -125,14 +118,14 @@ class WatsonService
125
118
  args.delete_if { |_, v| v.nil? }
126
119
  args[:headers].delete("Content-Type") if args.key?(:form) || args[:json].nil?
127
120
 
128
- if @username == "apikey"
129
- _iam_apikey(iam_apikey: @password)
121
+ if @username == "apikey" && !@icp_prefix
122
+ iam_apikey(iam_apikey: @password)
130
123
  @username = nil
131
124
  end
132
125
 
133
126
  conn = @conn
134
127
  if !@token_manager.nil?
135
- access_token = @token_manager._token
128
+ access_token = @token_manager.token
136
129
  args[:headers]["Authorization"] = "Bearer #{access_token}"
137
130
  elsif !@username.nil? && !@password.nil?
138
131
  conn = @conn.basic_auth(user: @username, pass: @password)
@@ -159,6 +152,7 @@ class WatsonService
159
152
  )
160
153
  end
161
154
  return DetailedResponse.new(response: response) if (200..299).cover?(response.code)
155
+
162
156
  raise WatsonApiException.new(response: response)
163
157
  end
164
158
 
@@ -167,6 +161,7 @@ class WatsonService
167
161
  # @return [self]
168
162
  def headers(headers)
169
163
  raise TypeError("Expected Hash type, received #{headers.class}") unless headers.instance_of?(Hash)
164
+
170
165
  @temp_headers = headers
171
166
  self
172
167
  end
@@ -184,16 +179,26 @@ class WatsonService
184
179
  # @option timeout global [Integer] Upper bound on total request time
185
180
  def configure_http_client(proxy: {}, timeout: {})
186
181
  raise TypeError("proxy parameter must be a Hash") unless proxy.empty? || proxy.instance_of?(Hash)
182
+
187
183
  raise TypeError("timeout parameter must be a Hash") unless timeout.empty? || timeout.instance_of?(Hash)
184
+
188
185
  add_proxy(proxy) unless proxy.empty? || !proxy.dig(:address).is_a?(String) || !proxy.dig(:port).is_a?(Integer)
189
186
  add_timeout(timeout) unless timeout.empty? || (!timeout.key?(:per_operation) && !timeout.key?(:global))
190
187
  end
191
188
 
192
189
  private
193
190
 
191
+ def set_token_manager(iam_apikey: nil, iam_access_token: nil, iam_url: nil)
192
+ @iam_apikey = iam_apikey
193
+ @iam_access_token = iam_access_token
194
+ @iam_url = iam_url
195
+ @token_manager = IAMTokenManager.new(iam_apikey: iam_apikey, iam_access_token: iam_access_token, iam_url: iam_url)
196
+ end
197
+
194
198
  def add_timeout(timeout)
195
199
  if timeout.key?(:per_operation)
196
200
  raise TypeError("per_operation in timeout must be a Hash") unless timeout[:per_operation].instance_of?(Hash)
201
+
197
202
  defaults = {
198
203
  write: 0,
199
204
  connect: 0,
@@ -203,6 +208,7 @@ class WatsonService
203
208
  @conn = @conn.timeout(:per_operation, write: time[:write], connect: time[:connect], read: time[:read])
204
209
  else
205
210
  raise TypeError("global in timeout must be an Integer") unless timeout[:global].is_a?(Integer)
211
+
206
212
  @conn = @conn.timeout(:global, write: timeout[:global], connect: 0, read: 0)
207
213
  end
208
214
  end
@@ -151,6 +151,7 @@ class WebSocketClient
151
151
 
152
152
  def send_chunk(chunk:, final: false)
153
153
  return if chunk.nil?
154
+
154
155
  @bytes_sent += chunk.size
155
156
  @client.send(chunk.bytes)
156
157
  @client.send({ "action" => "stop" }.to_json) if final
@@ -11,8 +11,7 @@ if !ENV["ASSISTANT_IAM_URL"].nil? && !ENV["ASSISTANT_IAM_APIKEY"].nil?
11
11
  url: ENV["ASSISTANT_IAM_URL"],
12
12
  version: "2018-02-16"
13
13
  )
14
- service._iam_apikey(iam_apikey: ENV["ASSISTANT_IAM_APIKEY"])
15
- service._iam_apikey(iam_apikey: ENV["ASSISTANT_IAM_APIKEY"])
14
+ service.iam_apikey(iam_apikey: ENV["ASSISTANT_IAM_APIKEY"])
16
15
  service.add_default_headers(
17
16
  headers: {
18
17
  "X-Watson-Learning-Opt-Out" => "1",
@@ -48,8 +47,7 @@ if !ENV["ASSISTANT_IAM_URL"].nil? && !ENV["ASSISTANT_IAM_APIKEY"].nil?
48
47
  url: ENV["ASSISTANT_IAM_URL"],
49
48
  version: "2018-02-16"
50
49
  )
51
- service._iam_apikey(iam_apikey: ENV["ASSISTANT_IAM_APIKEY"])
52
- service._iam_apikey(iam_apikey: ENV["ASSISTANT_IAM_APIKEY"])
50
+ service.iam_apikey(iam_apikey: ENV["ASSISTANT_IAM_APIKEY"])
53
51
  service.add_default_headers(
54
52
  headers: {
55
53
  "X-Watson-Learning-Opt-Out" => "1",
@@ -706,7 +704,7 @@ if !ENV["ASSISTANT_IAM_URL"].nil? && !ENV["ASSISTANT_IAM_APIKEY"].nil?
706
704
  )
707
705
  error_received = false
708
706
  begin
709
- service._iam_apikey(iam_apikey: "bogus_api_key")
707
+ service.iam_apikey(iam_apikey: "bogus_api_key")
710
708
  service.list_workspaces
711
709
  rescue WatsonApiException => e
712
710
  assert_equal("Provided API key could not be found", e.info["errorMessage"])
@@ -40,6 +40,37 @@ class AssistantV1Test < Minitest::Test
40
40
  assert_equal(response, service_response.result)
41
41
  end
42
42
 
43
+ def test_plain_to_json_icp
44
+ response = {
45
+ "text" => "I want financial advice today.",
46
+ "created" => "2016-07-11T16:39:01.774Z",
47
+ "updated" => "2015-12-07T18:53:59.153Z"
48
+ }
49
+ headers = {
50
+ "Content-Type" => "application/json"
51
+ }
52
+ stub_request(:post, "https://gateway.watsonplatform.net/assistant/api/v1/workspaces/boguswid/counterexamples?version=2018-02-16")
53
+ .with(
54
+ body: "{\"text\":\"I want financial advice today.\"}",
55
+ headers: {
56
+ "Accept" => "application/json",
57
+ "Authorization" => "Basic YXBpa2V5OmljcC14eXo=",
58
+ "Content-Type" => "application/json",
59
+ "Host" => "gateway.watsonplatform.net"
60
+ }
61
+ ).to_return(status: 201, body: response.to_json, headers: headers)
62
+ service = IBMWatson::AssistantV1.new(
63
+ version: "2018-02-16",
64
+ username: "apikey",
65
+ password: "icp-xyz"
66
+ )
67
+ service_response = service.create_counterexample(
68
+ workspace_id: "boguswid",
69
+ text: "I want financial advice today."
70
+ )
71
+ assert_equal(response, service_response.result)
72
+ end
73
+
43
74
  def test_rate_limit_exceeded
44
75
  error_code = 429
45
76
  error_msg = "Rate limit exceeded"
@@ -14,9 +14,6 @@ class HTTPConfigTest < Minitest::Test
14
14
  username: "username",
15
15
  password: "password"
16
16
  )
17
- def service.conn
18
- @watson_service.conn
19
- end
20
17
  service.configure_http_client(
21
18
  proxy: {
22
19
  address: "bogus_address.com",
@@ -34,9 +31,6 @@ class HTTPConfigTest < Minitest::Test
34
31
  username: "username",
35
32
  password: "password"
36
33
  )
37
- def service.conn
38
- @watson_service.conn
39
- end
40
34
  service.configure_http_client(
41
35
  proxy: {
42
36
  address: "bogus_address.com",
@@ -58,9 +52,6 @@ class HTTPConfigTest < Minitest::Test
58
52
  username: "username",
59
53
  password: "password"
60
54
  )
61
- def service.conn
62
- @watson_service.conn
63
- end
64
55
  service.configure_http_client(
65
56
  proxy: {
66
57
  address: "bogus_address.com",
@@ -82,9 +73,6 @@ class HTTPConfigTest < Minitest::Test
82
73
  username: "username",
83
74
  password: "password"
84
75
  )
85
- def service.conn
86
- @watson_service.conn
87
- end
88
76
  service.configure_http_client(
89
77
  proxy: {
90
78
  address: "bogus_address.com",
@@ -110,9 +98,6 @@ class HTTPConfigTest < Minitest::Test
110
98
  username: "username",
111
99
  password: "password"
112
100
  )
113
- def service.conn
114
- @watson_service.conn
115
- end
116
101
  service.configure_http_client(
117
102
  timeout: {
118
103
  per_operation: {
@@ -140,9 +125,6 @@ class HTTPConfigTest < Minitest::Test
140
125
  username: "username",
141
126
  password: "password"
142
127
  )
143
- def service.conn
144
- @watson_service.conn
145
- end
146
128
  service.configure_http_client(
147
129
  timeout: {
148
130
  global: 20
@@ -33,7 +33,7 @@ class IAMTokenManagerTest < Minitest::Test
33
33
  "Host" => "iam.bluemix.net"
34
34
  }
35
35
  ).to_return(status: 200, body: response.to_json, headers: {})
36
- token_response = token_manager._request_token
36
+ token_response = token_manager.send(:request_token)
37
37
  assert_equal(response, token_response)
38
38
  end
39
39
 
@@ -61,7 +61,7 @@ class IAMTokenManagerTest < Minitest::Test
61
61
  "Host" => "iam.bluemix.net"
62
62
  }
63
63
  ).to_return(status: 200, body: response.to_json, headers: {})
64
- token_response = token_manager._refresh_token
64
+ token_response = token_manager.send(:refresh_token)
65
65
  assert_equal(response, token_response)
66
66
  end
67
67
 
@@ -79,9 +79,9 @@ class IAMTokenManagerTest < Minitest::Test
79
79
  "refresh_token" => "jy4gl91BQ"
80
80
  }
81
81
 
82
- refute(token_manager._is_token_expired?)
82
+ refute(token_manager.send(:token_expired?))
83
83
  token_manager.token_info["expiration"] = Time.now.to_i - 3600
84
- assert(token_manager._is_token_expired?)
84
+ assert(token_manager.send(:token_expired?))
85
85
  end
86
86
 
87
87
  def test_is_refresh_token_expired
@@ -98,9 +98,9 @@ class IAMTokenManagerTest < Minitest::Test
98
98
  "refresh_token" => "jy4gl91BQ"
99
99
  }
100
100
 
101
- refute(token_manager._is_refresh_token_expired?)
101
+ refute(token_manager.send(:refresh_token_expired?))
102
102
  token_manager.token_info["expiration"] = Time.now.to_i - (8 * 24 * 3600)
103
- assert(token_manager._is_token_expired?)
103
+ assert(token_manager.send(:token_expired?))
104
104
  end
105
105
 
106
106
  def test_get_token
@@ -111,7 +111,7 @@ class IAMTokenManagerTest < Minitest::Test
111
111
  )
112
112
  token_manager.user_access_token = "user_access_token"
113
113
 
114
- token = token_manager._token
114
+ token = token_manager.token
115
115
  assert_equal(token_manager.user_access_token, token)
116
116
 
117
117
  response = {
@@ -132,11 +132,11 @@ class IAMTokenManagerTest < Minitest::Test
132
132
  }
133
133
  ).to_return(status: 200, body: response.to_json, headers: {})
134
134
  token_manager.user_access_token = ""
135
- token = token_manager._token
135
+ token = token_manager.token
136
136
  assert_equal("hellohello", token)
137
137
 
138
138
  token_manager.token_info["expiration"] = Time.now.to_i - (20 * 24 * 3600)
139
- token = token_manager._token
139
+ token = token_manager.token
140
140
  assert_equal("hellohello", token)
141
141
 
142
142
  stub_request(:post, "https://iam.bluemix.net/identity/token")
@@ -149,7 +149,7 @@ class IAMTokenManagerTest < Minitest::Test
149
149
  }
150
150
  ).to_return(status: 200, body: response.to_json, headers: {})
151
151
  token_manager.token_info["expiration"] = Time.now.to_i - 4000
152
- token = token_manager._token
152
+ token = token_manager.token
153
153
  assert_equal("hellohello", token)
154
154
 
155
155
  token_manager.token_info = {
@@ -159,7 +159,17 @@ class IAMTokenManagerTest < Minitest::Test
159
159
  "expiration" => Time.now.to_i + 3600,
160
160
  "refresh_token" => "jy4gl91BQ"
161
161
  }
162
- token = token_manager._token
162
+ token = token_manager.token
163
163
  assert_equal("dummy", token)
164
164
  end
165
+
166
+ def test_dont_leak_constants
167
+ assert_nil(defined? DEFAULT_IAM_URL)
168
+ assert_nil(defined? CONTENT_TYPE)
169
+ assert_nil(defined? ACCEPT)
170
+ assert_nil(defined? DEFAULT_AUTHORIZATION)
171
+ assert_nil(defined? REQUEST_TOKEN_GRANT_TYPE)
172
+ assert_nil(defined? REQUEST_TOKEN_RESPONSE_TYPE)
173
+ assert_nil(defined? REFRESH_TOKEN_GRANT_TYPE)
174
+ end
165
175
  end
@@ -12,8 +12,7 @@ class VisualRecognitionV3Test < Minitest::Test
12
12
  service = IBMWatson::VisualRecognitionV3.new(
13
13
  version: "2018-03-19"
14
14
  )
15
- service._iam_access_token(iam_access_token: "bogus_access_token")
16
- service._iam_access_token(iam_access_token: "bogus_access_token")
15
+ service.iam_access_token(iam_access_token: "bogus_access_token")
17
16
  response = {
18
17
  "classifier_id" => "bogusnumber",
19
18
  "name" => "Dog Breeds",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ibm_watson
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Nussbaum
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-05 00:00:00.000000000 Z
11
+ date: 2018-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby