twilio-ruby 5.34.1 → 5.35.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 +4 -4
- data/CHANGES.md +6 -0
- data/README.md +17 -2
- data/lib/twilio-ruby.rb +1 -1
- data/lib/twilio-ruby/rest/client.rb +35 -8
- data/lib/twilio-ruby/util/configuration.rb +9 -1
- data/lib/twilio-ruby/version.rb +1 -1
- data/spec/rest/client_spec.rb +168 -58
- data/spec/util/configuration_spec.rb +12 -0
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a3e996f0e5e03d78e9be169b6254e444bac36f39c70a6c8ff1a0a682b672866
|
4
|
+
data.tar.gz: 3ccf875613f2bcce4316fa3e35ccdfa25bb5eefb0aeb1f424a388f5cf9e9ae23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98f01d3f1f616b93ae64d25bdd6de991dc85c6c5b7a774b059aa60d07b3fe28650b05e0a73e234dbff7f16c4d405af298c7547596c7e19eda03bc618a875ffcd
|
7
|
+
data.tar.gz: 6a4ed10718140c2c528f0b053f2f34167d39d40283fc226b59bb7f0563137e953019ad0fd84d27f731f1994f64a8b1c2b0c3391aeed4b096cec6d1b7b252a68d
|
data/CHANGES.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
twilio-ruby changelog
|
2
2
|
=====================
|
3
3
|
|
4
|
+
[2020-05-20] Version 5.35.0
|
5
|
+
---------------------------
|
6
|
+
**Library - Feature**
|
7
|
+
- [PR #512](https://github.com/twilio/twilio-ruby/pull/512): add regional and edge support. Thanks to [@eshanholtz](https://github.com/eshanholtz)!
|
8
|
+
|
9
|
+
|
4
10
|
[2020-05-13] Version 5.34.1
|
5
11
|
---------------------------
|
6
12
|
**Api**
|
data/README.md
CHANGED
@@ -32,13 +32,13 @@ This library supports the following Ruby implementations:
|
|
32
32
|
To install using [Bundler][bundler] grab the latest stable version:
|
33
33
|
|
34
34
|
```ruby
|
35
|
-
gem 'twilio-ruby', '~> 5.
|
35
|
+
gem 'twilio-ruby', '~> 5.35.0'
|
36
36
|
```
|
37
37
|
|
38
38
|
To manually install `twilio-ruby` via [Rubygems][rubygems] simply gem install:
|
39
39
|
|
40
40
|
```bash
|
41
|
-
gem install twilio-ruby -v 5.
|
41
|
+
gem install twilio-ruby -v 5.35.0
|
42
42
|
```
|
43
43
|
|
44
44
|
To build and install the development branch yourself from the latest source:
|
@@ -64,6 +64,21 @@ auth_token = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'
|
|
64
64
|
@client = Twilio::REST::Client.new account_sid, auth_token
|
65
65
|
```
|
66
66
|
|
67
|
+
### Specify a Region and/or Edge
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
# set up a client to talk to the Twilio REST API over a specific region and edge
|
71
|
+
@client = Twilio::REST::Client.new account_sid, auth_token, nil, 'au1'
|
72
|
+
@client.edge = 'sydney'
|
73
|
+
|
74
|
+
# you may also specify the region and/or edge after client creation
|
75
|
+
@client = Twilio::REST::Client.new account_sid, auth_token
|
76
|
+
@client.region = 'au1'
|
77
|
+
@client.edge = 'sydney'
|
78
|
+
```
|
79
|
+
|
80
|
+
This will result in the `hostname` transforming from `api.twilio.com` to `api.sydney.au1.twilio.com`.
|
81
|
+
|
67
82
|
### Make a Call
|
68
83
|
|
69
84
|
```ruby
|
data/lib/twilio-ruby.rb
CHANGED
@@ -38,7 +38,7 @@ module Twilio
|
|
38
38
|
autoload :JWT, File.join(File.dirname(__FILE__), 'twilio-ruby', 'jwt', 'jwt.rb')
|
39
39
|
autoload :TwiML, File.join(File.dirname(__FILE__), 'twilio-ruby', 'twiml', 'twiml.rb')
|
40
40
|
|
41
|
-
def_delegators :configuration, :account_sid, :auth_token, :http_client
|
41
|
+
def_delegators :configuration, :account_sid, :auth_token, :http_client, :region, :edge
|
42
42
|
|
43
43
|
##
|
44
44
|
# Pre-configure with account SID and auth token so that you don't need to
|
@@ -11,14 +11,17 @@ module Twilio
|
|
11
11
|
##
|
12
12
|
# A client for accessing the Twilio API.
|
13
13
|
class Client
|
14
|
-
|
14
|
+
@@default_region = 'us1'
|
15
|
+
|
16
|
+
attr_accessor :http_client, :username, :password, :account_sid, :auth_token, :region, :edge
|
15
17
|
|
16
18
|
##
|
17
19
|
# Initializes the Twilio Client
|
18
20
|
def initialize(username=nil, password=nil, account_sid=nil, region=nil, http_client=nil)
|
19
21
|
@username = username || Twilio.account_sid
|
20
22
|
@password = password || Twilio.auth_token
|
21
|
-
@region = region
|
23
|
+
@region = region || Twilio.region
|
24
|
+
@edge = Twilio.edge
|
22
25
|
@account_sid = account_sid || @username
|
23
26
|
@auth_token = @password
|
24
27
|
@auth = [@username, @password]
|
@@ -75,12 +78,7 @@ module Twilio
|
|
75
78
|
headers['Accept'] = 'application/json'
|
76
79
|
end
|
77
80
|
|
78
|
-
|
79
|
-
head, tail = uri.split('.', 2)
|
80
|
-
if !tail.start_with?(region)
|
81
|
-
uri = [head, region, tail].join('.')
|
82
|
-
end
|
83
|
-
end
|
81
|
+
uri = build_uri(uri)
|
84
82
|
|
85
83
|
@http_client.request(
|
86
84
|
host,
|
@@ -95,6 +93,35 @@ module Twilio
|
|
95
93
|
)
|
96
94
|
end
|
97
95
|
|
96
|
+
##
|
97
|
+
# Build the final request uri
|
98
|
+
def build_uri(uri)
|
99
|
+
if @region.nil? and @edge.nil?
|
100
|
+
return uri
|
101
|
+
end
|
102
|
+
|
103
|
+
parsed_url = URI(uri)
|
104
|
+
pieces = parsed_url.host.split('.')
|
105
|
+
product = pieces[0]
|
106
|
+
domain = pieces[-2, 2]
|
107
|
+
new_edge = @edge
|
108
|
+
new_region = @region
|
109
|
+
|
110
|
+
if pieces.length == 4
|
111
|
+
new_region ||= pieces[1]
|
112
|
+
elsif pieces.length == 5
|
113
|
+
new_edge ||= pieces[1]
|
114
|
+
new_region ||= pieces[2]
|
115
|
+
end
|
116
|
+
|
117
|
+
if !new_edge.nil? && new_region.nil?
|
118
|
+
new_region = @@default_region
|
119
|
+
end
|
120
|
+
|
121
|
+
parsed_url.host = [product, new_edge, new_region, domain].select {|item| !item.nil?}.join('.')
|
122
|
+
parsed_url.to_s
|
123
|
+
end
|
124
|
+
|
98
125
|
##
|
99
126
|
# Validate the new SSL certificate for the Twilio API
|
100
127
|
def validate_ssl_certificate
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Twilio
|
4
4
|
module Util
|
5
5
|
class Configuration
|
6
|
-
attr_accessor :account_sid, :auth_token, :http_client
|
6
|
+
attr_accessor :account_sid, :auth_token, :http_client, :region, :edge
|
7
7
|
|
8
8
|
def account_sid=(value)
|
9
9
|
@account_sid = value
|
@@ -16,6 +16,14 @@ module Twilio
|
|
16
16
|
def http_client=(value)
|
17
17
|
@http_client = value
|
18
18
|
end
|
19
|
+
|
20
|
+
def region=(value)
|
21
|
+
@region = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def edge=(value)
|
25
|
+
@edge = value
|
26
|
+
end
|
19
27
|
end
|
20
28
|
end
|
21
29
|
end
|
data/lib/twilio-ruby/version.rb
CHANGED
data/spec/rest/client_spec.rb
CHANGED
@@ -49,75 +49,185 @@ describe Twilio::REST::TrunkingClient do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
describe Twilio::REST::Client do
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
context 'configuration' do
|
53
|
+
before do
|
54
|
+
Twilio.configure do |config|
|
55
|
+
config.account_sid = 'someSid'
|
56
|
+
config.auth_token = 'someToken'
|
57
|
+
config.http_client = 'someClient'
|
58
|
+
config.region = 'someRegion'
|
59
|
+
config.edge = 'someEdge'
|
60
|
+
end
|
57
61
|
end
|
58
|
-
end
|
59
62
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
it 'uses the global configuration by default' do
|
64
|
+
@client = Twilio::REST::Client.new
|
65
|
+
expect(@client.account_sid).to eq('someSid')
|
66
|
+
expect(@client.auth_token).to eq('someToken')
|
67
|
+
expect(@client.http_client).to eq('someClient')
|
68
|
+
expect(@client.region).to eq('someRegion')
|
69
|
+
expect(@client.edge).to eq('someEdge')
|
70
|
+
end
|
66
71
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
72
|
+
it 'uses the arguments over global configuration' do
|
73
|
+
@client = Twilio::REST::Client.new('myUser', 'myPassword', nil, 'myRegion', 'myClient')
|
74
|
+
@client.edge = 'myEdge'
|
75
|
+
expect(@client.account_sid).to eq('myUser')
|
76
|
+
expect(@client.auth_token).to eq('myPassword')
|
77
|
+
expect(@client.http_client).to eq('myClient')
|
78
|
+
expect(@client.region).to eq('myRegion')
|
79
|
+
expect(@client.edge).to eq('myEdge')
|
80
|
+
end
|
73
81
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
82
|
+
class MyVersion < Twilio::REST::Version
|
83
|
+
def initialize(domain)
|
84
|
+
super
|
85
|
+
@version = 'v1'
|
86
|
+
end
|
87
|
+
end
|
78
88
|
|
79
|
-
|
80
|
-
|
81
|
-
|
89
|
+
class MyDomain < Twilio::REST::Domain
|
90
|
+
def initialize(client)
|
91
|
+
super
|
92
|
+
@host = 'twilio.com'
|
93
|
+
@base_url = 'https://twilio.com'
|
94
|
+
@port = 443
|
95
|
+
end
|
96
|
+
end
|
82
97
|
end
|
83
98
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
}}'
|
95
|
-
@holodeck.mock Twilio::Response.new(400, @error_message)
|
96
|
-
expect {
|
97
|
-
@version.fetch('GET', 'http://foobar.com')
|
98
|
-
}.to raise_error { |error|
|
99
|
-
expect(error).to be_a(Twilio::REST::RestError)
|
100
|
-
expect(error.status_code).to eq(400)
|
101
|
-
expect(error.code).to eq(20_001)
|
102
|
-
expect(error.details).to eq({ 'foo' => 'bar' })
|
103
|
-
expect(error.error_message).to eq('Bad request')
|
104
|
-
expect(error.more_info).to eq('https://www.twilio.com/docs/errors/20001')
|
105
|
-
}
|
106
|
-
end
|
99
|
+
context 'validation' do
|
100
|
+
before do
|
101
|
+
Twilio.configure do |config|
|
102
|
+
config.account_sid = 'someSid'
|
103
|
+
config.auth_token = 'someToken'
|
104
|
+
config.http_client = 'someClient'
|
105
|
+
config.region = nil
|
106
|
+
config.edge = nil
|
107
|
+
end
|
108
|
+
end
|
107
109
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
110
|
+
it 'successfully validates the working SSL certificate' do
|
111
|
+
@holodeck.mock Twilio::Response.new(200, '')
|
112
|
+
expect { @client.validate_ssl_certificate }.not_to raise_error
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'fails to validate broken SSL certificates' do
|
116
|
+
@holodeck.mock Twilio::Response.new(504, '')
|
117
|
+
expect { @client.validate_ssl_certificate }.to raise_error(Twilio::REST::RestError)
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'translates bad request error params' do
|
121
|
+
@domain = MyDomain.new(@client)
|
122
|
+
@version = MyVersion.new(@domain)
|
123
|
+
@error_message = '{
|
124
|
+
"code": 20001,
|
125
|
+
"message": "Bad request",
|
126
|
+
"more_info": "https://www.twilio.com/docs/errors/20001",
|
127
|
+
"status": 400,
|
128
|
+
"details": {
|
129
|
+
"foo":"bar"
|
130
|
+
}}'
|
131
|
+
@holodeck.mock Twilio::Response.new(400, @error_message)
|
132
|
+
expect {
|
133
|
+
@version.fetch('GET', 'http://foobar.com')
|
134
|
+
}.to raise_error { |error|
|
135
|
+
expect(error).to be_a(Twilio::REST::RestError)
|
136
|
+
expect(error.status_code).to eq(400)
|
137
|
+
expect(error.code).to eq(20_001)
|
138
|
+
expect(error.details).to eq({ 'foo' => 'bar' })
|
139
|
+
expect(error.error_message).to eq('Bad request')
|
140
|
+
expect(error.more_info).to eq('https://www.twilio.com/docs/errors/20001')
|
141
|
+
}
|
112
142
|
end
|
113
143
|
end
|
114
144
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
145
|
+
describe '#build_uri' do
|
146
|
+
before(:all) do
|
147
|
+
Twilio.configure do |config|
|
148
|
+
config.account_sid = 'username'
|
149
|
+
config.auth_token = 'password'
|
150
|
+
config.region = nil
|
151
|
+
config.edge = nil
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'no region or edge in url' do
|
156
|
+
it "doesn't set region or edge" do
|
157
|
+
@client = Twilio::REST::Client.new
|
158
|
+
expect(@client.build_uri('https://api.twilio.com')).to eq('https://api.twilio.com')
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'uses the default region if edge set' do
|
162
|
+
@client = Twilio::REST::Client.new
|
163
|
+
@client.edge = 'edge'
|
164
|
+
expect(@client.build_uri('https://api.twilio.com')).to eq('https://api.edge.us1.twilio.com')
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'sets region' do
|
168
|
+
@client = Twilio::REST::Client.new
|
169
|
+
@client.region = 'region'
|
170
|
+
expect(@client.build_uri('https://api.twilio.com')).to eq('https://api.region.twilio.com')
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'sets region and edge' do
|
174
|
+
@client = Twilio::REST::Client.new
|
175
|
+
@client.region = 'region'
|
176
|
+
@client.edge = 'edge'
|
177
|
+
expect(@client.build_uri('https://api.twilio.com')).to eq('https://api.edge.region.twilio.com')
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context 'region in url' do
|
182
|
+
it 'uses url region' do
|
183
|
+
@client = Twilio::REST::Client.new
|
184
|
+
expect(@client.build_uri('https://api.urlRegion.twilio.com')).to eq('https://api.urlRegion.twilio.com')
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'uses client edge and url region' do
|
188
|
+
@client = Twilio::REST::Client.new
|
189
|
+
@client.edge = 'edge'
|
190
|
+
expect(@client.build_uri('https://api.urlRegion.twilio.com')).to eq('https://api.edge.urlRegion.twilio.com')
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'prefers client region' do
|
194
|
+
@client = Twilio::REST::Client.new
|
195
|
+
@client.region = 'region'
|
196
|
+
expect(@client.build_uri('https://api.urlRegion.twilio.com')).to eq('https://api.region.twilio.com')
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'uses client edge and prefers client region' do
|
200
|
+
@client = Twilio::REST::Client.new
|
201
|
+
@client.region = 'region'
|
202
|
+
@client.edge = 'edge'
|
203
|
+
expect(@client.build_uri('https://api.urlRegion.twilio.com')).to eq('https://api.edge.region.twilio.com')
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
context 'region and edge in url' do
|
208
|
+
it 'uses url region and edge' do
|
209
|
+
@client = Twilio::REST::Client.new
|
210
|
+
expect(@client.build_uri('https://api.urlEdge.urlRegion.twilio.com')).to eq('https://api.urlEdge.urlRegion.twilio.com')
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'prefers client edge' do
|
214
|
+
@client = Twilio::REST::Client.new
|
215
|
+
@client.edge = 'edge'
|
216
|
+
expect(@client.build_uri('https://api.urlEdge.urlRegion.twilio.com')).to eq('https://api.edge.urlRegion.twilio.com')
|
217
|
+
end
|
218
|
+
|
219
|
+
it 'prefers client region' do
|
220
|
+
@client = Twilio::REST::Client.new
|
221
|
+
@client.region = 'region'
|
222
|
+
expect(@client.build_uri('https://api.urlEdge.urlRegion.twilio.com')).to eq('https://api.urlEdge.region.twilio.com')
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'prefers client region and edge' do
|
226
|
+
@client = Twilio::REST::Client.new
|
227
|
+
@client.region = 'region'
|
228
|
+
@client.edge = 'edge'
|
229
|
+
expect(@client.build_uri('https://api.urlEdge.urlRegion.twilio.com')).to eq('https://api.edge.region.twilio.com')
|
230
|
+
end
|
121
231
|
end
|
122
232
|
end
|
123
233
|
end
|
@@ -18,4 +18,16 @@ describe Twilio::Util::Configuration do
|
|
18
18
|
config.http_client = 'someClient'
|
19
19
|
expect(config.http_client).to eq('someClient')
|
20
20
|
end
|
21
|
+
|
22
|
+
it 'should have a region attribute' do
|
23
|
+
config = Twilio::Util::Configuration.new
|
24
|
+
config.region = 'someRegion'
|
25
|
+
expect(config.region).to eq('someRegion')
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should have an edge attribute' do
|
29
|
+
config = Twilio::Util::Configuration.new
|
30
|
+
config.edge = 'someEdge'
|
31
|
+
expect(config.edge).to eq('someEdge')
|
32
|
+
end
|
21
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twilio-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.35.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Twilio API Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jwt
|
@@ -1072,8 +1072,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1072
1072
|
- !ruby/object:Gem::Version
|
1073
1073
|
version: '0'
|
1074
1074
|
requirements: []
|
1075
|
-
|
1076
|
-
rubygems_version: 2.7.10
|
1075
|
+
rubygems_version: 3.0.8
|
1077
1076
|
signing_key:
|
1078
1077
|
specification_version: 4
|
1079
1078
|
summary: The official library for communicating with the Twilio REST API, building
|