Skip to content

Commit

Permalink
feat: add api_key to client options (#248)
Browse files Browse the repository at this point in the history
* feat: add api_key to client options

* update
  • Loading branch information
arithmetic1728 authored Jan 19, 2022
1 parent 74d5ce8 commit 5e5ad37
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
9 changes: 8 additions & 1 deletion google/api_core/client_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,14 @@ class ClientOptions(object):
quota_project_id (Optional[str]): A project name that a client's
quota belongs to.
credentials_file (Optional[str]): A path to a file storing credentials.
``credentials_file` and ``api_key`` are mutually exclusive.
scopes (Optional[Sequence[str]]): OAuth access token override scopes.
api_key (Optional[str]): Google API key. ``credentials_file`` and
``api_key`` are mutually exclusive.
Raises:
ValueError: If both ``client_cert_source`` and ``client_encrypted_cert_source``
are provided.
are provided, or both ``credentials_file`` and ``api_key`` are provided.
"""

def __init__(
Expand All @@ -81,17 +84,21 @@ def __init__(
quota_project_id=None,
credentials_file=None,
scopes=None,
api_key=None,
):
if client_cert_source and client_encrypted_cert_source:
raise ValueError(
"client_cert_source and client_encrypted_cert_source are mutually exclusive"
)
if api_key and credentials_file:
raise ValueError("api_key and credentials_file are mutually exclusive")
self.api_endpoint = api_endpoint
self.client_cert_source = client_cert_source
self.client_encrypted_cert_source = client_encrypted_cert_source
self.quota_project_id = quota_project_id
self.credentials_file = credentials_file
self.scopes = scopes
self.api_key = api_key

def __repr__(self):
return "ClientOptions: " + repr(self.__dict__)
Expand Down
35 changes: 33 additions & 2 deletions tests/unit/test_client_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,36 @@ def test_constructor_with_both_cert_sources():
)


def test_constructor_with_api_key():

options = client_options.ClientOptions(
api_endpoint="foo.googleapis.com",
client_cert_source=get_client_cert,
quota_project_id="quote-proj",
api_key="api-key",
scopes=[
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/cloud-platform.read-only",
],
)

assert options.api_endpoint == "foo.googleapis.com"
assert options.client_cert_source() == (b"cert", b"key")
assert options.quota_project_id == "quote-proj"
assert options.api_key == "api-key"
assert options.scopes == [
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/cloud-platform.read-only",
]


def test_constructor_with_both_api_key_and_credentials_file():
with pytest.raises(ValueError):
client_options.ClientOptions(
api_key="api-key", credentials_file="path/to/credentials.json",
)


def test_from_dict():
options = client_options.from_dict(
{
Expand All @@ -94,6 +124,7 @@ def test_from_dict():
"https://www.googleapis.com/auth/cloud-platform",
"https://www.googleapis.com/auth/cloud-platform.read-only",
]
assert options.api_key is None


def test_from_dict_bad_argument():
Expand All @@ -112,6 +143,6 @@ def test_repr():

assert (
repr(options)
== "ClientOptions: {'api_endpoint': 'foo.googleapis.com', 'client_cert_source': None, 'client_encrypted_cert_source': None}"
or "ClientOptions: {'client_encrypted_cert_source': None, 'client_cert_source': None, 'api_endpoint': 'foo.googleapis.com'}"
== "ClientOptions: {'api_endpoint': 'foo.googleapis.com', 'client_cert_source': None, 'client_encrypted_cert_source': None, 'api_key': None}"
or "ClientOptions: {'client_encrypted_cert_source': None, 'client_cert_source': None, 'api_endpoint': 'foo.googleapis.com', 'api_key': None}"
)

0 comments on commit 5e5ad37

Please sign in to comment.