From fba625253a2690bac02964587ad2ee9a046f282f Mon Sep 17 00:00:00 2001 From: Stefano Lottini Date: Tue, 27 Feb 2024 02:02:29 +0100 Subject: [PATCH 1/3] removed references to the idiomatic api --- astrapy/db.py | 135 ----------------------------------- astrapy/defaults.py | 1 - tests/astrapy/test_db_dml.py | 8 --- 3 files changed, 144 deletions(-) diff --git a/astrapy/db.py b/astrapy/db.py index a6b3140f..7360e407 100644 --- a/astrapy/db.py +++ b/astrapy/db.py @@ -45,7 +45,6 @@ DEFAULT_JSON_API_PATH, DEFAULT_JSON_API_VERSION, DEFAULT_KEYSPACE_NAME, - DEFAULT_NOT_IMPLEMENTED_MESSAGE, MAX_INSERT_NUM_DOCUMENTS, ) from astrapy.utils import ( @@ -1056,58 +1055,6 @@ def upsert_many( return results - # Mongodb calls not supported by the API - def find_raw_batches(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def aggregate(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def aggregate_raw_batches(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def watch(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def rename(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def create_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def create_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def drop_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def drop_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def list_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def index_information(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def create_search_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def create_search_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def drop_search_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def list_search_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def update_search_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def distinct(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - class AsyncAstraDBCollection: def __init__( @@ -2044,58 +1991,6 @@ async def concurrent_upsert(doc: API_DOC) -> str: raise result return results # type: ignore - # Mongodb calls not supported by the API - async def find_raw_batches(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def aggregate(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def aggregate_raw_batches(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def watch(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def rename(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def create_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def create_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def drop_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def drop_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def list_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def index_information(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def create_search_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def create_search_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def drop_search_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def list_search_indexes(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def update_search_index(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - async def distinct(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - class AstraDB: # Initialize the shared httpx client as a class attribute @@ -2373,21 +2268,6 @@ def truncate_collection(self, collection_name: str) -> AstraDBCollection: # return the collection itself return collection - def aggregate(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def cursor_command(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def dereference(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def watch(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def validate_collection(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - class AsyncAstraDB: def __init__( @@ -2676,18 +2556,3 @@ async def truncate_collection(self, collection_name: str) -> AsyncAstraDBCollect # return the collection itself return collection - - def aggregate(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def cursor_command(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def dereference(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def watch(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) - - def validate_collection(self) -> None: - raise NotImplementedError(DEFAULT_NOT_IMPLEMENTED_MESSAGE) diff --git a/astrapy/defaults.py b/astrapy/defaults.py index 72c0f89e..676b411a 100644 --- a/astrapy/defaults.py +++ b/astrapy/defaults.py @@ -11,6 +11,5 @@ DEFAULT_AUTH_HEADER = "Token" DEFAULT_KEYSPACE_NAME = "default_keyspace" DEFAULT_REGION = "us-east1" -DEFAULT_NOT_IMPLEMENTED_MESSAGE = "This operation is not yet implemented." MAX_INSERT_NUM_DOCUMENTS = 20 diff --git a/tests/astrapy/test_db_dml.py b/tests/astrapy/test_db_dml.py index 1cafe72c..174a0ee2 100644 --- a/tests/astrapy/test_db_dml.py +++ b/tests/astrapy/test_db_dml.py @@ -1269,14 +1269,6 @@ def test_find_find_one_non_equality_operators( assert resp8["data"]["documents"][0]["marker"] == "abc" -@pytest.mark.describe("test unsupported operation") -def test_unsupported_operation( - writable_v_collection: AstraDBCollection, -) -> None: - with pytest.raises(NotImplementedError): - writable_v_collection.aggregate() - - @pytest.mark.describe("store and retrieve dates and datetimes correctly") def test_insert_find_with_dates( writable_v_collection: AstraDBCollection, From 8d4cc335519e8ed34027120f4950a5ccbfcf280a Mon Sep 17 00:00:00 2001 From: Stefano Lottini Date: Tue, 27 Feb 2024 11:24:04 +0100 Subject: [PATCH 2/3] align test structure to the idiomatic branch --- tests/astrapy/conftest.py | 385 ++++++++++++++++++++++++++++ tests/astrapy/test_async_db_ddl.py | 4 +- tests/astrapy/test_db_ddl.py | 4 +- tests/conftest.py | 392 +---------------------------- 4 files changed, 396 insertions(+), 389 deletions(-) create mode 100644 tests/astrapy/conftest.py diff --git a/tests/astrapy/conftest.py b/tests/astrapy/conftest.py new file mode 100644 index 00000000..fc897992 --- /dev/null +++ b/tests/astrapy/conftest.py @@ -0,0 +1,385 @@ +""" +Test fixtures +""" + +import os +import math + +import pytest +from typing import ( + AsyncIterable, + Dict, + Iterable, + List, + Optional, + Set, + TypeVar, +) + +import pytest_asyncio + +from ..conftest import AstraDBCredentials +from astrapy.db import AstraDB, AstraDBCollection, AsyncAstraDB, AsyncAstraDBCollection + + +T = TypeVar("T") + + +# fixed +TEST_WRITABLE_VECTOR_COLLECTION = "writable_v_col" +TEST_READONLY_VECTOR_COLLECTION = "readonly_v_col" +TEST_WRITABLE_NONVECTOR_COLLECTION = "writable_nonv_col" +TEST_WRITABLE_ALLOWINDEX_NONVECTOR_COLLECTION = "writable_allowindex_nonv_col" +TEST_WRITABLE_DENYINDEX_NONVECTOR_COLLECTION = "writable_denyindex_nonv_col" + +VECTOR_DOCUMENTS = [ + { + "_id": "1", + "text": "Sample entry number <1>", + "otherfield": {"subfield": "x1y"}, + "anotherfield": "alpha", + "$vector": [0.1, 0.9], + }, + { + "_id": "2", + "text": "Sample entry number <2>", + "otherfield": {"subfield": "x2y"}, + "anotherfield": "alpha", + "$vector": [0.5, 0.5], + }, + { + "_id": "3", + "text": "Sample entry number <3>", + "otherfield": {"subfield": "x3y"}, + "anotherfield": "omega", + "$vector": [0.9, 0.1], + }, +] + +INDEXING_SAMPLE_DOCUMENT = { + "_id": "0", + "A": { + "a": "A.a", + "b": "A.b", + }, + "B": { + "a": "B.a", + "b": "B.b", + }, + "C": { + "a": "C.a", + "b": "C.b", + }, +} + + +def _batch_iterable(iterable: Iterable[T], batch_size: int) -> Iterable[Iterable[T]]: + this_batch = [] + for entry in iterable: + this_batch.append(entry) + if len(this_batch) == batch_size: + yield this_batch + this_batch = [] + if this_batch: + yield this_batch + + +@pytest.fixture(scope="session") +def db(astra_db_credentials_kwargs: AstraDBCredentials) -> AstraDB: + token = astra_db_credentials_kwargs["token"] + api_endpoint = astra_db_credentials_kwargs["api_endpoint"] + namespace = astra_db_credentials_kwargs.get("namespace") + + if token is None or api_endpoint is None: + raise ValueError("Required ASTRA DB configuration is missing") + + return AstraDB(token=token, api_endpoint=api_endpoint, namespace=namespace) + + +@pytest_asyncio.fixture(scope="function") +async def async_db( + astra_db_credentials_kwargs: AstraDBCredentials, +) -> AsyncIterable[AsyncAstraDB]: + token = astra_db_credentials_kwargs["token"] + api_endpoint = astra_db_credentials_kwargs["api_endpoint"] + namespace = astra_db_credentials_kwargs.get("namespace") + + if token is None or api_endpoint is None: + raise ValueError("Required ASTRA DB configuration is missing") + + async with AsyncAstraDB( + token=token, api_endpoint=api_endpoint, namespace=namespace + ) as db: + yield db + + +@pytest.fixture(scope="module") +def invalid_db( + astra_invalid_db_credentials_kwargs: Dict[str, Optional[str]] +) -> AstraDB: + token = astra_invalid_db_credentials_kwargs["token"] + api_endpoint = astra_invalid_db_credentials_kwargs["api_endpoint"] + namespace = astra_invalid_db_credentials_kwargs.get("namespace") + + if token is None or api_endpoint is None: + raise ValueError("Required ASTRA DB configuration is missing") + + return AstraDB(token=token, api_endpoint=api_endpoint, namespace=namespace) + + +@pytest.fixture(scope="session") +def readonly_v_collection(db: AstraDB) -> Iterable[AstraDBCollection]: + collection = db.create_collection( + TEST_READONLY_VECTOR_COLLECTION, + dimension=2, + ) + + collection.clear() + collection.insert_many(VECTOR_DOCUMENTS) + + yield collection + + if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: + db.delete_collection(TEST_READONLY_VECTOR_COLLECTION) + + +@pytest.fixture(scope="session") +def writable_v_collection(db: AstraDB) -> Iterable[AstraDBCollection]: + """ + This is lasting for the whole test. Functions can write to it, + no guarantee (i.e. each test should use a different ID... + """ + collection = db.create_collection( + TEST_WRITABLE_VECTOR_COLLECTION, + dimension=2, + ) + + yield collection + + if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: + db.delete_collection(TEST_WRITABLE_VECTOR_COLLECTION) + + +@pytest.fixture(scope="function") +def empty_v_collection( + writable_v_collection: AstraDBCollection, +) -> Iterable[AstraDBCollection]: + """available empty to each test function.""" + writable_v_collection.clear() + yield writable_v_collection + + +@pytest.fixture(scope="function") +def disposable_v_collection( + writable_v_collection: AstraDBCollection, +) -> Iterable[AstraDBCollection]: + """available prepopulated to each test function.""" + writable_v_collection.clear() + writable_v_collection.insert_many(VECTOR_DOCUMENTS) + yield writable_v_collection + + +@pytest.fixture(scope="session") +def writable_nonv_collection(db: AstraDB) -> Iterable[AstraDBCollection]: + """ + This is lasting for the whole test. Functions can write to it, + no guarantee (i.e. each test should use a different ID... + """ + collection = db.create_collection(TEST_WRITABLE_NONVECTOR_COLLECTION) + + yield collection + + if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: + db.delete_collection(TEST_WRITABLE_NONVECTOR_COLLECTION) + + +@pytest.fixture(scope="function") +def allowindex_nonv_collection(db: AstraDB) -> Iterable[AstraDBCollection]: + """ + This is lasting for the whole test. Functions can write to it, + no guarantee (i.e. each test should use a different ID... + """ + collection = db.create_collection( + TEST_WRITABLE_ALLOWINDEX_NONVECTOR_COLLECTION, + options={ + "indexing": { + "allow": [ + "A", + "C.a", + ], + }, + }, + ) + collection.upsert(INDEXING_SAMPLE_DOCUMENT) + + yield collection + + if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: + db.delete_collection(TEST_WRITABLE_ALLOWINDEX_NONVECTOR_COLLECTION) + + +@pytest.fixture(scope="function") +def denyindex_nonv_collection(db: AstraDB) -> Iterable[AstraDBCollection]: + """ + This is lasting for the whole test. Functions can write to it, + no guarantee (i.e. each test should use a different ID... + + Note in light of the sample document this almost results in the same + filtering paths being available ... if one remembers to deny _id here. + """ + collection = db.create_collection( + TEST_WRITABLE_DENYINDEX_NONVECTOR_COLLECTION, + options={ + "indexing": { + "deny": [ + "B", + "C.b", + "_id", + ], + }, + }, + ) + collection.upsert(INDEXING_SAMPLE_DOCUMENT) + + yield collection + + if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: + db.delete_collection(TEST_WRITABLE_DENYINDEX_NONVECTOR_COLLECTION) + + +@pytest.fixture(scope="function") +def empty_nonv_collection( + writable_nonv_collection: AstraDBCollection, +) -> Iterable[AstraDBCollection]: + """available empty to each test function.""" + writable_nonv_collection.clear() + yield writable_nonv_collection + + +@pytest.fixture(scope="module") +def invalid_writable_v_collection( + invalid_db: AstraDB, +) -> Iterable[AstraDBCollection]: + collection = invalid_db.collection( + TEST_WRITABLE_VECTOR_COLLECTION, + ) + + yield collection + + +@pytest.fixture(scope="function") +def pagination_v_collection( + empty_v_collection: AstraDBCollection, +) -> Iterable[AstraDBCollection]: + INSERT_BATCH_SIZE = 20 # max 20, fixed by API constraints + N = 200 # must be EVEN + + def _mk_vector(index: int, n_total_steps: int) -> List[float]: + angle = 2 * math.pi * index / n_total_steps + return [math.cos(angle), math.sin(angle)] + + inserted_ids: Set[str] = set() + for i_batch in _batch_iterable(range(N), INSERT_BATCH_SIZE): + batch_ids = empty_v_collection.insert_many( + documents=[{"_id": str(i), "$vector": _mk_vector(i, N)} for i in i_batch] + )["status"]["insertedIds"] + inserted_ids = inserted_ids | set(batch_ids) + assert inserted_ids == {str(i) for i in range(N)} + + yield empty_v_collection + + +@pytest_asyncio.fixture(scope="function") +async def async_readonly_v_collection( + async_db: AsyncAstraDB, + readonly_v_collection: AstraDBCollection, +) -> AsyncIterable[AsyncAstraDBCollection]: + """ + This fixture piggybacks on its sync counterpart (and depends on it): + it must not actually do anything to the collection + """ + collection = await async_db.collection(TEST_READONLY_VECTOR_COLLECTION) + + yield collection + + +@pytest_asyncio.fixture(scope="function") +async def async_writable_v_collection( + async_db: AsyncAstraDB, + writable_v_collection: AstraDBCollection, +) -> AsyncIterable[AsyncAstraDBCollection]: + """ + This fixture piggybacks on its sync counterpart (and depends on it): + it must not actually do anything to the collection + """ + collection = await async_db.collection(TEST_WRITABLE_VECTOR_COLLECTION) + + yield collection + + +@pytest_asyncio.fixture(scope="function") +async def async_empty_v_collection( + async_writable_v_collection: AsyncAstraDBCollection, + empty_v_collection: AstraDBCollection, +) -> AsyncIterable[AsyncAstraDBCollection]: + """ + available empty to each test function. + + This fixture piggybacks on its sync counterpart (and depends on it): + it must not actually do anything to the collection + """ + yield async_writable_v_collection + + +@pytest_asyncio.fixture(scope="function") +async def async_disposable_v_collection( + async_writable_v_collection: AsyncAstraDBCollection, + disposable_v_collection: AstraDBCollection, +) -> AsyncIterable[AsyncAstraDBCollection]: + """ + available prepopulated to each test function. + + This fixture piggybacks on its sync counterpart (and depends on it): + it must not actually do anything to the collection + """ + yield async_writable_v_collection + + +@pytest_asyncio.fixture(scope="function") +async def async_writable_nonv_collection( + async_db: AsyncAstraDB, + writable_nonv_collection: AstraDBCollection, +) -> AsyncIterable[AsyncAstraDBCollection]: + """ + This fixture piggybacks on its sync counterpart (and depends on it): + it must not actually do anything to the collection + """ + collection = await async_db.collection(TEST_WRITABLE_NONVECTOR_COLLECTION) + + yield collection + + +@pytest_asyncio.fixture(scope="function") +async def async_empty_nonv_collection( + async_writable_nonv_collection: AsyncAstraDBCollection, + empty_nonv_collection: AstraDBCollection, +) -> AsyncIterable[AsyncAstraDBCollection]: + """ + available empty to each test function. + + This fixture piggybacks on its sync counterpart (and depends on it): + it must not actually do anything to the collection + """ + yield async_writable_nonv_collection + + +@pytest_asyncio.fixture(scope="function") +async def async_pagination_v_collection( + async_empty_v_collection: AsyncAstraDBCollection, + pagination_v_collection: AstraDBCollection, +) -> AsyncIterable[AsyncAstraDBCollection]: + """ + This fixture piggybacks on its sync counterpart (and depends on it): + it must not actually do anything to the collection + """ + yield async_empty_v_collection diff --git a/tests/astrapy/test_async_db_ddl.py b/tests/astrapy/test_async_db_ddl.py index 1bdb6f0e..6fd0f033 100644 --- a/tests/astrapy/test_async_db_ddl.py +++ b/tests/astrapy/test_async_db_ddl.py @@ -18,10 +18,10 @@ import os import logging -from typing import Dict, Optional import pytest +from ..conftest import AstraDBCredentials from astrapy.db import AsyncAstraDB, AsyncAstraDBCollection from astrapy.defaults import DEFAULT_KEYSPACE_NAME @@ -33,7 +33,7 @@ @pytest.mark.describe("should confirm path handling in constructor (async)") async def test_path_handling( - astra_db_credentials_kwargs: Dict[str, Optional[str]] + astra_db_credentials_kwargs: AstraDBCredentials, ) -> None: token = astra_db_credentials_kwargs["token"] api_endpoint = astra_db_credentials_kwargs["api_endpoint"] diff --git a/tests/astrapy/test_db_ddl.py b/tests/astrapy/test_db_ddl.py index 0d752e0e..75b4a690 100644 --- a/tests/astrapy/test_db_ddl.py +++ b/tests/astrapy/test_db_ddl.py @@ -18,10 +18,10 @@ import os import logging -from typing import Dict, Optional import pytest +from ..conftest import AstraDBCredentials from astrapy.db import AstraDB, AstraDBCollection from astrapy.defaults import DEFAULT_KEYSPACE_NAME @@ -32,7 +32,7 @@ @pytest.mark.describe("should confirm path handling in constructor") -def test_path_handling(astra_db_credentials_kwargs: Dict[str, Optional[str]]) -> None: +def test_path_handling(astra_db_credentials_kwargs: AstraDBCredentials) -> None: token = astra_db_credentials_kwargs["token"] api_endpoint = astra_db_credentials_kwargs["api_endpoint"] namespace = astra_db_credentials_kwargs.get("namespace") diff --git a/tests/conftest.py b/tests/conftest.py index a2948a42..812c32e3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,98 +1,21 @@ -""" -Test fixtures -""" - +# main conftest for shared fixtures (if any). import os -import math - import pytest -from typing import ( - AsyncIterable, - Dict, - Iterable, - List, - Optional, - Set, - TypeVar, - TypedDict, -) - -import pytest_asyncio +from typing import Optional, TypedDict from astrapy.defaults import DEFAULT_KEYSPACE_NAME -from astrapy.db import AstraDB, AstraDBCollection, AsyncAstraDB, AsyncAstraDBCollection - -T = TypeVar("T") - - -ASTRA_DB_APPLICATION_TOKEN = os.environ["ASTRA_DB_APPLICATION_TOKEN"] -ASTRA_DB_API_ENDPOINT = os.environ["ASTRA_DB_API_ENDPOINT"] - -ASTRA_DB_KEYSPACE = os.environ.get("ASTRA_DB_KEYSPACE", DEFAULT_KEYSPACE_NAME) - -# fixed -TEST_WRITABLE_VECTOR_COLLECTION = "writable_v_col" -TEST_READONLY_VECTOR_COLLECTION = "readonly_v_col" -TEST_WRITABLE_NONVECTOR_COLLECTION = "writable_nonv_col" -TEST_WRITABLE_ALLOWINDEX_NONVECTOR_COLLECTION = "writable_allowindex_nonv_col" -TEST_WRITABLE_DENYINDEX_NONVECTOR_COLLECTION = "writable_denyindex_nonv_col" - -VECTOR_DOCUMENTS = [ - { - "_id": "1", - "text": "Sample entry number <1>", - "otherfield": {"subfield": "x1y"}, - "anotherfield": "alpha", - "$vector": [0.1, 0.9], - }, - { - "_id": "2", - "text": "Sample entry number <2>", - "otherfield": {"subfield": "x2y"}, - "anotherfield": "alpha", - "$vector": [0.5, 0.5], - }, - { - "_id": "3", - "text": "Sample entry number <3>", - "otherfield": {"subfield": "x3y"}, - "anotherfield": "omega", - "$vector": [0.9, 0.1], - }, -] -INDEXING_SAMPLE_DOCUMENT = { - "_id": "0", - "A": { - "a": "A.a", - "b": "A.b", - }, - "B": { - "a": "B.a", - "b": "B.b", - }, - "C": { - "a": "C.a", - "b": "C.b", - }, -} - -class AstraDBCredentials(TypedDict, total=False): +class AstraDBCredentials(TypedDict): token: str api_endpoint: str namespace: Optional[str] -def _batch_iterable(iterable: Iterable[T], batch_size: int) -> Iterable[Iterable[T]]: - this_batch = [] - for entry in iterable: - this_batch.append(entry) - if len(this_batch) == batch_size: - yield this_batch - this_batch = [] - if this_batch: - yield this_batch +ASTRA_DB_APPLICATION_TOKEN = os.environ["ASTRA_DB_APPLICATION_TOKEN"] +ASTRA_DB_API_ENDPOINT = os.environ["ASTRA_DB_API_ENDPOINT"] + +ASTRA_DB_KEYSPACE = os.environ.get("ASTRA_DB_KEYSPACE", DEFAULT_KEYSPACE_NAME) @pytest.fixture(scope="session") @@ -115,304 +38,3 @@ def astra_invalid_db_credentials_kwargs() -> AstraDBCredentials: } return astra_db_creds - - -@pytest.fixture(scope="session") -def db(astra_db_credentials_kwargs: Dict[str, Optional[str]]) -> AstraDB: - token = astra_db_credentials_kwargs["token"] - api_endpoint = astra_db_credentials_kwargs["api_endpoint"] - namespace = astra_db_credentials_kwargs.get("namespace") - - if token is None or api_endpoint is None: - raise ValueError("Required ASTRA DB configuration is missing") - - return AstraDB(token=token, api_endpoint=api_endpoint, namespace=namespace) - - -@pytest_asyncio.fixture(scope="function") -async def async_db( - astra_db_credentials_kwargs: Dict[str, Optional[str]] -) -> AsyncIterable[AsyncAstraDB]: - token = astra_db_credentials_kwargs["token"] - api_endpoint = astra_db_credentials_kwargs["api_endpoint"] - namespace = astra_db_credentials_kwargs.get("namespace") - - if token is None or api_endpoint is None: - raise ValueError("Required ASTRA DB configuration is missing") - - async with AsyncAstraDB( - token=token, api_endpoint=api_endpoint, namespace=namespace - ) as db: - yield db - - -@pytest.fixture(scope="module") -def invalid_db( - astra_invalid_db_credentials_kwargs: Dict[str, Optional[str]] -) -> AstraDB: - token = astra_invalid_db_credentials_kwargs["token"] - api_endpoint = astra_invalid_db_credentials_kwargs["api_endpoint"] - namespace = astra_invalid_db_credentials_kwargs.get("namespace") - - if token is None or api_endpoint is None: - raise ValueError("Required ASTRA DB configuration is missing") - - return AstraDB(token=token, api_endpoint=api_endpoint, namespace=namespace) - - -@pytest.fixture(scope="session") -def readonly_v_collection(db: AstraDB) -> Iterable[AstraDBCollection]: - collection = db.create_collection( - TEST_READONLY_VECTOR_COLLECTION, - dimension=2, - ) - - collection.clear() - collection.insert_many(VECTOR_DOCUMENTS) - - yield collection - - if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: - db.delete_collection(TEST_READONLY_VECTOR_COLLECTION) - - -@pytest.fixture(scope="session") -def writable_v_collection(db: AstraDB) -> Iterable[AstraDBCollection]: - """ - This is lasting for the whole test. Functions can write to it, - no guarantee (i.e. each test should use a different ID... - """ - collection = db.create_collection( - TEST_WRITABLE_VECTOR_COLLECTION, - dimension=2, - ) - - yield collection - - if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: - db.delete_collection(TEST_WRITABLE_VECTOR_COLLECTION) - - -@pytest.fixture(scope="function") -def empty_v_collection( - writable_v_collection: AstraDBCollection, -) -> Iterable[AstraDBCollection]: - """available empty to each test function.""" - writable_v_collection.clear() - yield writable_v_collection - - -@pytest.fixture(scope="function") -def disposable_v_collection( - writable_v_collection: AstraDBCollection, -) -> Iterable[AstraDBCollection]: - """available prepopulated to each test function.""" - writable_v_collection.clear() - writable_v_collection.insert_many(VECTOR_DOCUMENTS) - yield writable_v_collection - - -@pytest.fixture(scope="session") -def writable_nonv_collection(db: AstraDB) -> Iterable[AstraDBCollection]: - """ - This is lasting for the whole test. Functions can write to it, - no guarantee (i.e. each test should use a different ID... - """ - collection = db.create_collection(TEST_WRITABLE_NONVECTOR_COLLECTION) - - yield collection - - if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: - db.delete_collection(TEST_WRITABLE_NONVECTOR_COLLECTION) - - -@pytest.fixture(scope="function") -def allowindex_nonv_collection(db: AstraDB) -> Iterable[AstraDBCollection]: - """ - This is lasting for the whole test. Functions can write to it, - no guarantee (i.e. each test should use a different ID... - """ - collection = db.create_collection( - TEST_WRITABLE_ALLOWINDEX_NONVECTOR_COLLECTION, - options={ - "indexing": { - "allow": [ - "A", - "C.a", - ], - }, - }, - ) - collection.upsert(INDEXING_SAMPLE_DOCUMENT) - - yield collection - - if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: - db.delete_collection(TEST_WRITABLE_ALLOWINDEX_NONVECTOR_COLLECTION) - - -@pytest.fixture(scope="function") -def denyindex_nonv_collection(db: AstraDB) -> Iterable[AstraDBCollection]: - """ - This is lasting for the whole test. Functions can write to it, - no guarantee (i.e. each test should use a different ID... - - Note in light of the sample document this almost results in the same - filtering paths being available ... if one remembers to deny _id here. - """ - collection = db.create_collection( - TEST_WRITABLE_DENYINDEX_NONVECTOR_COLLECTION, - options={ - "indexing": { - "deny": [ - "B", - "C.b", - "_id", - ], - }, - }, - ) - collection.upsert(INDEXING_SAMPLE_DOCUMENT) - - yield collection - - if int(os.getenv("TEST_SKIP_COLLECTION_DELETE", "0")) == 0: - db.delete_collection(TEST_WRITABLE_DENYINDEX_NONVECTOR_COLLECTION) - - -@pytest.fixture(scope="function") -def empty_nonv_collection( - writable_nonv_collection: AstraDBCollection, -) -> Iterable[AstraDBCollection]: - """available empty to each test function.""" - writable_nonv_collection.clear() - yield writable_nonv_collection - - -@pytest.fixture(scope="module") -def invalid_writable_v_collection( - invalid_db: AstraDB, -) -> Iterable[AstraDBCollection]: - collection = invalid_db.collection( - TEST_WRITABLE_VECTOR_COLLECTION, - ) - - yield collection - - -@pytest.fixture(scope="function") -def pagination_v_collection( - empty_v_collection: AstraDBCollection, -) -> Iterable[AstraDBCollection]: - INSERT_BATCH_SIZE = 20 # max 20, fixed by API constraints - N = 200 # must be EVEN - - def _mk_vector(index: int, n_total_steps: int) -> List[float]: - angle = 2 * math.pi * index / n_total_steps - return [math.cos(angle), math.sin(angle)] - - inserted_ids: Set[str] = set() - for i_batch in _batch_iterable(range(N), INSERT_BATCH_SIZE): - batch_ids = empty_v_collection.insert_many( - documents=[{"_id": str(i), "$vector": _mk_vector(i, N)} for i in i_batch] - )["status"]["insertedIds"] - inserted_ids = inserted_ids | set(batch_ids) - assert inserted_ids == {str(i) for i in range(N)} - - yield empty_v_collection - - -@pytest_asyncio.fixture(scope="function") -async def async_readonly_v_collection( - async_db: AsyncAstraDB, - readonly_v_collection: AstraDBCollection, -) -> AsyncIterable[AsyncAstraDBCollection]: - """ - This fixture piggybacks on its sync counterpart (and depends on it): - it must not actually do anything to the collection - """ - collection = await async_db.collection(TEST_READONLY_VECTOR_COLLECTION) - - yield collection - - -@pytest_asyncio.fixture(scope="function") -async def async_writable_v_collection( - async_db: AsyncAstraDB, - writable_v_collection: AstraDBCollection, -) -> AsyncIterable[AsyncAstraDBCollection]: - """ - This fixture piggybacks on its sync counterpart (and depends on it): - it must not actually do anything to the collection - """ - collection = await async_db.collection(TEST_WRITABLE_VECTOR_COLLECTION) - - yield collection - - -@pytest_asyncio.fixture(scope="function") -async def async_empty_v_collection( - async_writable_v_collection: AsyncAstraDBCollection, - empty_v_collection: AstraDBCollection, -) -> AsyncIterable[AsyncAstraDBCollection]: - """ - available empty to each test function. - - This fixture piggybacks on its sync counterpart (and depends on it): - it must not actually do anything to the collection - """ - yield async_writable_v_collection - - -@pytest_asyncio.fixture(scope="function") -async def async_disposable_v_collection( - async_writable_v_collection: AsyncAstraDBCollection, - disposable_v_collection: AstraDBCollection, -) -> AsyncIterable[AsyncAstraDBCollection]: - """ - available prepopulated to each test function. - - This fixture piggybacks on its sync counterpart (and depends on it): - it must not actually do anything to the collection - """ - yield async_writable_v_collection - - -@pytest_asyncio.fixture(scope="function") -async def async_writable_nonv_collection( - async_db: AsyncAstraDB, - writable_nonv_collection: AstraDBCollection, -) -> AsyncIterable[AsyncAstraDBCollection]: - """ - This fixture piggybacks on its sync counterpart (and depends on it): - it must not actually do anything to the collection - """ - collection = await async_db.collection(TEST_WRITABLE_NONVECTOR_COLLECTION) - - yield collection - - -@pytest_asyncio.fixture(scope="function") -async def async_empty_nonv_collection( - async_writable_nonv_collection: AsyncAstraDBCollection, - empty_nonv_collection: AstraDBCollection, -) -> AsyncIterable[AsyncAstraDBCollection]: - """ - available empty to each test function. - - This fixture piggybacks on its sync counterpart (and depends on it): - it must not actually do anything to the collection - """ - yield async_writable_nonv_collection - - -@pytest_asyncio.fixture(scope="function") -async def async_pagination_v_collection( - async_empty_v_collection: AsyncAstraDBCollection, - pagination_v_collection: AstraDBCollection, -) -> AsyncIterable[AsyncAstraDBCollection]: - """ - This fixture piggybacks on its sync counterpart (and depends on it): - it must not actually do anything to the collection - """ - yield async_empty_v_collection From b9e365f94d1ef7bdbe854a81de59c91272fd87cd Mon Sep 17 00:00:00 2001 From: Stefano Lottini Date: Tue, 27 Feb 2024 15:33:19 +0100 Subject: [PATCH 3/3] poetry.lock update --- poetry.lock | 232 +++++++++++++++++++++++++--------------------------- 1 file changed, 111 insertions(+), 121 deletions(-) diff --git a/poetry.lock b/poetry.lock index d088ff47..00b9d978 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "anyio" -version = "4.2.0" +version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, - {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] @@ -122,13 +122,13 @@ graph = ["gremlinpython (==3.4.6)"] [[package]] name = "cassio" -version = "0.1.4" +version = "0.1.5" description = "A framework-agnostic Python library to seamlessly integrate Apache Cassandra(R) with ML/LLM/genAI workloads." optional = false python-versions = ">=3.8" files = [ - {file = "cassio-0.1.4-py3-none-any.whl", hash = "sha256:ab997879c36807ff5b9771ff35941f104c0f0e60e1595118279869b5b95c146f"}, - {file = "cassio-0.1.4.tar.gz", hash = "sha256:df495c459ee5e9194e4780ac3ea1aaf79a4443e6d06f0eeb67aac6e3cd8c47aa"}, + {file = "cassio-0.1.5-py3-none-any.whl", hash = "sha256:cf1d11f255c040bc0aede4963ca020840133377aa54f7f15d2f819d6553d52ce"}, + {file = "cassio-0.1.5.tar.gz", hash = "sha256:88c50c34d46a1bfffca1e0b600318a6efef45e6c18a56ddabe208cbede8dcc27"}, ] [package.dependencies] @@ -284,63 +284,63 @@ files = [ [[package]] name = "coverage" -version = "7.4.1" +version = "7.4.3" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, - {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, - {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, - {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, - {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, - {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, - {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, - {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, - {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, - {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, - {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, - {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, - {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, - {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, + {file = "coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6"}, + {file = "coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4"}, + {file = "coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524"}, + {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d"}, + {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb"}, + {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0"}, + {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc"}, + {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2"}, + {file = "coverage-7.4.3-cp310-cp310-win32.whl", hash = "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94"}, + {file = "coverage-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0"}, + {file = "coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47"}, + {file = "coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113"}, + {file = "coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe"}, + {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc"}, + {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3"}, + {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba"}, + {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079"}, + {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840"}, + {file = "coverage-7.4.3-cp311-cp311-win32.whl", hash = "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3"}, + {file = "coverage-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e"}, + {file = "coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10"}, + {file = "coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328"}, + {file = "coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30"}, + {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7"}, + {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e"}, + {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003"}, + {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d"}, + {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a"}, + {file = "coverage-7.4.3-cp312-cp312-win32.whl", hash = "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352"}, + {file = "coverage-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914"}, + {file = "coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454"}, + {file = "coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e"}, + {file = "coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2"}, + {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e"}, + {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6"}, + {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c"}, + {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0"}, + {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1"}, + {file = "coverage-7.4.3-cp38-cp38-win32.whl", hash = "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f"}, + {file = "coverage-7.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9"}, + {file = "coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f"}, + {file = "coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c"}, + {file = "coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e"}, + {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765"}, + {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee"}, + {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501"}, + {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f"}, + {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45"}, + {file = "coverage-7.4.3-cp39-cp39-win32.whl", hash = "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9"}, + {file = "coverage-7.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa"}, + {file = "coverage-7.4.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51"}, + {file = "coverage-7.4.3.tar.gz", hash = "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52"}, ] [package.dependencies] @@ -473,13 +473,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.2" +version = "1.0.4" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, - {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, + {file = "httpcore-1.0.4-py3-none-any.whl", hash = "sha256:ac418c1db41bade2ad53ae2f3834a3a0f5ae76b56cf5aa497d2d033384fc7d73"}, + {file = "httpcore-1.0.4.tar.gz", hash = "sha256:cb2839ccfcba0d2d3c1131d3c3e26dfc327326fbe7a5dc0dbfe9f6c9151bb022"}, ] [package.dependencies] @@ -490,17 +490,17 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.23.0)"] +trio = ["trio (>=0.22.0,<0.25.0)"] [[package]] name = "httpx" -version = "0.26.0" +version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, - {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] @@ -530,13 +530,13 @@ files = [ [[package]] name = "identify" -version = "2.5.34" +version = "2.5.35" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.34-py2.py3-none-any.whl", hash = "sha256:a4316013779e433d08b96e5eabb7f641e6c7942e4ab5d4c509ebd2e7a8994aed"}, - {file = "identify-2.5.34.tar.gz", hash = "sha256:ee17bc9d499899bc9eaec1ac7bf2dc9eedd480db9d88b96d123d3b64a9d34f5d"}, + {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, + {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, ] [package.extras] @@ -814,13 +814,13 @@ virtualenv = ">=20.10.0" [[package]] name = "pytest" -version = "8.0.0" +version = "8.0.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.0.0-py3-none-any.whl", hash = "sha256:50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6"}, - {file = "pytest-8.0.0.tar.gz", hash = "sha256:249b1b0864530ba251b7438274c4d251c58d868edaaec8762893ad4a0d71c36c"}, + {file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"}, + {file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"}, ] [package.dependencies] @@ -872,13 +872,13 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytest-httpserver" -version = "1.0.9" +version = "1.0.10" description = "pytest-httpserver is a httpserver for pytest" optional = false python-versions = ">=3.8" files = [ - {file = "pytest_httpserver-1.0.9-py3-none-any.whl", hash = "sha256:5c84c372564b627521784909b8c8b45c5ededbae2406f7624e201dd86ae0610a"}, - {file = "pytest_httpserver-1.0.9.tar.gz", hash = "sha256:9429f26c7ad7b1677dc2fa3bc9e928601f0e9b4ba0388edf961162be1242a662"}, + {file = "pytest_httpserver-1.0.10-py3-none-any.whl", hash = "sha256:d40e0cc3d61ed6e4d80f52a796926d557a7db62b17e43b3e258a78a3c34becb9"}, + {file = "pytest_httpserver-1.0.10.tar.gz", hash = "sha256:77b9fbc2eb0a129cfbbacc8fe57e8cafe071d506489f31fe31e62f1b332d9905"}, ] [package.dependencies] @@ -938,7 +938,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -946,15 +945,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -971,7 +963,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -979,7 +970,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -1008,45 +998,45 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.2.1" +version = "0.2.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dd81b911d28925e7e8b323e8d06951554655021df8dd4ac3045d7212ac4ba080"}, - {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dc586724a95b7d980aa17f671e173df00f0a2eef23f8babbeee663229a938fec"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92db7101ef5bfc18e96777ed7bc7c822d545fa5977e90a585accac43d22f18a"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13471684694d41ae0f1e8e3a7497e14cd57ccb7dd72ae08d56a159d6c9c3e30e"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a11567e20ea39d1f51aebd778685582d4c56ccb082c1161ffc10f79bebe6df35"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:00a818e2db63659570403e44383ab03c529c2b9678ba4ba6c105af7854008105"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be60592f9d218b52f03384d1325efa9d3b41e4c4d55ea022cd548547cc42cd2b"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbd2288890b88e8aab4499e55148805b58ec711053588cc2f0196a44f6e3d855"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ef052283da7dec1987bba8d8733051c2325654641dfe5877a4022108098683"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7022d66366d6fded4ba3889f73cd791c2d5621b2ccf34befc752cb0df70f5fad"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0a725823cb2a3f08ee743a534cb6935727d9e47409e4ad72c10a3faf042ad5ba"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0034d5b6323e6e8fe91b2a1e55b02d92d0b582d2953a2b37a67a2d7dedbb7acc"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5cb5526d69bb9143c2e4d2a115d08ffca3d8e0fddc84925a7b54931c96f5c02"}, - {file = "ruff-0.2.1-py3-none-win32.whl", hash = "sha256:6b95ac9ce49b4fb390634d46d6ece32ace3acdd52814671ccaf20b7f60adb232"}, - {file = "ruff-0.2.1-py3-none-win_amd64.whl", hash = "sha256:e3affdcbc2afb6f5bd0eb3130139ceedc5e3f28d206fe49f63073cb9e65988e0"}, - {file = "ruff-0.2.1-py3-none-win_arm64.whl", hash = "sha256:efababa8e12330aa94a53e90a81eb6e2d55f348bc2e71adbf17d9cad23c03ee6"}, - {file = "ruff-0.2.1.tar.gz", hash = "sha256:3b42b5d8677cd0c72b99fcaf068ffc62abb5a19e71b4a3b9cfa50658a0af02f1"}, + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6"}, + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9"}, + {file = "ruff-0.2.2-py3-none-win32.whl", hash = "sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325"}, + {file = "ruff-0.2.2-py3-none-win_amd64.whl", hash = "sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d"}, + {file = "ruff-0.2.2-py3-none-win_arm64.whl", hash = "sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd"}, + {file = "ruff-0.2.2.tar.gz", hash = "sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d"}, ] [[package]] name = "setuptools" -version = "69.1.0" +version = "69.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, - {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, + {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, + {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -1061,13 +1051,13 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -1105,24 +1095,24 @@ files = [ [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] name = "urllib3" -version = "2.2.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, - {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] @@ -1133,13 +1123,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.25.0" +version = "20.25.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, - {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, + {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, + {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, ] [package.dependencies] @@ -1171,4 +1161,4 @@ watchdog = ["watchdog (>=2.3)"] [metadata] lock-version = "2.0" python-versions = "^3.8.0" -content-hash = "1faf9e2638567305b98e052ca4f65b4595c1af490ccd70f3a7e3aed0348b6a6d" +content-hash = "81e42e677cbaed34b81de7ddf117fda5dbbb871b51399bcf902297810d03f0fd"