nexmo 5.9.0 → 6.0.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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +35 -465
  3. data/lib/nexmo.rb +31 -48
  4. data/lib/nexmo/{authentication/abstract.rb → abstract_authentication.rb} +2 -2
  5. data/lib/nexmo/account.rb +4 -2
  6. data/lib/nexmo/alerts.rb +3 -3
  7. data/lib/nexmo/applications.rb +45 -63
  8. data/lib/nexmo/applications/list_response.rb +9 -0
  9. data/lib/nexmo/{errors/authentication_error.rb → authentication_error.rb} +0 -0
  10. data/lib/nexmo/{authentication/basic.rb → basic.rb} +1 -1
  11. data/lib/nexmo/{authentication/bearer_token.rb → bearer_token.rb} +1 -1
  12. data/lib/nexmo/calls.rb +18 -18
  13. data/lib/nexmo/{call_dtmf.rb → calls/dtmf.rb} +2 -2
  14. data/lib/nexmo/calls/list_response.rb +9 -0
  15. data/lib/nexmo/{call_stream.rb → calls/stream.rb} +3 -3
  16. data/lib/nexmo/{call_talk.rb → calls/talk.rb} +3 -3
  17. data/lib/nexmo/client.rb +20 -169
  18. data/lib/nexmo/{errors/client_error.rb → client_error.rb} +0 -0
  19. data/lib/nexmo/config.rb +165 -0
  20. data/lib/nexmo/conversations.rb +44 -13
  21. data/lib/nexmo/{conversation_events.rb → conversations/events.rb} +5 -5
  22. data/lib/nexmo/{conversation_legs.rb → conversations/legs.rb} +3 -3
  23. data/lib/nexmo/{conversation_members.rb → conversations/members.rb} +6 -6
  24. data/lib/nexmo/{conversation_users.rb → conversations/users.rb} +6 -6
  25. data/lib/nexmo/entity.rb +14 -0
  26. data/lib/nexmo/{errors/error.rb → error.rb} +0 -0
  27. data/lib/nexmo/files.rb +1 -2
  28. data/lib/nexmo/gsm7.rb +13 -0
  29. data/lib/nexmo/{authentication/key_secret_params.rb → key_secret_params.rb} +2 -2
  30. data/lib/nexmo/{authentication/key_secret_query.rb → key_secret_query.rb} +2 -2
  31. data/lib/nexmo/keys.rb +4 -22
  32. data/lib/nexmo/namespace.rb +22 -12
  33. data/lib/nexmo/number_insight.rb +6 -4
  34. data/lib/nexmo/number_insight/response.rb +5 -0
  35. data/lib/nexmo/numbers.rb +20 -12
  36. data/lib/nexmo/numbers/list_response.rb +9 -0
  37. data/lib/nexmo/numbers/response.rb +7 -0
  38. data/lib/nexmo/pricing.rb +2 -2
  39. data/lib/nexmo/pricing_types.rb +4 -4
  40. data/lib/nexmo/redact.rb +1 -1
  41. data/lib/nexmo/response.rb +23 -0
  42. data/lib/nexmo/secrets.rb +7 -7
  43. data/lib/nexmo/secrets/list_response.rb +9 -0
  44. data/lib/nexmo/{errors/server_error.rb → server_error.rb} +0 -0
  45. data/lib/nexmo/sms.rb +17 -3
  46. data/lib/nexmo/sms/response.rb +7 -0
  47. data/lib/nexmo/verify.rb +10 -8
  48. data/lib/nexmo/verify/response.rb +5 -0
  49. data/lib/nexmo/version.rb +1 -1
  50. data/nexmo.gemspec +4 -2
  51. metadata +45 -20
  52. data/lib/nexmo/applications_v2.rb +0 -102
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Nexmo
4
4
  class NumberInsight < Namespace
5
+ self.response_class = Response
6
+
5
7
  # Provides basic number insight information about a number.
6
8
  #
7
9
  # @example
@@ -17,7 +19,7 @@ module Nexmo
17
19
  #
18
20
  # @param [Hash] params
19
21
  #
20
- # @return [Entity]
22
+ # @return [Response]
21
23
  #
22
24
  # @see https://developer.nexmo.com/api/number-insight#getNumberInsightBasic
23
25
  #
@@ -45,7 +47,7 @@ module Nexmo
45
47
  #
46
48
  # @param [Hash] params
47
49
  #
48
- # @return [Entity]
50
+ # @return [Response]
49
51
  #
50
52
  # @see https://developer.nexmo.com/api/number-insight#getNumberInsightStandard
51
53
  #
@@ -77,7 +79,7 @@ module Nexmo
77
79
  #
78
80
  # @param [Hash] params
79
81
  #
80
- # @return [Entity]
82
+ # @return [Response]
81
83
  #
82
84
  # @see https://developer.nexmo.com/api/number-insight#getNumberInsightAdvanced
83
85
  #
@@ -112,7 +114,7 @@ module Nexmo
112
114
  #
113
115
  # @param [Hash] params
114
116
  #
115
- # @return [Entity]
117
+ # @return [Response]
116
118
  #
117
119
  # @see https://developer.nexmo.com/api/number-insight#getNumberInsightAsync
118
120
  #
@@ -0,0 +1,5 @@
1
+ class Nexmo::NumberInsight::Response < Nexmo::Response
2
+ def success?
3
+ status.zero?
4
+ end
5
+ end
@@ -10,7 +10,7 @@ module Nexmo
10
10
  #
11
11
  # @example
12
12
  # response = client.numbers.list
13
- # response.numbers.each do |item|
13
+ # response.each do |item|
14
14
  # puts "#{item.msisdn} #{item.country} #{item.type}"
15
15
  # end
16
16
  #
@@ -29,21 +29,29 @@ module Nexmo
29
29
  # - `1` - Search for numbers that contain **:pattern**
30
30
  # - `2` - Search for numbers that end with **:pattern**
31
31
  #
32
+ # @option params [Boolean] :has_application
33
+ # Set this optional field to `true` to restrict your results to numbers associated with an application (any application).
34
+ # Set to `false` to find all numbers not associated with any application.
35
+ # Omit the field to avoid filtering on whether or not the number is assigned to an application.
36
+ #
37
+ # @option params [String] :application_id
38
+ # The application that you want to return the numbers for.
39
+ #
32
40
  # @param [Hash] params
33
41
  #
34
- # @return [Entity]
42
+ # @return [ListResponse]
35
43
  #
36
44
  # @see https://developer.nexmo.com/api/developer/numbers#getOwnedNumbers
37
45
  #
38
46
  def list(params = nil)
39
- request('/account/numbers', params: params)
47
+ request('/account/numbers', params: params, response_class: ListResponse)
40
48
  end
41
49
 
42
50
  # Retrieve inbound numbers that are available for the specified country.
43
51
  #
44
52
  # @example
45
53
  # response = client.numbers.search(country: 'GB')
46
- # response.numbers.each do |item|
54
+ # response.each do |item|
47
55
  # puts "#{item.msisdn} #{item.type} #{item.cost}"
48
56
  # end
49
57
  #
@@ -75,12 +83,12 @@ module Nexmo
75
83
  #
76
84
  # @param [Hash] params
77
85
  #
78
- # @return [Entity]
86
+ # @return [ListResponse]
79
87
  #
80
88
  # @see https://developer.nexmo.com/api/developer/numbers#getAvailableNumbers
81
89
  #
82
90
  def search(params)
83
- request('/number/search', params: params)
91
+ request('/number/search', params: params, response_class: ListResponse)
84
92
  end
85
93
 
86
94
  # Request to purchase a specific inbound number.
@@ -96,12 +104,12 @@ module Nexmo
96
104
  #
97
105
  # @param [Hash] params
98
106
  #
99
- # @return [Entity]
107
+ # @return [Response]
100
108
  #
101
109
  # @see https://developer.nexmo.com/api/developer/numbers#buyANumber
102
110
  #
103
111
  def buy(params)
104
- request('/number/buy', params: params, type: Post)
112
+ request('/number/buy', params: params, type: Post, response_class: Response)
105
113
  end
106
114
 
107
115
  # Cancel your subscription for a specific inbound number.
@@ -117,12 +125,12 @@ module Nexmo
117
125
  #
118
126
  # @param [Hash] params
119
127
  #
120
- # @return [Entity]
128
+ # @return [Response]
121
129
  #
122
130
  # @see https://developer.nexmo.com/api/developer/numbers#cancelANumber
123
131
  #
124
132
  def cancel(params)
125
- request('/number/cancel', params: params, type: Post)
133
+ request('/number/cancel', params: params, type: Post, response_class: Response)
126
134
  end
127
135
 
128
136
  # Change the behaviour of a number that you own.
@@ -173,12 +181,12 @@ module Nexmo
173
181
  #
174
182
  # @param [Hash] params
175
183
  #
176
- # @return [Entity]
184
+ # @return [Response]
177
185
  #
178
186
  # @see https://developer.nexmo.com/api/developer/numbers#updateANumber
179
187
  #
180
188
  def update(params)
181
- request('/number/update', params: camelcase(params), type: Post)
189
+ request('/number/update', params: camelcase(params), type: Post, response_class: Response)
182
190
  end
183
191
  end
184
192
  end
@@ -0,0 +1,9 @@
1
+ class Nexmo::Numbers::ListResponse < Nexmo::Response
2
+ include Enumerable
3
+
4
+ def each
5
+ return enum_for(:each) unless block_given?
6
+
7
+ @entity.numbers.each { |item| yield item }
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Nexmo::Numbers::Response < Nexmo::Response
4
+ def success?
5
+ error_code == '200'
6
+ end
7
+ end
@@ -4,12 +4,12 @@ module Nexmo
4
4
  class Pricing < Namespace
5
5
  self.host = 'rest.nexmo.com'
6
6
 
7
- def initialize(client, type: nil)
7
+ def initialize(config, type: nil)
8
8
  raise ArgumentError if type.nil?
9
9
 
10
10
  @type = type
11
11
 
12
- super client
12
+ super config
13
13
  end
14
14
 
15
15
  attr_reader :type
@@ -2,16 +2,16 @@
2
2
 
3
3
  module Nexmo
4
4
  class PricingTypes
5
- def initialize(client)
6
- @client = client
5
+ def initialize(config)
6
+ @config = config
7
7
  end
8
8
 
9
9
  def sms
10
- @sms ||= Pricing.new(@client, type: 'sms')
10
+ @sms ||= Pricing.new(@config, type: 'sms')
11
11
  end
12
12
 
13
13
  def voice
14
- @voice ||= Pricing.new(@client, type: 'voice')
14
+ @voice ||= Pricing.new(@config, type: 'voice')
15
15
  end
16
16
  end
17
17
  end
@@ -22,7 +22,7 @@ module Nexmo
22
22
  #
23
23
  # @param [Hash] params
24
24
  #
25
- # @return [Entity]
25
+ # @return [Response]
26
26
  #
27
27
  # @see https://developer.nexmo.com/api/redact#redact-message
28
28
  #
@@ -0,0 +1,23 @@
1
+ module Nexmo
2
+ class Response
3
+ def initialize(entity=nil, http_response=nil)
4
+ @entity = entity
5
+
6
+ @http_response = http_response
7
+ end
8
+
9
+ attr_reader :http_response
10
+
11
+ def respond_to_missing?(name, include_private = false)
12
+ return super if @entity.nil?
13
+
14
+ @entity.respond_to?(name)
15
+ end
16
+
17
+ def method_missing(name, *args)
18
+ return super if @entity.nil?
19
+
20
+ @entity.public_send(name, *args)
21
+ end
22
+ end
23
+ end
@@ -21,7 +21,7 @@ module Nexmo
21
21
  #
22
22
  # @param [Hash] params
23
23
  #
24
- # @return [Entity]
24
+ # @return [Response]
25
25
  #
26
26
  # @see https://developer.nexmo.com/api/account#createAPISecret
27
27
  #
@@ -33,16 +33,16 @@ module Nexmo
33
33
  #
34
34
  # @example
35
35
  # response = client.secrets.list
36
- # response._embedded.secrets.each do |item|
36
+ # response.each do |item|
37
37
  # puts "#{item.created_at} #{item.id}"
38
38
  # end
39
39
  #
40
- # @return [Entity]
40
+ # @return [ListResponse]
41
41
  #
42
42
  # @see https://developer.nexmo.com/api/account#retrieveAPISecrets
43
43
  #
44
44
  def list
45
- request('/accounts/' + account_id + '/secrets')
45
+ request('/accounts/' + account_id + '/secrets', response_class: ListResponse)
46
46
  end
47
47
 
48
48
  # Retrieve one API Secret.
@@ -52,7 +52,7 @@ module Nexmo
52
52
  #
53
53
  # @param [String] secret_id
54
54
  #
55
- # @return [Entity]
55
+ # @return [Response]
56
56
  #
57
57
  # @see https://developer.nexmo.com/api/account#retrieveAPISecret
58
58
  #
@@ -67,7 +67,7 @@ module Nexmo
67
67
  #
68
68
  # @param [String] secret_id
69
69
  #
70
- # @return [Entity]
70
+ # @return [Response]
71
71
  #
72
72
  # @see https://developer.nexmo.com/api/account#revokeAPISecret
73
73
  #
@@ -78,7 +78,7 @@ module Nexmo
78
78
  private
79
79
 
80
80
  def account_id
81
- @client.api_key
81
+ @config.api_key
82
82
  end
83
83
  end
84
84
  end
@@ -0,0 +1,9 @@
1
+ class Nexmo::Secrets::ListResponse < Nexmo::Response
2
+ include Enumerable
3
+
4
+ def each
5
+ return enum_for(:each) unless block_given?
6
+
7
+ @entity._embedded.secrets.each { |item| yield item }
8
+ end
9
+ end
@@ -11,7 +11,7 @@ module Nexmo
11
11
  # @example
12
12
  # response = client.sms.send(from: 'Ruby', to: '447700900000', text: 'Hello world')
13
13
  #
14
- # if response.messages.first.status == '0'
14
+ # if response.success?
15
15
  # puts "Sent message id=#{response.messages.first.message_id}"
16
16
  # else
17
17
  # puts "Error: #{response.messages.first.error_text}"
@@ -90,12 +90,26 @@ module Nexmo
90
90
  #
91
91
  # @param [Hash] params
92
92
  #
93
- # @return [Entity]
93
+ # @return [Response]
94
94
  #
95
95
  # @see https://developer.nexmo.com/api/sms#send-an-sms
96
96
  #
97
97
  def send(params)
98
- request('/sms/json', params: hyphenate(params), type: Post)
98
+ if unicode?(params[:text]) && params[:type] != 'unicode'
99
+ message = 'Sending unicode text SMS without setting the type parameter to "unicode". ' \
100
+ 'See https://developer.nexmo.com/messaging/sms for details, ' \
101
+ 'or email support@nexmo.com if you have any questions.'
102
+
103
+ @logger.warn(message)
104
+ end
105
+
106
+ request('/sms/json', params: hyphenate(params), type: Post, response_class: Response)
107
+ end
108
+
109
+ private
110
+
111
+ def unicode?(text)
112
+ !GSM7.encoded?(text)
99
113
  end
100
114
  end
101
115
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Nexmo::SMS::Response < Nexmo::Response
4
+ def success?
5
+ messages.all? { |item| item.status == '0' }
6
+ end
7
+ end
@@ -6,6 +6,8 @@ module Nexmo
6
6
 
7
7
  private :http_request
8
8
 
9
+ self.response_class = Response
10
+
9
11
  # Generate and send a PIN to your user.
10
12
  #
11
13
  # @note You can make a maximum of one Verify request per second.
@@ -13,7 +15,7 @@ module Nexmo
13
15
  # @example
14
16
  # response = client.verify.request(number: '447700900000', brand: 'Acme Inc')
15
17
  #
16
- # if response.status == '0'
18
+ # if response.success?
17
19
  # puts "Started verification request_id=#{response.request_id}"
18
20
  # else
19
21
  # puts "Error: #{response.error_text}"
@@ -58,7 +60,7 @@ module Nexmo
58
60
  #
59
61
  # @param [Hash] params
60
62
  #
61
- # @return [Entity]
63
+ # @return [Response]
62
64
  #
63
65
  # @see https://developer.nexmo.com/api/verify#verifyRequest
64
66
  #
@@ -71,7 +73,7 @@ module Nexmo
71
73
  # @example
72
74
  # response = client.verify.check(request_id: request_id, code: '1234')
73
75
  #
74
- # if response.status == '0'
76
+ # if response.success?
75
77
  # puts "Verification complete, event_id=#{response.event_id}"
76
78
  # else
77
79
  # puts "Error: #{response.error_text}"
@@ -90,7 +92,7 @@ module Nexmo
90
92
  #
91
93
  # @param [Hash] params
92
94
  #
93
- # @return [Entity]
95
+ # @return [Response]
94
96
  #
95
97
  # @see https://developer.nexmo.com/api/verify#verifyCheck
96
98
  #
@@ -112,7 +114,7 @@ module Nexmo
112
114
  #
113
115
  # @param [Hash] params
114
116
  #
115
- # @return [Entity]
117
+ # @return [Response]
116
118
  #
117
119
  # @see https://developer.nexmo.com/api/verify#verifySearch
118
120
  #
@@ -134,7 +136,7 @@ module Nexmo
134
136
  #
135
137
  # @param [Hash] params
136
138
  #
137
- # @return [Entity]
139
+ # @return [Response]
138
140
  #
139
141
  # @see https://developer.nexmo.com/api/verify#verifyControl
140
142
  #
@@ -149,7 +151,7 @@ module Nexmo
149
151
  #
150
152
  # @param [String] id
151
153
  #
152
- # @return [Entity]
154
+ # @return [Response]
153
155
  #
154
156
  # @see https://developer.nexmo.com/api/verify#verifyControl
155
157
  #
@@ -164,7 +166,7 @@ module Nexmo
164
166
  #
165
167
  # @param [String] id
166
168
  #
167
- # @return [Entity]
169
+ # @return [Response]
168
170
  #
169
171
  # @see https://developer.nexmo.com/api/verify#verifyControl
170
172
  #
@@ -0,0 +1,5 @@
1
+ class Nexmo::Verify::Response < Nexmo::Response
2
+ def success?
3
+ respond_to?(:status) && !respond_to?(:error_text)
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Nexmo
2
- VERSION = '5.9.0'
2
+ VERSION = '6.0.0'
3
3
  end
@@ -11,8 +11,9 @@ 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/**/*.rb') + %w(LICENSE.txt README.md nexmo.gemspec)
14
- s.required_ruby_version = '>= 2.1.0'
14
+ s.required_ruby_version = '>= 2.5.0'
15
15
  s.add_dependency('jwt', '~> 2')
16
+ s.add_dependency('zeitwerk', '~> 2')
16
17
  s.add_development_dependency('rake', '~> 12.0')
17
18
  s.add_development_dependency('yard', '~> 0.9')
18
19
  s.add_development_dependency('minitest', '~> 5.0')
@@ -24,6 +25,7 @@ Gem::Specification.new do |s|
24
25
  'homepage' => 'https://github.com/Nexmo/nexmo-ruby',
25
26
  'source_code_uri' => 'https://github.com/Nexmo/nexmo-ruby',
26
27
  'bug_tracker_uri' => 'https://github.com/Nexmo/nexmo-ruby/issues',
27
- 'changelog_uri' => 'https://github.com/Nexmo/nexmo-ruby/blob/master/CHANGES.md'
28
+ 'changelog_uri' => 'https://github.com/Nexmo/nexmo-ruby/blob/master/CHANGES.md',
29
+ 'documentation_uri' => 'https://www.rubydoc.info/github/nexmo/nexmo-ruby'
28
30
  }
29
31
  end