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/"