diff --git a/lib/google/api_client.rb b/lib/google/api_client.rb
index 94285acb8..ab97de942 100644
--- a/lib/google/api_client.rb
+++ b/lib/google/api_client.rb
@@ -47,8 +47,6 @@ module Google
#
:oauth_1
# :oauth_2
#
- # @option options [String] :baseURI ("https://www.googleapis.com/discovery/v1")
- # The base API URI used by the client. This rarely needs to be changed.
# @option options [String] :application_name
# The name of the application using the client.
# @option options [String] :application_version
@@ -57,14 +55,22 @@ module Google
# ("{app_name} google-api-ruby-client/{version} {os_name}/{os_version}")
# The user agent used by the client. Most developers will want to
# leave this value alone and use the `:application_name` option instead.
+ # @option options [String] :host ("www.googleapis.com")
+ # The API hostname used by the client. This rarely needs to be changed.
+ # @option options [String] :port (443)
+ # The port number used by the client. This rarely needs to be changed.
+ # @option options [String] :discovery_path ("/discovery/v1")
+ # The discovery base path. This rarely needs to be changed.
def initialize(options={})
# Normalize key to String to allow indifferent access.
options = options.inject({}) do |accu, (key, value)|
accu[key.to_s] = value
accu
end
- # Almost all API usage will have this base URI
- self.baseURI = options["baseURI"] || "https://www.googleapis.com/discovery/v1"
+ # Almost all API usage will have a host of 'www.googleapis.com'.
+ self.host = options["host"] || 'www.googleapis.com'
+ self.port = options["port"] || 443
+ self.discovery_path = options["discovery_path"] || '/discovery/v1'
# Most developers will want to leave this value alone and use the
# application_name option.
@@ -161,22 +167,57 @@ module Google
# @return [String] The user's IP address.
attr_accessor :user_ip
- ##
- # The API hostname used by the client.
- #
- # @return [String]
- # The API hostname. Should almost always be 'www.googleapis.com'.
- attr_accessor :baseURI
-
##
# The user agent used by the client.
#
# @return [String]
# The user agent string used in the User-Agent header.
attr_accessor :user_agent
-
- def relative_uri(path, expand={})
- Addressable::Template.new(baseURI+path).expand(expand)
+
+ ##
+ # The API hostname used by the client.
+ #
+ # @return [String]
+ # The API hostname. Should almost always be 'www.googleapis.com'.
+ attr_accessor :host
+
+ ##
+ # The port number used by the client.
+ #
+ # @return [String]
+ # The port number. Should almost always be 443.
+ attr_accessor :port
+
+ ##
+ # The base path used by the client for discovery.
+ #
+ # @return [String]
+ # The base path. Should almost always be '/discovery/v1'.
+ attr_accessor :discovery_path
+
+ ##
+ # Resolves a URI template against the client's configured base.
+ #
+ # @param [String, Addressable::URI, Addressable::Template] template
+ # The template to resolve.
+ # @param [Hash] mapping The mapping that corresponds to the template.
+ # @return [Addressable::URI] The expanded URI.
+ def resolve_uri(template, mapping={})
+ @base_uri ||= Addressable::URI.new(
+ :scheme => 'https',
+ :host => self.host,
+ :port => self.port
+ ).normalize
+ template = if template.kind_of?(Addressable::Template)
+ template.pattern
+ elsif template.respond_to?(:to_str)
+ template.to_str
+ else
+ raise TypeError,
+ "Expected String, Addressable::URI, or Addressable::Template, " +
+ "got #{template.class}."
+ end
+ return Addressable::Template.new(@base_uri + template).expand(mapping)
end
##
@@ -184,7 +225,7 @@ module Google
#
# @return [Addressable::URI] The URI of the directory document.
def directory_uri
- relative_uri('/apis')
+ return resolve_uri(self.discovery_path + '/apis')
end
##
@@ -209,9 +250,13 @@ module Google
def discovery_uri(api, version=nil)
api = api.to_s
version = version || 'v1'
- return @discovery_uris["#{api}:#{version}"] ||= (begin
- relative_uri("/apis/{api}/{version}/rest", 'api' => api, 'version' => version)
- end)
+ return @discovery_uris["#{api}:#{version}"] ||= (
+ resolve_uri(
+ self.discovery_path + '/apis/{api}/{version}/rest',
+ 'api' => api,
+ 'version' => version
+ )
+ )
end
##
diff --git a/lib/google/api_client/discovery/schema.rb b/lib/google/api_client/discovery/schema.rb
index 0bcf8b7fb..f8a34b6b0 100644
--- a/lib/google/api_client/discovery/schema.rb
+++ b/lib/google/api_client/discovery/schema.rb
@@ -47,8 +47,12 @@ module Google
# and excess object creation, but this hopefully shouldn't be an
# issue since it should only be called only once per schema per
# process.
- if data.kind_of?(Hash) && data['$ref'].is_a?(String)
- reference = data['$ref']
+ if data.kind_of?(Hash) && data['$ref']
+ if data['$ref'].respond_to?(:to_str)
+ reference = data['$ref'].to_str
+ else
+ raise TypeError, "Expected String, got #{data['$ref'].class}"
+ end
reference = '#' + reference if reference[0..0] != '#'
data.merge({
'$ref' => reference