nexmo 5.2.0 → 5.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a75b2e071168d3e90be330542e75ef9ec3169f45
4
- data.tar.gz: ee5a64fa8f7249c8d07664fd8edec0165e722c8b
2
+ SHA256:
3
+ metadata.gz: 9af851979d214537f3ff6b20fa11f051b848d05b0a5d8fee7a7691f6b3e708d8
4
+ data.tar.gz: cdf846e2d27f25daf2e911107c4b4e5e0f351a2d561b3c8522798a0a716f96e8
5
5
  SHA512:
6
- metadata.gz: ddf564d5563ef4f9f29603c2932ed50bc336efdc4526fdf169ba4c2dcf4b569d5a7a27df77ce0064b6e4b5d6c45266d6eac815e770aba8f200b3794cc21b4753
7
- data.tar.gz: 72cbc7f778f491e88fd1991afb66932fb40efd4eddb1215ddcfcf3fe48c677a9dba5871bb89ce0681c52e6340308c822cca5cad3bb219dd22edf33017c90dc17
6
+ metadata.gz: 546a5945d546ab3382ef76f3c91543aaec2fb26f98ac361ce58be747b47ec8b8c83f3ad4ed20722ba50fa85a70bcaf05f25545437735b9830711e59f430ae812
7
+ data.tar.gz: 83fcd3552be7a52eebf7a9fbbb034b74cde86fa9a112d53325b43784311140ab25acebeae3029734c4e71ddd97dbde69ad8a0ca645eb6985434468776a90d1d1
data/README.md CHANGED
@@ -24,7 +24,7 @@ need a Nexmo account. Sign up [for free at nexmo.com][signup].
24
24
 
25
25
  ## Requirements
26
26
 
27
- Nexmo Ruby supports CRuby 2.0.0+ and JRuby 9k.
27
+ Nexmo Ruby supports CRuby 2.1.0+ and JRuby 9k.
28
28
 
29
29
 
30
30
  ## Installation
@@ -144,7 +144,7 @@ Docs: [https://developer.nexmo.com/api/voice#modify-an-existing-call](https://de
144
144
  ```ruby
145
145
  stream_url = 'https://nexmo-community.github.io/ncco-examples/assets/voice_api_audio_streaming.mp3'
146
146
 
147
- response = client.stream.start(uuid, stream_url: stream_url)
147
+ response = client.calls.stream.start(uuid, stream_url: [stream_url])
148
148
  ```
149
149
 
150
150
  Docs: [https://developer.nexmo.com/api/voice#stream-an-audio-file-to-an-active-call](https://developer.nexmo.com/api/voice?utm_source=DEV_REL&utm_medium=github&utm_campaign=ruby-client-library#stream-an-audio-file-to-an-active-call)
@@ -176,7 +176,7 @@ Docs: [https://developer.nexmo.com/api/voice#stop-sending-a-synthesized-speech-m
176
176
  ### Send DTMF tones to a call
177
177
 
178
178
  ```ruby
179
- response = client.dtmf.send(uuid, digits: '1234')
179
+ response = client.calls.dtmf.send(uuid, digits: '1234')
180
180
  ```
181
181
 
182
182
  Docs: [https://developer.nexmo.com/api/voice#send-dual-tone-multi-frequency-dtmf-tones-to-an-active-call](https://developer.nexmo.com/api/voice?utm_source=DEV_REL&utm_medium=github&utm_campaign=ruby-client-library#send-dual-tone-multi-frequency-dtmf-tones-to-an-active-call)
@@ -391,7 +391,7 @@ To disable logging set the logger to `nil`.
391
391
  By default the library generates a short lived JWT per request.
392
392
 
393
393
  To generate a long lived JWT for multiple requests or to specify JWT claims
394
- directly call `Nexmo::JWT.generate` to generate a token, and set the auth_token
394
+ directly call `Nexmo::JWT.generate` to generate a token, and set the token
395
395
  attribute on the client object. For example:
396
396
 
397
397
  ```ruby
@@ -404,9 +404,7 @@ claims = {
404
404
 
405
405
  private_key = File.read('path/to/private.key')
406
406
 
407
- auth_token = Nexmo::JWT.generate(claims, private_key)
408
-
409
- client.auth_token = auth_token
407
+ client.token = Nexmo::JWT.generate(claims, private_key)
410
408
  ````
411
409
 
412
410
 
@@ -1,5 +1,7 @@
1
1
  require 'nexmo/version'
2
2
  require 'nexmo/params'
3
+ require 'nexmo/form_data'
4
+ require 'nexmo/json'
3
5
  require 'nexmo/jwt'
4
6
  require 'nexmo/signature'
5
7
  require 'nexmo/user_agent'
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Nexmo
4
4
  class Account < Namespace
5
+ self.host = 'rest.nexmo.com'
6
+
5
7
  def balance
6
8
  request('/account/get-balance')
7
9
  end
@@ -13,11 +15,5 @@ module Nexmo
13
15
  def topup(params)
14
16
  request('/account/top-up', params: params, type: Post)
15
17
  end
16
-
17
- private
18
-
19
- def host
20
- 'rest.nexmo.com'
21
- end
22
18
  end
23
19
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Nexmo
4
4
  class Alerts < Namespace
5
+ self.host = 'rest.nexmo.com'
6
+
5
7
  def list
6
8
  request('/sc/us/alert/opt-in/query/json')
7
9
  end
@@ -15,11 +17,5 @@ module Nexmo
15
17
  def send(params)
16
18
  request('/sc/us/alert/json', params: params, type: Post)
17
19
  end
18
-
19
- private
20
-
21
- def host
22
- 'rest.nexmo.com'
23
- end
24
20
  end
25
21
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Nexmo
4
4
  class Applications < Namespace
5
+ self.request_body = JSON
6
+
5
7
  def create(params)
6
8
  request('/v1/applications', params: params, type: Post)
7
9
  end
@@ -21,11 +23,5 @@ module Nexmo
21
23
  def delete(id)
22
24
  request('/v1/applications/' + id, type: Delete)
23
25
  end
24
-
25
- private
26
-
27
- def json_body?
28
- true
29
- end
30
26
  end
31
27
  end
@@ -5,7 +5,7 @@ module Nexmo
5
5
  def update(object)
6
6
  return unless object.is_a?(Net::HTTPRequest)
7
7
 
8
- object['Authorization'] = @client.authorization
8
+ object['Authorization'] = 'Bearer ' + @client.token
9
9
  end
10
10
  end
11
11
  end
@@ -2,18 +2,12 @@
2
2
 
3
3
  module Nexmo
4
4
  class CallDTMF < Namespace
5
- def send(id, params)
6
- request('/v1/calls/' + id + '/dtmf', params: params, type: Put)
7
- end
5
+ self.authentication = BearerToken
8
6
 
9
- private
7
+ self.request_body = JSON
10
8
 
11
- def authentication
12
- @authentication ||= BearerToken.new(@client)
13
- end
14
-
15
- def json_body?
16
- true
9
+ def send(id, params)
10
+ request('/v1/calls/' + id + '/dtmf', params: params, type: Put)
17
11
  end
18
12
  end
19
13
  end
@@ -2,6 +2,10 @@
2
2
 
3
3
  module Nexmo
4
4
  class CallStream < Namespace
5
+ self.authentication = BearerToken
6
+
7
+ self.request_body = JSON
8
+
5
9
  def start(id, params)
6
10
  request('/v1/calls/' + id + '/stream', params: params, type: Put)
7
11
  end
@@ -9,15 +13,5 @@ module Nexmo
9
13
  def stop(id)
10
14
  request('/v1/calls/' + id + '/stream', type: Delete)
11
15
  end
12
-
13
- private
14
-
15
- def authentication
16
- @authentication ||= BearerToken.new(@client)
17
- end
18
-
19
- def json_body?
20
- true
21
- end
22
16
  end
23
17
  end
@@ -2,6 +2,10 @@
2
2
 
3
3
  module Nexmo
4
4
  class CallTalk < Namespace
5
+ self.authentication = BearerToken
6
+
7
+ self.request_body = JSON
8
+
5
9
  def start(id, params)
6
10
  request('/v1/calls/' + id + '/talk', params: params, type: Put)
7
11
  end
@@ -9,15 +13,5 @@ module Nexmo
9
13
  def stop(id)
10
14
  request('/v1/calls/' + id + '/talk', type: Delete)
11
15
  end
12
-
13
- private
14
-
15
- def authentication
16
- @authentication ||= BearerToken.new(@client)
17
- end
18
-
19
- def json_body?
20
- true
21
- end
22
16
  end
23
17
  end
@@ -2,6 +2,10 @@
2
2
 
3
3
  module Nexmo
4
4
  class Calls < Namespace
5
+ self.authentication = BearerToken
6
+
7
+ self.request_body = JSON
8
+
5
9
  def create(params)
6
10
  request('/v1/calls', params: params, type: Post)
7
11
  end
@@ -38,12 +42,7 @@ module Nexmo
38
42
  update(id, action: 'unearmuff')
39
43
  end
40
44
 
41
- def transfer(id, destination: nil)
42
- # Ruby 2.0.0 does not support the syntax for required keyword arguments
43
- # that was introduced in Ruby 2.1. The following line and the nil default
44
- # can be removed when dropping support for Ruby 2.0.0.
45
- raise ArgumentError, 'missing keyword: destination' if destination.nil?
46
-
45
+ def transfer(id, destination:)
47
46
  update(id, action: 'transfer', destination: destination)
48
47
  end
49
48
 
@@ -58,15 +57,5 @@ module Nexmo
58
57
  def dtmf
59
58
  @dtmf ||= CallDTMF.new(@client)
60
59
  end
61
-
62
- private
63
-
64
- def authentication
65
- @authentication ||= BearerToken.new(@client)
66
- end
67
-
68
- def json_body?
69
- true
70
- end
71
60
  end
72
61
  end
@@ -7,8 +7,8 @@ module Nexmo
7
7
  attr_writer :signature_secret
8
8
  attr_writer :application_id
9
9
  attr_writer :private_key
10
+ attr_writer :token
10
11
  attr_accessor :user_agent
11
- attr_accessor :auth_token
12
12
 
13
13
  def initialize(options = {})
14
14
  @api_key = options[:api_key] || ENV['NEXMO_API_KEY']
@@ -21,6 +21,8 @@ module Nexmo
21
21
 
22
22
  @private_key = options[:private_key]
23
23
 
24
+ @token = nil
25
+
24
26
  @user_agent = UserAgent.string(options[:app_name], options[:app_version])
25
27
 
26
28
  self.logger = options[:logger] || (defined?(Rails.logger) && Rails.logger)
@@ -34,10 +36,14 @@ module Nexmo
34
36
  @logger = Nexmo::KeyValueLogger.new(logger)
35
37
  end
36
38
 
37
- def authorization
38
- token = auth_token || JWT.generate({application_id: application_id}, private_key)
39
+ def token
40
+ @token || JWT.generate({application_id: application_id}, private_key)
41
+ end
42
+
43
+ def auth_token=(auth_token)
44
+ Kernel.warn "#{self.class}##{__method__} is deprecated (use #token= instead)"
39
45
 
40
- 'Bearer ' + token
46
+ @token = auth_token
41
47
  end
42
48
 
43
49
  def api_key
@@ -2,8 +2,11 @@
2
2
 
3
3
  module Nexmo
4
4
  class Files < Namespace
5
+ self.authentication = BearerToken
6
+
5
7
  def get(id)
6
- request('/v1/files/' + id.split('/').last)
8
+ response = request('/v1/files/' + id.split('/').last)
9
+ response.body
7
10
  end
8
11
 
9
12
  def save(id, filename)
@@ -15,11 +18,5 @@ module Nexmo
15
18
  end
16
19
  end
17
20
  end
18
-
19
- private
20
-
21
- def authentication
22
- @authentication ||= BearerToken.new(@client)
23
- end
24
21
  end
25
22
  end
@@ -0,0 +1,7 @@
1
+ module Nexmo
2
+ module FormData
3
+ def self.update(http_request, params)
4
+ http_request.form_data = params
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ require 'json'
3
+
4
+ module Nexmo
5
+ module JSON
6
+ def self.update(http_request, params)
7
+ http_request['Content-Type'] = 'application/json'
8
+ http_request.body = ::JSON.generate(params)
9
+ end
10
+ end
11
+ end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Nexmo
4
4
  class Messages < Namespace
5
+ self.host = 'rest.nexmo.com'
6
+
5
7
  def get(id)
6
8
  request('/search/message', params: {id: id})
7
9
  end
@@ -13,11 +15,5 @@ module Nexmo
13
15
  def rejections(params)
14
16
  request('/search/rejections', params: params)
15
17
  end
16
-
17
- private
18
-
19
- def host
20
- 'rest.nexmo.com'
21
- end
22
18
  end
23
19
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'net/http'
2
3
  require 'json'
3
4
 
@@ -6,38 +7,53 @@ module Nexmo
6
7
  def initialize(client)
7
8
  @client = client
8
9
 
9
- @http = Net::HTTP.new(host, Net::HTTP.https_default_port)
10
+ @host = self.class.host
11
+
12
+ @http = Net::HTTP.new(@host, Net::HTTP.https_default_port)
10
13
  @http.use_ssl = true
11
14
  end
12
15
 
13
- private
16
+ def self.host
17
+ @host ||= 'api.nexmo.com'
18
+ end
14
19
 
15
- Get = Net::HTTP::Get
16
- Put = Net::HTTP::Put
17
- Post = Net::HTTP::Post
18
- Delete = Net::HTTP::Delete
20
+ def self.host=(host)
21
+ @host = host
22
+ end
23
+
24
+ def self.authentication
25
+ @authentication ||= KeySecretParams
26
+ end
19
27
 
20
- def host
21
- 'api.nexmo.com'
28
+ def self.authentication=(authentication)
29
+ @authentication = authentication
22
30
  end
23
31
 
24
- def authentication
25
- @authentication ||= KeySecretParams.new(@client)
32
+ def self.request_body
33
+ @request_body ||= FormData
26
34
  end
27
35
 
28
- def json_body?
29
- false
36
+ def self.request_body=(request_body)
37
+ @request_body = request_body
30
38
  end
31
39
 
40
+ private
41
+
42
+ Get = Net::HTTP::Get
43
+ Put = Net::HTTP::Put
44
+ Post = Net::HTTP::Post
45
+ Delete = Net::HTTP::Delete
46
+
32
47
  def logger
33
48
  @client.logger
34
49
  end
35
50
 
36
51
  def request(path, params: nil, type: Get, &block)
37
- uri = URI('https://' + host + path)
52
+ uri = URI('https://' + @host + path)
38
53
 
39
54
  params ||= {}
40
55
 
56
+ authentication = self.class.authentication.new(@client)
41
57
  authentication.update(params)
42
58
 
43
59
  unless type::REQUEST_HAS_BODY || params.empty?
@@ -52,56 +68,31 @@ module Nexmo
52
68
 
53
69
  authentication.update(message)
54
70
 
55
- encode_body(params, message) if type::REQUEST_HAS_BODY
71
+ self.class.request_body.update(message, params) if type::REQUEST_HAS_BODY
56
72
 
57
73
  logger.info('Nexmo API request', method: message.method, path: uri.path)
58
74
 
59
- response = @http.request(message)
75
+ response = @http.request(message, &block)
60
76
 
61
- parse(response, &block)
62
- end
77
+ log_response_info(response)
63
78
 
64
- def encode_body(params, message)
65
- if json_body?
66
- message['Content-Type'] = 'application/json'
67
- message.body = JSON.generate(params)
68
- else
69
- message.form_data = params
70
- end
71
- end
79
+ return if block
72
80
 
73
- def parse(response, &block)
74
- logger.info('Nexmo API response',
75
- host: host,
76
- status: response.code,
77
- type: response.content_type,
78
- length: response.content_length,
79
- trace_id: response['x-nexmo-trace-id'])
81
+ logger.debug(response.body)
80
82
 
83
+ parse(response)
84
+ end
85
+
86
+ def parse(response)
81
87
  case response
82
88
  when Net::HTTPNoContent
83
89
  :no_content
84
90
  when Net::HTTPSuccess
85
- parse_success(response, &block)
86
- else
87
- handle_error(response)
88
- end
89
- end
90
-
91
- def parse_success(response)
92
- if response['Content-Type'].split(';').first == 'application/json'
93
- JSON.parse(response.body, object_class: Nexmo::Entity)
94
- elsif block_given?
95
- yield response
96
- else
97
- response.body
98
- end
99
- end
100
-
101
- def handle_error(response)
102
- logger.debug(response.body)
103
-
104
- case response
91
+ if response['Content-Type'].split(';').first == 'application/json'
92
+ ::JSON.parse(response.body, object_class: Nexmo::Entity)
93
+ else
94
+ response
95
+ end
105
96
  when Net::HTTPUnauthorized
106
97
  raise AuthenticationError
107
98
  when Net::HTTPClientError
@@ -112,5 +103,14 @@ module Nexmo
112
103
  raise Error
113
104
  end
114
105
  end
106
+
107
+ def log_response_info(response)
108
+ logger.info('Nexmo API response',
109
+ host: @host,
110
+ status: response.code,
111
+ type: response.content_type,
112
+ length: response.content_length,
113
+ trace_id: response['x-nexmo-trace-id'])
114
+ end
115
115
  end
116
116
  end
@@ -4,6 +4,8 @@ module Nexmo
4
4
  class Numbers < Namespace
5
5
  include Keys
6
6
 
7
+ self.host = 'rest.nexmo.com'
8
+
7
9
  def list(params = nil)
8
10
  request('/account/numbers', params: params)
9
11
  end
@@ -23,11 +25,5 @@ module Nexmo
23
25
  def update(params)
24
26
  request('/number/update', params: camelcase(params), type: Post)
25
27
  end
26
-
27
- private
28
-
29
- def host
30
- 'rest.nexmo.com'
31
- end
32
28
  end
33
29
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Nexmo
4
4
  class Pricing < Namespace
5
+ self.host = 'rest.nexmo.com'
6
+
5
7
  def initialize(client, type: nil)
6
8
  raise ArgumentError if type.nil?
7
9
 
@@ -23,11 +25,5 @@ module Nexmo
23
25
  def prefix(prefix)
24
26
  request('/account/get-prefix-pricing/outbound/' + @type, params: {prefix: prefix})
25
27
  end
26
-
27
- private
28
-
29
- def host
30
- 'rest.nexmo.com'
31
- end
32
28
  end
33
29
  end
@@ -2,18 +2,12 @@
2
2
 
3
3
  module Nexmo
4
4
  class Redact < Namespace
5
- def transaction(params)
6
- request('/v1/redact/transaction', params: params, type: Post)
7
- end
5
+ self.authentication = KeySecretQuery
8
6
 
9
- private
7
+ self.request_body = JSON
10
8
 
11
- def authentication
12
- @authentication ||= KeySecretQuery.new(@client)
13
- end
14
-
15
- def json_body?
16
- true
9
+ def transaction(params)
10
+ request('/v1/redact/transaction', params: params, type: Post)
17
11
  end
18
12
  end
19
13
  end
@@ -8,7 +8,7 @@ module Nexmo
8
8
 
9
9
  signature = params.delete('sig')
10
10
 
11
- secure_compare(signature, digest(params, secret))
11
+ ::JWT::SecurityUtils.secure_compare(signature, digest(params, secret))
12
12
  end
13
13
 
14
14
  def initialize(client)
@@ -21,16 +21,6 @@ module Nexmo
21
21
 
22
22
  private
23
23
 
24
- if defined?(::JWT::SecurityUtils) # ruby-jwt v2
25
- def self.secure_compare(left, right)
26
- ::JWT::SecurityUtils.secure_compare(left, right)
27
- end
28
- else
29
- def self.secure_compare(left, right)
30
- ::JWT.secure_compare(left, right)
31
- end
32
- end
33
-
34
24
  def self.digest(params, secret)
35
25
  md5 = Digest::MD5.new
36
26
 
@@ -4,14 +4,10 @@ module Nexmo
4
4
  class SMS < Namespace
5
5
  include Keys
6
6
 
7
+ self.host = 'rest.nexmo.com'
8
+
7
9
  def send(params)
8
10
  request('/sms/json', params: hyphenate(params), type: Post)
9
11
  end
10
-
11
- private
12
-
13
- def host
14
- 'rest.nexmo.com'
15
- end
16
12
  end
17
13
  end
@@ -1,3 +1,3 @@
1
1
  module Nexmo
2
- VERSION = '5.2.0'
2
+ VERSION = '5.3.0'
3
3
  end
@@ -11,8 +11,8 @@ Gem::Specification.new do |s|
11
11
  s.description = 'Nexmo Client Library for Ruby'
12
12
  s.summary = 'This is the Ruby client library for Nexmo\'s API. To use it you\'ll need a Nexmo account. Sign up for free at https://www.nexmo.com'
13
13
  s.files = Dir.glob('{lib,spec}/**/*') + %w(LICENSE.txt README.md nexmo.gemspec)
14
- s.required_ruby_version = '>= 2.0.0'
15
- s.add_dependency('jwt')
14
+ s.required_ruby_version = '>= 2.1.0'
15
+ s.add_dependency('jwt', '~> 2')
16
16
  s.add_development_dependency('rake', '~> 12.0')
17
17
  s.add_development_dependency('minitest', '~> 5.0')
18
18
  s.add_development_dependency('webmock', '~> 3.0')
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexmo
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0
4
+ version: 5.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Craft
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-12 00:00:00.000000000 Z
11
+ date: 2018-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jwt
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -95,6 +95,8 @@ files:
95
95
  - lib/nexmo/errors/error.rb
96
96
  - lib/nexmo/errors/server_error.rb
97
97
  - lib/nexmo/files.rb
98
+ - lib/nexmo/form_data.rb
99
+ - lib/nexmo/json.rb
98
100
  - lib/nexmo/jwt.rb
99
101
  - lib/nexmo/key_value_logger.rb
100
102
  - lib/nexmo/keys.rb
@@ -124,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
124
126
  requirements:
125
127
  - - ">="
126
128
  - !ruby/object:Gem::Version
127
- version: 2.0.0
129
+ version: 2.1.0
128
130
  required_rubygems_version: !ruby/object:Gem::Requirement
129
131
  requirements:
130
132
  - - ">="
@@ -132,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
134
  version: '0'
133
135
  requirements: []
134
136
  rubyforge_project:
135
- rubygems_version: 2.6.14.1
137
+ rubygems_version: 2.7.6
136
138
  signing_key:
137
139
  specification_version: 4
138
140
  summary: This is the Ruby client library for Nexmo's API. To use it you'll need a