ibm_watson 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IBMWatson
4
- VERSION = "0.10.0"
4
+ VERSION = "0.11.0"
5
5
  end
@@ -86,12 +86,7 @@ module IBMWatson
86
86
  # assumes UTF-8 encoding if it encounters non-ASCII characters.
87
87
  #
88
88
  # You can also include an image with the **url** parameter.
89
- # @param accept_language [String] The language of the output class names. The full set of languages is supported for
90
- # the built-in classifier IDs: `default`, `food`, and `explicit`. The class names of
91
- # custom classifiers are not translated.
92
- #
93
- # The response might not be in the specified language when the requested language is
94
- # not supported or when there is no translation for the class name.
89
+ # @param accept_language [String] The desired language of parts of the response. See the response for details.
95
90
  # @param url [String] The URL of an image to analyze. Must be in .jpg, or .png format. The minimum
96
91
  # recommended pixel density is 32X32 pixels per inch, and the maximum image size is
97
92
  # 10 MB.
@@ -167,13 +162,13 @@ module IBMWatson
167
162
  #########################
168
163
 
169
164
  ##
170
- # @!method detect_faces(images_file: nil, url: nil, images_file_content_type: nil, images_filename: nil)
165
+ # @!method detect_faces(images_file: nil, url: nil, images_file_content_type: nil, images_filename: nil, accept_language: nil)
171
166
  # Detect faces in images.
172
167
  # **Important:** On April 2, 2018, the identity information in the response to calls
173
168
  # to the Face model was removed. The identity information refers to the `name` of
174
169
  # the person, `score`, and `type_hierarchy` knowledge graph. For details about the
175
170
  # enhanced Face model, see the [Release
176
- # notes](https://console.bluemix.net/docs/services/visual-recognition/release-notes.html#2april2018).
171
+ # notes](https://cloud.ibm.com/docs/services/visual-recognition/release-notes.html#2april2018).
177
172
  #
178
173
  # Analyze and get data about faces in images. Responses can include estimated age
179
174
  # and gender. This feature uses a built-in model, so no training is necessary. The
@@ -196,9 +191,11 @@ module IBMWatson
196
191
  # You can also include images with the **images_file** parameter.
197
192
  # @param images_file_content_type [String] The content type of images_file.
198
193
  # @param images_filename [String] The filename for images_file.
194
+ # @param accept_language [String] The desired language of parts of the response. See the response for details.
199
195
  # @return [DetailedResponse] A `DetailedResponse` object representing the response.
200
- def detect_faces(images_file: nil, url: nil, images_file_content_type: nil, images_filename: nil)
196
+ def detect_faces(images_file: nil, url: nil, images_file_content_type: nil, images_filename: nil, accept_language: nil)
201
197
  headers = {
198
+ "Accept-Language" => accept_language
202
199
  }
203
200
 
204
201
  params = {
@@ -375,7 +372,7 @@ module IBMWatson
375
372
  # Update a custom classifier by adding new positive or negative classes (examples)
376
373
  # or by adding new images to existing classes. You must supply at least one set of
377
374
  # positive or negative examples. For details, see [Updating custom
378
- # classifiers](https://console.bluemix.net/docs/services/visual-recognition/customizing.html#updating-custom-classifiers).
375
+ # classifiers](https://cloud.ibm.com/docs/services/visual-recognition/customizing.html#updating-custom-classifiers).
379
376
  #
380
377
  # Encode all names in UTF-8 if they contain non-ASCII characters (.zip and image
381
378
  # file names, and classifier and class names). The service assumes UTF-8 encoding if
@@ -524,7 +521,7 @@ module IBMWatson
524
521
  # You associate a customer ID with data by passing the `X-Watson-Metadata` header
525
522
  # with a request that passes data. For more information about personal data and
526
523
  # customer IDs, see [Information
527
- # security](https://console.bluemix.net/docs/services/visual-recognition/information-security.html).
524
+ # security](https://cloud.ibm.com/docs/services/visual-recognition/information-security.html).
528
525
  # @param customer_id [String] The customer ID for which all data is to be deleted.
529
526
  # @return [nil]
530
527
  def delete_user_data(customer_id:)
@@ -36,9 +36,11 @@ class WatsonService
36
36
  @url = vars[:url]
37
37
  @username = nil
38
38
  @password = nil
39
+ @iam_apikey = nil
39
40
  @token_manager = nil
40
41
  @temp_headers = nil
41
42
  @icp_prefix = vars[:password]&.start_with?("icp-") ? true : false
43
+ @disable_ssl = false
42
44
 
43
45
  user_agent_string = "watson-apis-ruby-sdk-" + IBMWatson::VERSION
44
46
  user_agent_string += " #{RbConfig::CONFIG["host"]}"
@@ -69,6 +71,10 @@ class WatsonService
69
71
  @password = vars[:password]
70
72
  end
71
73
  end
74
+ raise ArgumentError.new('The username shouldn\'t start or end with curly brackets or quotes. Be sure to remove any {} and \" characters surrounding your username') if check_bad_first_or_last_char(@username)
75
+ raise ArgumentError.new('The password shouldn\'t start or end with curly brackets or quotes. Be sure to remove any {} and \" characters surrounding your password') if check_bad_first_or_last_char(@password)
76
+ raise ArgumentError.new('The url shouldn\'t start or end with curly brackets or quotes. Be sure to remove any {} and \" characters surrounding your url') if check_bad_first_or_last_char(@url)
77
+ raise ArgumentError.new('The apikey shouldn\'t start or end with curly brackets or quotes. Be sure to remove any {} and \" characters surrounding your apikey') if check_bad_first_or_last_char(@iam_apikey)
72
78
 
73
79
  @conn = HTTP::Client.new(
74
80
  headers: headers
@@ -165,7 +171,7 @@ class WatsonService
165
171
  self
166
172
  end
167
173
 
168
- # @!method configure_http_client(proxy: {}, timeout: {})
174
+ # @!method configure_http_client(proxy: {}, timeout: {}, disable_ssl: false)
169
175
  # Sets the http client config, currently works with timeout and proxies
170
176
  # @param proxy [Hash] The hash of proxy configurations
171
177
  # @option proxy address [String] The address of the proxy
@@ -176,17 +182,28 @@ class WatsonService
176
182
  # @param timeout [Hash] The hash for configuring timeouts. `per_operation` has priority over `global`
177
183
  # @option timeout per_operation [Hash] Timeouts per operation. Requires `read`, `write`, `connect`
178
184
  # @option timeout global [Integer] Upper bound on total request time
179
- def configure_http_client(proxy: {}, timeout: {})
185
+ # @param disable_ssl [Boolean] Disable the SSL verification (Note that this has serious security implications - only do this if you really mean to!)
186
+ def configure_http_client(proxy: {}, timeout: {}, disable_ssl: false)
180
187
  raise TypeError("proxy parameter must be a Hash") unless proxy.empty? || proxy.instance_of?(Hash)
181
188
 
182
189
  raise TypeError("timeout parameter must be a Hash") unless timeout.empty? || timeout.instance_of?(Hash)
183
190
 
191
+ @disable_ssl = disable_ssl
192
+ if disable_ssl
193
+ ssl_context = OpenSSL::SSL::SSLContext.new
194
+ ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
195
+ @conn.default_options = { ssl_context: ssl_context }
196
+ end
184
197
  add_proxy(proxy) unless proxy.empty? || !proxy.dig(:address).is_a?(String) || !proxy.dig(:port).is_a?(Integer)
185
198
  add_timeout(timeout) unless timeout.empty? || (!timeout.key?(:per_operation) && !timeout.key?(:global))
186
199
  end
187
200
 
188
201
  private
189
202
 
203
+ def check_bad_first_or_last_char(str)
204
+ return str.start_with?("{", "\"") || str.end_with?("}", "\"") unless str.nil?
205
+ end
206
+
190
207
  def set_token_manager(iam_apikey: nil, iam_access_token: nil, iam_url: nil)
191
208
  @iam_apikey = iam_apikey
192
209
  @iam_access_token = iam_access_token
@@ -198,7 +198,6 @@ if !ENV["DISCOVERY_USERNAME"].nil? && !ENV["DISCOVERY_PASSWORD"].nil?
198
198
  filter: "extracted_metadata.sha1::9181d244*",
199
199
  return_fields: "extracted_metadata.sha1"
200
200
  ).result
201
- puts query_results
202
201
  refute(query_results.nil?)
203
202
  end
204
203
 
@@ -208,6 +207,33 @@ if !ENV["DISCOVERY_USERNAME"].nil? && !ENV["DISCOVERY_PASSWORD"].nil?
208
207
  ).result
209
208
  refute(credentials.nil?)
210
209
  end
210
+
211
+ def test_list_gateways
212
+ response = @service.list_gateways(
213
+ environment_id: @environment_id
214
+ ).result
215
+ refute(response.nil?)
216
+ end
217
+
218
+ def test_create_get_delete_gateways
219
+ gateway = @service.create_gateway(
220
+ environment_id: @environment_id,
221
+ name: "test"
222
+ ).result
223
+ refute(gateway.nil?)
224
+
225
+ response = @service.get_gateway(
226
+ environment_id: @environment_id,
227
+ gateway_id: gateway["gateway_id"]
228
+ ).result
229
+ refute(response.nil?)
230
+
231
+ response = @service.delete_gateway(
232
+ environment_id: @environment_id,
233
+ gateway_id: gateway["gateway_id"]
234
+ ).result
235
+ refute(response.nil?)
236
+ end
211
237
  end
212
238
  else
213
239
  class DiscoveryV1Test < Minitest::Test
@@ -112,6 +112,7 @@ if !ENV["SPEECH_TO_TEXT_USERNAME"].nil? && !ENV["SPEECH_TO_TEXT_PASSWORD"].nil?
112
112
  end
113
113
 
114
114
  def test_recognitions
115
+ skip "Skip because of timeouts"
115
116
  output = @service.check_jobs.result
116
117
  refute_nil(output)
117
118
  end
@@ -141,4 +141,14 @@ class HTTPConfigTest < Minitest::Test
141
141
  timeout = service.conn.default_options.timeout_options
142
142
  assert_equal(expected_timeouts, timeout)
143
143
  end
144
+
145
+ def test_disable_ssl
146
+ service = IBMWatson::NaturalLanguageUnderstandingV1.new(
147
+ version: "2018-03-16",
148
+ username: "username",
149
+ password: "password"
150
+ )
151
+ service.configure_http_client(disable_ssl: true)
152
+ refute_nil(service.conn.default_options.ssl_context)
153
+ end
144
154
  end
@@ -1368,4 +1368,128 @@ class DiscoveryV1Test < Minitest::Test
1368
1368
  )
1369
1369
  assert_equal({ "updated" => "true" }, service_response.result)
1370
1370
  end
1371
+
1372
+ def test_create_stopword_list
1373
+ service = IBMWatson::DiscoveryV1.new(
1374
+ username: "username",
1375
+ password: "password",
1376
+ version: "2018-03-05"
1377
+ )
1378
+ stub_request(:post, "https://gateway.watsonplatform.net/compare-comply/api/v1/element_classification").with do |req|
1379
+ end
1380
+
1381
+ stub_request(:post, "https://gateway.watsonplatform.net/discovery/api/v1/environments/envid/collections/colid/word_lists/stopwords?version=2018-03-05").with do |req|
1382
+ assert_equal(req.headers["Accept"], "application/json")
1383
+ assert_match(%r{\Amultipart/form-data}, req.headers["Content-Type"])
1384
+ assert_match(/Content-Disposition: form-data/, req.body)
1385
+ end
1386
+ service.create_stopword_list(
1387
+ environment_id: "envid",
1388
+ collection_id: "colid",
1389
+ stopword_file: "file"
1390
+ )
1391
+ end
1392
+
1393
+ def test_delete_stopword_list
1394
+ service = IBMWatson::DiscoveryV1.new(
1395
+ username: "username",
1396
+ password: "password",
1397
+ version: "2018-03-05"
1398
+ )
1399
+ stub_request(:delete, "https://gateway.watsonplatform.net/discovery/api/v1/environments/envid/collections/colid/word_lists/stopwords?version=2018-03-05")
1400
+ .with(
1401
+ headers: {
1402
+ "Accept" => "application/json",
1403
+ "Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
1404
+ "Host" => "gateway.watsonplatform.net"
1405
+ }
1406
+ ).to_return(status: 200, body: { "deleted" => "true" }.to_json, headers: { "Content-Type" => "application/json" })
1407
+ service_response = service.delete_stopword_list(
1408
+ environment_id: "envid",
1409
+ collection_id: "colid"
1410
+ )
1411
+ assert_nil(service_response)
1412
+ end
1413
+
1414
+ def test_list_gateways
1415
+ service = IBMWatson::DiscoveryV1.new(
1416
+ username: "username",
1417
+ password: "password",
1418
+ version: "2018-03-05"
1419
+ )
1420
+ stub_request(:get, "https://gateway.watsonplatform.net/discovery/api/v1/environments/envid/gateways?version=2018-03-05")
1421
+ .with(
1422
+ headers: {
1423
+ "Accept" => "application/json",
1424
+ "Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
1425
+ "Host" => "gateway.watsonplatform.net"
1426
+ }
1427
+ ).to_return(status: 200, body: { "received" => "true" }.to_json, headers: { "Content-Type" => "application/json" })
1428
+ service_response = service.list_gateways(
1429
+ environment_id: "envid"
1430
+ )
1431
+ assert_equal({ "received" => "true" }, service_response.result)
1432
+ end
1433
+
1434
+ def test_create_gateway
1435
+ service = IBMWatson::DiscoveryV1.new(
1436
+ username: "username",
1437
+ password: "password",
1438
+ version: "2018-03-05"
1439
+ )
1440
+ stub_request(:post, "https://gateway.watsonplatform.net/discovery/api/v1/environments/envid/gateways?version=2018-03-05")
1441
+ .with(
1442
+ headers: {
1443
+ "Accept" => "application/json",
1444
+ "Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
1445
+ "Host" => "gateway.watsonplatform.net"
1446
+ }
1447
+ ).to_return(status: 200, body: { "received" => "true" }.to_json, headers: { "Content-Type" => "application/json" })
1448
+ service_response = service.create_gateway(
1449
+ environment_id: "envid"
1450
+ )
1451
+ assert_equal({ "received" => "true" }, service_response.result)
1452
+ end
1453
+
1454
+ def test_get_gateway
1455
+ service = IBMWatson::DiscoveryV1.new(
1456
+ username: "username",
1457
+ password: "password",
1458
+ version: "2018-03-05"
1459
+ )
1460
+ stub_request(:get, "https://gateway.watsonplatform.net/discovery/api/v1/environments/envid/gateways/gatewayid?version=2018-03-05")
1461
+ .with(
1462
+ headers: {
1463
+ "Accept" => "application/json",
1464
+ "Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
1465
+ "Host" => "gateway.watsonplatform.net"
1466
+ }
1467
+ ).to_return(status: 200, body: { "received" => "true" }.to_json, headers: { "Content-Type" => "application/json" })
1468
+ service_response = service.get_gateway(
1469
+ environment_id: "envid",
1470
+ gateway_id: "gatewayid"
1471
+ )
1472
+ assert_equal({ "received" => "true" }, service_response.result)
1473
+ end
1474
+
1475
+ def test_delete_gateway
1476
+ service = IBMWatson::DiscoveryV1.new(
1477
+ username: "username",
1478
+ password: "password",
1479
+ version: "2018-03-05"
1480
+ )
1481
+ stub_request(:delete, "https://gateway.watsonplatform.net/discovery/api/v1/environments/envid/gateways/gatewayid?version=2018-03-05")
1482
+ .with(
1483
+ headers: {
1484
+ "Accept" => "application/json",
1485
+ "Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
1486
+ "Host" => "gateway.watsonplatform.net"
1487
+ }
1488
+ ).to_return(status: 200, body: { "received" => "true" }.to_json, headers: { "Content-Type" => "application/json" })
1489
+ service_response = service.delete_gateway(
1490
+ environment_id: "envid",
1491
+ gateway_id: "gatewayid"
1492
+ )
1493
+ assert_equal({ "received" => "true" }, service_response.result)
1494
+ end
1371
1495
  end
@@ -545,6 +545,87 @@ class SpeechToTextV1Test < Minitest::Test
545
545
  assert_equal({ "get response" => "yep" }, service_response.result)
546
546
  end
547
547
 
548
+ def test_list_grammars
549
+ service = IBMWatson::SpeechToTextV1.new(
550
+ username: "username",
551
+ password: "password"
552
+ )
553
+ stub_request(:get, "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/custid/grammars")
554
+ .with(
555
+ headers: {
556
+ "Accept" => "application/json",
557
+ "Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
558
+ "Host" => "stream.watsonplatform.net"
559
+ }
560
+ ).to_return(status: 200, body: { "get response" => "yep" }.to_json, headers: { "Content-Type" => "application/json" })
561
+ service_response = service.list_grammars(
562
+ customization_id: "custid"
563
+ )
564
+ assert_equal({ "get response" => "yep" }, service_response.result)
565
+ end
566
+
567
+ def test_add_grammar
568
+ service = IBMWatson::SpeechToTextV1.new(
569
+ username: "username",
570
+ password: "password"
571
+ )
572
+ stub_request(:post, "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/custid/grammars/grammar")
573
+ .with(
574
+ headers: {
575
+ "Accept" => "application/json",
576
+ "Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
577
+ "Host" => "stream.watsonplatform.net"
578
+ }
579
+ ).to_return(status: 200, body: { "get response" => "yep" }.to_json, headers: { "Content-Type" => "application/json" })
580
+ response = service.add_grammar(
581
+ customization_id: "custid",
582
+ grammar_name: "grammar",
583
+ grammar_file: "file",
584
+ content_type: "application/srgs"
585
+ )
586
+ assert_nil(response)
587
+ end
588
+
589
+ def test_get_grammar
590
+ service = IBMWatson::SpeechToTextV1.new(
591
+ username: "username",
592
+ password: "password"
593
+ )
594
+ stub_request(:get, "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/custid/grammars/grammar")
595
+ .with(
596
+ headers: {
597
+ "Accept" => "application/json",
598
+ "Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
599
+ "Host" => "stream.watsonplatform.net"
600
+ }
601
+ ).to_return(status: 200, body: { "get response" => "yep" }.to_json, headers: { "Content-Type" => "application/json" })
602
+ response = service.get_grammar(
603
+ customization_id: "custid",
604
+ grammar_name: "grammar"
605
+ )
606
+ assert_equal({ "get response" => "yep" }, response.result)
607
+ end
608
+
609
+ def test_delete_grammar
610
+ service = IBMWatson::SpeechToTextV1.new(
611
+ username: "username",
612
+ password: "password"
613
+ )
614
+ stub_request(:delete, "https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/custid/grammars/grammar")
615
+ .with(
616
+ headers: {
617
+ "Accept" => "application/json",
618
+ "Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
619
+ "Host" => "stream.watsonplatform.net"
620
+ }
621
+ ).to_return(status: 200, body: { "get response" => "yep" }.to_json, headers: { "Content-Type" => "application/json" })
622
+ response = service.delete_grammar(
623
+ customization_id: "custid",
624
+ grammar_name: "grammar"
625
+ )
626
+ assert_nil(response)
627
+ end
628
+
548
629
  def test_custom_audio_resources
549
630
  service = IBMWatson::SpeechToTextV1.new(
550
631
  username: "username",
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require("json")
4
+ require_relative("./../test_helper.rb")
5
+ require("webmock/minitest")
6
+
7
+ WebMock.disable_net_connect!(allow_localhost: true)
8
+
9
+ # Unit tests for the watson_service
10
+ class WatsonServiceTest < Minitest::Test
11
+ def test_wrong_username
12
+ assert_raises do
13
+ IBMWatson::AssistantV2.new(
14
+ username: "\"username",
15
+ password: "password"
16
+ )
17
+ end
18
+ end
19
+
20
+ def test_wrong_apikey
21
+ assert_raises do
22
+ IBMWatson::AssistantV1.new(
23
+ iam_apikey: "{apikey"
24
+ )
25
+ end
26
+ end
27
+
28
+ def test_wrong_url
29
+ assert_raises do
30
+ IBMWatson::AssistantV1.new(
31
+ iam_apikey: "apikey",
32
+ url: "url}"
33
+ )
34
+ end
35
+ end
36
+
37
+ def test_correct_creds
38
+ service = IBMWatson::AssistantV1.new(
39
+ username: "username",
40
+ password: "password"
41
+ )
42
+ refute_nil(service)
43
+ end
44
+ end
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.10.0
4
+ version: 0.11.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-12-07 00:00:00.000000000 Z
11
+ date: 2019-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -196,16 +196,16 @@ dependencies:
196
196
  name: rubocop
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
- - - "~>"
199
+ - - '='
200
200
  - !ruby/object:Gem::Version
201
- version: '0.57'
201
+ version: '0.62'
202
202
  type: :development
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
- - - "~>"
206
+ - - '='
207
207
  - !ruby/object:Gem::Version
208
- version: '0.57'
208
+ version: '0.62'
209
209
  - !ruby/object:Gem::Dependency
210
210
  name: simplecov
211
211
  requirement: !ruby/object:Gem::Requirement
@@ -294,6 +294,7 @@ files:
294
294
  - test/unit/test_tone_analyzer_v3.rb
295
295
  - test/unit/test_vcap_using_personality_insights.rb
296
296
  - test/unit/test_visual_recognition_v3.rb
297
+ - test/unit/test_watson_service.rb
297
298
  homepage: https://www.github.com/watson-developer-cloud
298
299
  licenses:
299
300
  - Apache-2.0
@@ -316,8 +317,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
316
317
  - !ruby/object:Gem::Version
317
318
  version: '0'
318
319
  requirements: []
319
- rubyforge_project:
320
- rubygems_version: 2.7.8
320
+ rubygems_version: 3.0.2
321
321
  signing_key:
322
322
  specification_version: 4
323
323
  summary: Official client library to use the IBM Watson Services