feat: allow to use 'six.moves.collections_abc.Mapping' in 'client_options.from_dict()' (#943)
diff --git a/googleapiclient/discovery.py b/googleapiclient/discovery.py
index f12b04f..3fc6e6a 100644
--- a/googleapiclient/discovery.py
+++ b/googleapiclient/discovery.py
@@ -213,10 +213,10 @@
cache_discovery: Boolean, whether or not to cache the discovery doc.
cache: googleapiclient.discovery_cache.base.CacheBase, an optional
cache object for the discovery documents.
- client_options: Dictionary or google.api_core.client_options, Client options to set user
- options on the client. API endpoint should be set through client_options.
- client_cert_source is not supported, client cert should be provided using
- client_encrypted_cert_source instead.
+ client_options: Mapping object or google.api_core.client_options, client
+ options to set user options on the client. The API endpoint should be set
+ through client_options. client_cert_source is not supported, client cert
+ should be provided using client_encrypted_cert_source instead.
adc_cert_path: str, client certificate file path to save the application
default client certificate for mTLS. This field is required if you want to
use the default client certificate.
@@ -359,10 +359,10 @@
credentials: oauth2client.Credentials or
google.auth.credentials.Credentials, credentials to be used for
authentication.
- client_options: Dictionary or google.api_core.client_options, Client options to set user
- options on the client. API endpoint should be set through client_options.
- client_cert_source is not supported, client cert should be provided using
- client_encrypted_cert_source instead.
+ client_options: Mapping object or google.api_core.client_options, client
+ options to set user options on the client. The API endpoint should be set
+ through client_options. client_cert_source is not supported, client cert
+ should be provided using client_encrypted_cert_source instead.
adc_cert_path: str, client certificate file path to save the application
default client certificate for mTLS. This field is required if you want to
use the default client certificate.
@@ -398,7 +398,7 @@
# If an API Endpoint is provided on client options, use that as the base URL
base = urljoin(service["rootUrl"], service["servicePath"])
if client_options:
- if type(client_options) == dict:
+ if isinstance(client_options, six.moves.collections_abc.Mapping):
client_options = google.api_core.client_options.from_dict(client_options)
if client_options.api_endpoint:
base = client_options.api_endpoint
diff --git a/tests/test_discovery.py b/tests/test_discovery.py
index d6cd9e1..31033e8 100644
--- a/tests/test_discovery.py
+++ b/tests/test_discovery.py
@@ -38,6 +38,7 @@
import re
import sys
import unittest2 as unittest
+from collections import defaultdict
from parameterized import parameterized
import mock
@@ -534,6 +535,18 @@
self.assertEqual(plus._baseUrl, api_endpoint)
+ def test_api_endpoint_override_from_client_options_mapping_object(self):
+
+ discovery = open(datafile("plus.json")).read()
+ api_endpoint = "https://foo.googleapis.com/"
+ mapping_object = defaultdict(str)
+ mapping_object['api_endpoint'] = api_endpoint
+ plus = build_from_document(
+ discovery, client_options=mapping_object
+ )
+
+ self.assertEqual(plus._baseUrl, api_endpoint)
+
def test_api_endpoint_override_from_client_options_dict(self):
discovery = open(datafile("plus.json")).read()
api_endpoint = "https://foo.googleapis.com/"