plivo 0.3.19 → 4.0.0.beta.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/.travis.yml +10 -0
- data/AUTHORS.md +4 -0
- data/CHANGELOG.md +19 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +19 -0
- data/README.md +105 -24
- data/Rakefile +7 -0
- data/lib/plivo.rb +9 -815
- data/lib/plivo/base.rb +9 -0
- data/lib/plivo/base/resource.rb +85 -0
- data/lib/plivo/base/resource_interface.rb +93 -0
- data/lib/plivo/base/response.rb +29 -0
- data/lib/plivo/exceptions.rb +50 -0
- data/lib/plivo/resources.rb +14 -0
- data/lib/plivo/resources/accounts.rb +174 -0
- data/lib/plivo/resources/applications.rb +233 -0
- data/lib/plivo/resources/calls.rb +492 -0
- data/lib/plivo/resources/conferences.rb +371 -0
- data/lib/plivo/resources/endpoints.rb +130 -0
- data/lib/plivo/resources/messages.rb +178 -0
- data/lib/plivo/resources/numbers.rb +302 -0
- data/lib/plivo/resources/pricings.rb +43 -0
- data/lib/plivo/resources/recordings.rb +114 -0
- data/lib/plivo/rest_client.rb +199 -0
- data/lib/plivo/utils.rb +107 -0
- data/lib/plivo/version.rb +3 -0
- data/lib/plivo/xml.rb +27 -0
- data/lib/plivo/xml/conference.rb +20 -0
- data/lib/plivo/xml/dial.rb +16 -0
- data/lib/plivo/xml/dtmf.rb +13 -0
- data/lib/plivo/xml/element.rb +83 -0
- data/lib/plivo/xml/get_digits.rb +15 -0
- data/lib/plivo/xml/hangup.rb +12 -0
- data/lib/plivo/xml/message.rb +13 -0
- data/lib/plivo/xml/number.rb +13 -0
- data/lib/plivo/xml/play.rb +13 -0
- data/lib/plivo/xml/plivo_xml.rb +19 -0
- data/lib/plivo/xml/pre_answer.rb +12 -0
- data/lib/plivo/xml/record.rb +17 -0
- data/lib/plivo/xml/redirect.rb +13 -0
- data/lib/plivo/xml/response.rb +21 -0
- data/lib/plivo/xml/speak.rb +17 -0
- data/lib/plivo/xml/user.rb +13 -0
- data/lib/plivo/xml/wait.rb +12 -0
- data/plivo.gemspec +44 -0
- metadata +134 -45
- data/ext/mkrf_conf.rb +0 -9
data/lib/plivo/base.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
module Plivo
|
2
|
+
module Base
|
3
|
+
class Resource
|
4
|
+
attr_reader :id
|
5
|
+
include Plivo::Utils
|
6
|
+
|
7
|
+
def initialize(client, options = nil)
|
8
|
+
configure_client(client)
|
9
|
+
configure_options(options) if options
|
10
|
+
configure_resource_uri
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def configure_client(client)
|
16
|
+
valid_param?(:client, client, RestClient, true)
|
17
|
+
@_client = client
|
18
|
+
end
|
19
|
+
|
20
|
+
def configure_options(options)
|
21
|
+
valid_param?(:options, options, Hash, false)
|
22
|
+
@id = options[:resource_id] if options.key?(:resource_id)
|
23
|
+
parse_and_set(options[:resource_json]) if options.key?(:resource_json)
|
24
|
+
end
|
25
|
+
|
26
|
+
def configure_resource_uri
|
27
|
+
to_join = @id ? [@_client.auth_id, @_name, @id] : [@_client.auth_id, @_name]
|
28
|
+
to_join = ['', 'v1', 'Account'] << to_join
|
29
|
+
|
30
|
+
if @_name == 'Account'
|
31
|
+
@id = @_client.auth_id
|
32
|
+
to_join = ['', 'v1', 'Account', @id]
|
33
|
+
end
|
34
|
+
|
35
|
+
to_join << ''
|
36
|
+
@_resource_uri = to_join.join('/')
|
37
|
+
end
|
38
|
+
|
39
|
+
def parse_and_set(resource_json)
|
40
|
+
return unless resource_json
|
41
|
+
|
42
|
+
valid_param?(:resource_json, resource_json, Hash, true)
|
43
|
+
|
44
|
+
resource_json.each do |k, v|
|
45
|
+
instance_variable_set("@#{k}", v)
|
46
|
+
self.class.send(:attr_reader, k)
|
47
|
+
end
|
48
|
+
|
49
|
+
return unless @_identifier_string && (resource_json.key? @_identifier_string)
|
50
|
+
@id = resource_json[@_identifier_string]
|
51
|
+
end
|
52
|
+
|
53
|
+
def perform_update(params)
|
54
|
+
unless @id
|
55
|
+
raise_invalid_request("Cannot update a #{@_name} resource "\
|
56
|
+
'without an identifier')
|
57
|
+
end
|
58
|
+
|
59
|
+
response_json = @_client.send_request(@_resource_uri, 'POST', params)
|
60
|
+
|
61
|
+
parse_and_set(params)
|
62
|
+
parse_and_set(response_json)
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
def perform_action(action = nil, method = 'GET', params = nil, parse = false)
|
67
|
+
resource_path = action ? @_resource_uri + action + '/' : @_resource_uri
|
68
|
+
response = @_client.send_request(resource_path, method, params)
|
69
|
+
parse ? parse_and_set(response) : self
|
70
|
+
method == 'POST' ? parse_and_set(params) : self
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
def perform_delete
|
75
|
+
unless @id
|
76
|
+
raise_invalid_request("Cannot delete a #{@_name} resource "\
|
77
|
+
'without an identifier')
|
78
|
+
end
|
79
|
+
|
80
|
+
Response.new(@_client.send_request(@_resource_uri, 'DELETE', nil),
|
81
|
+
@_identifier_string)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Plivo
|
2
|
+
module Base
|
3
|
+
class ResourceInterface
|
4
|
+
include Plivo::Utils
|
5
|
+
def initialize(client, resource_list_json = nil)
|
6
|
+
configure_client(client)
|
7
|
+
configure_resource_uri
|
8
|
+
parse_and_set(resource_list_json) if resource_list_json
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def configure_client(client)
|
14
|
+
valid_param?(:client, client, RestClient, true)
|
15
|
+
@_client = client
|
16
|
+
end
|
17
|
+
|
18
|
+
def configure_resource_uri
|
19
|
+
to_join = ['', 'v1', 'Account', @_client.auth_id, @_name, '']
|
20
|
+
to_join = ['', 'v1', 'Account', ''] if @_name == 'Account'
|
21
|
+
|
22
|
+
@_resource_uri = to_join.join('/')
|
23
|
+
end
|
24
|
+
|
25
|
+
def parse_and_set(resource_list_json)
|
26
|
+
return unless resource_list_json
|
27
|
+
|
28
|
+
valid_param?(:resource_list_json, resource_list_json, Hash, true)
|
29
|
+
|
30
|
+
resource_list_json.each do |k, v|
|
31
|
+
if k == 'objects'
|
32
|
+
parse_and_set_list(resource_list_json['objects'])
|
33
|
+
elsif k == 'meta'
|
34
|
+
@_meta = resource_list_json['meta']
|
35
|
+
else
|
36
|
+
instance_variable_set("@#{k}", v)
|
37
|
+
self.class.send(:attr_reader, k)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def perform_get(identifier, params = nil)
|
43
|
+
valid_param?(:identifier, identifier, [String, Symbol], true)
|
44
|
+
response_json = @_client.send_request(@_resource_uri + identifier.to_s + '/', 'GET', params)
|
45
|
+
@_resource_type.new(@_client, resource_json: response_json)
|
46
|
+
end
|
47
|
+
|
48
|
+
def perform_get_without_identifier(params)
|
49
|
+
valid_param?(:params, params, Hash, true)
|
50
|
+
response_json = @_client.send_request(@_resource_uri, 'GET', params)
|
51
|
+
@_resource_type.new(@_client, resource_json: response_json)
|
52
|
+
end
|
53
|
+
|
54
|
+
def perform_create(params)
|
55
|
+
Response.new(
|
56
|
+
@_client.send_request(@_resource_uri, 'POST', params),
|
57
|
+
@_identifier_string
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
def perform_post(params)
|
62
|
+
response_json = @_client.send_request(@_resource_uri, 'POST', params)
|
63
|
+
|
64
|
+
parse_and_set(response_json)
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
def parse_and_set_list(list_json)
|
69
|
+
return unless list_json
|
70
|
+
valid_param?(:list_json, list_json, Array, false)
|
71
|
+
@_resource_list = list_json.map do |resource|
|
72
|
+
@_resource_type.new(@_client, resource_json: resource)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def perform_list(params = nil)
|
77
|
+
response_json = @_client.send_request(@_resource_uri, 'GET', params)
|
78
|
+
parse_and_set(response_json)
|
79
|
+
{
|
80
|
+
api_id: @api_id,
|
81
|
+
meta: @_meta,
|
82
|
+
objects: @_resource_list
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
def perform_list_without_object(params = nil)
|
87
|
+
response_json = @_client.send_request(@_resource_uri, 'GET', params)
|
88
|
+
parse_and_set(response_json)
|
89
|
+
response_json
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Plivo
|
2
|
+
module Base
|
3
|
+
##
|
4
|
+
# A class to provide a blanket response based on what is
|
5
|
+
# being received from Plivo servers.
|
6
|
+
#
|
7
|
+
# This will be used only during POST and DELETE requests.
|
8
|
+
class Response
|
9
|
+
##
|
10
|
+
# Instantiating a new instance requires a response_hash
|
11
|
+
# The id_symbol should contain a Symbol that represents
|
12
|
+
# the identifier of the resource for which this response
|
13
|
+
# is being generated for.
|
14
|
+
|
15
|
+
def initialize(response_hash, id_symbol = nil)
|
16
|
+
return unless response_hash
|
17
|
+
|
18
|
+
response_hash.each do |k, v|
|
19
|
+
instance_variable_set("@#{k}", v)
|
20
|
+
self.class.send(:attr_reader, k)
|
21
|
+
end
|
22
|
+
return unless id_symbol && response_hash.key?(id_symbol)
|
23
|
+
|
24
|
+
self.class.send(:attr_reader, :id)
|
25
|
+
@id = response_hash[id_symbol]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Plivo
|
2
|
+
##
|
3
|
+
# The exceptions module that helps in passing on errors to the user in a better way.
|
4
|
+
module Exceptions
|
5
|
+
##
|
6
|
+
# This is Plivo's base error and will be raised when there is an unknown
|
7
|
+
# error that is not covered by other errors.
|
8
|
+
PlivoRESTError = Class.new(StandardError)
|
9
|
+
|
10
|
+
##
|
11
|
+
# This will be raised when A parameter is missing or is invalid while
|
12
|
+
# accessing resource.
|
13
|
+
ValidationError = Class.new(PlivoRESTError)
|
14
|
+
# 'A parameter is missing or is invalid while accessing resource'
|
15
|
+
|
16
|
+
##
|
17
|
+
# This will be raised when there is an an error authenticating the request.
|
18
|
+
#
|
19
|
+
# It is because there were no authentication credentials found or passed
|
20
|
+
# or the auth credentials that were found or passed were incorrect.
|
21
|
+
AuthenticationError = Class.new(PlivoRESTError)
|
22
|
+
|
23
|
+
##
|
24
|
+
# This will be raised when one or more parameters passed to Plivo servers
|
25
|
+
# is invalid.
|
26
|
+
#
|
27
|
+
# More specific error message will be displayed wherever possible.
|
28
|
+
InvalidRequestError = Class.new(PlivoRESTError)
|
29
|
+
|
30
|
+
##
|
31
|
+
# This will be raised when there is a server error on the Plivo end.
|
32
|
+
#
|
33
|
+
# This is rarely encountered. You might want to catch this error and
|
34
|
+
# retry the request if needed.
|
35
|
+
#
|
36
|
+
# If retrying doesn't help, please contact https://support.plivo.com
|
37
|
+
# immediately.
|
38
|
+
PlivoServerError = Class.new(PlivoRESTError)
|
39
|
+
|
40
|
+
##
|
41
|
+
# This will be raised when there is an XML generation error.
|
42
|
+
#
|
43
|
+
# Usually, the reason why this error is raised will be included.
|
44
|
+
PlivoXMLError = Class.new(PlivoRESTError)
|
45
|
+
|
46
|
+
##
|
47
|
+
# This will be raised when there is an authentication error
|
48
|
+
ResourceNotFoundError = Class.new(PlivoRESTError)
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative 'resources/messages'
|
2
|
+
require_relative 'resources/accounts'
|
3
|
+
require_relative 'resources/applications'
|
4
|
+
require_relative 'resources/recordings'
|
5
|
+
require_relative 'resources/pricings'
|
6
|
+
require_relative 'resources/numbers'
|
7
|
+
require_relative 'resources/conferences'
|
8
|
+
require_relative 'resources/calls'
|
9
|
+
require_relative 'resources/endpoints'
|
10
|
+
|
11
|
+
module Plivo
|
12
|
+
module Resources
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
module Plivo
|
2
|
+
module Resources
|
3
|
+
include Plivo::Utils
|
4
|
+
class Subaccount < Base::Resource
|
5
|
+
def initialize(client, options = nil)
|
6
|
+
@_name = 'Subaccount'
|
7
|
+
@_identifier_string = 'auth_id'
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
def update(name, enabled = false)
|
12
|
+
valid_param?(:name, name, [String, Symbol], true)
|
13
|
+
valid_param?(:enabled, enabled, [TrueClass, FalseClass],
|
14
|
+
true, [true, false])
|
15
|
+
|
16
|
+
params = {
|
17
|
+
name: name,
|
18
|
+
enabled: enabled
|
19
|
+
}
|
20
|
+
perform_update(params)
|
21
|
+
end
|
22
|
+
|
23
|
+
def delete
|
24
|
+
perform_delete
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
{
|
29
|
+
account: @account,
|
30
|
+
api_id: @api_id,
|
31
|
+
auth_id: @auth_id,
|
32
|
+
auth_token: @auth_token,
|
33
|
+
new_auth_token: @new_auth_token,
|
34
|
+
created: @created,
|
35
|
+
enabled: @enabled,
|
36
|
+
modified: @modified,
|
37
|
+
name: @name,
|
38
|
+
resource_uri: @resource_uri
|
39
|
+
}.to_s
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# @!method get
|
44
|
+
# @!method create
|
45
|
+
# @!method list
|
46
|
+
class SubaccountInterface < Base::ResourceInterface
|
47
|
+
def initialize(client, resource_list_json = nil)
|
48
|
+
@_name = 'Subaccount'
|
49
|
+
@_resource_type = Subaccount
|
50
|
+
@_identifier_string = 'auth_id'
|
51
|
+
super
|
52
|
+
end
|
53
|
+
|
54
|
+
# @param [String] subaccount_id
|
55
|
+
def get(subaccount_id)
|
56
|
+
valid_subaccount?(subaccount_id, true)
|
57
|
+
perform_get(subaccount_id)
|
58
|
+
end
|
59
|
+
|
60
|
+
# @param [String] name
|
61
|
+
# @param [Boolean] enabled
|
62
|
+
def create(name, enabled = false)
|
63
|
+
valid_param?(:name, name, [String, Symbol], true)
|
64
|
+
valid_param?(:enabled, enabled, [TrueClass, FalseClass],
|
65
|
+
true, [true, false])
|
66
|
+
|
67
|
+
params = {
|
68
|
+
name: name,
|
69
|
+
enabled: enabled
|
70
|
+
}
|
71
|
+
|
72
|
+
perform_create(params)
|
73
|
+
end
|
74
|
+
|
75
|
+
# @param [Array] options
|
76
|
+
def list(options = nil)
|
77
|
+
return perform_list if options.nil?
|
78
|
+
|
79
|
+
params = {}
|
80
|
+
|
81
|
+
%i[offset limit].each do |param|
|
82
|
+
if options.key?(param) && valid_param?(param, options[param],
|
83
|
+
[Integer, Integer], true)
|
84
|
+
params[param] = options[param]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
if options.key?(:limit) && (options[:limit] > 20 || options[:limit] <= 0)
|
89
|
+
raise_invalid_request('The maximum number of results that can be '\
|
90
|
+
"fetched is 20. limit can't be more than 20 or less than 1")
|
91
|
+
end
|
92
|
+
|
93
|
+
raise_invalid_request("Offset can't be negative") if options.key?(:offset) && options[:offset] < 0
|
94
|
+
|
95
|
+
perform_list(params)
|
96
|
+
end
|
97
|
+
|
98
|
+
def each
|
99
|
+
offset = 0
|
100
|
+
loop do
|
101
|
+
subaccount_list = list(offset: offset)
|
102
|
+
subaccount_list[:objects].each { |subaccount| yield subaccount }
|
103
|
+
offset += 20
|
104
|
+
return unless subaccount_list.length == 20
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def update(subaccount_id, name, enabled = false)
|
109
|
+
Subaccount.new(@_client, resource_id: subaccount_id).update(name, enabled)
|
110
|
+
end
|
111
|
+
|
112
|
+
def delete(subaccount_id)
|
113
|
+
valid_subaccount?(subaccount_id, true)
|
114
|
+
Subaccount.new(@_client, resource_id: subaccount_id).delete
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class Account < Base::Resource
|
119
|
+
def initialize(client, options = nil)
|
120
|
+
@_name = 'Account'
|
121
|
+
@_identifier_string = 'auth_id'
|
122
|
+
super
|
123
|
+
end
|
124
|
+
|
125
|
+
def update(details)
|
126
|
+
valid_param?(:details, details, Hash, true)
|
127
|
+
|
128
|
+
params = {}
|
129
|
+
%i[name city address].each do |param|
|
130
|
+
if details.key?(param) && valid_param?(param, details[param], [String, Symbol], true)
|
131
|
+
params[param] = details[param]
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
raise_invalid_request('One parameter of name, city and address is required') if params == {}
|
136
|
+
perform_update(params)
|
137
|
+
end
|
138
|
+
|
139
|
+
def to_s
|
140
|
+
{
|
141
|
+
account_type: @account_type,
|
142
|
+
address: @address,
|
143
|
+
api_id: @api_id,
|
144
|
+
auth_id: @auth_id,
|
145
|
+
auto_recharge: @auto_recharge,
|
146
|
+
billing_mode: @billing_mode,
|
147
|
+
cash_credits: @cash_credits,
|
148
|
+
city: @city,
|
149
|
+
name: @name,
|
150
|
+
resource_uri: @resource_uri,
|
151
|
+
state: @state,
|
152
|
+
timezone: @timezone
|
153
|
+
}.to_s
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
class AccountInterface < Base::ResourceInterface
|
158
|
+
def initialize(client, resource_list_json = nil)
|
159
|
+
@_name = 'Account'
|
160
|
+
@_resource_type = Account
|
161
|
+
@_identifier_string = 'auth_id'
|
162
|
+
super
|
163
|
+
end
|
164
|
+
|
165
|
+
def details
|
166
|
+
perform_get(@_client.auth_id)
|
167
|
+
end
|
168
|
+
|
169
|
+
def update(details)
|
170
|
+
Account.new(@_client, resource_id: @_client.auth_id).update(details)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|