🐦 drongo
Mock Google Cloud Platform services in your tests - the moto for GCP.
drongo lets you test code that talks to Google Cloud without touching the
network, running an emulator, or paying for real resources. It stands up an
in-memory, in-process fake of GCP service APIs and transparently intercepts the
requests your google-cloud client libraries make.
If you've used moto for AWS, drongo will
feel immediately familiar - that's on purpose.
Installation
pip install drongo
drongo does not depend on the google-cloud client libraries - you bring your
own (google-cloud-storage, google-cloud-secret-manager, …). It mocks
whatever you already use.
Quickstart
from drongo import mock_gcp
@mock_gcp
def test_upload_download():
from google.cloud import storage
client = storage.Client(project="my-project")
bucket = client.create_bucket("my-bucket")
bucket.blob("hello.txt").upload_from_string("hello drongo")
assert bucket.blob("hello.txt").download_as_text() == "hello drongo"
assert [b.name for b in client.list_blobs("my-bucket")] == ["hello.txt"]
No credentials, no network, no emulator. storage.Client() works with or without
arguments - drongo supplies anonymous credentials and a default project while a
mock scope is active. It also works as a called decorator, a context manager, a
class decorator, or a unittest.TestCase mixin, and ships an auto-registered
drongo pytest fixture - see the
Quickstart guide.
Features
- 🎯 One decorator -
@mock_gcppatches every supported service, just like@mock_aws. - 🔌 Flexible - decorator, context manager, class decorator, or
unittest.TestCasemixin. - 🧠 In-memory & fast - no Docker, no emulators, no sockets; tests run in milliseconds.
- 🧬 Default clients, unchanged - drongo handles gRPC-first services behind the scenes.
- 🏃 Runs your code - opt-in executable handlers actually run your Python when a job runs, a task dispatches, or a message publishes.
- 🌐 Standalone server -
drongo serverspeaks real HTTP so SDKs in any language can point at it. - 🧪 pytest-native - a
drongofixture is auto-registered on install. - 🧩 Extensible - adding a service is
models.py+responses.py+urls.py, the same shape as moto. - ✅ Typed - ships
py.typed, checked with mypy.
Supported services
| Service | Transport | Docs |
|---|---|---|
| Cloud Storage | JSON API (default) | guide |
| Secret Manager | gRPC (default, forced to REST) | guide |
| Pub/Sub | gRPC (default, via emulator) | guide |
| BigQuery | REST/JSON (default) | guide |
| Cloud Tasks | gRPC (default, forced to REST) | guide |
| Cloud Run Jobs | gRPC (default, forced to REST) | guide |
| Resource Manager | gRPC (default, forced to REST) | guide |
| Firestore | gRPC (default, via emulator) | guide |
| IAM & Service Accounts | gRPC only (via injected transport) | guide |
| Cloud Logging | gRPC only (via injected transport) | guide |
| Cloud KMS | gRPC (default, forced to REST) | guide |
| Cloud Scheduler | gRPC (default, forced to REST) | guide |
Full capability matrix: Supported services. You can also fill the mocks with realistic Faker data, or run drongo as a standalone HTTP server for non-Python SDKs.
How it works
drongo mirrors moto's architecture, adapted from AWS/botocore to GCP's
REST+JSON APIs: HTTP services ship a models.py / responses.py / urls.py
trio behind the responses
interception layer, gRPC-first services run against an in-process emulator or a
forced-REST transport, and state is sharded through a BackendDict keyed by
project. See the
Architecture tour for the full
picture.
Roadmap
Available (8 services): Cloud Storage, Secret Manager, Pub/Sub, BigQuery, Cloud Tasks, Cloud Run Jobs, Resource Manager, Firestore - plus executable handlers, Faker seeding, and a standalone server.
Next up: Cloud Logging, Cloud KMS, IAM / Service Accounts, Cloud Scheduler, Cloud Functions, Datastore mode. See the full, tiered roadmap (services + capabilities, and how drongo compares to moto).
Want one sooner? Open an issue or contribute it.
Contributing
Contributions are very welcome! Adding a service is a great first PR. Start with
CONTRIBUTING.md and the
contributing-a-service guide.
git clone https://github.com/proxyroot/drongo
cd drongo
make install # editable install + dev tools
make check # ruff + mypy + pytest
License
Apache License 2.0 - the same license as moto.
Acknowledgements
drongo is heavily inspired by moto and owes
its design to that project. It is not affiliated with or endorsed by Google
or the moto maintainers.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file drongo-0.5.0.tar.gz.
File metadata
- Download URL: drongo-0.5.0.tar.gz
- Upload date:
- Size: 74.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
859ff696670a1d41802d300e3a6a20d4951582181dba14a1d8deae4302b5bdc0
|
|
| MD5 |
35ab10a8663dd3ed2b8da720a5f712a3
|
|
| BLAKE2b-256 |
3a3d650def5b1ea282025f762fbb7a1b92645dbcb2663ef9c459320423669726
|
Provenance
The following attestation bundles were made for drongo-0.5.0.tar.gz:
Publisher:
release.yml on proxyroot/drongo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
drongo-0.5.0.tar.gz -
Subject digest:
859ff696670a1d41802d300e3a6a20d4951582181dba14a1d8deae4302b5bdc0 - Sigstore transparency entry: 2287407251
- Sigstore integration time:
-
Permalink:
proxyroot/drongo@176e9f1e470e3c19d0109ac6a61b1089063dead4 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/proxyroot
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@176e9f1e470e3c19d0109ac6a61b1089063dead4 -
Trigger Event:
release
-
Statement type:
File details
Details for the file drongo-0.5.0-py3-none-any.whl.
File metadata
- Download URL: drongo-0.5.0-py3-none-any.whl
- Upload date:
- Size: 93.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bdd69746c5773debc5a60239d6f72934f90ebb398f577810317edd2556da2b79
|
|
| MD5 |
69626f0d41f064fb3281cfc1168073cf
|
|
| BLAKE2b-256 |
133186cdc8556a73cdfec6dc09af4777e8314f9401a596e98d87db4e7f50e236
|
Provenance
The following attestation bundles were made for drongo-0.5.0-py3-none-any.whl:
Publisher:
release.yml on proxyroot/drongo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
drongo-0.5.0-py3-none-any.whl -
Subject digest:
bdd69746c5773debc5a60239d6f72934f90ebb398f577810317edd2556da2b79 - Sigstore transparency entry: 2287407269
- Sigstore integration time:
-
Permalink:
proxyroot/drongo@176e9f1e470e3c19d0109ac6a61b1089063dead4 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/proxyroot
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@176e9f1e470e3c19d0109ac6a61b1089063dead4 -
Trigger Event:
release
-
Statement type: