From 3f59a25369fd0da7b968ebf14250e198e9b51e8d Mon Sep 17 00:00:00 2001 From: Trevor Bergeron Date: Wed, 29 Apr 2026 00:34:18 +0000 Subject: [PATCH 1/6] chore(bigframes): Add support for bigframes-only project id env var --- packages/bigframes/bigframes/_config/env.py | 47 +++++++++++++++++++ packages/bigframes/bigframes/pandas/io/api.py | 6 ++- .../bigframes/bigframes/session/__init__.py | 5 +- .../bigframes/bigframes/session/clients.py | 18 +------ 4 files changed, 56 insertions(+), 20 deletions(-) create mode 100644 packages/bigframes/bigframes/_config/env.py diff --git a/packages/bigframes/bigframes/_config/env.py b/packages/bigframes/bigframes/_config/env.py new file mode 100644 index 000000000000..5600f03c0dce --- /dev/null +++ b/packages/bigframes/bigframes/_config/env.py @@ -0,0 +1,47 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +from google.auth import default as auth_default + +from bigframes._config import options + +_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT = "BIGFRAMES_DEFAULT_PROJECT" +_GOOGLE_CLOUD_PROJECT = "GOOGLE_CLOUD_PROJECT" + + +def get_default_project_id() -> str: + # Prefer the project in this order: + # 1. Project explicitly specified by the user + # 2. Project set in the environment + # 3. Project associated with the default credentials + maybe_from_env = ( + config.options.bigquery.project + or os.getenv(_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT) + or os.getenv(_GOOGLE_CLOUD_PROJECT) + ) + if maybe_from_env: + return maybe_from_env + + import bigframes._config.auth as auth + _, creds_project = auth.get_default_credentials_with_project() + + if not creds_project: + raise ValueError( + "Project must be set to initialize BigQuery client. " + "Try setting `bigframes.options.bigquery.project` first." + ) + + return creds_project \ No newline at end of file diff --git a/packages/bigframes/bigframes/pandas/io/api.py b/packages/bigframes/bigframes/pandas/io/api.py index b7ed1a65d922..31771fa54214 100644 --- a/packages/bigframes/bigframes/pandas/io/api.py +++ b/packages/bigframes/bigframes/pandas/io/api.py @@ -655,9 +655,11 @@ def _get_bqclient_and_project() -> Tuple[bigquery.Client, str]: # Address circular imports in doctest due to bigframes/session/__init__.py # containing a lot of logic and samples. from bigframes.session import clients + import bigframes._config.env as env + project_id = env.get_default_project_id() clients_provider = clients.ClientsProvider( - project=config.options.bigquery.project, + project=project_id, location=config.options.bigquery.location, use_regional_endpoints=config.options.bigquery.use_regional_endpoints, credentials=config.options.bigquery.credentials, @@ -666,7 +668,7 @@ def _get_bqclient_and_project() -> Tuple[bigquery.Client, str]: client_endpoints_override=config.options.bigquery.client_endpoints_override, requests_transport_adapters=config.options.bigquery.requests_transport_adapters, ) - return clients_provider.bqclient, clients_provider._project + return clients_provider.bqclient, project def _dry_run(query, bqclient) -> bigquery.QueryJob: diff --git a/packages/bigframes/bigframes/session/__init__.py b/packages/bigframes/bigframes/session/__init__.py index afca1ed0554f..91bb50650d82 100644 --- a/packages/bigframes/bigframes/session/__init__.py +++ b/packages/bigframes/bigframes/session/__init__.py @@ -61,6 +61,7 @@ ) import bigframes._config +import bigframes._config.env import bigframes._config.bigquery_options as bigquery_options import bigframes.clients import bigframes.constants @@ -217,8 +218,10 @@ def __init__( if clients_provider: self._clients_provider = clients_provider else: + # will throw if cannot be determined + project = bigframes._config.env.get_default_project_id() self._clients_provider = clients.ClientsProvider( - project=context.project, + project=project, location=self._location, use_regional_endpoints=context.use_regional_endpoints, credentials=context.credentials, diff --git a/packages/bigframes/bigframes/session/clients.py b/packages/bigframes/bigframes/session/clients.py index 2a5c9d649918..f4e47a5b524a 100644 --- a/packages/bigframes/bigframes/session/clients.py +++ b/packages/bigframes/bigframes/session/clients.py @@ -38,7 +38,6 @@ from . import environment -_ENV_DEFAULT_PROJECT = "GOOGLE_CLOUD_PROJECT" _APPLICATION_NAME = f"bigframes/{bigframes.version.__version__} ibis/9.2.0" @@ -74,7 +73,7 @@ class ClientsProvider: def __init__( self, - project: Optional[str] = None, + project: str, location: Optional[str] = None, use_regional_endpoints: Optional[bool] = None, credentials: Optional[google.auth.credentials.Credentials] = None, @@ -90,21 +89,6 @@ def __init__( if credentials is None: credentials, credentials_project = _get_default_credentials_with_project() - # Prefer the project in this order: - # 1. Project explicitly specified by the user - # 2. Project set in the environment - # 3. Project associated with the default credentials - project = ( - project - or os.getenv(_ENV_DEFAULT_PROJECT) - or typing.cast(Optional[str], credentials_project) - ) - - if not project: - raise ValueError( - "Project must be set to initialize BigQuery client. " - "Try setting `bigframes.options.bigquery.project` first." - ) self._application_name = ( f"{_get_application_names()} {application_name}" From 6fedddfc03e8693083d430fbea4d5d92ed6e2ffa Mon Sep 17 00:00:00 2001 From: Trevor Bergeron Date: Wed, 29 Apr 2026 17:27:25 +0000 Subject: [PATCH 2/6] fixes --- packages/bigframes/bigframes/_config/env.py | 7 +++---- packages/bigframes/bigframes/pandas/io/api.py | 2 +- packages/bigframes/bigframes/session/clients.py | 1 - packages/bigframes/tests/system/large/test_location.py | 6 ++++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/bigframes/bigframes/_config/env.py b/packages/bigframes/bigframes/_config/env.py index 5600f03c0dce..ab3e1f02d14a 100644 --- a/packages/bigframes/bigframes/_config/env.py +++ b/packages/bigframes/bigframes/_config/env.py @@ -14,8 +14,6 @@ import os -from google.auth import default as auth_default - from bigframes._config import options _BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT = "BIGFRAMES_DEFAULT_PROJECT" @@ -28,7 +26,7 @@ def get_default_project_id() -> str: # 2. Project set in the environment # 3. Project associated with the default credentials maybe_from_env = ( - config.options.bigquery.project + options.bigquery.project or os.getenv(_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT) or os.getenv(_GOOGLE_CLOUD_PROJECT) ) @@ -36,6 +34,7 @@ def get_default_project_id() -> str: return maybe_from_env import bigframes._config.auth as auth + _, creds_project = auth.get_default_credentials_with_project() if not creds_project: @@ -44,4 +43,4 @@ def get_default_project_id() -> str: "Try setting `bigframes.options.bigquery.project` first." ) - return creds_project \ No newline at end of file + return creds_project diff --git a/packages/bigframes/bigframes/pandas/io/api.py b/packages/bigframes/bigframes/pandas/io/api.py index 31771fa54214..03c896434d7b 100644 --- a/packages/bigframes/bigframes/pandas/io/api.py +++ b/packages/bigframes/bigframes/pandas/io/api.py @@ -668,7 +668,7 @@ def _get_bqclient_and_project() -> Tuple[bigquery.Client, str]: client_endpoints_override=config.options.bigquery.client_endpoints_override, requests_transport_adapters=config.options.bigquery.requests_transport_adapters, ) - return clients_provider.bqclient, project + return clients_provider.bqclient, project_id def _dry_run(query, bqclient) -> bigquery.QueryJob: diff --git a/packages/bigframes/bigframes/session/clients.py b/packages/bigframes/bigframes/session/clients.py index f4e47a5b524a..f53ecaf3d701 100644 --- a/packages/bigframes/bigframes/session/clients.py +++ b/packages/bigframes/bigframes/session/clients.py @@ -89,7 +89,6 @@ def __init__( if credentials is None: credentials, credentials_project = _get_default_credentials_with_project() - self._application_name = ( f"{_get_application_names()} {application_name}" if application_name diff --git a/packages/bigframes/tests/system/large/test_location.py b/packages/bigframes/tests/system/large/test_location.py index 3ebe2bb040e4..083a13ae2d0c 100644 --- a/packages/bigframes/tests/system/large/test_location.py +++ b/packages/bigframes/tests/system/large/test_location.py @@ -177,7 +177,7 @@ def test_bq_rep_endpoints(bigquery_location): def test_clients_provider_no_location(): with pytest.raises(ValueError, match="Must set location to use regional endpoints"): - bigframes.session.clients.ClientsProvider(use_regional_endpoints=True) + bigframes.session.clients.ClientsProvider(project="", use_regional_endpoints=True) @pytest.mark.parametrize( @@ -191,7 +191,9 @@ def test_clients_provider_use_regional_endpoints_non_rep_locations(bigquery_loca match=f"not .*available in the location {bigquery_location}", ): bigframes.session.clients.ClientsProvider( - location=bigquery_location, use_regional_endpoints=True + project="", + location=bigquery_location, + use_regional_endpoints=True ) From 788ad31fe7ff367dd37d6a68992824f4f1e5e6eb Mon Sep 17 00:00:00 2001 From: Trevor Bergeron Date: Wed, 29 Apr 2026 20:31:00 +0000 Subject: [PATCH 3/6] fixes --- packages/bigframes/bigframes/_config/env.py | 39 +++++++++++-------- packages/bigframes/bigframes/pandas/io/api.py | 7 ++-- .../bigframes/bigframes/session/__init__.py | 7 ++-- .../bigframes/bigframes/session/clients.py | 11 +----- .../tests/system/large/test_location.py | 6 ++- 5 files changed, 36 insertions(+), 34 deletions(-) diff --git a/packages/bigframes/bigframes/_config/env.py b/packages/bigframes/bigframes/_config/env.py index ab3e1f02d14a..0c67fac31b6d 100644 --- a/packages/bigframes/bigframes/_config/env.py +++ b/packages/bigframes/bigframes/_config/env.py @@ -14,33 +14,38 @@ import os +from typing import Optional from bigframes._config import options +import bigframes._config.bigquery_options as bigquery_options _BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT = "BIGFRAMES_DEFAULT_PROJECT" _GOOGLE_CLOUD_PROJECT = "GOOGLE_CLOUD_PROJECT" -def get_default_project_id() -> str: - # Prefer the project in this order: - # 1. Project explicitly specified by the user - # 2. Project set in the environment - # 3. Project associated with the default credentials - maybe_from_env = ( - options.bigquery.project - or os.getenv(_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT) - or os.getenv(_GOOGLE_CLOUD_PROJECT) - ) - if maybe_from_env: - return maybe_from_env - - import bigframes._config.auth as auth +def resolve_credentials_and_project(options: bigquery_options.BigQueryOptions) -> tuple[google.auth.credentials.Credentials, str]: + if project is None: + project = bigframes._config.env.get_default_project_id(context) - _, creds_project = auth.get_default_credentials_with_project() + if credentials is None: + credentials, cred_project = bigframes._config.auth.get_default_credentials_with_project() + if project is None: + project = cred_project - if not creds_project: + if project is None: raise ValueError( "Project must be set to initialize BigQuery client. " "Try setting `bigframes.options.bigquery.project` first." ) + return credentials, project - return creds_project + +def get_default_project_id() -> Optional[str]: + # Prefer the project in this order: + # 1. Project explicitly specified by the user + # 2. Project set in the environment + # 3. Project associated with the default credentials + return ( + bigframes._config.options.project + or os.getenv(_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT) + or os.getenv(_GOOGLE_CLOUD_PROJECT) + ) \ No newline at end of file diff --git a/packages/bigframes/bigframes/pandas/io/api.py b/packages/bigframes/bigframes/pandas/io/api.py index 03c896434d7b..3b10ed699f2d 100644 --- a/packages/bigframes/bigframes/pandas/io/api.py +++ b/packages/bigframes/bigframes/pandas/io/api.py @@ -657,12 +657,13 @@ def _get_bqclient_and_project() -> Tuple[bigquery.Client, str]: from bigframes.session import clients import bigframes._config.env as env - project_id = env.get_default_project_id() + credentials, project = bigframes._config.env.resolve_credentials_and_project(config.options.bigquery) + clients_provider = clients.ClientsProvider( - project=project_id, + project=project, location=config.options.bigquery.location, use_regional_endpoints=config.options.bigquery.use_regional_endpoints, - credentials=config.options.bigquery.credentials, + credentials=credentials, application_name=config.options.bigquery.application_name, bq_kms_key_name=config.options.bigquery.kms_key_name, client_endpoints_override=config.options.bigquery.client_endpoints_override, diff --git a/packages/bigframes/bigframes/session/__init__.py b/packages/bigframes/bigframes/session/__init__.py index 91bb50650d82..856e04530461 100644 --- a/packages/bigframes/bigframes/session/__init__.py +++ b/packages/bigframes/bigframes/session/__init__.py @@ -61,6 +61,7 @@ ) import bigframes._config +import bigframes._config.auth import bigframes._config.env import bigframes._config.bigquery_options as bigquery_options import bigframes.clients @@ -218,13 +219,13 @@ def __init__( if clients_provider: self._clients_provider = clients_provider else: - # will throw if cannot be determined - project = bigframes._config.env.get_default_project_id() + credentials, project = bigframes._config.env.resolve_credentials_and_project(context) + self._clients_provider = clients.ClientsProvider( project=project, + credentials=credentials, location=self._location, use_regional_endpoints=context.use_regional_endpoints, - credentials=context.credentials, application_name=context.application_name, bq_kms_key_name=self._bq_kms_key_name, client_endpoints_override=context.client_endpoints_override, diff --git a/packages/bigframes/bigframes/session/clients.py b/packages/bigframes/bigframes/session/clients.py index f53ecaf3d701..f3046c7cbe0f 100644 --- a/packages/bigframes/bigframes/session/clients.py +++ b/packages/bigframes/bigframes/session/clients.py @@ -32,7 +32,6 @@ import google.cloud.storage # type: ignore import requests -import bigframes._config.auth import bigframes.constants import bigframes.version @@ -49,10 +48,6 @@ _BIGQUERYSTORAGE_REGIONAL_ENDPOINT = "bigquerystorage.{location}.rep.googleapis.com" -def _get_default_credentials_with_project(): - return bigframes._config.auth.get_default_credentials_with_project() - - def _get_application_names(): apps = [_APPLICATION_NAME] @@ -74,9 +69,9 @@ class ClientsProvider: def __init__( self, project: str, + credentials: google.auth.credentials.Credentials, location: Optional[str] = None, use_regional_endpoints: Optional[bool] = None, - credentials: Optional[google.auth.credentials.Credentials] = None, application_name: Optional[str] = None, bq_kms_key_name: Optional[str] = None, client_endpoints_override: dict = {}, @@ -85,10 +80,6 @@ def __init__( Tuple[str, requests.adapters.BaseAdapter] ] = (), ): - credentials_project = None - if credentials is None: - credentials, credentials_project = _get_default_credentials_with_project() - self._application_name = ( f"{_get_application_names()} {application_name}" if application_name diff --git a/packages/bigframes/tests/system/large/test_location.py b/packages/bigframes/tests/system/large/test_location.py index 083a13ae2d0c..fe48ee36396c 100644 --- a/packages/bigframes/tests/system/large/test_location.py +++ b/packages/bigframes/tests/system/large/test_location.py @@ -176,8 +176,10 @@ def test_bq_rep_endpoints(bigquery_location): def test_clients_provider_no_location(): + credentials = mock.create_autospec(google.auth.credentials.Credentials) + with pytest.raises(ValueError, match="Must set location to use regional endpoints"): - bigframes.session.clients.ClientsProvider(project="", use_regional_endpoints=True) + bigframes.session.clients.ClientsProvider(project="", credentials=credentials, use_regional_endpoints=True) @pytest.mark.parametrize( @@ -186,12 +188,14 @@ def test_clients_provider_no_location(): sorted(bigframes.constants.REP_NOT_ENABLED_BIGQUERY_LOCATIONS), ) def test_clients_provider_use_regional_endpoints_non_rep_locations(bigquery_location): + credentials = mock.create_autospec(google.auth.credentials.Credentials) with pytest.raises( ValueError, match=f"not .*available in the location {bigquery_location}", ): bigframes.session.clients.ClientsProvider( project="", + credentials=credentials, location=bigquery_location, use_regional_endpoints=True ) From 1bf9d4a590d1780e8cb8ec2b37faa83d66665dc1 Mon Sep 17 00:00:00 2001 From: Trevor Bergeron Date: Wed, 29 Apr 2026 20:39:28 +0000 Subject: [PATCH 4/6] fixes --- packages/bigframes/bigframes/_config/auth.py | 45 +++++++++++++++- packages/bigframes/bigframes/_config/env.py | 51 ------------------- packages/bigframes/bigframes/pandas/io/api.py | 6 +-- .../bigframes/bigframes/session/__init__.py | 3 +- 4 files changed, 48 insertions(+), 57 deletions(-) delete mode 100644 packages/bigframes/bigframes/_config/env.py diff --git a/packages/bigframes/bigframes/_config/auth.py b/packages/bigframes/bigframes/_config/auth.py index 1574fc488355..92b66bc2f393 100644 --- a/packages/bigframes/bigframes/_config/auth.py +++ b/packages/bigframes/bigframes/_config/auth.py @@ -14,6 +14,7 @@ from __future__ import annotations +import os import threading from typing import Optional @@ -21,6 +22,11 @@ import google.auth.transport.requests import pydata_google_auth +from typing import Optional +from bigframes._config import options +import bigframes._config.bigquery_options as bigquery_options +import google.auth.credentials + _SCOPES = ["https://www.googleapis.com/auth/cloud-platform"] # Put the lock here rather than in BigQueryOptions so that BigQueryOptions @@ -30,7 +36,44 @@ _cached_project_default: Optional[str] = None -def get_default_credentials_with_project() -> tuple[ +_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT = "BIGFRAMES_DEFAULT_PROJECT" +_GOOGLE_CLOUD_PROJECT = "GOOGLE_CLOUD_PROJECT" + + +def resolve_credentials_and_project( + options: bigquery_options.BigQueryOptions, +) -> tuple[google.auth.credentials.Credentials, str]: + project = options.project + credentials = options.credentials + if project is None: + project = _get_env_project_id() + + if credentials is None: + credentials, cred_project = _get_default_credentials_with_project() + # This might conflict with explicit project, which will be ignored, credentials project + # only used if nothing else specified + if project is None: + project = cred_project + + if project is None: + raise ValueError( + "Project must be set to initialize BigQuery client. " + "Try setting `bigframes.options.bigquery.project` first." + ) + return credentials, project + + +def _get_env_project_id() -> Optional[str]: + # Prefer the project in this order: + # 1. Project explicitly specified by the user + # 2. Project set in the environment + # 3. Project associated with the default credentials + return os.getenv(_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT) or os.getenv( + _GOOGLE_CLOUD_PROJECT + ) + + +def _get_default_credentials_with_project() -> tuple[ google.auth.credentials.Credentials, Optional[str] ]: global _AUTH_LOCK, _cached_credentials, _cached_project_default diff --git a/packages/bigframes/bigframes/_config/env.py b/packages/bigframes/bigframes/_config/env.py deleted file mode 100644 index 0c67fac31b6d..000000000000 --- a/packages/bigframes/bigframes/_config/env.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2024 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -from typing import Optional -from bigframes._config import options -import bigframes._config.bigquery_options as bigquery_options - -_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT = "BIGFRAMES_DEFAULT_PROJECT" -_GOOGLE_CLOUD_PROJECT = "GOOGLE_CLOUD_PROJECT" - - -def resolve_credentials_and_project(options: bigquery_options.BigQueryOptions) -> tuple[google.auth.credentials.Credentials, str]: - if project is None: - project = bigframes._config.env.get_default_project_id(context) - - if credentials is None: - credentials, cred_project = bigframes._config.auth.get_default_credentials_with_project() - if project is None: - project = cred_project - - if project is None: - raise ValueError( - "Project must be set to initialize BigQuery client. " - "Try setting `bigframes.options.bigquery.project` first." - ) - return credentials, project - - -def get_default_project_id() -> Optional[str]: - # Prefer the project in this order: - # 1. Project explicitly specified by the user - # 2. Project set in the environment - # 3. Project associated with the default credentials - return ( - bigframes._config.options.project - or os.getenv(_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT) - or os.getenv(_GOOGLE_CLOUD_PROJECT) - ) \ No newline at end of file diff --git a/packages/bigframes/bigframes/pandas/io/api.py b/packages/bigframes/bigframes/pandas/io/api.py index 3b10ed699f2d..fd3f42d599bb 100644 --- a/packages/bigframes/bigframes/pandas/io/api.py +++ b/packages/bigframes/bigframes/pandas/io/api.py @@ -655,9 +655,9 @@ def _get_bqclient_and_project() -> Tuple[bigquery.Client, str]: # Address circular imports in doctest due to bigframes/session/__init__.py # containing a lot of logic and samples. from bigframes.session import clients - import bigframes._config.env as env + import bigframes._config.auth - credentials, project = bigframes._config.env.resolve_credentials_and_project(config.options.bigquery) + credentials, project = bigframes._config.auth.resolve_credentials_and_project(config.options.bigquery) clients_provider = clients.ClientsProvider( project=project, @@ -669,7 +669,7 @@ def _get_bqclient_and_project() -> Tuple[bigquery.Client, str]: client_endpoints_override=config.options.bigquery.client_endpoints_override, requests_transport_adapters=config.options.bigquery.requests_transport_adapters, ) - return clients_provider.bqclient, project_id + return clients_provider.bqclient, project def _dry_run(query, bqclient) -> bigquery.QueryJob: diff --git a/packages/bigframes/bigframes/session/__init__.py b/packages/bigframes/bigframes/session/__init__.py index 856e04530461..6a65c92d2bfa 100644 --- a/packages/bigframes/bigframes/session/__init__.py +++ b/packages/bigframes/bigframes/session/__init__.py @@ -62,7 +62,6 @@ import bigframes._config import bigframes._config.auth -import bigframes._config.env import bigframes._config.bigquery_options as bigquery_options import bigframes.clients import bigframes.constants @@ -219,7 +218,7 @@ def __init__( if clients_provider: self._clients_provider = clients_provider else: - credentials, project = bigframes._config.env.resolve_credentials_and_project(context) + credentials, project = bigframes._config.auth.resolve_credentials_and_project(context) self._clients_provider = clients.ClientsProvider( project=project, From b628e51f5a3485919feff00f32ef035eb67cfe43 Mon Sep 17 00:00:00 2001 From: Trevor Bergeron Date: Wed, 29 Apr 2026 20:41:35 +0000 Subject: [PATCH 5/6] lint --- packages/bigframes/bigframes/pandas/io/api.py | 4 +++- packages/bigframes/bigframes/session/__init__.py | 4 +++- packages/bigframes/tests/system/large/test_location.py | 8 +++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/bigframes/bigframes/pandas/io/api.py b/packages/bigframes/bigframes/pandas/io/api.py index fd3f42d599bb..e412f5f2798a 100644 --- a/packages/bigframes/bigframes/pandas/io/api.py +++ b/packages/bigframes/bigframes/pandas/io/api.py @@ -657,7 +657,9 @@ def _get_bqclient_and_project() -> Tuple[bigquery.Client, str]: from bigframes.session import clients import bigframes._config.auth - credentials, project = bigframes._config.auth.resolve_credentials_and_project(config.options.bigquery) + credentials, project = bigframes._config.auth.resolve_credentials_and_project( + config.options.bigquery + ) clients_provider = clients.ClientsProvider( project=project, diff --git a/packages/bigframes/bigframes/session/__init__.py b/packages/bigframes/bigframes/session/__init__.py index 6a65c92d2bfa..05d979b4eb9c 100644 --- a/packages/bigframes/bigframes/session/__init__.py +++ b/packages/bigframes/bigframes/session/__init__.py @@ -218,7 +218,9 @@ def __init__( if clients_provider: self._clients_provider = clients_provider else: - credentials, project = bigframes._config.auth.resolve_credentials_and_project(context) + credentials, project = ( + bigframes._config.auth.resolve_credentials_and_project(context) + ) self._clients_provider = clients.ClientsProvider( project=project, diff --git a/packages/bigframes/tests/system/large/test_location.py b/packages/bigframes/tests/system/large/test_location.py index fe48ee36396c..54af1d4ca9b6 100644 --- a/packages/bigframes/tests/system/large/test_location.py +++ b/packages/bigframes/tests/system/large/test_location.py @@ -179,7 +179,9 @@ def test_clients_provider_no_location(): credentials = mock.create_autospec(google.auth.credentials.Credentials) with pytest.raises(ValueError, match="Must set location to use regional endpoints"): - bigframes.session.clients.ClientsProvider(project="", credentials=credentials, use_regional_endpoints=True) + bigframes.session.clients.ClientsProvider( + project="", credentials=credentials, use_regional_endpoints=True + ) @pytest.mark.parametrize( @@ -196,8 +198,8 @@ def test_clients_provider_use_regional_endpoints_non_rep_locations(bigquery_loca bigframes.session.clients.ClientsProvider( project="", credentials=credentials, - location=bigquery_location, - use_regional_endpoints=True + location=bigquery_location, + use_regional_endpoints=True, ) From b9a969cdde9da3e788fb189209e7954a4533d269 Mon Sep 17 00:00:00 2001 From: Trevor Bergeron Date: Wed, 29 Apr 2026 21:55:42 +0000 Subject: [PATCH 6/6] remove var, refactor only --- packages/bigframes/bigframes/_config/auth.py | 17 ++--------------- .../tests/system/large/test_location.py | 2 ++ 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/packages/bigframes/bigframes/_config/auth.py b/packages/bigframes/bigframes/_config/auth.py index 92b66bc2f393..3b05c878db95 100644 --- a/packages/bigframes/bigframes/_config/auth.py +++ b/packages/bigframes/bigframes/_config/auth.py @@ -22,10 +22,8 @@ import google.auth.transport.requests import pydata_google_auth -from typing import Optional -from bigframes._config import options import bigframes._config.bigquery_options as bigquery_options -import google.auth.credentials +from bigframes._config import options _SCOPES = ["https://www.googleapis.com/auth/cloud-platform"] @@ -36,7 +34,6 @@ _cached_project_default: Optional[str] = None -_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT = "BIGFRAMES_DEFAULT_PROJECT" _GOOGLE_CLOUD_PROJECT = "GOOGLE_CLOUD_PROJECT" @@ -46,7 +43,7 @@ def resolve_credentials_and_project( project = options.project credentials = options.credentials if project is None: - project = _get_env_project_id() + project = os.getenv(_GOOGLE_CLOUD_PROJECT) if credentials is None: credentials, cred_project = _get_default_credentials_with_project() @@ -63,16 +60,6 @@ def resolve_credentials_and_project( return credentials, project -def _get_env_project_id() -> Optional[str]: - # Prefer the project in this order: - # 1. Project explicitly specified by the user - # 2. Project set in the environment - # 3. Project associated with the default credentials - return os.getenv(_BIGFRAMES_SPECIFIC_ENV_DEFAULT_PROJECT) or os.getenv( - _GOOGLE_CLOUD_PROJECT - ) - - def _get_default_credentials_with_project() -> tuple[ google.auth.credentials.Credentials, Optional[str] ]: diff --git a/packages/bigframes/tests/system/large/test_location.py b/packages/bigframes/tests/system/large/test_location.py index 54af1d4ca9b6..3127d5865a95 100644 --- a/packages/bigframes/tests/system/large/test_location.py +++ b/packages/bigframes/tests/system/large/test_location.py @@ -13,7 +13,9 @@ # limitations under the License. import typing +import unittest.mock as mock +import google.auth.credentials import pandas import pandas.testing import pytest