From d77871b26e40d109cf5670e8348ee9a8dac38d15 Mon Sep 17 00:00:00 2001 From: Cody Hill Date: Fri, 20 Sep 2019 09:29:34 -0500 Subject: [PATCH 1/5] initial work on allowing users to use both twilio and signalwire --- lib/signalwire/rest/client.rb | 2 ++ lib/signalwire/sdk.rb | 6 +++++ lib/signalwire/sdk/configuration.rb | 17 +++++++++++- lib/signalwire/sdk/domain.rb | 6 ++++- lib/signalwire/sdk/twilio_set_fax.rb | 13 ++++++--- lib/signalwire/sdk/twilio_set_host.rb | 10 ++++--- spec/signalwire/sdk/configuration_spec.rb | 8 ++++-- spec/signalwire/sdk_spec.rb | 33 +++++++++++++++++++++-- 8 files changed, 82 insertions(+), 13 deletions(-) diff --git a/lib/signalwire/rest/client.rb b/lib/signalwire/rest/client.rb index 7badd0c..dfc558c 100644 --- a/lib/signalwire/rest/client.rb +++ b/lib/signalwire/rest/client.rb @@ -4,10 +4,12 @@ module Signalwire::REST class Client < Twilio::REST::Client def initialize(username = nil, password = nil, account_sid = nil, region = nil, http_client = Twilio::HTTP::Client.new, **args) host = args.delete(:signalwire_space_url) + service_provider = args.delete(:service_provider) unless host.nil? Signalwire::Sdk.configure do |config| config.hostname = host + config.service_provider = service_provider end end diff --git a/lib/signalwire/sdk.rb b/lib/signalwire/sdk.rb index 2f66f7c..9e09162 100644 --- a/lib/signalwire/sdk.rb +++ b/lib/signalwire/sdk.rb @@ -14,10 +14,16 @@ module Signalwire module Sdk class << self + attr_accessor :configuration + def configuration @configuration ||= Configuration.new end + def reset + @configuration = Configuration.new + end + def configure yield(configuration) end diff --git a/lib/signalwire/sdk/configuration.rb b/lib/signalwire/sdk/configuration.rb index b5689a4..4e0d04e 100644 --- a/lib/signalwire/sdk/configuration.rb +++ b/lib/signalwire/sdk/configuration.rb @@ -3,7 +3,22 @@ module Signalwire module Sdk class Configuration - attr_accessor :hostname + attr_accessor :hostname, :service_provider + + def initialize + @service_provider = 'signalwire' + end + + def configure + yield self + end + + + def reset_config + configure do |config| + config.service_provider = 'signalwire' + end + end end end end diff --git a/lib/signalwire/sdk/domain.rb b/lib/signalwire/sdk/domain.rb index 2defb94..d3a43ca 100644 --- a/lib/signalwire/sdk/domain.rb +++ b/lib/signalwire/sdk/domain.rb @@ -4,7 +4,11 @@ module Twilio module REST class Domain def absolute_url(uri) - "#{@base_url.chomp('/')}/#{uri.chomp('/').gsub(%r{^/(api/)/}, '')}" + if Signalwire::Sdk.configuration.service_provider == 'twilio' + "#{@base_url.chomp('/')}/#{uri.chomp('/').gsub(/^\//, '')}" + else + "#{@base_url.chomp('/')}/#{uri.chomp('/').gsub(%r{^/(api/)/}, '')}" + end end end end diff --git a/lib/signalwire/sdk/twilio_set_fax.rb b/lib/signalwire/sdk/twilio_set_fax.rb index 5345539..be89810 100644 --- a/lib/signalwire/sdk/twilio_set_fax.rb +++ b/lib/signalwire/sdk/twilio_set_fax.rb @@ -6,10 +6,11 @@ class Fax < Domain def initialize(twilio) super - @host = ENV['SIGNALWIRE_HOST'] || - Signalwire::Sdk.configuration.hostname || - raise(ArgumentError, - 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ + return if Signalwire::Sdk.configuration.service_provider == 'twilio' + + @host = ENV['SIGNALWIRE_HOST'] || Signalwire::Sdk.configuration.hostname || + raise(ArgumentError, + 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ 'SIGNALWIRE_HOST environment variable, or hostname in the configuration.') @base_url = "https://#{@host}" @@ -26,6 +27,10 @@ def hostname @host end + def service_provider + Signalwire::Sdk.configuration.service_provider + end + attr_reader :account_sid class V1 < Version diff --git a/lib/signalwire/sdk/twilio_set_host.rb b/lib/signalwire/sdk/twilio_set_host.rb index 5fe8e19..d80e03a 100644 --- a/lib/signalwire/sdk/twilio_set_host.rb +++ b/lib/signalwire/sdk/twilio_set_host.rb @@ -6,9 +6,9 @@ class Api < Domain def initialize(twilio) super - @host = ENV['SIGNALWIRE_HOST'] || - ENV['SIGNALWIRE_API_HOSTNAME'] || - Signalwire::Sdk.configuration.hostname || + return if Signalwire::Sdk.configuration.service_provider == 'twilio' + + @host = ENV['SIGNALWIRE_HOST'] || ENV['SIGNALWIRE_API_HOSTNAME'] || Signalwire::Sdk.configuration.hostname || raise(ArgumentError, 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ 'SIGNALWIRE_HOST or SIGNALWIRE_API_HOSTNAME environment variables, '\ @@ -24,6 +24,10 @@ def initialize(twilio) def hostname @host end + + def service_provider + Signalwire::Sdk.configuration.service_provider + end end end end diff --git a/spec/signalwire/sdk/configuration_spec.rb b/spec/signalwire/sdk/configuration_spec.rb index 6c4c992..a54c0ce 100644 --- a/spec/signalwire/sdk/configuration_spec.rb +++ b/spec/signalwire/sdk/configuration_spec.rb @@ -5,8 +5,9 @@ module Signalwire RSpec.describe Sdk::Configuration do describe '#hostname' do - it 'there is no default' do + it 'there is no default hostname but is a default service provider' do expect(Sdk::Configuration.new.hostname).to eq nil + expect(Sdk::Configuration.new.service_provider).to eq 'signalwire' end end @@ -14,14 +15,17 @@ module Signalwire it 'can set value' do config = Sdk::Configuration.new config.hostname = 'test.signalwire.com' + config.service_provider = 'twilio' expect(config.hostname).to eq('test.signalwire.com') + expect(config.service_provider).to eq('twilio') end end describe 'setting up directly in the constructor' do it 'sets the configuration in the constructor' do - client = Signalwire::REST::Client.new 'xyz123-xyz123-xyz123', 'PTxyz123-xyz123-xyz123', signalwire_space_url: 'test.signalwire.com' + client = Signalwire::REST::Client.new 'xyz123-xyz123-xyz123', 'PTxyz123-xyz123-xyz123', signalwire_space_url: 'test.signalwire.com', service_provider: 'twilio' expect(Signalwire::Sdk.configuration.hostname).to eq('test.signalwire.com') + expect(Signalwire::Sdk.configuration.service_provider).to eq('twilio') end end end diff --git a/spec/signalwire/sdk_spec.rb b/spec/signalwire/sdk_spec.rb index 0a73ee3..5f099de 100644 --- a/spec/signalwire/sdk_spec.rb +++ b/spec/signalwire/sdk_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Signalwire::Sdk do describe '#configure' do - it 'returns the configured hostname' do + it 'returns the configured hostname for signalwire' do Signalwire::Sdk.configure do |config| config.hostname = 'demo.signalwire.com' end @@ -12,9 +12,23 @@ twilio_client = Twilio::REST::Client.new expect(twilio_client.api.hostname).to eq('demo.signalwire.com') expect(twilio_client.fax.hostname).to eq('demo.signalwire.com') + expect(twilio_client.api.service_provider).to eq('signalwire') end - it 'requires the hostname configuration to be set' do + it 'returns the configured hostname for twilio' do + Signalwire::Sdk.configure do |config| + # config.hostname = 'demo.signalwire.com' + config.service_provider = 'twilio' + end + + twilio_client = Twilio::REST::Client.new + expect(twilio_client.api.hostname).to eq(nil) + expect(twilio_client.fax.hostname).to eq(nil) + expect(twilio_client.api.service_provider).to eq('twilio') + end + + + it 'requires the hostname configuration to be set for signalwire' do Signalwire::Sdk.configure do |config| config.hostname = nil end @@ -23,5 +37,20 @@ Twilio::REST::Client.new.api end.to raise_exception ArgumentError, /SignalWire Space URL is not configured/ end + + it 'does not require the hostname configuration to be set for twilio' do + Signalwire::Sdk.configure do |config| + config.hostname = nil + config.service_provider = 'twilio' + end + + expect do + Twilio::REST::Client.new.api + end.not_to raise_exception ArgumentError, /SignalWire Space URL is not configured/ + end + + after :each do + Signalwire::Sdk.reset + end end end From d28dc53b90a73cc7ce674633656655e1f6072f51 Mon Sep 17 00:00:00 2001 From: Cody Hill Date: Fri, 20 Sep 2019 10:01:15 -0500 Subject: [PATCH 2/5] revisions --- lib/signalwire/sdk/twilio_set_fax.rb | 12 +++++++----- lib/signalwire/sdk/twilio_set_host.rb | 12 +++++++----- spec/signalwire/sdk_spec.rb | 4 ++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/signalwire/sdk/twilio_set_fax.rb b/lib/signalwire/sdk/twilio_set_fax.rb index be89810..4e5fb54 100644 --- a/lib/signalwire/sdk/twilio_set_fax.rb +++ b/lib/signalwire/sdk/twilio_set_fax.rb @@ -6,12 +6,14 @@ class Fax < Domain def initialize(twilio) super - return if Signalwire::Sdk.configuration.service_provider == 'twilio' - - @host = ENV['SIGNALWIRE_HOST'] || Signalwire::Sdk.configuration.hostname || - raise(ArgumentError, - 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ + @host = if Signalwire::Sdk.configuration.service_provider == 'twilio' + 'fax.twilio.com' + else + ENV['SIGNALWIRE_HOST'] || Signalwire::Sdk.configuration.hostname || + raise(ArgumentError, + 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ 'SIGNALWIRE_HOST environment variable, or hostname in the configuration.') + end @base_url = "https://#{@host}" @port = 443 diff --git a/lib/signalwire/sdk/twilio_set_host.rb b/lib/signalwire/sdk/twilio_set_host.rb index d80e03a..8197d0e 100644 --- a/lib/signalwire/sdk/twilio_set_host.rb +++ b/lib/signalwire/sdk/twilio_set_host.rb @@ -6,13 +6,15 @@ class Api < Domain def initialize(twilio) super - return if Signalwire::Sdk.configuration.service_provider == 'twilio' - - @host = ENV['SIGNALWIRE_HOST'] || ENV['SIGNALWIRE_API_HOSTNAME'] || Signalwire::Sdk.configuration.hostname || - raise(ArgumentError, - 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ + @host = if Signalwire::Sdk.configuration.service_provider == 'twilio' + 'api.twilio.com' + else + ENV['SIGNALWIRE_HOST'] || ENV['SIGNALWIRE_API_HOSTNAME'] || Signalwire::Sdk.configuration.hostname || + raise(ArgumentError, + 'SignalWire Space URL is not configured. Enter your SignalWire Space domain via the '\ 'SIGNALWIRE_HOST or SIGNALWIRE_API_HOSTNAME environment variables, '\ 'or hostname in the configuration.') + end @base_url = "https://#{@host}" @port = 443 diff --git a/spec/signalwire/sdk_spec.rb b/spec/signalwire/sdk_spec.rb index 5f099de..161ba28 100644 --- a/spec/signalwire/sdk_spec.rb +++ b/spec/signalwire/sdk_spec.rb @@ -22,8 +22,8 @@ end twilio_client = Twilio::REST::Client.new - expect(twilio_client.api.hostname).to eq(nil) - expect(twilio_client.fax.hostname).to eq(nil) + expect(twilio_client.api.hostname).to eq('api.twilio.com') + expect(twilio_client.fax.hostname).to eq('fax.twilio.com') expect(twilio_client.api.service_provider).to eq('twilio') end From 271d711229664eddd39ea85cffab2099e11928d0 Mon Sep 17 00:00:00 2001 From: Cody Hill Date: Fri, 20 Sep 2019 10:17:33 -0500 Subject: [PATCH 3/5] update domain file --- lib/signalwire/sdk/domain.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/signalwire/sdk/domain.rb b/lib/signalwire/sdk/domain.rb index d3a43ca..d8a5647 100644 --- a/lib/signalwire/sdk/domain.rb +++ b/lib/signalwire/sdk/domain.rb @@ -3,6 +3,15 @@ module Twilio module REST class Domain + attr_reader :client + + def initialize(client) + @client = client + @host = nil + @base_url = nil + @port = nil + end + def absolute_url(uri) if Signalwire::Sdk.configuration.service_provider == 'twilio' "#{@base_url.chomp('/')}/#{uri.chomp('/').gsub(/^\//, '')}" @@ -10,6 +19,22 @@ def absolute_url(uri) "#{@base_url.chomp('/')}/#{uri.chomp('/').gsub(%r{^/(api/)/}, '')}" end end + + def request(method, uri, params = {}, data = {}, headers = {}, auth = nil, timeout = nil) + url = uri.match(/^http/) ? uri : absolute_url(uri) + + @client.request( + @base_url, + @port, + method, + url, + params, + data, + headers, + auth, + timeout + ) + end end end end From b13071468eeac5975ff0d0856c241db1a0447305 Mon Sep 17 00:00:00 2001 From: Cody Hill Date: Fri, 20 Sep 2019 11:31:52 -0500 Subject: [PATCH 4/5] only preset service provider if its not set on configuration --- lib/signalwire/sdk/configuration.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/signalwire/sdk/configuration.rb b/lib/signalwire/sdk/configuration.rb index 4e0d04e..3835507 100644 --- a/lib/signalwire/sdk/configuration.rb +++ b/lib/signalwire/sdk/configuration.rb @@ -6,7 +6,7 @@ class Configuration attr_accessor :hostname, :service_provider def initialize - @service_provider = 'signalwire' + @service_provider = 'signalwire' if self.service_provider.nil? end def configure From 425f0dda717d05b7548c91df6ae31ff7f941782d Mon Sep 17 00:00:00 2001 From: Cody Hill Date: Fri, 20 Sep 2019 11:43:13 -0500 Subject: [PATCH 5/5] fix for setting configuration variables on the fly --- lib/signalwire/rest/client.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/signalwire/rest/client.rb b/lib/signalwire/rest/client.rb index dfc558c..75cbb39 100644 --- a/lib/signalwire/rest/client.rb +++ b/lib/signalwire/rest/client.rb @@ -6,12 +6,10 @@ def initialize(username = nil, password = nil, account_sid = nil, region = nil, host = args.delete(:signalwire_space_url) service_provider = args.delete(:service_provider) - unless host.nil? Signalwire::Sdk.configure do |config| - config.hostname = host - config.service_provider = service_provider + config.hostname = host if host + config.service_provider = service_provider if service_provider end - end super(username, password, account_sid, region, http_client) end