From f5a44cce4ae0d0d0c107878f5ad28e04eac8e0a1 Mon Sep 17 00:00:00 2001 From: Cody Fincher Date: Sun, 25 May 2025 15:20:11 +0000 Subject: [PATCH] feat: updated test and documentation --- docs/supported-databases/index.rst | 1 + docs/supported-databases/mongodb.rst | 77 ++++++++++++++ pyproject.toml | 4 +- src/pytest_databases/docker/mongodb.py | 135 +++++++++++++++++++++++++ tests/test_mongodb.py | 104 +++++++++++++++++++ uv.lock | 86 +++++++++++++++- 6 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 docs/supported-databases/mongodb.rst create mode 100644 src/pytest_databases/docker/mongodb.py create mode 100644 tests/test_mongodb.py diff --git a/docs/supported-databases/index.rst b/docs/supported-databases/index.rst index 4a9941a..43fc970 100644 --- a/docs/supported-databases/index.rst +++ b/docs/supported-databases/index.rst @@ -15,6 +15,7 @@ This section provides detailed information on the supported databases, including bigquery cockroachdb yugabyte + mongodb redis valkey elasticsearch diff --git a/docs/supported-databases/mongodb.rst b/docs/supported-databases/mongodb.rst new file mode 100644 index 0000000..79913a4 --- /dev/null +++ b/docs/supported-databases/mongodb.rst @@ -0,0 +1,77 @@ +\ +MongoDB +======= + +Integration with `MongoDB `_, a NoSQL document-oriented database. + +This integration uses the official `PyMongo `_ driver to interact with MongoDB. + +Installation +------------ + +.. code-block:: bash + + pip install pytest-databases[mongodb] + + +Usage Example +------------- + +.. code-block:: python + + import pytest + import pymongo + from pytest_databases.docker.mongodb import MongoDBService + + pytest_plugins = ["pytest_databases.docker.mongodb"] + + def test_mongodb_service(mongodb_service: MongoDBService) -> None: + client = pymongo.MongoClient( + host=mongodb_service.host, + port=mongodb_service.port, + username=mongodb_service.username, + password=mongodb_service.password, + ) + # Ping the server to ensure connection + client.admin.command("ping") + client.close() + + def test_mongodb_connection(mongodb_connection: pymongo.MongoClient) -> None: + # mongodb_connection is an instance of pymongo.MongoClient + # You can use it to interact with the database + db = mongodb_connection["mydatabase"] + collection = db["mycollection"] + collection.insert_one({"name": "test_document", "value": 1}) + result = collection.find_one({"name": "test_document"}) + assert result is not None + assert result["value"] == 1 + # Clean up (optional, depending on your test needs) + collection.delete_one({"name": "test_document"}) + mongodb_connection.close() + + def test_mongodb_database(mongodb_database: pymongo.database.Database) -> None: + # mongodb_database is an instance of pymongo.database.Database + # This fixture provides a database that is unique per test function if xdist is used + # and xdist_mongodb_isolation_level is "database" (the default). + collection = mongodb_database["mycollection"] + collection.insert_one({"name": "another_document", "value": 2}) + result = collection.find_one({"name": "another_document"}) + assert result is not None + assert result["value"] == 2 + # No need to close the database object explicitly, the connection is managed by mongodb_connection + +Available Fixtures +------------------ + +* ``mongodb_service``: A fixture that provides a MongoDB service, giving access to connection details like host, port, username, and password. +* ``mongodb_connection``: A fixture that provides a ``pymongo.MongoClient`` instance connected to the MongoDB service. +* ``mongodb_database``: A fixture that provides a ``pymongo.database.Database`` instance. +* ``mongodb_image``: A fixture that returns the Docker image name used for the MongoDB service (default: "mongo:latest"). You can override this fixture to use a different MongoDB version. + +Service API +----------- + +.. automodule:: pytest_databases.docker.mongodb + :members: MongoDBService, _provide_mongodb_service + :undoc-members: + :show-inheritance: diff --git a/pyproject.toml b/pyproject.toml index 63a1ec2..ad7e55e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,7 @@ keywords = [ "azure", "valkey", "dragonflydb", + "mongodb", ] # options under https://pypi.org/classifiers/ classifiers = [ @@ -47,7 +48,7 @@ classifiers = [ "Programming Language :: Python :: Implementation :: PyPy", ] # direct dependencies of this package -dependencies = ["pytest", "filelock", "docker"] +dependencies = ["pytest", "filelock", "docker", "pymongo"] [project.urls] Documentation = "https://github.com/litestar-org/pytest-databases#readme" @@ -64,6 +65,7 @@ elasticsearch8 = ["elasticsearch8"] keydb = ["redis"] mariadb = ["mariadb"] minio = ["minio"] +mongodb = ["pymongo"] mssql = ["pymssql"] mysql = ["mysql-connector-python"] oracle = ["oracledb"] diff --git a/src/pytest_databases/docker/mongodb.py b/src/pytest_databases/docker/mongodb.py new file mode 100644 index 0000000..f6dbfec --- /dev/null +++ b/src/pytest_databases/docker/mongodb.py @@ -0,0 +1,135 @@ +from __future__ import annotations + +import contextlib +import traceback +from collections.abc import Generator +from dataclasses import dataclass +from typing import TYPE_CHECKING + +import pymongo +from pymongo.errors import ConnectionFailure +import pytest + +from pytest_databases.helpers import get_xdist_worker_num +from pytest_databases.types import ServiceContainer, XdistIsolationLevel + +if TYPE_CHECKING: + from collections.abc import Generator + + from pytest_databases._service import DockerService + from pymongo import MongoClient + from pymongo.database import Database + + +@dataclass +class MongoDBService(ServiceContainer): + username: str + password: str + database: str + + +@pytest.fixture(scope="session") +def xdist_mongodb_isolation_level() -> XdistIsolationLevel: + return "database" + + +@contextlib.contextmanager +def _provide_mongodb_service( + docker_service: DockerService, + image: str, + name: str, + isolation_level: XdistIsolationLevel, +) -> Generator[MongoDBService, None, None]: + username = "mongo_user" + password = "mongo_password" + default_database_name = "pytest_db" + + worker_num = get_xdist_worker_num() + database_name = f"{default_database_name}_{worker_num}" if worker_num is not None and isolation_level == "database" else default_database_name + + def check(_service: ServiceContainer) -> bool: + client: MongoClient | None = None + try: + client = pymongo.MongoClient( + host=_service.host, + port=_service.port, + username=username, + password=password, + serverSelectionTimeoutMS=2000, # Increased timeout for robust check + connectTimeoutMS=2000, + socketTimeoutMS=2000, + ) + client.admin.command("ping") + return True + except ConnectionFailure: + traceback.print_exc() + return False + finally: + if client: + client.close() + + with docker_service.run( + image=image, + name=name, + container_port=27017, # Default MongoDB port + env={ + "MONGO_INITDB_ROOT_USERNAME": username, + "MONGO_INITDB_ROOT_PASSWORD": password, + }, + check=check, + pause=0.5, # Time for MongoDB to initialize + timeout=120, # Total timeout for service to be ready + ) as service: + yield MongoDBService( + host=service.host, + port=service.port, + username=username, + password=password, + database=database_name + ) + + +@pytest.fixture(autouse=False, scope="session") +def mongodb_image() -> str: + return "mongo:latest" + + +@pytest.fixture(autouse=False, scope="session") +def mongodb_service( + docker_service: DockerService, + xdist_mongodb_isolation_level: XdistIsolationLevel, + mongodb_image: str, +) -> Generator[MongoDBService, None, None]: + with _provide_mongodb_service( + docker_service, mongodb_image, "mongodb", xdist_mongodb_isolation_level + ) as service: + yield service + + +@pytest.fixture(autouse=False, scope="session") +def mongodb_connection(mongodb_service: MongoDBService) -> Generator[MongoClient, None, None]: + client: MongoClient | None = None + try: + client = pymongo.MongoClient( + host=mongodb_service.host, + port=mongodb_service.port, + username=mongodb_service.username, + password=mongodb_service.password, + ) + yield client + finally: + if client: + client.close() + + +@pytest.fixture(autouse=False, scope="function") +def mongodb_database( + mongodb_connection: MongoClient, + mongodb_service: MongoDBService +) -> Generator[Database, None, None]: + """Provides a MongoDB database instance for testing.""" + db = mongodb_connection[mongodb_service.database] + yield db + # For a truly clean state per test, you might consider dropping the database here, + # but it depends on the desired test isolation and speed. + # e.g., mongodb_connection.drop_database(mongodb_service.database) diff --git a/tests/test_mongodb.py b/tests/test_mongodb.py new file mode 100644 index 0000000..9fc1387 --- /dev/null +++ b/tests/test_mongodb.py @@ -0,0 +1,104 @@ +from __future__ import annotations + +import pytest + + +@pytest.mark.parametrize( + "service_fixture", + [ + "mongodb_service", + ], +) +def test_service_fixture(pytester: pytest.Pytester, service_fixture: str) -> None: + pytester.makepyfile(f""" + import pymongo + pytest_plugins = ["pytest_databases.docker.mongodb"] + + def test({service_fixture}): + client = pymongo.MongoClient( + host={service_fixture}.host, + port={service_fixture}.port, + username={service_fixture}.username, + password={service_fixture}.password, + ) + client.admin.command("ping") + """) + + result = pytester.runpytest("-vv") + result.assert_outcomes(passed=1) + + +@pytest.mark.parametrize( + "connection_fixture", + [ + "mongodb_connection", + ], +) +def test_connection_fixture(pytester: pytest.Pytester, connection_fixture: str) -> None: + pytester.makepyfile(f""" + pytest_plugins = ["pytest_databases.docker.mongodb"] + + def test({connection_fixture}): + db = {connection_fixture}["test_db"] + collection = db["test_collection"] + collection.insert_one({{"key": "value"}}) + result = collection.find_one({{"key": "value"}}) + assert result is not None and result["key"] == "value" + """) + + result = pytester.runpytest("-vv") + result.assert_outcomes(passed=1) + + +def test_xdist_isolate_database(pytester: pytest.Pytester) -> None: + pytester.makepyfile(""" + pytest_plugins = ["pytest_databases.docker.mongodb"] + + def test_1(mongodb_database): + collection = mongodb_database["test_collection"] + collection.insert_one({{"key": "value1"}}) + result = collection.find_one({{"key": "value1"}}) + assert result is not None and result["key"] == "value1" + + def test_2(mongodb_database): + collection = mongodb_database["test_collection"] + # If isolation is working, this collection should be empty or not exist + result = collection.find_one({{"key": "value1"}}) + assert result is None + collection.insert_one({{"key": "value2"}}) + result = collection.find_one({{"key": "value2"}}) + assert result is not None and result["key"] == "value2" + """) + + result = pytester.runpytest("-n", "2") + result.assert_outcomes(passed=2) + + +def test_xdist_isolate_server(pytester: pytest.Pytester) -> None: + pytester.makepyfile(""" + import pytest + pytest_plugins = ["pytest_databases.docker.mongodb"] + + @pytest.fixture(scope="session") + def xdist_mongodb_isolation_level(): + return "server" + + def test_1(mongodb_connection): + # Operations in one test should not affect the other if server isolation is working, + # as they would be on different MongoDB server instances. + db = mongodb_connection["test_db_server_1"] + collection = db["test_collection"] + collection.insert_one({{"key": "server1"}}) + assert collection.count_documents({}) == 1 + + def test_2(mongodb_connection): + db = mongodb_connection["test_db_server_2"] # Different DB name to be sure + collection = db["test_collection"] + # This count should be 0 if it's a new server instance + assert collection.count_documents({}) == 0 + collection.insert_one({{"key": "server2"}}) + assert collection.count_documents({}) == 1 + """) + + result = pytester.runpytest("-n", "2") + result.assert_outcomes(passed=2) diff --git a/uv.lock b/uv.lock index be94081..eb7e7ee 100644 --- a/uv.lock +++ b/uv.lock @@ -631,6 +631,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" }, ] +[[package]] +name = "dnspython" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/4a/263763cb2ba3816dd94b08ad3a33d5fdae34ecb856678773cc40a3605829/dnspython-2.7.0.tar.gz", hash = "sha256:ce9c432eda0dc91cf618a5cedf1a4e142651196bbcd2c80e89ed5a907e5cfaf1", size = 345197, upload-time = "2024-10-05T20:14:59.362Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl", hash = "sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86", size = 313632, upload-time = "2024-10-05T20:14:57.687Z" }, +] + [[package]] name = "docker" version = "7.1.0" @@ -712,7 +721,7 @@ name = "exceptiongroup" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } wheels = [ @@ -1986,6 +1995,73 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, ] +[[package]] +name = "pymongo" +version = "4.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/0c/1fb60383ab4b20566407b87f1a95b7f5cda83e8d5594da6fc84e2a543405/pymongo-4.13.0.tar.gz", hash = "sha256:92a06e3709e3c7e50820d352d3d4e60015406bcba69808937dac2a6d22226fde", size = 2166443, upload-time = "2025-05-14T19:11:08.649Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/82/b19f8f3d1b78e432e1e2a6a2da4dd7bbf5535bce704c69ab14ea598e1af5/pymongo-4.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fe497c885b08600a022646f00f4d3303697c5289990acec250e2be2e1699ca23", size = 802525, upload-time = "2025-05-14T19:09:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d6/1a95ce6af3eb8398d8cadaf9b1429acb1c51ad62c7ec1be77606649f7543/pymongo-4.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2d377bb0811e0a9676bacb21a4f87ef307f2e9a40a625660c113a9c0ae897e8c", size = 802817, upload-time = "2025-05-14T19:09:21.573Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bb/4b2f2013127ff36b6f7f567f714f3d4452dce4559abe236ea98d0626e9e6/pymongo-4.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bac84ee40032bec4c089e92970893157fcd0ef40b81157404ceb4c1dac8ba72", size = 1180183, upload-time = "2025-05-14T19:09:23.63Z" }, + { url = "https://files.pythonhosted.org/packages/b9/32/f15f0b509797307905deadc7227aa83d824f4a2b419461534e8c25ef0149/pymongo-4.13.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea47a64ed9918be0fa8a4a11146a80f546c09e0d65fd08e90a5c00366a59bdb0", size = 1214410, upload-time = "2025-05-14T19:09:25.63Z" }, + { url = "https://files.pythonhosted.org/packages/7e/07/45a34e640cb863ddc514ee06845ea2c33312750eba6bbd6e5ab763eabf46/pymongo-4.13.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e90195cb5aee24a67a29adde54c1dae4d9744e17e4585bea3a83bfff96db46c", size = 1197340, upload-time = "2025-05-14T19:09:27.667Z" }, + { url = "https://files.pythonhosted.org/packages/70/59/ccab966891d536ff3efa36a111d424850efc96364412a117fda2acca9d17/pymongo-4.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4a7855933011026898ea0d4532fbd83cef63a76205c823a4ef5557d970df1f1", size = 1183356, upload-time = "2025-05-14T19:09:29.218Z" }, + { url = "https://files.pythonhosted.org/packages/3c/c7/fe84905f49cca6500dab25554f914dfb0ef95e77faa0cd87e4c5e1a81cbb/pymongo-4.13.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f39791a88cd5ec1760f65e878af419747c6f94ce74f9293735cbba6025ff4d0d", size = 1162513, upload-time = "2025-05-14T19:09:31.738Z" }, + { url = "https://files.pythonhosted.org/packages/87/aa/2752c1cdf67812703812199d4bbad2632ed801aa4736ebada43947dbf3ae/pymongo-4.13.0-cp310-cp310-win32.whl", hash = "sha256:209efd3b62cdbebd3cc7a76d5e37414ad08c9bfe8b28ae73695ade065d5b1277", size = 788539, upload-time = "2025-05-14T19:09:33.823Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ab/cc9ff174b4e60c02482685cdf7b76cfbe47640a46e2c026b987d8baded4f/pymongo-4.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:51081910a91e3451db74b7265ee290c72220412aa8897d6dfe28f6e5d80b685b", size = 797871, upload-time = "2025-05-14T19:09:35.3Z" }, + { url = "https://files.pythonhosted.org/packages/27/21/422381c97454a56021c50f776847c1db6082f84a0944dda3823ef76b4860/pymongo-4.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46c8bce9af98556110a950939f3eaa3f7648308d60df65feb783c780f8b9bfa9", size = 856909, upload-time = "2025-05-14T19:09:37.257Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e6/b34ab65ad524bc34dc3aa634d3dc411f65c495842ebb25b2d8593fc4bbed/pymongo-4.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc9e412911f210d9b0eca42d25c22d3725809dda03dedbaf6f9ffa192d461905", size = 857202, upload-time = "2025-05-14T19:09:38.862Z" }, + { url = "https://files.pythonhosted.org/packages/ff/62/17d3f8ff1d2ff67d3ed2985fdf616520362cfe4ae3802df0e9601d5686c9/pymongo-4.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9288188101506a9d1aa3f70f65b7f5f499f8f7d5c23ec86a47551d756e32059", size = 1426272, upload-time = "2025-05-14T19:09:41.103Z" }, + { url = "https://files.pythonhosted.org/packages/51/e2/22582d886d5a382fb605b3025047d75ec38f497cddefe86e29fca39c4363/pymongo-4.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5303e2074b85234e337ebe622d353ce38a35696cd47a7d970f84b545288aee01", size = 1477235, upload-time = "2025-05-14T19:09:43.099Z" }, + { url = "https://files.pythonhosted.org/packages/bd/e3/10bce21b8c0bf954c144638619099012a3e247c7d009df044f450fbaf340/pymongo-4.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d842e11eb94f7074314ff1d97a05790539a1d74c3048ce50ea9f0da1f4f96b0a", size = 1451677, upload-time = "2025-05-14T19:09:45.417Z" }, + { url = "https://files.pythonhosted.org/packages/30/10/4c54a4adf90a04e6147260e16f9cfeab11cb661d71ddd12a98449a279977/pymongo-4.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b63d9d8be87f4be11972c5a63d815974c298ada59a2e1d56ef5b6984d81c544a", size = 1430799, upload-time = "2025-05-14T19:09:47.516Z" }, + { url = "https://files.pythonhosted.org/packages/86/52/99620c5e106663a3679541b2316e0631b39cb49a6be14291597b28a8b428/pymongo-4.13.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d740560710be0c514bc9d26f5dcbb3c85dbb6b450c4c3246d8136ca84055bd", size = 1399450, upload-time = "2025-05-14T19:09:49.095Z" }, + { url = "https://files.pythonhosted.org/packages/f1/23/73d0379e46f98eed5339b6d44527e366b553c39327c69ba543f7beafb237/pymongo-4.13.0-cp311-cp311-win32.whl", hash = "sha256:936f7be9ed6919e3be7369b858d1c58ebaa4f3ef231cf4860779b8ba3b4fcd11", size = 834134, upload-time = "2025-05-14T19:09:50.682Z" }, + { url = "https://files.pythonhosted.org/packages/45/bd/d6286b923e852dc080330182a8b57023555870d875b7523454ad1bdd1579/pymongo-4.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:6a8f060f8ad139d1d45f75ef7aa0084bd7f714fc666f98ef00009efc7db34acd", size = 848068, upload-time = "2025-05-14T19:09:52.778Z" }, + { url = "https://files.pythonhosted.org/packages/42/5e/db6871892ec41860339e94e20fabce664b64c193636dc69b572503382f12/pymongo-4.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:007450b8c8d17b4e5b779ab6e1938983309eac26b5b8f0863c48effa4b151b07", size = 911769, upload-time = "2025-05-14T19:09:54.483Z" }, + { url = "https://files.pythonhosted.org/packages/86/8b/6960dc8baf2b6e1b809513160913e90234160c5df2dc1f2baf1cf1d25ac9/pymongo-4.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:899a5ea9cd32b1b0880015fdceaa36a41140a8c2ce8621626c52f7023724aed6", size = 911464, upload-time = "2025-05-14T19:09:56.253Z" }, + { url = "https://files.pythonhosted.org/packages/41/fb/d682bf1c4cb656f47616796f707a1316862f71b3c1899cb6b6806803dff6/pymongo-4.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0b26cd4e090161927b7a81741a3627a41b74265dfb41c6957bfb474504b4b42", size = 1690111, upload-time = "2025-05-14T19:09:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/03/d4/0047767ee5b6c66e4b5b67a5d85de14da9910ee8f7d8159e7c1d5d627358/pymongo-4.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b54e19e0f6c8a7ad0c5074a8cbefb29c12267c784ceb9a1577a62bbc43150161", size = 1754348, upload-time = "2025-05-14T19:10:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ea/e64f2501eaca552b0f303c2eb828c69963c8bf1a663111686a900502792d/pymongo-4.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6208b83e7d566935218c0837f3b74c7d2dda83804d5d843ce21a55f22255ab74", size = 1723390, upload-time = "2025-05-14T19:10:02.28Z" }, + { url = "https://files.pythonhosted.org/packages/d1/5c/fad80bc263281c8b819ce29ed1d88c2023c5576ecc608d15ca1628078e29/pymongo-4.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f33b8c1405d05517dce06756f2800b37dd098216cae5903cd80ad4f0a9dad08", size = 1693367, upload-time = "2025-05-14T19:10:04.405Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3d/4ff09614c996f8574d36008763b9fc01532ec7e954b5edde9254455b279b/pymongo-4.13.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02f0e1af87280697a1a8304238b863d4eee98c8b97f554ee456c3041c0f3a021", size = 1652496, upload-time = "2025-05-14T19:10:06.528Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2f/c4e54ac337e0ad3d91aae7de59849aaed28de6340112da2e2427f5e0c689/pymongo-4.13.0-cp312-cp312-win32.whl", hash = "sha256:5dea2f6b44697eda38a11ef754d2adfff5373c51b1ffda00b9fedc5facbd605f", size = 880497, upload-time = "2025-05-14T19:10:08.626Z" }, + { url = "https://files.pythonhosted.org/packages/6a/43/6595a52fe144bb0dae4d592e49c6c909f98033c4fa2eaa544b13e22ac6e8/pymongo-4.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:c03e02129ad202d8e146480b398c4a3ea18266ee0754b6a4805de6baf4a6a8c7", size = 898742, upload-time = "2025-05-14T19:10:10.214Z" }, + { url = "https://files.pythonhosted.org/packages/5a/dc/9afa6091bce4adad7cad736dcdc35c139a9b551fc61032ef20c7ba17eae5/pymongo-4.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92f5e75ae265e798be1a8a40a29e2ab934e156f3827ca0e1c47e69d43f4dcb31", size = 965996, upload-time = "2025-05-14T19:10:12.319Z" }, + { url = "https://files.pythonhosted.org/packages/36/69/e4242abffc0ee1501bb426d8a540e712e4f917491735f18622838b17f5a1/pymongo-4.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3d631d879e934b46222f5092d8951cbb9fe83542649697c8d342ea7b5479f118", size = 965702, upload-time = "2025-05-14T19:10:14.051Z" }, + { url = "https://files.pythonhosted.org/packages/fc/3e/0732876b48b1285bada803f4b0d7da5b720cf8f778d2117bbed9e04473a3/pymongo-4.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be048fb78e165243272a8cdbeb40d53eace82424b95417ab3ab6ec8e9b00c59b", size = 1953825, upload-time = "2025-05-14T19:10:16.214Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3b/6713fed92cab64508a1fb8359397c0720202e5f36d7faf4ed71b05875180/pymongo-4.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d81d159bd23d8ac53a6e819cccee991cb9350ab2541dfaa25aeb2f712d23b0a5", size = 2031179, upload-time = "2025-05-14T19:10:18.307Z" }, + { url = "https://files.pythonhosted.org/packages/89/2b/1aad904563c312a0dc2ff752acf0f11194f836304d6e15d05dff3a33df08/pymongo-4.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8af08ba2886f08d334bc7e5d5c662c60ea2f16e813a2c35106f399463fa11087", size = 1995093, upload-time = "2025-05-14T19:10:20.089Z" }, + { url = "https://files.pythonhosted.org/packages/4c/cc/33786f4ce9a46c776f0d32601b353f8c42b552ea9ff8060c290c912b661e/pymongo-4.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b91f59137e46cd3ff17d5684a18e8006d65d0ee62eb1068b512262d1c2c5ae8", size = 1955820, upload-time = "2025-05-14T19:10:21.788Z" }, + { url = "https://files.pythonhosted.org/packages/2d/dd/9a2a87bd4aab12a2281ac20d179912eed824cc6f67df49edd87fa4879b3e/pymongo-4.13.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61733c8f1ded90ab671a08033ee99b837073c73e505b3b3b633a55a0326e77f4", size = 1905394, upload-time = "2025-05-14T19:10:23.684Z" }, + { url = "https://files.pythonhosted.org/packages/04/be/0a70db5e4c4e1c162207e31eaa3debf98476e0265b154f6d2252f85969b0/pymongo-4.13.0-cp313-cp313-win32.whl", hash = "sha256:d10d3967e87c21869f084af5716d02626a17f6f9ccc9379fcbece5821c2a9fb4", size = 926840, upload-time = "2025-05-14T19:10:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/fb104175a7f15dd69691c8c32bd4b99c4338ec89fe094b6895c940cf2afb/pymongo-4.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9fe172e93551ddfdb94b9ad34dccebc4b7b680dc1d131bc6bd661c4a5b2945c", size = 949383, upload-time = "2025-05-14T19:10:27.234Z" }, + { url = "https://files.pythonhosted.org/packages/62/3f/c89a6121b0143fde431f04c267a0d49159b499f518630a43aa6288709749/pymongo-4.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:5adc1349fd5c94d5dfbcbd1ad9858d1df61945a07f5905dcf17bb62eb4c81f93", size = 1022500, upload-time = "2025-05-14T19:10:29.002Z" }, + { url = "https://files.pythonhosted.org/packages/4b/89/8fc36b83768b44805dd3a1caf755f019b110d2111671950b39c8c7781cd9/pymongo-4.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8e11ea726ff8ddc8c8393895cd7e93a57e2558c27273d3712797895c53d25692", size = 1022503, upload-time = "2025-05-14T19:10:30.757Z" }, + { url = "https://files.pythonhosted.org/packages/67/dc/f216cf6218f8ceb4025fd10e3de486553bd5373c3b71a45fef3483b745bb/pymongo-4.13.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c02160ab3a67eca393a2a2bb83dccddf4db2196d0d7c6a980a55157e4bdadc06", size = 2282184, upload-time = "2025-05-14T19:10:32.699Z" }, + { url = "https://files.pythonhosted.org/packages/56/32/08a9045dbcd76a25d36a0bd42c635b56d9aed47126bcca0e630a63e08444/pymongo-4.13.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fca24e4df05501420b2ce2207c03f21fcbdfac1e3f41e312e61b8f416c5b4963", size = 2369224, upload-time = "2025-05-14T19:10:34.942Z" }, + { url = "https://files.pythonhosted.org/packages/16/63/7991853fa6cf5e52222f8f480081840fb452d78c1dcd6803cabe2d3557a6/pymongo-4.13.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50c503b7e809e54740704ec4c87a0f2ccdb910c3b1d36c07dbd2029b6eaa6a50", size = 2328611, upload-time = "2025-05-14T19:10:36.791Z" }, + { url = "https://files.pythonhosted.org/packages/e9/0f/11beecc8d48c7549db3f13f2101fd1c06ccb668697d33a6a5a05bb955574/pymongo-4.13.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66800de4f4487e7c437991b44bc1e717aadaf06e67451a760efe5cd81ce86575", size = 2279806, upload-time = "2025-05-14T19:10:38.652Z" }, + { url = "https://files.pythonhosted.org/packages/17/a7/0358efc8dba796545e9bd4642d1337a9b67b60928c583799fb0726594855/pymongo-4.13.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82c36928c1c26580ce4f2497a6875968636e87c77108ff253d76b1355181a405", size = 2219131, upload-time = "2025-05-14T19:10:40.444Z" }, + { url = "https://files.pythonhosted.org/packages/58/d5/373cd1cd21eff769e22e4e0924dcbfd770dfa1298566d51a7097857267fc/pymongo-4.13.0-cp313-cp313t-win32.whl", hash = "sha256:1397eac713b84946210ab556666cfdd787eee824e910fbbe661d147e110ec516", size = 975711, upload-time = "2025-05-14T19:10:42.213Z" }, + { url = "https://files.pythonhosted.org/packages/b0/39/1e204091bdf264a0d9eccc21f7da099903a7a30045f055a91178686c0259/pymongo-4.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:99a52cfbf31579cc63c926048cd0ada6f96c98c1c4c211356193e07418e6207c", size = 1004287, upload-time = "2025-05-14T19:10:45.468Z" }, + { url = "https://files.pythonhosted.org/packages/84/e2/6b2bced59dba2e9108263821f6141d7742e8e9ef84c1e1b15dff6ee223bc/pymongo-4.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:267eff6a66da5cf5255b3bcd257984619e9c4d41a53578d4e1d827553a51cf40", size = 748144, upload-time = "2025-05-14T19:10:47.223Z" }, + { url = "https://files.pythonhosted.org/packages/84/a8/90aa028f3d2b8f498fac1768257d9493c7a986b936fe3d5b9dfd1616b9e0/pymongo-4.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:81b46d9bc62128c3d968336f8635bcfce33d8e9e1fc6be6ebdfb98effaccb9c7", size = 748431, upload-time = "2025-05-14T19:10:48.947Z" }, + { url = "https://files.pythonhosted.org/packages/92/dc/a643356995ac036f86f35e0e43cb1412e4f5b3128ae2398b208a9e8ef108/pymongo-4.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd0c9322fdf1b9e8a5c99ca337bd9a99d972ba57c976e77b5017366ba26725e1", size = 936094, upload-time = "2025-05-14T19:10:50.853Z" }, + { url = "https://files.pythonhosted.org/packages/7e/27/96e5dcfac38a9ebadb9c3b740f6660e6ed9372ccb5b62ab5efda35aeb299/pymongo-4.13.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4b4942e5566a134fe34c03d7182a0b346e4a478defe625dc430dd5a178ad96e", size = 953437, upload-time = "2025-05-14T19:10:52.689Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c5/a576862c4355cf350b8a66f0a079ed5858d52e123b93e71a9ec5f52f2ab5/pymongo-4.13.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cef461fae88ac51cd6b3f81adf58171113c58c0e77c82c751b3bdcef516cfeb1", size = 945102, upload-time = "2025-05-14T19:10:54.641Z" }, + { url = "https://files.pythonhosted.org/packages/77/11/e7a104523f40739809560675cfdd753a8524c53aeb9583c2a20481e7f068/pymongo-4.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb780d9d284ffdf7922edd4a6d7ba08e54a6680f85f64f91fa9cc2617dd488b7", size = 937994, upload-time = "2025-05-14T19:10:56.438Z" }, + { url = "https://files.pythonhosted.org/packages/c0/e6/6d23ee9aebccd85878f1f2851cf89e9c4090dd544dd2bb2fbc93d1131105/pymongo-4.13.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2afe49109b4d498d8e55ac9692915f2a3fce0bd31646bb7ed41f9ab3546ca19", size = 927655, upload-time = "2025-05-14T19:10:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/42/b4/9a33412c98774f9c79157acffe50786a9aa4781dca5b70b779eaa3d75cc5/pymongo-4.13.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d9a1d7d49d0d364520894116133d017b6e0e2d5131eb31c8553552fa77a65085", size = 910905, upload-time = "2025-05-14T19:11:00.593Z" }, + { url = "https://files.pythonhosted.org/packages/ac/45/0bc5ebe2e573d5945f15806b95bda4f1e816b64a7b9feefb555c342c10db/pymongo-4.13.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d684d9b385d97ab821d2ae74628c81a8bd12a4e5004a3ded0ec8c20381d62d0e", size = 937307, upload-time = "2025-05-14T19:11:02.636Z" }, + { url = "https://files.pythonhosted.org/packages/5a/2c/7bbbb4c8aa758f2c86005146f5ebd0c5ffeaf420f6f7f21e526c03efd4d1/pymongo-4.13.0-cp39-cp39-win32.whl", hash = "sha256:bd23119f9d0358aa1f78174d2eda88ca5c882a722e25ca31197402278acddc6e", size = 742944, upload-time = "2025-05-14T19:11:04.46Z" }, + { url = "https://files.pythonhosted.org/packages/81/d3/372eecea4ac8629a215e9f2e387d6d73e4a7698a4fcfaeb478f843c217fb/pymongo-4.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:e7d349066f4c229d638a30f1f53ec3a4aaf4a4fc568491bdf77e7415a96003fb", size = 747675, upload-time = "2025-05-14T19:11:06.839Z" }, +] + [[package]] name = "pymssql" version = "2.3.4" @@ -2123,6 +2199,7 @@ source = { editable = "." } dependencies = [ { name = "docker" }, { name = "filelock" }, + { name = "pymongo" }, { name = "pytest" }, ] @@ -2154,6 +2231,9 @@ mariadb = [ minio = [ { name = "minio" }, ] +mongodb = [ + { name = "pymongo" }, +] mssql = [ { name = "pymssql" }, ] @@ -2295,6 +2375,8 @@ requires-dist = [ { name = "psycopg", marker = "extra == 'cockroachdb'" }, { name = "psycopg", marker = "extra == 'postgres'", specifier = ">=3" }, { name = "psycopg2-yugabytedb", marker = "extra == 'yugabyte'" }, + { name = "pymongo" }, + { name = "pymongo", marker = "extra == 'mongodb'" }, { name = "pymssql", marker = "extra == 'mssql'" }, { name = "pytest" }, { name = "redis", marker = "extra == 'dragonfly'" }, @@ -2302,7 +2384,7 @@ requires-dist = [ { name = "redis", marker = "extra == 'redis'" }, { name = "valkey", marker = "extra == 'valkey'" }, ] -provides-extras = ["azure-storage", "bigquery", "cockroachdb", "dragonfly", "elasticsearch7", "elasticsearch8", "keydb", "mariadb", "minio", "mssql", "mysql", "oracle", "postgres", "redis", "spanner", "valkey", "yugabyte"] +provides-extras = ["azure-storage", "bigquery", "cockroachdb", "dragonfly", "elasticsearch7", "elasticsearch8", "keydb", "mariadb", "minio", "mongodb", "mssql", "mysql", "oracle", "postgres", "redis", "spanner", "valkey", "yugabyte"] [package.metadata.requires-dev] build = [{ name = "bump-my-version" }]