Skip to content

feat: move BigQuery to clientless validation#144

Open
cofin wants to merge 1 commit into
mainfrom
feat/clientless-bigquery
Open

feat: move BigQuery to clientless validation#144
cofin wants to merge 1 commit into
mainfrom
feat/clientless-bigquery

Conversation

@cofin
Copy link
Copy Markdown
Member

@cofin cofin commented May 24, 2026

Drop google-cloud-bigquery from the bigquery extra. Readiness now uses a stdlib urllib.request POST against /bigquery/v2/projects/<project>/queries with SELECT 1, and BigQueryService no longer carries credentials or client_options.

The default dataset is still created automatically — the emulator's --dataset=test-dataset startup flag handles it, so the dataset exists when the fixture yields.

The bundled bigquery_client fixture is removed. Users construct their own bigquery.Client(project=service.project, client_options=ClientOptions(api_endpoint=service.endpoint), credentials=AnonymousCredentials()).

Replace the `google.cloud.bigquery` / `google.api_core.client_options` /
`google.auth.credentials` imports with a stdlib `urllib.request` REST
probe against the emulator's `/bigquery/v2/projects/<project>/queries`
endpoint, mirroring the Elasticsearch (#139), Valkey (#138), and Redis
family (#136) clientless conversions.

- src/pytest_databases/docker/bigquery.py: drop the three `google.*`
  imports; remove `credentials` and `client_options` from
  `BigQueryService` (keep `host`, `port`, `container`, `project`,
  `dataset`, and the `endpoint` property); add a
  `_query_bigquery_emulator(host, port, project, sql, *, timeout=2.0)`
  helper that POSTs `{"query": sql, "useLegacySql": false}` and parses
  the response; rewrite `check()` to call the helper with `SELECT 1 as
  one` and assert `jobComplete and rows[0].f[0].v == "1"`, swallowing
  `URLError`/`HTTPError`/`JSONDecodeError`/`TimeoutError`/`OSError`;
  delete the `bigquery_client` fixture. The emulator `--dataset=` start
  flag and `DATASET_NAME` env var are preserved so the default dataset
  is still auto-created by the emulator binary itself.
- tests/test_bigquery.py: rewrite to drive the emulator through stdlib
  `urllib.request` only; preserve `test_service_fixture` (SELECT 1 via
  REST); drop `test_client_fixture`; rewrite `test_xdist` to issue
  `CREATE TABLE` against `bigquery_service.dataset` via the REST
  endpoint; add `test_plugin_imports_without_google_cloud_bigquery`
  regression guard that intercepts `google.cloud.bigquery`,
  `google.api_core.client_options`, and `google.auth.credentials` via
  `builtins.__import__`.
- pyproject.toml: empty the `bigquery` compatibility extra so
  `pytest-databases[bigquery]` no longer pulls in
  `google-cloud-bigquery`; drop the `pytest_databases.docker.bigquery`
  `attr-defined` mypy override now that the module no longer touches
  Google client attribute surface.
- docs/supported-databases/bigquery.rst: rewrite the example in the
  user-owned-client style; users now build their own `bigquery.Client`
  from `bigquery_service.endpoint`, `bigquery_service.project`, and
  `AnonymousCredentials()`.
- uv.lock: drop `google-cloud-bigquery`, `google-crc32c`, and
  `google-resumable-media`.
@cofin cofin force-pushed the feat/clientless-bigquery branch from b3cb156 to d94fcbc Compare May 25, 2026 16:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant