A lightweight, in-memory mock for the ScyllaDB **Python** driver.
Project description
mockylla
A lightweight, in-memory mock for the ScyllaDB Python driver.
mockylla allows you to run integration-style tests for code that depends on ScyllaDB without requiring a live cluster.
✨ Key Features
- Drop-in replacement | Patch the
scylla-driverat runtime with a single decorator – no changes to your application code. - Fast & isolated | All state lives in-memory and is reset between tests, ensuring perfect test isolation.
- Inspectable | Helper utilities expose the internal state so you can assert against keyspaces, tables, and rows.
- Pythonic API | Mirrors the real driver's public API to minimise cognitive load and surprises.
- No network dependencies | Works entirely offline; ideal for CI pipelines and contributor development environments.
📦 Installation
pip install mockylla
mockylla supports Python 3.8 → 3.11 and is continuously tested against the latest scylla-driver release.
🚀 Quick Start
from mockylla import mock_scylladb, get_keyspaces
from cassandra.cluster import Cluster
@mock_scylladb
def test_my_app_creates_a_keyspace():
# Arrange – connect to the mocked cluster (no real network I/O!)
cluster = Cluster(["127.0.0.1"])
session = cluster.connect()
# Act – run application logic
session.execute(
"""
CREATE KEYSPACE my_app_keyspace \
WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1}
"""
)
# Assert – inspect mock state
assert "my_app_keyspace" in get_keyspaces()
Tip Place
@mock_scylladbon individual tests or a session-scoped fixture to enable the mock for an entire module.
🏗️ Comprehensive Example
from mockylla import mock_scylladb, get_table_rows
from cassandra.cluster import Cluster
@mock_scylladb
def test_crud():
cluster = Cluster()
session = cluster.connect()
session.execute(
"CREATE KEYSPACE ks WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}"
)
session.set_keyspace("ks")
session.execute(
"""
CREATE TABLE users (
user_id int PRIMARY KEY,
name text,
email text
)
"""
)
# INSERT
session.execute("INSERT INTO users (user_id, name, email) VALUES (1, 'Alice', 'alice@example.com')")
# SELECT
assert session.execute("SELECT name FROM users WHERE user_id = 1").one().name == "Alice"
# UPDATE
session.execute("UPDATE users SET email = 'alice@new.com' WHERE user_id = 1")
# DELETE
session.execute("DELETE FROM users WHERE user_id = 1")
# Final state check
assert get_table_rows("ks", "users") == []
📚 Examples
Browse the examples/ directory for more focused walkthroughs:
examples/00-basic-usage.md– scaffold a keyspace, table, and CRUD flow with the decorator.examples/01-prepared-statements.md– prepare, bind, and execute statements with tuple or mapping parameters.examples/02-batch-operations.md– mix stringBEGIN BATCHblocks withBatchStatementhelpers and mock batches.examples/03-async-queries.md– exerciseexecute_asyncflows and callbacks without a real cluster.examples/04-introspecting-state.md– inspect keyspaces, tables, UDTs, and rows via the helper utilities.
🔍 Public API
| Function / Decorator | Description |
|---|---|
mock_scylladb |
Context-manages the mock driver by patching cassandra.connection.Connection.factory & Cluster.connect. |
get_keyspaces() |
Return a dict of keyspace names → definition. |
get_tables(keyspace) |
Return a dict of table names → definition. |
get_table_rows(keyspace, table) |
Return the current rows for table as a list[dict]. |
get_types(keyspace) |
Return user-defined types for the keyspace. |
🗂️ Package Structure
The implementation now lives in the mockylla/classes/ package, split into focused modules:
state.py– in-memoryScyllaStateand helpers for inspecting tables, rows, and types.statements.py– prepared/bound/batch statement shims plus placeholder utilities.session.py–MockSession,MockCluster, and async response primitives.metadata.py– lightweight metadata facades mirroring the driver objects.scylladb.py– context manager + decorator that patch the driver and bootstrap state.
The top-level mockylla/__init__.py re-exports the public API unchanged for consumers.
📄 License
mockylla is distributed under the MIT license.
🙌 Acknowledgements
- Inspired by the fantastic
motoproject for AWS. - Built on top of the official
scylla-driverby ScyllaDB.
Project details
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 mockylla-0.5.0.tar.gz.
File metadata
- Download URL: mockylla-0.5.0.tar.gz
- Upload date:
- Size: 66.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
294e4d02d23ffcad32d9261221126355c7c15bfaa9698e43f822f5564c79fc71
|
|
| MD5 |
d8d1dc2d559022402865cbe21a482323
|
|
| BLAKE2b-256 |
5b59ab5f3351a7aa3b50c40c88e956f2ccabade7e2d166a0ffe80e9d02e2aff8
|
Provenance
The following attestation bundles were made for mockylla-0.5.0.tar.gz:
Publisher:
pypi_release.yml on GenLogs/mockylla
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mockylla-0.5.0.tar.gz -
Subject digest:
294e4d02d23ffcad32d9261221126355c7c15bfaa9698e43f822f5564c79fc71 - Sigstore transparency entry: 557560173
- Sigstore integration time:
-
Permalink:
GenLogs/mockylla@5e9672c6a12f0780626a577ff0654f0cce40cf1e -
Branch / Tag:
refs/tags/0.5.0 - Owner: https://github.com/GenLogs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi_release.yml@5e9672c6a12f0780626a577ff0654f0cce40cf1e -
Trigger Event:
push
-
Statement type:
File details
Details for the file mockylla-0.5.0-py3-none-any.whl.
File metadata
- Download URL: mockylla-0.5.0-py3-none-any.whl
- Upload date:
- Size: 40.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f46a1b82e3c0844792a8b51866657bb1e9a8b217b8f6a1740770cea4a093e7f
|
|
| MD5 |
0d6b9a9be7ab94dc8b84432967e74906
|
|
| BLAKE2b-256 |
3a26e81e80cefc424353029cc172055ccf825511d763ebb7fa81f8f4ec61fcfb
|
Provenance
The following attestation bundles were made for mockylla-0.5.0-py3-none-any.whl:
Publisher:
pypi_release.yml on GenLogs/mockylla
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mockylla-0.5.0-py3-none-any.whl -
Subject digest:
2f46a1b82e3c0844792a8b51866657bb1e9a8b217b8f6a1740770cea4a093e7f - Sigstore transparency entry: 557560189
- Sigstore integration time:
-
Permalink:
GenLogs/mockylla@5e9672c6a12f0780626a577ff0654f0cce40cf1e -
Branch / Tag:
refs/tags/0.5.0 - Owner: https://github.com/GenLogs
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi_release.yml@5e9672c6a12f0780626a577ff0654f0cce40cf1e -
Trigger Event:
push
-
Statement type: