ruby-bandwidth-iris 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +13 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +10 -0
- data/LICENSE.txt +20 -0
- data/README.md +571 -0
- data/Rakefile +5 -0
- data/examples/account.rb +15 -0
- data/examples/available_npa_nxx.rb +17 -0
- data/examples/available_number.rb +17 -0
- data/examples/city.rb +16 -0
- data/examples/config.yml.example +4 -0
- data/examples/covered-rate-center.rb +19 -0
- data/examples/loa.pdf +0 -0
- data/examples/order.rb +51 -0
- data/examples/port-in.rb +95 -0
- data/examples/sip_peer.rb +60 -0
- data/examples/site.rb +29 -0
- data/examples/tn.rb +20 -0
- data/lib/bandwidth-iris/account.rb +10 -0
- data/lib/bandwidth-iris/api_item.rb +36 -0
- data/lib/bandwidth-iris/available_npa_nxx.rb +15 -0
- data/lib/bandwidth-iris/available_number.rb +15 -0
- data/lib/bandwidth-iris/city.rb +15 -0
- data/lib/bandwidth-iris/client.rb +232 -0
- data/lib/bandwidth-iris/client_wrapper.rb +28 -0
- data/lib/bandwidth-iris/covered_rate_center.rb +17 -0
- data/lib/bandwidth-iris/disc_number.rb +19 -0
- data/lib/bandwidth-iris/disconnect.rb +36 -0
- data/lib/bandwidth-iris/dlda.rb +39 -0
- data/lib/bandwidth-iris/errors.rb +31 -0
- data/lib/bandwidth-iris/import_to_account.rb +24 -0
- data/lib/bandwidth-iris/in_service_number.rb +24 -0
- data/lib/bandwidth-iris/lidb.rb +24 -0
- data/lib/bandwidth-iris/lnp_checker.rb +18 -0
- data/lib/bandwidth-iris/lsr_order.rb +58 -0
- data/lib/bandwidth-iris/order.rb +76 -0
- data/lib/bandwidth-iris/port_in.rb +80 -0
- data/lib/bandwidth-iris/port_out.rb +24 -0
- data/lib/bandwidth-iris/rate_center.rb +19 -0
- data/lib/bandwidth-iris/sip_peer.rb +47 -0
- data/lib/bandwidth-iris/site.rb +83 -0
- data/lib/bandwidth-iris/subscription.rb +42 -0
- data/lib/bandwidth-iris/tn.rb +41 -0
- data/lib/bandwidth-iris/tn_reservation.rb +26 -0
- data/lib/bandwidth-iris/user.rb +20 -0
- data/lib/bandwidth-iris/version.rb +4 -0
- data/lib/ruby-bandwidth-iris.rb +29 -0
- data/ruby-bandwidth-iris.gemspec +26 -0
- data/spec/bandwidth-iris/account_spec.rb +19 -0
- data/spec/bandwidth-iris/available_npa_nxx_spec.rb +22 -0
- data/spec/bandwidth-iris/available_number_spec.rb +19 -0
- data/spec/bandwidth-iris/city_spec.rb +22 -0
- data/spec/bandwidth-iris/client_spec.rb +125 -0
- data/spec/bandwidth-iris/covered_rate_center_spec.rb +22 -0
- data/spec/bandwidth-iris/disconnect_spec.rb +52 -0
- data/spec/bandwidth-iris/dlda_spec.rb +47 -0
- data/spec/bandwidth-iris/import_to_account_spec.rb +36 -0
- data/spec/bandwidth-iris/in_service_number_spec.rb +33 -0
- data/spec/bandwidth-iris/lidb_spec.rb +44 -0
- data/spec/bandwidth-iris/lnp_checker_spec.rb +24 -0
- data/spec/bandwidth-iris/lsr_order_spec.rb +96 -0
- data/spec/bandwidth-iris/order_spec.rb +124 -0
- data/spec/bandwidth-iris/port_in_spec.rb +135 -0
- data/spec/bandwidth-iris/port_out_spec.rb +36 -0
- data/spec/bandwidth-iris/rate_center_spec.rb +29 -0
- data/spec/bandwidth-iris/sip_peer_spec.rb +86 -0
- data/spec/bandwidth-iris/site_spec.rb +95 -0
- data/spec/bandwidth-iris/subscription_spec.rb +58 -0
- data/spec/bandwidth-iris/tn_reservation_spec.rb +39 -0
- data/spec/bandwidth-iris/tn_spec.rb +68 -0
- data/spec/bandwidth-iris/user_spec.rb +21 -0
- data/spec/helper.rb +75 -0
- data/spec/xml.yml +46 -0
- metadata +256 -0
data/examples/city.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'ruby-bandwidth-iris'
|
6
|
+
config = YAML.load_file('config.yml')
|
7
|
+
|
8
|
+
BandwidthIris::Client.global_options = {
|
9
|
+
:api_endpoint => config['api_endpoint'],
|
10
|
+
:user_name => config['user_name'],
|
11
|
+
:password => config['password'],
|
12
|
+
:account_id => config['account_id']
|
13
|
+
}
|
14
|
+
|
15
|
+
puts BandwidthIris::City.list({:available => true, :state => 'NC'})
|
16
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'ruby-bandwidth-iris'
|
6
|
+
config = YAML.load_file('config.yml')
|
7
|
+
|
8
|
+
BandwidthIris::Client.global_options = {
|
9
|
+
:api_endpoint => config['api_endpoint'],
|
10
|
+
:user_name => config['user_name'],
|
11
|
+
:password => config['password'],
|
12
|
+
:account_id => config['account_id']
|
13
|
+
}
|
14
|
+
|
15
|
+
|
16
|
+
BandwidthIris::CoveredRateCenter.list({:zip => '27609', :page=>1, :size=>100}).each do |c|
|
17
|
+
puts c.to_data
|
18
|
+
end
|
19
|
+
|
data/examples/loa.pdf
ADDED
Binary file
|
data/examples/order.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'ruby-bandwidth-iris'
|
6
|
+
config = YAML.load_file('config.yml')
|
7
|
+
|
8
|
+
BandwidthIris::Client.global_options = {
|
9
|
+
:api_endpoint => config['api_endpoint'],
|
10
|
+
:user_name => config['user_name'],
|
11
|
+
:password => config['password'],
|
12
|
+
:account_id => config['account_id']
|
13
|
+
}
|
14
|
+
|
15
|
+
number = '9195551212' #exisitng number for order
|
16
|
+
|
17
|
+
|
18
|
+
site = BandwidthIris::Site.create({
|
19
|
+
:name => "Ruby Test Site",
|
20
|
+
:description => "A Site From Ruby SDK Examples",
|
21
|
+
:address => {
|
22
|
+
:house_number => "123",
|
23
|
+
:street_name => "Anywhere St",
|
24
|
+
:city => "Raleigh",
|
25
|
+
:state_code =>"NC",
|
26
|
+
:zip => "27609",
|
27
|
+
:address_type => "Service"
|
28
|
+
}
|
29
|
+
})
|
30
|
+
|
31
|
+
order = BandwidthIris::Order.create({
|
32
|
+
:name =>"A Test Order",
|
33
|
+
:site_id => site.id,
|
34
|
+
:existing_telephone_number_order_type => {
|
35
|
+
:telephone_number_list =>
|
36
|
+
{
|
37
|
+
:telephone_number => [number]
|
38
|
+
}
|
39
|
+
|
40
|
+
}
|
41
|
+
})
|
42
|
+
|
43
|
+
puts order.to_data
|
44
|
+
|
45
|
+
order = BandwidthIris::Order.get(order.id)
|
46
|
+
|
47
|
+
puts order.to_data
|
48
|
+
|
49
|
+
order.delete()
|
50
|
+
site.delete()
|
51
|
+
|
data/examples/port-in.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'ruby-bandwidth-iris'
|
6
|
+
config = YAML.load_file('config.yml')
|
7
|
+
|
8
|
+
BandwidthIris::Client.global_options = {
|
9
|
+
:api_endpoint => config['api_endpoint'],
|
10
|
+
:user_name => config['user_name'],
|
11
|
+
:password => config['password'],
|
12
|
+
:account_id => config['account_id']
|
13
|
+
}
|
14
|
+
|
15
|
+
number_to_check = '+12525130283' #TODO fill with valid number
|
16
|
+
|
17
|
+
host = '1.1.2.3'
|
18
|
+
|
19
|
+
|
20
|
+
site = BandwidthIris::Site.create({
|
21
|
+
:name => "Ruby Test Site",
|
22
|
+
:description => "A Site From Ruby SDK Examples",
|
23
|
+
:address => {
|
24
|
+
:house_number => "123",
|
25
|
+
:street_name => "Anywhere St",
|
26
|
+
:city => "Raleigh",
|
27
|
+
:state_code =>"NC",
|
28
|
+
:zip => "27609",
|
29
|
+
:address_type => "Service"
|
30
|
+
}
|
31
|
+
})
|
32
|
+
|
33
|
+
data = {
|
34
|
+
:peer_name => "A New SIP Peer",
|
35
|
+
:is_default_peer => true,
|
36
|
+
:short_messaging_protocol => "SMPP",
|
37
|
+
:site_id => site[:id],
|
38
|
+
:voice_hosts =>
|
39
|
+
{
|
40
|
+
:host => {
|
41
|
+
:host_name => host
|
42
|
+
}
|
43
|
+
},
|
44
|
+
:sms_hosts =>
|
45
|
+
{
|
46
|
+
:host => {
|
47
|
+
:host_name => host
|
48
|
+
}
|
49
|
+
},
|
50
|
+
:termination_hosts =>
|
51
|
+
{
|
52
|
+
:termination_host => {
|
53
|
+
:host_name => host,
|
54
|
+
:port => 5060,
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
}
|
59
|
+
|
60
|
+
sip_peer = BandwidthIris::SipPeer.create(site[:id], data)
|
61
|
+
|
62
|
+
res = BandwidthIris::LnpChecker.check(number_to_check)
|
63
|
+
|
64
|
+
if res[:portable_numbers] && res[:portable_numbers][:tn] == number_to_check
|
65
|
+
puts 'Your number is portable. Creating PortIn Order'
|
66
|
+
port_in = BandwidthIris::PortIn.create(create_port_in_order(number_to_check, site, sip_peer))
|
67
|
+
puts "Created order #{port_in[:id]}"
|
68
|
+
port_in.create_file(File.open('./loa.pdf', 'r'), 'application/pdf')
|
69
|
+
end
|
70
|
+
|
71
|
+
def create_port_in_order(number, site, sip_peer)
|
72
|
+
{
|
73
|
+
:site_id => site[:id],
|
74
|
+
:peer_id => sip_peer[:id],
|
75
|
+
:billing_telephone_number => number,
|
76
|
+
:subscriber => {
|
77
|
+
:subscriber_type => "BUSINESS",
|
78
|
+
:business_name => "Company",
|
79
|
+
:service_address => {
|
80
|
+
:house_number => "123",
|
81
|
+
:street_name => "EZ Street",
|
82
|
+
:city => "Raleigh",
|
83
|
+
:state_code => "NC",
|
84
|
+
:zip => "27615",
|
85
|
+
:county => "Wake"
|
86
|
+
}
|
87
|
+
},
|
88
|
+
:loa_authorizing_person => "Joe Blow",
|
89
|
+
:list_of_phone_numbers => {
|
90
|
+
:phoneNumber => number
|
91
|
+
},
|
92
|
+
:billingType => "PORTIN"
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'ruby-bandwidth-iris'
|
6
|
+
config = YAML.load_file('config.yml')
|
7
|
+
|
8
|
+
BandwidthIris::Client.global_options = {
|
9
|
+
:api_endpoint => config['api_endpoint'],
|
10
|
+
:user_name => config['user_name'],
|
11
|
+
:password => config['password'],
|
12
|
+
:account_id => config['account_id']
|
13
|
+
}
|
14
|
+
|
15
|
+
host = '10.20.30.41'
|
16
|
+
|
17
|
+
|
18
|
+
site = BandwidthIris::Site.create({
|
19
|
+
:name => "Ruby Test Site",
|
20
|
+
:description => "A Site From Ruby SDK Examples",
|
21
|
+
:address => {
|
22
|
+
:house_number => "123",
|
23
|
+
:street_name => "Anywhere St",
|
24
|
+
:city => "Raleigh",
|
25
|
+
:state_code =>"NC",
|
26
|
+
:zip => "27609",
|
27
|
+
:address_type => "Service"
|
28
|
+
}
|
29
|
+
})
|
30
|
+
|
31
|
+
data = {
|
32
|
+
:peer_name => "A New SIP Peer",
|
33
|
+
:is_default_peer => true,
|
34
|
+
:short_messaging_protocol => "SMPP",
|
35
|
+
:site_id => site[:id],
|
36
|
+
:voice_hosts =>
|
37
|
+
{
|
38
|
+
:host => {
|
39
|
+
:host_name => host
|
40
|
+
}
|
41
|
+
},
|
42
|
+
:sms_hosts =>
|
43
|
+
{
|
44
|
+
:host => {
|
45
|
+
:host_name => host
|
46
|
+
}
|
47
|
+
},
|
48
|
+
:termination_hosts =>
|
49
|
+
{
|
50
|
+
:termination_host => {
|
51
|
+
:host_name => host,
|
52
|
+
:port => 5060,
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
}
|
57
|
+
sip_peer = BandwidthIris::SipPeer.create(site[:id], data)
|
58
|
+
|
59
|
+
|
60
|
+
sip_peer.delete(site[:id])
|
data/examples/site.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'ruby-bandwidth-iris'
|
6
|
+
config = YAML.load_file('config.yml')
|
7
|
+
|
8
|
+
BandwidthIris::Client.global_options = {
|
9
|
+
:api_endpoint => config['api_endpoint'],
|
10
|
+
:user_name => config['user_name'],
|
11
|
+
:password => config['password'],
|
12
|
+
:account_id => config['account_id']
|
13
|
+
}
|
14
|
+
|
15
|
+
|
16
|
+
site = BandwidthIris::Site.create({
|
17
|
+
:name => "Ruby Test Sitei1",
|
18
|
+
:description => "A Site From Ruby SDK Examples",
|
19
|
+
:address => {
|
20
|
+
:house_number => "123",
|
21
|
+
:street_name => "Anywhere St",
|
22
|
+
:city => "Raleigh",
|
23
|
+
:state_code =>"NC",
|
24
|
+
:zip => "27609",
|
25
|
+
:address_type => "Service"
|
26
|
+
}
|
27
|
+
})
|
28
|
+
|
29
|
+
site.delete()
|
data/examples/tn.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
require 'ruby-bandwidth-iris'
|
6
|
+
config = YAML.load_file('config.yml')
|
7
|
+
|
8
|
+
|
9
|
+
BandwidthIris::Client.global_options = {
|
10
|
+
:api_endpoint => config['api_endpoint'],
|
11
|
+
:user_name => config['user_name'],
|
12
|
+
:password => config['password'],
|
13
|
+
:account_id => config['account_id']
|
14
|
+
}
|
15
|
+
|
16
|
+
list = BandwidthIris::Tn.list({:npa => '818', :page => 1, :size => 100}).each do |n|
|
17
|
+
puts n.to_data
|
18
|
+
end
|
19
|
+
|
20
|
+
puts BandwidthIris::Tn.get(list[0][:full_number]).to_data
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module BandwidthIris
|
2
|
+
# Module which adds common operations for all Catapult api related classes
|
3
|
+
module ApiItem
|
4
|
+
# Initializer
|
5
|
+
#
|
6
|
+
# @param data [Hash] Hash with data of api item. Initializer will create accessors for each key of this hash
|
7
|
+
# @param client [Client] Optional client instance. If omitted Client instance with default parameters will be used
|
8
|
+
def initialize(data={}, client = nil)
|
9
|
+
@client = client || Client.new()
|
10
|
+
@data = (data || {}).clone()
|
11
|
+
@data.each do |k,v|
|
12
|
+
self.define_singleton_method(k) do
|
13
|
+
@data[k]
|
14
|
+
end
|
15
|
+
self.define_singleton_method("#{k}=".to_sym()) do |val|
|
16
|
+
@data[k] = val
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Return data of api item as hash
|
22
|
+
def to_data()
|
23
|
+
@data.clone()
|
24
|
+
end
|
25
|
+
|
26
|
+
# Return item of @data by name
|
27
|
+
def [] (name)
|
28
|
+
@data[name]
|
29
|
+
end
|
30
|
+
|
31
|
+
# Set value of @data's item by name
|
32
|
+
def []= (name, value)
|
33
|
+
@data[name] = value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module BandwidthIris
|
2
|
+
AVAILABLE_NPA_NXX_PATH = 'availableNpaNxx'
|
3
|
+
|
4
|
+
class AvailableNpaNxx
|
5
|
+
extend ClientWrapper
|
6
|
+
|
7
|
+
def self.list(client, query)
|
8
|
+
list = client.make_request(:get, client.concat_account_path(AVAILABLE_NPA_NXX_PATH), query)[0][:available_npa_nxx_list][:available_npa_nxx]
|
9
|
+
return [] if !list
|
10
|
+
if list.is_a?(Array) then list else [list] end
|
11
|
+
end
|
12
|
+
wrap_client_arg :list
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module BandwidthIris
|
2
|
+
AVAILABLE_NUMBER_PATH = 'availableNumbers'
|
3
|
+
|
4
|
+
class AvailableNumber
|
5
|
+
extend ClientWrapper
|
6
|
+
|
7
|
+
def self.list(client, query)
|
8
|
+
list = client.make_request(:get, client.concat_account_path(AVAILABLE_NUMBER_PATH), query)[0][:telephone_number_list][:telephone_number]
|
9
|
+
return [] if !list
|
10
|
+
if list.is_a?(Array) then list else [list] end
|
11
|
+
end
|
12
|
+
wrap_client_arg :list
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module BandwidthIris
|
2
|
+
CITY_PATH = 'cities'
|
3
|
+
|
4
|
+
class City
|
5
|
+
extend ClientWrapper
|
6
|
+
|
7
|
+
def self.list(client, query)
|
8
|
+
list = client.make_request(:get, CITY_PATH, query)[0][:cities][:city]
|
9
|
+
return [] if !list
|
10
|
+
if list.is_a?(Array) then list else [list] end
|
11
|
+
end
|
12
|
+
wrap_client_arg :list
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'certified'
|
3
|
+
require 'active_support/xml_mini'
|
4
|
+
require 'active_support/core_ext/hash/conversions'
|
5
|
+
require 'active_support/core_ext/string/inflections'
|
6
|
+
|
7
|
+
|
8
|
+
module BandwidthIris
|
9
|
+
|
10
|
+
class Client
|
11
|
+
def initialize (account_id = nil, user_name = nil, password = nil, options = nil)
|
12
|
+
if user_name == nil && password == nil && options == nil
|
13
|
+
if account_id && account_id.is_a?(Hash)
|
14
|
+
options = account_id
|
15
|
+
account_id = nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
options = options || @@global_options
|
19
|
+
account_id = options[:account_id] unless account_id
|
20
|
+
user_name = options[:user_name] || options[:username] unless user_name
|
21
|
+
password = options[:password] unless password
|
22
|
+
options[:api_endpoint] = @@global_options[:api_endpoint] unless options[:api_endpoint]
|
23
|
+
options[:api_version] = @@global_options[:api_version] unless options[:api_version]
|
24
|
+
api_endpoint = options[:api_endpoint] || "https://api.inetwork.com"
|
25
|
+
api_version = options[:api_version] || "v1.0"
|
26
|
+
|
27
|
+
@build_path = lambda {|path| "/#{api_version}" + (if path[0] == "/" then path else "/#{path}" end) }
|
28
|
+
@set_adapter = lambda {|faraday| faraday.adapter(Faraday.default_adapter)}
|
29
|
+
@create_connection = lambda{||
|
30
|
+
Faraday.new(api_endpoint) { |faraday|
|
31
|
+
faraday.basic_auth(user_name, password)
|
32
|
+
#faraday.response :logger
|
33
|
+
faraday.headers['Accept'] = 'application/xml'
|
34
|
+
@set_adapter.call(faraday)
|
35
|
+
}
|
36
|
+
}
|
37
|
+
@concat_account_path = lambda {|path| "/accounts/#{account_id}" + (if path then (if path[0] == "/" then path else "/#{path}" end) else '' end) }
|
38
|
+
@api_endpoint = api_endpoint
|
39
|
+
@api_version = api_version
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_reader :api_endpoint, :api_version
|
43
|
+
|
44
|
+
@@global_options = {}
|
45
|
+
|
46
|
+
# Return global options
|
47
|
+
def Client.global_options
|
48
|
+
@@global_options
|
49
|
+
end
|
50
|
+
|
51
|
+
# Set global options
|
52
|
+
def Client.global_options=(v)
|
53
|
+
@@global_options = v
|
54
|
+
end
|
55
|
+
|
56
|
+
# Extract id from location header
|
57
|
+
# @param location [String] location header value
|
58
|
+
# @return [String] extracted id
|
59
|
+
def Client.get_id_from_location_header(location)
|
60
|
+
items = (location || '').split('/')
|
61
|
+
raise StandardError.new('Missing id in the location header') if items.size < 2
|
62
|
+
items.last
|
63
|
+
end
|
64
|
+
|
65
|
+
# Make HTTP request to IRIS API
|
66
|
+
# @param method [Symbol] http method to make
|
67
|
+
# @param path [string] path of url (exclude api verion and endpoint) to make call
|
68
|
+
# @param data [Hash] data which will be sent with request (for :get and :delete request they will be sent with query in url)
|
69
|
+
# @return [Array] array with 2 elements: parsed data of response and response headers
|
70
|
+
def make_request(method, path, data = {})
|
71
|
+
connection = @create_connection.call()
|
72
|
+
response = if method == :get || method == :delete
|
73
|
+
d = camelcase(data)
|
74
|
+
connection.run_request(method, @build_path.call(path), nil, nil) do |req|
|
75
|
+
req.params = d unless d == nil || d.empty?
|
76
|
+
end
|
77
|
+
else
|
78
|
+
connection.run_request(method, @build_path.call(path), build_xml(data), {'Content-Type' => 'application/xml'})
|
79
|
+
end
|
80
|
+
body = check_response(response)
|
81
|
+
[body || {}, symbolize(response.headers || {})]
|
82
|
+
end
|
83
|
+
|
84
|
+
# Check response object and raise error if status code >= 400
|
85
|
+
# @param response response object
|
86
|
+
def check_response(response)
|
87
|
+
parsed_body = parse_xml(response.body || '')
|
88
|
+
code = find_first_descendant(parsed_body, :error_code)
|
89
|
+
description = find_first_descendant(parsed_body, :description)
|
90
|
+
unless code
|
91
|
+
error = find_first_descendant(parsed_body, :error)
|
92
|
+
if error
|
93
|
+
code = error[:code]
|
94
|
+
description = error[:description]
|
95
|
+
else
|
96
|
+
errors = find_first_descendant(parsed_body, :errors)
|
97
|
+
if errors == nil || errors.length == 0
|
98
|
+
code = find_first_descendant(parsed_body, :result_code)
|
99
|
+
description = find_first_descendant(parsed_body, :result_message)
|
100
|
+
else
|
101
|
+
errors = [errors] if errors.is_a?(Hash)
|
102
|
+
raise Errors::AgregateError.new(errors.map {|e| Errors::GenericError.new(e[:code], e[:description], response.status)})
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
raise Errors::GenericError.new(code, description, response.status) if code && description && code != '0' && code != 0
|
107
|
+
raise Errors::GenericError.new('', "Http code #{response.status}", response.status) if response.status >= 400
|
108
|
+
parsed_body
|
109
|
+
end
|
110
|
+
|
111
|
+
# Build url path like /accounts/<account-id>/<path>
|
112
|
+
def concat_account_path(path)
|
113
|
+
@concat_account_path.call(path)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Return new configured connection object
|
117
|
+
# @return [Faraday::Connection] connection
|
118
|
+
def create_connection()
|
119
|
+
@create_connection.call()
|
120
|
+
end
|
121
|
+
|
122
|
+
def build_xml(data)
|
123
|
+
doc = build_doc(data)
|
124
|
+
doc.values.first.to_xml({:root => doc.keys.first, :skip_types => true, :indent => 0 })
|
125
|
+
end
|
126
|
+
|
127
|
+
protected
|
128
|
+
|
129
|
+
# Convert all keys of a hash to camel cased strings
|
130
|
+
def camelcase v
|
131
|
+
case
|
132
|
+
when v.is_a?(Array)
|
133
|
+
v.map {|i| camelcase(i)}
|
134
|
+
when v.is_a?(Hash)
|
135
|
+
result = {}
|
136
|
+
v.each do |k, val|
|
137
|
+
result[k.to_s().camelcase(:lower)] = camelcase(val)
|
138
|
+
end
|
139
|
+
result
|
140
|
+
else
|
141
|
+
v
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Convert all keys of hash to underscored symbols
|
146
|
+
def symbolize v
|
147
|
+
case
|
148
|
+
when v.is_a?(Array)
|
149
|
+
v.map {|i| symbolize(i)}
|
150
|
+
when v.is_a?(Hash)
|
151
|
+
result = {}
|
152
|
+
v.each do |k, val|
|
153
|
+
result[k.underscore().to_sym()] = symbolize(val)
|
154
|
+
end
|
155
|
+
result
|
156
|
+
else
|
157
|
+
v
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def parse_xml(xml)
|
162
|
+
doc = ActiveSupport::XmlMini.parse(xml)
|
163
|
+
process_parsed_doc(doc.values.first)
|
164
|
+
end
|
165
|
+
|
166
|
+
def build_doc(v)
|
167
|
+
case
|
168
|
+
when v.is_a?(Array)
|
169
|
+
v.map {|i| build_doc(i)}
|
170
|
+
when v.is_a?(Hash)
|
171
|
+
result = {}
|
172
|
+
v.each do |k, val|
|
173
|
+
if k[0] != '_'
|
174
|
+
result[v["_#{k}XmlElement"] || (k.to_s().camelcase(:upper))] = build_doc(val)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
result
|
178
|
+
else
|
179
|
+
v
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def process_parsed_doc(v)
|
184
|
+
case
|
185
|
+
when v.is_a?(Array)
|
186
|
+
v.map {|i| process_parsed_doc(i)}
|
187
|
+
when v.is_a?(Hash)
|
188
|
+
return process_parsed_doc(v['__content__']) if v.keys.length == 1 && v['__content__']
|
189
|
+
result = {}
|
190
|
+
v.each do |k, val|
|
191
|
+
key = if k.downcase() == 'lata' then :lata else k.underscore().to_sym() end
|
192
|
+
result[key] = process_parsed_doc(val)
|
193
|
+
end
|
194
|
+
result
|
195
|
+
when v == "true" || v == "false"
|
196
|
+
v == "true"
|
197
|
+
when /^\d{4}\-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}(\.\d{3})?Z$/.match(v)
|
198
|
+
DateTime.iso8601(v)
|
199
|
+
when /\A\d{9}\d?\Z/.match(v)
|
200
|
+
v
|
201
|
+
when /\A\d+\Z/.match(v)
|
202
|
+
Integer(v)
|
203
|
+
when /\A[-+]?[0-9]*\.?[0-9]+\Z/.match(v)
|
204
|
+
Float(v)
|
205
|
+
else
|
206
|
+
v
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def find_first_descendant v, name
|
211
|
+
result = nil
|
212
|
+
case
|
213
|
+
when v.is_a?(Array)
|
214
|
+
v.each do |val|
|
215
|
+
result = find_first_descendant(val, name)
|
216
|
+
break if result
|
217
|
+
end
|
218
|
+
when v.is_a?(Hash)
|
219
|
+
v.each do |k, val|
|
220
|
+
if k == name
|
221
|
+
result = val
|
222
|
+
break
|
223
|
+
else
|
224
|
+
result = find_first_descendant(val, name)
|
225
|
+
break if result
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
result
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module BandwidthIris
|
2
|
+
# Allows to make first argument (client instance) of defined singletom function optional
|
3
|
+
module ClientWrapper
|
4
|
+
# Make first argument (client instance) of a method optional
|
5
|
+
#
|
6
|
+
# @param method [Symbol] singleton method name
|
7
|
+
# @example
|
8
|
+
# class MyClass
|
9
|
+
# extend ClientWrapper
|
10
|
+
#
|
11
|
+
# def self.do_something(client, arg1, arg2)
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# wrap_client_arg :do_something
|
15
|
+
# # Now you can make calls like MyClass.do_something(client, arg1, arg2) and MyClass.do_something(arg1, arg2)
|
16
|
+
# # In last case Client instance with default parameters (from Client.global_options) will be used
|
17
|
+
# end
|
18
|
+
def wrap_client_arg(method)
|
19
|
+
old = method(method)
|
20
|
+
define_singleton_method(method) do |*args|
|
21
|
+
if(args.size == 0 || !(args[0] || {}).is_a?(Client))
|
22
|
+
args.unshift(Client.new())
|
23
|
+
end
|
24
|
+
old.call(*args)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module BandwidthIris
|
2
|
+
COVERED_RATE_CENTER_PATH = 'coveredRateCenters'
|
3
|
+
class CoveredRateCenter
|
4
|
+
extend ClientWrapper
|
5
|
+
include ApiItem
|
6
|
+
|
7
|
+
def self.list(client, query = nil)
|
8
|
+
list = client.make_request(:get, COVERED_RATE_CENTER_PATH, query)[0][:covered_rate_center]
|
9
|
+
return [] if !list
|
10
|
+
list = if list.is_a?(Array) then list else [list] end
|
11
|
+
list.map do |i|
|
12
|
+
CoveredRateCenter.new(i, client)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
wrap_client_arg :list
|
16
|
+
end
|
17
|
+
end
|