diff --git a/docs/community/couchbase.rst b/docs/community/couchbase.rst new file mode 100644 index 00000000..df0c4296 --- /dev/null +++ b/docs/community/couchbase.rst @@ -0,0 +1,2 @@ +.. autoclass:: testcontainers.community.couchbase.CouchbaseContainer +.. title:: testcontainers.community.couchbase.CouchbaseContainer diff --git a/docs/modules/couchbase.md b/docs/modules/couchbase.md new file mode 100644 index 00000000..b4454ba2 --- /dev/null +++ b/docs/modules/couchbase.md @@ -0,0 +1,44 @@ +# Couchbase + +Since testcontainers-python :material-tag: v4.16.0 + +## Introduction + +The Testcontainers module for [Couchbase Server](https://www.couchbase.com/products/server/). + +## Adding this module to your project dependencies + +Please run the following command to add the Couchbase module to your python dependencies: + +```bash +pip install testcontainers[couchbase] +``` + +## Usage example + + + +[Creating a Couchbase container](couchbase_example.py) + + + +## Features + +- Single-node cluster with the Data, Query, Index and Search services +- Bucket, scope and collection created and ready before the container is returned +- Works with random host ports: the node advertises them through alternate addresses, so the SDK reaches every service +- Ready-to-use SDK `Cluster` through `client()` + +## Configuration + +The Couchbase container can be configured with the following parameters: + +- `image`: Couchbase Server image to use (default: `couchbase/server:community-8.0.2`). Any Couchbase Server image works, including Enterprise Edition images such as `couchbase/server:enterprise-8.0.0` +- `username`: Cluster administrator username (default: `Administrator`, or the `COUCHBASE_USERNAME` environment variable) +- `password`: Cluster administrator password (default: `password`, or the `COUCHBASE_PASSWORD` environment variable) +- `bucket`: Bucket to create (default: `default`, or the `COUCHBASE_BUCKET` environment variable) +- `scope`: Scope to create in the bucket (default: `_default`, or the `COUCHBASE_SCOPE` environment variable) +- `collection`: Collection to create in the scope (default: `_default`, or the `COUCHBASE_COLLECTION` environment variable) +- `bucket_ram_quota_mb`: RAM quota of the bucket in MB (default: `256`) + +The container needs about 1 GB of memory available to Docker. diff --git a/docs/modules/couchbase_example.py b/docs/modules/couchbase_example.py new file mode 100644 index 00000000..f47f0b48 --- /dev/null +++ b/docs/modules/couchbase_example.py @@ -0,0 +1,27 @@ +from testcontainers.community.couchbase import CouchbaseContainer + + +def basic_example(): + # Starts a single-node Couchbase Server (Community Edition) cluster with the + # Data, Query, Index and Search services, and creates the given keyspace. + with CouchbaseContainer(bucket="mybucket", scope="myscope", collection="mycollection") as couchbase: + cluster = couchbase.client() + collection = cluster.bucket("mybucket").scope("myscope").collection("mycollection") + + # Key-value operations + collection.upsert("user::1", {"name": "Alice", "city": "Bengaluru"}) + print(collection.get("user::1").content_as[dict]) + + # SQL++ query + for row in cluster.query("SELECT RAW 1 + 1"): + print(row) + + +def custom_image_example(): + # Any Couchbase Server image can be used, e.g. the Enterprise Edition + with CouchbaseContainer("couchbase/server:enterprise-8.0.0") as couchbase: + print(couchbase.get_connection_url()) + + +if __name__ == "__main__": + basic_example() diff --git a/mkdocs.yml b/mkdocs.yml index 761670cd..a0a8b425 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -58,6 +58,7 @@ nav: - modules/clickhouse.md - modules/cockroachdb.md - modules/cosmosdb.md + - modules/couchbase.md - modules/cratedb.md - modules/db2.md - modules/elasticsearch.md diff --git a/pyproject.toml b/pyproject.toml index 4ba4209e..aa01ef2e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,7 @@ cassandra = [] clickhouse = ["clickhouse-driver"] cosmosdb = ["azure-cosmos>=4"] cockroachdb = [] +couchbase = ["couchbase"] cratedb = [ "httpx", "sqlalchemy-cratedb" @@ -322,6 +323,10 @@ ignore_missing_imports = true module = ["cassandra.*"] ignore_missing_imports = true +[[tool.mypy.overrides]] +module = ["couchbase.*"] +ignore_missing_imports = true + [[tool.mypy.overrides]] module = ["testcontainers.registry"] ignore_missing_imports = true diff --git a/src/testcontainers/community/couchbase/__init__.py b/src/testcontainers/community/couchbase/__init__.py new file mode 100644 index 00000000..ae3c06e6 --- /dev/null +++ b/src/testcontainers/community/couchbase/__init__.py @@ -0,0 +1,238 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +import base64 +import json +import os +import time +import urllib.error +import urllib.request +from datetime import timedelta +from typing import Any, Optional +from urllib.parse import urlencode + +from couchbase.auth import PasswordAuthenticator +from couchbase.cluster import Cluster +from couchbase.diagnostics import ServiceType +from couchbase.options import ClusterOptions, ClusterTimeoutOptions, WaitUntilReadyOptions +from typing_extensions import Self + +from testcontainers.core.config import testcontainers_config as c +from testcontainers.core.container import DockerContainer +from testcontainers.core.wait_strategies import HttpWaitStrategy + +_DEFAULT_SCOPE = "_default" +_DEFAULT_COLLECTION = "_default" +_SERVICES = ("kv", "n1ql", "index", "fts") + +# Container ports used by the services this module enables (non-TLS). +# https://docs.couchbase.com/server/current/install/install-ports.html +_MGMT_PORT = 8091 +_VIEWS_PORT = 8092 +_QUERY_PORT = 8093 +_SEARCH_PORT = 8094 +_KV_PORT = 11210 + + +class CouchbaseContainer(DockerContainer): + """ + Couchbase Server container. + + Starts a single-node cluster running the Data, Query, Index and Search services, + and creates a bucket (and optionally a scope and collection) that is ready to use. + It uses the Community Edition image by default; pass ``image`` to use another one, + e.g. ``couchbase/server:enterprise-8.0.0``. + + Example: + + .. doctest:: + + >>> from testcontainers.community.couchbase import CouchbaseContainer + + >>> with CouchbaseContainer() as couchbase: + ... cluster = couchbase.client() + ... collection = cluster.bucket("default").default_collection() + ... _ = collection.upsert("greeting", {"hello": "world"}) + ... collection.get("greeting").content_as[dict] + {'hello': 'world'} + """ + + def __init__( + self, + image: str = "couchbase/server:community-8.0.2", + username: Optional[str] = None, + password: Optional[str] = None, + bucket: Optional[str] = None, + scope: Optional[str] = None, + collection: Optional[str] = None, + bucket_ram_quota_mb: int = 256, + **kwargs: Any, + ) -> None: + super().__init__(image=image, **kwargs) + self.username = username or os.environ.get("COUCHBASE_USERNAME", "Administrator") + self.password = password or os.environ.get("COUCHBASE_PASSWORD", "password") + self.bucket = bucket or os.environ.get("COUCHBASE_BUCKET", "default") + self.scope = scope or os.environ.get("COUCHBASE_SCOPE", _DEFAULT_SCOPE) + self.collection = collection or os.environ.get("COUCHBASE_COLLECTION", _DEFAULT_COLLECTION) + self.bucket_ram_quota_mb = bucket_ram_quota_mb + + self.with_exposed_ports(_MGMT_PORT, _VIEWS_PORT, _QUERY_PORT, _SEARCH_PORT, _KV_PORT) + # The node answers on /pools as soon as the management service is up, + # even before the cluster is initialized. + self.waiting_for(HttpWaitStrategy(_MGMT_PORT, "/pools")) + + def start(self) -> Self: + super().start() + self._initialize_cluster() + self._create_bucket() + if self.scope != _DEFAULT_SCOPE: + self._post(_MGMT_PORT, f"/pools/default/buckets/{self.bucket}/scopes", {"name": self.scope}) + if self.collection != _DEFAULT_COLLECTION: + self._post( + _MGMT_PORT, + f"/pools/default/buckets/{self.bucket}/scopes/{self.scope}/collections", + {"name": self.collection}, + ) + self._wait_for_query_keyspace() + return self + + def get_connection_url(self) -> str: + return f"couchbase://{self.get_container_host_ip()}:{self.get_exposed_port(_KV_PORT)}" + + def client(self, cluster_options: Optional[ClusterOptions] = None) -> Cluster: + """Return a connected :class:`couchbase.cluster.Cluster`.""" + if cluster_options is None: + cluster_options = ClusterOptions( + PasswordAuthenticator(self.username, self.password), + timeout_options=ClusterTimeoutOptions(kv_timeout=timedelta(seconds=10)), + ) + cluster = Cluster(self.get_connection_url(), cluster_options) + cluster.wait_until_ready( + timedelta(seconds=30), + WaitUntilReadyOptions(service_types=[ServiceType.KeyValue, ServiceType.Query, ServiceType.Search]), + ) + return cluster + + def _initialize_cluster(self) -> None: + # Mirrors the REST-based setup recommended for scripted cluster initialization: + # https://docs.couchbase.com/server/current/manage/manage-nodes/initialize-node.html + internal_ip = self.get_docker_client().bridge_ip(str(self.get_wrapped_container().id)) + self._post(_MGMT_PORT, "/node/controller/rename", {"hostname": internal_ip}, auth=False) + self._post(_MGMT_PORT, "/node/controller/setupServices", {"services": ",".join(_SERVICES)}, auth=False) + self._post( + _MGMT_PORT, + "/pools/default", + {"memoryQuota": 256, "indexMemoryQuota": 256, "ftsMemoryQuota": 256}, + auth=False, + ) + self._post( + _MGMT_PORT, + "/settings/web", + {"username": self.username, "password": self.password, "port": "SAME"}, + auth=False, + ) + + # Advertise the host-mapped ports so SDKs running on the host can reach every service. + host = self.get_container_host_ip() + self._request( + "PUT", + _MGMT_PORT, + "/node/controller/setupAlternateAddresses/external", + { + "hostname": host, + "mgmt": self.get_exposed_port(_MGMT_PORT), + "capi": self.get_exposed_port(_VIEWS_PORT), + "n1ql": self.get_exposed_port(_QUERY_PORT), + "fts": self.get_exposed_port(_SEARCH_PORT), + "kv": self.get_exposed_port(_KV_PORT), + }, + ) + + # Community Edition only supports the ForestDB-based standard GSI storage mode. + is_enterprise = self._get(_MGMT_PORT, "/pools").get("isEnterprise", False) + storage_mode = "memory_optimized" if is_enterprise else "forestdb" + self._post(_MGMT_PORT, "/settings/indexes", {"storageMode": storage_mode}) + + def _create_bucket(self) -> None: + self._post( + _MGMT_PORT, + "/pools/default/buckets", + { + "name": self.bucket, + "bucketType": "couchbase", + "storageBackend": "couchstore", + "ramQuotaMB": self.bucket_ram_quota_mb, + "replicaNumber": 0, + "flushEnabled": 1, + }, + ) + self._poll(self._is_bucket_ready, f"bucket '{self.bucket}' to become ready") + + def _is_bucket_ready(self) -> bool: + # The bucket config is what SDKs bootstrap from, so wait until it is served + # and advertises every enabled service (index ports are named e.g. "indexAdmin"). + try: + nodes = self._get(_MGMT_PORT, f"/pools/default/b/{self.bucket}").get("nodesExt", []) + except OSError: + return False + return bool(nodes) and all( + any(name.startswith(service) for name in node.get("services", {})) + for node in nodes + for service in _SERVICES + ) + + def _wait_for_query_keyspace(self) -> None: + statement = f'SELECT COUNT(*) > 0 AS present FROM system:keyspaces WHERE name = "{self.bucket}"' + + def is_present() -> bool: + try: + result = self._post(_QUERY_PORT, "/query/service", {"statement": statement}) + except OSError: + return False + return bool(result.get("results") and result["results"][0].get("present")) + + self._poll(is_present, f"bucket '{self.bucket}' to be queryable") + + @staticmethod + def _poll(condition: Any, description: str) -> None: + deadline = time.monotonic() + c.timeout + while time.monotonic() < deadline: + if condition(): + return + time.sleep(c.sleep_time) + raise TimeoutError(f"Timed out after {c.timeout}s waiting for {description}") + + def _get(self, port: int, path: str) -> Any: + return self._request("GET", port, path) + + def _post(self, port: int, path: str, data: dict[str, Any], auth: bool = True) -> Any: + return self._request("POST", port, path, data, auth) + + def _request( + self, method: str, port: int, path: str, data: Optional[dict[str, Any]] = None, auth: bool = True + ) -> Any: + url = f"http://{self.get_container_host_ip()}:{self.get_exposed_port(port)}{path}" + body = urlencode(data).encode() if data is not None else None + request = urllib.request.Request(url, data=body, method=method) + if auth: + token = base64.b64encode(f"{self.username}:{self.password}".encode()).decode() + request.add_header("Authorization", f"Basic {token}") + try: + with urllib.request.urlopen(request, timeout=30) as response: + payload = response.read().decode() + except urllib.error.HTTPError as e: + e.msg = f"{e.msg}: {e.read().decode(errors='replace')}" + raise + try: + return json.loads(payload) if payload else None + except json.JSONDecodeError: + return payload diff --git a/tests/community/couchbase/test_couchbase.py b/tests/community/couchbase/test_couchbase.py new file mode 100644 index 00000000..7f8ab1d4 --- /dev/null +++ b/tests/community/couchbase/test_couchbase.py @@ -0,0 +1,35 @@ +import uuid + +import pytest + +from testcontainers.community.couchbase import CouchbaseContainer + + +def test_docker_run_couchbase_default_collection(): + with CouchbaseContainer() as couchbase: + cluster = couchbase.client() + collection = cluster.bucket("default").default_collection() + key = uuid.uuid4().hex + collection.upsert(key, {"hello": "world"}) + assert collection.get(key).content_as[dict] == {"hello": "world"} + + +# The versions below should reflect the latest Community Edition releases +@pytest.mark.parametrize("image", ["couchbase/server:community-7.6.2", "couchbase/server:community-8.0.2"]) +def test_docker_run_couchbase_custom_keyspace(image): + with CouchbaseContainer( + image, + username="administrator", + password="secret-password", + bucket="mybucket", + scope="myscope", + collection="mycollection", + ) as couchbase: + cluster = couchbase.client() + collection = cluster.bucket("mybucket").scope("myscope").collection("mycollection") + key = uuid.uuid4().hex + collection.upsert(key, {"hello": "world"}) + assert collection.get(key).content_as[dict] == {"hello": "world"} + + rows = cluster.query("SELECT RAW 1 + 1").rows() + assert list(rows) == [2] diff --git a/uv.lock b/uv.lock index fe018a7c..14691872 100644 --- a/uv.lock +++ b/uv.lock @@ -946,6 +946,47 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "couchbase" +version = "4.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/23/cc/3bbd2f3fde058b5720be6f44d9622bad34c7fc24cc9aa9e7cc5b3968356a/couchbase-4.6.3.tar.gz", hash = "sha256:c027821d1d6a89ffd80f21d81903cd3f6ba164c0217c022ca3323748369f8789", size = 6725143, upload-time = "2026-08-25T18:42:10.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/77/ba5d40a3259a663ea2592057a71acf3b0ab4d363cf0546175fb4fffd4b84/couchbase-4.6.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:59b5457bc50a11fcb06546aca8b1692a4da4cf11fba4de191d47a535d8580ee9", size = 5713184, upload-time = "2026-08-25T18:39:43.671Z" }, + { url = "https://files.pythonhosted.org/packages/35/a4/9318e5f749c97f12374860816bfc596439334355171a7ceda96819198da4/couchbase-4.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c9b598bc6f67cfafb24e34f81b9956e04b9cf1163697e545c25ded2c8bf7e854", size = 4937608, upload-time = "2026-08-25T18:39:46.987Z" }, + { url = "https://files.pythonhosted.org/packages/17/84/b0581b1a716f67413adc05fcb5c0a4b77d86800ed70cd5b298bf2adeb7e5/couchbase-4.6.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:320d8e092003404d81ac6d226dbdea700897bc77de8ca6981eac5db6e7e6544d", size = 5760186, upload-time = "2026-08-25T18:39:51.672Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ab/b4c962a10c463853453ee24f9c62d0eda49ad52c25c4a7110a463fe92423/couchbase-4.6.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19e336d9da9e7cafe0a704d258aaa802d1ebe49f1d953e21e3ca710758bbbb35", size = 6045812, upload-time = "2026-08-25T18:39:56.132Z" }, + { url = "https://files.pythonhosted.org/packages/c8/02/153054b68a0ffef05b76b5e02f614b237760bdfa2de6194d8f67bc9f768f/couchbase-4.6.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:33717db77b303fd95aa97a0e34261f8909409419193d4849afbdb9ec9a552d55", size = 7596374, upload-time = "2026-08-25T18:40:00.527Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/0778091910ed4dda88787068a1e499acd27a8f65a82c1a1f7d7eb1e0ac4d/couchbase-4.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:20f756ac84200fb30116318356f5313244b121f80e2b355f054cb419d954f0d1", size = 5139484, upload-time = "2026-08-25T18:40:03.932Z" }, + { url = "https://files.pythonhosted.org/packages/32/3a/5af724236f570824637a320d7e684d8d86b78c82bf0879028047fd30749a/couchbase-4.6.3-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:e254169ad28fec524ee6a9f1b3425351e02583071a6747d5da0d4e0b339ff1dd", size = 5796510, upload-time = "2026-08-25T18:40:08.153Z" }, + { url = "https://files.pythonhosted.org/packages/6a/f8/1d42bc683e03ed408a1ecef006cbbc91c5984f604bb03543716a5e01efee/couchbase-4.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67fb01084e9a8b0c6f449349c9a6786854c4883266e02cc542ae6ec118a1baf1", size = 4937606, upload-time = "2026-08-25T18:40:13.106Z" }, + { url = "https://files.pythonhosted.org/packages/0d/13/c629ffef038f82d3051fdc92aa30995725300b30c1935642c32ee6456c72/couchbase-4.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3648461c714e2396db2fd0c7d3301dc38704314ee679de2b04b2e67444675ba6", size = 5760169, upload-time = "2026-08-25T18:40:18.466Z" }, + { url = "https://files.pythonhosted.org/packages/30/6f/11e4e1925e317bb1f1f1efc7b73ba17e37dd9a5debefa191a57696d8a499/couchbase-4.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b91ecf488f6920ffa178bee740febaeddce717519cb1440495dcb6adad28b1d", size = 6045811, upload-time = "2026-08-25T18:40:23.919Z" }, + { url = "https://files.pythonhosted.org/packages/68/61/7bca35ee6bee0b284c0f64cc17127422d4a6d55640cd41d31329ce89eca1/couchbase-4.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f79011b87553b13d34b90011403801d9102652b38e1710644dc7b71f5ee31f31", size = 7596559, upload-time = "2026-08-25T18:40:30.893Z" }, + { url = "https://files.pythonhosted.org/packages/52/92/1fc30af14231012d3c7013b12fbb55789013719c3b24e30fd403825362e0/couchbase-4.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:d02c32d00024c4fcebde37896c916c20771fb6f8030afabb90014c18c2e3acb1", size = 5140282, upload-time = "2026-08-25T18:40:34.649Z" }, + { url = "https://files.pythonhosted.org/packages/3d/91/93550a39b3b09d4ebc3ad7c5e80cf10d52501a52ed1d88b0bdabb392929f/couchbase-4.6.3-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9ad48c028768e681371aaac3d358d1659343a3a9cdf45b6a55e715bc97bb7b5a", size = 5795320, upload-time = "2026-08-25T18:40:39.995Z" }, + { url = "https://files.pythonhosted.org/packages/48/3e/a75309536c863b9e2b793899d54fcd0f264307112797fa31e5ace3821a6c/couchbase-4.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de571b1fba505166ce37f578d0ac9ce5ebe2e192e9379a97e8fff4111b63eeff", size = 4937836, upload-time = "2026-08-25T18:40:45.512Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d1/6d8c0b9b0953f95a9eafc0de6869cd086914a8f2aec64d959e48ed72b7ce/couchbase-4.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1f223cd0dfab67843c48b48e94a360d3e737d3809203d76e8b9a0400bedb48bd", size = 5765288, upload-time = "2026-08-25T18:40:49.585Z" }, + { url = "https://files.pythonhosted.org/packages/11/16/0019fc07afedcaacae030405e175419aa5040492927b492a2ddb687ddd94/couchbase-4.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7457ccfc2d3ad82bafebae940c448e62dca66ba606c1d215616acec9efebaeb", size = 6052368, upload-time = "2026-08-25T18:40:53.718Z" }, + { url = "https://files.pythonhosted.org/packages/75/db/1417353f538ceac11734c6ee60682f6739987a5497cf9c29f74533d122d1/couchbase-4.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d7062e51ab779752d1074ef601b70d7f850167296fb17f2dd89242f92f2842fb", size = 7601788, upload-time = "2026-08-25T18:40:58.838Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c5/b170415bbc34676d6bba5e1364fef2f08e6779ab469a472160faf16b490d/couchbase-4.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:fdda5b864f2924e5b4990874449cb291555b7829fb95357d0d675719c583f65e", size = 5138010, upload-time = "2026-08-25T18:41:03.588Z" }, + { url = "https://files.pythonhosted.org/packages/38/e9/e802bc449fd95d774da26dd28fc9fab89ec13b89558e4d431f310ff8a87e/couchbase-4.6.3-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:8d85813f6605c7cbdb28524352fbb90f1a7aba5a1dcc64968f881f77da398038", size = 5711442, upload-time = "2026-08-25T18:41:08.448Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f7/f074d8107145ecbc62faed0ee539be5734ca8a62a3779741494c1f09d807/couchbase-4.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f030959329a8cded5864f94e68398295b8ab9b1adbcbb605cb3cf5dd44410f36", size = 4937833, upload-time = "2026-08-25T18:41:11.84Z" }, + { url = "https://files.pythonhosted.org/packages/87/7c/3ba6b8dc8613f00dab2821adfdcf4479388e1b97e29089ad16da37cb4ecb/couchbase-4.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5505ec2d1624b5689a4b10081b49a7c676bb9d102b639b15b6b49b088bee6e7d", size = 5765293, upload-time = "2026-08-25T18:41:15.201Z" }, + { url = "https://files.pythonhosted.org/packages/c8/7e/de53d494b19022a1ca4c8546956c89b869bccd9b0d692b2d53593d69f3e1/couchbase-4.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:23d2987a143fbd08cd2acb4420d90384e0d91200f5b09a7416da77d3162622ca", size = 6052364, upload-time = "2026-08-25T18:41:18.795Z" }, + { url = "https://files.pythonhosted.org/packages/54/97/1a2b42f76f8a6c36b703e60c369c73725398acd96d0d2fba5ab499e102e1/couchbase-4.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:712c09d99e3f345c19308aea51b295fa060b4ad3a3a2342e39bc51cf016e58be", size = 7601787, upload-time = "2026-08-25T18:41:23.093Z" }, + { url = "https://files.pythonhosted.org/packages/5c/15/37091adbc2c5c772b24eb12db422f94c0cce2bf1da79eda99911491a5e4f/couchbase-4.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:668f81b5de543d00622dacd468c1a3f00b3d784fd872d82f9467a371292d1be6", size = 5136433, upload-time = "2026-08-25T18:41:26.755Z" }, + { url = "https://files.pythonhosted.org/packages/20/5a/c82c5efc20dd5181e5fcd53aeaf9cea6160230591501870e8f18a1c941a0/couchbase-4.6.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:252ac4f00d981a8ab0843d39e40a7f3c25d49e6f3435421b0d60627de547f211", size = 5712672, upload-time = "2026-08-25T18:41:32.18Z" }, + { url = "https://files.pythonhosted.org/packages/71/96/fa69d089251edf64505668063b9d76b92fa93cdb44ad29f64fdc82c6b661/couchbase-4.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:19e4ae64a5dcfaf39946cb5d895c0fc5b02ae726429ed237d700433afd49943d", size = 4937977, upload-time = "2026-08-25T18:41:38.109Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0c/2c591a3340a13076fe542f7f59f808e53e90cd9f9d67988cff1d7dc6261a/couchbase-4.6.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a9ac2f2569da20bd2804440a71a21cf08fcaba378332f5be6c9a7523e9b34f2d", size = 5765538, upload-time = "2026-08-25T18:41:44.524Z" }, + { url = "https://files.pythonhosted.org/packages/6c/90/e20b5d1fda20c1bba22c210efd20d8e223dfbb41cbf88006447131fdd759/couchbase-4.6.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bc43af4ce2bd16d6f3b9f804df9c4f7315cc8ce2ce2664928d29513f8487e550", size = 6052195, upload-time = "2026-08-25T18:41:49.612Z" }, + { url = "https://files.pythonhosted.org/packages/88/bf/e254e91dcc7e14ca238c3af145cc25c30aa9258f03a0194ae1d85d6d1843/couchbase-4.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:52b00223dec10299f66d7190626d35e69b2804a222b2a409c10f143a9708e77d", size = 7602227, upload-time = "2026-08-25T18:41:56.756Z" }, + { url = "https://files.pythonhosted.org/packages/bb/22/bf077d5b6aff88e0915278b7b87ce8c2d2214bbc8799f0a3137bc01eb731/couchbase-4.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:e06d5dd6ebf4997fe32abe8053ee57b5a2efbf357a5f2737407d6d5695f4b060", size = 5282207, upload-time = "2026-08-25T18:42:03.663Z" }, +] + [[package]] name = "coverage" version = "7.14.1" @@ -1251,7 +1292,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1541,14 +1582,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/21/117c8710abb7f146d804a124c07eb5964a60b90d02b72452885aecc18efa/greenlet-3.5.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:7eacb17a9d41538a2bc4912eba5ef13823c83cb69e4d141d0813debe7163187f", size = 283510, upload-time = "2026-05-20T13:12:26.475Z" }, { url = "https://files.pythonhosted.org/packages/b9/f7/6762a56fa5f6c2295c449c6524e10ce481e381c994cc44d9d03aef0700fb/greenlet-3.5.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e5cc9606aa5f4e0bde0d3bd502b44f743864c3ffa5cfa1011b1e30f5aa02366f", size = 599696, upload-time = "2026-05-20T14:00:02.906Z" }, { url = "https://files.pythonhosted.org/packages/0f/05/85a511e68ee109aff0aa00b4b497806091dd2d82ce209e49c6e801bd5d92/greenlet-3.5.1-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c3d35f87c7253b715d13d679e0783d845910144f282cb939fe1ba4ac8616269c", size = 612618, upload-time = "2026-05-20T14:05:39.202Z" }, + { url = "https://files.pythonhosted.org/packages/2e/19/60df45065b2981ff894fdd51e7c99a3a4b107412822b083d88d5d528f663/greenlet-3.5.1-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:00929c98ec525fd9bf075875d8c5f6a983a90906cdf78a66e6de2d8e466c2a19", size = 619237, upload-time = "2026-05-20T14:09:06.421Z" }, { url = "https://files.pythonhosted.org/packages/89/b8/8b83d18ae07c46c019617f35afd7b47aab7f9b4fbb12fc637d681e10bdd8/greenlet-3.5.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:540dae7b956209af4d70a3be35927b4055f617763771e5e84a5255bea934d2f5", size = 612947, upload-time = "2026-05-20T13:14:23.469Z" }, + { url = "https://files.pythonhosted.org/packages/26/9a/4ba4c2bc9d9df5f41bb8943fb7bb11e440352e6b9c2e36716b6e85f8b82d/greenlet-3.5.1-cp310-cp310-manylinux_2_39_riscv64.whl", hash = "sha256:001775efe7b8e758861294c7a27c28af87f3f3f1c20468a2bc618c45b346c061", size = 415653, upload-time = "2026-05-20T14:01:36.999Z" }, { url = "https://files.pythonhosted.org/packages/5d/14/ad1f9fc9b82384c010212464a3702bd911f95dab2f1180bc6fbcfb1f958c/greenlet-3.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed8cdb691169715a9a492844a83246f090182247d1a5031dc78a403f68ba1e97", size = 1571425, upload-time = "2026-05-20T14:02:22.671Z" }, { url = "https://files.pythonhosted.org/packages/46/1c/43b8203cf10f4292c9e3d270e9e5f5ade79115a0a0ca5ea6f1be5f8915a7/greenlet-3.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d59e840387076a51016777a9328b3f2c427c6f9208a6e958bad251be50a648d", size = 1638688, upload-time = "2026-05-20T13:14:30.026Z" }, { url = "https://files.pythonhosted.org/packages/ac/6e/0344b1e99f58f71715456e46492101fd2daa408957b8186ade0a4b515da7/greenlet-3.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:b9152fca4a6466e114aaec745ae61cba739903a109754a9d4e1262f01e9259b1", size = 237763, upload-time = "2026-05-20T13:11:35.659Z" }, { url = "https://files.pythonhosted.org/packages/42/3c/ff890b466eaba2b0f5e6bdfff025f8c75f41b8ffdc3dbc3d24ad261e764a/greenlet-3.5.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:73f78f9b9f0a5c06e5c946ba1e8e36f5114923b6be109ee618c54f079c3ea14f", size = 284764, upload-time = "2026-05-20T13:09:10.204Z" }, { url = "https://files.pythonhosted.org/packages/81/0e/5e5457be3d256918f6a4756f073548a3f0190836e2cc94aa6d0d617a940b/greenlet-3.5.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0cbed8bb44e23c5b199f888f4e4ce096b45ad9f25ff74a7ad0213875e936bb2", size = 603479, upload-time = "2026-05-20T14:00:04.757Z" }, { url = "https://files.pythonhosted.org/packages/6d/e1/f89a21d58d308298e6f275f13a1b472ed96c680b601a371b08be6a725989/greenlet-3.5.1-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a203a8bd0acb0701653d3bbb26e404854a68674139ed5cbb778830f42b09bb33", size = 615495, upload-time = "2026-05-20T14:05:40.87Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f2/8fd452fd81adb9ec79c8275c1375702ab0fd6bee4952da12eaa09b9508d8/greenlet-3.5.1-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ebeb75c81211f5c702576cf81f315e77e23cfdb2c7c6fcb9dd143e6de35c360", size = 623515, upload-time = "2026-05-20T14:09:07.853Z" }, { url = "https://files.pythonhosted.org/packages/75/de/af6cef182862d2ccd6975440d21c9058a77c3f9b469abf94e322dfd2e0e3/greenlet-3.5.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a271fcd66c74615cda6a964fda3f304267a12e50a084472218a39bb0376f563", size = 614754, upload-time = "2026-05-20T13:14:24.947Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bc/c318aa9f3ffc77320fddcee3d892be957b42e2ff947198d9450b004f3a38/greenlet-3.5.1-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:017a544f0385d441e88714160d089d6900ef46c9eff9d99b6715a5ef2d127747", size = 418439, upload-time = "2026-05-20T14:01:38.446Z" }, { url = "https://files.pythonhosted.org/packages/1a/c6/50e520283a9f19388a7326b05f9e8637e566003475eacaadad04f558c68d/greenlet-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ded7b068c7c31c1a8657d4fd42d886b3e051ae29f88b80c5ff9d502257b0f071", size = 1574097, upload-time = "2026-05-20T14:02:24.003Z" }, { url = "https://files.pythonhosted.org/packages/21/1c/13abd1f4860d987fa5e1170a01930d6e6cd40d328de487a3c9fdaff0ffd0/greenlet-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0932b81d72f552ded9d810d00021b64d89f2195a91ce115b893f943b7a4ab3c", size = 1641058, upload-time = "2026-05-20T13:14:31.83Z" }, { url = "https://files.pythonhosted.org/packages/f5/56/5f332b7705545eac2dc01b4e9254d24a793f2656d55d5cc6b94ee59d22ae/greenlet-3.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:88e300d136eac057b2397aa1cfd7328b4c87c7eb66a09c7bc6a1292234db474e", size = 238089, upload-time = "2026-05-20T13:14:03.229Z" }, @@ -1556,7 +1601,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c4/37/4549f149c9797c21b32c2683c33522af22522099de128b2406672526d005/greenlet-3.5.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:fa4f98af3a528f0c3fd592a26df7f376f93329c8f4d987f6bb979057af8bf5e2", size = 286220, upload-time = "2026-05-20T13:07:28.463Z" }, { url = "https://files.pythonhosted.org/packages/38/ff/a4f436709716965eaab9f36ea7b906c8a927fbe32fb1372a2071d964f6b1/greenlet-3.5.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffea73584b216150eab159b6d12348fb253e68757974de1e2c40d8a318ac89ed", size = 601585, upload-time = "2026-05-20T14:00:06.141Z" }, { url = "https://files.pythonhosted.org/packages/65/ad/54bc3fcee3ad368a61b19b67d88117f7a8c29727bf71fffdeda81fbd946e/greenlet-3.5.1-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1072b4f9edcc1e192d9283a66a3e68d6b84c561de33a83d7858beb9ba1effe10", size = 614215, upload-time = "2026-05-20T14:05:42.675Z" }, + { url = "https://files.pythonhosted.org/packages/7c/6c/de5b1b388cd2d9fbdfeab324863daba37d54e6e233ddbefd70b385a8c591/greenlet-3.5.1-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:89101bfd5011e069be974903cb3a4e4523845e4ece2d62dcd8d358933c0ef249", size = 620094, upload-time = "2026-05-20T14:09:09.18Z" }, { url = "https://files.pythonhosted.org/packages/40/69/b91cda0647df839483201545913514c2827ebea5e5ccdf931842763bc127/greenlet-3.5.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:add5217d68b31130f0beca584d7fef4878327d2e31642b66618a14eef312b63b", size = 611358, upload-time = "2026-05-20T13:14:26.37Z" }, + { url = "https://files.pythonhosted.org/packages/4a/43/1204baffab8a6476464795a7ccf394a3248d4f22c9f87173a15b36b6d971/greenlet-3.5.1-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:e6cd99ea59dd5d89f0c956606571d79bfe6f68c9eb7f4a4083a41a7f1587edee", size = 422782, upload-time = "2026-05-20T14:01:39.597Z" }, { url = "https://files.pythonhosted.org/packages/59/90/3cf77e080350cd02fa307bb2abf05df48f4482c240275bbd2c203ba8bb1c/greenlet-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a5ea42a752d47a145eae922b605cd1634665ac3d5ec1e72402d5048e8d60d207", size = 1570475, upload-time = "2026-05-20T14:02:25.29Z" }, { url = "https://files.pythonhosted.org/packages/65/2c/18cece62045e74598c3c393f70dce4a63f56222015ba29a5d4eeb04f764c/greenlet-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5551170cf4f5ff5623e9af81323751979fee2c731e2287b61f73cd27257b823", size = 1635625, upload-time = "2026-05-20T13:14:34.027Z" }, { url = "https://files.pythonhosted.org/packages/30/f5/310d104ddf41eb5a70f4c268d22508dfb0c3c8e86fec152be34d0d2ed819/greenlet-3.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:3c8bb982ad117d29478ef8f5533e97df21f1e2befd17a299257b0c96d1371c0b", size = 238791, upload-time = "2026-05-20T13:10:39.018Z" }, @@ -1564,7 +1611,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/69/7f7e5372d998b81001899b1c0823c957aa413ba0f2662e65821611cc31e4/greenlet-3.5.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:51518ff74664078fc51bffcc6fc529b0df5ae58da192691cee765d45ce944a2b", size = 285060, upload-time = "2026-05-20T13:08:51.899Z" }, { url = "https://files.pythonhosted.org/packages/b1/bf/387f9b6b865fd2ae0d0be09e0004827295a01b71be76ed350dd1e28a91a4/greenlet-3.5.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ffdb3c0bb002c99cd8f298957e046c3dbf6006b5b7cdf11a4e19194624a0a0a", size = 604370, upload-time = "2026-05-20T14:00:07.492Z" }, { url = "https://files.pythonhosted.org/packages/32/f5/169ce3d4e4c67291bd18f8cbe0299c9f3e45102c7f1fb3c14780c93e4532/greenlet-3.5.1-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7715a5a2c3378ba602c3a440558261e13a820bb53a82693aacd7b7f6d964e283", size = 616987, upload-time = "2026-05-20T14:05:44.237Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/c24110c55dffa55aa6e1d98b45310da33801aeba7686ff0190fe5d46fd32/greenlet-3.5.1-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d40a890035c0058cadbdc4af7569800fd28a0e527a0fdbb7b5f9418f176846ce", size = 622911, upload-time = "2026-05-20T14:09:10.598Z" }, { url = "https://files.pythonhosted.org/packages/ee/e5/7f2e41d5273be07e77560d61ea4e56485b4d6c316d2a84518c62d1364061/greenlet-3.5.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc71ff466927a201b08305acac451ebe1aedfcea002f62f1f2f2ac2ac1e6a135", size = 613911, upload-time = "2026-05-20T13:14:27.539Z" }, + { url = "https://files.pythonhosted.org/packages/ec/7b/d20db2e8a5ad6c038702f3179b136f93f0a3d1a21a0c0777f3e470cdf4b2/greenlet-3.5.1-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:67821bb03e4e98664490edb787ff6af501194c29bbee0f5c1dfdcf1dc3d9d436", size = 425228, upload-time = "2026-05-20T14:01:40.837Z" }, { url = "https://files.pythonhosted.org/packages/c5/a4/fbdc67579b73615a1f91615e814303cc71e06128f7baaba87be79b8fb90c/greenlet-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cd443683db272ebaaca03af98c0b063ab30db70ea8a31a1559f35e3f7b744ccd", size = 1570689, upload-time = "2026-05-20T14:02:27.225Z" }, { url = "https://files.pythonhosted.org/packages/e6/b4/77abbe35078be39718a46cd49caf16bceb35662f97a34101dca28aa98e47/greenlet-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:089fff7a6ce8d9316d1f65ebc00273a56be258c1725b32b94de90a3a979557e1", size = 1635602, upload-time = "2026-05-20T13:14:36.344Z" }, { url = "https://files.pythonhosted.org/packages/37/f7/129f27ca700845b8ee8ca88ce7f43435a1239c2eddb7677fc938822762cf/greenlet-3.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:110a1ca7b49b014b097f6078272c3f4ed31af45b254de5228b79adba879f6af9", size = 238683, upload-time = "2026-05-20T13:11:50.57Z" }, @@ -1572,7 +1621,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/cb/c62454606daf5640369c94d8a9dd540599b1bfc090e2d2180cb77f4038d2/greenlet-3.5.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:d8ab31c9de8651a2facdd5c5bb0011f2380dd1a7af78ce2adf4b56095294fc07", size = 285579, upload-time = "2026-05-20T13:08:56.396Z" }, { url = "https://files.pythonhosted.org/packages/ec/71/c4270398c2eba968a6071af1dfbdcaeee6ec1c24bc8b435b8cc452700da6/greenlet-3.5.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e300185139abc337ade480c327183adf42a875ac7181bfe66d7d4efea31fbea", size = 651106, upload-time = "2026-05-20T14:00:09.448Z" }, { url = "https://files.pythonhosted.org/packages/1a/ab/71e34b78a44ec271fb5f550c17bc46d301ddc5953890d935f270b0dcdb5a/greenlet-3.5.1-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7ffdb990dcaa0234cf9845aead5df2e3c3a8b6507d409274dd87e0d5ab05ffc2", size = 663478, upload-time = "2026-05-20T14:05:45.88Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2d/2d80842910da44f78c286532d084b8a5c3717c844ae80ceb3858738ae89a/greenlet-3.5.1-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c09df69dc1712d131332054a858a3e5cca400967fa3a672e2324fbb0971448c", size = 667767, upload-time = "2026-05-20T14:09:12.15Z" }, { url = "https://files.pythonhosted.org/packages/77/96/4efd6fa5c62c85426a0c19077a586258ebc3a2a146ff2493e4312a697a22/greenlet-3.5.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f82b3597e9d83b63408affed0b48fd0f54935edac4302237b9a837be0dae33c", size = 660800, upload-time = "2026-05-20T13:14:29.129Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d3/dad2eecedfbb1ed7050a20dcfae40c1442b74bc7423608be2c7e03ee7133/greenlet-3.5.1-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:a4764e0bfc6a4d114c865b32520805c16a990ef5f286a514413b05d5ecd6a23d", size = 470786, upload-time = "2026-05-20T14:01:42.064Z" }, { url = "https://files.pythonhosted.org/packages/7a/e0/6c71401a25cac7000261304e866a2f2cc04dc74810d40e2f118aa4799495/greenlet-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c0141e37414c10164e702b8fb1473304221ad98f71600850c6ef7ff4880feba0", size = 1617518, upload-time = "2026-05-20T14:02:28.662Z" }, { url = "https://files.pythonhosted.org/packages/41/26/c5c06643e8c0af9e7bf18e16cb51d0ab7625155f0392e1c9015d66d556cd/greenlet-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:50ae25a67bea74ea41fb14b960bc532df73eb713417b2d61892dced82fe8d3bc", size = 1681593, upload-time = "2026-05-20T13:14:39.417Z" }, { url = "https://files.pythonhosted.org/packages/8a/bd/e11a108317485075e68af9d23039619b86b28130c3b50d227d42edece64b/greenlet-3.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:8a17c42330e261299766b75ac1ea32caa437a9453c8f65d16a13140db378ecd3", size = 239800, upload-time = "2026-05-20T13:09:30.128Z" }, @@ -1580,14 +1631,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/90/12/41bf27fde4d3605d3773ae57751eda182b8be2f5398011c041173b1d9534/greenlet-3.5.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:ea8da1e900d758d078810d4255d8c6aa572181896a31ec79d779eb79c3adc9ad", size = 293637, upload-time = "2026-05-20T13:12:35.529Z" }, { url = "https://files.pythonhosted.org/packages/44/44/ba14b23e9757707050c2f397d305bbcae62e5d7cad122f8b6baec5ae4a1f/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a19570c52a21420dcbc94e661994bc325c0b5b11304540fed514586da5dc8f2e", size = 650840, upload-time = "2026-05-20T14:00:11.079Z" }, { url = "https://files.pythonhosted.org/packages/a8/37/5ddc2b686a6844f91abecef43411842426da2e1573f60b49ecf2547f4ae1/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3d955c89b75eeca4723d7cc14135f393cd47c32e2a6cb4a8e4c6e760a26b0986", size = 656416, upload-time = "2026-05-20T14:05:47.118Z" }, + { url = "https://files.pythonhosted.org/packages/8c/46/5987dcd1a2570ba84f3b187536b2ca3ae97613387e57f5cfa99df068fe5e/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ea37d5a157eb9493820d3792ac4ece28619a394391d2b9f2f78057d396ff0f0f", size = 656607, upload-time = "2026-05-20T14:09:13.949Z" }, { url = "https://files.pythonhosted.org/packages/e1/f0/d17510297c35a2992712f0bf84de3779749999f7d3d63aa1f09db7c62dbe/greenlet-3.5.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2daaaebd1a5aa88c49045b6baf9310b3263796bd88db713edf37cf53e7bb4e", size = 654397, upload-time = "2026-05-20T13:14:30.696Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c1/6da0a9ddcc29d7e51ef14883fa3dc1e53b3f4ffba00582106c7bf55da1d8/greenlet-3.5.1-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:8d8a23250ea3ec7b36de8fa4b541e9e2db3ee82915cc060ab0631609ad8b28de", size = 488287, upload-time = "2026-05-20T14:01:43.143Z" }, { url = "https://files.pythonhosted.org/packages/37/eb/147387705bb89092645b012586e7273cb5ed3c90ef7eaf3a69173eaf0209/greenlet-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bfbd69cc349e43bf3a8ae1c85548ff0718efc887615c2db16c3833d7b0b072d", size = 1614469, upload-time = "2026-05-20T14:02:30.192Z" }, { url = "https://files.pythonhosted.org/packages/a6/4e/37ee0da7732b7aa9896f17e15579a9df34b9fcb9dd494f0adfa749af6623/greenlet-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4378720dd888136c27215a0214d32a4d37c3852765d45bc37aad0623423cfd78", size = 1675115, upload-time = "2026-05-20T13:14:40.972Z" }, { url = "https://files.pythonhosted.org/packages/57/f3/97dfcf4a6eb5077f8a672234216fb5923eb89f2cab7081cb10b2cf75b605/greenlet-3.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:45718441607f9325d948db98cbc691276059316d0358c188c246da4e1d4d23d2", size = 245246, upload-time = "2026-05-20T13:12:22.646Z" }, { url = "https://files.pythonhosted.org/packages/5d/73/d7f72e34b582f694f4a9b248162db7b09cc458a259ba8f0c0bfa1a34ea7d/greenlet-3.5.1-cp315-cp315-macosx_11_0_universal2.whl", hash = "sha256:2baee5ca02031757ffe8cc3d69f0cc0aec7065ce362622da74f32d3bcab1c541", size = 285575, upload-time = "2026-05-20T13:12:07.043Z" }, { url = "https://files.pythonhosted.org/packages/df/59/fa9c6e87dc8ad27a95dabe2f29f372b733d05a8a67470f6c901ed9975655/greenlet-3.5.1-cp315-cp315-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b1ec3274918a81d3ea778b9e75b56b72b33f300edb6cf7f3a7fe1dae56683de", size = 656428, upload-time = "2026-05-20T14:00:12.556Z" }, { url = "https://files.pythonhosted.org/packages/f6/f9/e753408871eaa61dfe35e619cfc67512b036fde99893685d50eea9e07146/greenlet-3.5.1-cp315-cp315-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:111e2390ffffc47d5840b01711dd7fac07d4c09283d0283e7f3264b14e284c64", size = 667064, upload-time = "2026-05-20T14:05:48.662Z" }, + { url = "https://files.pythonhosted.org/packages/dc/74/807a047255bf1e09303627c46dc043dca596b6958a354d904f32ab382005/greenlet-3.5.1-cp315-cp315-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:10a9a1c0bfbc93d41156ffcb90c75fbc05544054faf15dcc1fdf9765f8b607f0", size = 672962, upload-time = "2026-05-20T14:09:15.532Z" }, { url = "https://files.pythonhosted.org/packages/96/27/5565b5b40389f1c7753003a07e21892fda8660926787036d5bc0308b8113/greenlet-3.5.1-cp315-cp315-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e630136e905fe5ff43e86945ae41220b6d1470956a39220e708110ac48d01ea5", size = 665697, upload-time = "2026-05-20T13:14:32.943Z" }, + { url = "https://files.pythonhosted.org/packages/76/32/19d4e13225193c29b13e308015223f7d75fd3d8623d49dd19040d2ce8ec1/greenlet-3.5.1-cp315-cp315-manylinux_2_39_riscv64.whl", hash = "sha256:ef08c1567c78074b22d1a200183d52d04a14df447bf70bcbb6a3507a48e776fc", size = 476047, upload-time = "2026-05-20T14:01:44.39Z" }, { url = "https://files.pythonhosted.org/packages/cf/82/e7de4178c0c2d1c9a5a3be3cc0b33e46a85b3ee4a77c071bf7ad8600e079/greenlet-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:975eac34b44a7077ca4d421348455b94f0f518246a7f14bc6d2fdcfe5b584368", size = 1621256, upload-time = "2026-05-20T14:02:31.91Z" }, { url = "https://files.pythonhosted.org/packages/00/10/f2dddcf7dacac17dfc68691809589adad06135eb28930429cf58a6467a2f/greenlet-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:9ab3c3a0b2ae6198e67c898dad5215a49f9ae0d0081b3c3ec59f333e39eeca26", size = 1685956, upload-time = "2026-05-20T13:14:42.55Z" }, { url = "https://files.pythonhosted.org/packages/22/17/4a232b32133230ada52f70e9d7f5b65b0caef8772f01849bd8d149e7e4ca/greenlet-3.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:cbfc69be86e10dcfef5b1e6269d1d6926552aa89ee39e1de3353360c1b6989ab", size = 239802, upload-time = "2026-05-20T13:13:15.481Z" }, @@ -1595,7 +1650,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7a/57/816d9cff29119da3505b3d6a5e14a8af89006ac36f47f891ff293ee05af1/greenlet-3.5.1-cp315-cp315t-macosx_11_0_universal2.whl", hash = "sha256:a6fdf2433a5441ef9a95464f7c3e674775da1c8c1177fff311cee1acad4626ed", size = 293877, upload-time = "2026-05-20T13:10:19.078Z" }, { url = "https://files.pythonhosted.org/packages/23/a1/59b0a7c7d140ff1a75626680b9a9899b79a9176cab298b394968fb023295/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7546556f0d649f99f6a361098a55f761181bb2ea12ff150bb16d26092ad88244", size = 655333, upload-time = "2026-05-20T14:00:14.758Z" }, { url = "https://files.pythonhosted.org/packages/72/1b/5efe127597625042218939d01855109f352779050768b670b52edcc16a6c/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5ee3ea898009fa898f85f9982255d35278c477bebe185beca249cab42d4526c", size = 659443, upload-time = "2026-05-20T14:05:50.159Z" }, + { url = "https://files.pythonhosted.org/packages/c9/9d/1dcdf7b95ab3cf8c7b6d7277c18a5e167312f2b362ddfcc5d5e6d8d84b43/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a57b0d05a0448eed231d59c0ceb287dde984551e54cbc51ac2d4865712838e9c", size = 659998, upload-time = "2026-05-20T14:09:16.912Z" }, { url = "https://files.pythonhosted.org/packages/6c/6d/c404246ea4d22d097a7426d0efb5b781bd7eb67715f09e79001bd552ab18/greenlet-3.5.1-cp315-cp315t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5c81f74d204d3edd136ebfd50dce53acbb776995d721a0fe801626cfc93b8cd", size = 658356, upload-time = "2026-05-20T13:14:35.091Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/c4959664fc231d587d66d8e81f2095e98056ba1954beafdcbe635e251052/greenlet-3.5.1-cp315-cp315t-manylinux_2_39_riscv64.whl", hash = "sha256:b0703c2cef53e01baec47f7a3868009913ad71ec678bbecb42a6f40895e4ce62", size = 494470, upload-time = "2026-05-20T14:01:45.611Z" }, { url = "https://files.pythonhosted.org/packages/51/02/f8ee37fb6d2219329f350af241c27fcf12df57e723d11f6fc6d3bacdadaa/greenlet-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:2c18ef16bf6d4dd410e4dd52996888ea1497be26892fe5bbc73580aba4287b8e", size = 1619216, upload-time = "2026-05-20T14:02:33.403Z" }, { url = "https://files.pythonhosted.org/packages/93/c5/3dc9475ace2c7a3680da12372cddd7f1ac874eb410a1ac48d3e9dab83782/greenlet-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:17d86354f0ae6b61bf9be5148d0dd34e06c3cb7c602c671f79f29ac3b150e659", size = 1678427, upload-time = "2026-05-20T13:14:43.71Z" }, { url = "https://files.pythonhosted.org/packages/df/4e/750c15c317a41ffb36f0bf40b933e3d744a7dede61889f74443ea69690cf/greenlet-3.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:e7516cf6ae6b8a582c2770a0caed47b8a48373ed732c33d69a72913ae6ac923e", size = 245225, upload-time = "2026-05-20T13:13:59.366Z" }, @@ -1872,7 +1929,7 @@ name = "importlib-metadata" version = "9.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp" }, + { name = "zipp", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } wheels = [ @@ -3331,10 +3388,10 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, - { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "python-dateutil", marker = "python_full_version < '3.11'" }, + { name = "pytz", marker = "python_full_version < '3.11'" }, + { name = "tzdata", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } wheels = [ @@ -3409,9 +3466,9 @@ resolution-markers = [ "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" } }, - { name = "python-dateutil" }, - { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, + { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } wheels = [ @@ -5126,8 +5183,8 @@ name = "secretstorage" version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "jeepney" }, + { name = "cryptography", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "jeepney", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ @@ -5204,23 +5261,23 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" } }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, - { name = "tomli" }, + { name = "alabaster", marker = "python_full_version < '3.11'" }, + { name = "babel", marker = "python_full_version < '3.11'" }, + { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "imagesize", marker = "python_full_version < '3.11'" }, + { name = "jinja2", marker = "python_full_version < '3.11'" }, + { name = "packaging", marker = "python_full_version < '3.11'" }, + { name = "pygments", marker = "python_full_version < '3.11'" }, + { name = "requests", marker = "python_full_version < '3.11'" }, + { name = "snowballstemmer", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } wheels = [ @@ -5237,23 +5294,23 @@ resolution-markers = [ "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "roman-numerals" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, + { name = "alabaster", marker = "python_full_version == '3.11.*'" }, + { name = "babel", marker = "python_full_version == '3.11.*'" }, + { name = "colorama", marker = "python_full_version == '3.11.*' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "imagesize", marker = "python_full_version == '3.11.*'" }, + { name = "jinja2", marker = "python_full_version == '3.11.*'" }, + { name = "packaging", marker = "python_full_version == '3.11.*'" }, + { name = "pygments", marker = "python_full_version == '3.11.*'" }, + { name = "requests", marker = "python_full_version == '3.11.*'" }, + { name = "roman-numerals", marker = "python_full_version == '3.11.*'" }, + { name = "snowballstemmer", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.11.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } wheels = [ @@ -5279,23 +5336,23 @@ resolution-markers = [ "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "roman-numerals" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, + { name = "alabaster", marker = "python_full_version >= '3.12'" }, + { name = "babel", marker = "python_full_version >= '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "imagesize", marker = "python_full_version >= '3.12'" }, + { name = "jinja2", marker = "python_full_version >= '3.12'" }, + { name = "packaging", marker = "python_full_version >= '3.12'" }, + { name = "pygments", marker = "python_full_version >= '3.12'" }, + { name = "requests", marker = "python_full_version >= '3.12'" }, + { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } wheels = [ @@ -5479,6 +5536,9 @@ clickhouse = [ cosmosdb = [ { name = "azure-cosmos" }, ] +couchbase = [ + { name = "couchbase" }, +] cratedb = [ { name = "httpx" }, { name = "sqlalchemy-cratedb" }, @@ -5666,6 +5726,7 @@ requires-dist = [ { name = "cassandra-driver", marker = "python_full_version < '3.14' and extra == 'scylla'", specifier = ">=3" }, { name = "chromadb-client", marker = "extra == 'chroma'", specifier = ">=1" }, { name = "clickhouse-driver", marker = "extra == 'clickhouse'" }, + { name = "couchbase", marker = "extra == 'couchbase'" }, { name = "cryptography", marker = "extra == 'mailpit'" }, { name = "cryptography", marker = "extra == 'sftp'" }, { name = "docker" }, @@ -5711,7 +5772,7 @@ requires-dist = [ { name = "weaviate-client", marker = "extra == 'weaviate'", specifier = ">=4" }, { name = "wrapt" }, ] -provides-extras = ["arangodb", "aws", "azurite", "cassandra", "clickhouse", "cosmosdb", "cockroachdb", "cratedb", "db2", "elasticsearch", "generic", "test-module-import", "google", "influxdb", "k3s", "kafka", "keycloak", "localstack", "mailpit", "memcached", "minio", "milvus", "mongodb", "mqtt", "mssql", "mysql", "nats", "neo4j", "nginx", "openfga", "opensearch", "ollama", "oracle", "oracle-free", "postgres", "qdrant", "rabbitmq", "redis", "registry", "selenium", "scylla", "sftp", "toxiproxy", "valkey", "vault", "weaviate", "chroma", "trino"] +provides-extras = ["arangodb", "aws", "azurite", "cassandra", "clickhouse", "cosmosdb", "cockroachdb", "couchbase", "cratedb", "db2", "elasticsearch", "generic", "test-module-import", "google", "influxdb", "k3s", "kafka", "keycloak", "localstack", "mailpit", "memcached", "minio", "milvus", "mongodb", "mqtt", "mssql", "mysql", "nats", "neo4j", "nginx", "openfga", "opensearch", "ollama", "oracle", "oracle-free", "postgres", "qdrant", "rabbitmq", "redis", "registry", "selenium", "scylla", "sftp", "toxiproxy", "valkey", "vault", "weaviate", "chroma", "trino"] [package.metadata.requires-dev] dev = [