nexmo 5.9.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
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