{"id":50095326,"url":"https://github.com/jjviscomi/bqemulator","last_synced_at":"2026-05-23T03:06:26.878Z","repository":{"id":359474634,"uuid":"1246228007","full_name":"jjviscomi/bqemulator","owner":"jjviscomi","description":"Local emulator for Google BigQuery. DuckDB-backed, SQLGlot-powered. Drop-in replacement for the real service in dev, CI, and offline replicas.","archived":false,"fork":false,"pushed_at":"2026-05-22T11:40:42.000Z","size":3800,"stargazers_count":1,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-22T11:47:06.577Z","etag":null,"topics":["bigquery","bq-cli","duckdb","emulator","fastapi","pytest-plugin","python","sqlglot","testing"],"latest_commit_sha":null,"homepage":"https://jjviscomi.github.io/bqemulator/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jjviscomi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":"SUPPORT.md","governance":"GOVERNANCE.md","roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-22T02:03:25.000Z","updated_at":"2026-05-22T11:31:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jjviscomi/bqemulator","commit_stats":null,"previous_names":["jjviscomi/bqemulator"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/jjviscomi/bqemulator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jjviscomi%2Fbqemulator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jjviscomi%2Fbqemulator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jjviscomi%2Fbqemulator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jjviscomi%2Fbqemulator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jjviscomi","download_url":"https://codeload.github.com/jjviscomi/bqemulator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jjviscomi%2Fbqemulator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33380807,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T01:21:08.577Z","status":"online","status_checked_at":"2026-05-23T02:00:05.530Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bigquery","bq-cli","duckdb","emulator","fastapi","pytest-plugin","python","sqlglot","testing"],"created_at":"2026-05-23T03:06:23.949Z","updated_at":"2026-05-23T03:06:26.863Z","avatar_url":"https://github.com/jjviscomi.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# bqemulator\n\n**A local, drop-in emulator for Google BigQuery.**\n\nDuckDB-backed, SQLGlot-powered, and tested against the real service. Point the official Google Cloud client libraries at it and run your BigQuery code on your laptop or in CI — no real project, no billing, no network.\n\n[![CI](https://github.com/jjviscomi/bqemulator/actions/workflows/ci.yml/badge.svg)](https://github.com/jjviscomi/bqemulator/actions/workflows/ci.yml)\n[![E2E](https://github.com/jjviscomi/bqemulator/actions/workflows/e2e.yml/badge.svg)](https://github.com/jjviscomi/bqemulator/actions/workflows/e2e.yml)\n[![Conformance](https://github.com/jjviscomi/bqemulator/actions/workflows/conformance.yml/badge.svg)](https://github.com/jjviscomi/bqemulator/actions/workflows/conformance.yml)\n[![Docs](https://github.com/jjviscomi/bqemulator/actions/workflows/docs.yml/badge.svg)](https://jjviscomi.github.io/bqemulator/)\n[![PyPI](https://img.shields.io/pypi/v/bqemulator.svg?cacheSeconds=300)](https://pypi.org/project/bqemulator/)\n[![Python](https://img.shields.io/pypi/pyversions/bqemulator.svg?cacheSeconds=300)](https://pypi.org/project/bqemulator/)\n[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![Checked with mypy](https://www.mypy-lang.org/static/mypy_badge.svg)](https://mypy-lang.org/)\n\n[**Documentation**](https://jjviscomi.github.io/bqemulator/)\n · [**Quickstart**](https://jjviscomi.github.io/bqemulator/latest/getting-started/)\n · [**Examples**](docs/examples/)\n · [**Compatibility matrix**](https://jjviscomi.github.io/bqemulator/latest/reference/compatibility-matrix/)\n · [**Changelog**](CHANGELOG.md)\n\n\u003c/div\u003e\n\n---\n\n## Why bqemulator?\n\nTesting code against real BigQuery is **slow** (network + service latency), **expensive** (every query is billable), and **dangerous** (no rollback in shared environments). The alternatives — mocks, fakes, and shared sandboxes — drift from the real service the moment you stop chasing them.\n\n`bqemulator` is a process you can run locally that **speaks BigQuery's actual wire protocol** (REST + gRPC), backs onto a real analytical SQL engine (DuckDB), and translates GoogleSQL → DuckDB SQL with a rule-based, ADR-grounded translator (SQLGlot). The official `google-cloud-bigquery`, `@google-cloud/bigquery`, `cloud.google.com/go/bigquery`, `com.google.cloud:google-cloud-bigquery`, and `bq` CLI clients all work against it unchanged — only the endpoint differs.\n\nThree use cases, one binary:\n\n- **Ephemeral CI fixture** — `pytest` plugin starts an in-process emulator on a random port; `pip install bqemulator[testing]` is all the wiring you need.\n- **Long-running local dev server** — `bqemulator start --data-dir ~/bqemu` persists state across runs; works with the official `bq` CLI, dbt, Airflow, PySpark, Beam, Scio.\n- **Offline replica of a real project** — `bqemulator import --from-project \u003cid\u003e` clones schema (and optionally data) from real BigQuery into a local data directory.\n\n## Highlights\n\n- 🟢 **Full REST + gRPC API parity** — Datasets, Tables, Jobs, TableData, Routines, Row Access Policies, Authorized Views, plus Models CRUD metadata. Storage Read API (Arrow and Avro). Storage Write API (all four stream types — `DEFAULT`, `COMMITTED`, `PENDING`, `BUFFERED` — with both proto and Arrow row formats).\n- ⚡ **Real SQL** — GoogleSQL translated to DuckDB SQL via 92 SQLGlot rules + 22 rewriters; covers date/time, string, array, struct, range, geography, JSON, approximate-aggregate, statistical, regex, civil-time, and bit operations.\n- 🧠 **Features `goccy/bigquery-emulator` doesn't have** — JavaScript UDFs (embedded V8 via `mini-racer`), procedural scripting (`DECLARE` / `BEGIN…END` / `IF` / `LOOP` / `EXCEPTION` / `BEGIN TRANSACTION`), time travel (`FOR SYSTEM_TIME AS OF`), table snapshots, table clones, materialized views with refresh dispatch, GEOGRAPHY (planar via DuckDB-spatial + S2 helpers), RANGE, INTERVAL, authorized views, row-access policies, `INFORMATION_SCHEMA`.\n- 🔌 **Five-client e2e matrix** — every release is exercised against the official Python, Node.js, Go, and Java BigQuery client libraries plus Google's `bq` CLI in a live Docker container.\n- 🧪 **7-tier test pyramid** — unit + property + integration + conformance + e2e + perf + chaos, plus mutation / fuzz / differential siblings. Combined coverage is gated at ≥90% line + branch.\n- 📐 **Conformance corpus** — 1,141 fixtures recorded against real BigQuery. Drift between the emulator and the real service surfaces as a failing test; documented divergences are pinned with ADR references.\n- 🐍 **Native pytest plugin** — `pip install bqemulator` registers a pytest plugin; the `bqemu_server` fixture starts an ephemeral in-process emulator on random free ports and sets `BIGQUERY_EMULATOR_HOST`. No `conftest.py` wiring required.\n- 🐳 **Multi-arch container** — `ghcr.io/jjviscomi/bqemulator` builds for `linux/amd64` + `linux/arm64`, with cosign keyless signatures via GitHub OIDC.\n- 🔭 **Production-grade observability** — `structlog` JSON logs, OpenTelemetry tracing (configurable OTLP exporter), Prometheus metrics endpoint.\n\n## Install\n\n```bash\npip install bqemulator\n```\n\nOptional extras:\n\n```bash\npip install \"bqemulator[testing]\"      # pytest, hypothesis, testcontainers, bigquery client\npip install \"bqemulator[udf-js]\"       # JavaScript UDF support (embedded V8)\npip install \"bqemulator[orc]\"          # ORC format for load jobs\npip install \"bqemulator[compression]\"  # zstd + snappy for load/extract jobs\npip install \"bqemulator[import]\"       # bqemulator import --from-project\npip install \"bqemulator[all]\"          # all runtime extras (no testing extras)\n```\n\nDocker:\n\n```bash\ndocker run --rm -p 9050:9050 -p 9060:9060 ghcr.io/jjviscomi/bqemulator:latest\n```\n\nBoth `pip` and the published image bundle the same emulator. The image exposes REST on `9050` and gRPC on `9060` by default — see [configuration reference](https://jjviscomi.github.io/bqemulator/latest/reference/configuration/) to change them.\n\n\u003e **Windows users:** install [Docker Desktop for Windows](https://www.docker.com/products/docker-desktop/) with the WSL2 backend (default since Docker Desktop 4.x); the published Linux image runs natively under WSL2 with no Windows-specific configuration. Native Windows-container variants of the image are explicitly out of scope for v1.0 — see [docs/reference/out-of-scope.md#native-windows-containers](docs/reference/out-of-scope.md) for the rationale.\n\n## Quickstart\n\n### Python\n\n```python\nimport os\nfrom google.cloud import bigquery\n\n# Either set BIGQUERY_EMULATOR_HOST (picked up by every Google Cloud library)\n# or pass api_endpoint explicitly to the Client. Both work.\nos.environ[\"BIGQUERY_EMULATOR_HOST\"] = \"localhost:9050\"\n\nclient = bigquery.Client(project=\"my-test-project\")\n\nclient.create_dataset(\"sales\")\nclient.create_table(\n    bigquery.Table(\n        \"sales.orders\",\n        schema=[\n            bigquery.SchemaField(\"id\", \"INT64\"),\n            bigquery.SchemaField(\"amount\", \"NUMERIC\"),\n            bigquery.SchemaField(\"placed_at\", \"TIMESTAMP\"),\n        ],\n    )\n)\nclient.insert_rows_json(\n    \"sales.orders\",\n    [{\"id\": 1, \"amount\": \"12.50\", \"placed_at\": \"2026-05-21T00:00:00Z\"}],\n)\n\nfor row in client.query(\"SELECT COUNT(*) AS n FROM sales.orders\").result():\n    print(row.n)  # 1\n```\n\n### pytest\n\n`bqemulator` ships a pytest plugin via the `pytest11` entry point. Installing the package is all the wiring you need — your `conftest.py` stays empty.\n\n```python\nfrom google.cloud import bigquery\n\ndef test_orders_table(bqemu_client: bigquery.Client) -\u003e None:\n    bqemu_client.create_dataset(\"sales\")\n    # ... your test ...\n```\n\nThe `bqemu_server` fixture is session-scoped (one emulator per test session); the `bqemu_client` fixture is function-scoped and returns a pre-configured `bigquery.Client`. See the [pytest fixture guide](https://jjviscomi.github.io/bqemulator/latest/quickstart/pytest/) and the [`python/pytest-integration`](docs/examples/python/pytest-integration/) example for a complete Flask app with integration tests.\n\n### Node.js\n\n```javascript\nconst { BigQuery } = require('@google-cloud/bigquery');\n\nconst bq = new BigQuery({\n  projectId: 'my-test-project',\n  apiEndpoint: 'http://localhost:9050',\n  token: 'dummy',  // emulator accepts any token\n});\n\nawait bq.createDataset('sales');\n```\n\nSee the [Node.js quickstart](https://jjviscomi.github.io/bqemulator/latest/quickstart/nodejs/) and the [`nodejs/nestjs-app`](docs/examples/nodejs/nestjs-app/) example.\n\n### Go\n\n```go\nclient, _ := bigquery.NewClient(\n    ctx, \"my-test-project\",\n    option.WithEndpoint(\"http://localhost:9050\"),\n    option.WithoutAuthentication(),\n)\n```\n\nSee the [Go quickstart](https://jjviscomi.github.io/bqemulator/latest/quickstart/go/) and the [`go/beam-pipeline`](docs/examples/go/beam-pipeline/) example.\n\n### Java\n\n```java\nBigQuery bq = BigQueryOptions.newBuilder()\n    .setProjectId(\"my-test-project\")\n    .setHost(\"http://localhost:9050\")\n    .setCredentials(NoCredentials.getInstance())\n    .build()\n    .getService();\n```\n\nSee the [Java quickstart](https://jjviscomi.github.io/bqemulator/latest/quickstart/java/) and the [`java/spring-boot`](docs/examples/java/spring-boot/) example.\n\n### `bq` CLI\n\n```bash\nbq --api=http://localhost:9050 \\\n   --project_id=my-test-project \\\n   query --use_legacy_sql=false 'SELECT 1 AS n'\n```\n\nSee the [`bq` CLI guide](https://jjviscomi.github.io/bqemulator/latest/guides/using-bq-cli/) and the [`bq-cli-quickstart`](docs/examples/bq-cli-quickstart/) example.\n\n### docker-compose\n\n```yaml\nservices:\n  bqemulator:\n    image: ghcr.io/jjviscomi/bqemulator:latest\n    ports: [\"9050:9050\", \"9060:9060\"]\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-sf\", \"http://localhost:9050/healthz\"]\n      interval: 2s\n      retries: 30\n\n  app:\n    build: .\n    environment:\n      BIGQUERY_EMULATOR_HOST: bqemulator:9050\n    depends_on:\n      bqemulator: { condition: service_healthy }\n```\n\nSee the [`docker-compose/full-stack`](docs/examples/docker-compose/full-stack/) example for app + emulator + Prometheus + Grafana.\n\n## What works today\n\n`bqemulator` is at **v1.0.1** — first patch on the production-stable\nline. SemVer applies: breaking changes ship only in MAJOR,\ndeprecations live ≥2 MINOR or 6 months. The [compatibility matrix](https://jjviscomi.github.io/bqemulator/latest/reference/compatibility-matrix/) is auto-generated from the conformance corpus on every CI run; the [conformance coverage matrix](https://jjviscomi.github.io/bqemulator/latest/reference/conformance-coverage-matrix/) breaks down support by surface item.\n\n| Surface | Status |\n|---|---|\n| BigQuery REST: Datasets / Tables / Jobs / TableData / Routines / Row Access Policies / Authorized Views | ✅ |\n| Multipart + resumable upload (`/upload/bigquery/v2/...`) | ✅ |\n| `INFORMATION_SCHEMA` (TABLES, COLUMNS, ROUTINES, VIEWS, JOBS, JOBS_BY_*, MATERIALIZED_VIEWS, PARTITIONS, TABLE_OPTIONS, …) | ✅ |\n| Storage Read API (Arrow + Avro) | ✅ |\n| Storage Write API (all 4 stream types, proto + Arrow row formats) | ✅ |\n| GoogleSQL function surface (date / time / string / array / struct / JSON / regex / aggregate / approx / civil-time / bit) | ✅ |\n| Procedural scripting (`DECLARE`, `BEGIN…END`, `IF`, `LOOP`, `EXCEPTION`, `BEGIN TRANSACTION`) | ✅ |\n| SQL / JavaScript / Table-valued UDFs | ✅ |\n| Time travel (`FOR SYSTEM_TIME AS OF`), snapshots, clones, materialized views | ✅ |\n| Authorized views + row access policies + caller identity | ✅ |\n| GEOGRAPHY / RANGE / INTERVAL / NUMERIC / BIGNUMERIC types | ✅ |\n| Load formats: CSV / JSON / Avro / ORC / Parquet | ✅ |\n| Extract formats: CSV / JSON / Avro / Parquet | ✅ |\n| BigQuery ML (`CREATE MODEL`, `ML.PREDICT`, …) | ❌ Out of scope — see [`docs/reference/out-of-scope.md`](docs/reference/out-of-scope.md) |\n| BI Engine / slot reservations / Data Transfer Service / scheduled queries | ❌ Out of scope |\n\n**Conformance corpus depth** (snapshot at v1.0 prep, 2026-05-21):\n\n| Status | Surface items | % of deterministic surface |\n|---|---|---|\n| 🟢🟢 Deep (≥6 fixtures) | 96 | 23.8% |\n| 🟢 Covered (3–5 fixtures) | 64 | 15.9% |\n| 🟡 Sampled (1–2 fixtures) | 236 | 58.6% |\n| 🔴 Uncovered (0 fixtures) | 7 | 1.7% |\n| **Total** | **403** | 100% |\n\nPlus **9 non-deterministic items** (`RAND`, `CURRENT_*`, `GENERATE_UUID`, `TABLESAMPLE`, `FOR SYSTEM_TIME AS OF \u003cexpression\u003e`) that are excluded from the conformance corpus by [ADR 0022](docs/adr/0022-conformance-corpus-design.md) and exercised in unit / property / integration tiers instead — bringing the full inventory to **412 surface items across 20 categories**, backed by **1,141 recorded fixtures** under `tests/conformance/sql_corpus/`.\n\nWe follow a **no-deferral principle**: features either ship complete or are excluded with documented rationale. There is no \"TODO for v1.1.\" Scope boundaries are catalogued in [`docs/reference/out-of-scope.md`](docs/reference/out-of-scope.md).\n\n## Documentation\n\nThe full documentation lives at **[jjviscomi.github.io/bqemulator](https://jjviscomi.github.io/bqemulator/)**. Key entry points:\n\n- [**Getting started**](https://jjviscomi.github.io/bqemulator/latest/getting-started/) — your first ten minutes.\n- [**Per-language quickstarts**](https://jjviscomi.github.io/bqemulator/latest/quickstart/python/) — Python · Node.js · Go · Java · pytest · docker-compose · Testcontainers.\n- [**Guides**](https://jjviscomi.github.io/bqemulator/latest/guides/loading-data/) — loading data, querying, streaming inserts, Storage API, UDFs, scripting, partitioning, time travel, materialized views, row access policies, dbt, Airflow, Spark, the `bq` CLI, observability, and more.\n- [**Reference**](https://jjviscomi.github.io/bqemulator/latest/reference/configuration/) — configuration, CLI, REST coverage, SQL function mapping, compatibility matrix, conformance coverage matrix, out-of-scope catalogue, troubleshooting.\n- [**Architecture**](https://jjviscomi.github.io/bqemulator/latest/architecture/overview/) — hexagonal architecture, storage model, SQL translation, jobs lifecycle, Storage Read/Write API design, scripting, UDFs, versioning, row access, specialized types, observability, testing strategy, conformance tier.\n- [**ADRs**](https://jjviscomi.github.io/bqemulator/latest/adr/0001-use-duckdb/) — 33 Architecture Decision Records documenting every non-obvious design choice.\n\n## Examples\n\nEvery example under [`docs/examples/`](docs/examples/) is a complete, runnable project with its own `make test` validated by CI:\n\n| Toolchain | Example | What it demonstrates |\n|---|---|---|\n| Python | [`python/pytest-integration`](docs/examples/python/pytest-integration/) | Flask app + auto-discovered `bqemu_client` fixture |\n| Python | [`python/dbt-local`](docs/examples/python/dbt-local/) | `dbt build` cycle via endpoint override |\n| Python | [`python/airflow-dag-test`](docs/examples/python/airflow-dag-test/) | `BigQueryInsertJobOperator` DAG via offline `dag.test()` |\n| Python | [`python/pyspark-bigquery`](docs/examples/python/pyspark-bigquery/) | Storage Read → Arrow → Spark DataFrame |\n| Node.js | [`nodejs/nestjs-app`](docs/examples/nodejs/nestjs-app/) | NestJS + Jest + supertest e2e |\n| Node.js | [`nodejs/cloud-run-local`](docs/examples/nodejs/cloud-run-local/) | Cloud Run-shaped Express + docker-compose |\n| Go | [`go/beam-pipeline`](docs/examples/go/beam-pipeline/) | Apache Beam Go SDK + Testcontainers |\n| Go | [`go/dataflow-local`](docs/examples/go/dataflow-local/) | Stand-alone Go ETL binary |\n| Java | [`java/spring-boot`](docs/examples/java/spring-boot/) | Spring Boot + Testcontainers |\n| Scala | [`java/scio`](docs/examples/java/scio/) | Spotify Scio (Scala-on-Beam) pipeline |\n| Compose | [`docker-compose/full-stack`](docs/examples/docker-compose/full-stack/) | App + emulator + Prometheus + Grafana |\n| CI | [`ci-recipes/github-actions`](docs/examples/ci-recipes/github-actions/) | Service-container + Testcontainers patterns |\n| CI | [`ci-recipes/gitlab-ci`](docs/examples/ci-recipes/gitlab-ci/) | `services:` alias on the CI network |\n| CI | [`ci-recipes/circleci`](docs/examples/ci-recipes/circleci/) | Docker-secondary + machine executor |\n\n## Project status\n\n`bqemulator` is at **v1.0.1** — first patch on the production-stable\nline. SemVer applies: breaking changes ship only in MAJOR\nversions, preceded by ≥1 MINOR with deprecation warnings;\ndeprecated APIs remain for ≥2 MINOR versions or 6 months.\n\nMaturity signals:\n\n- ✅ 33 Architecture Decision Records covering every non-obvious design choice (`docs/adr/0001`–`0033`).\n- ✅ ≥90% line + branch coverage gated by CI (`make verify`).\n- ✅ 7 test tiers passing (unit + property + integration + conformance + e2e + perf + chaos).\n- ✅ 5-client e2e matrix (Python · Node.js · Go · Java · `bq` CLI).\n- ✅ Mutation-tier (`mutmut`) pilot landed on pure-domain modules.\n- ✅ Fuzz-tier (`Atheris`) harnesses on the SQL translator, dynamic-protobuf decoder, and Arrow bridge.\n- ✅ Differential-tier row-order perturbation of the entire conformance corpus passes.\n- ✅ Performance baselines committed for `darwin-arm64`, with regression gates (`pytest-benchmark` `--benchmark-compare-fail=median:10%`).\n- ✅ PyPI publish via Trusted Publishing (sigstore-attested wheels) — `pip install bqemulator==1.0.1` resolves from [PyPI](https://pypi.org/project/bqemulator/).\n- ✅ GHCR publish with keyless cosign signatures — `docker pull ghcr.io/jjviscomi/bqemulator:1.0.1` resolves and the image is cosign-verifiable.\n\nSee [`CHANGELOG.md`](CHANGELOG.md) for the complete v1.0 inventory.\n\n## Contributing\n\nWe welcome contributions of all sizes. Start with **[CONTRIBUTING.md](CONTRIBUTING.md)** for the mechanics; **[AGENTS.md](AGENTS.md)** captures the project's day-to-day conventions; and **[`docs/architecture/overview.md`](docs/architecture/overview.md)** is the canonical architectural reference.\n\nPull requests are squash-merged into `main` with a Conventional Commits subject; commits carry a [DCO](https://developercertificate.org/) sign-off (`git commit -s`). The full review policy lives in [GOVERNANCE.md](GOVERNANCE.md).\n\n## Community\n\n- 💬 **[GitHub Discussions](https://github.com/jjviscomi/bqemulator/discussions)** — design questions, usage questions, and general help.\n- 🐛 **[Issues](https://github.com/jjviscomi/bqemulator/issues)** — bug reports and feature requests. Please search existing issues first.\n- 🔒 **[Security advisories](https://github.com/jjviscomi/bqemulator/security/advisories/new)** — report vulnerabilities privately via the GitHub Security Advisory flow (see [SECURITY.md](SECURITY.md) for our disclosure policy).\n- 📜 **[Code of Conduct](CODE_OF_CONDUCT.md)** — adapted from the Contributor Covenant 2.1.\n\n## License\n\n`bqemulator` is released under the **[Apache License 2.0](LICENSE)**.\n\n## Acknowledgements\n\n- [`goccy/bigquery-emulator`](https://github.com/goccy/bigquery-emulator) for blazing the trail and providing a decade of issue reports that seeded our regression corpus.\n- [DuckDB](https://duckdb.org/), [SQLGlot](https://github.com/tobymao/sqlglot), [FastAPI](https://fastapi.tiangolo.com/), [Pydantic](https://docs.pydantic.dev/), [Hatchling](https://hatch.pypa.io/), and the Google Cloud client library teams whose work makes this project tractable.\n- The [Apache Beam](https://beam.apache.org/), [dbt](https://www.getdbt.com/), [Airflow](https://airflow.apache.org/), [PySpark](https://spark.apache.org/), [Spotify Scio](https://spotify.github.io/scio/), [NestJS](https://nestjs.com/), and [Spring Boot](https://spring.io/projects/spring-boot) communities whose work the example projects compose with.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjjviscomi%2Fbqemulator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjjviscomi%2Fbqemulator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjjviscomi%2Fbqemulator/lists"}