From 6cae56c72750e1971db79e65298577848a002884 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 4 Nov 2024 14:21:09 -0500 Subject: [PATCH 001/104] added cosmosdb constructor and database methods --- graphrag/config/enums.py | 4 + .../storage/cosmosdb_pipeline_storage.py | 110 ++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 graphrag/index/storage/cosmosdb_pipeline_storage.py diff --git a/graphrag/config/enums.py b/graphrag/config/enums.py index 8741cf74ae..fee9c72e30 100644 --- a/graphrag/config/enums.py +++ b/graphrag/config/enums.py @@ -19,6 +19,8 @@ class CacheType(str, Enum): """The none cache configuration type.""" blob = "blob" """The blob cache configuration type.""" + cosmosdb = "cosmosdb" + """The cosmosdb cache configuration type""" def __repr__(self): """Get a string representation.""" @@ -60,6 +62,8 @@ class StorageType(str, Enum): """The memory storage type.""" blob = "blob" """The blob storage type.""" + cosmosdb = "cosmosdb" + """The cosmosdb storage type""" def __repr__(self): """Get a string representation.""" diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py new file mode 100644 index 0000000000..8c1d341b96 --- /dev/null +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -0,0 +1,110 @@ + #Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Azure CosmosDB Storage implementation of PipelineStorage.""" + +import logging +import re +from collections.abc import Iterator +from pathlib import Path +from typing import Any + +from azure.cosmos import CosmosClient +from azure.identity import DefaultAzureCredential +from datashaper import Progress + +from graphrag.logging import ProgressReporter + +from .pipeline_storage import PipelineStorage + +log = logging.getLogger(__name__) + +class CosmosDBPipelineStorage(PipelineStorage): + """The CosmosDB-Storage Implementation.""" + + _cosmosdb_account_url: str + _primary_key: str | None + _database_name: str + _current_container: str | None + _encoding: str + + def __init__( + self, + cosmosdb_account_url: str, + primary_key: str | None, + database_name: str, + encoding: str | None = None, + _current_container: str | None = None, + ): + """Initialize the CosmosDB-Storage.""" + if not cosmosdb_account_url: + msg = "cosmosdb_account_url is required" + raise ValueError(msg) + + if primary_key: + self._cosmos_client = CosmosClient( + url=cosmosdb_account_url, + credential=primary_key, + ) + else: + self._cosmos_client = CosmosClient( + url=cosmosdb_account_url, + credential=DefaultAzureCredential(), + ) + + self._encoding = encoding or "utf-8" + self._database_name = database_name + self._primary_key = primary_key + self._cosmosdb_account_url = cosmosdb_account_url + self._current_container = _current_container or None + self._cosmosdb_account_name = cosmosdb_account_url.split("//")[1].split(".")[0] + + log.info( + "creating cosmosdb storage with account: %s and database: %s", + self._cosmosdb_account_name, + self._database_name, + ) + self.create_database() + + def create_database(self) -> None: + """Create the database if it doesn't exist.""" + if not self.database_exists(): + database_name = self._database_name + database_names = [ + database["id"] for database in self._cosmos_client.list_databases() + ] + if database_name not in database_names: + self._cosmos_client.create_database(database_name) + + def delete_database(self) -> None: + """Delete the database if it exists.""" + if self.database_exists(): + self._cosmos_client.delete_database(self._database_name) + + def database_exists(self) -> bool: + """Check if the database exists.""" + database_name = self._database_name + database_names = [ + database["id"] for database in self._cosmos_client.list_databases() + ] + return database_name in database_names + + async def get( + self, key: str, as_bytes: bool | None = None, encoding: str | None = None + ) -> Any: + """Get the value for the given key.""" + + async def set(self, key: str, value: Any, encoding: str | None = None) -> None: + """Set the value for the given key.""" + + def child(self, name: str | None) -> "PipelineStorage": + """Create a child storage instance.""" + if name is None: + return self + return CosmosDBPipelineStorage( + self._cosmosdb_account_url, + self._primary_key, + self._database_name, + name, + self._encoding, + ) \ No newline at end of file From 80bd11a84f7d59505049aa27579d616cbedacd43 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 4 Nov 2024 14:31:42 -0500 Subject: [PATCH 002/104] added rest of abstract method headers --- .../storage/cosmosdb_pipeline_storage.py | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 8c1d341b96..0d43956070 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -6,12 +6,10 @@ import logging import re from collections.abc import Iterator -from pathlib import Path from typing import Any from azure.cosmos import CosmosClient from azure.identity import DefaultAzureCredential -from datashaper import Progress from graphrag.logging import ProgressReporter @@ -89,13 +87,40 @@ def database_exists(self) -> bool: ] return database_name in database_names + def find( + self, + file_pattern: re.Pattern[str], + base_dir: str | None = None, + progress: ProgressReporter | None = None, + file_filter: dict[str, Any] | None = None, + max_count=-1, + ) -> Iterator[tuple[str, dict[str, Any]]]: + """Find files in the cosmosdb storage using a file pattern, as well as a custom filter function.""" + msg = "CosmosDB storage does yet not support finding files." + raise NotImplementedError(msg) + async def get( self, key: str, as_bytes: bool | None = None, encoding: str | None = None ) -> Any: - """Get the value for the given key.""" + """Get a file in the database for the given key.""" async def set(self, key: str, value: Any, encoding: str | None = None) -> None: - """Set the value for the given key.""" + """Set a file in the database for the given key.""" + + async def has(self, key: str) -> bool: + """Check if the given file exists in the cosmosdb storage.""" + return True + + async def delete(self, key: str) -> None: + """Delete the given file from the cosmosdb storage.""" + + async def clear(self) -> None: + """Clear the cosmosdb storage.""" + + def keys(self) -> list[str]: + """Return the keys in the storage.""" + msg = "CosmosDB storage does yet not support listing keys." + raise NotImplementedError(msg) def child(self, name: str | None) -> "PipelineStorage": """Create a child storage instance.""" From e846edc95d341f75fc821a7df31883eabe15bccd Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 4 Nov 2024 15:46:52 -0500 Subject: [PATCH 003/104] added cosmos db container methods --- .../storage/cosmosdb_pipeline_storage.py | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 0d43956070..7393835bec 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -9,6 +9,7 @@ from typing import Any from azure.cosmos import CosmosClient +from azure.cosmos.partition_key import PartitionKey from azure.identity import DefaultAzureCredential from graphrag.logging import ProgressReporter @@ -56,6 +57,9 @@ def __init__( self._cosmosdb_account_url = cosmosdb_account_url self._current_container = _current_container or None self._cosmosdb_account_name = cosmosdb_account_url.split("//")[1].split(".")[0] + self._database_client = self._cosmos_client.get_database_client( + self._database_name + ) log.info( "creating cosmosdb storage with account: %s and database: %s", @@ -63,6 +67,8 @@ def __init__( self._database_name, ) self.create_database() + if self._current_container is not None: + self.create_container() def create_database(self) -> None: """Create the database if it doesn't exist.""" @@ -132,4 +138,35 @@ def child(self, name: str | None) -> "PipelineStorage": self._database_name, name, self._encoding, - ) \ No newline at end of file + ) + + def create_container(self) -> None: + """Create a container for the current container name if it doesn't exist.""" + database_client = self._database_client + if not self.container_exists() and self._current_container is not None: + container_names = [ + container["id"] + for container in database_client.list_containers() + ] + if self._current_container not in container_names: + partition_key = PartitionKey(path="/id", kind="Hash") + database_client.create_container( + id=self._current_container, + partition_key=partition_key, + ) + + + def delete_container(self) -> None: + """Delete the container with the current container name if it exists.""" + database_client = self._database_client + if self.container_exists() and self._current_container is not None: + database_client.delete_container(self._current_container) + + def container_exists(self) -> bool: + """Check if the container with the current container name exists.""" + database_client = self._database_client + container_names = [ + container["id"] + for container in database_client.list_containers() + ] + return self._current_container in container_names \ No newline at end of file From 439409f5556699cfe2ccb8f4cd7fd1b87d046753 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 5 Nov 2024 13:47:02 -0500 Subject: [PATCH 004/104] implemented has and delete methods --- .../storage/cosmosdb_pipeline_storage.py | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 7393835bec..e236900ce9 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -33,7 +33,7 @@ def __init__( primary_key: str | None, database_name: str, encoding: str | None = None, - _current_container: str | None = None, + current_container: str | None = None, ): """Initialize the CosmosDB-Storage.""" if not cosmosdb_account_url: @@ -55,7 +55,7 @@ def __init__( self._database_name = database_name self._primary_key = primary_key self._cosmosdb_account_url = cosmosdb_account_url - self._current_container = _current_container or None + self._current_container = current_container or None self._cosmosdb_account_name = cosmosdb_account_url.split("//")[1].split(".")[0] self._database_client = self._cosmos_client.get_database_client( self._database_name @@ -115,10 +115,26 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: async def has(self, key: str) -> bool: """Check if the given file exists in the cosmosdb storage.""" - return True + database_client = self._database_client + if self._current_container is not None: + container_client = database_client.get_container_client( + self._current_container + ) + item_names = [ + item["id"] + for item in container_client.read_all_items() + ] + return key in item_names + return False async def delete(self, key: str) -> None: """Delete the given file from the cosmosdb storage.""" + database_client = self._database_client + if self._current_container is not None: + container_client = database_client.get_container_client( + self._current_container + ) + container_client.delete_item(item=key, partition_key=key) async def clear(self) -> None: """Clear the cosmosdb storage.""" @@ -133,11 +149,11 @@ def child(self, name: str | None) -> "PipelineStorage": if name is None: return self return CosmosDBPipelineStorage( - self._cosmosdb_account_url, - self._primary_key, - self._database_name, - name, - self._encoding, + cosmosdb_account_url=self._cosmosdb_account_url, + primary_key=self._primary_key, + database_name=self._database_name, + encoding=self._encoding, + current_container=name, ) def create_container(self) -> None: From b010d14cfdb03d9e788bd85dfbbd30cc3a1803d4 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 5 Nov 2024 18:30:10 -0500 Subject: [PATCH 005/104] finished implementing abstract class methods --- .../storage/cosmosdb_pipeline_storage.py | 114 +++++++++++++++++- 1 file changed, 109 insertions(+), 5 deletions(-) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index e236900ce9..c4f249032a 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -3,6 +3,7 @@ """Azure CosmosDB Storage implementation of PipelineStorage.""" +import json import logging import re from collections.abc import Iterator @@ -11,6 +12,7 @@ from azure.cosmos import CosmosClient from azure.cosmos.partition_key import PartitionKey from azure.identity import DefaultAzureCredential +from datashaper import Progress from graphrag.logging import ProgressReporter @@ -101,17 +103,110 @@ def find( file_filter: dict[str, Any] | None = None, max_count=-1, ) -> Iterator[tuple[str, dict[str, Any]]]: - """Find files in the cosmosdb storage using a file pattern, as well as a custom filter function.""" - msg = "CosmosDB storage does yet not support finding files." - raise NotImplementedError(msg) - + """Find documents in a Cosmos DB container using a file pattern and custom filter function. + + Params: + base_dir: The name of the base directory (not used in Cosmos DB context). + file_pattern: The file pattern to use. + file_filter: A dictionary of key-value pairs to filter the documents. + max_count: The maximum number of documents to return. If -1, all documents are returned. + + Returns + ------- + An iterator of document IDs and their corresponding regex matches. + """ + base_dir = base_dir or "" + + log.info( + "search container %s for documents matching %s", + self._current_container, + file_pattern.pattern, + ) + + def item_filter(item: dict[str, Any]) -> bool: + if file_filter is None: + return True + return all(re.match(value, item.get(key, "")) for key, value in file_filter.items()) + + try: + database_client = self._database_client + container_client = database_client.get_container_client(str(self._current_container)) + query = "SELECT * FROM c WHERE CONTAINS(c.id, @pattern)" + parameters: list[dict[str, Any]] = [{"name": "@pattern", "value": file_pattern.pattern}] + if file_filter: + for key, value in file_filter.items(): + query += f" AND c.{key} = @{key}" + parameters.append({"name": f"@{key}", "value": value}) + items = container_client.query_items(query=query, parameters=parameters, enable_cross_partition_query=True) + num_loaded = 0 + num_total = len(list(items)) + num_filtered = 0 + for item in items: + match = file_pattern.match(item["id"]) + if match: + group = match.groupdict() + if item_filter(group): + yield (item["id"], group) + num_loaded += 1 + if max_count > 0 and num_loaded >= max_count: + break + else: + num_filtered += 1 + else: + num_filtered += 1 + if progress is not None: + progress( + _create_progress_status(num_loaded, num_filtered, num_total) + ) + except Exception: + log.exception("An error occurred while searching for documents in Cosmos DB.") + async def get( self, key: str, as_bytes: bool | None = None, encoding: str | None = None ) -> Any: """Get a file in the database for the given key.""" + try: + database_client = self._database_client + if self._current_container is not None: + container_client = database_client.get_container_client( + self._current_container + ) + item = container_client.read_item(item=key, partition_key=key) + item_body = item.get("body") + if as_bytes: + coding = encoding or "utf-8" + return json.dumps(item_body).encode(coding) + return json.dumps(item_body) + except Exception: + log.exception("Error reading item %s", key) + return None + else: + return None async def set(self, key: str, value: Any, encoding: str | None = None) -> None: """Set a file in the database for the given key.""" + try: + database_client = self._database_client + if self._current_container is not None: + container_client = database_client.get_container_client( + self._current_container + ) + if isinstance(value, bytes): + coding = encoding or "utf-8" + value = value.decode(coding) + cosmos_db_item = { + "id": key, + "body": value + } + container_client.upsert_item(body=cosmos_db_item) + else: + cosmos_db_item = { + "id": key, + "body": json.loads(value) + } + container_client.upsert_item(body=cosmos_db_item) + except Exception: + log.exception("Error writing item %s", key) async def has(self, key: str) -> bool: """Check if the given file exists in the cosmosdb storage.""" @@ -185,4 +280,13 @@ def container_exists(self) -> bool: container["id"] for container in database_client.list_containers() ] - return self._current_container in container_names \ No newline at end of file + return self._current_container in container_names + +def _create_progress_status( + num_loaded: int, num_filtered: int, num_total: int +) -> Progress: + return Progress( + total_items=num_total, + completed_items=num_loaded + num_filtered, + description=f"{num_loaded} files loaded ({num_filtered} filtered)", + ) From 923a791c7294c902ad10cd9e7970964178824f80 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 6 Nov 2024 11:38:55 -0500 Subject: [PATCH 006/104] integrated class into storage factory --- graphrag/index/config/cache.py | 2 +- graphrag/index/config/storage.py | 30 +++++++++++++++++-- .../storage/cosmosdb_pipeline_storage.py | 21 +++++++++++++ graphrag/index/storage/load_storage.py | 10 +++++++ 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index be1053de2e..dd431afd72 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing 'PipelineCacheConfig', 'PipelineFileCacheConfig' and 'PipelineMemoryCacheConfig' models.""" +"""A module containing 'PipelineCacheConfig', 'PipelineFileCacheConfig', 'PipelineMemoryCacheConfig', 'PipelineBlobCacheConfig', 'PipelineCosmosDBCacheConfig' models.""" from __future__ import annotations diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index 023d50e249..5b031dfd2a 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing 'PipelineStorageConfig', 'PipelineFileStorageConfig' and 'PipelineMemoryStorageConfig' models.""" +"""A module containing 'PipelineStorageConfig', 'PipelineFileStorageConfig','PipelineMemoryStorageConfig', 'PipelineBlobStorageConfig', and 'PipelineCosmosDBStorageConfig' models.""" from __future__ import annotations @@ -66,7 +66,33 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] ) """The storage account blob url.""" +class PipelineCosmosDBStorageConfig(PipelineStorageConfig[Literal[StorageType.cosmosdb]]): + """Represents the cosmosdb storage configuration for the pipeline.""" + + type: Literal[StorageType.cosmosdb] = StorageType.cosmosdb + """The type of storage.""" + + primary_key: str | None = pydantic_Field( + description="The cosmosdb storage primary key for the storage.", default=None + ) + """The cosmosdb storage primary key for the storage.""" + + container_name: str | None = pydantic_Field( + description="The container name for storage", default=None + ) + """The container name for storage.""" + + base_dir: str | None = pydantic_Field( + description="The base directory for the storage.", default=None + ) + """The base directory for the storage.""" + + cosmosdb_account_url: str = pydantic_Field( + description="The cosmosdb account url.", default=None + ) + """The cosmosdb account url.""" + PipelineStorageConfigTypes = ( - PipelineFileStorageConfig | PipelineMemoryStorageConfig | PipelineBlobStorageConfig + PipelineFileStorageConfig | PipelineMemoryStorageConfig | PipelineBlobStorageConfig | PipelineCosmosDBStorageConfig ) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index c4f249032a..4f5ef92d22 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -282,6 +282,27 @@ def container_exists(self) -> bool: ] return self._current_container in container_names +def create_cosmosdb_storage( + cosmosdb_account_url: str, + primary_key: str | None, + base_dir: str | None, + container_name: str | None, +) -> PipelineStorage: + """Create a CosmosDB storage instance.""" + log.info("Creating cosmosdb storage") + if cosmosdb_account_url is None: + msg = "No cosmosdb account url provided" + raise ValueError(msg) + if base_dir is None: + msg = "No base_dir provided for database name" + raise ValueError(msg) + return CosmosDBPipelineStorage( + cosmosdb_account_url=cosmosdb_account_url, + primary_key=primary_key, + database_name=base_dir, + current_container=container_name, + ) + def _create_progress_status( num_loaded: int, num_filtered: int, num_total: int ) -> Progress: diff --git a/graphrag/index/storage/load_storage.py b/graphrag/index/storage/load_storage.py index 33d61ee97f..98b9862b5c 100644 --- a/graphrag/index/storage/load_storage.py +++ b/graphrag/index/storage/load_storage.py @@ -10,11 +10,13 @@ from graphrag.config import StorageType from graphrag.index.config.storage import ( PipelineBlobStorageConfig, + PipelineCosmosDBStorageConfig, PipelineFileStorageConfig, PipelineStorageConfig, ) from .blob_pipeline_storage import create_blob_storage +from .cosmosdb_pipeline_storage import create_cosmosdb_storage from .file_pipeline_storage import create_file_storage from .memory_pipeline_storage import create_memory_storage @@ -32,6 +34,14 @@ def load_storage(config: PipelineStorageConfig): config.container_name, config.base_dir, ) + case StorageType.cosmosdb: + config = cast(PipelineCosmosDBStorageConfig, config) + return create_cosmosdb_storage( + config.cosmosdb_account_url, + config.primary_key, + config.base_dir, + config.container_name, + ) case StorageType.file: config = cast(PipelineFileStorageConfig, config) return create_file_storage(config.base_dir) From 8cd45cbd01e18f22289f49ca632ee1297c9c3b98 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 6 Nov 2024 13:04:23 -0500 Subject: [PATCH 007/104] integrated cosmosdb class into cache factory --- graphrag/index/cache/load_cache.py | 16 +++++++++++++++- graphrag/index/config/cache.py | 21 +++++++++++++++++++++ graphrag/index/storage/__init__.py | 3 +++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/graphrag/index/cache/load_cache.py b/graphrag/index/cache/load_cache.py index 4e0e6324fb..78aacb2492 100644 --- a/graphrag/index/cache/load_cache.py +++ b/graphrag/index/cache/load_cache.py @@ -10,9 +10,14 @@ from graphrag.config.enums import CacheType from graphrag.index.config.cache import ( PipelineBlobCacheConfig, + PipelineCosmosDBCacheConfig, PipelineFileCacheConfig, ) -from graphrag.index.storage import BlobPipelineStorage, FilePipelineStorage +from graphrag.index.storage import ( + BlobPipelineStorage, + FilePipelineStorage, + create_cosmosdb_storage, +) if TYPE_CHECKING: from graphrag.index.config import ( @@ -46,6 +51,15 @@ def load_cache(config: PipelineCacheConfig | None, root_dir: str | None): storage_account_blob_url=config.storage_account_blob_url, ).child(config.base_dir) return JsonPipelineCache(storage) + case CacheType.cosmosdb: + config = cast(PipelineCosmosDBCacheConfig, config) + storage = create_cosmosdb_storage( + cosmosdb_account_url=config.cosmosdb_account_url, + primary_key=config.primary_key, + container_name=None, + base_dir=config.base_dir, + ) + return JsonPipelineCache(storage) case _: msg = f"Unknown cache type: {config.type}" raise ValueError(msg) diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index dd431afd72..20f6de7175 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -73,10 +73,31 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): ) """The storage account blob url for cache""" +class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb]]): + """Represents the cosmosdb cache configuration for the pipeline.""" + + type: Literal[CacheType.cosmosdb] = CacheType.cosmosdb + """The type of cache.""" + + base_dir: str | None = pydantic_Field( + description="The base directory for the cache.", default=None + ) + """The base directory for the cache.""" + + primary_key: str | None = pydantic_Field( + description="The cosmosdb primary key for the cache.", default=None + ) + """The cosmosdb primary key for the cache.""" + + cosmosdb_account_url: str = pydantic_Field( + description="The cosmosdb account url for cache", default=None + ) + """The cosmosdb account url for cache""" PipelineCacheConfigTypes = ( PipelineFileCacheConfig | PipelineMemoryCacheConfig | PipelineBlobCacheConfig | PipelineNoneCacheConfig + | PipelineCosmosDBCacheConfig ) diff --git a/graphrag/index/storage/__init__.py b/graphrag/index/storage/__init__.py index d1025d24d8..630ce7f7fa 100644 --- a/graphrag/index/storage/__init__.py +++ b/graphrag/index/storage/__init__.py @@ -4,6 +4,7 @@ """The Indexing Engine storage package root.""" from .blob_pipeline_storage import BlobPipelineStorage, create_blob_storage +from .cosmosdb_pipeline_storage import CosmosDBPipelineStorage, create_cosmosdb_storage from .file_pipeline_storage import FilePipelineStorage from .load_storage import load_storage from .memory_pipeline_storage import MemoryPipelineStorage @@ -11,9 +12,11 @@ __all__ = [ "BlobPipelineStorage", + "CosmosDBPipelineStorage", "FilePipelineStorage", "MemoryPipelineStorage", "PipelineStorage", "create_blob_storage", + "create_cosmosdb_storage", "load_storage", ] From b041e5124c18512edea9acf09491442c038dd559 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 6 Nov 2024 14:34:48 -0500 Subject: [PATCH 008/104] added support for new config file fields --- graphrag/config/create_graphrag_config.py | 6 ++++ .../config/input_models/cache_config_input.py | 2 ++ .../input_models/storage_config_input.py | 2 ++ graphrag/config/models/cache_config.py | 6 ++++ graphrag/config/models/storage_config.py | 7 ++++ graphrag/index/create_pipeline_config.py | 34 +++++++++++++++++++ 6 files changed, 57 insertions(+) diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index a750ae840e..2fc8a292e6 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -353,6 +353,8 @@ def hydrate_parallelization_params( storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.CACHE_BASE_DIR, + cosmosdb_account_url=reader.str(Fragment.cosmosdb_account_url), + primary_key=reader.str(Fragment.primary_key), ) with ( reader.envvar_prefix(Section.reporting), @@ -374,6 +376,8 @@ def hydrate_parallelization_params( storage_account_blob_url=reader.str(Fragment.storage_account_blob_url), container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.STORAGE_BASE_DIR, + cosmosdb_account_url=reader.str(Fragment.cosmosdb_account_url), + primary_key=reader.str(Fragment.primary_key), ) with ( @@ -600,6 +604,7 @@ class Fragment(str, Enum): concurrent_requests = "CONCURRENT_REQUESTS" conn_string = "CONNECTION_STRING" container_name = "CONTAINER_NAME" + cosmosdb_account_url = "COSMOSDB_ACCOUNT_URL" deployment_name = "DEPLOYMENT_NAME" description = "DESCRIPTION" enabled = "ENABLED" @@ -616,6 +621,7 @@ class Fragment(str, Enum): n = "N" model = "MODEL" model_supports_json = "MODEL_SUPPORTS_JSON" + primary_key = "PRIMARY_KEY" prompt_file = "PROMPT_FILE" request_timeout = "REQUEST_TIMEOUT" rpm = "REQUESTS_PER_MINUTE" diff --git a/graphrag/config/input_models/cache_config_input.py b/graphrag/config/input_models/cache_config_input.py index fe88d35b44..d7f65442fe 100644 --- a/graphrag/config/input_models/cache_config_input.py +++ b/graphrag/config/input_models/cache_config_input.py @@ -16,3 +16,5 @@ class CacheConfigInput(TypedDict): connection_string: NotRequired[str | None] container_name: NotRequired[str | None] storage_account_blob_url: NotRequired[str | None] + cosmosdb_account_url: NotRequired[str | None] + primary_key: NotRequired[str | None] diff --git a/graphrag/config/input_models/storage_config_input.py b/graphrag/config/input_models/storage_config_input.py index cc5caf7952..4a26ebfb0d 100644 --- a/graphrag/config/input_models/storage_config_input.py +++ b/graphrag/config/input_models/storage_config_input.py @@ -16,3 +16,5 @@ class StorageConfigInput(TypedDict): connection_string: NotRequired[str | None] container_name: NotRequired[str | None] storage_account_blob_url: NotRequired[str | None] + cosmosdb_account_url: NotRequired[str | None] + primary_key: NotRequired[str | None] diff --git a/graphrag/config/models/cache_config.py b/graphrag/config/models/cache_config.py index 4589edce0b..5224322dad 100644 --- a/graphrag/config/models/cache_config.py +++ b/graphrag/config/models/cache_config.py @@ -27,3 +27,9 @@ class CacheConfig(BaseModel): storage_account_blob_url: str | None = Field( description="The storage account blob url to use.", default=None ) + cosmosdb_account_url: str | None = Field( + description="The cosmosdb account url to use.", default=None + ) + primary_key: str | None = Field( + description="The primary key to use.", default=None + ) diff --git a/graphrag/config/models/storage_config.py b/graphrag/config/models/storage_config.py index dcf41b9222..743a5bc521 100644 --- a/graphrag/config/models/storage_config.py +++ b/graphrag/config/models/storage_config.py @@ -28,3 +28,10 @@ class StorageConfig(BaseModel): storage_account_blob_url: str | None = Field( description="The storage account blob url to use.", default=None ) + cosmosdb_account_url: str | None = Field( + description="The cosmosdb account url to use.", default=None + ) + primary_key: str | None = Field( + description="The primary key to use.", default=None + ) + diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index e0ab305fea..6ebf18dbf0 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -18,6 +18,7 @@ from graphrag.index.config.cache import ( PipelineBlobCacheConfig, PipelineCacheConfigTypes, + PipelineCosmosDBCacheConfig, PipelineFileCacheConfig, PipelineMemoryCacheConfig, PipelineNoneCacheConfig, @@ -42,6 +43,7 @@ ) from graphrag.index.config.storage import ( PipelineBlobStorageConfig, + PipelineCosmosDBStorageConfig, PipelineFileStorageConfig, PipelineMemoryStorageConfig, PipelineStorageConfigTypes, @@ -413,6 +415,23 @@ def _get_storage_config( base_dir=storage_settings.base_dir, storage_account_blob_url=storage_account_blob_url, ) + case StorageType.cosmosdb: + cosmosdb_account_url = storage_settings.cosmosdb_account_url + primary_key = storage_settings.primary_key + container_name = storage_settings.container_name + base_dir = storage_settings.base_dir + if cosmosdb_account_url is None: + msg = "CosmosDB account url must be provided for cosmosdb storage." + raise ValueError(msg) + if base_dir is None: + msg = "Base directory must be provided for cosmosdb storage." + raise ValueError(msg) + return PipelineCosmosDBStorageConfig( + cosmosdb_account_url=cosmosdb_account_url, + primary_key=primary_key, + container_name=container_name, + base_dir=storage_settings.base_dir, + ) case _: # relative to the root_dir base_dir = storage_settings.base_dir @@ -450,6 +469,21 @@ def _get_cache_config( base_dir=settings.cache.base_dir, storage_account_blob_url=storage_account_blob_url, ) + case CacheType.cosmosdb: + cosmosdb_account_url = settings.cache.cosmosdb_account_url + primary_key = settings.cache.primary_key + base_dir = settings.cache.base_dir + if cosmosdb_account_url is None: + msg = "CosmosDB account url must be provided for cosmosdb cache." + raise ValueError(msg) + if base_dir is None: + msg = "Base directory must be provided for cosmosdb cache." + raise ValueError(msg) + return PipelineCosmosDBCacheConfig( + cosmosdb_account_url=cosmosdb_account_url, + primary_key=primary_key, + base_dir=settings.cache.base_dir, + ) case _: # relative to root dir return PipelineFileCacheConfig(base_dir="./cache") From a76eb54b2f1b4f6f7618b4dde1f96f6b1a390001 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Fri, 8 Nov 2024 13:05:12 -0500 Subject: [PATCH 009/104] replaced primary key cosmosdb initialization with connection strings --- graphrag/config/create_graphrag_config.py | 3 -- .../config/input_models/cache_config_input.py | 2 +- .../input_models/storage_config_input.py | 2 +- graphrag/config/models/cache_config.py | 3 -- graphrag/config/models/storage_config.py | 3 -- graphrag/index/cache/load_cache.py | 2 +- graphrag/index/config/cache.py | 4 +- graphrag/index/config/storage.py | 4 +- graphrag/index/create_pipeline_config.py | 14 +++--- .../storage/cosmosdb_pipeline_storage.py | 45 ++++++++++--------- graphrag/index/storage/load_storage.py | 2 +- 11 files changed, 39 insertions(+), 45 deletions(-) diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index 2fc8a292e6..01fb35ec88 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -354,7 +354,6 @@ def hydrate_parallelization_params( container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.CACHE_BASE_DIR, cosmosdb_account_url=reader.str(Fragment.cosmosdb_account_url), - primary_key=reader.str(Fragment.primary_key), ) with ( reader.envvar_prefix(Section.reporting), @@ -377,7 +376,6 @@ def hydrate_parallelization_params( container_name=reader.str(Fragment.container_name), base_dir=reader.str(Fragment.base_dir) or defs.STORAGE_BASE_DIR, cosmosdb_account_url=reader.str(Fragment.cosmosdb_account_url), - primary_key=reader.str(Fragment.primary_key), ) with ( @@ -621,7 +619,6 @@ class Fragment(str, Enum): n = "N" model = "MODEL" model_supports_json = "MODEL_SUPPORTS_JSON" - primary_key = "PRIMARY_KEY" prompt_file = "PROMPT_FILE" request_timeout = "REQUEST_TIMEOUT" rpm = "REQUESTS_PER_MINUTE" diff --git a/graphrag/config/input_models/cache_config_input.py b/graphrag/config/input_models/cache_config_input.py index d7f65442fe..2ca4f3aad3 100644 --- a/graphrag/config/input_models/cache_config_input.py +++ b/graphrag/config/input_models/cache_config_input.py @@ -17,4 +17,4 @@ class CacheConfigInput(TypedDict): container_name: NotRequired[str | None] storage_account_blob_url: NotRequired[str | None] cosmosdb_account_url: NotRequired[str | None] - primary_key: NotRequired[str | None] + diff --git a/graphrag/config/input_models/storage_config_input.py b/graphrag/config/input_models/storage_config_input.py index 4a26ebfb0d..729a041939 100644 --- a/graphrag/config/input_models/storage_config_input.py +++ b/graphrag/config/input_models/storage_config_input.py @@ -17,4 +17,4 @@ class StorageConfigInput(TypedDict): container_name: NotRequired[str | None] storage_account_blob_url: NotRequired[str | None] cosmosdb_account_url: NotRequired[str | None] - primary_key: NotRequired[str | None] + diff --git a/graphrag/config/models/cache_config.py b/graphrag/config/models/cache_config.py index 5224322dad..fb4d22b229 100644 --- a/graphrag/config/models/cache_config.py +++ b/graphrag/config/models/cache_config.py @@ -30,6 +30,3 @@ class CacheConfig(BaseModel): cosmosdb_account_url: str | None = Field( description="The cosmosdb account url to use.", default=None ) - primary_key: str | None = Field( - description="The primary key to use.", default=None - ) diff --git a/graphrag/config/models/storage_config.py b/graphrag/config/models/storage_config.py index 743a5bc521..552c91ca83 100644 --- a/graphrag/config/models/storage_config.py +++ b/graphrag/config/models/storage_config.py @@ -31,7 +31,4 @@ class StorageConfig(BaseModel): cosmosdb_account_url: str | None = Field( description="The cosmosdb account url to use.", default=None ) - primary_key: str | None = Field( - description="The primary key to use.", default=None - ) diff --git a/graphrag/index/cache/load_cache.py b/graphrag/index/cache/load_cache.py index 78aacb2492..13f0d8eecf 100644 --- a/graphrag/index/cache/load_cache.py +++ b/graphrag/index/cache/load_cache.py @@ -55,7 +55,7 @@ def load_cache(config: PipelineCacheConfig | None, root_dir: str | None): config = cast(PipelineCosmosDBCacheConfig, config) storage = create_cosmosdb_storage( cosmosdb_account_url=config.cosmosdb_account_url, - primary_key=config.primary_key, + connection_string=config.connection_string, container_name=None, base_dir=config.base_dir, ) diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 20f6de7175..aeb17af4b8 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -84,12 +84,12 @@ class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb ) """The base directory for the cache.""" - primary_key: str | None = pydantic_Field( + connection_string: str | None = pydantic_Field( description="The cosmosdb primary key for the cache.", default=None ) """The cosmosdb primary key for the cache.""" - cosmosdb_account_url: str = pydantic_Field( + cosmosdb_account_url: str | None = pydantic_Field( description="The cosmosdb account url for cache", default=None ) """The cosmosdb account url for cache""" diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index 5b031dfd2a..7e834a6b92 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -72,7 +72,7 @@ class PipelineCosmosDBStorageConfig(PipelineStorageConfig[Literal[StorageType.co type: Literal[StorageType.cosmosdb] = StorageType.cosmosdb """The type of storage.""" - primary_key: str | None = pydantic_Field( + connection_string: str | None = pydantic_Field( description="The cosmosdb storage primary key for the storage.", default=None ) """The cosmosdb storage primary key for the storage.""" @@ -87,7 +87,7 @@ class PipelineCosmosDBStorageConfig(PipelineStorageConfig[Literal[StorageType.co ) """The base directory for the storage.""" - cosmosdb_account_url: str = pydantic_Field( + cosmosdb_account_url: str | None = pydantic_Field( description="The cosmosdb account url.", default=None ) """The cosmosdb account url.""" diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 6ebf18dbf0..6b92ead3ee 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -417,7 +417,7 @@ def _get_storage_config( ) case StorageType.cosmosdb: cosmosdb_account_url = storage_settings.cosmosdb_account_url - primary_key = storage_settings.primary_key + connection_string = storage_settings.connection_string container_name = storage_settings.container_name base_dir = storage_settings.base_dir if cosmosdb_account_url is None: @@ -428,7 +428,7 @@ def _get_storage_config( raise ValueError(msg) return PipelineCosmosDBStorageConfig( cosmosdb_account_url=cosmosdb_account_url, - primary_key=primary_key, + connection_string=connection_string, container_name=container_name, base_dir=storage_settings.base_dir, ) @@ -471,17 +471,17 @@ def _get_cache_config( ) case CacheType.cosmosdb: cosmosdb_account_url = settings.cache.cosmosdb_account_url - primary_key = settings.cache.primary_key + connection_string = settings.cache.connection_string base_dir = settings.cache.base_dir - if cosmosdb_account_url is None: - msg = "CosmosDB account url must be provided for cosmosdb cache." - raise ValueError(msg) if base_dir is None: msg = "Base directory must be provided for cosmosdb cache." raise ValueError(msg) + if connection_string is None and cosmosdb_account_url is None: + msg = "Connection string or cosmosDB account url must be provided for cosmosdb cache." + raise ValueError(msg) return PipelineCosmosDBCacheConfig( cosmosdb_account_url=cosmosdb_account_url, - primary_key=primary_key, + connection_string=connection_string, base_dir=settings.cache.base_dir, ) case _: diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 4f5ef92d22..7121fa0e3a 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -23,31 +23,30 @@ class CosmosDBPipelineStorage(PipelineStorage): """The CosmosDB-Storage Implementation.""" - _cosmosdb_account_url: str - _primary_key: str | None + _cosmosdb_account_url: str | None + _connection_string: str | None _database_name: str _current_container: str | None _encoding: str def __init__( self, - cosmosdb_account_url: str, - primary_key: str | None, + cosmosdb_account_url: str | None, + connection_string: str | None, database_name: str, encoding: str | None = None, current_container: str | None = None, ): """Initialize the CosmosDB-Storage.""" - if not cosmosdb_account_url: - msg = "cosmosdb_account_url is required" - raise ValueError(msg) - - if primary_key: - self._cosmos_client = CosmosClient( - url=cosmosdb_account_url, - credential=primary_key, + if connection_string: + self._cosmos_client = CosmosClient.from_connection_string( + connection_string ) else: + if cosmosdb_account_url is None: + msg = "Either connection_string or cosmosdb_accoun_url must be provided." + raise ValueError(msg) + self._cosmos_client = CosmosClient( url=cosmosdb_account_url, credential=DefaultAzureCredential(), @@ -55,10 +54,14 @@ def __init__( self._encoding = encoding or "utf-8" self._database_name = database_name - self._primary_key = primary_key + self._connection_string = connection_string self._cosmosdb_account_url = cosmosdb_account_url self._current_container = current_container or None - self._cosmosdb_account_name = cosmosdb_account_url.split("//")[1].split(".")[0] + self._cosmosdb_account_name = ( + cosmosdb_account_url.split("//")[1].split(".")[0] + if cosmosdb_account_url + else None + ) self._database_client = self._cosmos_client.get_database_client( self._database_name ) @@ -245,7 +248,7 @@ def child(self, name: str | None) -> "PipelineStorage": return self return CosmosDBPipelineStorage( cosmosdb_account_url=self._cosmosdb_account_url, - primary_key=self._primary_key, + connection_string=self._connection_string, database_name=self._database_name, encoding=self._encoding, current_container=name, @@ -283,22 +286,22 @@ def container_exists(self) -> bool: return self._current_container in container_names def create_cosmosdb_storage( - cosmosdb_account_url: str, - primary_key: str | None, + cosmosdb_account_url: str | None, + connection_string: str | None, base_dir: str | None, container_name: str | None, ) -> PipelineStorage: """Create a CosmosDB storage instance.""" log.info("Creating cosmosdb storage") - if cosmosdb_account_url is None: - msg = "No cosmosdb account url provided" - raise ValueError(msg) if base_dir is None: msg = "No base_dir provided for database name" raise ValueError(msg) + if connection_string is None and cosmosdb_account_url is None: + msg = "No cosmosdb account url provided" + raise ValueError(msg) return CosmosDBPipelineStorage( cosmosdb_account_url=cosmosdb_account_url, - primary_key=primary_key, + connection_string=connection_string, database_name=base_dir, current_container=container_name, ) diff --git a/graphrag/index/storage/load_storage.py b/graphrag/index/storage/load_storage.py index 98b9862b5c..16e146dfb2 100644 --- a/graphrag/index/storage/load_storage.py +++ b/graphrag/index/storage/load_storage.py @@ -38,7 +38,7 @@ def load_storage(config: PipelineStorageConfig): config = cast(PipelineCosmosDBStorageConfig, config) return create_cosmosdb_storage( config.cosmosdb_account_url, - config.primary_key, + config.connection_string, config.base_dir, config.container_name, ) From e0a054695803bc4456335df8d7b4b858dfe1a823 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 12 Nov 2024 16:28:11 -0500 Subject: [PATCH 010/104] modified cosmosdb setter to require json --- graphrag/index/emit/json_table_emitter.py | 2 +- .../storage/cosmosdb_pipeline_storage.py | 23 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/graphrag/index/emit/json_table_emitter.py b/graphrag/index/emit/json_table_emitter.py index 0b18c717a6..8203c4677b 100644 --- a/graphrag/index/emit/json_table_emitter.py +++ b/graphrag/index/emit/json_table_emitter.py @@ -30,5 +30,5 @@ async def emit(self, name: str, data: pd.DataFrame) -> None: log.info("emitting JSON table %s", filename) await self._storage.set( filename, - data.to_json(orient="records", lines=True, force_ascii=False), + data.to_json(orient="records", lines=False, force_ascii=False), ) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 7121fa0e3a..8fde53bf4a 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -195,19 +195,18 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: self._current_container ) if isinstance(value, bytes): - coding = encoding or "utf-8" - value = value.decode(coding) - cosmos_db_item = { - "id": key, - "body": value - } - container_client.upsert_item(body=cosmos_db_item) + msg = "Parquet table emitter not supported for CosmosDB storage." + log.exception(msg) else: - cosmos_db_item = { - "id": key, - "body": json.loads(value) - } - container_client.upsert_item(body=cosmos_db_item) + try: + cosmos_db_item = { + "id": key, + "body": json.loads(value) + } + container_client.upsert_item(body=cosmos_db_item) + except Exception: + msg = "CSV table emitter not supported for CosmosDB storage." + log.exception(msg) except Exception: log.exception("Error writing item %s", key) From 6d2427e118fcef179bf469a9f97f0af67a398aef Mon Sep 17 00:00:00 2001 From: Alonso Guevara Date: Wed, 13 Nov 2024 18:15:40 -0600 Subject: [PATCH 011/104] Fix non-default emitters --- .../next-release/patch-20241114001527332372.json | 4 ++++ graphrag/index/emit/csv_table_emitter.py | 3 ++- graphrag/index/emit/json_table_emitter.py | 3 ++- graphrag/index/emit/parquet_table_emitter.py | 3 ++- graphrag/index/emit/table_emitter.py | 1 + graphrag/index/run/workflow.py | 6 ++++-- graphrag/utils/storage.py | 10 +++++++++- 7 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 .semversioner/next-release/patch-20241114001527332372.json diff --git a/.semversioner/next-release/patch-20241114001527332372.json b/.semversioner/next-release/patch-20241114001527332372.json new file mode 100644 index 0000000000..a2fe39602e --- /dev/null +++ b/.semversioner/next-release/patch-20241114001527332372.json @@ -0,0 +1,4 @@ +{ + "type": "patch", + "description": "Fix issue when using emitters that are not the default parque output" +} diff --git a/graphrag/index/emit/csv_table_emitter.py b/graphrag/index/emit/csv_table_emitter.py index c0305c254b..aa27e0e3c5 100644 --- a/graphrag/index/emit/csv_table_emitter.py +++ b/graphrag/index/emit/csv_table_emitter.py @@ -18,6 +18,7 @@ class CSVTableEmitter(TableEmitter): """CSVTableEmitter class.""" _storage: PipelineStorage + extension = "csv" def __init__(self, storage: PipelineStorage): """Create a new CSV Table Emitter.""" @@ -25,7 +26,7 @@ def __init__(self, storage: PipelineStorage): async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" - filename = f"{name}.csv" + filename = f"{name}.{self.extension}" log.info("emitting CSV table %s", filename) await self._storage.set( filename, diff --git a/graphrag/index/emit/json_table_emitter.py b/graphrag/index/emit/json_table_emitter.py index 0b18c717a6..444bdf6ba9 100644 --- a/graphrag/index/emit/json_table_emitter.py +++ b/graphrag/index/emit/json_table_emitter.py @@ -18,6 +18,7 @@ class JsonTableEmitter(TableEmitter): """JsonTableEmitter class.""" _storage: PipelineStorage + extension = "json" def __init__(self, storage: PipelineStorage): """Create a new Json Table Emitter.""" @@ -25,7 +26,7 @@ def __init__(self, storage: PipelineStorage): async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" - filename = f"{name}.json" + filename = f"{name}.{self.extension}" log.info("emitting JSON table %s", filename) await self._storage.set( diff --git a/graphrag/index/emit/parquet_table_emitter.py b/graphrag/index/emit/parquet_table_emitter.py index 753915a79a..50b0b54bb4 100644 --- a/graphrag/index/emit/parquet_table_emitter.py +++ b/graphrag/index/emit/parquet_table_emitter.py @@ -22,6 +22,7 @@ class ParquetTableEmitter(TableEmitter): _storage: PipelineStorage _on_error: ErrorHandlerFn + extension = "parquet" def __init__( self, @@ -34,7 +35,7 @@ def __init__( async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" - filename = f"{name}.parquet" + filename = f"{name}.{self.extension}" log.info("emitting parquet table %s", filename) try: await self._storage.set(filename, data.to_parquet()) diff --git a/graphrag/index/emit/table_emitter.py b/graphrag/index/emit/table_emitter.py index 2161eeb523..2e63c50fac 100644 --- a/graphrag/index/emit/table_emitter.py +++ b/graphrag/index/emit/table_emitter.py @@ -10,6 +10,7 @@ class TableEmitter(Protocol): """TableEmitter protocol for emitting tables to a destination.""" + extension: str async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" diff --git a/graphrag/index/run/workflow.py b/graphrag/index/run/workflow.py index a59244a20d..5b616a22b7 100644 --- a/graphrag/index/run/workflow.py +++ b/graphrag/index/run/workflow.py @@ -33,6 +33,7 @@ async def _inject_workflow_data_dependencies( workflow_dependencies: dict[str, list[str]], dataset: pd.DataFrame, storage: PipelineStorage, + extension: str, ) -> None: """Inject the data dependencies into the workflow.""" workflow.add_table(DEFAULT_INPUT_NAME, dataset) @@ -41,7 +42,7 @@ async def _inject_workflow_data_dependencies( for id in deps: workflow_id = f"workflow:{id}" try: - table = await _load_table_from_storage(f"{id}.parquet", storage) + table = await _load_table_from_storage(f"{id}.{extension}", storage) except ValueError: # our workflows now allow transient tables, and we avoid putting those in primary storage # however, we need to keep the table in the dependency list for proper execution order @@ -97,8 +98,9 @@ async def _process_workflow( return None context.stats.workflows[workflow_name] = {"overall": 0.0} + await _inject_workflow_data_dependencies( - workflow, workflow_dependencies, dataset, context.storage + workflow, workflow_dependencies, dataset, context.storage, emitters[0].extension ) workflow_start_time = time.time() diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 60d08b6309..5863c46440 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -47,7 +47,15 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da raise ValueError(msg) try: log.info("read table from storage: %s", name) - return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) + match name.split(".")[-1]: + case "parquet": + return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) + case "json": + return pd.read_json(BytesIO(await storage.get(name, as_bytes=True)), lines=True, orient="records") + case "csv": + return pd.read_csv(BytesIO(await storage.get(name, as_bytes=True))) + case _: + raise ValueError(f"Unknown file extension for {name}") except Exception: log.exception("error loading table from storage: %s", name) raise From d206e673a69bb7c994889b8b6c44ec08c9222d50 Mon Sep 17 00:00:00 2001 From: Alonso Guevara Date: Wed, 13 Nov 2024 18:19:06 -0600 Subject: [PATCH 012/104] Format --- graphrag/index/emit/table_emitter.py | 1 + graphrag/utils/storage.py | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/graphrag/index/emit/table_emitter.py b/graphrag/index/emit/table_emitter.py index 2e63c50fac..82e37d3135 100644 --- a/graphrag/index/emit/table_emitter.py +++ b/graphrag/index/emit/table_emitter.py @@ -10,6 +10,7 @@ class TableEmitter(Protocol): """TableEmitter protocol for emitting tables to a destination.""" + extension: str async def emit(self, name: str, data: pd.DataFrame) -> None: diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 5863c46440..479d0c0cf3 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -51,11 +51,15 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da case "parquet": return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) case "json": - return pd.read_json(BytesIO(await storage.get(name, as_bytes=True)), lines=True, orient="records") + return pd.read_json( + BytesIO(await storage.get(name, as_bytes=True)), + lines=True, + orient="records", + ) case "csv": return pd.read_csv(BytesIO(await storage.get(name, as_bytes=True))) - case _: - raise ValueError(f"Unknown file extension for {name}") + case _: + raise ValueError(f"Unknown file extension for {name}") except Exception: log.exception("error loading table from storage: %s", name) raise From ea7a404098d113244b2fa4cbb50477bdcdb81bdd Mon Sep 17 00:00:00 2001 From: Alonso Guevara Date: Wed, 13 Nov 2024 18:23:56 -0600 Subject: [PATCH 013/104] Ruff --- graphrag/utils/storage.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 479d0c0cf3..0cdf8cf23b 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -59,7 +59,9 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da case "csv": return pd.read_csv(BytesIO(await storage.get(name, as_bytes=True))) case _: - raise ValueError(f"Unknown file extension for {name}") + msg = f"Unknown file extension for {name}" + log.exception(msg) + raise ValueError(msg) except Exception: log.exception("error loading table from storage: %s", name) raise From 297066c168a1605da4902f667d7cf0030cbce2ff Mon Sep 17 00:00:00 2001 From: Alonso Guevara Date: Wed, 13 Nov 2024 18:41:26 -0600 Subject: [PATCH 014/104] ruff --- graphrag/utils/storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 0cdf8cf23b..2bd681a065 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -61,7 +61,7 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da case _: msg = f"Unknown file extension for {name}" log.exception(msg) - raise ValueError(msg) + raise except Exception: log.exception("error loading table from storage: %s", name) raise From d6c3afcaad49fe2776f9950df9349167628a4d48 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Thu, 14 Nov 2024 12:24:42 -0500 Subject: [PATCH 015/104] first successful run of cosmosdb indexing --- graphrag/utils/storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 2bd681a065..7b84ea79ef 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -53,7 +53,7 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da case "json": return pd.read_json( BytesIO(await storage.get(name, as_bytes=True)), - lines=True, + lines=False, orient="records", ) case "csv": From d1fc4f05df311dfd8513e01e6d254a1210f1a39f Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Thu, 14 Nov 2024 12:49:33 -0500 Subject: [PATCH 016/104] removed extraneous container_name setting --- graphrag/index/config/storage.py | 5 ----- graphrag/index/create_pipeline_config.py | 2 -- graphrag/index/storage/load_storage.py | 2 +- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index 7e834a6b92..f8ea5d58a6 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -77,11 +77,6 @@ class PipelineCosmosDBStorageConfig(PipelineStorageConfig[Literal[StorageType.co ) """The cosmosdb storage primary key for the storage.""" - container_name: str | None = pydantic_Field( - description="The container name for storage", default=None - ) - """The container name for storage.""" - base_dir: str | None = pydantic_Field( description="The base directory for the storage.", default=None ) diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 6b92ead3ee..6d06536337 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -418,7 +418,6 @@ def _get_storage_config( case StorageType.cosmosdb: cosmosdb_account_url = storage_settings.cosmosdb_account_url connection_string = storage_settings.connection_string - container_name = storage_settings.container_name base_dir = storage_settings.base_dir if cosmosdb_account_url is None: msg = "CosmosDB account url must be provided for cosmosdb storage." @@ -429,7 +428,6 @@ def _get_storage_config( return PipelineCosmosDBStorageConfig( cosmosdb_account_url=cosmosdb_account_url, connection_string=connection_string, - container_name=container_name, base_dir=storage_settings.base_dir, ) case _: diff --git a/graphrag/index/storage/load_storage.py b/graphrag/index/storage/load_storage.py index 16e146dfb2..23be6dcd39 100644 --- a/graphrag/index/storage/load_storage.py +++ b/graphrag/index/storage/load_storage.py @@ -40,7 +40,7 @@ def load_storage(config: PipelineStorageConfig): config.cosmosdb_account_url, config.connection_string, config.base_dir, - config.container_name, + config.base_dir, ) case StorageType.file: config = cast(PipelineFileStorageConfig, config) From 716bfa40837a1170d01da8e7606ccba057f5334c Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Thu, 14 Nov 2024 15:42:43 -0500 Subject: [PATCH 017/104] require base_dir to be typed as str --- graphrag/index/config/cache.py | 2 +- graphrag/index/config/storage.py | 2 +- graphrag/index/storage/cosmosdb_pipeline_storage.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index aeb17af4b8..9582a92598 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -79,7 +79,7 @@ class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb type: Literal[CacheType.cosmosdb] = CacheType.cosmosdb """The type of cache.""" - base_dir: str | None = pydantic_Field( + base_dir: str = pydantic_Field( description="The base directory for the cache.", default=None ) """The base directory for the cache.""" diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index f8ea5d58a6..b0cb8a64e1 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -77,7 +77,7 @@ class PipelineCosmosDBStorageConfig(PipelineStorageConfig[Literal[StorageType.co ) """The cosmosdb storage primary key for the storage.""" - base_dir: str | None = pydantic_Field( + base_dir: str = pydantic_Field( description="The base directory for the storage.", default=None ) """The base directory for the storage.""" diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 8fde53bf4a..43a9b7926f 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -287,7 +287,7 @@ def container_exists(self) -> bool: def create_cosmosdb_storage( cosmosdb_account_url: str | None, connection_string: str | None, - base_dir: str | None, + base_dir: str, container_name: str | None, ) -> PipelineStorage: """Create a CosmosDB storage instance.""" From 65c93bb098cff5fe39d15c32576e1d590ff4b420 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Thu, 14 Nov 2024 17:01:10 -0500 Subject: [PATCH 018/104] reverted merged changed from closed branch --- graphrag/index/emit/csv_table_emitter.py | 3 +-- graphrag/index/emit/json_table_emitter.py | 3 +-- graphrag/index/emit/parquet_table_emitter.py | 3 +-- graphrag/index/emit/table_emitter.py | 4 +--- graphrag/index/run/workflow.py | 5 ++--- graphrag/utils/storage.py | 16 +--------------- 6 files changed, 7 insertions(+), 27 deletions(-) diff --git a/graphrag/index/emit/csv_table_emitter.py b/graphrag/index/emit/csv_table_emitter.py index aa27e0e3c5..c0305c254b 100644 --- a/graphrag/index/emit/csv_table_emitter.py +++ b/graphrag/index/emit/csv_table_emitter.py @@ -18,7 +18,6 @@ class CSVTableEmitter(TableEmitter): """CSVTableEmitter class.""" _storage: PipelineStorage - extension = "csv" def __init__(self, storage: PipelineStorage): """Create a new CSV Table Emitter.""" @@ -26,7 +25,7 @@ def __init__(self, storage: PipelineStorage): async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" - filename = f"{name}.{self.extension}" + filename = f"{name}.csv" log.info("emitting CSV table %s", filename) await self._storage.set( filename, diff --git a/graphrag/index/emit/json_table_emitter.py b/graphrag/index/emit/json_table_emitter.py index 21c0713bab..8203c4677b 100644 --- a/graphrag/index/emit/json_table_emitter.py +++ b/graphrag/index/emit/json_table_emitter.py @@ -18,7 +18,6 @@ class JsonTableEmitter(TableEmitter): """JsonTableEmitter class.""" _storage: PipelineStorage - extension = "json" def __init__(self, storage: PipelineStorage): """Create a new Json Table Emitter.""" @@ -26,7 +25,7 @@ def __init__(self, storage: PipelineStorage): async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" - filename = f"{name}.{self.extension}" + filename = f"{name}.json" log.info("emitting JSON table %s", filename) await self._storage.set( diff --git a/graphrag/index/emit/parquet_table_emitter.py b/graphrag/index/emit/parquet_table_emitter.py index 50b0b54bb4..753915a79a 100644 --- a/graphrag/index/emit/parquet_table_emitter.py +++ b/graphrag/index/emit/parquet_table_emitter.py @@ -22,7 +22,6 @@ class ParquetTableEmitter(TableEmitter): _storage: PipelineStorage _on_error: ErrorHandlerFn - extension = "parquet" def __init__( self, @@ -35,7 +34,7 @@ def __init__( async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" - filename = f"{name}.{self.extension}" + filename = f"{name}.parquet" log.info("emitting parquet table %s", filename) try: await self._storage.set(filename, data.to_parquet()) diff --git a/graphrag/index/emit/table_emitter.py b/graphrag/index/emit/table_emitter.py index 82e37d3135..e568aa755d 100644 --- a/graphrag/index/emit/table_emitter.py +++ b/graphrag/index/emit/table_emitter.py @@ -10,8 +10,6 @@ class TableEmitter(Protocol): """TableEmitter protocol for emitting tables to a destination.""" - - extension: str - + async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" diff --git a/graphrag/index/run/workflow.py b/graphrag/index/run/workflow.py index 5b616a22b7..16466e8459 100644 --- a/graphrag/index/run/workflow.py +++ b/graphrag/index/run/workflow.py @@ -33,7 +33,6 @@ async def _inject_workflow_data_dependencies( workflow_dependencies: dict[str, list[str]], dataset: pd.DataFrame, storage: PipelineStorage, - extension: str, ) -> None: """Inject the data dependencies into the workflow.""" workflow.add_table(DEFAULT_INPUT_NAME, dataset) @@ -42,7 +41,7 @@ async def _inject_workflow_data_dependencies( for id in deps: workflow_id = f"workflow:{id}" try: - table = await _load_table_from_storage(f"{id}.{extension}", storage) + table = await _load_table_from_storage(f"{id}.parquet", storage) except ValueError: # our workflows now allow transient tables, and we avoid putting those in primary storage # however, we need to keep the table in the dependency list for proper execution order @@ -100,7 +99,7 @@ async def _process_workflow( context.stats.workflows[workflow_name] = {"overall": 0.0} await _inject_workflow_data_dependencies( - workflow, workflow_dependencies, dataset, context.storage, emitters[0].extension + workflow, workflow_dependencies, dataset, context.storage ) workflow_start_time = time.time() diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 7b84ea79ef..60d08b6309 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -47,21 +47,7 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da raise ValueError(msg) try: log.info("read table from storage: %s", name) - match name.split(".")[-1]: - case "parquet": - return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) - case "json": - return pd.read_json( - BytesIO(await storage.get(name, as_bytes=True)), - lines=False, - orient="records", - ) - case "csv": - return pd.read_csv(BytesIO(await storage.get(name, as_bytes=True))) - case _: - msg = f"Unknown file extension for {name}" - log.exception(msg) - raise + return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) except Exception: log.exception("error loading table from storage: %s", name) raise From 66641d66d79b1d53521794b3758bcf9d01aa8c92 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Fri, 15 Nov 2024 13:46:52 -0500 Subject: [PATCH 019/104] removed nested try statement --- graphrag/api/index.py | 4 ---- .../index/storage/cosmosdb_pipeline_storage.py | 14 +++++--------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/graphrag/api/index.py b/graphrag/api/index.py index 77ba1e5a8e..e5924dfd9b 100644 --- a/graphrag/api/index.py +++ b/graphrag/api/index.py @@ -59,10 +59,6 @@ async def build_index( msg = "Cannot resume and update a run at the same time." raise ValueError(msg) - # Ensure Parquet is part of the emitters - if TableEmitterType.Parquet not in emit: - emit.append(TableEmitterType.Parquet) - config = _patch_vector_config(config) pipeline_config = create_pipeline_config(config) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 43a9b7926f..03dc679bd1 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -198,15 +198,11 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: msg = "Parquet table emitter not supported for CosmosDB storage." log.exception(msg) else: - try: - cosmos_db_item = { - "id": key, - "body": json.loads(value) - } - container_client.upsert_item(body=cosmos_db_item) - except Exception: - msg = "CSV table emitter not supported for CosmosDB storage." - log.exception(msg) + cosmos_db_item = { + "id": key, + "body": json.loads(value) + } + container_client.upsert_item(body=cosmos_db_item) except Exception: log.exception("Error writing item %s", key) From 5e5f76d28199b5b40387be6c7013d0d85f0114af Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Fri, 15 Nov 2024 14:31:11 -0500 Subject: [PATCH 020/104] readded initial non-parquet emitter fix --- graphrag/index/emit/csv_table_emitter.py | 3 ++- graphrag/index/emit/json_table_emitter.py | 3 ++- graphrag/index/emit/parquet_table_emitter.py | 3 ++- graphrag/index/emit/table_emitter.py | 2 ++ graphrag/index/run/workflow.py | 5 +++-- graphrag/utils/storage.py | 16 +++++++++++++++- 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/graphrag/index/emit/csv_table_emitter.py b/graphrag/index/emit/csv_table_emitter.py index c0305c254b..aa27e0e3c5 100644 --- a/graphrag/index/emit/csv_table_emitter.py +++ b/graphrag/index/emit/csv_table_emitter.py @@ -18,6 +18,7 @@ class CSVTableEmitter(TableEmitter): """CSVTableEmitter class.""" _storage: PipelineStorage + extension = "csv" def __init__(self, storage: PipelineStorage): """Create a new CSV Table Emitter.""" @@ -25,7 +26,7 @@ def __init__(self, storage: PipelineStorage): async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" - filename = f"{name}.csv" + filename = f"{name}.{self.extension}" log.info("emitting CSV table %s", filename) await self._storage.set( filename, diff --git a/graphrag/index/emit/json_table_emitter.py b/graphrag/index/emit/json_table_emitter.py index 8203c4677b..21c0713bab 100644 --- a/graphrag/index/emit/json_table_emitter.py +++ b/graphrag/index/emit/json_table_emitter.py @@ -18,6 +18,7 @@ class JsonTableEmitter(TableEmitter): """JsonTableEmitter class.""" _storage: PipelineStorage + extension = "json" def __init__(self, storage: PipelineStorage): """Create a new Json Table Emitter.""" @@ -25,7 +26,7 @@ def __init__(self, storage: PipelineStorage): async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" - filename = f"{name}.json" + filename = f"{name}.{self.extension}" log.info("emitting JSON table %s", filename) await self._storage.set( diff --git a/graphrag/index/emit/parquet_table_emitter.py b/graphrag/index/emit/parquet_table_emitter.py index 753915a79a..fb3cea2359 100644 --- a/graphrag/index/emit/parquet_table_emitter.py +++ b/graphrag/index/emit/parquet_table_emitter.py @@ -27,6 +27,7 @@ def __init__( self, storage: PipelineStorage, on_error: ErrorHandlerFn, + extension = "parquet", ): """Create a new Parquet Table Emitter.""" self._storage = storage @@ -34,7 +35,7 @@ def __init__( async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" - filename = f"{name}.parquet" + filename = f"{name}.{self.extension}" log.info("emitting parquet table %s", filename) try: await self._storage.set(filename, data.to_parquet()) diff --git a/graphrag/index/emit/table_emitter.py b/graphrag/index/emit/table_emitter.py index e568aa755d..8e108f460f 100644 --- a/graphrag/index/emit/table_emitter.py +++ b/graphrag/index/emit/table_emitter.py @@ -10,6 +10,8 @@ class TableEmitter(Protocol): """TableEmitter protocol for emitting tables to a destination.""" + + extension: str async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" diff --git a/graphrag/index/run/workflow.py b/graphrag/index/run/workflow.py index 16466e8459..5b616a22b7 100644 --- a/graphrag/index/run/workflow.py +++ b/graphrag/index/run/workflow.py @@ -33,6 +33,7 @@ async def _inject_workflow_data_dependencies( workflow_dependencies: dict[str, list[str]], dataset: pd.DataFrame, storage: PipelineStorage, + extension: str, ) -> None: """Inject the data dependencies into the workflow.""" workflow.add_table(DEFAULT_INPUT_NAME, dataset) @@ -41,7 +42,7 @@ async def _inject_workflow_data_dependencies( for id in deps: workflow_id = f"workflow:{id}" try: - table = await _load_table_from_storage(f"{id}.parquet", storage) + table = await _load_table_from_storage(f"{id}.{extension}", storage) except ValueError: # our workflows now allow transient tables, and we avoid putting those in primary storage # however, we need to keep the table in the dependency list for proper execution order @@ -99,7 +100,7 @@ async def _process_workflow( context.stats.workflows[workflow_name] = {"overall": 0.0} await _inject_workflow_data_dependencies( - workflow, workflow_dependencies, dataset, context.storage + workflow, workflow_dependencies, dataset, context.storage, emitters[0].extension ) workflow_start_time = time.time() diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 60d08b6309..7b84ea79ef 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -47,7 +47,21 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da raise ValueError(msg) try: log.info("read table from storage: %s", name) - return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) + match name.split(".")[-1]: + case "parquet": + return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) + case "json": + return pd.read_json( + BytesIO(await storage.get(name, as_bytes=True)), + lines=False, + orient="records", + ) + case "csv": + return pd.read_csv(BytesIO(await storage.get(name, as_bytes=True))) + case _: + msg = f"Unknown file extension for {name}" + log.exception(msg) + raise except Exception: log.exception("error loading table from storage: %s", name) raise From 0d93d0d305cfd538cbe343a445cbdeda13c3afc2 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Fri, 15 Nov 2024 15:54:03 -0500 Subject: [PATCH 021/104] added basic support for parquet emitter using internal conversions --- graphrag/index/emit/parquet_table_emitter.py | 2 ++ .../storage/cosmosdb_pipeline_storage.py | 27 ++++++++++++++----- graphrag/utils/storage.py | 4 +-- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/graphrag/index/emit/parquet_table_emitter.py b/graphrag/index/emit/parquet_table_emitter.py index fb3cea2359..9d079a2870 100644 --- a/graphrag/index/emit/parquet_table_emitter.py +++ b/graphrag/index/emit/parquet_table_emitter.py @@ -37,6 +37,8 @@ async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" filename = f"{name}.{self.extension}" log.info("emitting parquet table %s", filename) + # TODO: refactor to emit the dataframe directly instead of the parquet bytestring + # TODO: refactor all PipelineStorage implementations to align with this change try: await self._storage.set(filename, data.to_parquet()) except ArrowTypeError as e: diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 03dc679bd1..4e0457fd6c 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -7,8 +7,10 @@ import logging import re from collections.abc import Iterator +from io import BytesIO, StringIO from typing import Any +import pandas as pd from azure.cosmos import CosmosClient from azure.cosmos.partition_key import PartitionKey from azure.identity import DefaultAzureCredential @@ -176,10 +178,15 @@ async def get( ) item = container_client.read_item(item=key, partition_key=key) item_body = item.get("body") + item_json_str = json.dumps(item_body) if as_bytes: - coding = encoding or "utf-8" - return json.dumps(item_body).encode(coding) - return json.dumps(item_body) + item_df = pd.read_json( + StringIO(item_json_str), + orient="records", + lines=False + ) + return item_df.to_parquet() + return item_json_str except Exception: log.exception("Error reading item %s", key) return None @@ -195,14 +202,22 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: self._current_container ) if isinstance(value, bytes): - msg = "Parquet table emitter not supported for CosmosDB storage." - log.exception(msg) + value_df = pd.read_parquet(BytesIO(value)) + value_json = value_df.to_json( + orient="records", + lines=False, + force_ascii=False + ) + cosmos_db_item = { + "id": key, + "body": json.loads(value_json) + } else: cosmos_db_item = { "id": key, "body": json.loads(value) } - container_client.upsert_item(body=cosmos_db_item) + container_client.upsert_item(body=cosmos_db_item) except Exception: log.exception("Error writing item %s", key) diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 7b84ea79ef..904736944e 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -4,7 +4,7 @@ """Storage functions for the GraphRAG run module.""" import logging -from io import BytesIO +from io import BytesIO, StringIO from pathlib import Path import pandas as pd @@ -52,7 +52,7 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) case "json": return pd.read_json( - BytesIO(await storage.get(name, as_bytes=True)), + StringIO(await storage.get(name, as_bytes=True)), lines=False, orient="records", ) From dac0b861bdee0cd24a381fdaa4fe6018ee823ed8 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 18 Nov 2024 11:47:51 -0500 Subject: [PATCH 022/104] merged with main and resolved conflicts --- .semversioner/0.5.0.json | 38 +++ .../minor-20241113010525824646.json | 4 - .../patch-20241031230557819462.json | 4 - .../patch-20241106004612053719.json | 4 - .../patch-20241114012244853718.json | 4 - .../patch-20241114182805008149.json | 4 - CHANGELOG.md | 11 + docs/blog_posts.md | 7 + docs/config/custom.md | 162 ------------- docs/config/overview.md | 6 +- docs/config/template.md | 167 ------------- docs/config/{json_yaml.md => yaml.md} | 221 ++++++++++++------ docs/developing.md | 2 +- docs/get_started.md | 4 +- docs/index/outputs.md | 145 +++++++----- docs/index/overview.md | 30 +-- docs/prompt_tuning/auto_prompt_tuning.md | 6 +- docs/prompt_tuning/manual_prompt_tuning.md | 70 ++++-- docs/prompt_tuning/overview.md | 9 +- docs/query/drift_search.md | 4 +- docs/stylesheets/extra.css | 4 + examples/custom_input/run.py | 2 +- .../custom_set_of_available_verbs/__init__.py | 2 - .../custom_verb_definitions.py | 22 -- .../pipeline.yml | 7 - examples/custom_set_of_available_verbs/run.py | 84 ------- .../__init__.py | 2 - .../custom_workflow_definitions.py | 36 --- .../pipeline.yml | 4 - .../custom_set_of_available_workflows/run.py | 85 ------- examples/entity_extraction/__init__.py | 2 - .../with_graph_intelligence/__init__.py | 2 - .../with_graph_intelligence/pipeline.yml | 16 -- .../with_graph_intelligence/run.py | 111 --------- .../entity_extraction/with_nltk/__init__.py | 2 - .../entity_extraction/with_nltk/pipeline.yml | 6 - examples/entity_extraction/with_nltk/run.py | 78 ------- examples/interdependent_workflows/__init__.py | 2 - .../interdependent_workflows/pipeline.yml | 23 -- examples/interdependent_workflows/run.py | 102 -------- examples/multiple_workflows/__init__.py | 2 - examples/multiple_workflows/pipeline.yml | 4 - examples/multiple_workflows/run.py | 43 ---- .../workflows/shared/shared_fill_value.txt | 1 - .../workflows/workflow_1.yml | 6 - .../workflows/workflow_2.yml | 17 -- .../workflows/workflow_3.yml | 6 - examples/single_verb/run.py | 4 +- examples/use_built_in_workflows/run.py | 7 +- .../various_levels_of_configs/__init__.py | 2 - .../pipelines/workflows_and_inputs.yml | 64 ----- .../pipelines/workflows_only.yml | 46 ---- .../workflows_and_inputs.py | 40 ---- ...rkflows_and_inputs_with_custom_handlers.py | 131 ----------- .../workflows_only.py | 59 ----- graphrag/__main__.py | 2 +- graphrag/api/__init__.py | 3 +- graphrag/api/index.py | 5 +- graphrag/api/prompt_tune.py | 37 +-- graphrag/api/query.py | 6 +- graphrag/callbacks/factories.py | 11 +- graphrag/callbacks/global_search_callbacks.py | 3 +- .../callbacks/progress_workflow_callbacks.py | 2 +- graphrag/cli/index.py | 14 +- graphrag/cli/initialize.py | 5 +- graphrag/cli/main.py | 110 +++++++-- graphrag/cli/prompt_tune.py | 4 +- graphrag/cli/query.py | 6 +- graphrag/config/__init__.py | 131 ----------- graphrag/config/config_file_loader.py | 4 +- graphrag/config/create_graphrag_config.py | 55 +++-- graphrag/config/defaults.py | 7 +- graphrag/config/init_content.py | 141 +++++++++++ graphrag/config/input_models/__init__.py | 46 ---- .../claim_extraction_config_input.py | 2 +- .../community_reports_config_input.py | 2 +- .../entity_extraction_config_input.py | 2 +- .../input_models/graphrag_config_input.py | 48 ++-- .../config/input_models/llm_config_input.py | 6 +- .../summarize_descriptions_config_input.py | 2 +- .../text_embedding_config_input.py | 3 +- graphrag/config/load_config.py | 9 +- graphrag/config/logging.py | 4 +- graphrag/config/models/__init__.py | 46 ---- .../config/models/claim_extraction_config.py | 3 +- .../config/models/community_reports_config.py | 3 +- ...drift_config.py => drift_search_config.py} | 0 .../config/models/entity_extraction_config.py | 3 +- graphrag/config/models/graph_rag_config.py | 37 ++- graphrag/config/models/llm_config.py | 5 +- .../models/summarize_descriptions_config.py | 3 +- .../config/models/text_embedding_config.py | 3 +- graphrag/config/resolve_path.py | 4 +- graphrag/index/__init__.py | 76 +----- graphrag/index/cache/__init__.py | 14 -- graphrag/index/cache/json_pipeline_cache.py | 5 +- graphrag/index/cache/load_cache.py | 16 +- graphrag/index/cache/memory_pipeline_cache.py | 2 +- graphrag/index/cache/noop_pipeline_cache.py | 2 +- graphrag/index/config/__init__.py | 87 ------- graphrag/index/config/input.py | 3 +- graphrag/index/config/pipeline.py | 10 +- graphrag/index/context.py | 4 +- graphrag/index/create_pipeline_config.py | 4 +- graphrag/index/emit/__init__.py | 17 -- graphrag/index/emit/csv_table_emitter.py | 5 +- graphrag/index/emit/factories.py | 13 +- graphrag/index/emit/json_table_emitter.py | 5 +- graphrag/index/emit/parquet_table_emitter.py | 5 +- .../index/flows/create_base_entity_graph.py | 4 +- .../index/flows/create_base_text_units.py | 4 +- .../flows/create_final_community_reports.py | 2 +- .../index/flows/create_final_covariates.py | 2 +- graphrag/index/flows/create_final_nodes.py | 2 +- .../index/flows/generate_text_embeddings.py | 4 +- graphrag/index/graph/embedding/__init__.py | 2 +- graphrag/index/graph/embedding/embedding.py | 4 +- graphrag/index/graph/extractors/__init__.py | 6 +- .../index/graph/extractors/claims/__init__.py | 2 +- .../extractors/community_reports/__init__.py | 17 +- .../community_reports/build_mixed_context.py | 3 +- .../community_reports_extractor.py | 2 +- .../prep_community_report_context.py | 9 +- .../index/graph/extractors/graph/__init__.py | 2 +- .../graph/extractors/graph/graph_extractor.py | 2 +- .../graph/extractors/summarize/__init__.py | 2 +- graphrag/index/graph/utils/__init__.py | 4 +- graphrag/index/graph/utils/stable_lcc.py | 6 +- .../index/graph/visualization/__init__.py | 7 +- .../visualization/compute_umap_positions.py | 10 +- graphrag/index/init_content.py | 210 ----------------- graphrag/index/input/__init__.py | 4 - graphrag/index/input/csv.py | 8 +- graphrag/index/input/load_input.py | 23 +- graphrag/index/input/text.py | 8 +- graphrag/index/llm/__init__.py | 10 - graphrag/index/llm/load_llm.py | 2 +- graphrag/index/load_pipeline_config.py | 7 +- .../index/operations/chunk_text/__init__.py | 6 +- .../index/operations/chunk_text/chunk_text.py | 11 +- .../index/operations/chunk_text/strategies.py | 5 +- graphrag/index/operations/cluster_graph.py | 6 +- .../index/operations/embed_graph/__init__.py | 7 +- .../operations/embed_graph/embed_graph.py | 5 +- .../index/operations/embed_text/__init__.py | 5 +- .../index/operations/embed_text/embed_text.py | 20 +- .../operations/embed_text/strategies/mock.py | 5 +- .../embed_text/strategies/openai.py | 11 +- .../embed_text/strategies/typing.py | 2 +- .../operations/extract_covariates/__init__.py | 5 +- .../extract_covariates/extract_covariates.py | 13 +- .../extract_covariates/strategies.py | 9 +- .../operations/extract_covariates/typing.py | 2 +- .../operations/extract_entities/__init__.py | 5 +- .../extract_entities/extract_entities.py | 16 +- .../strategies/graph_intelligence.py | 19 +- .../extract_entities/strategies/nltk.py | 10 +- .../extract_entities/strategies/typing.py | 2 +- .../index/operations/layout_graph/__init__.py | 2 +- .../operations/layout_graph/layout_graph.py | 10 +- .../index/operations/merge_graphs/__init__.py | 2 +- .../operations/merge_graphs/merge_graphs.py | 2 +- graphrag/index/operations/snapshot.py | 2 +- graphrag/index/operations/snapshot_graphml.py | 2 +- graphrag/index/operations/snapshot_rows.py | 2 +- .../summarize_communities/__init__.py | 16 +- .../summarize_communities/strategies.py | 11 +- .../summarize_communities.py | 9 +- .../summarize_communities/typing.py | 2 +- .../summarize_descriptions/__init__.py | 9 +- .../summarize_descriptions/strategies.py | 9 +- .../summarize_descriptions.py | 9 +- .../summarize_descriptions/typing.py | 2 +- graphrag/index/operations/unpack_graph.py | 2 +- graphrag/index/run/cache.py | 2 +- graphrag/index/run/run.py | 17 +- graphrag/index/run/utils.py | 4 +- graphrag/index/run/workflow.py | 2 +- graphrag/index/storage/__init__.py | 18 -- .../index/storage/blob_pipeline_storage.py | 5 +- .../storage/cosmosdb_pipeline_storage.py | 2 +- .../index/storage/file_pipeline_storage.py | 5 +- graphrag/index/storage/load_storage.py | 11 +- .../index/storage/memory_pipeline_storage.py | 4 +- graphrag/index/storage/pipeline_storage.py | 2 +- graphrag/index/text_splitting/__init__.py | 30 --- .../index/text_splitting/check_token_limit.py | 2 +- .../index/text_splitting/text_splitting.py | 2 +- graphrag/index/update/incremental_index.py | 2 +- graphrag/index/utils/__init__.py | 21 -- graphrag/index/validate_config.py | 6 +- graphrag/index/workflows/__init__.py | 4 +- graphrag/index/workflows/default_workflows.py | 48 ++-- graphrag/index/workflows/load.py | 15 +- .../workflows/v1/create_base_entity_graph.py | 2 +- .../workflows/v1/create_base_text_units.py | 2 +- .../workflows/v1/create_final_communities.py | 2 +- .../v1/create_final_community_reports.py | 2 +- .../workflows/v1/create_final_covariates.py | 2 +- .../workflows/v1/create_final_documents.py | 2 +- .../workflows/v1/create_final_entities.py | 2 +- .../index/workflows/v1/create_final_nodes.py | 2 +- .../v1/create_final_relationships.py | 2 +- .../workflows/v1/create_final_text_units.py | 2 +- .../workflows/v1/generate_text_embeddings.py | 2 +- .../index/workflows/v1/subflows/__init__.py | 40 +++- .../v1/subflows/create_base_entity_graph.py | 4 +- .../v1/subflows/create_base_text_units.py | 2 +- .../v1/subflows/create_final_communities.py | 2 +- .../create_final_community_reports.py | 2 +- .../v1/subflows/create_final_covariates.py | 4 +- .../v1/subflows/create_final_documents.py | 2 +- .../v1/subflows/create_final_entities.py | 2 +- .../v1/subflows/create_final_nodes.py | 2 +- .../v1/subflows/create_final_relationships.py | 2 +- .../v1/subflows/create_final_text_units.py | 2 +- .../v1/subflows/generate_text_embeddings.py | 4 +- graphrag/logging/__init__.py | 23 -- graphrag/logging/base.py | 69 ++++++ graphrag/logging/console.py | 2 +- graphrag/logging/factories.py | 12 +- graphrag/logging/null_progress.py | 2 +- graphrag/logging/print_progress.py | 2 +- graphrag/logging/rich_progress.py | 2 +- graphrag/logging/types.py | 64 ----- graphrag/model/__init__.py | 29 +-- graphrag/model/community.py | 2 +- graphrag/model/community_report.py | 2 +- graphrag/model/covariate.py | 2 +- graphrag/model/document.py | 2 +- graphrag/model/entity.py | 2 +- graphrag/model/named.py | 2 +- graphrag/model/relationship.py | 2 +- graphrag/model/text_unit.py | 2 +- graphrag/prompt_tune/__init__.py | 2 +- graphrag/prompt_tune/defaults.py | 18 ++ graphrag/prompt_tune/generator/__init__.py | 26 --- .../generator/community_report_rating.py | 2 +- .../community_report_summarization.py | 4 +- .../generator/community_reporter_role.py | 2 +- graphrag/prompt_tune/generator/defaults.py | 10 - .../generator/entity_extraction_prompt.py | 2 +- .../generator/entity_relationship.py | 2 +- .../generator/entity_summarization_prompt.py | 4 +- .../prompt_tune/generator/entity_types.py | 2 +- graphrag/prompt_tune/generator/language.py | 2 +- graphrag/prompt_tune/generator/persona.py | 4 +- graphrag/prompt_tune/loader/__init__.py | 8 - graphrag/prompt_tune/loader/input.py | 17 +- graphrag/prompt_tune/prompt/__init__.py | 30 +-- graphrag/prompt_tune/template/__init__.py | 20 -- graphrag/query/__init__.py | 2 +- .../context_builder/community_context.py | 3 +- .../dynamic_community_selection.py | 3 +- .../context_builder/entity_extraction.py | 5 +- .../query/context_builder/local_context.py | 4 +- .../query/context_builder/source_context.py | 3 +- graphrag/query/factories.py | 18 +- graphrag/query/indexer_adapters.py | 14 +- graphrag/query/input/loaders/dfs.py | 16 +- .../input/retrieval/community_reports.py | 3 +- graphrag/query/input/retrieval/covariates.py | 3 +- graphrag/query/input/retrieval/entities.py | 2 +- .../query/input/retrieval/relationships.py | 3 +- graphrag/query/input/retrieval/text_units.py | 3 +- graphrag/query/llm/get_client.py | 3 +- graphrag/query/llm/oai/__init__.py | 17 -- graphrag/query/llm/oai/base.py | 3 +- graphrag/query/llm/oai/chat_openai.py | 2 +- graphrag/query/llm/oai/embedding.py | 2 +- .../drift_search/drift_context.py | 16 +- .../structured_search/drift_search/primer.py | 4 +- .../structured_search/drift_search/search.py | 2 +- .../global_search/community_context.py | 4 +- .../local_search/mixed_context.py | 14 +- graphrag/utils/storage.py | 2 +- graphrag/vector_stores/__init__.py | 15 -- graphrag/vector_stores/azure_ai_search.py | 3 +- graphrag/vector_stores/factory.py | 4 +- graphrag/vector_stores/lancedb.py | 2 +- mkdocs.yaml | 16 +- pyproject.toml | 2 +- tests/unit/config/test_default_config.py | 104 +++++---- .../cache/test_file_pipeline_cache.py | 4 +- tests/unit/indexing/config/helpers.py | 4 +- tests/unit/indexing/config/test_load.py | 10 +- tests/unit/indexing/test_exports.py | 7 +- tests/unit/indexing/test_init_content.py | 8 +- tests/unit/indexing/workflows/test_emit.py | 5 +- tests/unit/indexing/workflows/test_load.py | 2 +- .../context_builder/test_entity_extraction.py | 4 +- .../query/input/retrieval/test_entities.py | 2 +- tests/verbs/util.py | 8 +- v1-breaking-changes.md | 2 +- 294 files changed, 1447 insertions(+), 3168 deletions(-) create mode 100644 .semversioner/0.5.0.json delete mode 100644 .semversioner/next-release/minor-20241113010525824646.json delete mode 100644 .semversioner/next-release/patch-20241031230557819462.json delete mode 100644 .semversioner/next-release/patch-20241106004612053719.json delete mode 100644 .semversioner/next-release/patch-20241114012244853718.json delete mode 100644 .semversioner/next-release/patch-20241114182805008149.json delete mode 100644 docs/config/custom.md delete mode 100644 docs/config/template.md rename docs/config/{json_yaml.md => yaml.md} (55%) delete mode 100644 examples/custom_set_of_available_verbs/__init__.py delete mode 100644 examples/custom_set_of_available_verbs/custom_verb_definitions.py delete mode 100644 examples/custom_set_of_available_verbs/pipeline.yml delete mode 100644 examples/custom_set_of_available_verbs/run.py delete mode 100644 examples/custom_set_of_available_workflows/__init__.py delete mode 100644 examples/custom_set_of_available_workflows/custom_workflow_definitions.py delete mode 100644 examples/custom_set_of_available_workflows/pipeline.yml delete mode 100644 examples/custom_set_of_available_workflows/run.py delete mode 100644 examples/entity_extraction/__init__.py delete mode 100644 examples/entity_extraction/with_graph_intelligence/__init__.py delete mode 100644 examples/entity_extraction/with_graph_intelligence/pipeline.yml delete mode 100644 examples/entity_extraction/with_graph_intelligence/run.py delete mode 100644 examples/entity_extraction/with_nltk/__init__.py delete mode 100644 examples/entity_extraction/with_nltk/pipeline.yml delete mode 100644 examples/entity_extraction/with_nltk/run.py delete mode 100644 examples/interdependent_workflows/__init__.py delete mode 100644 examples/interdependent_workflows/pipeline.yml delete mode 100644 examples/interdependent_workflows/run.py delete mode 100644 examples/multiple_workflows/__init__.py delete mode 100644 examples/multiple_workflows/pipeline.yml delete mode 100644 examples/multiple_workflows/run.py delete mode 100644 examples/multiple_workflows/workflows/shared/shared_fill_value.txt delete mode 100644 examples/multiple_workflows/workflows/workflow_1.yml delete mode 100644 examples/multiple_workflows/workflows/workflow_2.yml delete mode 100644 examples/multiple_workflows/workflows/workflow_3.yml delete mode 100644 examples/various_levels_of_configs/__init__.py delete mode 100644 examples/various_levels_of_configs/pipelines/workflows_and_inputs.yml delete mode 100644 examples/various_levels_of_configs/pipelines/workflows_only.yml delete mode 100644 examples/various_levels_of_configs/workflows_and_inputs.py delete mode 100644 examples/various_levels_of_configs/workflows_and_inputs_with_custom_handlers.py delete mode 100644 examples/various_levels_of_configs/workflows_only.py create mode 100644 graphrag/config/init_content.py rename graphrag/config/models/{drift_config.py => drift_search_config.py} (100%) delete mode 100644 graphrag/index/init_content.py create mode 100644 graphrag/logging/base.py create mode 100644 graphrag/prompt_tune/defaults.py delete mode 100644 graphrag/prompt_tune/generator/defaults.py diff --git a/.semversioner/0.5.0.json b/.semversioner/0.5.0.json new file mode 100644 index 0000000000..d38e5bff38 --- /dev/null +++ b/.semversioner/0.5.0.json @@ -0,0 +1,38 @@ +{ + "changes": [ + { + "description": "Data model changes.", + "type": "minor" + }, + { + "description": "Add Parquet as part of the default emitters when not pressent", + "type": "patch" + }, + { + "description": "Centralized prompts and export all for easier injection.", + "type": "patch" + }, + { + "description": "Cleanup of artifact outputs/schemas.", + "type": "patch" + }, + { + "description": "Config and docs updates.", + "type": "patch" + }, + { + "description": "Implement dynamic community selection to global search", + "type": "patch" + }, + { + "description": "fix autocompletion of existing files/directory paths.", + "type": "patch" + }, + { + "description": "move import statements out of init files", + "type": "patch" + } + ], + "created_at": "2024-11-16T00:43:06+00:00", + "version": "0.5.0" +} \ No newline at end of file diff --git a/.semversioner/next-release/minor-20241113010525824646.json b/.semversioner/next-release/minor-20241113010525824646.json deleted file mode 100644 index f7cd8962f9..0000000000 --- a/.semversioner/next-release/minor-20241113010525824646.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "minor", - "description": "Data model changes." -} diff --git a/.semversioner/next-release/patch-20241031230557819462.json b/.semversioner/next-release/patch-20241031230557819462.json deleted file mode 100644 index 3f5ea8a3d1..0000000000 --- a/.semversioner/next-release/patch-20241031230557819462.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "Cleanup of artifact outputs/schemas." -} diff --git a/.semversioner/next-release/patch-20241106004612053719.json b/.semversioner/next-release/patch-20241106004612053719.json deleted file mode 100644 index 6e223125ee..0000000000 --- a/.semversioner/next-release/patch-20241106004612053719.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "Implement dynamic community selection to global search" -} diff --git a/.semversioner/next-release/patch-20241114012244853718.json b/.semversioner/next-release/patch-20241114012244853718.json deleted file mode 100644 index 9b16cc63c8..0000000000 --- a/.semversioner/next-release/patch-20241114012244853718.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "Centralized prompts and export all for easier injection." -} diff --git a/.semversioner/next-release/patch-20241114182805008149.json b/.semversioner/next-release/patch-20241114182805008149.json deleted file mode 100644 index df7c755019..0000000000 --- a/.semversioner/next-release/patch-20241114182805008149.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "Add Parquet as part of the default emitters when not pressent" -} diff --git a/CHANGELOG.md b/CHANGELOG.md index de48f48932..bf77efff42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,17 @@ # Changelog Note: version releases in the 0.x.y range may introduce breaking changes. +## 0.5.0 + +- minor: Data model changes. +- patch: Add Parquet as part of the default emitters when not pressent +- patch: Centralized prompts and export all for easier injection. +- patch: Cleanup of artifact outputs/schemas. +- patch: Config and docs updates. +- patch: Implement dynamic community selection to global search +- patch: fix autocompletion of existing files/directory paths. +- patch: move import statements out of init files + ## 0.4.1 - patch: Add update cli entrypoint for incremental indexing diff --git a/docs/blog_posts.md b/docs/blog_posts.md index 750c0afebb..b2467a1371 100644 --- a/docs/blog_posts.md +++ b/docs/blog_posts.md @@ -31,4 +31,11 @@ By Julian Whiting, Senior Machine Learning Engineer; Zachary Hills , Senior Software Engineer; [Alonso Guevara Fernández](https://www.microsoft.com/en-us/research/people/alonsog/), Sr. Software Engineer; [Ha Trinh](https://www.microsoft.com/en-us/research/people/trinhha/), Senior Data Scientist; Adam Bradley , Managing Partner, Strategic Research; [Jonathan Larson](https://www.microsoft.com/en-us/research/people/jolarso/), Senior Principal Data Architect +- [:octicons-arrow-right-24: __GraphRAG: Improving global search via dynamic community selection__](https://www.microsoft.com/en-us/research/blog/graphrag-improving-global-search-via-dynamic-community-selection/) + + --- +
Published November 15, 2024 + + By Bryan Li, Research Intern; [Ha Trinh](https://www.microsoft.com/en-us/research/people/trinhha/), Senior Data Scientist; [Darren Edge](https://www.microsoft.com/en-us/research/people/daedge/), Senior Director; [Jonathan Larson](https://www.microsoft.com/en-us/research/people/jolarso/), Senior Principal Data Architect
+ \ No newline at end of file diff --git a/docs/config/custom.md b/docs/config/custom.md deleted file mode 100644 index 368dcbad93..0000000000 --- a/docs/config/custom.md +++ /dev/null @@ -1,162 +0,0 @@ -# Fully Custom Config - -The primary configuration sections for Indexing Engine pipelines are described below. Each configuration section can be expressed in Python (for use in Python API mode) as well as YAML, but YAML is show here for brevity. - -Using custom configuration is an advanced use-case. Most users will want to use the [Default Configuration](overview.md) instead. - -## Indexing Engine Examples - -The [examples](https://github.com/microsoft/graphrag/blob/main/examples/) directory contains several examples of how to use the indexing engine with _custom configuration_. - -Most examples include two different forms of running the pipeline, both are contained in the examples `run.py` - -1. Using mostly the Python API -2. Using mostly the a pipeline configuration file - -To run an example: - -- Run `poetry shell` to activate a virtual environment with the required dependencies. -- Run `PYTHONPATH="$(pwd)" python examples/path_to_example/run.py` from the `root` directory. - -For example to run the single_verb example, you would run the following commands: - -```bash -poetry shell -``` - -```sh -PYTHONPATH="$(pwd)" python examples/single_verb/run.py -``` - -# Configuration Sections - -# > extends - -This configuration allows you to extend a base configuration file or files. - -```yaml -# single base -extends: ../base_config.yml -``` - -```yaml -# multiple bases -extends: - - ../base_config.yml - - ../base_config2.yml -``` - -# > root_dir - -This configuration allows you to set the root directory for the pipeline. All data inputs and outputs are assumed to be relative to this path. - -```yaml -root_dir: /workspace/data_project -``` - -# > storage - -This configuration allows you define the output strategy for the pipeline. - -- `type`: The type of storage to use. Options are `file`, `memory`, and `blob` -- `base_dir` (`type: file` only): The base directory to store the data in. This is relative to the config root. -- `connection_string` (`type: blob` only): The connection string to use for blob storage. -- `container_name` (`type: blob` only): The container to use for blob storage. - -# > cache - -This configuration allows you define the cache strategy for the pipeline. - -- `type`: The type of cache to use. Options are `file` and `memory`, and `blob`. -- `base_dir` (`type: file` only): The base directory to store the cache in. This is relative to the config root. -- `connection_string` (`type: blob` only): The connection string to use for blob storage. -- `container_name` (`type: blob` only): The container to use for blob storage. - -# > reporting - -This configuration allows you define the reporting strategy for the pipeline. Report files are generated artifacts that summarize the performance metrics of the pipeline and emit any error messages. - -- `type`: The type of reporting to use. Options are `file`, `memory`, and `blob` -- `base_dir` (`type: file` only): The base directory to store the reports in. This is relative to the config root. -- `connection_string` (`type: blob` only): The connection string to use for blob storage. -- `container_name` (`type: blob` only): The container to use for blob storage. - -# > workflows - -This configuration section defines the workflow DAG for the pipeline. Here we define an array of workflows and express their inter-dependencies in steps: - -- `name`: The name of the workflow. This is used to reference the workflow in other parts of the config. -- `steps`: The DataShaper steps that this workflow comprises. If a step defines an input in the form of `workflow:`, then it is assumed to have a dependency on the output of that workflow. - -```yaml -workflows: - - name: workflow1 - steps: - - verb: derive - args: - column1: "col1" - column2: "col2" - - name: workflow2 - steps: - - verb: derive - args: - column1: "col1" - column2: "col2" - input: - # dependency established here - source: workflow:workflow1 -``` - -# > input - -- `type`: The type of input to use. Options are `file` or `blob`. -- `file_type`: The file type field discriminates between the different input types. Options are `csv` and `text`. -- `base_dir`: The base directory to read the input files from. This is relative to the config file. -- `file_pattern`: A regex to match the input files. The regex must have named groups for each of the fields in the file_filter. -- `post_process`: A DataShaper workflow definition to apply to the input before executing the primary workflow. -- `source_column` (`type: csv` only): The column containing the source/author of the data -- `text_column` (`type: csv` only): The column containing the text of the data -- `timestamp_column` (`type: csv` only): The column containing the timestamp of the data -- `timestamp_format` (`type: csv` only): The format of the timestamp - -```yaml -input: - type: file - file_type: csv - base_dir: ../data/csv # the directory containing the CSV files, this is relative to the config file - file_pattern: '.*[\/](?P[^\/]+)[\/](?P\d{4})-(?P\d{2})-(?P\d{2})_(?P[^_]+)_\d+\.csv$' # a regex to match the CSV files - # An additional file filter which uses the named groups from the file_pattern to further filter the files - # file_filter: - # # source: (source_filter) - # year: (2023) - # month: (06) - # # day: (22) - source_column: "author" # the column containing the source/author of the data - text_column: "message" # the column containing the text of the data - timestamp_column: "date(yyyyMMddHHmmss)" # optional, the column containing the timestamp of the data - timestamp_format: "%Y%m%d%H%M%S" # optional, the format of the timestamp - post_process: # Optional, set of steps to process the data before going into the workflow - - verb: filter - args: - column: "title", - value: "My document" -``` - -```yaml -input: - type: file - file_type: csv - base_dir: ../data/csv # the directory containing the CSV files, this is relative to the config file - file_pattern: '.*[\/](?P[^\/]+)[\/](?P\d{4})-(?P\d{2})-(?P\d{2})_(?P[^_]+)_\d+\.csv$' # a regex to match the CSV files - # An additional file filter which uses the named groups from the file_pattern to further filter the files - # file_filter: - # # source: (source_filter) - # year: (2023) - # month: (06) - # # day: (22) - post_process: # Optional, set of steps to process the data before going into the workflow - - verb: filter - args: - column: "title", - value: "My document" -``` diff --git a/docs/config/overview.md b/docs/config/overview.md index be03e7ef85..7b8a08bf84 100644 --- a/docs/config/overview.md +++ b/docs/config/overview.md @@ -7,9 +7,5 @@ The GraphRAG system is highly configurable. This page provides an overview of th The default configuration mode is the simplest way to get started with the GraphRAG system. It is designed to work out-of-the-box with minimal configuration. The primary configuration sections for the Indexing Engine pipelines are described below. The main ways to set up GraphRAG in Default Configuration mode are via: - [Init command](init.md) (recommended) +- [Using YAML for deeper control](yaml.md) - [Purely using environment variables](env_vars.md) -- [Using JSON or YAML for deeper control](json_yaml.md) - -## Custom Configuration Mode - -Custom configuration mode is an advanced use-case. Most users will want to use the Default Configuration instead. The primary configuration sections for Indexing Engine pipelines are described below. Details about how to use custom configuration are available in the [Custom Configuration Mode](custom.md) documentation. diff --git a/docs/config/template.md b/docs/config/template.md deleted file mode 100644 index 0aab4f7a43..0000000000 --- a/docs/config/template.md +++ /dev/null @@ -1,167 +0,0 @@ -# Configuration Template - -The following template can be used and stored as a `.env` in the the directory where you're are pointing -the `--root` parameter on your Indexing Pipeline execution. - -For details about how to run the Indexing Pipeline, refer to the [Index CLI](../index/cli.md) documentation. - -## .env File Template - -Required variables are uncommented. All the optional configuration can be turned on or off as needed. - -### Minimal Configuration - -```bash -# Base LLM Settings -GRAPHRAG_API_KEY="your_api_key" -GRAPHRAG_API_BASE="http://.openai.azure.com" # For Azure OpenAI Users -GRAPHRAG_API_VERSION="api_version" # For Azure OpenAI Users - -# Text Generation Settings -GRAPHRAG_LLM_TYPE="azure_openai_chat" # or openai_chat -GRAPHRAG_LLM_DEPLOYMENT_NAME="gpt-4-turbo-preview" -GRAPHRAG_LLM_MODEL_SUPPORTS_JSON=True - -# Text Embedding Settings -GRAPHRAG_EMBEDDING_TYPE="azure_openai_embedding" # or openai_embedding -GRAPHRAG_LLM_DEPLOYMENT_NAME="text-embedding-3-small" - -# Data Mapping Settings -GRAPHRAG_INPUT_TYPE="text" - -``` - -### Full Configuration - -```bash - -# Required LLM Config - -# Input Data Configuration -GRAPHRAG_INPUT_TYPE="file" - -# Plaintext Input Data Configuration -# GRAPHRAG_INPUT_FILE_PATTERN=.*\.txt - -# Text Input Data Configuration -GRAPHRAG_INPUT_FILE_TYPE="text" -GRAPHRAG_INPUT_FILE_PATTERN=".*\.txt$" -GRAPHRAG_INPUT_SOURCE_COLUMN=source -# GRAPHRAG_INPUT_TIMESTAMP_COLUMN=None -# GRAPHRAG_INPUT_TIMESTAMP_FORMAT=None -# GRAPHRAG_INPUT_TEXT_COLUMN="text" -# GRAPHRAG_INPUT_ATTRIBUTE_COLUMNS=id -# GRAPHRAG_INPUT_TITLE_COLUMN="title" -# GRAPHRAG_INPUT_TYPE="file" -# GRAPHRAG_INPUT_CONNECTION_STRING=None -# GRAPHRAG_INPUT_CONTAINER_NAME=None -# GRAPHRAG_INPUT_BASE_DIR=None - -# Base LLM Settings -GRAPHRAG_API_KEY="your_api_key" -GRAPHRAG_API_BASE="http://.openai.azure.com" # For Azure OpenAI Users -GRAPHRAG_API_VERSION="api_version" # For Azure OpenAI Users -# GRAPHRAG_API_ORGANIZATION=None -# GRAPHRAG_API_PROXY=None - -# Text Generation Settings -# GRAPHRAG_LLM_TYPE=openai_chat -GRAPHRAG_LLM_API_KEY="your_api_key" # If GRAPHRAG_API_KEY is not set -GRAPHRAG_LLM_API_BASE="http://.openai.azure.com" # For Azure OpenAI Users and if GRAPHRAG_API_BASE is not set -GRAPHRAG_LLM_API_VERSION="api_version" # For Azure OpenAI Users and if GRAPHRAG_API_VERSION is not set -GRAPHRAG_LLM_MODEL_SUPPORTS_JSON=True # Suggested by default -# GRAPHRAG_LLM_API_ORGANIZATION=None -# GRAPHRAG_LLM_API_PROXY=None -# GRAPHRAG_LLM_DEPLOYMENT_NAME=None -# GRAPHRAG_LLM_MODEL=gpt-4-turbo-preview -# GRAPHRAG_LLM_MAX_TOKENS=4000 -# GRAPHRAG_LLM_REQUEST_TIMEOUT=180 -# GRAPHRAG_LLM_THREAD_COUNT=50 -# GRAPHRAG_LLM_THREAD_STAGGER=0.3 -# GRAPHRAG_LLM_CONCURRENT_REQUESTS=25 -# GRAPHRAG_LLM_TPM=0 -# GRAPHRAG_LLM_RPM=0 -# GRAPHRAG_LLM_MAX_RETRIES=10 -# GRAPHRAG_LLM_MAX_RETRY_WAIT=10 -# GRAPHRAG_LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION=True - -# Text Embedding Settings -# GRAPHRAG_EMBEDDING_TYPE=openai_embedding -GRAPHRAG_EMBEDDING_API_KEY="your_api_key" # If GRAPHRAG_API_KEY is not set -GRAPHRAG_EMBEDDING_API_BASE="http://.openai.azure.com" # For Azure OpenAI Users and if GRAPHRAG_API_BASE is not set -GRAPHRAG_EMBEDDING_API_VERSION="api_version" # For Azure OpenAI Users and if GRAPHRAG_API_VERSION is not set -# GRAPHRAG_EMBEDDING_API_ORGANIZATION=None -# GRAPHRAG_EMBEDDING_API_PROXY=None -# GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=None -# GRAPHRAG_EMBEDDING_MODEL=text-embedding-3-small -# GRAPHRAG_EMBEDDING_BATCH_SIZE=16 -# GRAPHRAG_EMBEDDING_BATCH_MAX_TOKENS=8191 -# GRAPHRAG_EMBEDDING_TARGET=required -# GRAPHRAG_EMBEDDING_SKIP=None -# GRAPHRAG_EMBEDDING_THREAD_COUNT=None -# GRAPHRAG_EMBEDDING_THREAD_STAGGER=50 -# GRAPHRAG_EMBEDDING_CONCURRENT_REQUESTS=25 -# GRAPHRAG_EMBEDDING_TPM=0 -# GRAPHRAG_EMBEDDING_RPM=0 -# GRAPHRAG_EMBEDDING_MAX_RETRIES=10 -# GRAPHRAG_EMBEDDING_MAX_RETRY_WAIT=10 -# GRAPHRAG_EMBEDDING_SLEEP_ON_RATE_LIMIT_RECOMMENDATION=True - -# Data Mapping Settings -# GRAPHRAG_INPUT_ENCODING=utf-8 - -# Data Chunking -# GRAPHRAG_CHUNK_SIZE=1200 -# GRAPHRAG_CHUNK_OVERLAP=100 -# GRAPHRAG_CHUNK_BY_COLUMNS=id - -# Prompting Overrides -# GRAPHRAG_ENTITY_EXTRACTION_PROMPT_FILE=None -# GRAPHRAG_ENTITY_EXTRACTION_MAX_GLEANINGS=1 -# GRAPHRAG_ENTITY_EXTRACTION_ENTITY_TYPES=organization,person,event,geo -# GRAPHRAG_SUMMARIZE_DESCRIPTIONS_PROMPT_FILE=None -# GRAPHRAG_SUMMARIZE_DESCRIPTIONS_MAX_LENGTH=500 -# GRAPHRAG_CLAIM_EXTRACTION_DESCRIPTION="Any claims or facts that could be relevant to threat analysis." -# GRAPHRAG_CLAIM_EXTRACTION_PROMPT_FILE=None -# GRAPHRAG_CLAIM_EXTRACTION_MAX_GLEANINGS=1 -# GRAPHRAG_COMMUNITY_REPORT_PROMPT_FILE=None -# GRAPHRAG_COMMUNITY_REPORT_MAX_LENGTH=1500 - -# Storage -# GRAPHRAG_STORAGE_TYPE=file -# GRAPHRAG_STORAGE_CONNECTION_STRING=None -# GRAPHRAG_STORAGE_CONTAINER_NAME=None -# GRAPHRAG_STORAGE_BASE_DIR=None - -# Cache -# GRAPHRAG_CACHE_TYPE=file -# GRAPHRAG_CACHE_CONNECTION_STRING=None -# GRAPHRAG_CACHE_CONTAINER_NAME=None -# GRAPHRAG_CACHE_BASE_DIR=None - -# Reporting -# GRAPHRAG_REPORTING_TYPE=file -# GRAPHRAG_REPORTING_CONNECTION_STRING=None -# GRAPHRAG_REPORTING_CONTAINER_NAME=None -# GRAPHRAG_REPORTING_BASE_DIR=None - -# Node2Vec Parameters -# GRAPHRAG_NODE2VEC_ENABLED=False -# GRAPHRAG_NODE2VEC_NUM_WALKS=10 -# GRAPHRAG_NODE2VEC_WALK_LENGTH=40 -# GRAPHRAG_NODE2VEC_WINDOW_SIZE=2 -# GRAPHRAG_NODE2VEC_ITERATIONS=3 -# GRAPHRAG_NODE2VEC_RANDOM_SEED=597832 - -# Data Snapshotting -# GRAPHRAG_SNAPSHOT_GRAPHML=False -# GRAPHRAG_SNAPSHOT_RAW_ENTITIES=False -# GRAPHRAG_SNAPSHOT_TOP_LEVEL_NODES=False - -# Miscellaneous Settings -# GRAPHRAG_ASYNC_MODE=asyncio -# GRAPHRAG_ENCODING_MODEL=cl100k_base -# GRAPHRAG_MAX_CLUSTER_SIZE=10 -# GRAPHRAG_SKIP_WORKFLOWS=None -# GRAPHRAG_UMAP_ENABLED=False -``` diff --git a/docs/config/json_yaml.md b/docs/config/yaml.md similarity index 55% rename from docs/config/json_yaml.md rename to docs/config/yaml.md index ba3661308e..5b4012570c 100644 --- a/docs/config/json_yaml.md +++ b/docs/config/yaml.md @@ -1,47 +1,29 @@ -# Default Configuration Mode (using JSON/YAML) +# Default Configuration Mode (using YAML/JSON) -The default configuration mode may be configured by using a `settings.json` or `settings.yml` file in the data project root. If a `.env` file is present along with this config file, then it will be loaded, and the environment variables defined therein will be available for token replacements in your configuration document using `${ENV_VAR}` syntax. +The default configuration mode may be configured by using a `settings.yml` or `settings.json` file in the data project root. If a `.env` file is present along with this config file, then it will be loaded, and the environment variables defined therein will be available for token replacements in your configuration document using `${ENV_VAR}` syntax. We initialize with YML by default in `graphrag init` but you may use the equivalent JSON form if preferred. + +Many of these config values have defaults. Rather than replicate them here, please refer to the [constants in the code](https://github.com/microsoft/graphrag/blob/main/graphrag/config/defaults.py) directly. For example: ``` # .env -API_KEY=some_api_key - -# settings.json -{ - "llm": { - "api_key": "${API_KEY}" - } -} +GRAPHRAG_API_KEY=some_api_key + +# settings.yml +llm: + api_key: ${GRAPHRAG_API_KEY} ``` # Config Sections -## input - -### Fields - -- `type` **file|blob** - The input type to use. Default=`file` -- `file_type` **text|csv** - The type of input data to load. Either `text` or `csv`. Default is `text` -- `file_encoding` **str** - The encoding of the input file. Default is `utf-8` -- `file_pattern` **str** - A regex to match input files. Default is `.*\.csv$` if in csv mode and `.*\.txt$` if in text mode. -- `source_column` **str** - (CSV Mode Only) The source column name. -- `timestamp_column` **str** - (CSV Mode Only) The timestamp column name. -- `timestamp_format` **str** - (CSV Mode Only) The source format. -- `text_column` **str** - (CSV Mode Only) The text column name. -- `title_column` **str** - (CSV Mode Only) The title column name. -- `document_attribute_columns` **list[str]** - (CSV Mode Only) The additional document attributes to include. -- `connection_string` **str** - (blob only) The Azure Storage connection string. -- `container_name` **str** - (blob only) The Azure Storage container name. -- `base_dir` **str** - The base directory to read input from, relative to the root. -- `storage_account_blob_url` **str** - The storage account blob URL to use. +## Indexing -## llm +### llm This is the base LLM configuration section. Other steps may override this configuration with their own LLM configuration. -### Fields +#### Fields - `api_key` **str** - The OpenAI API key to use. - `type` **openai_chat|azure_openai_chat|openai_embedding|azure_openai_embedding** - The type of LLM to use. @@ -65,20 +47,20 @@ This is the base LLM configuration section. Other steps may override this config - `top_p` **float** - The top-p value to use. - `n` **int** - The number of completions to generate. -## parallelization +### parallelization -### Fields +#### Fields - `stagger` **float** - The threading stagger value. - `num_threads` **int** - The maximum number of work threads. -## async_mode +### async_mode **asyncio|threaded** The async mode to use. Either `asyncio` or `threaded. -## embeddings +### embeddings -### Fields +#### Fields - `llm` (see LLM top-level config) - `parallelization` (see Parallelization top-level config) @@ -88,18 +70,38 @@ This is the base LLM configuration section. Other steps may override this config - `target` **required|all|none** - Determines which set of embeddings to emit. - `skip` **list[str]** - Which embeddings to skip. Only useful if target=all to customize the list. - `vector_store` **dict** - The vector store to use. Configured for lancedb by default. - - `type` **str** - `lancedb` or `azure_ai_search`. Default=`lancedb` - - `db_uri` **str** (only for lancedb) - The database uri. Default=`storage.base_dir/lancedb` - - `url` **str** (only for AI Search) - AI Search endpoint - - `api_key` **str** (optional - only for AI Search) - The AI Search api key to use. - - `audience` **str** (only for AI Search) - Audience for managed identity token if managed identity authentication is used. - - `overwrite` **bool** (only used at index creation time) - Overwrite collection if it exist. Default=`True` - - `container_name` **str** - The name of a vector container. This stores all indexes (tables) for a given dataset ingest. Default=`default` + - `type` **str** - `lancedb` or `azure_ai_search`. Default=`lancedb` + - `db_uri` **str** (only for lancedb) - The database uri. Default=`storage.base_dir/lancedb` + - `url` **str** (only for AI Search) - AI Search endpoint + - `api_key` **str** (optional - only for AI Search) - The AI Search api key to use. + - `audience` **str** (only for AI Search) - Audience for managed identity token if managed identity authentication is used. + - `overwrite` **bool** (only used at index creation time) - Overwrite collection if it exist. Default=`True` + - `container_name` **str** - The name of a vector container. This stores all indexes (tables) for a given dataset ingest. Default=`default` - `strategy` **dict** - Fully override the text-embedding strategy. -## chunks +### input -### Fields +#### Fields + +- `type` **file|blob** - The input type to use. Default=`file` +- `file_type` **text|csv** - The type of input data to load. Either `text` or `csv`. Default is `text` +- `base_dir` **str** - The base directory to read input from, relative to the root. +- `connection_string` **str** - (blob only) The Azure Storage connection string. +- `storage_account_blob_url` **str** - The storage account blob URL to use. +- `container_name` **str** - (blob only) The Azure Storage container name. +- `file_encoding` **str** - The encoding of the input file. Default is `utf-8` +- `file_pattern` **str** - A regex to match input files. Default is `.*\.csv$` if in csv mode and `.*\.txt$` if in text mode. +- `file_filter` **dict** - Key/value pairs to filter. Default is None. +- `source_column` **str** - (CSV Mode Only) The source column name. +- `timestamp_column` **str** - (CSV Mode Only) The timestamp column name. +- `timestamp_format` **str** - (CSV Mode Only) The source format. +- `text_column` **str** - (CSV Mode Only) The text column name. +- `title_column` **str** - (CSV Mode Only) The title column name. +- `document_attribute_columns` **list[str]** - (CSV Mode Only) The additional document attributes to include. + +### chunks + +#### Fields - `size` **int** - The max chunk size in tokens. - `overlap` **int** - The chunk overlap in tokens. @@ -107,9 +109,9 @@ This is the base LLM configuration section. Other steps may override this config - `encoding_model` **str** - The text encoding model to use. Default is to use the top-level encoding model. - `strategy` **dict** - Fully override the chunking strategy. -## cache +### cache -### Fields +#### Fields - `type` **file|memory|none|blob** - The cache type to use. Default=`file` - `connection_string` **str** - (blob only) The Azure Storage connection string. @@ -117,19 +119,29 @@ This is the base LLM configuration section. Other steps may override this config - `base_dir` **str** - The base directory to write cache to, relative to the root. - `storage_account_blob_url` **str** - The storage account blob URL to use. -## storage +### storage -### Fields +#### Fields - `type` **file|memory|blob** - The storage type to use. Default=`file` - `connection_string` **str** - (blob only) The Azure Storage connection string. - `container_name` **str** - (blob only) The Azure Storage container name. -- `base_dir` **str** - The base directory to write reports to, relative to the root. +- `base_dir` **str** - The base directory to write output artifacts to, relative to the root. - `storage_account_blob_url` **str** - The storage account blob URL to use. -## reporting +### update_index_storage -### Fields +#### Fields + +- `type` **file|memory|blob** - The storage type to use. Default=`file` +- `connection_string` **str** - (blob only) The Azure Storage connection string. +- `container_name` **str** - (blob only) The Azure Storage container name. +- `base_dir` **str** - The base directory to write output artifacts to, relative to the root. +- `storage_account_blob_url` **str** - The storage account blob URL to use. + +### reporting + +#### Fields - `type` **file|console|blob** - The reporting type to use. Default=`file` - `connection_string` **str** - (blob only) The Azure Storage connection string. @@ -137,9 +149,9 @@ This is the base LLM configuration section. Other steps may override this config - `base_dir` **str** - The base directory to write reports to, relative to the root. - `storage_account_blob_url` **str** - The storage account blob URL to use. -## entity_extraction +### entity_extraction -### Fields +#### Fields - `llm` (see LLM top-level config) - `parallelization` (see Parallelization top-level config) @@ -150,9 +162,9 @@ This is the base LLM configuration section. Other steps may override this config - `encoding_model` **str** - The text encoding model to use. By default, this will use the top-level encoding model. - `strategy` **dict** - Fully override the entity extraction strategy. -## summarize_descriptions +### summarize_descriptions -### Fields +#### Fields - `llm` (see LLM top-level config) - `parallelization` (see Parallelization top-level config) @@ -161,11 +173,11 @@ This is the base LLM configuration section. Other steps may override this config - `max_length` **int** - The maximum number of output tokens per summarization. - `strategy` **dict** - Fully override the summarize description strategy. -## claim_extraction +### claim_extraction -### Fields +#### Fields -- `enabled` **bool** - Whether to enable claim extraction. default=False +- `enabled` **bool** - Whether to enable claim extraction. Off by default, because claim prompts really need user tuning. - `llm` (see LLM top-level config) - `parallelization` (see Parallelization top-level config) - `async_mode` (see Async Mode top-level config) @@ -175,9 +187,9 @@ This is the base LLM configuration section. Other steps may override this config - `encoding_model` **str** - The text encoding model to use. By default, this will use the top-level encoding model. - `strategy` **dict** - Fully override the claim extraction strategy. -## community_reports +### community_reports -### Fields +#### Fields - `llm` (see LLM top-level config) - `parallelization` (see Parallelization top-level config) @@ -187,16 +199,16 @@ This is the base LLM configuration section. Other steps may override this config - `max_input_length` **int** - The maximum number of input tokens to use when generating reports. - `strategy` **dict** - Fully override the community reports strategy. -## cluster_graph +### cluster_graph -### Fields +#### Fields - `max_cluster_size` **int** - The maximum cluster size to emit. - `strategy` **dict** - Fully override the cluster_graph strategy. -## embed_graph +### embed_graph -### Fields +#### Fields - `enabled` **bool** - Whether to enable graph embeddings. - `num_walks` **int** - The node2vec number of walks. @@ -206,15 +218,15 @@ This is the base LLM configuration section. Other steps may override this config - `random_seed` **int** - The node2vec random seed. - `strategy` **dict** - Fully override the embed graph strategy. -## umap +### umap -### Fields +#### Fields - `enabled` **bool** - Whether to enable UMAP layouts. -## snapshots +### snapshots -### Fields +#### Fields - `embeddings` **bool** - Emit embeddings snapshots to parquet. - `graphml` **bool** - Emit graph snapshots to GraphML. @@ -222,10 +234,79 @@ This is the base LLM configuration section. Other steps may override this config - `top_level_nodes` **bool** - Emit top-level-node snapshots to JSON. - `transient` **bool** - Emit transient workflow tables snapshots to parquet. -## encoding_model +### encoding_model **str** - The text encoding model to use. Default=`cl100k_base`. -## skip_workflows +### skip_workflows **list[str]** - Which workflow names to skip. + +## Query + +### local_search + +#### Fields + +- `prompt` **str** - The prompt file to use. +- `text_unit_prop` **float** - The text unit proportion. +- `community_prop` **float** - The community proportion. +- `conversation_history_max_turns` **int** - The conversation history maximum turns. +- `top_k_entities` **int** - The top k mapped entities. +- `top_k_relationships` **int** - The top k mapped relations. +- `temperature` **float | None** - The temperature to use for token generation. +- `top_p` **float | None** - The top-p value to use for token generation. +- `n` **int | None** - The number of completions to generate. +- `max_tokens` **int** - The maximum tokens. +- `llm_max_tokens` **int** - The LLM maximum tokens. + +### global_search + +#### Fields + +- `map_prompt` **str** - The mapper prompt file to use. +- `reduce_prompt` **str** - The reducer prompt file to use. +- `knowledge_prompt` **str** - The knowledge prompt file to use. +- `map_prompt` **str | None** - The global search mapper prompt to use. +- `reduce_prompt` **str | None** - The global search reducer to use. +- `knowledge_prompt` **str | None** - The global search general prompt to use. +- `temperature` **float | None** - The temperature to use for token generation. +- `top_p` **float | None** - The top-p value to use for token generation. +- `n` **int | None** - The number of completions to generate. +- `max_tokens` **int** - The maximum context size in tokens. +- `data_max_tokens` **int** - The data llm maximum tokens. +- `map_max_tokens` **int** - The map llm maximum tokens. +- `reduce_max_tokens` **int** - The reduce llm maximum tokens. +- `concurrency` **int** - The number of concurrent requests. +- `dynamic_search_llm` **str** - LLM model to use for dynamic community selection. +- `dynamic_search_threshold` **int** - Rating threshold in include a community report. +- `dynamic_search_keep_parent` **bool** - Keep parent community if any of the child communities are relevant. +- `dynamic_search_num_repeats` **int** - Number of times to rate the same community report. +- `dynamic_search_use_summary` **bool** - Use community summary instead of full_context. +- `dynamic_search_concurrent_coroutines` **int** - Number of concurrent coroutines to rate community reports. +- `dynamic_search_max_level` **int** - The maximum level of community hierarchy to consider if none of the processed communities are relevant. + +### drift_search + +#### Fields + +- `prompt` **str** - The prompt file to use. +- `temperature` **float** - The temperature to use for token generation.", +- `top_p` **float** - The top-p value to use for token generation. +- `n` **int** - The number of completions to generate. +- `max_tokens` **int** - The maximum context size in tokens. +- `data_max_tokens` **int** - The data llm maximum tokens. +- `concurrency` **int** - The number of concurrent requests. +- `drift_k_followups` **int** - The number of top global results to retrieve. +- `primer_folds` **int** - The number of folds for search priming. +- `primer_llm_max_tokens` **int** - The maximum number of tokens for the LLM in primer. +- `n_depth` **int** - The number of drift search steps to take. +- `local_search_text_unit_prop` **float** - The proportion of search dedicated to text units. +- `local_search_community_prop` **float** - The proportion of search dedicated to community properties. +- `local_search_top_k_mapped_entities` **int** - The number of top K entities to map during local search. +- `local_search_top_k_relationships` **int** - The number of top K relationships to map during local search. +- `local_search_max_data_tokens` **int** - The maximum context size in tokens for local search. +- `local_search_temperature` **float** - The temperature to use for token generation in local search. +- `local_search_top_p` **float** - The top-p value to use for token generation in local search. +- `local_search_n` **int** - The number of completions to generate in local search. +- `local_search_llm_max_gen_tokens` **int** - The maximum number of generated tokens for the LLM in local search. diff --git a/docs/developing.md b/docs/developing.md index 32bdafb7cf..83165313d4 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -81,5 +81,5 @@ Make sure you have python3.10-dev installed or more generally `python-d ### LLM call constantly exceeds TPM, RPM or time limits -`GRAPHRAG_LLM_THREAD_COUNT` and `GRAPHRAG_EMBEDDING_THREAD_COUNT` are both set to 50 by default. You can modify this values +`GRAPHRAG_LLM_THREAD_COUNT` and `GRAPHRAG_EMBEDDING_THREAD_COUNT` are both set to 50 by default. You can modify these values to reduce concurrency. Please refer to the [Configuration Documents](config/overview.md) diff --git a/docs/get_started.md b/docs/get_started.md index c02273d50a..4eb2f2887f 100644 --- a/docs/get_started.md +++ b/docs/get_started.md @@ -34,7 +34,7 @@ The graphrag library includes a CLI for a no-code approach to getting started. P # Running the Indexer -Now we need to set up a data project and some initial configuration. Let's set that up. We're using the [default configuration mode](config/overview.md), which you can customize as needed using a [config file](config/json_yaml.md), which we recommend, or [environment variables](config/env_vars.md). +Now we need to set up a data project and some initial configuration. Let's set that up. We're using the [default configuration mode](config/overview.md), which you can customize as needed using a [config file](config/yaml.md), which we recommend, or [environment variables](config/env_vars.md). First let's get a sample dataset ready: @@ -85,7 +85,7 @@ deployment_name: - For more details about configuring GraphRAG, see the [configuration documentation](config/overview.md). - To learn more about Initialization, refer to the [Initialization documentation](config/init.md). -- For more details about using the CLI, refer to the [CLI documentation](query/cli.md). +- For more details about using the CLI, refer to the [CLI documentation](cli.md). ## Running the Indexing pipeline diff --git a/docs/index/outputs.md b/docs/index/outputs.md index 998995467c..a5549f675f 100644 --- a/docs/index/outputs.md +++ b/docs/index/outputs.md @@ -4,86 +4,113 @@ The default pipeline produces a series of output tables that align with the [con ## Shared fields All tables have two identifier fields: -- id: str - Generated UUID, assuring global uniqueness -- human_readable_id: int - This is an incremented short ID created per-run. For example, we use this short ID with generated summaries that print citations so they are easy to cross-reference visually. + +| name | type | description | +| ----------------- | ---- | ----------- | +| id | str | Generated UUID, assuring global uniqueness | +| human_readable_id | int | This is an incremented short ID created per-run. For example, we use this short ID with generated summaries that print citations so they are easy to cross-reference visually. | ## create_final_communities This is a list of the final communities generated by Leiden. Communities are strictly hierarchical, subdividing into children as the cluster affinity is narrowed. -- community: int - Leiden-generated cluster ID for the community. Note that these increment with depth, so they are unique through all levels of the community hierarchy. For this table, human_readable_id is a copy of the community ID rather than a plain increment. -- level: int - Depth of the community in the hierarchy. -- title: str - Friendly name of the community. -- entity_ids - List of entities that are members of the community. -- relationship_ids - List of relationships that are wholly within the community (source and target are both in the community). -- text_unit_ids - List of text units represented within the community. -- period - Date of ingest, used for incremental update merges. -- size - Size of the community (entity count), used for incremental update merges. + +| name | type | description | +| ---------------- | ----- | ----------- | +| community | int | Leiden-generated cluster ID for the community. Note that these increment with depth, so they are unique through all levels of the community hierarchy. For this table, human_readable_id is a copy of the community ID rather than a plain increment. | +| level | int | Depth of the community in the hierarchy. | +| title | str | Friendly name of the community. | +| entity_ids | str[] | List of entities that are members of the community. | +| relationship_ids | str[] | List of relationships that are wholly within the community (source and target are both in the community). | +| text_unit_ids | str[] | List of text units represented within the community. | +| period | str | Date of ingest, used for incremental update merges. ISO8601 | +| size | int | Size of the community (entity count), used for incremental update merges. | ## create_final_community_reports This is the list of summarized reports for each community. -- community: int - Short ID of the community this report applies to. -- level: int - Level of the community this report applies to. -- title: str - LM-generated title for the report. -- summary: str - LM-generated summary of the report. -- full_content: str - LM-generated full report. -- rank: float - LM-derived relevance ranking of the report based on member entity salience -- rank_explanation - LM-derived explanation of the rank. -- findings: dict - LM-derived list of the top 5-10 insights from the community. Contains `summary` and `explanation` values. -- full_content_json - Full JSON output as returned by the LM. Most fields are extracted into columns, but this JSON is sent for query summarization so we leave it to allow for prompt tuning to add fields/content by end users. -- period - Date of ingest, used for incremental update merges. -- size - Size of the community (entity count), used for incremental update merges. + +| name | type | description | +| ----------------- | ----- | ----------- | +| community | int | Short ID of the community this report applies to. | +| level | int | Level of the community this report applies to. | +| title | str | LM-generated title for the report. | +| summary | str | LM-generated summary of the report. | +| full_content | str | LM-generated full report. | +| rank | float | LM-derived relevance ranking of the report based on member entity salience +| rank_explanation | str | LM-derived explanation of the rank. | +| findings | dict | LM-derived list of the top 5-10 insights from the community. Contains `summary` and `explanation` values. | +| full_content_json | json | Full JSON output as returned by the LM. Most fields are extracted into columns, but this JSON is sent for query summarization so we leave it to allow for prompt tuning to add fields/content by end users. | +| period | str | Date of ingest, used for incremental update merges. ISO8601 | +| size | int | Size of the community (entity count), used for incremental update merges. | ## create_final_covariates (Optional) If claim extraction is turned on, this is a list of the extracted covariates. Note that claims are typically oriented around identifying malicious behavior such as fraud, so they are not useful for all datasets. -- covariate_type: str - This is always "claim" with our default covariates. -- type: str - Nature of the claim type. -- description: str - LM-generated description of the behavior. -- subject_id: str - Name of the source entity (that is performing the claimed behavior). -- object_id: str - Name of the target entity (that the claimed behavior is performed on). -- status: str [TRUE, FALSE, SUSPECTED] - LM-derived assessment of the correctness of the claim. -- start_date: str (ISO8601) - LM-derived start of the claimed activity. -- end_date: str (ISO8601) - LM-derived end of the claimed activity. -- source_text: str - Short string of text containing the claimed behavior. -- text_unit_id: str - ID of the text unit the claim text was extracted from. + +| name | type | description | +| -------------- | ---- | ----------- | +| covariate_type | str | This is always "claim" with our default covariates. | +| type | str | Nature of the claim type. | +| description | str | LM-generated description of the behavior. | +| subject_id | str | Name of the source entity (that is performing the claimed behavior). | +| object_id | str | Name of the target entity (that the claimed behavior is performed on). | +| status | str | LM-derived assessment of the correctness of the claim. One of [TRUE, FALSE, SUSPECTED] | +| start_date | str | LM-derived start of the claimed activity. ISO8601 | +| end_date | str | LM-derived end of the claimed activity. ISO8601 | +| source_text | str | Short string of text containing the claimed behavior. | +| text_unit_id | str | ID of the text unit the claim text was extracted from. | ## create_final_documents List of document content after import. -- title: str - Filename, unless otherwise configured during CSV import. -- text: str - Full text of the document. -- text_unit_ids: str[] - List of text units (chunks) that were parsed from the document. -- attributes: dict (optional) - If specified during CSV import, this is a dict of attributes for the document. -# create_final_entities +| name | type | description | +| ------------- | ----- | ----------- | +| title | str | Filename, unless otherwise configured during CSV import. | +| text | str | Full text of the document. | +| text_unit_ids | str[] | List of text units (chunks) that were parsed from the document. | +| attributes | dict | (optional) If specified during CSV import, this is a dict of attributes for the document. | + +## create_final_entities List of all entities found in the data by the LM. -- title: str - Name of the entity. -- type: str - Type of the entity. By default this will be "organization", "person", "geo", or "event" unless configured differently or auto-tuning is used. -- description: str - Textual description of the entity. Entities may be found in many text units, so this is an LM-derived summary of all descriptions. -- text_unit_ids: str[] - List of the text units containing the entity. -# create_final_nodes +| name | type | description | +| ------------- | ----- | ----------- | +| title | str | Name of the entity. | +| type | str | Type of the entity. By default this will be "organization", "person", "geo", or "event" unless configured differently or auto-tuning is used. | +| description | str | Textual description of the entity. Entities may be found in many text units, so this is an LM-derived summary of all descriptions. | +| text_unit_ids | str[] | List of the text units containing the entity. | + +## create_final_nodes This is graph-related information for the entities. It contains only information relevant to the graph such as community. There is an entry for each entity at every community level it is found within, so you may see "duplicate" entities. Note that the ID fields match those in create_final_entities and can be used for joining if additional information about a node is required. -- title: str - Name of the referenced entity. Duplicated from create_final_entities for convenient cross-referencing. -- community: int - Leiden community the node is found within. Entities are not always assigned a community (they may not be close enough to any), so they may have a ID of -1. -- level: int - Level of the community the entity is in. -- degree: int - Node degree (connectedness) in the graph. -- x: float - X position of the node for visual layouts. If graph embeddings and UMAP are not turned on, this will be 0. -- y: float - Y position of the node for visual layouts. If graph embeddings and UMAP are not turned on, this will be 0. + +| name | type | description | +| --------- | ----- | ----------- | +| title | str | Name of the referenced entity. Duplicated from create_final_entities for convenient cross-referencing. | +| community | int | Leiden community the node is found within. Entities are not always assigned a community (they may not be close enough to any), so they may have a ID of -1. | +| level | int | Level of the community the entity is in. | +| degree | int | Node degree (connectedness) in the graph. | +| x | float | X position of the node for visual layouts. If graph embeddings and UMAP are not turned on, this will be 0. | +| y | float | Y position of the node for visual layouts. If graph embeddings and UMAP are not turned on, this will be 0. | ## create_final_relationships List of all entity-to-entity relationships found in the data by the LM. This is also the _edge list_ for the graph. -- source: str - Name of the source entity. -- target: str - Name of the target entity. -- description: str - LM-derived description of the relationship. Also see note for entity descriptions. -- weight: float - Weight of the edge in the graph. This is summed from an LM-derived "strength" measure for each relationship instance. -- combined_degree: int - Sum of source and target node degrees. -- text_unit_ids: str[] - List of text units the relationship was found within. + +| name | type | description | +| --------------- | ----- | ----------- | +| source | str | Name of the source entity. | +| target | str | Name of the target entity. | +| description | str | LM-derived description of the relationship. Also see note for entity descriptions. | +| weight | float | Weight of the edge in the graph. This is summed from an LM-derived "strength" measure for each relationship instance. | +| combined_degree | int | Sum of source and target node degrees. | +| text_unit_ids | str[] | List of text units the relationship was found within. | ## create_final_text_units List of all text chunks parsed from the input documents. -- text: str - Raw full text of the chunk. -- n_tokens: int - Number of tokens in the chunk. This should normally match the `chunk_size` config parameter, except for the last chunk which is often shorter. -- document_ids: str[] - List of document IDs the chunk came from. This is normally only 1 due to our default groupby, but for very short text documents (e.g., microblogs) it can be configured so text units span multiple documents. -- entity_ids: str[] - List of entities found in the text unit. -- relationships_ids: str[] - List of relationships found in the text unit. -- covariate_ids: str[] - Optional list of covariates found in the text unit. \ No newline at end of file + +| name | type | description | +| ----------------- | ----- | ----------- | +| text | str | Raw full text of the chunk. | +| n_tokens | int | Number of tokens in the chunk. This should normally match the `chunk_size` config parameter, except for the last chunk which is often shorter. | +| document_ids | str[] | List of document IDs the chunk came from. This is normally only 1 due to our default groupby, but for very short text documents (e.g., microblogs) it can be configured so text units span multiple documents. | +| entity_ids | str[] | List of entities found in the text unit. | +| relationships_ids | str[] | List of relationships found in the text unit. | +| covariate_ids | str[] | Optional list of covariates found in the text unit. | \ No newline at end of file diff --git a/docs/index/overview.md b/docs/index/overview.md index 881047717e..32179e12ba 100644 --- a/docs/index/overview.md +++ b/docs/index/overview.md @@ -39,35 +39,7 @@ yarn run:index --config your_pipeline.yml # custom config mode ### Python API -```python -from graphrag.index import run_pipeline -from graphrag.index.config import PipelineWorkflowReference - -workflows: list[PipelineWorkflowReference] = [ - PipelineWorkflowReference( - steps=[ - { - # built-in verb - "verb": "derive", # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/verbs/derive.py - "args": { - "column1": "col1", # from above - "column2": "col2", # from above - "to": "col_multiplied", # new column name - "operator": "*", # multiply the two columns - }, - # Since we're trying to act on the default input, we don't need explicitly to specify an input - } - ] - ), -] - -dataset = pd.DataFrame([{"col1": 2, "col2": 4}, {"col1": 5, "col2": 10}]) -outputs = [] -async for output in await run_pipeline(dataset=dataset, workflows=workflows): - outputs.append(output) -pipeline_result = outputs[-1] -print(pipeline_result) -``` +Please see the [examples folder](https://github.com/microsoft/graphrag/blob/main/examples/README.md) for a handful of functional pipelines illustrating how to create and run via a custom settings.yml or through custom python scripts. ## Further Reading diff --git a/docs/prompt_tuning/auto_prompt_tuning.md b/docs/prompt_tuning/auto_prompt_tuning.md index 6279fc5e39..c371f8fe1f 100644 --- a/docs/prompt_tuning/auto_prompt_tuning.md +++ b/docs/prompt_tuning/auto_prompt_tuning.md @@ -20,9 +20,9 @@ Before running auto tuning, ensure you have already initialized your workspace w You can run the main script from the command line with various options: ```bash -graphrag prompt-tune [--root ROOT] [--domain DOMAIN] [--method METHOD] [--limit LIMIT] [--language LANGUAGE] \ +graphrag prompt-tune [--root ROOT] [--config CONFIG] [--domain DOMAIN] [--selection-method METHOD] [--limit LIMIT] [--language LANGUAGE] \ [--max-tokens MAX_TOKENS] [--chunk-size CHUNK_SIZE] [--n-subset-max N_SUBSET_MAX] [--k K] \ -[--min-examples-required MIN_EXAMPLES_REQUIRED] [--no-entity-types] [--output OUTPUT] +[--min-examples-required MIN_EXAMPLES_REQUIRED] [--discover-entity-types] [--output OUTPUT] ``` ## Command-Line Options @@ -49,7 +49,7 @@ graphrag prompt-tune [--root ROOT] [--domain DOMAIN] [--method METHOD] [--limit - `--min-examples-required` (optional): The minimum number of examples required for entity extraction prompts. Default is 2. -- `--no-entity-types` (optional): Use untyped entity extraction generation. We recommend using this when your data covers a lot of topics or it is highly randomized. +- `--discover-entity-types` (optional): Allow the LLM to discover and extract entities automatically. We recommend using this when your data covers a lot of topics or it is highly randomized. - `--output` (optional): The folder to save the generated prompts. Default is "prompts". diff --git a/docs/prompt_tuning/manual_prompt_tuning.md b/docs/prompt_tuning/manual_prompt_tuning.md index 7f10fc8e79..4dc90b893b 100644 --- a/docs/prompt_tuning/manual_prompt_tuning.md +++ b/docs/prompt_tuning/manual_prompt_tuning.md @@ -6,11 +6,13 @@ We provide a means for you to do this by allowing you to specify a custom prompt Each of these prompts may be overridden by writing a custom prompt file in plaintext. We use token-replacements in the form of `{token_name}`, and the descriptions for the available tokens can be found below. -## Entity/Relationship Extraction +## Indexing Prompts -[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/entity_extraction.py) +### Entity/Relationship Extraction -### Tokens (values provided by extractor) +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/index/entity_extraction.py) + +#### Tokens - **{input_text}** - The input text to be processed. - **{entity_types}** - A list of entity types @@ -18,37 +20,71 @@ Each of these prompts may be overridden by writing a custom prompt file in plain - **{record_delimiter}** - A delimiter for separating tuple instances. - **{completion_delimiter}** - An indicator for when generation is complete. -## Summarize Entity/Relationship Descriptions +### Summarize Entity/Relationship Descriptions -[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/summarize_descriptions.py) +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/index/summarize_descriptions.py) -### Tokens (values provided by extractor) +#### Tokens - **{entity_name}** - The name of the entity or the source/target pair of the relationship. - **{description_list}** - A list of descriptions for the entity or relationship. -## Claim Extraction +### Claim Extraction -[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/claim_extraction.py) +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/index/claim_extraction.py) -### Tokens (values provided by extractor) +#### Tokens - **{input_text}** - The input text to be processed. - **{tuple_delimiter}** - A delimiter for separating values within a tuple. A single tuple is used to represent an individual entity or relationship. - **{record_delimiter}** - A delimiter for separating tuple instances. - **{completion_delimiter}** - An indicator for when generation is complete. - -Note: there is additional parameter for the `Claim Description` that is used in claim extraction. -The default value is - -`"Any claims or facts that could be relevant to information discovery."` +- **{entity_specs}** - A list of entity types. +- **{claim_description}** - Description of what claims should look like. Default is: `"Any claims or facts that could be relevant to information discovery."` See the [configuration documentation](../config/overview.md) for details on how to change this. -## Generate Community Reports +### Generate Community Reports -[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/community_report.py) +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/index/community_report.py) -### Tokens (values provided by extractor) +#### Tokens - **{input_text}** - The input text to generate the report with. This will contain tables of entities and relationships. + +## Query Prompts + +### Local Search + +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/query/local_search_system_prompt.py) + +#### Tokens + +- **{response_type}** - Describe how the response should look. We default to "multiple paragraphs". +- **{context_data}** - The data tables from GraphRAG's index. + +### Global Search + +[Mapper Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/query/global_search_map_system_prompt.py) + +[Reducer Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/query/global_search_reduce_system_prompt.py) + +[Knowledge Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/query/global_search_knowledge_system_prompt.py) + +Global search uses a map/reduce approach to summarization. You can tune these prompts independently. This search also includes the ability to adjust the use of general knowledge from the model's training. + +#### Tokens + +- **{response_type}** - Describe how the response should look (reducer only). We default to "multiple paragraphs". +- **{context_data}** - The data tables from GraphRAG's index. + +### Drift Search + +[Prompt Source](http://github.com/microsoft/graphrag/blob/main/graphrag/prompts/query/drift_search_system_prompt.py) + +#### Tokens + +- **{response_type}** - Describe how the response should look. We default to "multiple paragraphs". +- **{context_data}** - The data tables from GraphRAG's index. +- **{community_reports}** - The most relevant community reports to include in the summarization. +- **{query}** - The query text as injected into the context. \ No newline at end of file diff --git a/docs/prompt_tuning/overview.md b/docs/prompt_tuning/overview.md index fe25a8eddf..a12cebb257 100644 --- a/docs/prompt_tuning/overview.md +++ b/docs/prompt_tuning/overview.md @@ -4,12 +4,7 @@ This page provides an overview of the prompt tuning options available for the Gr ## Default Prompts -The default prompts are the simplest way to get started with the GraphRAG system. It is designed to work out-of-the-box with minimal configuration. You can find more detail about these prompts in the following links: - -- [Entity/Relationship Extraction](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/graph/prompts.py) -- [Entity/Relationship Description Summarization](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/summarize/prompts.py) -- [Claim Extraction](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/claims/prompts.py) -- [Community Reports](http://github.com/microsoft/graphrag/blob/main/graphrag/index/graph/extractors/community_reports/prompts.py) +The default prompts are the simplest way to get started with the GraphRAG system. It is designed to work out-of-the-box with minimal configuration. More details about each of the default prompts for indexing and query can be found on the [manual tuning](./manual_prompt_tuning.md) page. ## Auto Tuning @@ -17,4 +12,4 @@ Auto Tuning leverages your input data and LLM interactions to create domain adap ## Manual Tuning -Manual tuning is an advanced use-case. Most users will want to use the Auto Tuning feature instead. Details about how to use manual configuration are available in the [Manual Tuning](manual_prompt_tuning.md) documentation. +Manual tuning is an advanced use-case. Most users will want to use the Auto Tuning feature instead. Details about how to use manual configuration are available in the [manual tuning](manual_prompt_tuning.md) documentation. diff --git a/docs/query/drift_search.md b/docs/query/drift_search.md index 08fd9e36bc..e6199221ed 100644 --- a/docs/query/drift_search.md +++ b/docs/query/drift_search.md @@ -23,13 +23,13 @@ Below are the key parameters of the [DRIFTSearch class](https://github.com/micro - `llm`: OpenAI model object to be used for response generation - `context_builder`: [context builder](https://github.com/microsoft/graphrag/blob/main/graphrag/query/structured_search/drift_search/drift_context.py) object to be used for preparing context data from community reports and query information -- `config`: model to define the DRIFT Search hyperparameters. [DRIFT Config model](https://github.com/microsoft/graphrag/blob/main/graphrag/config/models/drift_config.py) +- `config`: model to define the DRIFT Search hyperparameters. [DRIFT Config model](https://github.com/microsoft/graphrag/blob/main/graphrag/config/models/drift_search_config.py) - `token_encoder`: token encoder for tracking the budget for the algorithm. - `query_state`: a state object as defined in [Query State](https://github.com/microsoft/graphrag/blob/main/graphrag/query/structured_search/drift_search/state.py) that allows to track execution of a DRIFT Search instance, alongside follow ups and [DRIFT actions](https://github.com/microsoft/graphrag/blob/main/graphrag/query/structured_search/drift_search/action.py). ## How to Use -An example of a global search scenario can be found in the following [notebook](../examples_notebooks/drift_search.ipynb). +An example of a drift search scenario can be found in the following [notebook](../examples_notebooks/drift_search.ipynb). ## Learn More diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 93197ca540..b0e80aa371 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -3,6 +3,8 @@ --md-code-hl-color: #3772d9; --md-code-hl-comment-color: #6b6b6b; --md-code-hl-operator-color: #6b6b6b; + --md-footer-fg-color--light: #ffffff; + --md-footer-fg-color--lighter: #ffffff; } [data-md-color-scheme="slate"] { @@ -10,6 +12,8 @@ --md-code-hl-color: #246be5; --md-code-hl-constant-color: #9a89ed; --md-code-hl-number-color: #f16e5f; + --md-footer-fg-color--light: #ffffff; + --md-footer-fg-color--lighter: #ffffff; } .md-tabs__item--active { diff --git a/examples/custom_input/run.py b/examples/custom_input/run.py index ba39033e12..debb022379 100644 --- a/examples/custom_input/run.py +++ b/examples/custom_input/run.py @@ -5,7 +5,7 @@ import pandas as pd -from graphrag.index import run_pipeline_with_config +from graphrag.index.run import run_pipeline_with_config pipeline_file = os.path.join( os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" diff --git a/examples/custom_set_of_available_verbs/__init__.py b/examples/custom_set_of_available_verbs/__init__.py deleted file mode 100644 index 0a3e38adfb..0000000000 --- a/examples/custom_set_of_available_verbs/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License diff --git a/examples/custom_set_of_available_verbs/custom_verb_definitions.py b/examples/custom_set_of_available_verbs/custom_verb_definitions.py deleted file mode 100644 index ef058ed3d6..0000000000 --- a/examples/custom_set_of_available_verbs/custom_verb_definitions.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -from datashaper import TableContainer, VerbInput - - -def str_append( - input: VerbInput, source_column: str, target_column: str, string_to_append: str -): - """A custom verb that appends a string to a column""" - # by convention, we typically use "column" as the input column name and "to" as the output column name, but you can use whatever you want - # just as long as the "args" in the workflow reference match the function signature - input_data = input.get_input() - output_df = input_data.copy() - output_df[target_column] = output_df[source_column].apply( - lambda x: f"{x}{string_to_append}" - ) - return TableContainer(table=output_df) - - -custom_verbs = { - "str_append": str_append, -} diff --git a/examples/custom_set_of_available_verbs/pipeline.yml b/examples/custom_set_of_available_verbs/pipeline.yml deleted file mode 100644 index 85bcdb24b7..0000000000 --- a/examples/custom_set_of_available_verbs/pipeline.yml +++ /dev/null @@ -1,7 +0,0 @@ -workflows: - - steps: - - verb: "str_append" # should be the key that you pass to the custom_verbs dict below - args: - source_column: "col1" - target_column: "col_1_custom" - string_to_append: " - custom verb" \ No newline at end of file diff --git a/examples/custom_set_of_available_verbs/run.py b/examples/custom_set_of_available_verbs/run.py deleted file mode 100644 index 7e3f461731..0000000000 --- a/examples/custom_set_of_available_verbs/run.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -import asyncio -import os - -import pandas as pd - -from examples.custom_set_of_available_verbs.custom_verb_definitions import custom_verbs -from graphrag.index import run_pipeline, run_pipeline_with_config -from graphrag.index.config import PipelineWorkflowReference - -# Our fake dataset -dataset = pd.DataFrame([{"col1": 2, "col2": 4}, {"col1": 5, "col2": 10}]) - - -async def run_with_config(): - """Run a pipeline with a config file""" - # load pipeline.yml in this directory - config_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" - ) - - outputs = [] - async for output in run_pipeline_with_config( - config_or_path=config_path, dataset=dataset - ): - outputs.append(output) - pipeline_result = outputs[-1] - - if pipeline_result.result is not None: - # Should look something like this, which should be identical to the python example: - # col1 col2 col_1_custom - # 0 2 4 2 - custom verb - # 1 5 10 5 - custom verb - print(pipeline_result.result) - else: - print("No results!") - - -async def run_python(): - workflows: list[PipelineWorkflowReference] = [ - PipelineWorkflowReference( - name="my_workflow", - steps=[ - { - "verb": "str_append", # should be the key that you pass to the custom_verbs dict below - "args": { - "source_column": "col1", # from above - "target_column": "col_1_custom", # new column name, - "string_to_append": " - custom verb", # The string to append to the column - }, - # Since we're trying to act on the default input, we don't need explicitly to specify an input - } - ], - ), - ] - - # Run the pipeline - outputs = [] - async for output in run_pipeline( - dataset=dataset, - workflows=workflows, - additional_verbs=custom_verbs, - ): - outputs.append(output) - - # Find the result from the workflow we care about - pipeline_result = next( - (output for output in outputs if output.workflow == "my_workflow"), None - ) - - if pipeline_result is not None and pipeline_result.result is not None: - # Should look something like this: - # col1 col2 col_1_custom - # 0 2 4 2 - custom verb - # 1 5 10 5 - custom verb - print(pipeline_result.result) - else: - print("No results!") - - -if __name__ == "__main__": - asyncio.run(run_python()) - asyncio.run(run_with_config()) diff --git a/examples/custom_set_of_available_workflows/__init__.py b/examples/custom_set_of_available_workflows/__init__.py deleted file mode 100644 index 0a3e38adfb..0000000000 --- a/examples/custom_set_of_available_workflows/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License diff --git a/examples/custom_set_of_available_workflows/custom_workflow_definitions.py b/examples/custom_set_of_available_workflows/custom_workflow_definitions.py deleted file mode 100644 index 7d91750fa0..0000000000 --- a/examples/custom_set_of_available_workflows/custom_workflow_definitions.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -from graphrag.index.workflows import WorkflowDefinitions - -# Sets up the list of custom workflows that can be used in a pipeline -# The idea being that you can have a pool of workflows that can be used in any number of -# your pipelines -custom_workflows: WorkflowDefinitions = { - "my_workflow": lambda config: [ - { - "verb": "derive", - "args": { - "column1": "col1", # looks for col1 in the dataset - "column2": "col2", # looks for col2 in the dataset - "to": config.get( - # Allow the user to specify the output column name, - # otherwise default to "output_column" - "derive_output_column", - "output_column", - ), # new column name, - "operator": "*", - }, - } - ], - "my_unused_workflow": lambda _config: [ - { - "verb": "derive", - "args": { - "column1": "col1", # looks for col1 in the dataset - "column2": "col2", # looks for col2 in the dataset - "to": "unused_output_column", - "operator": "*", - }, - } - ], -} diff --git a/examples/custom_set_of_available_workflows/pipeline.yml b/examples/custom_set_of_available_workflows/pipeline.yml deleted file mode 100644 index 0ce004d154..0000000000 --- a/examples/custom_set_of_available_workflows/pipeline.yml +++ /dev/null @@ -1,4 +0,0 @@ -workflows: - - name: my_workflow - config: - derive_output_column: "col_1_multiplied" diff --git a/examples/custom_set_of_available_workflows/run.py b/examples/custom_set_of_available_workflows/run.py deleted file mode 100644 index c91f24f795..0000000000 --- a/examples/custom_set_of_available_workflows/run.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -import asyncio -import os - -import pandas as pd - -from examples.custom_set_of_available_workflows.custom_workflow_definitions import ( - custom_workflows, -) -from graphrag.index import run_pipeline, run_pipeline_with_config -from graphrag.index.config import PipelineWorkflowReference - -sample_data_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "../_sample_data/" -) - -# our fake dataset -dataset = pd.DataFrame([{"col1": 2, "col2": 4}, {"col1": 5, "col2": 10}]) - - -async def run_with_config(): - """Run a pipeline with a config file""" - # load pipeline.yml in this directory - config_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" - ) - - # Grab the last result from the pipeline, should be our entity extraction - tables = [] - async for table in run_pipeline_with_config( - config_or_path=config_path, - dataset=dataset, - additional_workflows=custom_workflows, - ): - tables.append(table) - pipeline_result = tables[-1] - - if pipeline_result.result is not None: - # Should look something like this: - # col1 col2 col_1_multiplied - # 0 2 4 8 - # 1 5 10 50 - print(pipeline_result.result) - else: - print("No results!") - - -async def run_python(): - """Run a pipeline using the python API""" - # Define the actual workflows to be run, this is identical to the python api - # but we're defining the workflows to be run via python instead of via a config file - workflows: list[PipelineWorkflowReference] = [ - # run my_workflow against the dataset, notice we're only using the "my_workflow" workflow - # and not the "my_unused_workflow" workflow - PipelineWorkflowReference( - name="my_workflow", # should match the name of the workflow in the custom_workflows dict above - config={ # pass in a config - # set the derive_output_column to be "col_1_multiplied", this will be passed to the workflow definition above - "derive_output_column": "col_1_multiplied" - }, - ), - ] - - # Grab the last result from the pipeline, should be our entity extraction - tables = [] - async for table in run_pipeline( - workflows, dataset=dataset, additional_workflows=custom_workflows - ): - tables.append(table) - pipeline_result = tables[-1] - - if pipeline_result.result is not None: - # Should look something like this: - # col1 col2 col_1_multiplied - # 0 2 4 8 - # 1 5 10 50 - print(pipeline_result.result) - else: - print("No results!") - - -if __name__ == "__main__": - asyncio.run(run_python()) - asyncio.run(run_with_config()) diff --git a/examples/entity_extraction/__init__.py b/examples/entity_extraction/__init__.py deleted file mode 100644 index 0a3e38adfb..0000000000 --- a/examples/entity_extraction/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License diff --git a/examples/entity_extraction/with_graph_intelligence/__init__.py b/examples/entity_extraction/with_graph_intelligence/__init__.py deleted file mode 100644 index 0a3e38adfb..0000000000 --- a/examples/entity_extraction/with_graph_intelligence/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License diff --git a/examples/entity_extraction/with_graph_intelligence/pipeline.yml b/examples/entity_extraction/with_graph_intelligence/pipeline.yml deleted file mode 100644 index ffa5bee843..0000000000 --- a/examples/entity_extraction/with_graph_intelligence/pipeline.yml +++ /dev/null @@ -1,16 +0,0 @@ -workflows: - - name: "entity_extraction" - config: - entity_extract: - strategy: - type: "graph_intelligence" - llm: - type: "openai_chat" - - # create a .env file in the same directory as this pipeline.yml file - # end add the following lines to it: - # EXAMPLE_OPENAI_API_KEY="YOUR_API_KEY" - api_key: !ENV ${EXAMPLE_OPENAI_API_KEY:None} # None is the default - model: !ENV ${EXAMPLE_OPENAI_MODEL:gpt-3.5-turbo} # gpt-3.5-turbo is the default - max_tokens: !ENV ${EXAMPLE_OPENAI_MAX_TOKENS:2500} # 2500 is the default - temperature: !ENV ${EXAMPLE_OPENAI_TEMPERATURE:0} # 0 is the default diff --git a/examples/entity_extraction/with_graph_intelligence/run.py b/examples/entity_extraction/with_graph_intelligence/run.py deleted file mode 100644 index 0ec54dda29..0000000000 --- a/examples/entity_extraction/with_graph_intelligence/run.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -import asyncio -import os - -from graphrag.index import run_pipeline, run_pipeline_with_config -from graphrag.index.config import PipelineCSVInputConfig, PipelineWorkflowReference -from graphrag.index.input import load_input - -sample_data_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "../../_sample_data/" -) - -shared_dataset = asyncio.run( - load_input( - PipelineCSVInputConfig( - file_pattern=".*\\.csv$", - base_dir=sample_data_dir, - source_column="author", - text_column="message", - timestamp_column="date(yyyyMMddHHmmss)", - timestamp_format="%Y%m%d%H%M%S", - title_column="message", - ), - ) -) - - -async def run_with_config(): - """Run a pipeline with a config file""" - # We're cheap, and this is an example, lets just do 10 - dataset = shared_dataset.head(10) - - # load pipeline.yml in this directory - config_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" - ) - - # Grab the last result from the pipeline, should be our entity extraction - tables = [] - async for table in run_pipeline_with_config( - config_or_path=config_path, dataset=dataset - ): - tables.append(table) - pipeline_result = tables[-1] - - # Print the entities. This will be a row for each text unit, each with a list of entities, - # This should look pretty close to the python version, but since we're using an LLM - # it will be a little different depending on how it feels about the text - if pipeline_result.result is not None: - print(pipeline_result.result["entities"].to_list()) - else: - print("No results!") - - -async def run_python(): - if ( - "EXAMPLE_OPENAI_API_KEY" not in os.environ - and "OPENAI_API_KEY" not in os.environ - ): - msg = "Please set EXAMPLE_OPENAI_API_KEY or OPENAI_API_KEY environment variable to run this example" - raise Exception(msg) - - # We're cheap, and this is an example, lets just do 10 - dataset = shared_dataset.head(10) - - workflows: list[PipelineWorkflowReference] = [ - PipelineWorkflowReference( - name="entity_extraction", - config={ - "entity_extract": { - "strategy": { - "type": "graph_intelligence", - "llm": { - "type": "openai_chat", - "api_key": os.environ.get( - "EXAMPLE_OPENAI_API_KEY", - os.environ.get("OPENAI_API_KEY", None), - ), - "model": os.environ.get( - "EXAMPLE_OPENAI_MODEL", "gpt-3.5-turbo" - ), - "max_tokens": os.environ.get( - "EXAMPLE_OPENAI_MAX_TOKENS", 2500 - ), - "temperature": os.environ.get( - "EXAMPLE_OPENAI_TEMPERATURE", 0 - ), - }, - } - } - }, - ) - ] - - # Grab the last result from the pipeline, should be our entity extraction - tables = [] - async for table in run_pipeline(dataset=dataset, workflows=workflows): - tables.append(table) - pipeline_result = tables[-1] - - # Print the entities. This will be a row for each text unit, each with a list of entities - if pipeline_result.result is not None: - print(pipeline_result.result["entities"].to_list()) - else: - print("No results!") - - -if __name__ == "__main__": - asyncio.run(run_python()) - asyncio.run(run_with_config()) diff --git a/examples/entity_extraction/with_nltk/__init__.py b/examples/entity_extraction/with_nltk/__init__.py deleted file mode 100644 index 0a3e38adfb..0000000000 --- a/examples/entity_extraction/with_nltk/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License diff --git a/examples/entity_extraction/with_nltk/pipeline.yml b/examples/entity_extraction/with_nltk/pipeline.yml deleted file mode 100644 index 10984f3482..0000000000 --- a/examples/entity_extraction/with_nltk/pipeline.yml +++ /dev/null @@ -1,6 +0,0 @@ -workflows: - - name: "entity_extraction" - config: - entity_extract: - strategy: - type: "nltk" \ No newline at end of file diff --git a/examples/entity_extraction/with_nltk/run.py b/examples/entity_extraction/with_nltk/run.py deleted file mode 100644 index 68575ad67b..0000000000 --- a/examples/entity_extraction/with_nltk/run.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -import asyncio -import os - -from graphrag.index import run_pipeline, run_pipeline_with_config -from graphrag.index.config import PipelineCSVInputConfig, PipelineWorkflowReference -from graphrag.index.input import load_input - -sample_data_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "../../_sample_data/" -) -shared_dataset = asyncio.run( - load_input( - PipelineCSVInputConfig( - file_pattern=".*\\.csv$", - base_dir=sample_data_dir, - source_column="author", - text_column="message", - timestamp_column="date(yyyyMMddHHmmss)", - timestamp_format="%Y%m%d%H%M%S", - title_column="message", - ), - ) -) - - -async def run_with_config(): - """Run a pipeline with a config file""" - # We're cheap, and this is an example, lets just do 10 - dataset = shared_dataset.head(10) - - # load pipeline.yml in this directory - config_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" - ) - - # Grab the last result from the pipeline, should be our entity extraction - tables = [] - async for table in run_pipeline_with_config( - config_or_path=config_path, dataset=dataset - ): - tables.append(table) - pipeline_result = tables[-1] - - # Print the entities. This will be a row for each text unit, each with a list of entities - if pipeline_result.result is not None: - print(pipeline_result.result["entities"].to_list()) - else: - print("No results!") - - -async def run_python(): - dataset = shared_dataset.head(10) - - workflows: list[PipelineWorkflowReference] = [ - PipelineWorkflowReference( - name="entity_extraction", - config={"entity_extract": {"strategy": {"type": "nltk"}}}, - ) - ] - - # Grab the last result from the pipeline, should be our entity extraction - tables = [] - async for table in run_pipeline(dataset=dataset, workflows=workflows): - tables.append(table) - pipeline_result = tables[-1] - - # Print the entities. This will be a row for each text unit, each with a list of entities - if pipeline_result.result is not None: - print(pipeline_result.result["entities"].to_list()) - else: - print("No results!") - - -if __name__ == "__main__": - asyncio.run(run_python()) - asyncio.run(run_with_config()) diff --git a/examples/interdependent_workflows/__init__.py b/examples/interdependent_workflows/__init__.py deleted file mode 100644 index 0a3e38adfb..0000000000 --- a/examples/interdependent_workflows/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License diff --git a/examples/interdependent_workflows/pipeline.yml b/examples/interdependent_workflows/pipeline.yml deleted file mode 100644 index 5a23c4fd41..0000000000 --- a/examples/interdependent_workflows/pipeline.yml +++ /dev/null @@ -1,23 +0,0 @@ -workflows: - - name: aggregate_workflow - steps: - - verb: "aggregate" # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/verbs/aggregate.py - args: - groupby: "type" - column: "col_multiplied" - to: "aggregated_output" - operation: "sum" - input: - source: "workflow:derive_workflow" # reference the derive_workflow, cause this one requires that one to run first - # Notice, these are out of order, the indexing engine will figure out the right order to run them in - - - name: derive_workflow - steps: - - verb: "derive" # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/verbs/derive.py - args: - column1: "col1" # from above - column2: "col2" # from above - to: "col_multiplied" # new column name - operator: "*" # multiply the two columns, - # Since we're trying to act on the dataset, we don't need explicitly to specify an input - # "input": { "source": "source" } # use the dataset as the input to this verb. This is the default, so you can omit it. \ No newline at end of file diff --git a/examples/interdependent_workflows/run.py b/examples/interdependent_workflows/run.py deleted file mode 100644 index eb2968a6f3..0000000000 --- a/examples/interdependent_workflows/run.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -import asyncio -import os - -import pandas as pd - -from graphrag.index import run_pipeline, run_pipeline_with_config -from graphrag.index.config import PipelineWorkflowReference - -# Our fake dataset -dataset = pd.DataFrame([ - {"type": "A", "col1": 2, "col2": 4}, - {"type": "A", "col1": 5, "col2": 10}, - {"type": "A", "col1": 15, "col2": 26}, - {"type": "B", "col1": 6, "col2": 15}, -]) - - -async def run_with_config(): - """Run a pipeline with a config file""" - # load pipeline.yml in this directory - config_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" - ) - - tables = [] - async for table in run_pipeline_with_config( - config_or_path=config_path, dataset=dataset - ): - tables.append(table) - pipeline_result = tables[-1] - - if pipeline_result.result is not None: - # Should look something like this, which should be identical to the python example: - # type aggregated_output - # 0 A 448 - # 1 B 90 - print(pipeline_result.result) - else: - print("No results!") - - -async def run_python(): - workflows: list[PipelineWorkflowReference] = [ - PipelineWorkflowReference( - name="aggregate_workflow", - steps=[ - { - "verb": "aggregate", # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/verbs/aggregate.py - "args": { - "groupby": "type", - "column": "col_multiplied", - "to": "aggregated_output", - "operation": "sum", - }, - "input": { - "source": "workflow:derive_workflow", # reference the derive_workflow, cause this one requires that one to run first - # Notice, these are out of order, the indexing engine will figure out the right order to run them in - }, - } - ], - ), - PipelineWorkflowReference( - name="derive_workflow", - steps=[ - { - # built-in verb - "verb": "derive", # https://github.com/microsoft/datashaper/blob/main/python/datashaper/datashaper/verbs/derive.py - "args": { - "column1": "col1", # from above - "column2": "col2", # from above - "to": "col_multiplied", # new column name - "operator": "*", # multiply the two columns, - }, - # Since we're trying to act on the default input, we don't need explicitly to specify an input - } - ], - ), - ] - - # Grab the last result from the pipeline, should be our aggregate_workflow since it should be the last one to run - tables = [] - async for table in run_pipeline(dataset=dataset, workflows=workflows): - tables.append(table) - pipeline_result = tables[-1] - - if pipeline_result.result is not None: - # Should look something like this: - # type aggregated_output - # 0 A 448 - # 1 B 90 - - # This is because we first in "derive_workflow" we multiply col1 and col2 together, then in "aggregate_workflow" we sum them up by type - print(pipeline_result.result) - else: - print("No results!") - - -if __name__ == "__main__": - asyncio.run(run_python()) - asyncio.run(run_with_config()) diff --git a/examples/multiple_workflows/__init__.py b/examples/multiple_workflows/__init__.py deleted file mode 100644 index 0a3e38adfb..0000000000 --- a/examples/multiple_workflows/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License diff --git a/examples/multiple_workflows/pipeline.yml b/examples/multiple_workflows/pipeline.yml deleted file mode 100644 index 1cbbaba748..0000000000 --- a/examples/multiple_workflows/pipeline.yml +++ /dev/null @@ -1,4 +0,0 @@ -workflows: - - !include workflows/workflow_1.yml - - !include workflows/workflow_2.yml - - !include workflows/workflow_3.yml \ No newline at end of file diff --git a/examples/multiple_workflows/run.py b/examples/multiple_workflows/run.py deleted file mode 100644 index a583632789..0000000000 --- a/examples/multiple_workflows/run.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -import asyncio -import os - -from graphrag.index import run_pipeline_with_config -from graphrag.index.config import PipelineCSVInputConfig -from graphrag.index.input import load_input - -sample_data_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "./../_sample_data/" -) - - -async def run_with_config(): - dataset = await load_input( - PipelineCSVInputConfig( - file_pattern=".*\\.csv$", - base_dir=sample_data_dir, - source_column="author", - text_column="message", - timestamp_column="date(yyyyMMddHHmmss)", - timestamp_format="%Y%m%d%H%M%S", - title_column="message", - ), - ) - - # We're cheap, and this is an example, lets just do 10 - dataset = dataset.head(2) - - # run the pipeline with the config, and override the dataset with the one we just created - # and grab the last result from the pipeline, should be the last workflow that was run (our nodes) - pipeline_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "./pipeline.yml" - ) - - async for result in run_pipeline_with_config(pipeline_path, dataset=dataset): - print(f"Workflow {result.workflow} result\n: ") - print(result.result) - - -if __name__ == "__main__": - asyncio.run(run_with_config()) diff --git a/examples/multiple_workflows/workflows/shared/shared_fill_value.txt b/examples/multiple_workflows/workflows/shared/shared_fill_value.txt deleted file mode 100644 index 5f790cbca9..0000000000 --- a/examples/multiple_workflows/workflows/shared/shared_fill_value.txt +++ /dev/null @@ -1 +0,0 @@ -value_from_shared_file \ No newline at end of file diff --git a/examples/multiple_workflows/workflows/workflow_1.yml b/examples/multiple_workflows/workflows/workflow_1.yml deleted file mode 100644 index 9ed87e1c43..0000000000 --- a/examples/multiple_workflows/workflows/workflow_1.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: workflow_1 -steps: - - verb: fill - args: - to: "col_workflow_1" - value: 1 diff --git a/examples/multiple_workflows/workflows/workflow_2.yml b/examples/multiple_workflows/workflows/workflow_2.yml deleted file mode 100644 index c08147f2cb..0000000000 --- a/examples/multiple_workflows/workflows/workflow_2.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: workflow_2 -steps: - - verb: fill - args: - to: "col_workflow_2" - value: 2 - input: - - # workflow_2 is dependent on workflow_1 - # so in workflow_2 output, you'll also see the output from workflow_1 - source: "workflow:workflow_1" - - # Example of pulling in values from a shared file - - verb: fill - args: - to: "col_from_shared_file" - value: !include ./shared/shared_fill_value.txt diff --git a/examples/multiple_workflows/workflows/workflow_3.yml b/examples/multiple_workflows/workflows/workflow_3.yml deleted file mode 100644 index 1a65f2d6b3..0000000000 --- a/examples/multiple_workflows/workflows/workflow_3.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: workflow_3 -steps: - - verb: fill - args: - to: "col_workflow_3" - value: 3 diff --git a/examples/single_verb/run.py b/examples/single_verb/run.py index bc56158543..99f8137a98 100644 --- a/examples/single_verb/run.py +++ b/examples/single_verb/run.py @@ -5,8 +5,8 @@ import pandas as pd -from graphrag.index import run_pipeline, run_pipeline_with_config -from graphrag.index.config import PipelineWorkflowReference +from graphrag.index.config.workflow import PipelineWorkflowReference +from graphrag.index.run import run_pipeline, run_pipeline_with_config # our fake dataset dataset = pd.DataFrame([{"col1": 2, "col2": 4}, {"col1": 5, "col2": 10}]) diff --git a/examples/use_built_in_workflows/run.py b/examples/use_built_in_workflows/run.py index def3a0a67e..7212126d0b 100644 --- a/examples/use_built_in_workflows/run.py +++ b/examples/use_built_in_workflows/run.py @@ -3,9 +3,10 @@ import asyncio import os -from graphrag.index import run_pipeline, run_pipeline_with_config -from graphrag.index.config import PipelineCSVInputConfig, PipelineWorkflowReference -from graphrag.index.input import load_input +from graphrag.index.config.input import PipelineCSVInputConfig +from graphrag.index.config.workflow import PipelineWorkflowReference +from graphrag.index.input.load_input import load_input +from graphrag.index.run import run_pipeline, run_pipeline_with_config sample_data_dir = os.path.join( os.path.dirname(os.path.abspath(__file__)), "../_sample_data/" diff --git a/examples/various_levels_of_configs/__init__.py b/examples/various_levels_of_configs/__init__.py deleted file mode 100644 index 0a3e38adfb..0000000000 --- a/examples/various_levels_of_configs/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License diff --git a/examples/various_levels_of_configs/pipelines/workflows_and_inputs.yml b/examples/various_levels_of_configs/pipelines/workflows_and_inputs.yml deleted file mode 100644 index 0a653831f2..0000000000 --- a/examples/various_levels_of_configs/pipelines/workflows_and_inputs.yml +++ /dev/null @@ -1,64 +0,0 @@ -input: - file_type: csv - base_dir: ../../_sample_data - file_pattern: .*\.csv$ - source_column: "author" - text_column: "message" - timestamp_column: "date(yyyyMMddHHmmss)" - timestamp_format: "%Y%m%d%H%M%S" - title_column: "message" - - # Limit to 10, we're not rich - post_process: - - verb: sample - args: - size: 10 - input: - source: source - -workflows: - - # This workflow reference here is only necessary - # because we want to customize the how the entity_extraction workflow is configured - # otherwise, it can be omitted, but you're stuck with the default configuration for entity_extraction - - name: entity_extraction - config: - entity_extract: - strategy: - type: graph_intelligence - llm: - type: openai_chat - api_key: !ENV ${EXAMPLE_OPENAI_API_KEY} - model: !ENV ${EXAMPLE_OPENAI_MODEL:gpt-3.5-turbo} - max_tokens: !ENV ${EXAMPLE_OPENAI_MAX_TOKENS:2500} - temperature: !ENV ${EXAMPLE_OPENAI_TEMPERATURE:0} - - - name: entity_graph - config: - cluster_graph: - strategy: - type: leiden - embed_graph: - strategy: - type: node2vec - num_walks: 10 - walk_length: 40 - window_size: 2 - iterations: 3 - random_seed: 597832 - layout_graph: - strategy: - type: umap - - # This is an anonymous workflow, it doesn't have a name - - steps: - - # Unpack the nodes from the graph - - verb: graph.unpack - args: - column: positioned_graph - type: nodes - input: - - # This is saying use the output of the entity_graph workflow as the input to this step - source: workflow:entity_graph \ No newline at end of file diff --git a/examples/various_levels_of_configs/pipelines/workflows_only.yml b/examples/various_levels_of_configs/pipelines/workflows_only.yml deleted file mode 100644 index 2c3c43de6e..0000000000 --- a/examples/various_levels_of_configs/pipelines/workflows_only.yml +++ /dev/null @@ -1,46 +0,0 @@ -workflows: - - # This workflow reference here is only necessary - # because we want to customize the how the entity_extraction workflow is configured - # otherwise, it can be omitted, but you're stuck with the default configuration for entity_extraction - - name: entity_extraction - config: - entity_extract: - strategy: - type: graph_intelligence - llm: - type: openai_chat - api_key: !ENV ${EXAMPLE_OPENAI_API_KEY} - model: !ENV ${EXAMPLE_OPENAI_MODEL:gpt-3.5-turbo} - max_tokens: !ENV ${EXAMPLE_OPENAI_MAX_TOKENS:2500} - temperature: !ENV ${EXAMPLE_OPENAI_TEMPERATURE:0} - - - name: entity_graph - config: - cluster_graph: - strategy: - type: leiden - embed_graph: - strategy: - type: node2vec - num_walks: 10 - walk_length: 40 - window_size: 2 - iterations: 3 - random_seed: 597832 - layout_graph: - strategy: - type: umap - - # This is an anonymous workflow, it doesn't have a name - - steps: - - # Unpack the nodes from the graph - - verb: graph.unpack - args: - column: positioned_graph - type: nodes - input: - - # This is saying use the output of the entity_graph workflow as the input to this step - source: workflow:entity_graph \ No newline at end of file diff --git a/examples/various_levels_of_configs/workflows_and_inputs.py b/examples/various_levels_of_configs/workflows_and_inputs.py deleted file mode 100644 index 87c7c2f8d4..0000000000 --- a/examples/various_levels_of_configs/workflows_and_inputs.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -import asyncio -import os - -from graphrag.index import run_pipeline_with_config - - -async def main(): - if ( - "EXAMPLE_OPENAI_API_KEY" not in os.environ - and "OPENAI_API_KEY" not in os.environ - ): - msg = "Please set EXAMPLE_OPENAI_API_KEY or OPENAI_API_KEY environment variable to run this example" - raise Exception(msg) - - # run the pipeline with the config, and override the dataset with the one we just created - # and grab the last result from the pipeline, should be our entity extraction - pipeline_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), - "./pipelines/workflows_and_inputs.yml", - ) - - # run the pipeline with the config, and override the dataset with the one we just created - # and grab the last result from the pipeline, should be the last workflow that was run (our nodes) - tables = [] - async for table in run_pipeline_with_config(pipeline_path): - tables.append(table) - pipeline_result = tables[-1] - - # The output will contain a list of positioned nodes - if pipeline_result.result is not None: - top_nodes = pipeline_result.result.head(10) - print("pipeline result", top_nodes) - else: - print("No results!") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/examples/various_levels_of_configs/workflows_and_inputs_with_custom_handlers.py b/examples/various_levels_of_configs/workflows_and_inputs_with_custom_handlers.py deleted file mode 100644 index 880c72ad91..0000000000 --- a/examples/various_levels_of_configs/workflows_and_inputs_with_custom_handlers.py +++ /dev/null @@ -1,131 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -import asyncio -import os -from typing import Any - -from datashaper import NoopWorkflowCallbacks, Progress - -from graphrag.index import run_pipeline_with_config -from graphrag.index.cache import InMemoryCache, PipelineCache -from graphrag.index.storage import MemoryPipelineStorage - - -async def main(): - if ( - "EXAMPLE_OPENAI_API_KEY" not in os.environ - and "OPENAI_API_KEY" not in os.environ - ): - msg = "Please set EXAMPLE_OPENAI_API_KEY or OPENAI_API_KEY environment variable to run this example" - raise Exception(msg) - - # run the pipeline with the config, and override the dataset with the one we just created - # and grab the last result from the pipeline, should be our entity extraction - pipeline_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), - "./pipelines/workflows_and_inputs.yml", - ) - - # Create our custom storage - custom_storage = ExampleStorage() - - # Create our custom reporter - custom_reporter = ExampleReporter() - - # Create our custom cache - custom_cache = ExampleCache() - - # run the pipeline with the config, and override the dataset with the one we just created - # and grab the last result from the pipeline, should be the last workflow that was run (our nodes) - pipeline_result = [] - async for result in run_pipeline_with_config( - pipeline_path, - storage=custom_storage, - callbacks=custom_reporter, - cache=custom_cache, - ): - pipeline_result.append(result) - pipeline_result = pipeline_result[-1] - - # The output will contain a list of positioned nodes - if pipeline_result.result is not None: - top_nodes = pipeline_result.result.head(10) - print("pipeline result", top_nodes) - else: - print("No results!") - - -class ExampleStorage(MemoryPipelineStorage): - """Example of a custom storage handler""" - - async def get( - self, key: str, as_bytes: bool | None = None, encoding: str | None = None - ) -> Any: - print(f"ExampleStorage.get {key}") - return await super().get(key, as_bytes) - - async def set( - self, key: str, value: str | bytes | None, encoding: str | None = None - ) -> None: - print(f"ExampleStorage.set {key}") - return await super().set(key, value) - - async def has(self, key: str) -> bool: - print(f"ExampleStorage.has {key}") - return await super().has(key) - - async def delete(self, key: str) -> None: - print(f"ExampleStorage.delete {key}") - return await super().delete(key) - - async def clear(self) -> None: - print("ExampleStorage.clear") - return await super().clear() - - -class ExampleCache(InMemoryCache): - """Example of a custom cache handler""" - - async def get(self, key: str) -> Any: - print(f"ExampleCache.get {key}") - return await super().get(key) - - async def set(self, key: str, value: Any, debug_data: dict | None = None) -> None: - print(f"ExampleCache.set {key}") - return await super().set(key, value, debug_data) - - async def has(self, key: str) -> bool: - print(f"ExampleCache.has {key}") - return await super().has(key) - - async def delete(self, key: str) -> None: - print(f"ExampleCache.delete {key}") - return await super().delete(key) - - async def clear(self) -> None: - print("ExampleCache.clear") - return await super().clear() - - def child(self, name: str) -> PipelineCache: - print(f"ExampleCache.child {name}") - return ExampleCache(name) - - -class ExampleReporter(NoopWorkflowCallbacks): - """Example of a custom reporter. This will print out all of the status updates from the pipeline.""" - - def progress(self, progress: Progress): - print("ExampleReporter.progress: ", progress) - - def error(self, message: str, details: dict[str, Any] | None = None): - print("ExampleReporter.error: ", message) - - def warning(self, message: str, details: dict[str, Any] | None = None): - print("ExampleReporter.warning: ", message) - - def log(self, message: str, details: dict[str, Any] | None = None): - print("ExampleReporter.log: ", message) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/examples/various_levels_of_configs/workflows_only.py b/examples/various_levels_of_configs/workflows_only.py deleted file mode 100644 index 192297eb8f..0000000000 --- a/examples/various_levels_of_configs/workflows_only.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -import asyncio -import os - -from graphrag.index import run_pipeline_with_config -from graphrag.index.config import PipelineCSVInputConfig -from graphrag.index.input import load_input - -sample_data_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "../_sample_data/" -) - - -async def main(): - if ( - "EXAMPLE_OPENAI_API_KEY" not in os.environ - and "OPENAI_API_KEY" not in os.environ - ): - msg = "Please set EXAMPLE_OPENAI_API_KEY or OPENAI_API_KEY environment variable to run this example" - raise Exception(msg) - - dataset = await load_input( - PipelineCSVInputConfig( - file_pattern=".*\\.csv$", - base_dir=sample_data_dir, - source_column="author", - text_column="message", - timestamp_column="date(yyyyMMddHHmmss)", - timestamp_format="%Y%m%d%H%M%S", - title_column="message", - ), - ) - - # We're cheap, and this is an example, lets just do 10 - dataset = dataset.head(10) - - # run the pipeline with the config, and override the dataset with the one we just created - # and grab the last result from the pipeline, should be the last workflow that was run (our nodes) - pipeline_path = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "./pipelines/workflows_only.yml" - ) - tables = [] - async for table in run_pipeline_with_config(pipeline_path, dataset=dataset): - tables.append(table) - pipeline_result = tables[-1] - - # The output will contain a list of positioned nodes - if pipeline_result.result is not None: - top_nodes = pipeline_result.result.head(10) - print( - "pipeline result\ncols: ", pipeline_result.result.columns, "\n", top_nodes - ) - else: - print("No results!") - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/graphrag/__main__.py b/graphrag/__main__.py index ae2421478c..faafaee5b2 100644 --- a/graphrag/__main__.py +++ b/graphrag/__main__.py @@ -3,6 +3,6 @@ """The GraphRAG package.""" -from .cli.main import app +from graphrag.cli.main import app app(prog_name="graphrag") diff --git a/graphrag/api/__init__.py b/graphrag/api/__init__.py index 49059f3e2c..6165122e5c 100644 --- a/graphrag/api/__init__.py +++ b/graphrag/api/__init__.py @@ -8,7 +8,7 @@ """ from graphrag.api.index import build_index -from graphrag.api.prompt_tune import DocSelectionType, generate_indexing_prompts +from graphrag.api.prompt_tune import generate_indexing_prompts from graphrag.api.query import ( drift_search, global_search, @@ -16,6 +16,7 @@ local_search, local_search_streaming, ) +from graphrag.prompt_tune.types import DocSelectionType __all__ = [ # noqa: RUF022 # index API diff --git a/graphrag/api/index.py b/graphrag/api/index.py index e5924dfd9b..3746697d19 100644 --- a/graphrag/api/index.py +++ b/graphrag/api/index.py @@ -10,13 +10,14 @@ from pathlib import Path -from graphrag.config import CacheType, GraphRagConfig +from graphrag.config.enums import CacheType +from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.cache.noop_pipeline_cache import NoopPipelineCache from graphrag.index.create_pipeline_config import create_pipeline_config from graphrag.index.emit.types import TableEmitterType from graphrag.index.run import run_pipeline_with_config from graphrag.index.typing import PipelineRunResult -from graphrag.logging import ProgressReporter +from graphrag.logging.base import ProgressReporter from graphrag.vector_stores.factory import VectorStoreType diff --git a/graphrag/api/prompt_tune.py b/graphrag/api/prompt_tune.py index 4363c71b10..917727214c 100644 --- a/graphrag/api/prompt_tune.py +++ b/graphrag/api/prompt_tune.py @@ -15,25 +15,32 @@ from pydantic import PositiveInt, validate_call from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.index.llm import load_llm -from graphrag.logging import PrintProgressReporter -from graphrag.prompt_tune.generator import ( - MAX_TOKEN_COUNT, - create_community_summarization_prompt, - create_entity_extraction_prompt, - create_entity_summarization_prompt, - detect_language, +from graphrag.index.llm.load_llm import load_llm +from graphrag.logging.print_progress import PrintProgressReporter +from graphrag.prompt_tune.defaults import MAX_TOKEN_COUNT +from graphrag.prompt_tune.generator.community_report_rating import ( generate_community_report_rating, +) +from graphrag.prompt_tune.generator.community_report_summarization import ( + create_community_summarization_prompt, +) +from graphrag.prompt_tune.generator.community_reporter_role import ( generate_community_reporter_role, - generate_domain, +) +from graphrag.prompt_tune.generator.domain import generate_domain +from graphrag.prompt_tune.generator.entity_extraction_prompt import ( + create_entity_extraction_prompt, +) +from graphrag.prompt_tune.generator.entity_relationship import ( generate_entity_relationship_examples, - generate_entity_types, - generate_persona, ) -from graphrag.prompt_tune.loader import ( - MIN_CHUNK_SIZE, - load_docs_in_chunks, +from graphrag.prompt_tune.generator.entity_summarization_prompt import ( + create_entity_summarization_prompt, ) +from graphrag.prompt_tune.generator.entity_types import generate_entity_types +from graphrag.prompt_tune.generator.language import detect_language +from graphrag.prompt_tune.generator.persona import generate_persona +from graphrag.prompt_tune.loader.input import MIN_CHUNK_SIZE, load_docs_in_chunks from graphrag.prompt_tune.types import DocSelectionType @@ -64,7 +71,7 @@ async def generate_indexing_prompts( - domain: The domain to map the input documents to. - language: The language to use for the prompts. - max_tokens: The maximum number of tokens to use on entity extraction prompts - - skip_entity_types: Skip generating entity types. + - discover_entity_types: Generate entity types. - min_examples_required: The minimum number of examples required for entity extraction prompts. - n_subset_max: The number of text chunks to embed when using auto selection method. - k: The number of documents to select when using auto selection method. diff --git a/graphrag/api/query.py b/graphrag/api/query.py index 21648a12a8..7149211c83 100644 --- a/graphrag/api/query.py +++ b/graphrag/api/query.py @@ -24,12 +24,12 @@ import pandas as pd from pydantic import validate_call -from graphrag.config import GraphRagConfig +from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.config.embeddings import ( community_full_content_embedding, entity_description_embedding, ) -from graphrag.logging import PrintProgressReporter +from graphrag.logging.print_progress import PrintProgressReporter from graphrag.query.factories import ( get_drift_search_engine, get_global_search_engine, @@ -47,8 +47,8 @@ from graphrag.query.structured_search.base import SearchResult # noqa: TCH001 from graphrag.utils.cli import redact from graphrag.utils.embeddings import create_collection_name -from graphrag.vector_stores import VectorStoreFactory, VectorStoreType from graphrag.vector_stores.base import BaseVectorStore +from graphrag.vector_stores.factory import VectorStoreFactory, VectorStoreType reporter = PrintProgressReporter("") diff --git a/graphrag/callbacks/factories.py b/graphrag/callbacks/factories.py index 3f3b64788f..257a0d0a6c 100644 --- a/graphrag/callbacks/factories.py +++ b/graphrag/callbacks/factories.py @@ -8,17 +8,16 @@ from datashaper import WorkflowCallbacks -from graphrag.config import ReportingType -from graphrag.index.config import ( +from graphrag.callbacks.blob_workflow_callbacks import BlobWorkflowCallbacks +from graphrag.callbacks.console_workflow_callbacks import ConsoleWorkflowCallbacks +from graphrag.callbacks.file_workflow_callbacks import FileWorkflowCallbacks +from graphrag.config.enums import ReportingType +from graphrag.index.config.reporting import ( PipelineBlobReportingConfig, PipelineFileReportingConfig, PipelineReportingConfig, ) -from .blob_workflow_callbacks import BlobWorkflowCallbacks -from .console_workflow_callbacks import ConsoleWorkflowCallbacks -from .file_workflow_callbacks import FileWorkflowCallbacks - def create_pipeline_reporter( config: PipelineReportingConfig | None, root_dir: str | None diff --git a/graphrag/callbacks/global_search_callbacks.py b/graphrag/callbacks/global_search_callbacks.py index 32c6fc8668..c8f1395bd9 100644 --- a/graphrag/callbacks/global_search_callbacks.py +++ b/graphrag/callbacks/global_search_callbacks.py @@ -3,10 +3,9 @@ """GlobalSearch LLM Callbacks.""" +from graphrag.callbacks.llm_callbacks import BaseLLMCallback from graphrag.query.structured_search.base import SearchResult -from .llm_callbacks import BaseLLMCallback - class GlobalSearchLLMCallback(BaseLLMCallback): """GlobalSearch LLM Callbacks.""" diff --git a/graphrag/callbacks/progress_workflow_callbacks.py b/graphrag/callbacks/progress_workflow_callbacks.py index 31c29543a5..d4c9407a58 100644 --- a/graphrag/callbacks/progress_workflow_callbacks.py +++ b/graphrag/callbacks/progress_workflow_callbacks.py @@ -7,7 +7,7 @@ from datashaper import ExecutionNode, NoopWorkflowCallbacks, Progress, TableContainer -from graphrag.logging import ProgressReporter +from graphrag.logging.base import ProgressReporter class ProgressWorkflowCallbacks(NoopWorkflowCallbacks): diff --git a/graphrag/cli/index.py b/graphrag/cli/index.py index c9ec2bdc05..90a720fab4 100644 --- a/graphrag/cli/index.py +++ b/graphrag/cli/index.py @@ -11,15 +11,15 @@ from pathlib import Path import graphrag.api as api -from graphrag.config import ( - CacheType, - enable_logging_with_config, - load_config, - resolve_paths, -) +from graphrag.config.enums import CacheType +from graphrag.config.load_config import load_config +from graphrag.config.logging import enable_logging_with_config +from graphrag.config.resolve_path import resolve_paths from graphrag.index.emit.types import TableEmitterType from graphrag.index.validate_config import validate_config_names -from graphrag.logging import ProgressReporter, ReporterType, create_progress_reporter +from graphrag.logging.base import ProgressReporter +from graphrag.logging.factories import create_progress_reporter +from graphrag.logging.types import ReporterType from graphrag.utils.cli import redact # Ignore warnings from numba diff --git a/graphrag/cli/initialize.py b/graphrag/cli/initialize.py index c807397799..992d38f71e 100644 --- a/graphrag/cli/initialize.py +++ b/graphrag/cli/initialize.py @@ -5,8 +5,9 @@ from pathlib import Path -from graphrag.index.init_content import INIT_DOTENV, INIT_YAML -from graphrag.logging import ReporterType, create_progress_reporter +from graphrag.config.init_content import INIT_DOTENV, INIT_YAML +from graphrag.logging.factories import create_progress_reporter +from graphrag.logging.types import ReporterType from graphrag.prompts.index.claim_extraction import CLAIM_EXTRACTION_PROMPT from graphrag.prompts.index.community_report import ( COMMUNITY_REPORT_PROMPT, diff --git a/graphrag/cli/main.py b/graphrag/cli/main.py index 27bb5be34b..919015ae31 100644 --- a/graphrag/cli/main.py +++ b/graphrag/cli/main.py @@ -3,23 +3,24 @@ """CLI entrypoint.""" -import asyncio +import os +import re +from collections.abc import Callable from enum import Enum from pathlib import Path from typing import Annotated import typer -from graphrag.api import DocSelectionType from graphrag.index.emit.types import TableEmitterType -from graphrag.logging import ReporterType -from graphrag.prompt_tune.generator import MAX_TOKEN_COUNT -from graphrag.prompt_tune.loader import MIN_CHUNK_SIZE - -from .index import index_cli, update_cli -from .initialize import initialize_project_at -from .prompt_tune import prompt_tune -from .query import run_drift_search, run_global_search, run_local_search +from graphrag.logging.types import ReporterType +from graphrag.prompt_tune.defaults import ( + MAX_TOKEN_COUNT, + MIN_CHUNK_SIZE, + N_SUBSET_MAX, + K, +) +from graphrag.prompt_tune.types import DocSelectionType INVALID_METHOD_ERROR = "Invalid method" @@ -29,6 +30,48 @@ ) +# A workaround for typer's lack of support for proper autocompletion of file/directory paths +# For more detail, watch +# https://github.com/fastapi/typer/discussions/682 +# https://github.com/fastapi/typer/issues/951 +def path_autocomplete( + file_okay: bool = True, + dir_okay: bool = True, + readable: bool = True, + writable: bool = False, + match_wildcard: str | None = None, +) -> Callable[[str], list[str]]: + """Autocomplete file and directory paths.""" + + def wildcard_match(string: str, pattern: str) -> bool: + regex = re.escape(pattern).replace(r"\?", ".").replace(r"\*", ".*") + return re.fullmatch(regex, string) is not None + + def completer(incomplete: str) -> list[str]: + items = os.listdir() + completions = [] + for item in items: + if not file_okay and Path(item).is_file(): + continue + if not dir_okay and Path(item).is_dir(): + continue + if readable and not os.access(item, os.R_OK): + continue + if writable and not os.access(item, os.W_OK): + continue + completions.append(item) + if match_wildcard: + completions = filter( + lambda i: wildcard_match(i, match_wildcard) + if match_wildcard + else False, + completions, + ) + return [i for i in completions if i.startswith(incomplete)] + + return completer + + class SearchType(Enum): """The type of search to run.""" @@ -50,10 +93,15 @@ def _initialize_cli( dir_okay=True, writable=True, resolve_path=True, + autocompletion=path_autocomplete( + file_okay=False, dir_okay=True, writable=True, match_wildcard="*" + ), ), ], ): """Generate a default configuration file.""" + from graphrag.cli.initialize import initialize_project_at + initialize_project_at(path=root) @@ -73,6 +121,9 @@ def _index_cli( dir_okay=True, writable=True, resolve_path=True, + autocompletion=path_autocomplete( + file_okay=False, dir_okay=True, writable=True, match_wildcard="*" + ), ), ] = Path(), # set default to current directory verbose: Annotated[ @@ -114,6 +165,8 @@ def _index_cli( ] = None, ): """Build a knowledge graph index.""" + from graphrag.cli.index import index_cli + index_cli( root_dir=root, verbose=verbose, @@ -181,6 +234,8 @@ def _update_cli( Applies a default storage configuration (if not provided by config), saving the new index to the local file system in the `update_output` folder. """ + from graphrag.cli.index import update_cli + update_cli( root_dir=root, verbose=verbose, @@ -204,12 +259,21 @@ def _prompt_tune_cli( dir_okay=True, writable=True, resolve_path=True, + autocompletion=path_autocomplete( + file_okay=False, dir_okay=True, writable=True, match_wildcard="*" + ), ), ] = Path(), # set default to current directory config: Annotated[ Path | None, typer.Option( - help="The configuration to use.", exists=True, file_okay=True, readable=True + help="The configuration to use.", + exists=True, + file_okay=True, + readable=True, + autocompletion=path_autocomplete( + file_okay=True, dir_okay=False, match_wildcard="*" + ), ), ] = None, domain: Annotated[ @@ -226,13 +290,13 @@ def _prompt_tune_cli( typer.Option( help="The number of text chunks to embed when --selection-method=auto." ), - ] = 300, + ] = N_SUBSET_MAX, k: Annotated[ int, typer.Option( help="The maximum number of documents to select from each centroid when --selection-method=auto." ), - ] = 15, + ] = K, limit: Annotated[ int, typer.Option( @@ -271,6 +335,10 @@ def _prompt_tune_cli( ] = Path("prompts"), ): """Generate custom graphrag prompts with your own data (i.e. auto templating).""" + import asyncio + + from graphrag.cli.prompt_tune import prompt_tune + loop = asyncio.get_event_loop() loop.run_until_complete( prompt_tune( @@ -298,7 +366,13 @@ def _query_cli( config: Annotated[ Path | None, typer.Option( - help="The configuration to use.", exists=True, file_okay=True, readable=True + help="The configuration to use.", + exists=True, + file_okay=True, + readable=True, + autocompletion=path_autocomplete( + file_okay=True, dir_okay=False, match_wildcard="*" + ), ), ] = None, data: Annotated[ @@ -309,6 +383,9 @@ def _query_cli( dir_okay=True, readable=True, resolve_path=True, + autocompletion=path_autocomplete( + file_okay=False, dir_okay=True, match_wildcard="*" + ), ), ] = None, root: Annotated[ @@ -319,6 +396,9 @@ def _query_cli( dir_okay=True, writable=True, resolve_path=True, + autocompletion=path_autocomplete( + file_okay=False, dir_okay=True, match_wildcard="*" + ), ), ] = Path(), # set default to current directory community_level: Annotated[ @@ -342,6 +422,8 @@ def _query_cli( ] = False, ): """Query a knowledge graph index.""" + from graphrag.cli.query import run_drift_search, run_global_search, run_local_search + match method: case SearchType.LOCAL: run_local_search( diff --git a/graphrag/cli/prompt_tune.py b/graphrag/cli/prompt_tune.py index cbb36e00ba..feaa08c32a 100644 --- a/graphrag/cli/prompt_tune.py +++ b/graphrag/cli/prompt_tune.py @@ -6,8 +6,8 @@ from pathlib import Path import graphrag.api as api -from graphrag.config import load_config -from graphrag.logging import PrintProgressReporter +from graphrag.config.load_config import load_config +from graphrag.logging.print_progress import PrintProgressReporter from graphrag.prompt_tune.generator.community_report_summarization import ( COMMUNITY_SUMMARIZATION_FILENAME, ) diff --git a/graphrag/cli/query.py b/graphrag/cli/query.py index 815313a2d5..ea9116c695 100644 --- a/graphrag/cli/query.py +++ b/graphrag/cli/query.py @@ -10,9 +10,11 @@ import pandas as pd import graphrag.api as api -from graphrag.config import GraphRagConfig, load_config, resolve_paths +from graphrag.config.load_config import load_config +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.config.resolve_path import resolve_paths from graphrag.index.create_pipeline_config import create_pipeline_config -from graphrag.logging import PrintProgressReporter +from graphrag.logging.print_progress import PrintProgressReporter from graphrag.utils.storage import _create_storage, _load_table_from_storage reporter = PrintProgressReporter("") diff --git a/graphrag/config/__init__.py b/graphrag/config/__init__.py index 3354f2ccd8..90e6e010af 100644 --- a/graphrag/config/__init__.py +++ b/graphrag/config/__init__.py @@ -2,134 +2,3 @@ # Licensed under the MIT License """The Indexing Engine default config package root.""" - -from .config_file_loader import load_config_from_file, search_for_config_in_root_dir -from .create_graphrag_config import ( - create_graphrag_config, -) -from .enums import ( - CacheType, - InputFileType, - InputType, - LLMType, - ReportingType, - StorageType, - TextEmbeddingTarget, -) -from .errors import ( - ApiKeyMissingError, - AzureApiBaseMissingError, - AzureDeploymentNameMissingError, -) -from .input_models import ( - CacheConfigInput, - ChunkingConfigInput, - ClaimExtractionConfigInput, - ClusterGraphConfigInput, - CommunityReportsConfigInput, - EmbedGraphConfigInput, - EntityExtractionConfigInput, - GlobalSearchConfigInput, - GraphRagConfigInput, - InputConfigInput, - LLMConfigInput, - LLMParametersInput, - LocalSearchConfigInput, - ParallelizationParametersInput, - ReportingConfigInput, - SnapshotsConfigInput, - StorageConfigInput, - SummarizeDescriptionsConfigInput, - TextEmbeddingConfigInput, - UmapConfigInput, -) -from .load_config import load_config -from .logging import enable_logging_with_config -from .models import ( - CacheConfig, - ChunkingConfig, - ClaimExtractionConfig, - ClusterGraphConfig, - CommunityReportsConfig, - DRIFTSearchConfig, - EmbedGraphConfig, - EntityExtractionConfig, - GlobalSearchConfig, - GraphRagConfig, - InputConfig, - LLMConfig, - LLMParameters, - LocalSearchConfig, - ParallelizationParameters, - ReportingConfig, - SnapshotsConfig, - StorageConfig, - SummarizeDescriptionsConfig, - TextEmbeddingConfig, - UmapConfig, -) -from .read_dotenv import read_dotenv -from .resolve_path import resolve_path, resolve_paths - -__all__ = [ - "ApiKeyMissingError", - "AzureApiBaseMissingError", - "AzureDeploymentNameMissingError", - "CacheConfig", - "CacheConfigInput", - "CacheType", - "ChunkingConfig", - "ChunkingConfigInput", - "ClaimExtractionConfig", - "ClaimExtractionConfigInput", - "ClusterGraphConfig", - "ClusterGraphConfigInput", - "CommunityReportsConfig", - "CommunityReportsConfigInput", - "DRIFTSearchConfig", - "EmbedGraphConfig", - "EmbedGraphConfigInput", - "EntityExtractionConfig", - "EntityExtractionConfigInput", - "GlobalSearchConfig", - "GlobalSearchConfigInput", - "GraphRagConfig", - "GraphRagConfigInput", - "InputConfig", - "InputConfigInput", - "InputFileType", - "InputType", - "LLMConfig", - "LLMConfigInput", - "LLMParameters", - "LLMParametersInput", - "LLMType", - "LocalSearchConfig", - "LocalSearchConfigInput", - "ParallelizationParameters", - "ParallelizationParametersInput", - "ReportingConfig", - "ReportingConfigInput", - "ReportingType", - "SnapshotsConfig", - "SnapshotsConfigInput", - "StorageConfig", - "StorageConfigInput", - "StorageType", - "StorageType", - "SummarizeDescriptionsConfig", - "SummarizeDescriptionsConfigInput", - "TextEmbeddingConfig", - "TextEmbeddingConfigInput", - "TextEmbeddingTarget", - "UmapConfig", - "UmapConfigInput", - "create_graphrag_config", - "enable_logging_with_config", - "load_config", - "load_config_from_file", - "read_dotenv", - "resolve_path", - "resolve_paths", - "search_for_config_in_root_dir", -] diff --git a/graphrag/config/config_file_loader.py b/graphrag/config/config_file_loader.py index 667fbe8807..4ab930a374 100644 --- a/graphrag/config/config_file_loader.py +++ b/graphrag/config/config_file_loader.py @@ -9,8 +9,8 @@ import yaml -from .create_graphrag_config import create_graphrag_config -from .models.graph_rag_config import GraphRagConfig +from graphrag.config.create_graphrag_config import create_graphrag_config +from graphrag.config.models.graph_rag_config import GraphRagConfig _default_config_files = ["settings.yaml", "settings.yml", "settings.json"] diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py index d4f2b56435..aa98e3fe62 100644 --- a/graphrag/config/create_graphrag_config.py +++ b/graphrag/config/create_graphrag_config.py @@ -13,8 +13,7 @@ from pydantic import TypeAdapter import graphrag.config.defaults as defs - -from .enums import ( +from graphrag.config.enums import ( CacheType, InputFileType, InputType, @@ -23,39 +22,37 @@ StorageType, TextEmbeddingTarget, ) -from .environment_reader import EnvironmentReader -from .errors import ( +from graphrag.config.environment_reader import EnvironmentReader +from graphrag.config.errors import ( ApiKeyMissingError, AzureApiBaseMissingError, AzureDeploymentNameMissingError, ) -from .input_models import ( - GraphRagConfigInput, - LLMConfigInput, -) -from .models import ( - CacheConfig, - ChunkingConfig, - ClaimExtractionConfig, - ClusterGraphConfig, - CommunityReportsConfig, - DRIFTSearchConfig, - EmbedGraphConfig, - EntityExtractionConfig, - GlobalSearchConfig, - GraphRagConfig, - InputConfig, - LLMParameters, - LocalSearchConfig, - ParallelizationParameters, - ReportingConfig, - SnapshotsConfig, - StorageConfig, +from graphrag.config.input_models.graphrag_config_input import GraphRagConfigInput +from graphrag.config.input_models.llm_config_input import LLMConfigInput +from graphrag.config.models.cache_config import CacheConfig +from graphrag.config.models.chunking_config import ChunkingConfig +from graphrag.config.models.claim_extraction_config import ClaimExtractionConfig +from graphrag.config.models.cluster_graph_config import ClusterGraphConfig +from graphrag.config.models.community_reports_config import CommunityReportsConfig +from graphrag.config.models.drift_search_config import DRIFTSearchConfig +from graphrag.config.models.embed_graph_config import EmbedGraphConfig +from graphrag.config.models.entity_extraction_config import EntityExtractionConfig +from graphrag.config.models.global_search_config import GlobalSearchConfig +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.config.models.input_config import InputConfig +from graphrag.config.models.llm_parameters import LLMParameters +from graphrag.config.models.local_search_config import LocalSearchConfig +from graphrag.config.models.parallelization_parameters import ParallelizationParameters +from graphrag.config.models.reporting_config import ReportingConfig +from graphrag.config.models.snapshots_config import SnapshotsConfig +from graphrag.config.models.storage_config import StorageConfig +from graphrag.config.models.summarize_descriptions_config import ( SummarizeDescriptionsConfig, - TextEmbeddingConfig, - UmapConfig, ) -from .read_dotenv import read_dotenv +from graphrag.config.models.text_embedding_config import TextEmbeddingConfig +from graphrag.config.models.umap_config import UmapConfig +from graphrag.config.read_dotenv import read_dotenv InputModelValidator = TypeAdapter(GraphRagConfigInput) diff --git a/graphrag/config/defaults.py b/graphrag/config/defaults.py index 262705b3dd..ecfe632eaa 100644 --- a/graphrag/config/defaults.py +++ b/graphrag/config/defaults.py @@ -7,9 +7,7 @@ from datashaper import AsyncType -from graphrag.vector_stores import VectorStoreType - -from .enums import ( +from graphrag.config.enums import ( CacheType, InputFileType, InputType, @@ -18,6 +16,7 @@ StorageType, TextEmbeddingTarget, ) +from graphrag.vector_stores.factory import VectorStoreType ASYNC_MODE = AsyncType.Threaded ENCODING_MODEL = "cl100k_base" @@ -93,7 +92,7 @@ VECTOR_STORE = f""" type: {VectorStoreType.LanceDB.value} db_uri: '{(Path(STORAGE_BASE_DIR) / "lancedb")!s}' - container_name: default # A prefix for the vector store to create embedding containers. Default: 'default'. + container_name: default overwrite: true\ """ diff --git a/graphrag/config/init_content.py b/graphrag/config/init_content.py new file mode 100644 index 0000000000..5056428dc6 --- /dev/null +++ b/graphrag/config/init_content.py @@ -0,0 +1,141 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Content for the init CLI command to generate a default configuration.""" + +import graphrag.config.defaults as defs + +INIT_YAML = f"""\ +### This config file contains required core defaults that must be set, along with a handful of common optional settings. +### For a full list of available settings, see https://microsoft.github.io/graphrag/config/yaml/ + +### LLM settings ### +## There are a number of settings to tune the threading and token limits for LLM calls - check the docs. + +encoding_model: cl100k_base # this needs to be matched to your model! + +llm: + api_key: ${{GRAPHRAG_API_KEY}} # set this in the generated .env file + type: {defs.LLM_TYPE.value} # or azure_openai_chat + model: {defs.LLM_MODEL} + model_supports_json: true # recommended if this is available for your model. + # audience: "https://cognitiveservices.azure.com/.default" + # api_base: https://.openai.azure.com + # api_version: 2024-02-15-preview + # organization: + # deployment_name: + +parallelization: + stagger: {defs.PARALLELIZATION_STAGGER} + # num_threads: {defs.PARALLELIZATION_NUM_THREADS} + +async_mode: {defs.ASYNC_MODE.value} # or asyncio + +embeddings: + async_mode: {defs.ASYNC_MODE.value} # or asyncio + vector_store:{defs.VECTOR_STORE} + llm: + api_key: ${{GRAPHRAG_API_KEY}} + type: {defs.EMBEDDING_TYPE.value} # or azure_openai_embedding + model: {defs.EMBEDDING_MODEL} + # api_base: https://.openai.azure.com + # api_version: 2024-02-15-preview + # audience: "https://cognitiveservices.azure.com/.default" + # organization: + # deployment_name: + +### Input settings ### + +input: + type: {defs.INPUT_TYPE.value} # or blob + file_type: {defs.INPUT_FILE_TYPE.value} # or csv + base_dir: "{defs.INPUT_BASE_DIR}" + file_encoding: {defs.INPUT_FILE_ENCODING} + file_pattern: ".*\\\\.txt$" + +chunks: + size: {defs.CHUNK_SIZE} + overlap: {defs.CHUNK_OVERLAP} + group_by_columns: [{",".join(defs.CHUNK_GROUP_BY_COLUMNS)}] + +### Storage settings ### +## If blob storage is specified in the following four sections, +## connection_string and container_name must be provided + +cache: + type: {defs.CACHE_TYPE.value} # or blob + base_dir: "{defs.CACHE_BASE_DIR}" + +reporting: + type: {defs.REPORTING_TYPE.value} # or console, blob + base_dir: "{defs.REPORTING_BASE_DIR}" + +storage: + type: {defs.STORAGE_TYPE.value} # or blob + base_dir: "{defs.STORAGE_BASE_DIR}" + +## only turn this on if running `graphrag index` with custom settings +## we normally use `graphrag update` with the defaults +update_index_storage: + # type: {defs.STORAGE_TYPE.value} # or blob + # base_dir: "{defs.UPDATE_STORAGE_BASE_DIR}" + +### Workflow settings ### + +skip_workflows: [] + +entity_extraction: + prompt: "prompts/entity_extraction.txt" + entity_types: [{",".join(defs.ENTITY_EXTRACTION_ENTITY_TYPES)}] + max_gleanings: {defs.ENTITY_EXTRACTION_MAX_GLEANINGS} + +summarize_descriptions: + prompt: "prompts/summarize_descriptions.txt" + max_length: {defs.SUMMARIZE_DESCRIPTIONS_MAX_LENGTH} + +claim_extraction: + enabled: false + prompt: "prompts/claim_extraction.txt" + description: "{defs.CLAIM_DESCRIPTION}" + max_gleanings: {defs.CLAIM_MAX_GLEANINGS} + +community_reports: + prompt: "prompts/community_report.txt" + max_length: {defs.COMMUNITY_REPORT_MAX_LENGTH} + max_input_length: {defs.COMMUNITY_REPORT_MAX_INPUT_LENGTH} + +cluster_graph: + max_cluster_size: {defs.MAX_CLUSTER_SIZE} + +embed_graph: + enabled: false # if true, will generate node2vec embeddings for nodes + +umap: + enabled: false # if true, will generate UMAP embeddings for nodes + +snapshots: + graphml: false + raw_entities: false + top_level_nodes: false + embeddings: false + transient: false + +### Query settings ### +## The prompt locations are required here, but each search method has a number of optional knobs that can be tuned. +## See the config docs: https://microsoft.github.io/graphrag/config/yaml/#query + +local_search: + prompt: "prompts/local_search_system_prompt.txt" + +global_search: + map_prompt: "prompts/global_search_map_system_prompt.txt" + reduce_prompt: "prompts/global_search_reduce_system_prompt.txt" + knowledge_prompt: "prompts/global_search_knowledge_system_prompt.txt" + +drift_search: + prompt: "prompts/drift_search_system_prompt.txt" +""" + +INIT_DOTENV = """\ +GRAPHRAG_API_KEY= +""" diff --git a/graphrag/config/input_models/__init__.py b/graphrag/config/input_models/__init__.py index f905ae38b2..6c5862a947 100644 --- a/graphrag/config/input_models/__init__.py +++ b/graphrag/config/input_models/__init__.py @@ -2,49 +2,3 @@ # Licensed under the MIT License """Interfaces for Default Config parameterization.""" - -from .cache_config_input import CacheConfigInput -from .chunking_config_input import ChunkingConfigInput -from .claim_extraction_config_input import ClaimExtractionConfigInput -from .cluster_graph_config_input import ClusterGraphConfigInput -from .community_reports_config_input import CommunityReportsConfigInput -from .embed_graph_config_input import EmbedGraphConfigInput -from .entity_extraction_config_input import EntityExtractionConfigInput -from .global_search_config_input import GlobalSearchConfigInput -from .graphrag_config_input import GraphRagConfigInput -from .input_config_input import InputConfigInput -from .llm_config_input import LLMConfigInput -from .llm_parameters_input import LLMParametersInput -from .local_search_config_input import LocalSearchConfigInput -from .parallelization_parameters_input import ParallelizationParametersInput -from .reporting_config_input import ReportingConfigInput -from .snapshots_config_input import SnapshotsConfigInput -from .storage_config_input import StorageConfigInput -from .summarize_descriptions_config_input import ( - SummarizeDescriptionsConfigInput, -) -from .text_embedding_config_input import TextEmbeddingConfigInput -from .umap_config_input import UmapConfigInput - -__all__ = [ - "CacheConfigInput", - "ChunkingConfigInput", - "ClaimExtractionConfigInput", - "ClusterGraphConfigInput", - "CommunityReportsConfigInput", - "EmbedGraphConfigInput", - "EntityExtractionConfigInput", - "GlobalSearchConfigInput", - "GraphRagConfigInput", - "InputConfigInput", - "LLMConfigInput", - "LLMParametersInput", - "LocalSearchConfigInput", - "ParallelizationParametersInput", - "ReportingConfigInput", - "SnapshotsConfigInput", - "StorageConfigInput", - "SummarizeDescriptionsConfigInput", - "TextEmbeddingConfigInput", - "UmapConfigInput", -] diff --git a/graphrag/config/input_models/claim_extraction_config_input.py b/graphrag/config/input_models/claim_extraction_config_input.py index f23e31d0a7..42ff60ea14 100644 --- a/graphrag/config/input_models/claim_extraction_config_input.py +++ b/graphrag/config/input_models/claim_extraction_config_input.py @@ -5,7 +5,7 @@ from typing_extensions import NotRequired -from .llm_config_input import LLMConfigInput +from graphrag.config.input_models.llm_config_input import LLMConfigInput class ClaimExtractionConfigInput(LLMConfigInput): diff --git a/graphrag/config/input_models/community_reports_config_input.py b/graphrag/config/input_models/community_reports_config_input.py index 79ae3152e7..4f8297ae33 100644 --- a/graphrag/config/input_models/community_reports_config_input.py +++ b/graphrag/config/input_models/community_reports_config_input.py @@ -5,7 +5,7 @@ from typing_extensions import NotRequired -from .llm_config_input import LLMConfigInput +from graphrag.config.input_models.llm_config_input import LLMConfigInput class CommunityReportsConfigInput(LLMConfigInput): diff --git a/graphrag/config/input_models/entity_extraction_config_input.py b/graphrag/config/input_models/entity_extraction_config_input.py index f1d3587e99..dcc2770c21 100644 --- a/graphrag/config/input_models/entity_extraction_config_input.py +++ b/graphrag/config/input_models/entity_extraction_config_input.py @@ -5,7 +5,7 @@ from typing_extensions import NotRequired -from .llm_config_input import LLMConfigInput +from graphrag.config.input_models.llm_config_input import LLMConfigInput class EntityExtractionConfigInput(LLMConfigInput): diff --git a/graphrag/config/input_models/graphrag_config_input.py b/graphrag/config/input_models/graphrag_config_input.py index 7c04dea2e3..9d3094edd7 100644 --- a/graphrag/config/input_models/graphrag_config_input.py +++ b/graphrag/config/input_models/graphrag_config_input.py @@ -5,25 +5,39 @@ from typing_extensions import NotRequired -from .cache_config_input import CacheConfigInput -from .chunking_config_input import ChunkingConfigInput -from .claim_extraction_config_input import ClaimExtractionConfigInput -from .cluster_graph_config_input import ClusterGraphConfigInput -from .community_reports_config_input import CommunityReportsConfigInput -from .embed_graph_config_input import EmbedGraphConfigInput -from .entity_extraction_config_input import EntityExtractionConfigInput -from .global_search_config_input import GlobalSearchConfigInput -from .input_config_input import InputConfigInput -from .llm_config_input import LLMConfigInput -from .local_search_config_input import LocalSearchConfigInput -from .reporting_config_input import ReportingConfigInput -from .snapshots_config_input import SnapshotsConfigInput -from .storage_config_input import StorageConfigInput -from .summarize_descriptions_config_input import ( +from graphrag.config.input_models.cache_config_input import CacheConfigInput +from graphrag.config.input_models.chunking_config_input import ChunkingConfigInput +from graphrag.config.input_models.claim_extraction_config_input import ( + ClaimExtractionConfigInput, +) +from graphrag.config.input_models.cluster_graph_config_input import ( + ClusterGraphConfigInput, +) +from graphrag.config.input_models.community_reports_config_input import ( + CommunityReportsConfigInput, +) +from graphrag.config.input_models.embed_graph_config_input import EmbedGraphConfigInput +from graphrag.config.input_models.entity_extraction_config_input import ( + EntityExtractionConfigInput, +) +from graphrag.config.input_models.global_search_config_input import ( + GlobalSearchConfigInput, +) +from graphrag.config.input_models.input_config_input import InputConfigInput +from graphrag.config.input_models.llm_config_input import LLMConfigInput +from graphrag.config.input_models.local_search_config_input import ( + LocalSearchConfigInput, +) +from graphrag.config.input_models.reporting_config_input import ReportingConfigInput +from graphrag.config.input_models.snapshots_config_input import SnapshotsConfigInput +from graphrag.config.input_models.storage_config_input import StorageConfigInput +from graphrag.config.input_models.summarize_descriptions_config_input import ( SummarizeDescriptionsConfigInput, ) -from .text_embedding_config_input import TextEmbeddingConfigInput -from .umap_config_input import UmapConfigInput +from graphrag.config.input_models.text_embedding_config_input import ( + TextEmbeddingConfigInput, +) +from graphrag.config.input_models.umap_config_input import UmapConfigInput class GraphRagConfigInput(LLMConfigInput): diff --git a/graphrag/config/input_models/llm_config_input.py b/graphrag/config/input_models/llm_config_input.py index 67231371b8..35b3b342b4 100644 --- a/graphrag/config/input_models/llm_config_input.py +++ b/graphrag/config/input_models/llm_config_input.py @@ -6,8 +6,10 @@ from datashaper import AsyncType from typing_extensions import NotRequired, TypedDict -from .llm_parameters_input import LLMParametersInput -from .parallelization_parameters_input import ParallelizationParametersInput +from graphrag.config.input_models.llm_parameters_input import LLMParametersInput +from graphrag.config.input_models.parallelization_parameters_input import ( + ParallelizationParametersInput, +) class LLMConfigInput(TypedDict): diff --git a/graphrag/config/input_models/summarize_descriptions_config_input.py b/graphrag/config/input_models/summarize_descriptions_config_input.py index 6ce756e558..b71a465aef 100644 --- a/graphrag/config/input_models/summarize_descriptions_config_input.py +++ b/graphrag/config/input_models/summarize_descriptions_config_input.py @@ -5,7 +5,7 @@ from typing_extensions import NotRequired -from .llm_config_input import LLMConfigInput +from graphrag.config.input_models.llm_config_input import LLMConfigInput class SummarizeDescriptionsConfigInput(LLMConfigInput): diff --git a/graphrag/config/input_models/text_embedding_config_input.py b/graphrag/config/input_models/text_embedding_config_input.py index a7e176c658..de72612e34 100644 --- a/graphrag/config/input_models/text_embedding_config_input.py +++ b/graphrag/config/input_models/text_embedding_config_input.py @@ -8,8 +8,7 @@ from graphrag.config.enums import ( TextEmbeddingTarget, ) - -from .llm_config_input import LLMConfigInput +from graphrag.config.input_models.llm_config_input import LLMConfigInput class TextEmbeddingConfigInput(LLMConfigInput): diff --git a/graphrag/config/load_config.py b/graphrag/config/load_config.py index c4133a7196..63c2c6967b 100644 --- a/graphrag/config/load_config.py +++ b/graphrag/config/load_config.py @@ -5,9 +5,12 @@ from pathlib import Path -from .config_file_loader import load_config_from_file, search_for_config_in_root_dir -from .create_graphrag_config import create_graphrag_config -from .models.graph_rag_config import GraphRagConfig +from graphrag.config.config_file_loader import ( + load_config_from_file, + search_for_config_in_root_dir, +) +from graphrag.config.create_graphrag_config import create_graphrag_config +from graphrag.config.models.graph_rag_config import GraphRagConfig def load_config( diff --git a/graphrag/config/logging.py b/graphrag/config/logging.py index 99ee459a27..3c626b625c 100644 --- a/graphrag/config/logging.py +++ b/graphrag/config/logging.py @@ -6,8 +6,8 @@ import logging from pathlib import Path -from .enums import ReportingType -from .models.graph_rag_config import GraphRagConfig +from graphrag.config.enums import ReportingType +from graphrag.config.models.graph_rag_config import GraphRagConfig def enable_logging(log_filepath: str | Path, verbose: bool = False) -> None: diff --git a/graphrag/config/models/__init__.py b/graphrag/config/models/__init__.py index 68691cc6ee..6c5862a947 100644 --- a/graphrag/config/models/__init__.py +++ b/graphrag/config/models/__init__.py @@ -2,49 +2,3 @@ # Licensed under the MIT License """Interfaces for Default Config parameterization.""" - -from .cache_config import CacheConfig -from .chunking_config import ChunkingConfig -from .claim_extraction_config import ClaimExtractionConfig -from .cluster_graph_config import ClusterGraphConfig -from .community_reports_config import CommunityReportsConfig -from .drift_config import DRIFTSearchConfig -from .embed_graph_config import EmbedGraphConfig -from .entity_extraction_config import EntityExtractionConfig -from .global_search_config import GlobalSearchConfig -from .graph_rag_config import GraphRagConfig -from .input_config import InputConfig -from .llm_config import LLMConfig -from .llm_parameters import LLMParameters -from .local_search_config import LocalSearchConfig -from .parallelization_parameters import ParallelizationParameters -from .reporting_config import ReportingConfig -from .snapshots_config import SnapshotsConfig -from .storage_config import StorageConfig -from .summarize_descriptions_config import SummarizeDescriptionsConfig -from .text_embedding_config import TextEmbeddingConfig -from .umap_config import UmapConfig - -__all__ = [ - "CacheConfig", - "ChunkingConfig", - "ClaimExtractionConfig", - "ClusterGraphConfig", - "CommunityReportsConfig", - "DRIFTSearchConfig", - "EmbedGraphConfig", - "EntityExtractionConfig", - "GlobalSearchConfig", - "GraphRagConfig", - "InputConfig", - "LLMConfig", - "LLMParameters", - "LocalSearchConfig", - "ParallelizationParameters", - "ReportingConfig", - "SnapshotsConfig", - "StorageConfig", - "SummarizeDescriptionsConfig", - "TextEmbeddingConfig", - "UmapConfig", -] diff --git a/graphrag/config/models/claim_extraction_config.py b/graphrag/config/models/claim_extraction_config.py index 6a4de8e3c6..716f64480e 100644 --- a/graphrag/config/models/claim_extraction_config.py +++ b/graphrag/config/models/claim_extraction_config.py @@ -8,8 +8,7 @@ from pydantic import Field import graphrag.config.defaults as defs - -from .llm_config import LLMConfig +from graphrag.config.models.llm_config import LLMConfig class ClaimExtractionConfig(LLMConfig): diff --git a/graphrag/config/models/community_reports_config.py b/graphrag/config/models/community_reports_config.py index 0eafa81c29..104c77eca6 100644 --- a/graphrag/config/models/community_reports_config.py +++ b/graphrag/config/models/community_reports_config.py @@ -8,8 +8,7 @@ from pydantic import Field import graphrag.config.defaults as defs - -from .llm_config import LLMConfig +from graphrag.config.models.llm_config import LLMConfig class CommunityReportsConfig(LLMConfig): diff --git a/graphrag/config/models/drift_config.py b/graphrag/config/models/drift_search_config.py similarity index 100% rename from graphrag/config/models/drift_config.py rename to graphrag/config/models/drift_search_config.py diff --git a/graphrag/config/models/entity_extraction_config.py b/graphrag/config/models/entity_extraction_config.py index 08055d510b..40f155d0e4 100644 --- a/graphrag/config/models/entity_extraction_config.py +++ b/graphrag/config/models/entity_extraction_config.py @@ -8,8 +8,7 @@ from pydantic import Field import graphrag.config.defaults as defs - -from .llm_config import LLMConfig +from graphrag.config.models.llm_config import LLMConfig class EntityExtractionConfig(LLMConfig): diff --git a/graphrag/config/models/graph_rag_config.py b/graphrag/config/models/graph_rag_config.py index 35912e12f5..3dc5f71d82 100644 --- a/graphrag/config/models/graph_rag_config.py +++ b/graphrag/config/models/graph_rag_config.py @@ -7,27 +7,26 @@ from pydantic import Field import graphrag.config.defaults as defs - -from .cache_config import CacheConfig -from .chunking_config import ChunkingConfig -from .claim_extraction_config import ClaimExtractionConfig -from .cluster_graph_config import ClusterGraphConfig -from .community_reports_config import CommunityReportsConfig -from .drift_config import DRIFTSearchConfig -from .embed_graph_config import EmbedGraphConfig -from .entity_extraction_config import EntityExtractionConfig -from .global_search_config import GlobalSearchConfig -from .input_config import InputConfig -from .llm_config import LLMConfig -from .local_search_config import LocalSearchConfig -from .reporting_config import ReportingConfig -from .snapshots_config import SnapshotsConfig -from .storage_config import StorageConfig -from .summarize_descriptions_config import ( +from graphrag.config.models.cache_config import CacheConfig +from graphrag.config.models.chunking_config import ChunkingConfig +from graphrag.config.models.claim_extraction_config import ClaimExtractionConfig +from graphrag.config.models.cluster_graph_config import ClusterGraphConfig +from graphrag.config.models.community_reports_config import CommunityReportsConfig +from graphrag.config.models.drift_search_config import DRIFTSearchConfig +from graphrag.config.models.embed_graph_config import EmbedGraphConfig +from graphrag.config.models.entity_extraction_config import EntityExtractionConfig +from graphrag.config.models.global_search_config import GlobalSearchConfig +from graphrag.config.models.input_config import InputConfig +from graphrag.config.models.llm_config import LLMConfig +from graphrag.config.models.local_search_config import LocalSearchConfig +from graphrag.config.models.reporting_config import ReportingConfig +from graphrag.config.models.snapshots_config import SnapshotsConfig +from graphrag.config.models.storage_config import StorageConfig +from graphrag.config.models.summarize_descriptions_config import ( SummarizeDescriptionsConfig, ) -from .text_embedding_config import TextEmbeddingConfig -from .umap_config import UmapConfig +from graphrag.config.models.text_embedding_config import TextEmbeddingConfig +from graphrag.config.models.umap_config import UmapConfig class GraphRagConfig(LLMConfig): diff --git a/graphrag/config/models/llm_config.py b/graphrag/config/models/llm_config.py index 62c193b0c5..3759bd949e 100644 --- a/graphrag/config/models/llm_config.py +++ b/graphrag/config/models/llm_config.py @@ -7,9 +7,8 @@ from pydantic import BaseModel, Field import graphrag.config.defaults as defs - -from .llm_parameters import LLMParameters -from .parallelization_parameters import ParallelizationParameters +from graphrag.config.models.llm_parameters import LLMParameters +from graphrag.config.models.parallelization_parameters import ParallelizationParameters class LLMConfig(BaseModel): diff --git a/graphrag/config/models/summarize_descriptions_config.py b/graphrag/config/models/summarize_descriptions_config.py index 9104a60ac2..c1acb9b381 100644 --- a/graphrag/config/models/summarize_descriptions_config.py +++ b/graphrag/config/models/summarize_descriptions_config.py @@ -8,8 +8,7 @@ from pydantic import Field import graphrag.config.defaults as defs - -from .llm_config import LLMConfig +from graphrag.config.models.llm_config import LLMConfig class SummarizeDescriptionsConfig(LLMConfig): diff --git a/graphrag/config/models/text_embedding_config.py b/graphrag/config/models/text_embedding_config.py index 815263bbcf..1fde9a41dd 100644 --- a/graphrag/config/models/text_embedding_config.py +++ b/graphrag/config/models/text_embedding_config.py @@ -7,8 +7,7 @@ import graphrag.config.defaults as defs from graphrag.config.enums import TextEmbeddingTarget - -from .llm_config import LLMConfig +from graphrag.config.models.llm_config import LLMConfig class TextEmbeddingConfig(LLMConfig): diff --git a/graphrag/config/resolve_path.py b/graphrag/config/resolve_path.py index 7ff60c4562..237c7f7edb 100644 --- a/graphrag/config/resolve_path.py +++ b/graphrag/config/resolve_path.py @@ -7,8 +7,8 @@ from pathlib import Path from string import Template -from .enums import ReportingType, StorageType -from .models.graph_rag_config import GraphRagConfig +from graphrag.config.enums import ReportingType, StorageType +from graphrag.config.models.graph_rag_config import GraphRagConfig def _resolve_timestamp_path_with_value(path: str | Path, timestamp_value: str) -> Path: diff --git a/graphrag/index/__init__.py b/graphrag/index/__init__.py index c97c290a94..c5acc43b65 100644 --- a/graphrag/index/__init__.py +++ b/graphrag/index/__init__.py @@ -1,78 +1,4 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""The Indexing Engine package root.""" - -from .cache import PipelineCache -from .config import ( - PipelineBlobCacheConfig, - PipelineBlobReportingConfig, - PipelineBlobStorageConfig, - PipelineCacheConfig, - PipelineCacheConfigTypes, - PipelineConfig, - PipelineConsoleReportingConfig, - PipelineCSVInputConfig, - PipelineFileCacheConfig, - PipelineFileReportingConfig, - PipelineFileStorageConfig, - PipelineInputConfig, - PipelineInputConfigTypes, - PipelineMemoryCacheConfig, - PipelineMemoryStorageConfig, - PipelineNoneCacheConfig, - PipelineReportingConfig, - PipelineReportingConfigTypes, - PipelineStorageConfig, - PipelineStorageConfigTypes, - PipelineTextInputConfig, - PipelineWorkflowConfig, - PipelineWorkflowReference, - PipelineWorkflowStep, -) -from .create_pipeline_config import create_pipeline_config -from .errors import ( - NoWorkflowsDefinedError, - UndefinedWorkflowError, - UnknownWorkflowError, -) -from .load_pipeline_config import load_pipeline_config -from .run import run_pipeline, run_pipeline_with_config -from .storage import PipelineStorage - -__all__ = [ - "NoWorkflowsDefinedError", - "PipelineBlobCacheConfig", - "PipelineBlobCacheConfig", - "PipelineBlobReportingConfig", - "PipelineBlobStorageConfig", - "PipelineCSVInputConfig", - "PipelineCache", - "PipelineCacheConfig", - "PipelineCacheConfigTypes", - "PipelineConfig", - "PipelineConsoleReportingConfig", - "PipelineFileCacheConfig", - "PipelineFileReportingConfig", - "PipelineFileStorageConfig", - "PipelineInputConfig", - "PipelineInputConfigTypes", - "PipelineMemoryCacheConfig", - "PipelineMemoryStorageConfig", - "PipelineNoneCacheConfig", - "PipelineReportingConfig", - "PipelineReportingConfigTypes", - "PipelineStorage", - "PipelineStorageConfig", - "PipelineStorageConfigTypes", - "PipelineTextInputConfig", - "PipelineWorkflowConfig", - "PipelineWorkflowReference", - "PipelineWorkflowStep", - "UndefinedWorkflowError", - "UnknownWorkflowError", - "create_pipeline_config", - "load_pipeline_config", - "run_pipeline", - "run_pipeline_with_config", -] +"""The indexing engine package root.""" diff --git a/graphrag/index/cache/__init__.py b/graphrag/index/cache/__init__.py index 42ebb22994..ece87659fd 100644 --- a/graphrag/index/cache/__init__.py +++ b/graphrag/index/cache/__init__.py @@ -2,17 +2,3 @@ # Licensed under the MIT License """The Indexing Engine cache package root.""" - -from .json_pipeline_cache import JsonPipelineCache -from .load_cache import load_cache -from .memory_pipeline_cache import InMemoryCache -from .noop_pipeline_cache import NoopPipelineCache -from .pipeline_cache import PipelineCache - -__all__ = [ - "InMemoryCache", - "JsonPipelineCache", - "NoopPipelineCache", - "PipelineCache", - "load_cache", -] diff --git a/graphrag/index/cache/json_pipeline_cache.py b/graphrag/index/cache/json_pipeline_cache.py index b9e85889ad..13d5212394 100644 --- a/graphrag/index/cache/json_pipeline_cache.py +++ b/graphrag/index/cache/json_pipeline_cache.py @@ -6,9 +6,8 @@ import json from typing import Any -from graphrag.index.storage import PipelineStorage - -from .pipeline_cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.storage.pipeline_storage import PipelineStorage class JsonPipelineCache(PipelineCache): diff --git a/graphrag/index/cache/load_cache.py b/graphrag/index/cache/load_cache.py index 13f0d8eecf..488f8f6d69 100644 --- a/graphrag/index/cache/load_cache.py +++ b/graphrag/index/cache/load_cache.py @@ -13,20 +13,18 @@ PipelineCosmosDBCacheConfig, PipelineFileCacheConfig, ) -from graphrag.index.storage import ( - BlobPipelineStorage, - FilePipelineStorage, - create_cosmosdb_storage, -) +from graphrag.index.storage.blob_pipeline_storage import BlobPipelineStorage +from graphrag.index.storage.cosmosdb_pipeline_storage import create_cosmosdb_storage +from graphrag.index.storage.file_pipeline_storage import FilePipelineStorage if TYPE_CHECKING: - from graphrag.index.config import ( + from graphrag.index.config.cache import ( PipelineCacheConfig, ) -from .json_pipeline_cache import JsonPipelineCache -from .memory_pipeline_cache import create_memory_cache -from .noop_pipeline_cache import NoopPipelineCache +from graphrag.index.cache.json_pipeline_cache import JsonPipelineCache +from graphrag.index.cache.memory_pipeline_cache import create_memory_cache +from graphrag.index.cache.noop_pipeline_cache import NoopPipelineCache def load_cache(config: PipelineCacheConfig | None, root_dir: str | None): diff --git a/graphrag/index/cache/memory_pipeline_cache.py b/graphrag/index/cache/memory_pipeline_cache.py index fa42f3f921..2a9e19c9c0 100644 --- a/graphrag/index/cache/memory_pipeline_cache.py +++ b/graphrag/index/cache/memory_pipeline_cache.py @@ -5,7 +5,7 @@ from typing import Any -from .pipeline_cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache class InMemoryCache(PipelineCache): diff --git a/graphrag/index/cache/noop_pipeline_cache.py b/graphrag/index/cache/noop_pipeline_cache.py index b7c3e60fdd..738787ad35 100644 --- a/graphrag/index/cache/noop_pipeline_cache.py +++ b/graphrag/index/cache/noop_pipeline_cache.py @@ -5,7 +5,7 @@ from typing import Any -from .pipeline_cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache class NoopPipelineCache(PipelineCache): diff --git a/graphrag/index/config/__init__.py b/graphrag/index/config/__init__.py index 847659cd24..7a8b16c91d 100644 --- a/graphrag/index/config/__init__.py +++ b/graphrag/index/config/__init__.py @@ -2,90 +2,3 @@ # Licensed under the MIT License """The Indexing Engine config typing package root.""" - -from .cache import ( - PipelineBlobCacheConfig, - PipelineCacheConfig, - PipelineCacheConfigTypes, - PipelineFileCacheConfig, - PipelineMemoryCacheConfig, - PipelineNoneCacheConfig, -) -from .embeddings import ( - all_embeddings, - community_full_content_embedding, - community_summary_embedding, - community_title_embedding, - document_text_embedding, - entity_description_embedding, - entity_title_embedding, - relationship_description_embedding, - required_embeddings, - text_unit_text_embedding, -) -from .input import ( - PipelineCSVInputConfig, - PipelineInputConfig, - PipelineInputConfigTypes, - PipelineTextInputConfig, -) -from .pipeline import PipelineConfig -from .reporting import ( - PipelineBlobReportingConfig, - PipelineConsoleReportingConfig, - PipelineFileReportingConfig, - PipelineReportingConfig, - PipelineReportingConfigTypes, -) -from .storage import ( - PipelineBlobStorageConfig, - PipelineFileStorageConfig, - PipelineMemoryStorageConfig, - PipelineStorageConfig, - PipelineStorageConfigTypes, -) -from .workflow import ( - PipelineWorkflowConfig, - PipelineWorkflowReference, - PipelineWorkflowStep, -) - -__all__ = [ - "PipelineBlobCacheConfig", - "PipelineBlobReportingConfig", - "PipelineBlobStorageConfig", - "PipelineCSVInputConfig", - "PipelineCacheConfig", - "PipelineCacheConfigTypes", - "PipelineCacheConfigTypes", - "PipelineCacheConfigTypes", - "PipelineConfig", - "PipelineConsoleReportingConfig", - "PipelineFileCacheConfig", - "PipelineFileReportingConfig", - "PipelineFileStorageConfig", - "PipelineInputConfig", - "PipelineInputConfigTypes", - "PipelineMemoryCacheConfig", - "PipelineMemoryCacheConfig", - "PipelineMemoryStorageConfig", - "PipelineNoneCacheConfig", - "PipelineReportingConfig", - "PipelineReportingConfigTypes", - "PipelineStorageConfig", - "PipelineStorageConfigTypes", - "PipelineTextInputConfig", - "PipelineWorkflowConfig", - "PipelineWorkflowReference", - "PipelineWorkflowStep", - "all_embeddings", - "community_full_content_embedding", - "community_summary_embedding", - "community_title_embedding", - "document_text_embedding", - "entity_description_embedding", - "entity_title_embedding", - "relationship_description_embedding", - "required_embeddings", - "text_unit_text_embedding", -] diff --git a/graphrag/index/config/input.py b/graphrag/index/config/input.py index 35db357599..b3e4e89e8b 100644 --- a/graphrag/index/config/input.py +++ b/graphrag/index/config/input.py @@ -11,8 +11,7 @@ from pydantic import Field as pydantic_Field from graphrag.config.enums import InputFileType, InputType - -from .workflow import PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowStep T = TypeVar("T") diff --git a/graphrag/index/config/pipeline.py b/graphrag/index/config/pipeline.py index 7fa68c7aae..8ee420cc28 100644 --- a/graphrag/index/config/pipeline.py +++ b/graphrag/index/config/pipeline.py @@ -9,11 +9,11 @@ from pydantic import BaseModel from pydantic import Field as pydantic_Field -from .cache import PipelineCacheConfigTypes -from .input import PipelineInputConfigTypes -from .reporting import PipelineReportingConfigTypes -from .storage import PipelineStorageConfigTypes -from .workflow import PipelineWorkflowReference +from graphrag.index.config.cache import PipelineCacheConfigTypes +from graphrag.index.config.input import PipelineInputConfigTypes +from graphrag.index.config.reporting import PipelineReportingConfigTypes +from graphrag.index.config.storage import PipelineStorageConfigTypes +from graphrag.index.config.workflow import PipelineWorkflowReference class PipelineConfig(BaseModel): diff --git a/graphrag/index/context.py b/graphrag/index/context.py index 94934e4909..fa4c9b2728 100644 --- a/graphrag/index/context.py +++ b/graphrag/index/context.py @@ -7,8 +7,8 @@ from dataclasses import dataclass as dc_dataclass from dataclasses import field -from .cache import PipelineCache -from .storage.pipeline_storage import PipelineStorage +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.storage.pipeline_storage import PipelineStorage @dc_dataclass diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 6d06536337..1cf605748c 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -14,7 +14,9 @@ StorageType, TextEmbeddingTarget, ) -from graphrag.config.models import GraphRagConfig, StorageConfig, TextEmbeddingConfig +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.config.models.storage_config import StorageConfig +from graphrag.config.models.text_embedding_config import TextEmbeddingConfig from graphrag.index.config.cache import ( PipelineBlobCacheConfig, PipelineCacheConfigTypes, diff --git a/graphrag/index/emit/__init__.py b/graphrag/index/emit/__init__.py index 354989e338..7ae6eea9f1 100644 --- a/graphrag/index/emit/__init__.py +++ b/graphrag/index/emit/__init__.py @@ -2,20 +2,3 @@ # Licensed under the MIT License """Definitions for emitting pipeline artifacts to storage.""" - -from .csv_table_emitter import CSVTableEmitter -from .factories import create_table_emitter, create_table_emitters -from .json_table_emitter import JsonTableEmitter -from .parquet_table_emitter import ParquetTableEmitter -from .table_emitter import TableEmitter -from .types import TableEmitterType - -__all__ = [ - "CSVTableEmitter", - "JsonTableEmitter", - "ParquetTableEmitter", - "TableEmitter", - "TableEmitterType", - "create_table_emitter", - "create_table_emitters", -] diff --git a/graphrag/index/emit/csv_table_emitter.py b/graphrag/index/emit/csv_table_emitter.py index aa27e0e3c5..4b31e1e4d7 100644 --- a/graphrag/index/emit/csv_table_emitter.py +++ b/graphrag/index/emit/csv_table_emitter.py @@ -7,9 +7,8 @@ import pandas as pd -from graphrag.index.storage import PipelineStorage - -from .table_emitter import TableEmitter +from graphrag.index.emit.table_emitter import TableEmitter +from graphrag.index.storage.pipeline_storage import PipelineStorage log = logging.getLogger(__name__) diff --git a/graphrag/index/emit/factories.py b/graphrag/index/emit/factories.py index 84afa68443..9a83e7185b 100644 --- a/graphrag/index/emit/factories.py +++ b/graphrag/index/emit/factories.py @@ -3,15 +3,14 @@ """Table Emitter Factories.""" -from graphrag.index.storage import PipelineStorage +from graphrag.index.emit.csv_table_emitter import CSVTableEmitter +from graphrag.index.emit.json_table_emitter import JsonTableEmitter +from graphrag.index.emit.parquet_table_emitter import ParquetTableEmitter +from graphrag.index.emit.table_emitter import TableEmitter +from graphrag.index.emit.types import TableEmitterType +from graphrag.index.storage.pipeline_storage import PipelineStorage from graphrag.index.typing import ErrorHandlerFn -from .csv_table_emitter import CSVTableEmitter -from .json_table_emitter import JsonTableEmitter -from .parquet_table_emitter import ParquetTableEmitter -from .table_emitter import TableEmitter -from .types import TableEmitterType - def create_table_emitter( emitter_type: TableEmitterType, storage: PipelineStorage, on_error: ErrorHandlerFn diff --git a/graphrag/index/emit/json_table_emitter.py b/graphrag/index/emit/json_table_emitter.py index 21c0713bab..b80709610b 100644 --- a/graphrag/index/emit/json_table_emitter.py +++ b/graphrag/index/emit/json_table_emitter.py @@ -7,9 +7,8 @@ import pandas as pd -from graphrag.index.storage import PipelineStorage - -from .table_emitter import TableEmitter +from graphrag.index.emit.table_emitter import TableEmitter +from graphrag.index.storage.pipeline_storage import PipelineStorage log = logging.getLogger(__name__) diff --git a/graphrag/index/emit/parquet_table_emitter.py b/graphrag/index/emit/parquet_table_emitter.py index 9d079a2870..1ba61713c0 100644 --- a/graphrag/index/emit/parquet_table_emitter.py +++ b/graphrag/index/emit/parquet_table_emitter.py @@ -9,11 +9,10 @@ import pandas as pd from pyarrow.lib import ArrowInvalid, ArrowTypeError -from graphrag.index.storage import PipelineStorage +from graphrag.index.emit.table_emitter import TableEmitter +from graphrag.index.storage.pipeline_storage import PipelineStorage from graphrag.index.typing import ErrorHandlerFn -from .table_emitter import TableEmitter - log = logging.getLogger(__name__) diff --git a/graphrag/index/flows/create_base_entity_graph.py b/graphrag/index/flows/create_base_entity_graph.py index bded3ca6fb..fe429d336b 100644 --- a/graphrag/index/flows/create_base_entity_graph.py +++ b/graphrag/index/flows/create_base_entity_graph.py @@ -11,7 +11,7 @@ VerbCallbacks, ) -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.operations.cluster_graph import cluster_graph from graphrag.index.operations.embed_graph import embed_graph from graphrag.index.operations.extract_entities import extract_entities @@ -22,7 +22,7 @@ from graphrag.index.operations.summarize_descriptions import ( summarize_descriptions, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage async def create_base_entity_graph( diff --git a/graphrag/index/flows/create_base_text_units.py b/graphrag/index/flows/create_base_text_units.py index 51a9dba643..cca55d3a17 100644 --- a/graphrag/index/flows/create_base_text_units.py +++ b/graphrag/index/flows/create_base_text_units.py @@ -16,8 +16,8 @@ from graphrag.index.operations.chunk_text import chunk_text from graphrag.index.operations.snapshot import snapshot -from graphrag.index.storage import PipelineStorage -from graphrag.index.utils import gen_md5_hash +from graphrag.index.storage.pipeline_storage import PipelineStorage +from graphrag.index.utils.hashing import gen_md5_hash async def create_base_text_units( diff --git a/graphrag/index/flows/create_final_community_reports.py b/graphrag/index/flows/create_final_community_reports.py index 001844b5b0..754d66d6e5 100644 --- a/graphrag/index/flows/create_final_community_reports.py +++ b/graphrag/index/flows/create_final_community_reports.py @@ -11,7 +11,7 @@ VerbCallbacks, ) -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.graph.extractors.community_reports.schemas import ( CLAIM_DESCRIPTION, CLAIM_DETAILS, diff --git a/graphrag/index/flows/create_final_covariates.py b/graphrag/index/flows/create_final_covariates.py index e04e7fe926..ad25445bf7 100644 --- a/graphrag/index/flows/create_final_covariates.py +++ b/graphrag/index/flows/create_final_covariates.py @@ -12,7 +12,7 @@ VerbCallbacks, ) -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.operations.extract_covariates import ( extract_covariates, ) diff --git a/graphrag/index/flows/create_final_nodes.py b/graphrag/index/flows/create_final_nodes.py index d2adcb34c8..c966e673ed 100644 --- a/graphrag/index/flows/create_final_nodes.py +++ b/graphrag/index/flows/create_final_nodes.py @@ -13,7 +13,7 @@ from graphrag.index.operations.layout_graph import layout_graph from graphrag.index.operations.snapshot import snapshot from graphrag.index.operations.unpack_graph import unpack_graph -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage async def create_final_nodes( diff --git a/graphrag/index/flows/generate_text_embeddings.py b/graphrag/index/flows/generate_text_embeddings.py index 258d01c768..23fee842df 100644 --- a/graphrag/index/flows/generate_text_embeddings.py +++ b/graphrag/index/flows/generate_text_embeddings.py @@ -10,7 +10,7 @@ VerbCallbacks, ) -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.config.embeddings import ( community_full_content_embedding, community_summary_embedding, @@ -23,7 +23,7 @@ ) from graphrag.index.operations.embed_text import embed_text from graphrag.index.operations.snapshot import snapshot -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage log = logging.getLogger(__name__) diff --git a/graphrag/index/graph/embedding/__init__.py b/graphrag/index/graph/embedding/__init__.py index 0ea2d085f1..ff075875a5 100644 --- a/graphrag/index/graph/embedding/__init__.py +++ b/graphrag/index/graph/embedding/__init__.py @@ -3,6 +3,6 @@ """The Indexing Engine graph embedding package root.""" -from .embedding import NodeEmbeddings, embed_nod2vec +from graphrag.index.graph.embedding.embedding import NodeEmbeddings, embed_nod2vec __all__ = ["NodeEmbeddings", "embed_nod2vec"] diff --git a/graphrag/index/graph/embedding/embedding.py b/graphrag/index/graph/embedding/embedding.py index 267a190f91..ff6f86e72a 100644 --- a/graphrag/index/graph/embedding/embedding.py +++ b/graphrag/index/graph/embedding/embedding.py @@ -5,7 +5,6 @@ from dataclasses import dataclass -import graspologic as gc import networkx as nx import numpy as np @@ -28,6 +27,9 @@ def embed_nod2vec( random_seed: int = 86, ) -> NodeEmbeddings: """Generate node embeddings using Node2Vec.""" + # NOTE: This import is done here to reduce the initial import time of the graphrag package + import graspologic as gc + # generate embedding lcc_tensors = gc.embed.node2vec_embed( # type: ignore graph=graph, diff --git a/graphrag/index/graph/extractors/__init__.py b/graphrag/index/graph/extractors/__init__.py index 511695aea6..42ad16b89c 100644 --- a/graphrag/index/graph/extractors/__init__.py +++ b/graphrag/index/graph/extractors/__init__.py @@ -3,11 +3,11 @@ """The Indexing Engine graph extractors package root.""" -from .claims import ClaimExtractor -from .community_reports import ( +from graphrag.index.graph.extractors.claims import ClaimExtractor +from graphrag.index.graph.extractors.community_reports import ( CommunityReportsExtractor, ) -from .graph import GraphExtractionResult, GraphExtractor +from graphrag.index.graph.extractors.graph import GraphExtractionResult, GraphExtractor __all__ = [ "ClaimExtractor", diff --git a/graphrag/index/graph/extractors/claims/__init__.py b/graphrag/index/graph/extractors/claims/__init__.py index 3a5a22fdb1..897cdd1125 100644 --- a/graphrag/index/graph/extractors/claims/__init__.py +++ b/graphrag/index/graph/extractors/claims/__init__.py @@ -3,6 +3,6 @@ """The Indexing Engine graph extractors claims package root.""" -from .claim_extractor import ClaimExtractor +from graphrag.index.graph.extractors.claims.claim_extractor import ClaimExtractor __all__ = ["ClaimExtractor"] diff --git a/graphrag/index/graph/extractors/community_reports/__init__.py b/graphrag/index/graph/extractors/community_reports/__init__.py index da3bf8396a..bac91674c2 100644 --- a/graphrag/index/graph/extractors/community_reports/__init__.py +++ b/graphrag/index/graph/extractors/community_reports/__init__.py @@ -4,12 +4,17 @@ """The Indexing Engine community reports package root.""" import graphrag.index.graph.extractors.community_reports.schemas as schemas - -from .build_mixed_context import build_mixed_context -from .community_reports_extractor import CommunityReportsExtractor -from .prep_community_report_context import prep_community_report_context -from .sort_context import sort_context -from .utils import ( +from graphrag.index.graph.extractors.community_reports.build_mixed_context import ( + build_mixed_context, +) +from graphrag.index.graph.extractors.community_reports.community_reports_extractor import ( + CommunityReportsExtractor, +) +from graphrag.index.graph.extractors.community_reports.prep_community_report_context import ( + prep_community_report_context, +) +from graphrag.index.graph.extractors.community_reports.sort_context import sort_context +from graphrag.index.graph.extractors.community_reports.utils import ( filter_claims_to_nodes, filter_edges_to_nodes, filter_nodes_to_level, diff --git a/graphrag/index/graph/extractors/community_reports/build_mixed_context.py b/graphrag/index/graph/extractors/community_reports/build_mixed_context.py index ad9e2a8447..ca10ca948d 100644 --- a/graphrag/index/graph/extractors/community_reports/build_mixed_context.py +++ b/graphrag/index/graph/extractors/community_reports/build_mixed_context.py @@ -5,10 +5,9 @@ import pandas as pd import graphrag.index.graph.extractors.community_reports.schemas as schemas +from graphrag.index.graph.extractors.community_reports.sort_context import sort_context from graphrag.query.llm.text_utils import num_tokens -from .sort_context import sort_context - def build_mixed_context(context: list[dict], max_tokens: int) -> str: """ diff --git a/graphrag/index/graph/extractors/community_reports/community_reports_extractor.py b/graphrag/index/graph/extractors/community_reports/community_reports_extractor.py index 291e61af69..a78064bd9b 100644 --- a/graphrag/index/graph/extractors/community_reports/community_reports_extractor.py +++ b/graphrag/index/graph/extractors/community_reports/community_reports_extractor.py @@ -9,7 +9,7 @@ from typing import Any from graphrag.index.typing import ErrorHandlerFn -from graphrag.index.utils import dict_has_keys_with_types +from graphrag.index.utils.dicts import dict_has_keys_with_types from graphrag.llm import CompletionLLM from graphrag.prompts.index.community_report import COMMUNITY_REPORT_PROMPT diff --git a/graphrag/index/graph/extractors/community_reports/prep_community_report_context.py b/graphrag/index/graph/extractors/community_reports/prep_community_report_context.py index 72cdac9b4e..a4df7d533a 100644 --- a/graphrag/index/graph/extractors/community_reports/prep_community_report_context.py +++ b/graphrag/index/graph/extractors/community_reports/prep_community_report_context.py @@ -9,6 +9,11 @@ import pandas as pd import graphrag.index.graph.extractors.community_reports.schemas as schemas +from graphrag.index.graph.extractors.community_reports.build_mixed_context import ( + build_mixed_context, +) +from graphrag.index.graph.extractors.community_reports.sort_context import sort_context +from graphrag.index.graph.extractors.community_reports.utils import set_context_size from graphrag.index.utils.dataframes import ( antijoin, drop_columns, @@ -19,10 +24,6 @@ where_column_equals, ) -from .build_mixed_context import build_mixed_context -from .sort_context import sort_context -from .utils import set_context_size - log = logging.getLogger(__name__) diff --git a/graphrag/index/graph/extractors/graph/__init__.py b/graphrag/index/graph/extractors/graph/__init__.py index 7f8d19c9ca..c3f14bfa2f 100644 --- a/graphrag/index/graph/extractors/graph/__init__.py +++ b/graphrag/index/graph/extractors/graph/__init__.py @@ -3,7 +3,7 @@ """The Indexing Engine unipartite graph package root.""" -from .graph_extractor import ( +from graphrag.index.graph.extractors.graph.graph_extractor import ( DEFAULT_ENTITY_TYPES, GraphExtractionResult, GraphExtractor, diff --git a/graphrag/index/graph/extractors/graph/graph_extractor.py b/graphrag/index/graph/extractors/graph/graph_extractor.py index b669cfa004..7374e77c24 100644 --- a/graphrag/index/graph/extractors/graph/graph_extractor.py +++ b/graphrag/index/graph/extractors/graph/graph_extractor.py @@ -15,7 +15,7 @@ import graphrag.config.defaults as defs from graphrag.index.typing import ErrorHandlerFn -from graphrag.index.utils import clean_str +from graphrag.index.utils.string import clean_str from graphrag.llm import CompletionLLM from graphrag.prompts.index.entity_extraction import ( CONTINUE_PROMPT, diff --git a/graphrag/index/graph/extractors/summarize/__init__.py b/graphrag/index/graph/extractors/summarize/__init__.py index 17fe5095aa..54661d0f1c 100644 --- a/graphrag/index/graph/extractors/summarize/__init__.py +++ b/graphrag/index/graph/extractors/summarize/__init__.py @@ -3,7 +3,7 @@ """The Indexing Engine unipartite graph package root.""" -from .description_summary_extractor import ( +from graphrag.index.graph.extractors.summarize.description_summary_extractor import ( SummarizationResult, SummarizeExtractor, ) diff --git a/graphrag/index/graph/utils/__init__.py b/graphrag/index/graph/utils/__init__.py index 6d4479283a..2f6971186d 100644 --- a/graphrag/index/graph/utils/__init__.py +++ b/graphrag/index/graph/utils/__init__.py @@ -3,7 +3,7 @@ """The Indexing Engine graph utils package root.""" -from .normalize_node_names import normalize_node_names -from .stable_lcc import stable_largest_connected_component +from graphrag.index.graph.utils.normalize_node_names import normalize_node_names +from graphrag.index.graph.utils.stable_lcc import stable_largest_connected_component __all__ = ["normalize_node_names", "stable_largest_connected_component"] diff --git a/graphrag/index/graph/utils/stable_lcc.py b/graphrag/index/graph/utils/stable_lcc.py index 7d602a6ba7..cbd5243513 100644 --- a/graphrag/index/graph/utils/stable_lcc.py +++ b/graphrag/index/graph/utils/stable_lcc.py @@ -6,13 +6,15 @@ from typing import Any, cast import networkx as nx -from graspologic.utils import largest_connected_component -from .normalize_node_names import normalize_node_names +from graphrag.index.graph.utils.normalize_node_names import normalize_node_names def stable_largest_connected_component(graph: nx.Graph) -> nx.Graph: """Return the largest connected component of the graph, with nodes and edges sorted in a stable way.""" + # NOTE: The import is done here to reduce the initial import time of the module + from graspologic.utils import largest_connected_component + graph = graph.copy() graph = cast(nx.Graph, largest_connected_component(graph)) graph = normalize_node_names(graph) diff --git a/graphrag/index/graph/visualization/__init__.py b/graphrag/index/graph/visualization/__init__.py index f7780e4e9c..090acdec32 100644 --- a/graphrag/index/graph/visualization/__init__.py +++ b/graphrag/index/graph/visualization/__init__.py @@ -3,8 +3,11 @@ """The Indexing Engine graph visualization package root.""" -from .compute_umap_positions import compute_umap_positions, get_zero_positions -from .typing import GraphLayout, NodePosition +from graphrag.index.graph.visualization.compute_umap_positions import ( + compute_umap_positions, + get_zero_positions, +) +from graphrag.index.graph.visualization.typing import GraphLayout, NodePosition __all__ = [ "GraphLayout", diff --git a/graphrag/index/graph/visualization/compute_umap_positions.py b/graphrag/index/graph/visualization/compute_umap_positions.py index 569b7b309d..36ac354b72 100644 --- a/graphrag/index/graph/visualization/compute_umap_positions.py +++ b/graphrag/index/graph/visualization/compute_umap_positions.py @@ -3,13 +3,11 @@ """A module containing compute_umap_positions and visualize_embedding method definition.""" -import graspologic as gc import matplotlib.pyplot as plt import networkx as nx import numpy as np -import umap -from .typing import NodePosition +from graphrag.index.graph.visualization.typing import NodePosition def get_zero_positions( @@ -61,6 +59,9 @@ def compute_umap_positions( random_state: int = 86, ) -> list[NodePosition]: """Project embedding vectors down to 2D/3D using UMAP.""" + # NOTE: This import is done here to reduce the initial import time of the graphrag package + import umap + embedding_positions = umap.UMAP( min_dist=min_dist, n_neighbors=n_neighbors, @@ -105,6 +106,9 @@ def visualize_embedding( umap_positions: list[dict], ): """Project embedding down to 2D using UMAP and visualize.""" + # NOTE: This import is done here to reduce the initial import time of the graphrag package + import graspologic as gc + # rendering plt.clf() figure = plt.gcf() diff --git a/graphrag/index/init_content.py b/graphrag/index/init_content.py deleted file mode 100644 index 93807672f2..0000000000 --- a/graphrag/index/init_content.py +++ /dev/null @@ -1,210 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Content for the init CLI command to generate a default configuration.""" - -import graphrag.config.defaults as defs - -INIT_YAML = f"""\ -encoding_model: cl100k_base -skip_workflows: [] -llm: - api_key: ${{GRAPHRAG_API_KEY}} - type: {defs.LLM_TYPE.value} # or azure_openai_chat - model: {defs.LLM_MODEL} - model_supports_json: true # recommended if this is available for your model. - # audience: "https://cognitiveservices.azure.com/.default" - # max_tokens: {defs.LLM_MAX_TOKENS} - # request_timeout: {defs.LLM_REQUEST_TIMEOUT} - # api_base: https://.openai.azure.com - # api_version: 2024-02-15-preview - # organization: - # deployment_name: - # tokens_per_minute: 150_000 # set a leaky bucket throttle - # requests_per_minute: 10_000 # set a leaky bucket throttle - # max_retries: {defs.LLM_MAX_RETRIES} - # max_retry_wait: {defs.LLM_MAX_RETRY_WAIT} - # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times - # concurrent_requests: {defs.LLM_CONCURRENT_REQUESTS} # the number of parallel inflight requests that may be made - # temperature: {defs.LLM_TEMPERATURE} # temperature for sampling - # top_p: {defs.LLM_TOP_P} # top-p sampling - # n: {defs.LLM_N} # Number of completions to generate - -parallelization: - stagger: {defs.PARALLELIZATION_STAGGER} - # num_threads: {defs.PARALLELIZATION_NUM_THREADS} # the number of threads to use for parallel processing - -async_mode: {defs.ASYNC_MODE.value} # or asyncio - -embeddings: - ## parallelization: override the global parallelization settings for embeddings - async_mode: {defs.ASYNC_MODE.value} # or asyncio - # target: {defs.EMBEDDING_TARGET.value} # or all - # batch_size: {defs.EMBEDDING_BATCH_SIZE} # the number of documents to send in a single request - # batch_max_tokens: {defs.EMBEDDING_BATCH_MAX_TOKENS} # the maximum number of tokens to send in a single request - vector_store:{defs.VECTOR_STORE} - # vector_store: # configuration for AI Search - # type: azure_ai_search - # url: - # api_key: # if not set, will attempt to use managed identity. Expects the `Search Index Data Contributor` RBAC role in this case. - # audience: # if using managed identity, the audience to use for the token - # overwrite: true # or false. Only applicable at index creation time - # container_name: default # A prefix for the AzureAISearch to create indexes. Default: 'default'. - llm: - api_key: ${{GRAPHRAG_API_KEY}} - type: {defs.EMBEDDING_TYPE.value} # or azure_openai_embedding - model: {defs.EMBEDDING_MODEL} - # api_base: https://.openai.azure.com - # api_version: 2024-02-15-preview - # audience: "https://cognitiveservices.azure.com/.default" - # organization: - # deployment_name: - # tokens_per_minute: 150_000 # set a leaky bucket throttle - # requests_per_minute: 10_000 # set a leaky bucket throttle - # max_retries: {defs.LLM_MAX_RETRIES} - # max_retry_wait: {defs.LLM_MAX_RETRY_WAIT} - # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times - # concurrent_requests: {defs.LLM_CONCURRENT_REQUESTS} # the number of parallel inflight requests that may be made - -chunks: - size: {defs.CHUNK_SIZE} - overlap: {defs.CHUNK_OVERLAP} - group_by_columns: [{",".join(defs.CHUNK_GROUP_BY_COLUMNS)}] # by default, we don't allow chunks to cross documents - -input: - type: {defs.INPUT_TYPE.value} # or blob - file_type: {defs.INPUT_FILE_TYPE.value} # or csv - base_dir: "{defs.INPUT_BASE_DIR}" - file_encoding: {defs.INPUT_FILE_ENCODING} - file_pattern: ".*\\\\.txt$" - -cache: - type: {defs.CACHE_TYPE.value} # or blob - base_dir: "{defs.CACHE_BASE_DIR}" - # connection_string: - # container_name: - -storage: - type: {defs.STORAGE_TYPE.value} # or blob - base_dir: "{defs.STORAGE_BASE_DIR}" - # connection_string: - # container_name: - -update_index_storage: # Storage to save an updated index (for incremental indexing). Enabling this performs an incremental index run - # type: {defs.STORAGE_TYPE.value} # or blob - # base_dir: "{defs.UPDATE_STORAGE_BASE_DIR}" - # connection_string: - # container_name: - -reporting: - type: {defs.REPORTING_TYPE.value} # or console, blob - base_dir: "{defs.REPORTING_BASE_DIR}" - # connection_string: - # container_name: - -entity_extraction: - ## strategy: fully override the entity extraction strategy. - ## type: one of graph_intelligence, graph_intelligence_json and nltk - ## llm: override the global llm settings for this task - ## parallelization: override the global parallelization settings for this task - ## async_mode: override the global async_mode settings for this task - prompt: "prompts/entity_extraction.txt" - entity_types: [{",".join(defs.ENTITY_EXTRACTION_ENTITY_TYPES)}] - max_gleanings: {defs.ENTITY_EXTRACTION_MAX_GLEANINGS} - -summarize_descriptions: - ## llm: override the global llm settings for this task - ## parallelization: override the global parallelization settings for this task - ## async_mode: override the global async_mode settings for this task - prompt: "prompts/summarize_descriptions.txt" - max_length: {defs.SUMMARIZE_DESCRIPTIONS_MAX_LENGTH} - -claim_extraction: - ## llm: override the global llm settings for this task - ## parallelization: override the global parallelization settings for this task - ## async_mode: override the global async_mode settings for this task - # enabled: true - prompt: "prompts/claim_extraction.txt" - description: "{defs.CLAIM_DESCRIPTION}" - max_gleanings: {defs.CLAIM_MAX_GLEANINGS} - -community_reports: - ## llm: override the global llm settings for this task - ## parallelization: override the global parallelization settings for this task - ## async_mode: override the global async_mode settings for this task - prompt: "prompts/community_report.txt" - max_length: {defs.COMMUNITY_REPORT_MAX_LENGTH} - max_input_length: {defs.COMMUNITY_REPORT_MAX_INPUT_LENGTH} - -cluster_graph: - max_cluster_size: {defs.MAX_CLUSTER_SIZE} - -embed_graph: - enabled: false # if true, will generate node2vec embeddings for nodes - # num_walks: {defs.NODE2VEC_NUM_WALKS} - # walk_length: {defs.NODE2VEC_WALK_LENGTH} - # window_size: {defs.NODE2VEC_WINDOW_SIZE} - # iterations: {defs.NODE2VEC_ITERATIONS} - # random_seed: {defs.NODE2VEC_RANDOM_SEED} - -umap: - enabled: false # if true, will generate UMAP embeddings for nodes - -snapshots: - graphml: false - raw_entities: false - top_level_nodes: false - embeddings: false - transient: false - -local_search: - prompt: "prompts/local_search_system_prompt.txt" - # text_unit_prop: {defs.LOCAL_SEARCH_TEXT_UNIT_PROP} - # community_prop: {defs.LOCAL_SEARCH_COMMUNITY_PROP} - # conversation_history_max_turns: {defs.LOCAL_SEARCH_CONVERSATION_HISTORY_MAX_TURNS} - # top_k_mapped_entities: {defs.LOCAL_SEARCH_TOP_K_MAPPED_ENTITIES} - # top_k_relationships: {defs.LOCAL_SEARCH_TOP_K_RELATIONSHIPS} - # llm_temperature: {defs.LOCAL_SEARCH_LLM_TEMPERATURE} # temperature for sampling - # llm_top_p: {defs.LOCAL_SEARCH_LLM_TOP_P} # top-p sampling - # llm_n: {defs.LOCAL_SEARCH_LLM_N} # Number of completions to generate - # max_tokens: {defs.LOCAL_SEARCH_MAX_TOKENS} - -global_search: - map_prompt: "prompts/global_search_map_system_prompt.txt" - reduce_prompt: "prompts/global_search_reduce_system_prompt.txt" - knowledge_prompt: "prompts/global_search_knowledge_system_prompt.txt" - # llm_temperature: {defs.GLOBAL_SEARCH_LLM_TEMPERATURE} # temperature for sampling - # llm_top_p: {defs.GLOBAL_SEARCH_LLM_TOP_P} # top-p sampling - # llm_n: {defs.GLOBAL_SEARCH_LLM_N} # Number of completions to generate - # max_tokens: {defs.GLOBAL_SEARCH_MAX_TOKENS} - # data_max_tokens: {defs.GLOBAL_SEARCH_DATA_MAX_TOKENS} - # map_max_tokens: {defs.GLOBAL_SEARCH_MAP_MAX_TOKENS} - # reduce_max_tokens: {defs.GLOBAL_SEARCH_REDUCE_MAX_TOKENS} - # concurrency: {defs.GLOBAL_SEARCH_CONCURRENCY} - -drift_search: - prompt: "prompts/drift_search_system_prompt.txt" - # temperature: {defs.DRIFT_SEARCH_LLM_TEMPERATURE} - # top_p: {defs.DRIFT_SEARCH_LLM_TOP_P} - # n: {defs.DRIFT_SEARCH_LLM_N} - # max_tokens: {defs.DRIFT_SEARCH_MAX_TOKENS} - # data_max_tokens: {defs.DRIFT_SEARCH_DATA_MAX_TOKENS} - # concurrency: {defs.DRIFT_SEARCH_CONCURRENCY} - # drift_k_followups: {defs.DRIFT_SEARCH_K_FOLLOW_UPS} - # primer_folds: {defs.DRIFT_SEARCH_PRIMER_FOLDS} - # primer_llm_max_tokens: {defs.DRIFT_SEARCH_PRIMER_MAX_TOKENS} - # n_depth: {defs.DRIFT_N_DEPTH} - # local_search_text_unit_prop: {defs.DRIFT_LOCAL_SEARCH_TEXT_UNIT_PROP} - # local_search_community_prop: {defs.DRIFT_LOCAL_SEARCH_COMMUNITY_PROP} - # local_search_top_k_mapped_entities: {defs.DRIFT_LOCAL_SEARCH_TOP_K_MAPPED_ENTITIES} - # local_search_top_k_relationships: {defs.DRIFT_LOCAL_SEARCH_TOP_K_RELATIONSHIPS} - # local_search_max_data_tokens: {defs.DRIFT_LOCAL_SEARCH_MAX_TOKENS} - # local_search_temperature: {defs.DRIFT_LOCAL_SEARCH_LLM_TEMPERATURE} - # local_search_top_p: {defs.DRIFT_LOCAL_SEARCH_LLM_TOP_P} - # local_search_n: {defs.DRIFT_LOCAL_SEARCH_LLM_N} - # local_search_llm_max_gen_tokens: {defs.DRIFT_LOCAL_SEARCH_LLM_MAX_TOKENS} -""" - -INIT_DOTENV = """\ -GRAPHRAG_API_KEY= -""" diff --git a/graphrag/index/input/__init__.py b/graphrag/index/input/__init__.py index 91421867de..15177c91db 100644 --- a/graphrag/index/input/__init__.py +++ b/graphrag/index/input/__init__.py @@ -2,7 +2,3 @@ # Licensed under the MIT License """The Indexing Engine input package root.""" - -from .load_input import load_input - -__all__ = ["load_input"] diff --git a/graphrag/index/input/csv.py b/graphrag/index/input/csv.py index 9c93fca8f4..ceec80b506 100644 --- a/graphrag/index/input/csv.py +++ b/graphrag/index/input/csv.py @@ -10,10 +10,10 @@ import pandas as pd -from graphrag.index.config import PipelineCSVInputConfig, PipelineInputConfig -from graphrag.index.storage import PipelineStorage -from graphrag.index.utils import gen_md5_hash -from graphrag.logging import ProgressReporter +from graphrag.index.config.input import PipelineCSVInputConfig, PipelineInputConfig +from graphrag.index.storage.pipeline_storage import PipelineStorage +from graphrag.index.utils.hashing import gen_md5_hash +from graphrag.logging.base import ProgressReporter log = logging.getLogger(__name__) diff --git a/graphrag/index/input/load_input.py b/graphrag/index/input/load_input.py index 100caf982a..4bfc82cbb8 100644 --- a/graphrag/index/input/load_input.py +++ b/graphrag/index/input/load_input.py @@ -10,18 +10,17 @@ import pandas as pd -from graphrag.config import InputConfig, InputType -from graphrag.index.config import PipelineInputConfig -from graphrag.index.storage import ( - BlobPipelineStorage, - FilePipelineStorage, -) -from graphrag.logging import NullProgressReporter, ProgressReporter - -from .csv import input_type as csv -from .csv import load as load_csv -from .text import input_type as text -from .text import load as load_text +from graphrag.config.enums import InputType +from graphrag.config.models.input_config import InputConfig +from graphrag.index.config.input import PipelineInputConfig +from graphrag.index.input.csv import input_type as csv +from graphrag.index.input.csv import load as load_csv +from graphrag.index.input.text import input_type as text +from graphrag.index.input.text import load as load_text +from graphrag.index.storage.blob_pipeline_storage import BlobPipelineStorage +from graphrag.index.storage.file_pipeline_storage import FilePipelineStorage +from graphrag.logging.base import ProgressReporter +from graphrag.logging.null_progress import NullProgressReporter log = logging.getLogger(__name__) loaders: dict[str, Callable[..., Awaitable[pd.DataFrame]]] = { diff --git a/graphrag/index/input/text.py b/graphrag/index/input/text.py index 7e76bfe1e7..45814ee3ff 100644 --- a/graphrag/index/input/text.py +++ b/graphrag/index/input/text.py @@ -10,10 +10,10 @@ import pandas as pd -from graphrag.index.config import PipelineInputConfig -from graphrag.index.storage import PipelineStorage -from graphrag.index.utils import gen_md5_hash -from graphrag.logging import ProgressReporter +from graphrag.index.config.input import PipelineInputConfig +from graphrag.index.storage.pipeline_storage import PipelineStorage +from graphrag.index.utils.hashing import gen_md5_hash +from graphrag.logging.base import ProgressReporter DEFAULT_FILE_PATTERN = re.compile( r".*[\\/](?P[^\\/]+)[\\/](?P\d{4})-(?P\d{2})-(?P\d{2})_(?P[^_]+)_\d+\.txt" diff --git a/graphrag/index/llm/__init__.py b/graphrag/index/llm/__init__.py index 008ef07ccd..6644fd912f 100644 --- a/graphrag/index/llm/__init__.py +++ b/graphrag/index/llm/__init__.py @@ -2,13 +2,3 @@ # Licensed under the MIT License """The Indexing Engine LLM package root.""" - -from .load_llm import load_llm, load_llm_embeddings -from .types import TextListSplitter, TextSplitter - -__all__ = [ - "TextListSplitter", - "TextSplitter", - "load_llm", - "load_llm_embeddings", -] diff --git a/graphrag/index/llm/load_llm.py b/graphrag/index/llm/load_llm.py index a7eda31a4e..f06c89ad9d 100644 --- a/graphrag/index/llm/load_llm.py +++ b/graphrag/index/llm/load_llm.py @@ -27,7 +27,7 @@ if TYPE_CHECKING: from datashaper import VerbCallbacks - from graphrag.index.cache import PipelineCache + from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.typing import ErrorHandlerFn log = logging.getLogger(__name__) diff --git a/graphrag/index/load_pipeline_config.py b/graphrag/index/load_pipeline_config.py index dfcf321b3b..77893b9535 100644 --- a/graphrag/index/load_pipeline_config.py +++ b/graphrag/index/load_pipeline_config.py @@ -9,10 +9,9 @@ import yaml from pyaml_env import parse_config as parse_config_with_env -from graphrag.config import create_graphrag_config, read_dotenv -from graphrag.index.config import PipelineConfig - -from .create_pipeline_config import create_pipeline_config +from graphrag.config.create_graphrag_config import create_graphrag_config, read_dotenv +from graphrag.index.config.pipeline import PipelineConfig +from graphrag.index.create_pipeline_config import create_pipeline_config def load_pipeline_config(config_or_path: str | PipelineConfig) -> PipelineConfig: diff --git a/graphrag/index/operations/chunk_text/__init__.py b/graphrag/index/operations/chunk_text/__init__.py index 273ff0abaf..d84b4c0c38 100644 --- a/graphrag/index/operations/chunk_text/__init__.py +++ b/graphrag/index/operations/chunk_text/__init__.py @@ -3,6 +3,10 @@ """The Indexing Engine text chunk package root.""" -from .chunk_text import ChunkStrategy, ChunkStrategyType, chunk_text +from graphrag.index.operations.chunk_text.chunk_text import ( + ChunkStrategy, + ChunkStrategyType, + chunk_text, +) __all__ = ["ChunkStrategy", "ChunkStrategyType", "chunk_text"] diff --git a/graphrag/index/operations/chunk_text/chunk_text.py b/graphrag/index/operations/chunk_text/chunk_text.py index bbcc750c59..60211ef88b 100644 --- a/graphrag/index/operations/chunk_text/chunk_text.py +++ b/graphrag/index/operations/chunk_text/chunk_text.py @@ -12,7 +12,11 @@ progress_ticker, ) -from .typing import ChunkInput, ChunkStrategy, ChunkStrategyType +from graphrag.index.operations.chunk_text.typing import ( + ChunkInput, + ChunkStrategy, + ChunkStrategyType, +) def chunk_text( @@ -117,14 +121,13 @@ def load_strategy(strategy: ChunkStrategyType) -> ChunkStrategy: """Load strategy method definition.""" match strategy: case ChunkStrategyType.tokens: - from .strategies import run_tokens + from graphrag.index.operations.chunk_text.strategies import run_tokens return run_tokens case ChunkStrategyType.sentence: # NLTK from graphrag.index.bootstrap import bootstrap - - from .strategies import run_sentences + from graphrag.index.operations.chunk_text.strategies import run_sentences bootstrap() return run_sentences diff --git a/graphrag/index/operations/chunk_text/strategies.py b/graphrag/index/operations/chunk_text/strategies.py index 7507784be3..35c32585c0 100644 --- a/graphrag/index/operations/chunk_text/strategies.py +++ b/graphrag/index/operations/chunk_text/strategies.py @@ -11,9 +11,8 @@ from datashaper import ProgressTicker import graphrag.config.defaults as defs -from graphrag.index.text_splitting import Tokenizer - -from .typing import TextChunk +from graphrag.index.operations.chunk_text.typing import TextChunk +from graphrag.index.text_splitting.text_splitting import Tokenizer def run_tokens( diff --git a/graphrag/index/operations/cluster_graph.py b/graphrag/index/operations/cluster_graph.py index b993789dcd..295c78e6fb 100644 --- a/graphrag/index/operations/cluster_graph.py +++ b/graphrag/index/operations/cluster_graph.py @@ -11,10 +11,9 @@ import networkx as nx import pandas as pd from datashaper import VerbCallbacks, progress_iterable -from graspologic.partition import hierarchical_leiden from graphrag.index.graph.utils import stable_largest_connected_component -from graphrag.index.utils import gen_uuid +from graphrag.index.utils.uuid import gen_uuid Communities = list[tuple[int, str, list[str]]] @@ -187,6 +186,9 @@ def _compute_leiden_communities( seed=0xDEADBEEF, ) -> dict[int, dict[str, int]]: """Return Leiden root communities.""" + # NOTE: This import is done here to reduce the initial import time of the graphrag package + from graspologic.partition import hierarchical_leiden + if use_lcc: graph = stable_largest_connected_component(graph) diff --git a/graphrag/index/operations/embed_graph/__init__.py b/graphrag/index/operations/embed_graph/__init__.py index a47441b425..07c91c3be8 100644 --- a/graphrag/index/operations/embed_graph/__init__.py +++ b/graphrag/index/operations/embed_graph/__init__.py @@ -3,7 +3,10 @@ """The Indexing Engine graph embed package root.""" -from .embed_graph import EmbedGraphStrategyType, embed_graph -from .typing import NodeEmbeddings +from graphrag.index.operations.embed_graph.embed_graph import ( + EmbedGraphStrategyType, + embed_graph, +) +from graphrag.index.operations.embed_graph.typing import NodeEmbeddings __all__ = ["EmbedGraphStrategyType", "NodeEmbeddings", "embed_graph"] diff --git a/graphrag/index/operations/embed_graph/embed_graph.py b/graphrag/index/operations/embed_graph/embed_graph.py index ab125a9315..d6d345a124 100644 --- a/graphrag/index/operations/embed_graph/embed_graph.py +++ b/graphrag/index/operations/embed_graph/embed_graph.py @@ -12,9 +12,8 @@ from graphrag.index.graph.embedding import embed_nod2vec from graphrag.index.graph.utils import stable_largest_connected_component -from graphrag.index.utils import load_graph - -from .typing import NodeEmbeddings +from graphrag.index.operations.embed_graph.typing import NodeEmbeddings +from graphrag.index.utils.load_graph import load_graph class EmbedGraphStrategyType(str, Enum): diff --git a/graphrag/index/operations/embed_text/__init__.py b/graphrag/index/operations/embed_text/__init__.py index 30819b9954..214f064c96 100644 --- a/graphrag/index/operations/embed_text/__init__.py +++ b/graphrag/index/operations/embed_text/__init__.py @@ -3,6 +3,9 @@ """The Indexing Engine text embed package root.""" -from .embed_text import TextEmbedStrategyType, embed_text +from graphrag.index.operations.embed_text.embed_text import ( + TextEmbedStrategyType, + embed_text, +) __all__ = ["TextEmbedStrategyType", "embed_text"] diff --git a/graphrag/index/operations/embed_text/embed_text.py b/graphrag/index/operations/embed_text/embed_text.py index d6f0b3b9ae..627d1728b2 100644 --- a/graphrag/index/operations/embed_text/embed_text.py +++ b/graphrag/index/operations/embed_text/embed_text.py @@ -11,15 +11,11 @@ import pandas as pd from datashaper import VerbCallbacks -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.operations.embed_text.strategies.typing import TextEmbeddingStrategy from graphrag.utils.embeddings import create_collection_name -from graphrag.vector_stores import ( - BaseVectorStore, - VectorStoreDocument, - VectorStoreFactory, -) - -from .strategies.typing import TextEmbeddingStrategy +from graphrag.vector_stores.base import BaseVectorStore, VectorStoreDocument +from graphrag.vector_stores.factory import VectorStoreFactory log = logging.getLogger(__name__) @@ -242,11 +238,15 @@ def load_strategy(strategy: TextEmbedStrategyType) -> TextEmbeddingStrategy: """Load strategy method definition.""" match strategy: case TextEmbedStrategyType.openai: - from .strategies.openai import run as run_openai + from graphrag.index.operations.embed_text.strategies.openai import ( + run as run_openai, + ) return run_openai case TextEmbedStrategyType.mock: - from .strategies.mock import run as run_mock + from graphrag.index.operations.embed_text.strategies.mock import ( + run as run_mock, + ) return run_mock case _: diff --git a/graphrag/index/operations/embed_text/strategies/mock.py b/graphrag/index/operations/embed_text/strategies/mock.py index 1be4ab0f9f..a32eceb386 100644 --- a/graphrag/index/operations/embed_text/strategies/mock.py +++ b/graphrag/index/operations/embed_text/strategies/mock.py @@ -9,9 +9,8 @@ from datashaper import ProgressTicker, VerbCallbacks, progress_ticker -from graphrag.index.cache import PipelineCache - -from .typing import TextEmbeddingResult +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.operations.embed_text.strategies.typing import TextEmbeddingResult async def run( # noqa RUF029 async is required for interface diff --git a/graphrag/index/operations/embed_text/strategies/openai.py b/graphrag/index/operations/embed_text/strategies/openai.py index fb443ec83e..f0445d8480 100644 --- a/graphrag/index/operations/embed_text/strategies/openai.py +++ b/graphrag/index/operations/embed_text/strategies/openai.py @@ -11,14 +11,13 @@ from datashaper import ProgressTicker, VerbCallbacks, progress_ticker import graphrag.config.defaults as defs -from graphrag.index.cache import PipelineCache -from graphrag.index.llm import load_llm_embeddings -from graphrag.index.text_splitting import TokenTextSplitter -from graphrag.index.utils import is_null +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.llm.load_llm import load_llm_embeddings +from graphrag.index.operations.embed_text.strategies.typing import TextEmbeddingResult +from graphrag.index.text_splitting.text_splitting import TokenTextSplitter +from graphrag.index.utils.is_null import is_null from graphrag.llm import EmbeddingLLM, OpenAIConfiguration -from .typing import TextEmbeddingResult - log = logging.getLogger(__name__) diff --git a/graphrag/index/operations/embed_text/strategies/typing.py b/graphrag/index/operations/embed_text/strategies/typing.py index 1b25256497..79998f72eb 100644 --- a/graphrag/index/operations/embed_text/strategies/typing.py +++ b/graphrag/index/operations/embed_text/strategies/typing.py @@ -8,7 +8,7 @@ from datashaper import VerbCallbacks -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache @dataclass diff --git a/graphrag/index/operations/extract_covariates/__init__.py b/graphrag/index/operations/extract_covariates/__init__.py index 53d357bb46..315f503c3e 100644 --- a/graphrag/index/operations/extract_covariates/__init__.py +++ b/graphrag/index/operations/extract_covariates/__init__.py @@ -3,6 +3,9 @@ """The Indexing Engine text extract claims package root.""" -from .extract_covariates import ExtractClaimsStrategyType, extract_covariates +from graphrag.index.operations.extract_covariates.extract_covariates import ( + ExtractClaimsStrategyType, + extract_covariates, +) __all__ = ["ExtractClaimsStrategyType", "extract_covariates"] diff --git a/graphrag/index/operations/extract_covariates/extract_covariates.py b/graphrag/index/operations/extract_covariates/extract_covariates.py index 1ee5f51cc6..48b3b04c31 100644 --- a/graphrag/index/operations/extract_covariates/extract_covariates.py +++ b/graphrag/index/operations/extract_covariates/extract_covariates.py @@ -14,9 +14,12 @@ derive_from_rows, ) -from graphrag.index.cache import PipelineCache - -from .typing import Covariate, CovariateExtractStrategy, ExtractClaimsStrategyType +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.operations.extract_covariates.typing import ( + Covariate, + CovariateExtractStrategy, + ExtractClaimsStrategyType, +) log = logging.getLogger(__name__) @@ -72,7 +75,9 @@ def load_strategy(strategy_type: ExtractClaimsStrategyType) -> CovariateExtractS """Load strategy method definition.""" match strategy_type: case ExtractClaimsStrategyType.graph_intelligence: - from .strategies import run_graph_intelligence + from graphrag.index.operations.extract_covariates.strategies import ( + run_graph_intelligence, + ) return run_graph_intelligence case _: diff --git a/graphrag/index/operations/extract_covariates/strategies.py b/graphrag/index/operations/extract_covariates/strategies.py index 2ef83e513a..4d7729961c 100644 --- a/graphrag/index/operations/extract_covariates/strategies.py +++ b/graphrag/index/operations/extract_covariates/strategies.py @@ -9,15 +9,14 @@ from datashaper import VerbCallbacks import graphrag.config.defaults as defs -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.graph.extractors.claims import ClaimExtractor -from graphrag.index.llm import load_llm -from graphrag.llm import CompletionLLM - -from .typing import ( +from graphrag.index.llm.load_llm import load_llm +from graphrag.index.operations.extract_covariates.typing import ( Covariate, CovariateExtractionResult, ) +from graphrag.llm import CompletionLLM async def run_graph_intelligence( diff --git a/graphrag/index/operations/extract_covariates/typing.py b/graphrag/index/operations/extract_covariates/typing.py index c0cb96633f..a208ea3e9f 100644 --- a/graphrag/index/operations/extract_covariates/typing.py +++ b/graphrag/index/operations/extract_covariates/typing.py @@ -10,7 +10,7 @@ from datashaper import VerbCallbacks -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache @dataclass diff --git a/graphrag/index/operations/extract_entities/__init__.py b/graphrag/index/operations/extract_entities/__init__.py index 579b57dfd4..5092df4a52 100644 --- a/graphrag/index/operations/extract_entities/__init__.py +++ b/graphrag/index/operations/extract_entities/__init__.py @@ -3,6 +3,9 @@ """The Indexing Engine entities extraction package root.""" -from .extract_entities import ExtractEntityStrategyType, extract_entities +from graphrag.index.operations.extract_entities.extract_entities import ( + ExtractEntityStrategyType, + extract_entities, +) __all__ = ["ExtractEntityStrategyType", "extract_entities"] diff --git a/graphrag/index/operations/extract_entities/extract_entities.py b/graphrag/index/operations/extract_entities/extract_entities.py index 96bec73b25..522d4d98e5 100644 --- a/graphrag/index/operations/extract_entities/extract_entities.py +++ b/graphrag/index/operations/extract_entities/extract_entities.py @@ -16,9 +16,11 @@ ) from graphrag.index.bootstrap import bootstrap -from graphrag.index.cache import PipelineCache - -from .strategies.typing import Document, EntityExtractStrategy +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.operations.extract_entities.strategies.typing import ( + Document, + EntityExtractStrategy, +) log = logging.getLogger(__name__) @@ -162,14 +164,18 @@ def _load_strategy(strategy_type: ExtractEntityStrategyType) -> EntityExtractStr """Load strategy method definition.""" match strategy_type: case ExtractEntityStrategyType.graph_intelligence: - from .strategies.graph_intelligence import run_graph_intelligence + from graphrag.index.operations.extract_entities.strategies.graph_intelligence import ( + run_graph_intelligence, + ) return run_graph_intelligence case ExtractEntityStrategyType.nltk: bootstrap() # dynamically import nltk strategy to avoid dependency if not used - from .strategies.nltk import run as run_nltk + from graphrag.index.operations.extract_entities.strategies.nltk import ( + run as run_nltk, + ) return run_nltk case _: diff --git a/graphrag/index/operations/extract_entities/strategies/graph_intelligence.py b/graphrag/index/operations/extract_entities/strategies/graph_intelligence.py index 072d5bed0a..18fcc97444 100644 --- a/graphrag/index/operations/extract_entities/strategies/graph_intelligence.py +++ b/graphrag/index/operations/extract_entities/strategies/graph_intelligence.py @@ -6,22 +6,21 @@ from datashaper import VerbCallbacks import graphrag.config.defaults as defs -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.graph.extractors import GraphExtractor -from graphrag.index.llm import load_llm -from graphrag.index.text_splitting import ( - NoopTextSplitter, - TextSplitter, - TokenTextSplitter, -) -from graphrag.llm import CompletionLLM - -from .typing import ( +from graphrag.index.llm.load_llm import load_llm +from graphrag.index.operations.extract_entities.strategies.typing import ( Document, EntityExtractionResult, EntityTypes, StrategyConfig, ) +from graphrag.index.text_splitting.text_splitting import ( + NoopTextSplitter, + TextSplitter, + TokenTextSplitter, +) +from graphrag.llm import CompletionLLM async def run_graph_intelligence( diff --git a/graphrag/index/operations/extract_entities/strategies/nltk.py b/graphrag/index/operations/extract_entities/strategies/nltk.py index 8f9aefa0ee..08f447004a 100644 --- a/graphrag/index/operations/extract_entities/strategies/nltk.py +++ b/graphrag/index/operations/extract_entities/strategies/nltk.py @@ -8,9 +8,13 @@ from datashaper import VerbCallbacks from nltk.corpus import words -from graphrag.index.cache import PipelineCache - -from .typing import Document, EntityExtractionResult, EntityTypes, StrategyConfig +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.operations.extract_entities.strategies.typing import ( + Document, + EntityExtractionResult, + EntityTypes, + StrategyConfig, +) # Need to do this cause we're potentially multithreading, and nltk doesn't like that words.ensure_loaded() diff --git a/graphrag/index/operations/extract_entities/strategies/typing.py b/graphrag/index/operations/extract_entities/strategies/typing.py index e1c548b0c4..57df220d9b 100644 --- a/graphrag/index/operations/extract_entities/strategies/typing.py +++ b/graphrag/index/operations/extract_entities/strategies/typing.py @@ -10,7 +10,7 @@ import networkx as nx from datashaper import VerbCallbacks -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache ExtractedEntity = dict[str, Any] StrategyConfig = dict[str, Any] diff --git a/graphrag/index/operations/layout_graph/__init__.py b/graphrag/index/operations/layout_graph/__init__.py index 74584f83ed..7638c5a3f6 100644 --- a/graphrag/index/operations/layout_graph/__init__.py +++ b/graphrag/index/operations/layout_graph/__init__.py @@ -3,6 +3,6 @@ """The Indexing Engine graph layout package root.""" -from .layout_graph import layout_graph +from graphrag.index.operations.layout_graph.layout_graph import layout_graph __all__ = ["layout_graph"] diff --git a/graphrag/index/operations/layout_graph/layout_graph.py b/graphrag/index/operations/layout_graph/layout_graph.py index d2b232660d..356511f4fd 100644 --- a/graphrag/index/operations/layout_graph/layout_graph.py +++ b/graphrag/index/operations/layout_graph/layout_graph.py @@ -12,7 +12,7 @@ from graphrag.index.graph.visualization import GraphLayout from graphrag.index.operations.embed_graph import NodeEmbeddings -from graphrag.index.utils import load_graph +from graphrag.index.utils.load_graph import load_graph class LayoutGraphStrategyType(str, Enum): @@ -102,7 +102,9 @@ def _run_layout( graph = load_graph(graphml_or_graph) match strategy: case LayoutGraphStrategyType.umap: - from .methods.umap import run as run_umap + from graphrag.index.operations.layout_graph.methods.umap import ( + run as run_umap, + ) return run_umap( graph, @@ -111,7 +113,9 @@ def _run_layout( lambda e, stack, d: callbacks.error("Error in Umap", e, stack, d), ) case LayoutGraphStrategyType.zero: - from .methods.zero import run as run_zero + from graphrag.index.operations.layout_graph.methods.zero import ( + run as run_zero, + ) return run_zero( graph, diff --git a/graphrag/index/operations/merge_graphs/__init__.py b/graphrag/index/operations/merge_graphs/__init__.py index f3b957dd9d..f5f463520d 100644 --- a/graphrag/index/operations/merge_graphs/__init__.py +++ b/graphrag/index/operations/merge_graphs/__init__.py @@ -3,7 +3,7 @@ """merge_graphs operation.""" -from .merge_graphs import merge_graphs +from graphrag.index.operations.merge_graphs.merge_graphs import merge_graphs __all__ = [ "merge_graphs", diff --git a/graphrag/index/operations/merge_graphs/merge_graphs.py b/graphrag/index/operations/merge_graphs/merge_graphs.py index 80ab20ef41..9aee37cf3e 100644 --- a/graphrag/index/operations/merge_graphs/merge_graphs.py +++ b/graphrag/index/operations/merge_graphs/merge_graphs.py @@ -8,7 +8,7 @@ import networkx as nx from datashaper import VerbCallbacks, progress_iterable -from .typing import ( +from graphrag.index.operations.merge_graphs.typing import ( BasicMergeOperation, DetailedAttributeMergeOperation, NumericOperation, diff --git a/graphrag/index/operations/snapshot.py b/graphrag/index/operations/snapshot.py index c889595649..7ae7f0ca09 100644 --- a/graphrag/index/operations/snapshot.py +++ b/graphrag/index/operations/snapshot.py @@ -5,7 +5,7 @@ import pandas as pd -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage async def snapshot( diff --git a/graphrag/index/operations/snapshot_graphml.py b/graphrag/index/operations/snapshot_graphml.py index 07a174fad6..feda376f97 100644 --- a/graphrag/index/operations/snapshot_graphml.py +++ b/graphrag/index/operations/snapshot_graphml.py @@ -5,7 +5,7 @@ import networkx as nx -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage async def snapshot_graphml( diff --git a/graphrag/index/operations/snapshot_rows.py b/graphrag/index/operations/snapshot_rows.py index 5abd771bc3..0050f98061 100644 --- a/graphrag/index/operations/snapshot_rows.py +++ b/graphrag/index/operations/snapshot_rows.py @@ -9,7 +9,7 @@ import pandas as pd -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage @dataclass diff --git a/graphrag/index/operations/summarize_communities/__init__.py b/graphrag/index/operations/summarize_communities/__init__.py index d3065198b6..6b74b9f3a9 100644 --- a/graphrag/index/operations/summarize_communities/__init__.py +++ b/graphrag/index/operations/summarize_communities/__init__.py @@ -3,10 +3,18 @@ """Community summarization modules.""" -from .prepare_community_reports import prepare_community_reports -from .restore_community_hierarchy import restore_community_hierarchy -from .summarize_communities import summarize_communities -from .typing import CreateCommunityReportsStrategyType +from graphrag.index.operations.summarize_communities.prepare_community_reports import ( + prepare_community_reports, +) +from graphrag.index.operations.summarize_communities.restore_community_hierarchy import ( + restore_community_hierarchy, +) +from graphrag.index.operations.summarize_communities.summarize_communities import ( + summarize_communities, +) +from graphrag.index.operations.summarize_communities.typing import ( + CreateCommunityReportsStrategyType, +) __all__ = [ "CreateCommunityReportsStrategyType", diff --git a/graphrag/index/operations/summarize_communities/strategies.py b/graphrag/index/operations/summarize_communities/strategies.py index 2653e41f47..33900a9852 100644 --- a/graphrag/index/operations/summarize_communities/strategies.py +++ b/graphrag/index/operations/summarize_communities/strategies.py @@ -9,18 +9,17 @@ from datashaper import VerbCallbacks -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.graph.extractors.community_reports import ( CommunityReportsExtractor, ) -from graphrag.index.llm import load_llm -from graphrag.index.utils.rate_limiter import RateLimiter -from graphrag.llm import CompletionLLM - -from .typing import ( +from graphrag.index.llm.load_llm import load_llm +from graphrag.index.operations.summarize_communities.typing import ( CommunityReport, StrategyConfig, ) +from graphrag.index.utils.rate_limiter import RateLimiter +from graphrag.llm import CompletionLLM DEFAULT_CHUNK_SIZE = 3000 diff --git a/graphrag/index/operations/summarize_communities/summarize_communities.py b/graphrag/index/operations/summarize_communities/summarize_communities.py index ad8c44077e..de35981d0a 100644 --- a/graphrag/index/operations/summarize_communities/summarize_communities.py +++ b/graphrag/index/operations/summarize_communities/summarize_communities.py @@ -16,13 +16,12 @@ import graphrag.config.defaults as defaults import graphrag.index.graph.extractors.community_reports.schemas as schemas -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.graph.extractors.community_reports import ( get_levels, prep_community_report_context, ) - -from .typing import ( +from graphrag.index.operations.summarize_communities.typing import ( CommunityReport, CommunityReportsStrategy, CreateCommunityReportsStrategyType, @@ -104,7 +103,9 @@ def load_strategy( """Load strategy method definition.""" match strategy: case CreateCommunityReportsStrategyType.graph_intelligence: - from .strategies import run_graph_intelligence + from graphrag.index.operations.summarize_communities.strategies import ( + run_graph_intelligence, + ) return run_graph_intelligence case _: diff --git a/graphrag/index/operations/summarize_communities/typing.py b/graphrag/index/operations/summarize_communities/typing.py index a5a01cbbc2..46a1a09573 100644 --- a/graphrag/index/operations/summarize_communities/typing.py +++ b/graphrag/index/operations/summarize_communities/typing.py @@ -10,7 +10,7 @@ from datashaper import VerbCallbacks from typing_extensions import TypedDict -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache ExtractedEntity = dict[str, Any] StrategyConfig = dict[str, Any] diff --git a/graphrag/index/operations/summarize_descriptions/__init__.py b/graphrag/index/operations/summarize_descriptions/__init__.py index 55f818d11c..1b67f6dc72 100644 --- a/graphrag/index/operations/summarize_descriptions/__init__.py +++ b/graphrag/index/operations/summarize_descriptions/__init__.py @@ -3,8 +3,13 @@ """Root package for description summarization.""" -from .summarize_descriptions import summarize_descriptions -from .typing import SummarizationStrategy, SummarizeStrategyType +from graphrag.index.operations.summarize_descriptions.summarize_descriptions import ( + summarize_descriptions, +) +from graphrag.index.operations.summarize_descriptions.typing import ( + SummarizationStrategy, + SummarizeStrategyType, +) __all__ = [ "SummarizationStrategy", diff --git a/graphrag/index/operations/summarize_descriptions/strategies.py b/graphrag/index/operations/summarize_descriptions/strategies.py index 91ff0d3141..fd6ea5a849 100644 --- a/graphrag/index/operations/summarize_descriptions/strategies.py +++ b/graphrag/index/operations/summarize_descriptions/strategies.py @@ -5,15 +5,14 @@ from datashaper import VerbCallbacks -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.graph.extractors.summarize import SummarizeExtractor -from graphrag.index.llm import load_llm -from graphrag.llm import CompletionLLM - -from .typing import ( +from graphrag.index.llm.load_llm import load_llm +from graphrag.index.operations.summarize_descriptions.typing import ( StrategyConfig, SummarizedDescriptionResult, ) +from graphrag.llm import CompletionLLM async def run_graph_intelligence( diff --git a/graphrag/index/operations/summarize_descriptions/summarize_descriptions.py b/graphrag/index/operations/summarize_descriptions/summarize_descriptions.py index 0775447369..612f2c6795 100644 --- a/graphrag/index/operations/summarize_descriptions/summarize_descriptions.py +++ b/graphrag/index/operations/summarize_descriptions/summarize_descriptions.py @@ -14,9 +14,8 @@ progress_ticker, ) -from graphrag.index.cache import PipelineCache - -from .typing import ( +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.operations.summarize_descriptions.typing import ( SummarizationStrategy, SummarizeStrategyType, ) @@ -140,7 +139,9 @@ def load_strategy(strategy_type: SummarizeStrategyType) -> SummarizationStrategy """Load strategy method definition.""" match strategy_type: case SummarizeStrategyType.graph_intelligence: - from .strategies import run_graph_intelligence + from graphrag.index.operations.summarize_descriptions.strategies import ( + run_graph_intelligence, + ) return run_graph_intelligence case _: diff --git a/graphrag/index/operations/summarize_descriptions/typing.py b/graphrag/index/operations/summarize_descriptions/typing.py index 4e957cf49f..c7ba9ceb74 100644 --- a/graphrag/index/operations/summarize_descriptions/typing.py +++ b/graphrag/index/operations/summarize_descriptions/typing.py @@ -10,7 +10,7 @@ from datashaper import VerbCallbacks -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache StrategyConfig = dict[str, Any] diff --git a/graphrag/index/operations/unpack_graph.py b/graphrag/index/operations/unpack_graph.py index ad9f738125..f64ce43e0b 100644 --- a/graphrag/index/operations/unpack_graph.py +++ b/graphrag/index/operations/unpack_graph.py @@ -9,7 +9,7 @@ import pandas as pd from datashaper import VerbCallbacks, progress_iterable -from graphrag.index.utils import load_graph +from graphrag.index.utils.load_graph import load_graph default_copy = ["level"] diff --git a/graphrag/index/run/cache.py b/graphrag/index/run/cache.py index 0b77576ef4..d1c57e4f80 100644 --- a/graphrag/index/run/cache.py +++ b/graphrag/index/run/cache.py @@ -3,7 +3,7 @@ """Cache functions for the GraphRAG update module.""" -from graphrag.index.cache import load_cache +from graphrag.index.cache.load_cache import load_cache from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.config.cache import ( PipelineCacheConfigTypes, diff --git a/graphrag/index/run/run.py b/graphrag/index/run/run.py index 8db214bf93..d2dfa19df5 100644 --- a/graphrag/index/run/run.py +++ b/graphrag/index/run/run.py @@ -15,13 +15,14 @@ from datashaper import NoopVerbCallbacks, WorkflowCallbacks from graphrag.callbacks.console_workflow_callbacks import ConsoleWorkflowCallbacks -from graphrag.index.cache import PipelineCache -from graphrag.index.config import ( +from graphrag.index.cache.pipeline_cache import PipelineCache +from graphrag.index.config.pipeline import ( PipelineConfig, PipelineWorkflowReference, - PipelineWorkflowStep, ) -from graphrag.index.emit import TableEmitterType, create_table_emitters +from graphrag.index.config.workflow import PipelineWorkflowStep +from graphrag.index.emit.factories import create_table_emitters +from graphrag.index.emit.types import TableEmitterType from graphrag.index.load_pipeline_config import load_pipeline_config from graphrag.index.run.cache import _create_cache from graphrag.index.run.postprocess import ( @@ -40,7 +41,7 @@ _create_callback_chain, _process_workflow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage from graphrag.index.typing import PipelineRunResult from graphrag.index.update.incremental_index import ( get_delta_docs, @@ -51,10 +52,8 @@ WorkflowDefinitions, load_workflows, ) -from graphrag.logging import ( - NullProgressReporter, - ProgressReporter, -) +from graphrag.logging.base import ProgressReporter +from graphrag.logging.null_progress import NullProgressReporter from graphrag.utils.storage import _create_storage log = logging.getLogger(__name__) diff --git a/graphrag/index/run/utils.py b/graphrag/index/run/utils.py index e672763513..ab5b4989f3 100644 --- a/graphrag/index/run/utils.py +++ b/graphrag/index/run/utils.py @@ -31,10 +31,10 @@ PipelineFileStorageConfig, ) from graphrag.index.context import PipelineRunContext, PipelineRunStats -from graphrag.index.input import load_input +from graphrag.index.input.load_input import load_input from graphrag.index.storage.memory_pipeline_storage import MemoryPipelineStorage from graphrag.index.storage.pipeline_storage import PipelineStorage -from graphrag.logging import ProgressReporter +from graphrag.logging.base import ProgressReporter log = logging.getLogger(__name__) diff --git a/graphrag/index/run/workflow.py b/graphrag/index/run/workflow.py index 5b616a22b7..ada3eb43dd 100644 --- a/graphrag/index/run/workflow.py +++ b/graphrag/index/run/workflow.py @@ -22,7 +22,7 @@ from graphrag.index.run.profiling import _write_workflow_stats from graphrag.index.storage.pipeline_storage import PipelineStorage from graphrag.index.typing import PipelineRunResult -from graphrag.logging import ProgressReporter +from graphrag.logging.base import ProgressReporter from graphrag.utils.storage import _load_table_from_storage log = logging.getLogger(__name__) diff --git a/graphrag/index/storage/__init__.py b/graphrag/index/storage/__init__.py index 630ce7f7fa..51f34cbd3d 100644 --- a/graphrag/index/storage/__init__.py +++ b/graphrag/index/storage/__init__.py @@ -2,21 +2,3 @@ # Licensed under the MIT License """The Indexing Engine storage package root.""" - -from .blob_pipeline_storage import BlobPipelineStorage, create_blob_storage -from .cosmosdb_pipeline_storage import CosmosDBPipelineStorage, create_cosmosdb_storage -from .file_pipeline_storage import FilePipelineStorage -from .load_storage import load_storage -from .memory_pipeline_storage import MemoryPipelineStorage -from .pipeline_storage import PipelineStorage - -__all__ = [ - "BlobPipelineStorage", - "CosmosDBPipelineStorage", - "FilePipelineStorage", - "MemoryPipelineStorage", - "PipelineStorage", - "create_blob_storage", - "create_cosmosdb_storage", - "load_storage", -] diff --git a/graphrag/index/storage/blob_pipeline_storage.py b/graphrag/index/storage/blob_pipeline_storage.py index bdf25c9970..da75a10082 100644 --- a/graphrag/index/storage/blob_pipeline_storage.py +++ b/graphrag/index/storage/blob_pipeline_storage.py @@ -13,9 +13,8 @@ from azure.storage.blob import BlobServiceClient from datashaper import Progress -from graphrag.logging import ProgressReporter - -from .pipeline_storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage +from graphrag.logging.base import ProgressReporter log = logging.getLogger(__name__) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 4e0457fd6c..e16f2523d4 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -16,7 +16,7 @@ from azure.identity import DefaultAzureCredential from datashaper import Progress -from graphrag.logging import ProgressReporter +from graphrag.logging.base import ProgressReporter from .pipeline_storage import PipelineStorage diff --git a/graphrag/index/storage/file_pipeline_storage.py b/graphrag/index/storage/file_pipeline_storage.py index a3a18cf436..dbbca4e18e 100644 --- a/graphrag/index/storage/file_pipeline_storage.py +++ b/graphrag/index/storage/file_pipeline_storage.py @@ -16,9 +16,8 @@ from aiofiles.ospath import exists from datashaper import Progress -from graphrag.logging import ProgressReporter - -from .pipeline_storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage +from graphrag.logging.base import ProgressReporter log = logging.getLogger(__name__) diff --git a/graphrag/index/storage/load_storage.py b/graphrag/index/storage/load_storage.py index 23be6dcd39..d2fe0230a6 100644 --- a/graphrag/index/storage/load_storage.py +++ b/graphrag/index/storage/load_storage.py @@ -7,18 +7,17 @@ from typing import cast -from graphrag.config import StorageType +from graphrag.config.enums import StorageType from graphrag.index.config.storage import ( PipelineBlobStorageConfig, PipelineCosmosDBStorageConfig, PipelineFileStorageConfig, PipelineStorageConfig, ) - -from .blob_pipeline_storage import create_blob_storage -from .cosmosdb_pipeline_storage import create_cosmosdb_storage -from .file_pipeline_storage import create_file_storage -from .memory_pipeline_storage import create_memory_storage +from graphrag.index.storage.blob_pipeline_storage import create_blob_storage +from graphrag.index.storage.cosmosdb_pipeline_storage import create_cosmosdb_storage +from graphrag.index.storage.file_pipeline_storage import create_file_storage +from graphrag.index.storage.memory_pipeline_storage import create_memory_storage def load_storage(config: PipelineStorageConfig): diff --git a/graphrag/index/storage/memory_pipeline_storage.py b/graphrag/index/storage/memory_pipeline_storage.py index 3f9f9c9be9..80245c387e 100644 --- a/graphrag/index/storage/memory_pipeline_storage.py +++ b/graphrag/index/storage/memory_pipeline_storage.py @@ -5,8 +5,8 @@ from typing import Any -from .file_pipeline_storage import FilePipelineStorage -from .pipeline_storage import PipelineStorage +from graphrag.index.storage.file_pipeline_storage import FilePipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage class MemoryPipelineStorage(FilePipelineStorage): diff --git a/graphrag/index/storage/pipeline_storage.py b/graphrag/index/storage/pipeline_storage.py index 554c2ffd74..ec67b43234 100644 --- a/graphrag/index/storage/pipeline_storage.py +++ b/graphrag/index/storage/pipeline_storage.py @@ -8,7 +8,7 @@ from collections.abc import Iterator from typing import Any -from graphrag.logging import ProgressReporter +from graphrag.logging.base import ProgressReporter class PipelineStorage(metaclass=ABCMeta): diff --git a/graphrag/index/text_splitting/__init__.py b/graphrag/index/text_splitting/__init__.py index 4653adb22b..e6f3b31b4c 100644 --- a/graphrag/index/text_splitting/__init__.py +++ b/graphrag/index/text_splitting/__init__.py @@ -2,33 +2,3 @@ # Licensed under the MIT License """The Indexing Engine Text Splitting package root.""" - -from .check_token_limit import check_token_limit -from .text_splitting import ( - DecodeFn, - EncodedText, - EncodeFn, - LengthFn, - NoopTextSplitter, - TextListSplitter, - TextListSplitterType, - TextSplitter, - Tokenizer, - TokenTextSplitter, - split_text_on_tokens, -) - -__all__ = [ - "DecodeFn", - "EncodeFn", - "EncodedText", - "LengthFn", - "NoopTextSplitter", - "TextListSplitter", - "TextListSplitterType", - "TextSplitter", - "TokenTextSplitter", - "Tokenizer", - "check_token_limit", - "split_text_on_tokens", -] diff --git a/graphrag/index/text_splitting/check_token_limit.py b/graphrag/index/text_splitting/check_token_limit.py index 1a5f862254..7b6a139e02 100644 --- a/graphrag/index/text_splitting/check_token_limit.py +++ b/graphrag/index/text_splitting/check_token_limit.py @@ -3,7 +3,7 @@ """Token limit method definition.""" -from .text_splitting import TokenTextSplitter +from graphrag.index.text_splitting.text_splitting import TokenTextSplitter def check_token_limit(text, max_token): diff --git a/graphrag/index/text_splitting/text_splitting.py b/graphrag/index/text_splitting/text_splitting.py index c65515da5b..7ef5dd874c 100644 --- a/graphrag/index/text_splitting/text_splitting.py +++ b/graphrag/index/text_splitting/text_splitting.py @@ -14,7 +14,7 @@ import pandas as pd import tiktoken -from graphrag.index.utils import num_tokens_from_string +from graphrag.index.utils.tokens import num_tokens_from_string EncodedText = list[int] DecodeFn = Callable[[EncodedText], str] diff --git a/graphrag/index/update/incremental_index.py b/graphrag/index/update/incremental_index.py index 89acb285e0..abebfd7e0d 100644 --- a/graphrag/index/update/incremental_index.py +++ b/graphrag/index/update/incremental_index.py @@ -24,7 +24,7 @@ _run_entity_summarization, ) from graphrag.index.update.relationships import _update_and_merge_relationships -from graphrag.logging.types import ProgressReporter +from graphrag.logging.print_progress import ProgressReporter from graphrag.utils.storage import _load_table_from_storage diff --git a/graphrag/index/utils/__init__.py b/graphrag/index/utils/__init__.py index 7cbbb53d75..d1737fc9be 100644 --- a/graphrag/index/utils/__init__.py +++ b/graphrag/index/utils/__init__.py @@ -2,24 +2,3 @@ # Licensed under the MIT License """Utils methods definition.""" - -from .dicts import dict_has_keys_with_types -from .hashing import gen_md5_hash -from .is_null import is_null -from .load_graph import load_graph -from .string import clean_str -from .tokens import num_tokens_from_string, string_from_tokens -from .topological_sort import topological_sort -from .uuid import gen_uuid - -__all__ = [ - "clean_str", - "dict_has_keys_with_types", - "gen_md5_hash", - "gen_uuid", - "is_null", - "load_graph", - "num_tokens_from_string", - "string_from_tokens", - "topological_sort", -] diff --git a/graphrag/index/validate_config.py b/graphrag/index/validate_config.py index bc3b8a0ed6..11d7fd8390 100644 --- a/graphrag/index/validate_config.py +++ b/graphrag/index/validate_config.py @@ -8,9 +8,9 @@ from datashaper import NoopVerbCallbacks -from graphrag.config.models import GraphRagConfig -from graphrag.index.llm import load_llm, load_llm_embeddings -from graphrag.logging import ProgressReporter +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.index.llm.load_llm import load_llm, load_llm_embeddings +from graphrag.logging.print_progress import ProgressReporter def validate_config_names( diff --git a/graphrag/index/workflows/__init__.py b/graphrag/index/workflows/__init__.py index ed580309a8..db1cb74c7b 100644 --- a/graphrag/index/workflows/__init__.py +++ b/graphrag/index/workflows/__init__.py @@ -3,8 +3,8 @@ """The Indexing Engine workflows package root.""" -from .load import create_workflow, load_workflows -from .typing import ( +from graphrag.index.workflows.load import create_workflow, load_workflows +from graphrag.index.workflows.typing import ( StepDefinition, VerbDefinitions, VerbTiming, diff --git a/graphrag/index/workflows/default_workflows.py b/graphrag/index/workflows/default_workflows.py index 5a3d176b56..536423c4e3 100644 --- a/graphrag/index/workflows/default_workflows.py +++ b/graphrag/index/workflows/default_workflows.py @@ -4,74 +4,74 @@ """A package containing default workflows definitions.""" # load and register all subflows -from .v1.subflows import * # noqa +from graphrag.index.workflows.v1.subflows import * # noqa -from .typing import WorkflowDefinitions -from .v1.create_base_entity_graph import ( +from graphrag.index.workflows.typing import WorkflowDefinitions +from graphrag.index.workflows.v1.create_base_entity_graph import ( build_steps as build_create_base_entity_graph_steps, ) -from .v1.create_base_entity_graph import ( +from graphrag.index.workflows.v1.create_base_entity_graph import ( workflow_name as create_base_entity_graph, ) -from .v1.create_base_text_units import ( +from graphrag.index.workflows.v1.create_base_text_units import ( build_steps as build_create_base_text_units_steps, ) -from .v1.create_base_text_units import ( +from graphrag.index.workflows.v1.create_base_text_units import ( workflow_name as create_base_text_units, ) -from .v1.create_final_communities import ( +from graphrag.index.workflows.v1.create_final_communities import ( build_steps as build_create_final_communities_steps, ) -from .v1.create_final_communities import ( +from graphrag.index.workflows.v1.create_final_communities import ( workflow_name as create_final_communities, ) -from .v1.create_final_community_reports import ( +from graphrag.index.workflows.v1.create_final_community_reports import ( build_steps as build_create_final_community_reports_steps, ) -from .v1.create_final_community_reports import ( +from graphrag.index.workflows.v1.create_final_community_reports import ( workflow_name as create_final_community_reports, ) -from .v1.create_final_covariates import ( +from graphrag.index.workflows.v1.create_final_covariates import ( build_steps as build_create_final_covariates_steps, ) -from .v1.create_final_covariates import ( +from graphrag.index.workflows.v1.create_final_covariates import ( workflow_name as create_final_covariates, ) -from .v1.create_final_documents import ( +from graphrag.index.workflows.v1.create_final_documents import ( build_steps as build_create_final_documents_steps, ) -from .v1.create_final_documents import ( +from graphrag.index.workflows.v1.create_final_documents import ( workflow_name as create_final_documents, ) -from .v1.create_final_entities import ( +from graphrag.index.workflows.v1.create_final_entities import ( build_steps as build_create_final_entities_steps, ) -from .v1.create_final_entities import ( +from graphrag.index.workflows.v1.create_final_entities import ( workflow_name as create_final_entities, ) -from .v1.create_final_nodes import ( +from graphrag.index.workflows.v1.create_final_nodes import ( build_steps as build_create_final_nodes_steps, ) -from .v1.create_final_nodes import ( +from graphrag.index.workflows.v1.create_final_nodes import ( workflow_name as create_final_nodes, ) -from .v1.create_final_relationships import ( +from graphrag.index.workflows.v1.create_final_relationships import ( build_steps as build_create_final_relationships_steps, ) -from .v1.create_final_relationships import ( +from graphrag.index.workflows.v1.create_final_relationships import ( workflow_name as create_final_relationships, ) -from .v1.create_final_text_units import ( +from graphrag.index.workflows.v1.create_final_text_units import ( build_steps as build_create_final_text_units, ) -from .v1.create_final_text_units import ( +from graphrag.index.workflows.v1.create_final_text_units import ( workflow_name as create_final_text_units, ) -from .v1.generate_text_embeddings import ( +from graphrag.index.workflows.v1.generate_text_embeddings import ( build_steps as build_generate_text_embeddings_steps, ) -from .v1.generate_text_embeddings import ( +from graphrag.index.workflows.v1.generate_text_embeddings import ( workflow_name as generate_text_embeddings, ) diff --git a/graphrag/index/workflows/load.py b/graphrag/index/workflows/load.py index a9f65b86d1..236642d165 100644 --- a/graphrag/index/workflows/load.py +++ b/graphrag/index/workflows/load.py @@ -16,13 +16,18 @@ UndefinedWorkflowError, UnknownWorkflowError, ) -from graphrag.index.utils import topological_sort - -from .default_workflows import default_workflows as _default_workflows -from .typing import VerbDefinitions, WorkflowDefinitions, WorkflowToRun +from graphrag.index.utils.topological_sort import topological_sort +from graphrag.index.workflows.default_workflows import ( + default_workflows as _default_workflows, +) +from graphrag.index.workflows.typing import ( + VerbDefinitions, + WorkflowDefinitions, + WorkflowToRun, +) if TYPE_CHECKING: - from graphrag.index.config import ( + from graphrag.index.config.workflow import ( PipelineWorkflowConfig, PipelineWorkflowReference, PipelineWorkflowStep, diff --git a/graphrag/index/workflows/v1/create_base_entity_graph.py b/graphrag/index/workflows/v1/create_base_entity_graph.py index bb0c41ac57..0e8a9a4fb7 100644 --- a/graphrag/index/workflows/v1/create_base_entity_graph.py +++ b/graphrag/index/workflows/v1/create_base_entity_graph.py @@ -7,7 +7,7 @@ AsyncType, ) -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_base_entity_graph" diff --git a/graphrag/index/workflows/v1/create_base_text_units.py b/graphrag/index/workflows/v1/create_base_text_units.py index efd7f7eab1..40250b62d2 100644 --- a/graphrag/index/workflows/v1/create_base_text_units.py +++ b/graphrag/index/workflows/v1/create_base_text_units.py @@ -5,7 +5,7 @@ from datashaper import DEFAULT_INPUT_NAME -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_base_text_units" diff --git a/graphrag/index/workflows/v1/create_final_communities.py b/graphrag/index/workflows/v1/create_final_communities.py index 96ca5215eb..b5296b4bfc 100644 --- a/graphrag/index/workflows/v1/create_final_communities.py +++ b/graphrag/index/workflows/v1/create_final_communities.py @@ -3,7 +3,7 @@ """A module containing build_steps method definition.""" -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_final_communities" diff --git a/graphrag/index/workflows/v1/create_final_community_reports.py b/graphrag/index/workflows/v1/create_final_community_reports.py index 8a56583d84..6b8d110fe1 100644 --- a/graphrag/index/workflows/v1/create_final_community_reports.py +++ b/graphrag/index/workflows/v1/create_final_community_reports.py @@ -3,7 +3,7 @@ """A module containing build_steps method definition.""" -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_final_community_reports" diff --git a/graphrag/index/workflows/v1/create_final_covariates.py b/graphrag/index/workflows/v1/create_final_covariates.py index 6bdf32e4bb..b730a1737d 100644 --- a/graphrag/index/workflows/v1/create_final_covariates.py +++ b/graphrag/index/workflows/v1/create_final_covariates.py @@ -7,7 +7,7 @@ AsyncType, ) -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_final_covariates" diff --git a/graphrag/index/workflows/v1/create_final_documents.py b/graphrag/index/workflows/v1/create_final_documents.py index 5160cc5165..ad0a1f036e 100644 --- a/graphrag/index/workflows/v1/create_final_documents.py +++ b/graphrag/index/workflows/v1/create_final_documents.py @@ -5,7 +5,7 @@ from datashaper import DEFAULT_INPUT_NAME -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_final_documents" diff --git a/graphrag/index/workflows/v1/create_final_entities.py b/graphrag/index/workflows/v1/create_final_entities.py index 50ee56d8e5..d36d5bb331 100644 --- a/graphrag/index/workflows/v1/create_final_entities.py +++ b/graphrag/index/workflows/v1/create_final_entities.py @@ -5,7 +5,7 @@ import logging -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_final_entities" log = logging.getLogger(__name__) diff --git a/graphrag/index/workflows/v1/create_final_nodes.py b/graphrag/index/workflows/v1/create_final_nodes.py index dedac2870e..ff22adbc0f 100644 --- a/graphrag/index/workflows/v1/create_final_nodes.py +++ b/graphrag/index/workflows/v1/create_final_nodes.py @@ -3,7 +3,7 @@ """A module containing build_steps method definition.""" -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_final_nodes" diff --git a/graphrag/index/workflows/v1/create_final_relationships.py b/graphrag/index/workflows/v1/create_final_relationships.py index 3eaff05b0e..c3947ba860 100644 --- a/graphrag/index/workflows/v1/create_final_relationships.py +++ b/graphrag/index/workflows/v1/create_final_relationships.py @@ -5,7 +5,7 @@ import logging -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_final_relationships" diff --git a/graphrag/index/workflows/v1/create_final_text_units.py b/graphrag/index/workflows/v1/create_final_text_units.py index 31015b0d01..a39e22d2e2 100644 --- a/graphrag/index/workflows/v1/create_final_text_units.py +++ b/graphrag/index/workflows/v1/create_final_text_units.py @@ -3,7 +3,7 @@ """A module containing build_steps method definition.""" -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep workflow_name = "create_final_text_units" diff --git a/graphrag/index/workflows/v1/generate_text_embeddings.py b/graphrag/index/workflows/v1/generate_text_embeddings.py index e919f8790d..58464b33a8 100644 --- a/graphrag/index/workflows/v1/generate_text_embeddings.py +++ b/graphrag/index/workflows/v1/generate_text_embeddings.py @@ -5,7 +5,7 @@ import logging -from graphrag.index.config import PipelineWorkflowConfig, PipelineWorkflowStep +from graphrag.index.config.workflow import PipelineWorkflowConfig, PipelineWorkflowStep log = logging.getLogger(__name__) diff --git a/graphrag/index/workflows/v1/subflows/__init__.py b/graphrag/index/workflows/v1/subflows/__init__.py index 8e080c5c71..1002a31af9 100644 --- a/graphrag/index/workflows/v1/subflows/__init__.py +++ b/graphrag/index/workflows/v1/subflows/__init__.py @@ -3,19 +3,37 @@ """The Indexing Engine workflows -> subflows package root.""" -from .create_base_entity_graph import create_base_entity_graph -from .create_base_text_units import create_base_text_units -from .create_final_communities import create_final_communities -from .create_final_community_reports import create_final_community_reports -from .create_final_covariates import create_final_covariates -from .create_final_documents import create_final_documents -from .create_final_entities import create_final_entities -from .create_final_nodes import create_final_nodes -from .create_final_relationships import ( +from graphrag.index.workflows.v1.subflows.create_base_entity_graph import ( + create_base_entity_graph, +) +from graphrag.index.workflows.v1.subflows.create_base_text_units import ( + create_base_text_units, +) +from graphrag.index.workflows.v1.subflows.create_final_communities import ( + create_final_communities, +) +from graphrag.index.workflows.v1.subflows.create_final_community_reports import ( + create_final_community_reports, +) +from graphrag.index.workflows.v1.subflows.create_final_covariates import ( + create_final_covariates, +) +from graphrag.index.workflows.v1.subflows.create_final_documents import ( + create_final_documents, +) +from graphrag.index.workflows.v1.subflows.create_final_entities import ( + create_final_entities, +) +from graphrag.index.workflows.v1.subflows.create_final_nodes import create_final_nodes +from graphrag.index.workflows.v1.subflows.create_final_relationships import ( create_final_relationships, ) -from .create_final_text_units import create_final_text_units -from .generate_text_embeddings import generate_text_embeddings +from graphrag.index.workflows.v1.subflows.create_final_text_units import ( + create_final_text_units, +) +from graphrag.index.workflows.v1.subflows.generate_text_embeddings import ( + generate_text_embeddings, +) __all__ = [ "create_base_entity_graph", diff --git a/graphrag/index/workflows/v1/subflows/create_base_entity_graph.py b/graphrag/index/workflows/v1/subflows/create_base_entity_graph.py index 09c8e8067c..3f1199e219 100644 --- a/graphrag/index/workflows/v1/subflows/create_base_entity_graph.py +++ b/graphrag/index/workflows/v1/subflows/create_base_entity_graph.py @@ -14,11 +14,11 @@ ) from datashaper.table_store.types import VerbResult, create_verb_result -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.flows.create_base_entity_graph import ( create_base_entity_graph as create_base_entity_graph_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage @verb( diff --git a/graphrag/index/workflows/v1/subflows/create_base_text_units.py b/graphrag/index/workflows/v1/subflows/create_base_text_units.py index 598c6cf10c..e9b3f43938 100644 --- a/graphrag/index/workflows/v1/subflows/create_base_text_units.py +++ b/graphrag/index/workflows/v1/subflows/create_base_text_units.py @@ -17,7 +17,7 @@ from graphrag.index.flows.create_base_text_units import ( create_base_text_units as create_base_text_units_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage @verb(name="create_base_text_units", treats_input_tables_as_immutable=True) diff --git a/graphrag/index/workflows/v1/subflows/create_final_communities.py b/graphrag/index/workflows/v1/subflows/create_final_communities.py index a70ecbf1f7..d66a327593 100644 --- a/graphrag/index/workflows/v1/subflows/create_final_communities.py +++ b/graphrag/index/workflows/v1/subflows/create_final_communities.py @@ -15,7 +15,7 @@ from graphrag.index.flows.create_final_communities import ( create_final_communities as create_final_communities_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage @verb(name="create_final_communities", treats_input_tables_as_immutable=True) diff --git a/graphrag/index/workflows/v1/subflows/create_final_community_reports.py b/graphrag/index/workflows/v1/subflows/create_final_community_reports.py index b8f5984e8c..ff6d9ef8a2 100644 --- a/graphrag/index/workflows/v1/subflows/create_final_community_reports.py +++ b/graphrag/index/workflows/v1/subflows/create_final_community_reports.py @@ -15,7 +15,7 @@ ) from datashaper.table_store.types import VerbResult, create_verb_result -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.flows.create_final_community_reports import ( create_final_community_reports as create_final_community_reports_flow, ) diff --git a/graphrag/index/workflows/v1/subflows/create_final_covariates.py b/graphrag/index/workflows/v1/subflows/create_final_covariates.py index d6b83ed70f..0ab54b1d85 100644 --- a/graphrag/index/workflows/v1/subflows/create_final_covariates.py +++ b/graphrag/index/workflows/v1/subflows/create_final_covariates.py @@ -13,11 +13,11 @@ ) from datashaper.table_store.types import VerbResult, create_verb_result -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.flows.create_final_covariates import ( create_final_covariates as create_final_covariates_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage @verb(name="create_final_covariates", treats_input_tables_as_immutable=True) diff --git a/graphrag/index/workflows/v1/subflows/create_final_documents.py b/graphrag/index/workflows/v1/subflows/create_final_documents.py index 9b7a4e7559..4ac4e24dcd 100644 --- a/graphrag/index/workflows/v1/subflows/create_final_documents.py +++ b/graphrag/index/workflows/v1/subflows/create_final_documents.py @@ -16,7 +16,7 @@ from graphrag.index.flows.create_final_documents import ( create_final_documents as create_final_documents_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage @verb( diff --git a/graphrag/index/workflows/v1/subflows/create_final_entities.py b/graphrag/index/workflows/v1/subflows/create_final_entities.py index bd5e735a12..968fa0d24b 100644 --- a/graphrag/index/workflows/v1/subflows/create_final_entities.py +++ b/graphrag/index/workflows/v1/subflows/create_final_entities.py @@ -15,7 +15,7 @@ from graphrag.index.flows.create_final_entities import ( create_final_entities as create_final_entities_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage @verb( diff --git a/graphrag/index/workflows/v1/subflows/create_final_nodes.py b/graphrag/index/workflows/v1/subflows/create_final_nodes.py index 2060e59eb3..e8266b76b5 100644 --- a/graphrag/index/workflows/v1/subflows/create_final_nodes.py +++ b/graphrag/index/workflows/v1/subflows/create_final_nodes.py @@ -15,7 +15,7 @@ from graphrag.index.flows.create_final_nodes import ( create_final_nodes as create_final_nodes_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage @verb(name="create_final_nodes", treats_input_tables_as_immutable=True) diff --git a/graphrag/index/workflows/v1/subflows/create_final_relationships.py b/graphrag/index/workflows/v1/subflows/create_final_relationships.py index 4769735487..995eeec834 100644 --- a/graphrag/index/workflows/v1/subflows/create_final_relationships.py +++ b/graphrag/index/workflows/v1/subflows/create_final_relationships.py @@ -17,7 +17,7 @@ from graphrag.index.flows.create_final_relationships import ( create_final_relationships as create_final_relationships_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage from graphrag.index.utils.ds_util import get_required_input_table diff --git a/graphrag/index/workflows/v1/subflows/create_final_text_units.py b/graphrag/index/workflows/v1/subflows/create_final_text_units.py index a950dcb974..8cc69839a9 100644 --- a/graphrag/index/workflows/v1/subflows/create_final_text_units.py +++ b/graphrag/index/workflows/v1/subflows/create_final_text_units.py @@ -17,7 +17,7 @@ from graphrag.index.flows.create_final_text_units import ( create_final_text_units as create_final_text_units_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage from graphrag.index.utils.ds_util import get_named_input_table, get_required_input_table diff --git a/graphrag/index/workflows/v1/subflows/generate_text_embeddings.py b/graphrag/index/workflows/v1/subflows/generate_text_embeddings.py index b0da04badf..1ac256a90e 100644 --- a/graphrag/index/workflows/v1/subflows/generate_text_embeddings.py +++ b/graphrag/index/workflows/v1/subflows/generate_text_embeddings.py @@ -16,11 +16,11 @@ verb, ) -from graphrag.index.cache import PipelineCache +from graphrag.index.cache.pipeline_cache import PipelineCache from graphrag.index.flows.generate_text_embeddings import ( generate_text_embeddings as generate_text_embeddings_flow, ) -from graphrag.index.storage import PipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage from graphrag.index.utils.ds_util import get_required_input_table log = logging.getLogger(__name__) diff --git a/graphrag/logging/__init__.py b/graphrag/logging/__init__.py index 31afc94387..9f5fe0de3a 100644 --- a/graphrag/logging/__init__.py +++ b/graphrag/logging/__init__.py @@ -2,26 +2,3 @@ # Licensed under the MIT License """Logging utilities and implementations.""" - -from .console import ConsoleReporter -from .factories import create_progress_reporter -from .null_progress import NullProgressReporter -from .print_progress import PrintProgressReporter -from .rich_progress import RichProgressReporter -from .types import ( - ProgressReporter, - ReporterType, - StatusLogger, -) - -__all__ = [ - # Progress Reporters - "ConsoleReporter", - "NullProgressReporter", - "PrintProgressReporter", - "ProgressReporter", - "ReporterType", - "RichProgressReporter", - "StatusLogger", - "create_progress_reporter", -] diff --git a/graphrag/logging/base.py b/graphrag/logging/base.py new file mode 100644 index 0000000000..3afb69aaba --- /dev/null +++ b/graphrag/logging/base.py @@ -0,0 +1,69 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base classes for logging and progress reporting.""" + +from abc import ABC, abstractmethod +from typing import Any + +from datashaper.progress.types import Progress + + +class StatusLogger(ABC): + """Provides a way to report status updates from the pipeline.""" + + @abstractmethod + def error(self, message: str, details: dict[str, Any] | None = None): + """Report an error.""" + + @abstractmethod + def warning(self, message: str, details: dict[str, Any] | None = None): + """Report a warning.""" + + @abstractmethod + def log(self, message: str, details: dict[str, Any] | None = None): + """Report a log.""" + + +class ProgressReporter(ABC): + """ + Abstract base class for progress reporters. + + This is used to report workflow processing progress via mechanisms like progress-bars. + """ + + @abstractmethod + def __call__(self, update: Progress): + """Update progress.""" + + @abstractmethod + def dispose(self): + """Dispose of the progress reporter.""" + + @abstractmethod + def child(self, prefix: str, transient=True) -> "ProgressReporter": + """Create a child progress bar.""" + + @abstractmethod + def force_refresh(self) -> None: + """Force a refresh.""" + + @abstractmethod + def stop(self) -> None: + """Stop the progress reporter.""" + + @abstractmethod + def error(self, message: str) -> None: + """Report an error.""" + + @abstractmethod + def warning(self, message: str) -> None: + """Report a warning.""" + + @abstractmethod + def info(self, message: str) -> None: + """Report information.""" + + @abstractmethod + def success(self, message: str) -> None: + """Report success.""" diff --git a/graphrag/logging/console.py b/graphrag/logging/console.py index b00a7e8d9c..e42269e645 100644 --- a/graphrag/logging/console.py +++ b/graphrag/logging/console.py @@ -5,7 +5,7 @@ from typing import Any -from .types import StatusLogger +from graphrag.logging.base import StatusLogger class ConsoleReporter(StatusLogger): diff --git a/graphrag/logging/factories.py b/graphrag/logging/factories.py index efd69b7550..9deefb3207 100644 --- a/graphrag/logging/factories.py +++ b/graphrag/logging/factories.py @@ -3,13 +3,11 @@ """Factory functions for creating loggers.""" -from .null_progress import NullProgressReporter -from .print_progress import PrintProgressReporter -from .rich_progress import RichProgressReporter -from .types import ( - ProgressReporter, - ReporterType, -) +from graphrag.logging.base import ProgressReporter +from graphrag.logging.null_progress import NullProgressReporter +from graphrag.logging.print_progress import PrintProgressReporter +from graphrag.logging.rich_progress import RichProgressReporter +from graphrag.logging.types import ReporterType def create_progress_reporter( diff --git a/graphrag/logging/null_progress.py b/graphrag/logging/null_progress.py index 0539c5c014..4d46400170 100644 --- a/graphrag/logging/null_progress.py +++ b/graphrag/logging/null_progress.py @@ -3,7 +3,7 @@ """Null Progress Reporter.""" -from .types import Progress, ProgressReporter +from graphrag.logging.base import Progress, ProgressReporter class NullProgressReporter(ProgressReporter): diff --git a/graphrag/logging/print_progress.py b/graphrag/logging/print_progress.py index d529e0dfd6..20c45dd38b 100644 --- a/graphrag/logging/print_progress.py +++ b/graphrag/logging/print_progress.py @@ -3,7 +3,7 @@ """Print Progress Reporter.""" -from .types import Progress, ProgressReporter +from graphrag.logging.base import Progress, ProgressReporter class PrintProgressReporter(ProgressReporter): diff --git a/graphrag/logging/rich_progress.py b/graphrag/logging/rich_progress.py index 362b64f0c8..f83261dbd6 100644 --- a/graphrag/logging/rich_progress.py +++ b/graphrag/logging/rich_progress.py @@ -13,7 +13,7 @@ from rich.spinner import Spinner from rich.tree import Tree -from .types import ProgressReporter +from graphrag.logging.base import ProgressReporter # https://stackoverflow.com/a/34325723 diff --git a/graphrag/logging/types.py b/graphrag/logging/types.py index 3ba50e5bd4..d852a47e8d 100644 --- a/graphrag/logging/types.py +++ b/graphrag/logging/types.py @@ -3,11 +3,7 @@ """Types for status reporting.""" -from abc import ABC, abstractmethod from enum import Enum -from typing import Any - -from datashaper import Progress class ReporterType(str, Enum): @@ -20,63 +16,3 @@ class ReporterType(str, Enum): def __str__(self): """Return the string representation of the enum value.""" return self.value - - -class StatusLogger(ABC): - """Provides a way to report status updates from the pipeline.""" - - @abstractmethod - def error(self, message: str, details: dict[str, Any] | None = None): - """Report an error.""" - - @abstractmethod - def warning(self, message: str, details: dict[str, Any] | None = None): - """Report a warning.""" - - @abstractmethod - def log(self, message: str, details: dict[str, Any] | None = None): - """Report a log.""" - - -class ProgressReporter(ABC): - """ - Abstract base class for progress reporters. - - This is used to report workflow processing progress via mechanisms like progress-bars. - """ - - @abstractmethod - def __call__(self, update: Progress): - """Update progress.""" - - @abstractmethod - def dispose(self): - """Dispose of the progress reporter.""" - - @abstractmethod - def child(self, prefix: str, transient=True) -> "ProgressReporter": - """Create a child progress bar.""" - - @abstractmethod - def force_refresh(self) -> None: - """Force a refresh.""" - - @abstractmethod - def stop(self) -> None: - """Stop the progress reporter.""" - - @abstractmethod - def error(self, message: str) -> None: - """Report an error.""" - - @abstractmethod - def warning(self, message: str) -> None: - """Report a warning.""" - - @abstractmethod - def info(self, message: str) -> None: - """Report information.""" - - @abstractmethod - def success(self, message: str) -> None: - """Report success.""" diff --git a/graphrag/model/__init__.py b/graphrag/model/__init__.py index 9dbec3d1dd..6523d9d916 100644 --- a/graphrag/model/__init__.py +++ b/graphrag/model/__init__.py @@ -1,31 +1,4 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -""" -GraphRAG knowledge model package root. - -The GraphRAG knowledge model contains a set of classes that represent the target datamodels for our pipelines and analytics tools. -These models can be augmented and integrated into your own data infrastructure to suit your needs. -""" - -from .community import Community -from .community_report import CommunityReport -from .covariate import Covariate -from .document import Document -from .entity import Entity -from .identified import Identified -from .named import Named -from .relationship import Relationship -from .text_unit import TextUnit - -__all__ = [ - "Community", - "CommunityReport", - "Covariate", - "Document", - "Entity", - "Identified", - "Named", - "Relationship", - "TextUnit", -] +"""GraphRAG knowledge model package root.""" diff --git a/graphrag/model/community.py b/graphrag/model/community.py index 041aaa5e47..43d6c4033a 100644 --- a/graphrag/model/community.py +++ b/graphrag/model/community.py @@ -6,7 +6,7 @@ from dataclasses import dataclass from typing import Any -from .named import Named +from graphrag.model.named import Named @dataclass diff --git a/graphrag/model/community_report.py b/graphrag/model/community_report.py index 53c35a5117..9216fb68d9 100644 --- a/graphrag/model/community_report.py +++ b/graphrag/model/community_report.py @@ -6,7 +6,7 @@ from dataclasses import dataclass from typing import Any -from .named import Named +from graphrag.model.named import Named @dataclass diff --git a/graphrag/model/covariate.py b/graphrag/model/covariate.py index 484ea16fae..0ce188e497 100644 --- a/graphrag/model/covariate.py +++ b/graphrag/model/covariate.py @@ -6,7 +6,7 @@ from dataclasses import dataclass from typing import Any -from .identified import Identified +from graphrag.model.identified import Identified @dataclass diff --git a/graphrag/model/document.py b/graphrag/model/document.py index 2980318376..ec2b2d4523 100644 --- a/graphrag/model/document.py +++ b/graphrag/model/document.py @@ -6,7 +6,7 @@ from dataclasses import dataclass, field from typing import Any -from .named import Named +from graphrag.model.named import Named @dataclass diff --git a/graphrag/model/entity.py b/graphrag/model/entity.py index a152abf2a5..4c45dfbc40 100644 --- a/graphrag/model/entity.py +++ b/graphrag/model/entity.py @@ -6,7 +6,7 @@ from dataclasses import dataclass from typing import Any -from .named import Named +from graphrag.model.named import Named @dataclass diff --git a/graphrag/model/named.py b/graphrag/model/named.py index 5352c77c96..245fb5d333 100644 --- a/graphrag/model/named.py +++ b/graphrag/model/named.py @@ -5,7 +5,7 @@ from dataclasses import dataclass -from .identified import Identified +from graphrag.model.identified import Identified @dataclass diff --git a/graphrag/model/relationship.py b/graphrag/model/relationship.py index 54fb20c31c..ee9b24c1f6 100644 --- a/graphrag/model/relationship.py +++ b/graphrag/model/relationship.py @@ -6,7 +6,7 @@ from dataclasses import dataclass from typing import Any -from .identified import Identified +from graphrag.model.identified import Identified @dataclass diff --git a/graphrag/model/text_unit.py b/graphrag/model/text_unit.py index b54ee9e5f8..4ad3b9e8d4 100644 --- a/graphrag/model/text_unit.py +++ b/graphrag/model/text_unit.py @@ -6,7 +6,7 @@ from dataclasses import dataclass from typing import Any -from .identified import Identified +from graphrag.model.identified import Identified @dataclass diff --git a/graphrag/prompt_tune/__init__.py b/graphrag/prompt_tune/__init__.py index 2384b5793c..6997787e61 100644 --- a/graphrag/prompt_tune/__init__.py +++ b/graphrag/prompt_tune/__init__.py @@ -1,4 +1,4 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""Command line interface for the fine_tune module.""" +"""The prompt-tuning package root.""" diff --git a/graphrag/prompt_tune/defaults.py b/graphrag/prompt_tune/defaults.py new file mode 100644 index 0000000000..e72c82e1f6 --- /dev/null +++ b/graphrag/prompt_tune/defaults.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Default values for the prompt-tuning module. + +Note: These values get accessed from the CLI to set default behavior. +To maintain fast responsiveness from the CLI, do not add long-running code in this file and be mindful of imports. +""" + +DEFAULT_TASK = """ +Identify the relations and structure of the community of interest, specifically within the {domain} domain. +""" + +K = 15 +MAX_TOKEN_COUNT = 2000 +MIN_CHUNK_SIZE = 200 +N_SUBSET_MAX = 300 +MIN_CHUNK_OVERLAP = 0 diff --git a/graphrag/prompt_tune/generator/__init__.py b/graphrag/prompt_tune/generator/__init__.py index df45b46033..8f144052ac 100644 --- a/graphrag/prompt_tune/generator/__init__.py +++ b/graphrag/prompt_tune/generator/__init__.py @@ -2,29 +2,3 @@ # Licensed under the MIT License """Prompt generation module.""" - -from .community_report_rating import generate_community_report_rating -from .community_report_summarization import create_community_summarization_prompt -from .community_reporter_role import generate_community_reporter_role -from .defaults import MAX_TOKEN_COUNT -from .domain import generate_domain -from .entity_extraction_prompt import create_entity_extraction_prompt -from .entity_relationship import generate_entity_relationship_examples -from .entity_summarization_prompt import create_entity_summarization_prompt -from .entity_types import generate_entity_types -from .language import detect_language -from .persona import generate_persona - -__all__ = [ - "MAX_TOKEN_COUNT", - "create_community_summarization_prompt", - "create_entity_extraction_prompt", - "create_entity_summarization_prompt", - "detect_language", - "generate_community_report_rating", - "generate_community_reporter_role", - "generate_domain", - "generate_entity_relationship_examples", - "generate_entity_types", - "generate_persona", -] diff --git a/graphrag/prompt_tune/generator/community_report_rating.py b/graphrag/prompt_tune/generator/community_report_rating.py index 59f94d5698..23d7cc6832 100644 --- a/graphrag/prompt_tune/generator/community_report_rating.py +++ b/graphrag/prompt_tune/generator/community_report_rating.py @@ -4,7 +4,7 @@ # Licensed under the MIT License from graphrag.llm.types.llm_types import CompletionLLM -from graphrag.prompt_tune.prompt import ( +from graphrag.prompt_tune.prompt.community_report_rating import ( GENERATE_REPORT_RATING_PROMPT, ) diff --git a/graphrag/prompt_tune/generator/community_report_summarization.py b/graphrag/prompt_tune/generator/community_report_summarization.py index b0c0b614d2..4d2d0da846 100644 --- a/graphrag/prompt_tune/generator/community_report_summarization.py +++ b/graphrag/prompt_tune/generator/community_report_summarization.py @@ -5,7 +5,9 @@ from pathlib import Path -from graphrag.prompt_tune.template import COMMUNITY_REPORT_SUMMARIZATION_PROMPT +from graphrag.prompt_tune.template.community_report_summarization import ( + COMMUNITY_REPORT_SUMMARIZATION_PROMPT, +) COMMUNITY_SUMMARIZATION_FILENAME = "community_report.txt" diff --git a/graphrag/prompt_tune/generator/community_reporter_role.py b/graphrag/prompt_tune/generator/community_reporter_role.py index 9abd5ed83f..f16a6c3dd4 100644 --- a/graphrag/prompt_tune/generator/community_reporter_role.py +++ b/graphrag/prompt_tune/generator/community_reporter_role.py @@ -4,7 +4,7 @@ """Generate a community reporter role for community summarization.""" from graphrag.llm.types.llm_types import CompletionLLM -from graphrag.prompt_tune.prompt import ( +from graphrag.prompt_tune.prompt.community_reporter_role import ( GENERATE_COMMUNITY_REPORTER_ROLE_PROMPT, ) diff --git a/graphrag/prompt_tune/generator/defaults.py b/graphrag/prompt_tune/generator/defaults.py deleted file mode 100644 index 5b42f81332..0000000000 --- a/graphrag/prompt_tune/generator/defaults.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Default values for the fine-tuning module.""" - -DEFAULT_TASK = """ -Identify the relations and structure of the community of interest, specifically within the {domain} domain. -""" - -MAX_TOKEN_COUNT = 2000 diff --git a/graphrag/prompt_tune/generator/entity_extraction_prompt.py b/graphrag/prompt_tune/generator/entity_extraction_prompt.py index 806e310915..a170642995 100644 --- a/graphrag/prompt_tune/generator/entity_extraction_prompt.py +++ b/graphrag/prompt_tune/generator/entity_extraction_prompt.py @@ -7,7 +7,7 @@ import graphrag.config.defaults as defs from graphrag.index.utils.tokens import num_tokens_from_string -from graphrag.prompt_tune.template import ( +from graphrag.prompt_tune.template.entity_extraction import ( EXAMPLE_EXTRACTION_TEMPLATE, GRAPH_EXTRACTION_JSON_PROMPT, GRAPH_EXTRACTION_PROMPT, diff --git a/graphrag/prompt_tune/generator/entity_relationship.py b/graphrag/prompt_tune/generator/entity_relationship.py index 2733e3bd74..f8862bd6ef 100644 --- a/graphrag/prompt_tune/generator/entity_relationship.py +++ b/graphrag/prompt_tune/generator/entity_relationship.py @@ -7,7 +7,7 @@ import json from graphrag.llm.types.llm_types import CompletionLLM -from graphrag.prompt_tune.prompt import ( +from graphrag.prompt_tune.prompt.entity_relationship import ( ENTITY_RELATIONSHIPS_GENERATION_JSON_PROMPT, ENTITY_RELATIONSHIPS_GENERATION_PROMPT, UNTYPED_ENTITY_RELATIONSHIPS_GENERATION_PROMPT, diff --git a/graphrag/prompt_tune/generator/entity_summarization_prompt.py b/graphrag/prompt_tune/generator/entity_summarization_prompt.py index 736df830d6..979e5b0a6a 100644 --- a/graphrag/prompt_tune/generator/entity_summarization_prompt.py +++ b/graphrag/prompt_tune/generator/entity_summarization_prompt.py @@ -5,7 +5,9 @@ from pathlib import Path -from graphrag.prompt_tune.template import ENTITY_SUMMARIZATION_PROMPT +from graphrag.prompt_tune.template.entity_summarization import ( + ENTITY_SUMMARIZATION_PROMPT, +) ENTITY_SUMMARIZATION_FILENAME = "summarize_descriptions.txt" diff --git a/graphrag/prompt_tune/generator/entity_types.py b/graphrag/prompt_tune/generator/entity_types.py index 42518acd8c..51ac0020e0 100644 --- a/graphrag/prompt_tune/generator/entity_types.py +++ b/graphrag/prompt_tune/generator/entity_types.py @@ -4,7 +4,7 @@ """Entity type generation module for fine-tuning.""" from graphrag.llm.types.llm_types import CompletionLLM -from graphrag.prompt_tune.generator.defaults import DEFAULT_TASK +from graphrag.prompt_tune.defaults import DEFAULT_TASK from graphrag.prompt_tune.prompt.entity_types import ( ENTITY_TYPE_GENERATION_JSON_PROMPT, ENTITY_TYPE_GENERATION_PROMPT, diff --git a/graphrag/prompt_tune/generator/language.py b/graphrag/prompt_tune/generator/language.py index 38de531ca3..d803df9c54 100644 --- a/graphrag/prompt_tune/generator/language.py +++ b/graphrag/prompt_tune/generator/language.py @@ -4,7 +4,7 @@ """Language detection for GraphRAG prompts.""" from graphrag.llm.types.llm_types import CompletionLLM -from graphrag.prompt_tune.prompt import DETECT_LANGUAGE_PROMPT +from graphrag.prompt_tune.prompt.language import DETECT_LANGUAGE_PROMPT async def detect_language(llm: CompletionLLM, docs: str | list[str]) -> str: diff --git a/graphrag/prompt_tune/generator/persona.py b/graphrag/prompt_tune/generator/persona.py index cdd57a655d..c66cc4a717 100644 --- a/graphrag/prompt_tune/generator/persona.py +++ b/graphrag/prompt_tune/generator/persona.py @@ -4,8 +4,8 @@ """Persona generating module for fine-tuning GraphRAG prompts.""" from graphrag.llm.types.llm_types import CompletionLLM -from graphrag.prompt_tune.generator.defaults import DEFAULT_TASK -from graphrag.prompt_tune.prompt import GENERATE_PERSONA_PROMPT +from graphrag.prompt_tune.defaults import DEFAULT_TASK +from graphrag.prompt_tune.prompt.persona import GENERATE_PERSONA_PROMPT async def generate_persona( diff --git a/graphrag/prompt_tune/loader/__init__.py b/graphrag/prompt_tune/loader/__init__.py index bc8026e92d..7c7a6f88ff 100644 --- a/graphrag/prompt_tune/loader/__init__.py +++ b/graphrag/prompt_tune/loader/__init__.py @@ -2,11 +2,3 @@ # Licensed under the MIT License """Fine-tuning config and data loader module.""" - -from .input import MIN_CHUNK_OVERLAP, MIN_CHUNK_SIZE, load_docs_in_chunks - -__all__ = [ - "MIN_CHUNK_OVERLAP", - "MIN_CHUNK_SIZE", - "load_docs_in_chunks", -] diff --git a/graphrag/prompt_tune/loader/input.py b/graphrag/prompt_tune/loader/input.py index 5fd5719666..eb8ad8f8f6 100644 --- a/graphrag/prompt_tune/loader/input.py +++ b/graphrag/prompt_tune/loader/input.py @@ -9,18 +9,19 @@ import graphrag.config.defaults as defs from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.index.input import load_input -from graphrag.index.llm import load_llm_embeddings +from graphrag.index.input.load_input import load_input +from graphrag.index.llm.load_llm import load_llm_embeddings from graphrag.index.operations.chunk_text import chunk_text from graphrag.llm.types.llm_types import EmbeddingLLM -from graphrag.logging import ProgressReporter +from graphrag.logging.base import ProgressReporter +from graphrag.prompt_tune.defaults import ( + MIN_CHUNK_OVERLAP, + MIN_CHUNK_SIZE, + N_SUBSET_MAX, + K, +) from graphrag.prompt_tune.types import DocSelectionType -MIN_CHUNK_OVERLAP = 0 -MIN_CHUNK_SIZE = 200 -N_SUBSET_MAX = 300 -K = 15 - async def _embed_chunks( text_chunks: pd.DataFrame, diff --git a/graphrag/prompt_tune/prompt/__init__.py b/graphrag/prompt_tune/prompt/__init__.py index 991d52856e..497c56dda5 100644 --- a/graphrag/prompt_tune/prompt/__init__.py +++ b/graphrag/prompt_tune/prompt/__init__.py @@ -1,32 +1,4 @@ -"""Persona, entity type, relationships and domain generation prompts module.""" - # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -from .community_report_rating import GENERATE_REPORT_RATING_PROMPT -from .community_reporter_role import GENERATE_COMMUNITY_REPORTER_ROLE_PROMPT -from .domain import GENERATE_DOMAIN_PROMPT -from .entity_relationship import ( - ENTITY_RELATIONSHIPS_GENERATION_JSON_PROMPT, - ENTITY_RELATIONSHIPS_GENERATION_PROMPT, - UNTYPED_ENTITY_RELATIONSHIPS_GENERATION_PROMPT, -) -from .entity_types import ( - ENTITY_TYPE_GENERATION_JSON_PROMPT, - ENTITY_TYPE_GENERATION_PROMPT, -) -from .language import DETECT_LANGUAGE_PROMPT -from .persona import GENERATE_PERSONA_PROMPT - -__all__ = [ - "DETECT_LANGUAGE_PROMPT", - "ENTITY_RELATIONSHIPS_GENERATION_JSON_PROMPT", - "ENTITY_RELATIONSHIPS_GENERATION_PROMPT", - "ENTITY_TYPE_GENERATION_JSON_PROMPT", - "ENTITY_TYPE_GENERATION_PROMPT", - "GENERATE_COMMUNITY_REPORTER_ROLE_PROMPT", - "GENERATE_DOMAIN_PROMPT", - "GENERATE_PERSONA_PROMPT", - "GENERATE_REPORT_RATING_PROMPT", - "UNTYPED_ENTITY_RELATIONSHIPS_GENERATION_PROMPT", -] +"""Persona, entity type, relationships and domain generation prompts module.""" diff --git a/graphrag/prompt_tune/template/__init__.py b/graphrag/prompt_tune/template/__init__.py index e056762ff7..f830ce2a9e 100644 --- a/graphrag/prompt_tune/template/__init__.py +++ b/graphrag/prompt_tune/template/__init__.py @@ -2,23 +2,3 @@ # Licensed under the MIT License """Fine-tuning prompts for entity extraction, entity summarization, and community report summarization.""" - -from .community_report_summarization import COMMUNITY_REPORT_SUMMARIZATION_PROMPT -from .entity_extraction import ( - EXAMPLE_EXTRACTION_TEMPLATE, - GRAPH_EXTRACTION_JSON_PROMPT, - GRAPH_EXTRACTION_PROMPT, - UNTYPED_EXAMPLE_EXTRACTION_TEMPLATE, - UNTYPED_GRAPH_EXTRACTION_PROMPT, -) -from .entity_summarization import ENTITY_SUMMARIZATION_PROMPT - -__all__ = [ - "COMMUNITY_REPORT_SUMMARIZATION_PROMPT", - "ENTITY_SUMMARIZATION_PROMPT", - "EXAMPLE_EXTRACTION_TEMPLATE", - "GRAPH_EXTRACTION_JSON_PROMPT", - "GRAPH_EXTRACTION_PROMPT", - "UNTYPED_EXAMPLE_EXTRACTION_TEMPLATE", - "UNTYPED_GRAPH_EXTRACTION_PROMPT", -] diff --git a/graphrag/query/__init__.py b/graphrag/query/__init__.py index 58a557f8a2..effd81e123 100644 --- a/graphrag/query/__init__.py +++ b/graphrag/query/__init__.py @@ -1,4 +1,4 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""GraphRAG Orchestration Module.""" +"""The query engine package root.""" diff --git a/graphrag/query/context_builder/community_context.py b/graphrag/query/context_builder/community_context.py index b9357b9854..287edb48e2 100644 --- a/graphrag/query/context_builder/community_context.py +++ b/graphrag/query/context_builder/community_context.py @@ -10,7 +10,8 @@ import pandas as pd import tiktoken -from graphrag.model import CommunityReport, Entity +from graphrag.model.community_report import CommunityReport +from graphrag.model.entity import Entity from graphrag.query.llm.text_utils import num_tokens log = logging.getLogger(__name__) diff --git a/graphrag/query/context_builder/dynamic_community_selection.py b/graphrag/query/context_builder/dynamic_community_selection.py index 12a92ef7f0..a17cfdc27a 100644 --- a/graphrag/query/context_builder/dynamic_community_selection.py +++ b/graphrag/query/context_builder/dynamic_community_selection.py @@ -12,7 +12,8 @@ import tiktoken -from graphrag.model import Community, CommunityReport +from graphrag.model.community import Community +from graphrag.model.community_report import CommunityReport from graphrag.query.context_builder.rate_prompt import RATE_QUERY from graphrag.query.context_builder.rate_relevancy import rate_relevancy from graphrag.query.llm.base import BaseLLM diff --git a/graphrag/query/context_builder/entity_extraction.py b/graphrag/query/context_builder/entity_extraction.py index f7e1fbfe18..dd2ec63c27 100644 --- a/graphrag/query/context_builder/entity_extraction.py +++ b/graphrag/query/context_builder/entity_extraction.py @@ -5,14 +5,15 @@ from enum import Enum -from graphrag.model import Entity, Relationship +from graphrag.model.entity import Entity +from graphrag.model.relationship import Relationship from graphrag.query.input.retrieval.entities import ( get_entity_by_id, get_entity_by_key, get_entity_by_name, ) from graphrag.query.llm.base import BaseTextEmbedding -from graphrag.vector_stores import BaseVectorStore +from graphrag.vector_stores.base import BaseVectorStore class EntityVectorStoreKey(str, Enum): diff --git a/graphrag/query/context_builder/local_context.py b/graphrag/query/context_builder/local_context.py index 78522af5a9..7cb61e3e8c 100644 --- a/graphrag/query/context_builder/local_context.py +++ b/graphrag/query/context_builder/local_context.py @@ -9,7 +9,9 @@ import pandas as pd import tiktoken -from graphrag.model import Covariate, Entity, Relationship +from graphrag.model.covariate import Covariate +from graphrag.model.entity import Entity +from graphrag.model.relationship import Relationship from graphrag.query.input.retrieval.covariates import ( get_candidate_covariates, to_covariate_dataframe, diff --git a/graphrag/query/context_builder/source_context.py b/graphrag/query/context_builder/source_context.py index 4d63db58e9..b8ba86aee4 100644 --- a/graphrag/query/context_builder/source_context.py +++ b/graphrag/query/context_builder/source_context.py @@ -9,7 +9,8 @@ import pandas as pd import tiktoken -from graphrag.model import Relationship, TextUnit +from graphrag.model.relationship import Relationship +from graphrag.model.text_unit import TextUnit from graphrag.query.llm.text_utils import num_tokens """ diff --git a/graphrag/query/factories.py b/graphrag/query/factories.py index 2e8a3afd4d..b854569b92 100644 --- a/graphrag/query/factories.py +++ b/graphrag/query/factories.py @@ -7,15 +7,13 @@ import tiktoken -from graphrag.config import GraphRagConfig -from graphrag.model import ( - Community, - CommunityReport, - Covariate, - Entity, - Relationship, - TextUnit, -) +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.model.community import Community +from graphrag.model.community_report import CommunityReport +from graphrag.model.covariate import Covariate +from graphrag.model.entity import Entity +from graphrag.model.relationship import Relationship +from graphrag.model.text_unit import TextUnit from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey from graphrag.query.llm.get_client import get_llm, get_text_embedder from graphrag.query.structured_search.drift_search.drift_context import ( @@ -30,7 +28,7 @@ LocalSearchMixedContext, ) from graphrag.query.structured_search.local_search.search import LocalSearch -from graphrag.vector_stores import BaseVectorStore +from graphrag.vector_stores.base import BaseVectorStore def get_local_search_engine( diff --git a/graphrag/query/indexer_adapters.py b/graphrag/query/indexer_adapters.py index 9bd73d6531..478fe385d2 100644 --- a/graphrag/query/indexer_adapters.py +++ b/graphrag/query/indexer_adapters.py @@ -13,14 +13,12 @@ from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.operations.summarize_communities import restore_community_hierarchy -from graphrag.model import ( - Community, - CommunityReport, - Covariate, - Entity, - Relationship, - TextUnit, -) +from graphrag.model.community import Community +from graphrag.model.community_report import CommunityReport +from graphrag.model.covariate import Covariate +from graphrag.model.entity import Entity +from graphrag.model.relationship import Relationship +from graphrag.model.text_unit import TextUnit from graphrag.query.factories import get_text_embedder from graphrag.query.input.loaders.dfs import ( read_communities, diff --git a/graphrag/query/input/loaders/dfs.py b/graphrag/query/input/loaders/dfs.py index f144ad8a47..55af4c2d3f 100644 --- a/graphrag/query/input/loaders/dfs.py +++ b/graphrag/query/input/loaders/dfs.py @@ -5,14 +5,12 @@ import pandas as pd -from graphrag.model import ( - Community, - CommunityReport, - Covariate, - Entity, - Relationship, - TextUnit, -) +from graphrag.model.community import Community +from graphrag.model.community_report import CommunityReport +from graphrag.model.covariate import Covariate +from graphrag.model.entity import Entity +from graphrag.model.relationship import Relationship +from graphrag.model.text_unit import TextUnit from graphrag.query.input.loaders.utils import ( to_optional_dict, to_optional_float, @@ -21,7 +19,7 @@ to_optional_str, to_str, ) -from graphrag.vector_stores import BaseVectorStore, VectorStoreDocument +from graphrag.vector_stores.base import BaseVectorStore, VectorStoreDocument def read_entities( diff --git a/graphrag/query/input/retrieval/community_reports.py b/graphrag/query/input/retrieval/community_reports.py index bd4933f1f9..7fb38b4f96 100644 --- a/graphrag/query/input/retrieval/community_reports.py +++ b/graphrag/query/input/retrieval/community_reports.py @@ -7,7 +7,8 @@ import pandas as pd -from graphrag.model import CommunityReport, Entity +from graphrag.model.community_report import CommunityReport +from graphrag.model.entity import Entity def get_candidate_communities( diff --git a/graphrag/query/input/retrieval/covariates.py b/graphrag/query/input/retrieval/covariates.py index 1c45203d01..4ca5ba13f1 100644 --- a/graphrag/query/input/retrieval/covariates.py +++ b/graphrag/query/input/retrieval/covariates.py @@ -7,7 +7,8 @@ import pandas as pd -from graphrag.model import Covariate, Entity +from graphrag.model.covariate import Covariate +from graphrag.model.entity import Entity def get_candidate_covariates( diff --git a/graphrag/query/input/retrieval/entities.py b/graphrag/query/input/retrieval/entities.py index 41c92fab31..0384ceaf90 100644 --- a/graphrag/query/input/retrieval/entities.py +++ b/graphrag/query/input/retrieval/entities.py @@ -9,7 +9,7 @@ import pandas as pd -from graphrag.model import Entity +from graphrag.model.entity import Entity def get_entity_by_id(entities: dict[str, Entity], value: str) -> Entity | None: diff --git a/graphrag/query/input/retrieval/relationships.py b/graphrag/query/input/retrieval/relationships.py index 2dec596ff3..86ddd9efd1 100644 --- a/graphrag/query/input/retrieval/relationships.py +++ b/graphrag/query/input/retrieval/relationships.py @@ -7,7 +7,8 @@ import pandas as pd -from graphrag.model import Entity, Relationship +from graphrag.model.entity import Entity +from graphrag.model.relationship import Relationship def get_in_network_relationships( diff --git a/graphrag/query/input/retrieval/text_units.py b/graphrag/query/input/retrieval/text_units.py index a00dc20a0a..1a0305bc3d 100644 --- a/graphrag/query/input/retrieval/text_units.py +++ b/graphrag/query/input/retrieval/text_units.py @@ -7,7 +7,8 @@ import pandas as pd -from graphrag.model import Entity, TextUnit +from graphrag.model.entity import Entity +from graphrag.model.text_unit import TextUnit def get_candidate_text_units( diff --git a/graphrag/query/llm/get_client.py b/graphrag/query/llm/get_client.py index 12baf5d1cf..5b9dbfbbc2 100644 --- a/graphrag/query/llm/get_client.py +++ b/graphrag/query/llm/get_client.py @@ -5,7 +5,8 @@ from azure.identity import DefaultAzureCredential, get_bearer_token_provider -from graphrag.config import GraphRagConfig, LLMType +from graphrag.config.enums import LLMType +from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.query.llm.oai.chat_openai import ChatOpenAI from graphrag.query.llm.oai.embedding import OpenAIEmbedding from graphrag.query.llm.oai.typing import OpenaiApiType diff --git a/graphrag/query/llm/oai/__init__.py b/graphrag/query/llm/oai/__init__.py index cbb257905e..910766bdfb 100644 --- a/graphrag/query/llm/oai/__init__.py +++ b/graphrag/query/llm/oai/__init__.py @@ -2,20 +2,3 @@ # Licensed under the MIT License """GraphRAG Orchestration OpenAI Wrappers.""" - -from .base import BaseOpenAILLM, OpenAILLMImpl, OpenAITextEmbeddingImpl -from .chat_openai import ChatOpenAI -from .embedding import OpenAIEmbedding -from .openai import OpenAI -from .typing import OPENAI_RETRY_ERROR_TYPES, OpenaiApiType - -__all__ = [ - "OPENAI_RETRY_ERROR_TYPES", - "BaseOpenAILLM", - "ChatOpenAI", - "OpenAI", - "OpenAIEmbedding", - "OpenAILLMImpl", - "OpenAITextEmbeddingImpl", - "OpenaiApiType", -] diff --git a/graphrag/query/llm/oai/base.py b/graphrag/query/llm/oai/base.py index 08a90d98a4..0bdea9c1b3 100644 --- a/graphrag/query/llm/oai/base.py +++ b/graphrag/query/llm/oai/base.py @@ -8,7 +8,8 @@ from openai import AsyncAzureOpenAI, AsyncOpenAI, AzureOpenAI, OpenAI -from graphrag.logging import ConsoleReporter, StatusLogger +from graphrag.logging.base import StatusLogger +from graphrag.logging.console import ConsoleReporter from graphrag.query.llm.base import BaseTextEmbedding from graphrag.query.llm.oai.typing import OpenaiApiType diff --git a/graphrag/query/llm/oai/chat_openai.py b/graphrag/query/llm/oai/chat_openai.py index 621ebecebe..8daadd750b 100644 --- a/graphrag/query/llm/oai/chat_openai.py +++ b/graphrag/query/llm/oai/chat_openai.py @@ -15,7 +15,7 @@ wait_exponential_jitter, ) -from graphrag.logging import StatusLogger +from graphrag.logging.base import StatusLogger from graphrag.query.llm.base import BaseLLM, BaseLLMCallback from graphrag.query.llm.oai.base import OpenAILLMImpl from graphrag.query.llm.oai.typing import ( diff --git a/graphrag/query/llm/oai/embedding.py b/graphrag/query/llm/oai/embedding.py index 6b39a0017f..006a9588b6 100644 --- a/graphrag/query/llm/oai/embedding.py +++ b/graphrag/query/llm/oai/embedding.py @@ -18,7 +18,7 @@ wait_exponential_jitter, ) -from graphrag.logging import StatusLogger +from graphrag.logging.base import StatusLogger from graphrag.query.llm.base import BaseTextEmbedding from graphrag.query.llm.oai.base import OpenAILLMImpl from graphrag.query.llm.oai.typing import ( diff --git a/graphrag/query/structured_search/drift_search/drift_context.py b/graphrag/query/structured_search/drift_search/drift_context.py index d2a271bdac..2ab19fc63b 100644 --- a/graphrag/query/structured_search/drift_search/drift_context.py +++ b/graphrag/query/structured_search/drift_search/drift_context.py @@ -11,14 +11,12 @@ import pandas as pd import tiktoken -from graphrag.config.models.drift_config import DRIFTSearchConfig -from graphrag.model import ( - CommunityReport, - Covariate, - Entity, - Relationship, - TextUnit, -) +from graphrag.config.models.drift_search_config import DRIFTSearchConfig +from graphrag.model.community_report import CommunityReport +from graphrag.model.covariate import Covariate +from graphrag.model.entity import Entity +from graphrag.model.relationship import Relationship +from graphrag.model.text_unit import TextUnit from graphrag.prompts.query.drift_search_system_prompt import ( DRIFT_LOCAL_SYSTEM_PROMPT, ) @@ -30,7 +28,7 @@ from graphrag.query.structured_search.local_search.mixed_context import ( LocalSearchMixedContext, ) -from graphrag.vector_stores import BaseVectorStore +from graphrag.vector_stores.base import BaseVectorStore log = logging.getLogger(__name__) diff --git a/graphrag/query/structured_search/drift_search/primer.py b/graphrag/query/structured_search/drift_search/primer.py index b3d2b26891..8f3895a25c 100644 --- a/graphrag/query/structured_search/drift_search/primer.py +++ b/graphrag/query/structured_search/drift_search/primer.py @@ -13,8 +13,8 @@ import tiktoken from tqdm.asyncio import tqdm_asyncio -from graphrag.config.models.drift_config import DRIFTSearchConfig -from graphrag.model import CommunityReport +from graphrag.config.models.drift_search_config import DRIFTSearchConfig +from graphrag.model.community_report import CommunityReport from graphrag.prompts.query.drift_search_system_prompt import ( DRIFT_PRIMER_PROMPT, ) diff --git a/graphrag/query/structured_search/drift_search/search.py b/graphrag/query/structured_search/drift_search/search.py index 936ea173c5..57ce4265b3 100644 --- a/graphrag/query/structured_search/drift_search/search.py +++ b/graphrag/query/structured_search/drift_search/search.py @@ -11,7 +11,7 @@ import tiktoken from tqdm.asyncio import tqdm_asyncio -from graphrag.config.models.drift_config import DRIFTSearchConfig +from graphrag.config.models.drift_search_config import DRIFTSearchConfig from graphrag.query.context_builder.conversation_history import ConversationHistory from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey from graphrag.query.llm.oai.chat_openai import ChatOpenAI diff --git a/graphrag/query/structured_search/global_search/community_context.py b/graphrag/query/structured_search/global_search/community_context.py index 0e22ad60c8..1bc17655bf 100644 --- a/graphrag/query/structured_search/global_search/community_context.py +++ b/graphrag/query/structured_search/global_search/community_context.py @@ -7,7 +7,9 @@ import tiktoken -from graphrag.model import Community, CommunityReport, Entity +from graphrag.model.community import Community +from graphrag.model.community_report import CommunityReport +from graphrag.model.entity import Entity from graphrag.query.context_builder.builders import ContextBuilderResult from graphrag.query.context_builder.community_context import ( build_community_context, diff --git a/graphrag/query/structured_search/local_search/mixed_context.py b/graphrag/query/structured_search/local_search/mixed_context.py index ebebfd34aa..1dbf38e66b 100644 --- a/graphrag/query/structured_search/local_search/mixed_context.py +++ b/graphrag/query/structured_search/local_search/mixed_context.py @@ -9,13 +9,11 @@ import pandas as pd import tiktoken -from graphrag.model import ( - CommunityReport, - Covariate, - Entity, - Relationship, - TextUnit, -) +from graphrag.model.community_report import CommunityReport +from graphrag.model.covariate import Covariate +from graphrag.model.entity import Entity +from graphrag.model.relationship import Relationship +from graphrag.model.text_unit import TextUnit from graphrag.query.context_builder.builders import ContextBuilderResult from graphrag.query.context_builder.community_context import ( build_community_context, @@ -44,7 +42,7 @@ from graphrag.query.llm.base import BaseTextEmbedding from graphrag.query.llm.text_utils import num_tokens from graphrag.query.structured_search.base import LocalContextBuilder -from graphrag.vector_stores import BaseVectorStore +from graphrag.vector_stores.base import BaseVectorStore log = logging.getLogger(__name__) diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 904736944e..58f07c356e 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -13,7 +13,7 @@ PipelineFileStorageConfig, PipelineStorageConfigTypes, ) -from graphrag.index.storage import load_storage +from graphrag.index.storage.load_storage import load_storage from graphrag.index.storage.pipeline_storage import PipelineStorage log = logging.getLogger(__name__) diff --git a/graphrag/vector_stores/__init__.py b/graphrag/vector_stores/__init__.py index 560db06349..c1d54b741b 100644 --- a/graphrag/vector_stores/__init__.py +++ b/graphrag/vector_stores/__init__.py @@ -2,18 +2,3 @@ # Licensed under the MIT License """A module containing vector storage implementations.""" - -from graphrag.vector_stores.base import ( - BaseVectorStore, - VectorStoreDocument, - VectorStoreSearchResult, -) -from graphrag.vector_stores.factory import VectorStoreFactory, VectorStoreType - -__all__ = [ - "BaseVectorStore", - "VectorStoreDocument", - "VectorStoreFactory", - "VectorStoreSearchResult", - "VectorStoreType", -] diff --git a/graphrag/vector_stores/azure_ai_search.py b/graphrag/vector_stores/azure_ai_search.py index f35e41dfcb..eebf2fa05e 100644 --- a/graphrag/vector_stores/azure_ai_search.py +++ b/graphrag/vector_stores/azure_ai_search.py @@ -25,8 +25,7 @@ from azure.search.documents.models import VectorizedQuery from graphrag.model.types import TextEmbedder - -from .base import ( +from graphrag.vector_stores.base import ( DEFAULT_VECTOR_SIZE, BaseVectorStore, VectorStoreDocument, diff --git a/graphrag/vector_stores/factory.py b/graphrag/vector_stores/factory.py index 564533bacb..174a5c98d0 100644 --- a/graphrag/vector_stores/factory.py +++ b/graphrag/vector_stores/factory.py @@ -6,8 +6,8 @@ from enum import Enum from typing import ClassVar -from .azure_ai_search import AzureAISearch -from .lancedb import LanceDBVectorStore +from graphrag.vector_stores.azure_ai_search import AzureAISearch +from graphrag.vector_stores.lancedb import LanceDBVectorStore class VectorStoreType(str, Enum): diff --git a/graphrag/vector_stores/lancedb.py b/graphrag/vector_stores/lancedb.py index 3cc3ea20e5..b334f4753b 100644 --- a/graphrag/vector_stores/lancedb.py +++ b/graphrag/vector_stores/lancedb.py @@ -10,7 +10,7 @@ from graphrag.model.types import TextEmbedder -from .base import ( +from graphrag.vector_stores.base import ( BaseVectorStore, VectorStoreDocument, VectorStoreSearchResult, diff --git a/mkdocs.yaml b/mkdocs.yaml index 0f8a0a794c..01e8a1e9e5 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -30,13 +30,6 @@ nav: - Architecture: "index/architecture.md" - Dataflow: "index/default_dataflow.md" - Outputs: "index/outputs.md" - - Configuration: - - Overview: "config/overview.md" - - Init Command: "config/init.md" - - Using Env Vars: "config/env_vars.md" - - Using JSON or YAML: "config/json_yaml.md" - - Fully Custom: "config/custom.md" - - Template: "config/template.md" - Prompt Tuning: - Overview: "prompt_tuning/overview.md" - Auto Tuning: "prompt_tuning/auto_prompt_tuning.md" @@ -52,9 +45,14 @@ nav: - Global Search: "examples_notebooks/global_search.ipynb" - Local Search: "examples_notebooks/local_search.ipynb" - DRIFT Search: "examples_notebooks/drift_search.ipynb" - - Microsoft Research Blog: "blog_posts.md" + - Configuration: + - Overview: "config/overview.md" + - Init Command: "config/init.md" + - Using YAML: "config/yaml.md" + - Using Env Vars: "config/env_vars.md" + - CLI: "cli.md" - Extras: - - CLI: "cli.md" + - Microsoft Research Blog: "blog_posts.md" - Visualization Guide: "visualization_guide.md" - Operation Dulce: - About: "data/operation_dulce/ABOUT.md" diff --git a/pyproject.toml b/pyproject.toml index ce82715bf5..e92ae626df 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "graphrag" # Maintainers: do not change the version here manually, use ./scripts/release.sh -version = "0.4.1" +version = "0.5.0" description = "GraphRAG: A graph-based retrieval-augmented generation (RAG) system." authors = [ "Alonso Guevara Fernández ", diff --git a/tests/unit/config/test_default_config.py b/tests/unit/config/test_default_config.py index 6e57ce3bb8..3c636f5cd3 100644 --- a/tests/unit/config/test_default_config.py +++ b/tests/unit/config/test_default_config.py @@ -13,64 +13,82 @@ from pydantic import ValidationError import graphrag.config.defaults as defs -from graphrag.config import ( +from graphrag.config.create_graphrag_config import create_graphrag_config +from graphrag.config.enums import ( + CacheType, + InputFileType, + InputType, + ReportingType, + StorageType, +) +from graphrag.config.errors import ( ApiKeyMissingError, AzureApiBaseMissingError, AzureDeploymentNameMissingError, - CacheConfig, - CacheConfigInput, - CacheType, - ChunkingConfig, - ChunkingConfigInput, - ClaimExtractionConfig, +) +from graphrag.config.input_models.cache_config_input import CacheConfigInput +from graphrag.config.input_models.chunking_config_input import ChunkingConfigInput +from graphrag.config.input_models.claim_extraction_config_input import ( ClaimExtractionConfigInput, - ClusterGraphConfig, +) +from graphrag.config.input_models.cluster_graph_config_input import ( ClusterGraphConfigInput, - CommunityReportsConfig, +) +from graphrag.config.input_models.community_reports_config_input import ( CommunityReportsConfigInput, - DRIFTSearchConfig, - EmbedGraphConfig, - EmbedGraphConfigInput, - EntityExtractionConfig, +) +from graphrag.config.input_models.embed_graph_config_input import EmbedGraphConfigInput +from graphrag.config.input_models.entity_extraction_config_input import ( EntityExtractionConfigInput, - GlobalSearchConfig, - GraphRagConfig, - GraphRagConfigInput, - InputConfig, - InputConfigInput, - InputFileType, - InputType, - LLMParameters, - LLMParametersInput, - LocalSearchConfig, - ParallelizationParameters, - ReportingConfig, - ReportingConfigInput, - ReportingType, - SnapshotsConfig, - SnapshotsConfigInput, - StorageConfig, - StorageConfigInput, - StorageType, - SummarizeDescriptionsConfig, +) +from graphrag.config.input_models.graphrag_config_input import GraphRagConfigInput +from graphrag.config.input_models.input_config_input import InputConfigInput +from graphrag.config.input_models.llm_parameters_input import LLMParametersInput +from graphrag.config.input_models.reporting_config_input import ReportingConfigInput +from graphrag.config.input_models.snapshots_config_input import SnapshotsConfigInput +from graphrag.config.input_models.storage_config_input import StorageConfigInput +from graphrag.config.input_models.summarize_descriptions_config_input import ( SummarizeDescriptionsConfigInput, - TextEmbeddingConfig, +) +from graphrag.config.input_models.text_embedding_config_input import ( TextEmbeddingConfigInput, - UmapConfig, - UmapConfigInput, - create_graphrag_config, ) -from graphrag.index import ( - PipelineConfig, +from graphrag.config.input_models.umap_config_input import UmapConfigInput +from graphrag.config.models.cache_config import CacheConfig +from graphrag.config.models.chunking_config import ChunkingConfig +from graphrag.config.models.claim_extraction_config import ClaimExtractionConfig +from graphrag.config.models.cluster_graph_config import ClusterGraphConfig +from graphrag.config.models.community_reports_config import CommunityReportsConfig +from graphrag.config.models.drift_search_config import DRIFTSearchConfig +from graphrag.config.models.embed_graph_config import EmbedGraphConfig +from graphrag.config.models.entity_extraction_config import EntityExtractionConfig +from graphrag.config.models.global_search_config import GlobalSearchConfig +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.config.models.input_config import InputConfig +from graphrag.config.models.llm_parameters import LLMParameters +from graphrag.config.models.local_search_config import LocalSearchConfig +from graphrag.config.models.parallelization_parameters import ParallelizationParameters +from graphrag.config.models.reporting_config import ReportingConfig +from graphrag.config.models.snapshots_config import SnapshotsConfig +from graphrag.config.models.storage_config import StorageConfig +from graphrag.config.models.summarize_descriptions_config import ( + SummarizeDescriptionsConfig, +) +from graphrag.config.models.text_embedding_config import TextEmbeddingConfig +from graphrag.config.models.umap_config import UmapConfig +from graphrag.index.config.cache import PipelineFileCacheConfig +from graphrag.index.config.input import ( PipelineCSVInputConfig, - PipelineFileCacheConfig, - PipelineFileReportingConfig, - PipelineFileStorageConfig, PipelineInputConfig, PipelineTextInputConfig, +) +from graphrag.index.config.pipeline import ( + PipelineConfig, PipelineWorkflowReference, - create_pipeline_config, ) +from graphrag.index.config.reporting import PipelineFileReportingConfig +from graphrag.index.config.storage import PipelineFileStorageConfig +from graphrag.index.create_pipeline_config import create_pipeline_config current_dir = os.path.dirname(__file__) diff --git a/tests/unit/indexing/cache/test_file_pipeline_cache.py b/tests/unit/indexing/cache/test_file_pipeline_cache.py index ada3239602..ff63056edf 100644 --- a/tests/unit/indexing/cache/test_file_pipeline_cache.py +++ b/tests/unit/indexing/cache/test_file_pipeline_cache.py @@ -4,9 +4,7 @@ import os import unittest -from graphrag.index.cache import ( - JsonPipelineCache, -) +from graphrag.index.cache.json_pipeline_cache import JsonPipelineCache from graphrag.index.storage.file_pipeline_storage import ( FilePipelineStorage, ) diff --git a/tests/unit/indexing/config/helpers.py b/tests/unit/indexing/config/helpers.py index 580d0a9fa7..f70b9af81e 100644 --- a/tests/unit/indexing/config/helpers.py +++ b/tests/unit/indexing/config/helpers.py @@ -4,8 +4,8 @@ import unittest from typing import Any -from graphrag.config import create_graphrag_config -from graphrag.index import PipelineConfig, create_pipeline_config +from graphrag.config.create_graphrag_config import create_graphrag_config +from graphrag.index.create_pipeline_config import PipelineConfig, create_pipeline_config def assert_contains_default_config( diff --git a/tests/unit/indexing/config/test_load.py b/tests/unit/indexing/config/test_load.py index 78f6a93a0a..636525b320 100644 --- a/tests/unit/indexing/config/test_load.py +++ b/tests/unit/indexing/config/test_load.py @@ -7,12 +7,10 @@ from typing import Any from unittest import mock -from graphrag.config import create_graphrag_config -from graphrag.index import ( - PipelineConfig, - create_pipeline_config, - load_pipeline_config, -) +from graphrag.config.create_graphrag_config import create_graphrag_config +from graphrag.index.config.pipeline import PipelineConfig +from graphrag.index.create_pipeline_config import create_pipeline_config +from graphrag.index.load_pipeline_config import load_pipeline_config current_dir = os.path.dirname(__file__) diff --git a/tests/unit/indexing/test_exports.py b/tests/unit/indexing/test_exports.py index 232dfbbdf3..ee2b23e622 100644 --- a/tests/unit/indexing/test_exports.py +++ b/tests/unit/indexing/test_exports.py @@ -1,10 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -from graphrag.index import ( - create_pipeline_config, - run_pipeline, - run_pipeline_with_config, -) +from graphrag.index.create_pipeline_config import create_pipeline_config +from graphrag.index.run import run_pipeline, run_pipeline_with_config def test_exported_functions(): diff --git a/tests/unit/indexing/test_init_content.py b/tests/unit/indexing/test_init_content.py index eeb641cbf6..8e6d8d3fdb 100644 --- a/tests/unit/indexing/test_init_content.py +++ b/tests/unit/indexing/test_init_content.py @@ -6,11 +6,9 @@ import yaml -from graphrag.config import ( - GraphRagConfig, - create_graphrag_config, -) -from graphrag.index.init_content import INIT_YAML +from graphrag.config.create_graphrag_config import create_graphrag_config +from graphrag.config.init_content import INIT_YAML +from graphrag.config.models.graph_rag_config import GraphRagConfig def test_init_yaml(): diff --git a/tests/unit/indexing/workflows/test_emit.py b/tests/unit/indexing/workflows/test_emit.py index 5c16f66cbf..2d17bb199b 100644 --- a/tests/unit/indexing/workflows/test_emit.py +++ b/tests/unit/indexing/workflows/test_emit.py @@ -11,9 +11,10 @@ create_verb_result, ) -from graphrag.index.config import PipelineWorkflowReference +from graphrag.index.config.pipeline import PipelineWorkflowReference from graphrag.index.run import run_pipeline -from graphrag.index.storage import MemoryPipelineStorage, PipelineStorage +from graphrag.index.storage.memory_pipeline_storage import MemoryPipelineStorage +from graphrag.index.storage.pipeline_storage import PipelineStorage async def mock_verb( diff --git a/tests/unit/indexing/workflows/test_load.py b/tests/unit/indexing/workflows/test_load.py index 6d037d51a5..60ae6647b4 100644 --- a/tests/unit/indexing/workflows/test_load.py +++ b/tests/unit/indexing/workflows/test_load.py @@ -4,7 +4,7 @@ import pytest -from graphrag.index.config import PipelineWorkflowReference +from graphrag.index.config.pipeline import PipelineWorkflowReference from graphrag.index.errors import UnknownWorkflowError from graphrag.index.workflows.load import create_workflow, load_workflows diff --git a/tests/unit/query/context_builder/test_entity_extraction.py b/tests/unit/query/context_builder/test_entity_extraction.py index 969a16ff0a..b796bd9f33 100644 --- a/tests/unit/query/context_builder/test_entity_extraction.py +++ b/tests/unit/query/context_builder/test_entity_extraction.py @@ -3,14 +3,14 @@ from typing import Any -from graphrag.model import Entity +from graphrag.model.entity import Entity from graphrag.model.types import TextEmbedder from graphrag.query.context_builder.entity_extraction import ( EntityVectorStoreKey, map_query_to_entities, ) from graphrag.query.llm.base import BaseTextEmbedding -from graphrag.vector_stores import ( +from graphrag.vector_stores.base import ( BaseVectorStore, VectorStoreDocument, VectorStoreSearchResult, diff --git a/tests/unit/query/input/retrieval/test_entities.py b/tests/unit/query/input/retrieval/test_entities.py index a66e3432b9..f7175882e2 100644 --- a/tests/unit/query/input/retrieval/test_entities.py +++ b/tests/unit/query/input/retrieval/test_entities.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -from graphrag.model import Entity +from graphrag.model.entity import Entity from graphrag.query.input.retrieval.entities import ( get_entity_by_id, get_entity_by_key, diff --git a/tests/verbs/util.py b/tests/verbs/util.py index c53c4e5be4..6ce7b478dc 100644 --- a/tests/verbs/util.py +++ b/tests/verbs/util.py @@ -7,12 +7,10 @@ from datashaper import Workflow from pandas.testing import assert_series_equal -from graphrag.config import create_graphrag_config -from graphrag.index import ( - PipelineWorkflowConfig, - create_pipeline_config, -) +from graphrag.config.create_graphrag_config import create_graphrag_config +from graphrag.index.config.workflow import PipelineWorkflowConfig from graphrag.index.context import PipelineRunContext +from graphrag.index.create_pipeline_config import create_pipeline_config from graphrag.index.run.utils import create_run_context pd.set_option("display.max_columns", None) diff --git a/v1-breaking-changes.md b/v1-breaking-changes.md index f289735579..a2ec67a5c7 100644 --- a/v1-breaking-changes.md +++ b/v1-breaking-changes.md @@ -54,4 +54,4 @@ reporting: base_dir: "output" # changed from "output/${timestamp}/reports" ``` -[Full docs on using JSON or YAML files for configuration](https://microsoft.github.io/graphrag/config/json_yaml/). +[Full docs on using YAML files for configuration](https://microsoft.github.io/graphrag/config/yaml/). From 6eb61342c0ba602ca677ce982d5ce8888768cb2b Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 18 Nov 2024 11:52:22 -0500 Subject: [PATCH 023/104] fixed more merge conflicts --- graphrag/index/cache/load_cache.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/graphrag/index/cache/load_cache.py b/graphrag/index/cache/load_cache.py index e074114a8d..488f8f6d69 100644 --- a/graphrag/index/cache/load_cache.py +++ b/graphrag/index/cache/load_cache.py @@ -18,7 +18,6 @@ from graphrag.index.storage.file_pipeline_storage import FilePipelineStorage if TYPE_CHECKING: - from graphrag.index.config.cache import ( from graphrag.index.config.cache import ( PipelineCacheConfig, ) @@ -26,9 +25,6 @@ from graphrag.index.cache.json_pipeline_cache import JsonPipelineCache from graphrag.index.cache.memory_pipeline_cache import create_memory_cache from graphrag.index.cache.noop_pipeline_cache import NoopPipelineCache -from graphrag.index.cache.json_pipeline_cache import JsonPipelineCache -from graphrag.index.cache.memory_pipeline_cache import create_memory_cache -from graphrag.index.cache.noop_pipeline_cache import NoopPipelineCache def load_cache(config: PipelineCacheConfig | None, root_dir: str | None): From 31c0a7a3168b7fff33bbc725b6e132b030dfa160 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 18 Nov 2024 14:53:06 -0500 Subject: [PATCH 024/104] added cosmosdb functionality to query pipeline --- graphrag/cli/main.py | 9 +++++++ graphrag/cli/query.py | 59 +++++++++++++++++++++++-------------------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/graphrag/cli/main.py b/graphrag/cli/main.py index 919015ae31..7a8ca78ef2 100644 --- a/graphrag/cli/main.py +++ b/graphrag/cli/main.py @@ -417,6 +417,12 @@ def _query_cli( help="Free form text describing the response type and format, can be anything, e.g. Multiple Paragraphs, Single Paragraph, Single Sentence, List of 3-7 Points, Single Page, Multi-Page Report. Default: Multiple Paragraphs" ), ] = "Multiple Paragraphs", + output_filetype: Annotated[ + str, + typer.Option( + help="The file type of the indexing outputs, e.g. parquet, json, csv. Default: parquet", + ), + ] = "parquet", streaming: Annotated[ bool, typer.Option(help="Print response in a streaming manner.") ] = False, @@ -432,6 +438,7 @@ def _query_cli( root_dir=root, community_level=community_level, response_type=response_type, + output_filetype=output_filetype, streaming=streaming, query=query, ) @@ -443,6 +450,7 @@ def _query_cli( community_level=community_level, dynamic_community_selection=dynamic_community_selection, response_type=response_type, + output_filetype=output_filetype, streaming=streaming, query=query, ) @@ -452,6 +460,7 @@ def _query_cli( data_dir=data, root_dir=root, community_level=community_level, + output_filetype=output_filetype, streaming=False, # Drift search does not support streaming (yet) query=query, ) diff --git a/graphrag/cli/query.py b/graphrag/cli/query.py index ea9116c695..af1509755b 100644 --- a/graphrag/cli/query.py +++ b/graphrag/cli/query.py @@ -27,6 +27,7 @@ def run_global_search( community_level: int | None, dynamic_community_selection: bool, response_type: str, + output_filetype: str, streaming: bool, query: str, ): @@ -39,14 +40,14 @@ def run_global_search( config.storage.base_dir = str(data_dir) if data_dir else config.storage.base_dir resolve_paths(config) - dataframe_dict = _resolve_parquet_files( + dataframe_dict = _resolve_output_files( root_dir=root_dir, config=config, - parquet_list=[ - "create_final_nodes.parquet", - "create_final_entities.parquet", - "create_final_communities.parquet", - "create_final_community_reports.parquet", + output_list=[ + f"create_final_nodes.{output_filetype}", + f"create_final_entities.{output_filetype}", + f"create_final_communities.{output_filetype}", + f"create_final_community_reports.{output_filetype}", ], optional_list=[], ) @@ -112,6 +113,7 @@ def run_local_search( root_dir: Path, community_level: int, response_type: str, + output_filetype: str, streaming: bool, query: str, ): @@ -125,18 +127,18 @@ def run_local_search( resolve_paths(config) # TODO remove optional create_final_entities_description_embeddings.parquet to delete backwards compatibility - dataframe_dict = _resolve_parquet_files( + dataframe_dict = _resolve_output_files( root_dir=root_dir, config=config, - parquet_list=[ - "create_final_nodes.parquet", - "create_final_community_reports.parquet", - "create_final_text_units.parquet", - "create_final_relationships.parquet", - "create_final_entities.parquet", + output_list=[ + f"create_final_nodes.{output_filetype}", + f"create_final_community_reports.{output_filetype}", + f"create_final_text_units.{output_filetype}", + f"create_final_relationships.{output_filetype}", + f"create_final_entities.{output_filetype}", ], optional_list=[ - "create_final_covariates.parquet", + f"create_final_covariates.{output_filetype}", ], ) final_nodes: pd.DataFrame = dataframe_dict["create_final_nodes"] @@ -204,6 +206,7 @@ def run_drift_search( data_dir: Path | None, root_dir: Path, community_level: int, + output_filetype: str, streaming: bool, query: str, ): @@ -216,15 +219,15 @@ def run_drift_search( config.storage.base_dir = str(data_dir) if data_dir else config.storage.base_dir resolve_paths(config) - dataframe_dict = _resolve_parquet_files( + dataframe_dict = _resolve_output_files( root_dir=root_dir, config=config, - parquet_list=[ - "create_final_nodes.parquet", - "create_final_community_reports.parquet", - "create_final_text_units.parquet", - "create_final_relationships.parquet", - "create_final_entities.parquet", + output_list=[ + f"create_final_nodes.{output_filetype}", + f"create_final_community_reports.{output_filetype}", + f"create_final_text_units.{output_filetype}", + f"create_final_relationships.{output_filetype}", + f"create_final_entities.{output_filetype}", ], ) final_nodes: pd.DataFrame = dataframe_dict["create_final_nodes"] @@ -260,24 +263,24 @@ def run_drift_search( return response, context_data -def _resolve_parquet_files( +def _resolve_output_files( root_dir: Path, config: GraphRagConfig, - parquet_list: list[str], + output_list: list[str], optional_list: list[str] | None = None, ) -> dict[str, pd.DataFrame]: - """Read parquet files to a dataframe dict.""" + """Read indexing output files to a dataframe dict.""" dataframe_dict = {} pipeline_config = create_pipeline_config(config) storage_obj = _create_storage(root_dir=root_dir, config=pipeline_config.storage) - for parquet_file in parquet_list: - df_key = parquet_file.split(".")[0] + for output_file in output_list: + df_key = output_file.split(".")[0] df_value = asyncio.run( - _load_table_from_storage(name=parquet_file, storage=storage_obj) + _load_table_from_storage(name=output_file, storage=storage_obj) ) dataframe_dict[df_key] = df_value - # for optional parquet files, set the dict entry to None instead of erroring out if it does not exist + # for optional output files, set the dict entry to None instead of erroring out if it does not exist if optional_list: for optional_file in optional_list: file_exists = asyncio.run(storage_obj.has(optional_file)) From c5281bb79af83cdae0f614f935fa1506b2c7f265 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 19 Nov 2024 14:45:59 -0500 Subject: [PATCH 025/104] tested query for cosmosdb --- graphrag/index/emit/parquet_table_emitter.py | 2 +- graphrag/query/input/loaders/utils.py | 3 +-- graphrag/utils/storage.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/graphrag/index/emit/parquet_table_emitter.py b/graphrag/index/emit/parquet_table_emitter.py index 1ba61713c0..068e8d08b1 100644 --- a/graphrag/index/emit/parquet_table_emitter.py +++ b/graphrag/index/emit/parquet_table_emitter.py @@ -21,12 +21,12 @@ class ParquetTableEmitter(TableEmitter): _storage: PipelineStorage _on_error: ErrorHandlerFn + extension = "parquet" def __init__( self, storage: PipelineStorage, on_error: ErrorHandlerFn, - extension = "parquet", ): """Create a new Parquet Table Emitter.""" self._storage = storage diff --git a/graphrag/query/input/loaders/utils.py b/graphrag/query/input/loaders/utils.py index 3c680f0faa..3878232985 100644 --- a/graphrag/query/input/loaders/utils.py +++ b/graphrag/query/input/loaders/utils.py @@ -165,8 +165,7 @@ def to_optional_float(data: pd.Series, column_name: str | None) -> float | None: if value is None: return None if not isinstance(value, float): - msg = f"value is not a float: {value} ({type(value)})" - raise ValueError(msg) + return float(value) else: msg = f"Column {column_name} not found in data" raise ValueError(msg) diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 58f07c356e..b902a85148 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -52,7 +52,7 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) case "json": return pd.read_json( - StringIO(await storage.get(name, as_bytes=True)), + StringIO(await storage.get(name)), lines=False, orient="records", ) From 76511d01806e6e7e919ecb1892e48ec3df7e7c34 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 19 Nov 2024 15:30:59 -0500 Subject: [PATCH 026/104] collapsed cosmosdb schema to use minimal containers and databases --- graphrag/index/cache/load_cache.py | 2 +- graphrag/index/config/cache.py | 9 +++++++-- graphrag/index/config/storage.py | 5 +++++ graphrag/index/create_pipeline_config.py | 12 +++++++++++- graphrag/index/storage/cosmosdb_pipeline_storage.py | 10 +--------- graphrag/index/storage/load_storage.py | 8 ++++---- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/graphrag/index/cache/load_cache.py b/graphrag/index/cache/load_cache.py index 488f8f6d69..7cfc89205a 100644 --- a/graphrag/index/cache/load_cache.py +++ b/graphrag/index/cache/load_cache.py @@ -54,7 +54,7 @@ def load_cache(config: PipelineCacheConfig | None, root_dir: str | None): storage = create_cosmosdb_storage( cosmosdb_account_url=config.cosmosdb_account_url, connection_string=config.connection_string, - container_name=None, + container_name=config.container_name, base_dir=config.base_dir, ) return JsonPipelineCache(storage) diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 9582a92598..23522436e6 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -80,9 +80,14 @@ class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb """The type of cache.""" base_dir: str = pydantic_Field( - description="The base directory for the cache.", default=None + description="The cosmosdb database name for the cache.", default=None ) - """The base directory for the cache.""" + """The cosmosdb database name for the cache.""" + + container_name: str = pydantic_Field( + description="The container name for cache.", default=None + ) + """The container name for cache.""" connection_string: str | None = pydantic_Field( description="The cosmosdb primary key for the cache.", default=None diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index b0cb8a64e1..b0f833d816 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -77,6 +77,11 @@ class PipelineCosmosDBStorageConfig(PipelineStorageConfig[Literal[StorageType.co ) """The cosmosdb storage primary key for the storage.""" + container_name: str = pydantic_Field( + description="The container name for storage", default=None + ) + """The container name for storage.""" + base_dir: str = pydantic_Field( description="The base directory for the storage.", default=None ) diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 1cf605748c..f05f58e059 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -421,16 +421,21 @@ def _get_storage_config( cosmosdb_account_url = storage_settings.cosmosdb_account_url connection_string = storage_settings.connection_string base_dir = storage_settings.base_dir + container_name = storage_settings.container_name if cosmosdb_account_url is None: msg = "CosmosDB account url must be provided for cosmosdb storage." raise ValueError(msg) if base_dir is None: msg = "Base directory must be provided for cosmosdb storage." raise ValueError(msg) + if container_name is None: + msg = "Container name must be provided for cosmosdb storage." + raise ValueError(msg) return PipelineCosmosDBStorageConfig( cosmosdb_account_url=cosmosdb_account_url, connection_string=connection_string, base_dir=storage_settings.base_dir, + container_name=container_name, ) case _: # relative to the root_dir @@ -473,16 +478,21 @@ def _get_cache_config( cosmosdb_account_url = settings.cache.cosmosdb_account_url connection_string = settings.cache.connection_string base_dir = settings.cache.base_dir + container_name = settings.cache.container_name if base_dir is None: msg = "Base directory must be provided for cosmosdb cache." raise ValueError(msg) + if container_name is None: + msg = "Container name must be provided for cosmosdb cache." + raise ValueError(msg) if connection_string is None and cosmosdb_account_url is None: msg = "Connection string or cosmosDB account url must be provided for cosmosdb cache." raise ValueError(msg) return PipelineCosmosDBCacheConfig( cosmosdb_account_url=cosmosdb_account_url, connection_string=connection_string, - base_dir=settings.cache.base_dir, + base_dir=base_dir, + container_name=container_name, ) case _: # relative to root dir diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index e16f2523d4..be3aa1a16c 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -254,15 +254,7 @@ def keys(self) -> list[str]: def child(self, name: str | None) -> "PipelineStorage": """Create a child storage instance.""" - if name is None: - return self - return CosmosDBPipelineStorage( - cosmosdb_account_url=self._cosmosdb_account_url, - connection_string=self._connection_string, - database_name=self._database_name, - encoding=self._encoding, - current_container=name, - ) + return self def create_container(self) -> None: """Create a container for the current container name if it doesn't exist.""" diff --git a/graphrag/index/storage/load_storage.py b/graphrag/index/storage/load_storage.py index d2fe0230a6..e08df0f1cc 100644 --- a/graphrag/index/storage/load_storage.py +++ b/graphrag/index/storage/load_storage.py @@ -36,10 +36,10 @@ def load_storage(config: PipelineStorageConfig): case StorageType.cosmosdb: config = cast(PipelineCosmosDBStorageConfig, config) return create_cosmosdb_storage( - config.cosmosdb_account_url, - config.connection_string, - config.base_dir, - config.base_dir, + connection_string=config.connection_string, + cosmosdb_account_url=config.cosmosdb_account_url, + container_name=config.container_name, + base_dir=config.base_dir, ) case StorageType.file: config = cast(PipelineFileStorageConfig, config) From 232cd077627a6dc9d64e62d20072d8077f1f4949 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 20 Nov 2024 14:26:18 -0500 Subject: [PATCH 027/104] simplified create_database and create_container functions --- .../storage/cosmosdb_pipeline_storage.py | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index be3aa1a16c..72b5324047 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -79,13 +79,8 @@ def __init__( def create_database(self) -> None: """Create the database if it doesn't exist.""" - if not self.database_exists(): - database_name = self._database_name - database_names = [ - database["id"] for database in self._cosmos_client.list_databases() - ] - if database_name not in database_names: - self._cosmos_client.create_database(database_name) + database_name = self._database_name + self._cosmos_client.create_database_if_not_exists(id=database_name) def delete_database(self) -> None: """Delete the database if it exists.""" @@ -259,17 +254,12 @@ def child(self, name: str | None) -> "PipelineStorage": def create_container(self) -> None: """Create a container for the current container name if it doesn't exist.""" database_client = self._database_client - if not self.container_exists() and self._current_container is not None: - container_names = [ - container["id"] - for container in database_client.list_containers() - ] - if self._current_container not in container_names: - partition_key = PartitionKey(path="/id", kind="Hash") - database_client.create_container( + if self._current_container is not None: + partition_key = PartitionKey(path="/id", kind="Hash") + database_client.create_container_if_not_exists( id=self._current_container, partition_key=partition_key, - ) + ) def delete_container(self) -> None: From 297373ba534a2a6f730a7a9150ecb90fea027c65 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Thu, 21 Nov 2024 15:23:09 -0500 Subject: [PATCH 028/104] ruff fixes and semversioner --- .../patch-20241121202210026640.json | 4 + .../config/input_models/cache_config_input.py | 1 - .../input_models/storage_config_input.py | 1 - graphrag/config/models/storage_config.py | 1 - graphrag/index/config/cache.py | 2 + graphrag/index/config/storage.py | 10 ++- graphrag/index/emit/table_emitter.py | 2 +- .../storage/cosmosdb_pipeline_storage.py | 76 +++++++++---------- 8 files changed, 52 insertions(+), 45 deletions(-) create mode 100644 .semversioner/next-release/patch-20241121202210026640.json diff --git a/.semversioner/next-release/patch-20241121202210026640.json b/.semversioner/next-release/patch-20241121202210026640.json new file mode 100644 index 0000000000..ac65aaf814 --- /dev/null +++ b/.semversioner/next-release/patch-20241121202210026640.json @@ -0,0 +1,4 @@ +{ + "type": "patch", + "description": "Implement cosmosdb storage option for cache and output" +} diff --git a/graphrag/config/input_models/cache_config_input.py b/graphrag/config/input_models/cache_config_input.py index 2ca4f3aad3..4c1ba35c57 100644 --- a/graphrag/config/input_models/cache_config_input.py +++ b/graphrag/config/input_models/cache_config_input.py @@ -17,4 +17,3 @@ class CacheConfigInput(TypedDict): container_name: NotRequired[str | None] storage_account_blob_url: NotRequired[str | None] cosmosdb_account_url: NotRequired[str | None] - diff --git a/graphrag/config/input_models/storage_config_input.py b/graphrag/config/input_models/storage_config_input.py index 729a041939..4b0e85a2e5 100644 --- a/graphrag/config/input_models/storage_config_input.py +++ b/graphrag/config/input_models/storage_config_input.py @@ -17,4 +17,3 @@ class StorageConfigInput(TypedDict): container_name: NotRequired[str | None] storage_account_blob_url: NotRequired[str | None] cosmosdb_account_url: NotRequired[str | None] - diff --git a/graphrag/config/models/storage_config.py b/graphrag/config/models/storage_config.py index 552c91ca83..445a22b9a1 100644 --- a/graphrag/config/models/storage_config.py +++ b/graphrag/config/models/storage_config.py @@ -31,4 +31,3 @@ class StorageConfig(BaseModel): cosmosdb_account_url: str | None = Field( description="The cosmosdb account url to use.", default=None ) - diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 23522436e6..37e7ca0e28 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -73,6 +73,7 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): ) """The storage account blob url for cache""" + class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb]]): """Represents the cosmosdb cache configuration for the pipeline.""" @@ -99,6 +100,7 @@ class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb ) """The cosmosdb account url for cache""" + PipelineCacheConfigTypes = ( PipelineFileCacheConfig | PipelineMemoryCacheConfig diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index b0f833d816..bbcb9f863a 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -66,7 +66,10 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] ) """The storage account blob url.""" -class PipelineCosmosDBStorageConfig(PipelineStorageConfig[Literal[StorageType.cosmosdb]]): + +class PipelineCosmosDBStorageConfig( + PipelineStorageConfig[Literal[StorageType.cosmosdb]] +): """Represents the cosmosdb storage configuration for the pipeline.""" type: Literal[StorageType.cosmosdb] = StorageType.cosmosdb @@ -94,5 +97,8 @@ class PipelineCosmosDBStorageConfig(PipelineStorageConfig[Literal[StorageType.co PipelineStorageConfigTypes = ( - PipelineFileStorageConfig | PipelineMemoryStorageConfig | PipelineBlobStorageConfig | PipelineCosmosDBStorageConfig + PipelineFileStorageConfig + | PipelineMemoryStorageConfig + | PipelineBlobStorageConfig + | PipelineCosmosDBStorageConfig ) diff --git a/graphrag/index/emit/table_emitter.py b/graphrag/index/emit/table_emitter.py index 8e108f460f..82e37d3135 100644 --- a/graphrag/index/emit/table_emitter.py +++ b/graphrag/index/emit/table_emitter.py @@ -12,6 +12,6 @@ class TableEmitter(Protocol): """TableEmitter protocol for emitting tables to a destination.""" extension: str - + async def emit(self, name: str, data: pd.DataFrame) -> None: """Emit a dataframe to storage.""" diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index 72b5324047..bd3dc86e03 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -1,4 +1,4 @@ - #Copyright (c) 2024 Microsoft Corporation. +# Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License """Azure CosmosDB Storage implementation of PipelineStorage.""" @@ -22,6 +22,7 @@ log = logging.getLogger(__name__) + class CosmosDBPipelineStorage(PipelineStorage): """The CosmosDB-Storage Implementation.""" @@ -41,12 +42,12 @@ def __init__( ): """Initialize the CosmosDB-Storage.""" if connection_string: - self._cosmos_client = CosmosClient.from_connection_string( - connection_string - ) + self._cosmos_client = CosmosClient.from_connection_string(connection_string) else: if cosmosdb_account_url is None: - msg = "Either connection_string or cosmosdb_accoun_url must be provided." + msg = ( + "Either connection_string or cosmosdb_accoun_url must be provided." + ) raise ValueError(msg) self._cosmos_client = CosmosClient( @@ -76,7 +77,7 @@ def __init__( self.create_database() if self._current_container is not None: self.create_container() - + def create_database(self) -> None: """Create the database if it doesn't exist.""" database_name = self._database_name @@ -94,7 +95,7 @@ def database_exists(self) -> bool: database["id"] for database in self._cosmos_client.list_databases() ] return database_name in database_names - + def find( self, file_pattern: re.Pattern[str], @@ -126,18 +127,26 @@ def find( def item_filter(item: dict[str, Any]) -> bool: if file_filter is None: return True - return all(re.match(value, item.get(key, "")) for key, value in file_filter.items()) + return all( + re.match(value, item.get(key, "")) for key, value in file_filter.items() + ) try: database_client = self._database_client - container_client = database_client.get_container_client(str(self._current_container)) + container_client = database_client.get_container_client( + str(self._current_container) + ) query = "SELECT * FROM c WHERE CONTAINS(c.id, @pattern)" - parameters: list[dict[str, Any]] = [{"name": "@pattern", "value": file_pattern.pattern}] + parameters: list[dict[str, Any]] = [ + {"name": "@pattern", "value": file_pattern.pattern} + ] if file_filter: for key, value in file_filter.items(): query += f" AND c.{key} = @{key}" parameters.append({"name": f"@{key}", "value": value}) - items = container_client.query_items(query=query, parameters=parameters, enable_cross_partition_query=True) + items = container_client.query_items( + query=query, parameters=parameters, enable_cross_partition_query=True + ) num_loaded = 0 num_total = len(list(items)) num_filtered = 0 @@ -159,7 +168,9 @@ def item_filter(item: dict[str, Any]) -> bool: _create_progress_status(num_loaded, num_filtered, num_total) ) except Exception: - log.exception("An error occurred while searching for documents in Cosmos DB.") + log.exception( + "An error occurred while searching for documents in Cosmos DB." + ) async def get( self, key: str, as_bytes: bool | None = None, encoding: str | None = None @@ -176,9 +187,7 @@ async def get( item_json_str = json.dumps(item_body) if as_bytes: item_df = pd.read_json( - StringIO(item_json_str), - orient="records", - lines=False + StringIO(item_json_str), orient="records", lines=False ) return item_df.to_parquet() return item_json_str @@ -199,19 +208,11 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: if isinstance(value, bytes): value_df = pd.read_parquet(BytesIO(value)) value_json = value_df.to_json( - orient="records", - lines=False, - force_ascii=False + orient="records", lines=False, force_ascii=False ) - cosmos_db_item = { - "id": key, - "body": json.loads(value_json) - } + cosmos_db_item = {"id": key, "body": json.loads(value_json)} else: - cosmos_db_item = { - "id": key, - "body": json.loads(value) - } + cosmos_db_item = {"id": key, "body": json.loads(value)} container_client.upsert_item(body=cosmos_db_item) except Exception: log.exception("Error writing item %s", key) @@ -223,10 +224,7 @@ async def has(self, key: str) -> bool: container_client = database_client.get_container_client( self._current_container ) - item_names = [ - item["id"] - for item in container_client.read_all_items() - ] + item_names = [item["id"] for item in container_client.read_all_items()] return key in item_names return False @@ -246,22 +244,21 @@ def keys(self) -> list[str]: """Return the keys in the storage.""" msg = "CosmosDB storage does yet not support listing keys." raise NotImplementedError(msg) - + def child(self, name: str | None) -> "PipelineStorage": """Create a child storage instance.""" return self - + def create_container(self) -> None: """Create a container for the current container name if it doesn't exist.""" database_client = self._database_client if self._current_container is not None: partition_key = PartitionKey(path="/id", kind="Hash") database_client.create_container_if_not_exists( - id=self._current_container, - partition_key=partition_key, + id=self._current_container, + partition_key=partition_key, ) - - + def delete_container(self) -> None: """Delete the container with the current container name if it exists.""" database_client = self._database_client @@ -272,11 +269,11 @@ def container_exists(self) -> bool: """Check if the container with the current container name exists.""" database_client = self._database_client container_names = [ - container["id"] - for container in database_client.list_containers() + container["id"] for container in database_client.list_containers() ] return self._current_container in container_names - + + def create_cosmosdb_storage( cosmosdb_account_url: str | None, connection_string: str | None, @@ -298,6 +295,7 @@ def create_cosmosdb_storage( current_container=container_name, ) + def _create_progress_status( num_loaded: int, num_filtered: int, num_total: int ) -> Progress: From 4ddff36bb1b89b0e1d9fd123a6effa33d2bc898b Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Thu, 21 Nov 2024 17:14:05 -0500 Subject: [PATCH 029/104] spellcheck and ci fixes --- graphrag/index/storage/cosmosdb_pipeline_storage.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/graphrag/index/storage/cosmosdb_pipeline_storage.py b/graphrag/index/storage/cosmosdb_pipeline_storage.py index bd3dc86e03..fd0d4d7ca3 100644 --- a/graphrag/index/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/index/storage/cosmosdb_pipeline_storage.py @@ -46,7 +46,7 @@ def __init__( else: if cosmosdb_account_url is None: msg = ( - "Either connection_string or cosmosdb_accoun_url must be provided." + "Either connection_string or cosmosdb_account_url must be provided." ) raise ValueError(msg) @@ -210,10 +210,14 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: value_json = value_df.to_json( orient="records", lines=False, force_ascii=False ) - cosmos_db_item = {"id": key, "body": json.loads(value_json)} + if value_json is None: + log.exception("Error converting output %s to json", key) + else: + cosmos_db_item = {"id": key, "body": json.loads(value_json)} + container_client.upsert_item(body=cosmos_db_item) else: cosmos_db_item = {"id": key, "body": json.loads(value)} - container_client.upsert_item(body=cosmos_db_item) + container_client.upsert_item(body=cosmos_db_item) except Exception: log.exception("Error writing item %s", key) From 15d9e6250244b1962a1f1022b87ac8f0936fe150 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Thu, 21 Nov 2024 17:44:21 -0500 Subject: [PATCH 030/104] updated pyproject toml and lock file --- poetry.lock | 1386 ++++++++++++++++++++++++------------------------ pyproject.toml | 1 + 2 files changed, 698 insertions(+), 689 deletions(-) diff --git a/poetry.lock b/poetry.lock index 47985d7218..7838a80125 100644 --- a/poetry.lock +++ b/poetry.lock @@ -254,6 +254,21 @@ typing-extensions = ">=4.6.0" [package.extras] aio = ["aiohttp (>=3.0)"] +[[package]] +name = "azure-cosmos" +version = "4.9.0" +description = "Microsoft Azure Cosmos Client Library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "azure_cosmos-4.9.0-py3-none-any.whl", hash = "sha256:3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe"}, + {file = "azure_cosmos-4.9.0.tar.gz", hash = "sha256:c70db4cbf55b0ff261ed7bb8aa325a5dfa565d3c6eaa43d75d26ae5e2ad6d74f"}, +] + +[package.dependencies] +azure-core = ">=1.30.0" +typing-extensions = ">=4.6.0" + [[package]] name = "azure-identity" version = "1.19.0" @@ -291,13 +306,13 @@ typing-extensions = ">=4.6.0" [[package]] name = "azure-storage-blob" -version = "12.23.1" +version = "12.24.0" description = "Microsoft Azure Blob Storage Client Library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "azure_storage_blob-12.23.1-py3-none-any.whl", hash = "sha256:1c2238aa841d1545f42714a5017c010366137a44a0605da2d45f770174bfc6b4"}, - {file = "azure_storage_blob-12.23.1.tar.gz", hash = "sha256:a587e54d4e39d2a27bd75109db164ffa2058fe194061e5446c5a89bca918272f"}, + {file = "azure_storage_blob-12.24.0-py3-none-any.whl", hash = "sha256:4f0bb4592ea79a2d986063696514c781c9e62be240f09f6397986e01755bc071"}, + {file = "azure_storage_blob-12.24.0.tar.gz", hash = "sha256:eaaaa1507c8c363d6e1d1342bd549938fdf1adec9b1ada8658c8f5bf3aea844e"}, ] [package.dependencies] @@ -638,76 +653,65 @@ test = ["pytest"] [[package]] name = "contourpy" -version = "1.3.0" +version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"}, - {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"}, - {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"}, - {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"}, - {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"}, - {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"}, - {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"}, - {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"}, - {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"}, - {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"}, - {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"}, - {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"}, - {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"}, - {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"}, - {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"}, - {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"}, - {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"}, - {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"}, - {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"}, - {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"}, - {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"}, - {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"}, - {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"}, - {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"}, - {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"}, - {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"}, - {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"}, - {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"}, - {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"}, - {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"}, - {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"}, - {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"}, - {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"}, - {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"}, - {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"}, - {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"}, - {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"}, - {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"}, - {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"}, - {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"}, - {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"}, - {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"}, - {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595"}, + {file = "contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697"}, + {file = "contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f"}, + {file = "contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375"}, + {file = "contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d"}, + {file = "contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e"}, + {file = "contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"}, + {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"}, + {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"}, + {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, ] [package.dependencies] @@ -722,73 +726,73 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "coverage" -version = "7.6.4" +version = "7.6.7" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07"}, - {file = "coverage-7.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51"}, - {file = "coverage-7.6.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea"}, - {file = "coverage-7.6.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a"}, - {file = "coverage-7.6.4-cp310-cp310-win32.whl", hash = "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa"}, - {file = "coverage-7.6.4-cp310-cp310-win_amd64.whl", hash = "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172"}, - {file = "coverage-7.6.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b"}, - {file = "coverage-7.6.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b"}, - {file = "coverage-7.6.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db"}, - {file = "coverage-7.6.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522"}, - {file = "coverage-7.6.4-cp311-cp311-win32.whl", hash = "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf"}, - {file = "coverage-7.6.4-cp311-cp311-win_amd64.whl", hash = "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19"}, - {file = "coverage-7.6.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2"}, - {file = "coverage-7.6.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27"}, - {file = "coverage-7.6.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1"}, - {file = "coverage-7.6.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5"}, - {file = "coverage-7.6.4-cp312-cp312-win32.whl", hash = "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17"}, - {file = "coverage-7.6.4-cp312-cp312-win_amd64.whl", hash = "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08"}, - {file = "coverage-7.6.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9"}, - {file = "coverage-7.6.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06"}, - {file = "coverage-7.6.4-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21"}, - {file = "coverage-7.6.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a"}, - {file = "coverage-7.6.4-cp313-cp313-win32.whl", hash = "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e"}, - {file = "coverage-7.6.4-cp313-cp313-win_amd64.whl", hash = "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963"}, - {file = "coverage-7.6.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f"}, - {file = "coverage-7.6.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3"}, - {file = "coverage-7.6.4-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70"}, - {file = "coverage-7.6.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef"}, - {file = "coverage-7.6.4-cp313-cp313t-win32.whl", hash = "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e"}, - {file = "coverage-7.6.4-cp313-cp313t-win_amd64.whl", hash = "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1"}, - {file = "coverage-7.6.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3"}, - {file = "coverage-7.6.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376"}, - {file = "coverage-7.6.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111"}, - {file = "coverage-7.6.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901"}, - {file = "coverage-7.6.4-cp39-cp39-win32.whl", hash = "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09"}, - {file = "coverage-7.6.4-cp39-cp39-win_amd64.whl", hash = "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f"}, - {file = "coverage-7.6.4-pp39.pp310-none-any.whl", hash = "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e"}, - {file = "coverage-7.6.4.tar.gz", hash = "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73"}, + {file = "coverage-7.6.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e"}, + {file = "coverage-7.6.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c"}, + {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777"}, + {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314"}, + {file = "coverage-7.6.7-cp310-cp310-win32.whl", hash = "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a"}, + {file = "coverage-7.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469"}, + {file = "coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b"}, + {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d"}, + {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4"}, + {file = "coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2"}, + {file = "coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f"}, + {file = "coverage-7.6.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9"}, + {file = "coverage-7.6.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1"}, + {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f"}, + {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb"}, + {file = "coverage-7.6.7-cp312-cp312-win32.whl", hash = "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76"}, + {file = "coverage-7.6.7-cp312-cp312-win_amd64.whl", hash = "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c"}, + {file = "coverage-7.6.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3"}, + {file = "coverage-7.6.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc"}, + {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55"}, + {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384"}, + {file = "coverage-7.6.7-cp313-cp313-win32.whl", hash = "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30"}, + {file = "coverage-7.6.7-cp313-cp313-win_amd64.whl", hash = "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42"}, + {file = "coverage-7.6.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413"}, + {file = "coverage-7.6.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b"}, + {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b"}, + {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3"}, + {file = "coverage-7.6.7-cp313-cp313t-win32.whl", hash = "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8"}, + {file = "coverage-7.6.7-cp313-cp313t-win_amd64.whl", hash = "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56"}, + {file = "coverage-7.6.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874"}, + {file = "coverage-7.6.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7"}, + {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c"}, + {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289"}, + {file = "coverage-7.6.7-cp39-cp39-win32.whl", hash = "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c"}, + {file = "coverage-7.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13"}, + {file = "coverage-7.6.7-pp39.pp310-none-any.whl", hash = "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671"}, + {file = "coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24"}, ] [package.extras] @@ -877,37 +881,37 @@ pyarrow = ">=15.0.0,<16.0.0" [[package]] name = "debugpy" -version = "1.8.7" +version = "1.8.9" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.7-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95fe04a573b8b22896c404365e03f4eda0ce0ba135b7667a1e57bd079793b96b"}, - {file = "debugpy-1.8.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:628a11f4b295ffb4141d8242a9bb52b77ad4a63a2ad19217a93be0f77f2c28c9"}, - {file = "debugpy-1.8.7-cp310-cp310-win32.whl", hash = "sha256:85ce9c1d0eebf622f86cc68618ad64bf66c4fc3197d88f74bb695a416837dd55"}, - {file = "debugpy-1.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:29e1571c276d643757ea126d014abda081eb5ea4c851628b33de0c2b6245b037"}, - {file = "debugpy-1.8.7-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:caf528ff9e7308b74a1749c183d6808ffbedbb9fb6af78b033c28974d9b8831f"}, - {file = "debugpy-1.8.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba1d078cf2e1e0b8402e6bda528bf8fda7ccd158c3dba6c012b7897747c41a0"}, - {file = "debugpy-1.8.7-cp311-cp311-win32.whl", hash = "sha256:171899588bcd412151e593bd40d9907133a7622cd6ecdbdb75f89d1551df13c2"}, - {file = "debugpy-1.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:6e1c4ffb0c79f66e89dfd97944f335880f0d50ad29525dc792785384923e2211"}, - {file = "debugpy-1.8.7-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:4d27d842311353ede0ad572600c62e4bcd74f458ee01ab0dd3a1a4457e7e3706"}, - {file = "debugpy-1.8.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:703c1fd62ae0356e194f3e7b7a92acd931f71fe81c4b3be2c17a7b8a4b546ec2"}, - {file = "debugpy-1.8.7-cp312-cp312-win32.whl", hash = "sha256:2f729228430ef191c1e4df72a75ac94e9bf77413ce5f3f900018712c9da0aaca"}, - {file = "debugpy-1.8.7-cp312-cp312-win_amd64.whl", hash = "sha256:45c30aaefb3e1975e8a0258f5bbd26cd40cde9bfe71e9e5a7ac82e79bad64e39"}, - {file = "debugpy-1.8.7-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:d050a1ec7e925f514f0f6594a1e522580317da31fbda1af71d1530d6ea1f2b40"}, - {file = "debugpy-1.8.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f4349a28e3228a42958f8ddaa6333d6f8282d5edaea456070e48609c5983b7"}, - {file = "debugpy-1.8.7-cp313-cp313-win32.whl", hash = "sha256:11ad72eb9ddb436afb8337891a986302e14944f0f755fd94e90d0d71e9100bba"}, - {file = "debugpy-1.8.7-cp313-cp313-win_amd64.whl", hash = "sha256:2efb84d6789352d7950b03d7f866e6d180284bc02c7e12cb37b489b7083d81aa"}, - {file = "debugpy-1.8.7-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:4b908291a1d051ef3331484de8e959ef3e66f12b5e610c203b5b75d2725613a7"}, - {file = "debugpy-1.8.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da8df5b89a41f1fd31503b179d0a84a5fdb752dddd5b5388dbd1ae23cda31ce9"}, - {file = "debugpy-1.8.7-cp38-cp38-win32.whl", hash = "sha256:b12515e04720e9e5c2216cc7086d0edadf25d7ab7e3564ec8b4521cf111b4f8c"}, - {file = "debugpy-1.8.7-cp38-cp38-win_amd64.whl", hash = "sha256:93176e7672551cb5281577cdb62c63aadc87ec036f0c6a486f0ded337c504596"}, - {file = "debugpy-1.8.7-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:90d93e4f2db442f8222dec5ec55ccfc8005821028982f1968ebf551d32b28907"}, - {file = "debugpy-1.8.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6db2a370e2700557a976eaadb16243ec9c91bd46f1b3bb15376d7aaa7632c81"}, - {file = "debugpy-1.8.7-cp39-cp39-win32.whl", hash = "sha256:a6cf2510740e0c0b4a40330640e4b454f928c7b99b0c9dbf48b11efba08a8cda"}, - {file = "debugpy-1.8.7-cp39-cp39-win_amd64.whl", hash = "sha256:6a9d9d6d31846d8e34f52987ee0f1a904c7baa4912bf4843ab39dadf9b8f3e0d"}, - {file = "debugpy-1.8.7-py2.py3-none-any.whl", hash = "sha256:57b00de1c8d2c84a61b90880f7e5b6deaf4c312ecbde3a0e8912f2a56c4ac9ae"}, - {file = "debugpy-1.8.7.zip", hash = "sha256:18b8f731ed3e2e1df8e9cdaa23fb1fc9c24e570cd0081625308ec51c82efe42e"}, + {file = "debugpy-1.8.9-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:cfe1e6c6ad7178265f74981edf1154ffce97b69005212fbc90ca22ddfe3d017e"}, + {file = "debugpy-1.8.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada7fb65102a4d2c9ab62e8908e9e9f12aed9d76ef44880367bc9308ebe49a0f"}, + {file = "debugpy-1.8.9-cp310-cp310-win32.whl", hash = "sha256:c36856343cbaa448171cba62a721531e10e7ffb0abff838004701454149bc037"}, + {file = "debugpy-1.8.9-cp310-cp310-win_amd64.whl", hash = "sha256:17c5e0297678442511cf00a745c9709e928ea4ca263d764e90d233208889a19e"}, + {file = "debugpy-1.8.9-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:b74a49753e21e33e7cf030883a92fa607bddc4ede1aa4145172debc637780040"}, + {file = "debugpy-1.8.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d22dacdb0e296966d7d74a7141aaab4bec123fa43d1a35ddcb39bf9fd29d70"}, + {file = "debugpy-1.8.9-cp311-cp311-win32.whl", hash = "sha256:8138efff315cd09b8dcd14226a21afda4ca582284bf4215126d87342bba1cc66"}, + {file = "debugpy-1.8.9-cp311-cp311-win_amd64.whl", hash = "sha256:ff54ef77ad9f5c425398efb150239f6fe8e20c53ae2f68367eba7ece1e96226d"}, + {file = "debugpy-1.8.9-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:957363d9a7a6612a37458d9a15e72d03a635047f946e5fceee74b50d52a9c8e2"}, + {file = "debugpy-1.8.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e565fc54b680292b418bb809f1386f17081d1346dca9a871bf69a8ac4071afe"}, + {file = "debugpy-1.8.9-cp312-cp312-win32.whl", hash = "sha256:3e59842d6c4569c65ceb3751075ff8d7e6a6ada209ceca6308c9bde932bcef11"}, + {file = "debugpy-1.8.9-cp312-cp312-win_amd64.whl", hash = "sha256:66eeae42f3137eb428ea3a86d4a55f28da9bd5a4a3d369ba95ecc3a92c1bba53"}, + {file = "debugpy-1.8.9-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:957ecffff80d47cafa9b6545de9e016ae8c9547c98a538ee96ab5947115fb3dd"}, + {file = "debugpy-1.8.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1efbb3ff61487e2c16b3e033bc8595aea578222c08aaf3c4bf0f93fadbd662ee"}, + {file = "debugpy-1.8.9-cp313-cp313-win32.whl", hash = "sha256:7c4d65d03bee875bcb211c76c1d8f10f600c305dbd734beaed4077e902606fee"}, + {file = "debugpy-1.8.9-cp313-cp313-win_amd64.whl", hash = "sha256:e46b420dc1bea64e5bbedd678148be512442bc589b0111bd799367cde051e71a"}, + {file = "debugpy-1.8.9-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:472a3994999fe6c0756945ffa359e9e7e2d690fb55d251639d07208dbc37caea"}, + {file = "debugpy-1.8.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365e556a4772d7d0d151d7eb0e77ec4db03bcd95f26b67b15742b88cacff88e9"}, + {file = "debugpy-1.8.9-cp38-cp38-win32.whl", hash = "sha256:54a7e6d3014c408eb37b0b06021366ee985f1539e12fe49ca2ee0d392d9ceca5"}, + {file = "debugpy-1.8.9-cp38-cp38-win_amd64.whl", hash = "sha256:8e99c0b1cc7bf86d83fb95d5ccdc4ad0586d4432d489d1f54e4055bcc795f693"}, + {file = "debugpy-1.8.9-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:7e8b079323a56f719977fde9d8115590cb5e7a1cba2fcee0986ef8817116e7c1"}, + {file = "debugpy-1.8.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6953b335b804a41f16a192fa2e7851bdcfd92173cbb2f9f777bb934f49baab65"}, + {file = "debugpy-1.8.9-cp39-cp39-win32.whl", hash = "sha256:7e646e62d4602bb8956db88b1e72fe63172148c1e25c041e03b103a25f36673c"}, + {file = "debugpy-1.8.9-cp39-cp39-win_amd64.whl", hash = "sha256:3d9755e77a2d680ce3d2c5394a444cf42be4a592caaf246dbfbdd100ffcf7ae5"}, + {file = "debugpy-1.8.9-py2.py3-none-any.whl", hash = "sha256:cc37a6c9987ad743d9c3a14fa1b1a14b7e4e6041f9dd0c8abf8895fe7a97b899"}, + {file = "debugpy-1.8.9.zip", hash = "sha256:1339e14c7d980407248f09824d1b25ff5c5616651689f1e0f0e51bdead3ea13e"}, ] [[package]] @@ -1012,13 +1016,13 @@ files = [ [[package]] name = "environs" -version = "11.0.0" +version = "11.2.1" description = "simplified environment variable parsing" optional = false python-versions = ">=3.8" files = [ - {file = "environs-11.0.0-py3-none-any.whl", hash = "sha256:e0bcfd41c718c07a7db422f9109e490746450da38793fe4ee197f397b9343435"}, - {file = "environs-11.0.0.tar.gz", hash = "sha256:069727a8f73d8ba8d033d3cd95c0da231d44f38f1da773bf076cef168d312ee8"}, + {file = "environs-11.2.1-py3-none-any.whl", hash = "sha256:9d2080cf25807a26fc0d4301e2d7b62c64fbf547540f21e3a30cc02bc5fbe948"}, + {file = "environs-11.2.1.tar.gz", hash = "sha256:e068ae3174cef52ba4b95ead22e639056a02465f616e62323e04ae08e86a75a4"}, ] [package.dependencies] @@ -1026,7 +1030,7 @@ marshmallow = ">=3.13.0" python-dotenv = "*" [package.extras] -dev = ["environs[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +dev = ["environs[tests]", "pre-commit (>=3.5,<5.0)", "tox"] django = ["dj-database-url", "dj-email-url", "django-cache-url"] tests = ["environs[django]", "pytest"] @@ -1074,59 +1078,61 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "fonttools" -version = "4.54.1" +version = "4.55.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, - {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, - {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, - {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, - {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, - {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, - {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, - {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, - {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, - {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, - {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, - {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, - {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, - {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, - {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, - {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, - {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, - {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, - {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, - {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, - {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, - {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, - {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, - {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, - {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, - {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, - {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, - {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, - {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, - {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, - {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, - {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, - {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, - {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, - {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, - {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, - {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, - {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, - {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, - {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, - {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, - {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, - {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, - {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, - {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, - {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, - {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, - {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, + {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:51c029d4c0608a21a3d3d169dfc3fb776fde38f00b35ca11fdab63ba10a16f61"}, + {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bca35b4e411362feab28e576ea10f11268b1aeed883b9f22ed05675b1e06ac69"}, + {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ce4ba6981e10f7e0ccff6348e9775ce25ffadbee70c9fd1a3737e3e9f5fa74f"}, + {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31d00f9852a6051dac23294a4cf2df80ced85d1d173a61ba90a3d8f5abc63c60"}, + {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e198e494ca6e11f254bac37a680473a311a88cd40e58f9cc4dc4911dfb686ec6"}, + {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7208856f61770895e79732e1dcbe49d77bd5783adf73ae35f87fcc267df9db81"}, + {file = "fonttools-4.55.0-cp310-cp310-win32.whl", hash = "sha256:e7e6a352ff9e46e8ef8a3b1fe2c4478f8a553e1b5a479f2e899f9dc5f2055880"}, + {file = "fonttools-4.55.0-cp310-cp310-win_amd64.whl", hash = "sha256:636caaeefe586d7c84b5ee0734c1a5ab2dae619dc21c5cf336f304ddb8f6001b"}, + {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fa34aa175c91477485c44ddfbb51827d470011e558dfd5c7309eb31bef19ec51"}, + {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:37dbb3fdc2ef7302d3199fb12468481cbebaee849e4b04bc55b77c24e3c49189"}, + {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5263d8e7ef3c0ae87fbce7f3ec2f546dc898d44a337e95695af2cd5ea21a967"}, + {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f307f6b5bf9e86891213b293e538d292cd1677e06d9faaa4bf9c086ad5f132f6"}, + {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f0a4b52238e7b54f998d6a56b46a2c56b59c74d4f8a6747fb9d4042190f37cd3"}, + {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3e569711464f777a5d4ef522e781dc33f8095ab5efd7548958b36079a9f2f88c"}, + {file = "fonttools-4.55.0-cp311-cp311-win32.whl", hash = "sha256:2b3ab90ec0f7b76c983950ac601b58949f47aca14c3f21eed858b38d7ec42b05"}, + {file = "fonttools-4.55.0-cp311-cp311-win_amd64.whl", hash = "sha256:aa046f6a63bb2ad521004b2769095d4c9480c02c1efa7d7796b37826508980b6"}, + {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:838d2d8870f84fc785528a692e724f2379d5abd3fc9dad4d32f91cf99b41e4a7"}, + {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f46b863d74bab7bb0d395f3b68d3f52a03444964e67ce5c43ce43a75efce9246"}, + {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33b52a9cfe4e658e21b1f669f7309b4067910321757fec53802ca8f6eae96a5a"}, + {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:732a9a63d6ea4a81b1b25a1f2e5e143761b40c2e1b79bb2b68e4893f45139a40"}, + {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7dd91ac3fcb4c491bb4763b820bcab6c41c784111c24172616f02f4bc227c17d"}, + {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1f0e115281a32ff532118aa851ef497a1b7cda617f4621c1cdf81ace3e36fb0c"}, + {file = "fonttools-4.55.0-cp312-cp312-win32.whl", hash = "sha256:6c99b5205844f48a05cb58d4a8110a44d3038c67ed1d79eb733c4953c628b0f6"}, + {file = "fonttools-4.55.0-cp312-cp312-win_amd64.whl", hash = "sha256:f8c8c76037d05652510ae45be1cd8fb5dd2fd9afec92a25374ac82255993d57c"}, + {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8118dc571921dc9e4b288d9cb423ceaf886d195a2e5329cc427df82bba872cd9"}, + {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01124f2ca6c29fad4132d930da69158d3f49b2350e4a779e1efbe0e82bd63f6c"}, + {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ffd58d2691f11f7c8438796e9f21c374828805d33e83ff4b76e4635633674c"}, + {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5435e5f1eb893c35c2bc2b9cd3c9596b0fcb0a59e7a14121562986dd4c47b8dd"}, + {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d12081729280c39d001edd0f4f06d696014c26e6e9a0a55488fabc37c28945e4"}, + {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7ad1f1b98ab6cb927ab924a38a8649f1ffd7525c75fe5b594f5dab17af70e18"}, + {file = "fonttools-4.55.0-cp313-cp313-win32.whl", hash = "sha256:abe62987c37630dca69a104266277216de1023cf570c1643bb3a19a9509e7a1b"}, + {file = "fonttools-4.55.0-cp313-cp313-win_amd64.whl", hash = "sha256:2863555ba90b573e4201feaf87a7e71ca3b97c05aa4d63548a4b69ea16c9e998"}, + {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00f7cf55ad58a57ba421b6a40945b85ac7cc73094fb4949c41171d3619a3a47e"}, + {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f27526042efd6f67bfb0cc2f1610fa20364396f8b1fc5edb9f45bb815fb090b2"}, + {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e67974326af6a8879dc2a4ec63ab2910a1c1a9680ccd63e4a690950fceddbe"}, + {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61dc0a13451143c5e987dec5254d9d428f3c2789a549a7cf4f815b63b310c1cc"}, + {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e526b325a903868c62155a6a7e24df53f6ce4c5c3160214d8fe1be2c41b478"}, + {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b7ef9068a1297714e6fefe5932c33b058aa1d45a2b8be32a4c6dee602ae22b5c"}, + {file = "fonttools-4.55.0-cp38-cp38-win32.whl", hash = "sha256:55718e8071be35dff098976bc249fc243b58efa263768c611be17fe55975d40a"}, + {file = "fonttools-4.55.0-cp38-cp38-win_amd64.whl", hash = "sha256:553bd4f8cc327f310c20158e345e8174c8eed49937fb047a8bda51daf2c353c8"}, + {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f901cef813f7c318b77d1c5c14cf7403bae5cb977cede023e22ba4316f0a8f6"}, + {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c9679fc0dd7e8a5351d321d8d29a498255e69387590a86b596a45659a39eb0d"}, + {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2820a8b632f3307ebb0bf57948511c2208e34a4939cf978333bc0a3f11f838"}, + {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23bbbb49bec613a32ed1b43df0f2b172313cee690c2509f1af8fdedcf0a17438"}, + {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a656652e1f5d55b9728937a7e7d509b73d23109cddd4e89ee4f49bde03b736c6"}, + {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f50a1f455902208486fbca47ce33054208a4e437b38da49d6721ce2fef732fcf"}, + {file = "fonttools-4.55.0-cp39-cp39-win32.whl", hash = "sha256:161d1ac54c73d82a3cded44202d0218ab007fde8cf194a23d3dd83f7177a2f03"}, + {file = "fonttools-4.55.0-cp39-cp39-win_amd64.whl", hash = "sha256:ca7fd6987c68414fece41c96836e945e1f320cda56fc96ffdc16e54a44ec57a2"}, + {file = "fonttools-4.55.0-py3-none-any.whl", hash = "sha256:12db5888cd4dd3fcc9f0ee60c6edd3c7e1fd44b7dd0f31381ea03df68f8a153f"}, + {file = "fonttools-4.55.0.tar.gz", hash = "sha256:7636acc6ab733572d5e7eec922b254ead611f1cdad17be3f0be7418e8bfaca71"}, ] [package.extras] @@ -1283,13 +1289,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.6" +version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, - {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, ] [package.dependencies] @@ -1488,22 +1494,22 @@ arrow = ">=0.15.0" [[package]] name = "jedi" -version = "0.19.1" +version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" +parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" @@ -1524,84 +1530,84 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.7.0" +version = "0.7.1" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.7.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e14027f61101b3f5e173095d9ecf95c1cac03ffe45a849279bde1d97e559e314"}, - {file = "jiter-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:979ec4711c2e37ac949561858bd42028884c9799516a923e1ff0b501ef341a4a"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:662d5d3cca58ad6af7a3c6226b641c8655de5beebcb686bfde0df0f21421aafa"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d89008fb47043a469f97ad90840b97ba54e7c3d62dc7cbb6cbf938bd0caf71d"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8b16c35c846a323ce9067170d5ab8c31ea3dbcab59c4f7608bbbf20c2c3b43f"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e82daaa1b0a68704f9029b81e664a5a9de3e466c2cbaabcda5875f961702e7"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a87a9f586636e1f0dd3651a91f79b491ea0d9fd7cbbf4f5c463eebdc48bda7"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ec05b1615f96cc3e4901678bc863958611584072967d9962f9e571d60711d52"}, - {file = "jiter-0.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5cb97e35370bde7aa0d232a7f910f5a0fbbc96bc0a7dbaa044fd5cd6bcd7ec3"}, - {file = "jiter-0.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb316dacaf48c8c187cea75d0d7f835f299137e6fdd13f691dff8f92914015c7"}, - {file = "jiter-0.7.0-cp310-none-win32.whl", hash = "sha256:243f38eb4072763c54de95b14ad283610e0cd3bf26393870db04e520f60eebb3"}, - {file = "jiter-0.7.0-cp310-none-win_amd64.whl", hash = "sha256:2221d5603c139f6764c54e37e7c6960c469cbcd76928fb10d15023ba5903f94b"}, - {file = "jiter-0.7.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:91cec0ad755bd786c9f769ce8d843af955df6a8e56b17658771b2d5cb34a3ff8"}, - {file = "jiter-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:feba70a28a27d962e353e978dbb6afd798e711c04cb0b4c5e77e9d3779033a1a"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d866ec066c3616cacb8535dbda38bb1d470b17b25f0317c4540182bc886ce2"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7a7a00b6f9f18289dd563596f97ecaba6c777501a8ba04bf98e03087bcbc60"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9aaf564094c7db8687f2660605e099f3d3e6ea5e7135498486674fcb78e29165"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4d27e09825c1b3c7a667adb500ce8b840e8fc9f630da8454b44cdd4fb0081bb"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca7c287da9c1d56dda88da1d08855a787dbb09a7e2bd13c66a2e288700bd7c7"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db19a6d160f093cbc8cd5ea2abad420b686f6c0e5fb4f7b41941ebc6a4f83cda"}, - {file = "jiter-0.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e46a63c7f877cf7441ffc821c28287cfb9f533ae6ed707bde15e7d4dfafa7ae"}, - {file = "jiter-0.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ba426fa7ff21cb119fa544b75dd3fbee6a70e55a5829709c0338d07ccd30e6d"}, - {file = "jiter-0.7.0-cp311-none-win32.whl", hash = "sha256:c07f55a64912b0c7982377831210836d2ea92b7bd343fca67a32212dd72e38e0"}, - {file = "jiter-0.7.0-cp311-none-win_amd64.whl", hash = "sha256:ed27b2c43e1b5f6c7fedc5c11d4d8bfa627de42d1143d87e39e2e83ddefd861a"}, - {file = "jiter-0.7.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac7930bcaaeb1e229e35c91c04ed2e9f39025b86ee9fc3141706bbf6fff4aeeb"}, - {file = "jiter-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:571feae3e7c901a8eedde9fd2865b0dfc1432fb15cab8c675a8444f7d11b7c5d"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8af4df8a262fa2778b68c2a03b6e9d1cb4d43d02bea6976d46be77a3a331af1"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd028d4165097a611eb0c7494d8c1f2aebd46f73ca3200f02a175a9c9a6f22f5"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6b487247c7836810091e9455efe56a52ec51bfa3a222237e1587d04d3e04527"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6d28a92f28814e1a9f2824dc11f4e17e1df1f44dc4fdeb94c5450d34bcb2602"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90443994bbafe134f0b34201dad3ebe1c769f0599004084e046fb249ad912425"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f9abf464f9faac652542ce8360cea8e68fba2b78350e8a170248f9bcc228702a"}, - {file = "jiter-0.7.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db7a8d99fc5f842f7d2852f06ccaed066532292c41723e5dff670c339b649f88"}, - {file = "jiter-0.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:15cf691ebd8693b70c94627d6b748f01e6d697d9a6e9f2bc310934fcfb7cf25e"}, - {file = "jiter-0.7.0-cp312-none-win32.whl", hash = "sha256:9dcd54fa422fb66ca398bec296fed5f58e756aa0589496011cfea2abb5be38a5"}, - {file = "jiter-0.7.0-cp312-none-win_amd64.whl", hash = "sha256:cc989951f73f9375b8eacd571baaa057f3d7d11b7ce6f67b9d54642e7475bfad"}, - {file = "jiter-0.7.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:24cecd18df540963cd27c08ca5ce1d0179f229ff78066d9eecbe5add29361340"}, - {file = "jiter-0.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d41b46236b90b043cca73785674c23d2a67d16f226394079d0953f94e765ed76"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b160db0987171365c153e406a45dcab0ee613ae3508a77bfff42515cb4ce4d6e"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d1c8d91e0f0bd78602eaa081332e8ee4f512c000716f5bc54e9a037306d693a7"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997706c683195eeff192d2e5285ce64d2a610414f37da3a3f2625dcf8517cf90"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ea52a8a0ff0229ab2920284079becd2bae0688d432fca94857ece83bb49c541"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d77449d2738cf74752bb35d75ee431af457e741124d1db5e112890023572c7c"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8203519907a1d81d6cb00902c98e27c2d0bf25ce0323c50ca594d30f5f1fbcf"}, - {file = "jiter-0.7.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41d15ccc53931c822dd7f1aebf09faa3cda2d7b48a76ef304c7dbc19d1302e51"}, - {file = "jiter-0.7.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:febf3179b2fabf71fbd2fd52acb8594163bb173348b388649567a548f356dbf6"}, - {file = "jiter-0.7.0-cp313-none-win32.whl", hash = "sha256:4a8e2d866e7eda19f012444e01b55079d8e1c4c30346aaac4b97e80c54e2d6d3"}, - {file = "jiter-0.7.0-cp313-none-win_amd64.whl", hash = "sha256:7417c2b928062c496f381fb0cb50412eee5ad1d8b53dbc0e011ce45bb2de522c"}, - {file = "jiter-0.7.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9c62c737b5368e51e74960a08fe1adc807bd270227291daede78db24d5fbf556"}, - {file = "jiter-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e4640722b1bef0f6e342fe4606aafaae0eb4f4be5c84355bb6867f34400f6688"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f367488c3b9453eab285424c61098faa1cab37bb49425e69c8dca34f2dfe7d69"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0cf5d42beb3514236459454e3287db53d9c4d56c4ebaa3e9d0efe81b19495129"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cc5190ea1113ee6f7252fa8a5fe5a6515422e378356c950a03bbde5cafbdbaab"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ee47a149d698796a87abe445fc8dee21ed880f09469700c76c8d84e0d11efd"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48592c26ea72d3e71aa4bea0a93454df907d80638c3046bb0705507b6704c0d7"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:79fef541199bd91cfe8a74529ecccb8eaf1aca38ad899ea582ebbd4854af1e51"}, - {file = "jiter-0.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d1ef6bb66041f2514739240568136c81b9dcc64fd14a43691c17ea793b6535c0"}, - {file = "jiter-0.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca4d950863b1c238e315bf159466e064c98743eef3bd0ff9617e48ff63a4715"}, - {file = "jiter-0.7.0-cp38-none-win32.whl", hash = "sha256:897745f230350dcedb8d1ebe53e33568d48ea122c25e6784402b6e4e88169be7"}, - {file = "jiter-0.7.0-cp38-none-win_amd64.whl", hash = "sha256:b928c76a422ef3d0c85c5e98c498ce3421b313c5246199541e125b52953e1bc0"}, - {file = "jiter-0.7.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c9b669ff6f8ba08270dee9ccf858d3b0203b42314a428a1676762f2d390fbb64"}, - {file = "jiter-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5be919bacd73ca93801c3042bce6e95cb9c555a45ca83617b9b6c89df03b9c2"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a282e1e8a396dabcea82d64f9d05acf7efcf81ecdd925b967020dcb0e671c103"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:17ecb1a578a56e97a043c72b463776b5ea30343125308f667fb8fce4b3796735"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b6045fa0527129218cdcd8a8b839f678219686055f31ebab35f87d354d9c36e"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:189cc4262a92e33c19d4fd24018f5890e4e6da5b2581f0059938877943f8298c"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c138414839effbf30d185e30475c6dc8a16411a1e3681e5fd4605ab1233ac67a"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2791604acef33da6b72d5ecf885a32384bcaf9aa1e4be32737f3b8b9588eef6a"}, - {file = "jiter-0.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ae60ec89037a78d60bbf3d8b127f1567769c8fa24886e0abed3f622791dea478"}, - {file = "jiter-0.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:836f03dea312967635233d826f783309b98cfd9ccc76ac776e224cfcef577862"}, - {file = "jiter-0.7.0-cp39-none-win32.whl", hash = "sha256:ebc30ae2ce4bc4986e1764c404b4ea1924f926abf02ce92516485098f8545374"}, - {file = "jiter-0.7.0-cp39-none-win_amd64.whl", hash = "sha256:abf596f951370c648f37aa9899deab296c42a3829736e598b0dd10b08f77a44d"}, - {file = "jiter-0.7.0.tar.gz", hash = "sha256:c061d9738535497b5509f8970584f20de1e900806b239a39a9994fc191dad630"}, + {file = "jiter-0.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:262e96d06696b673fad6f257e6a0abb6e873dc22818ca0e0600f4a1189eb334f"}, + {file = "jiter-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be6de02939aac5be97eb437f45cfd279b1dc9de358b13ea6e040e63a3221c40d"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935f10b802bc1ce2b2f61843e498c7720aa7f4e4bb7797aa8121eab017293c3d"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9cd3cccccabf5064e4bb3099c87bf67db94f805c1e62d1aefd2b7476e90e0ee2"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aa919ebfc5f7b027cc368fe3964c0015e1963b92e1db382419dadb098a05192"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ae2d01e82c94491ce4d6f461a837f63b6c4e6dd5bb082553a70c509034ff3d4"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f9568cd66dbbdab67ae1b4c99f3f7da1228c5682d65913e3f5f95586b3cb9a9"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9ecbf4e20ec2c26512736284dc1a3f8ed79b6ca7188e3b99032757ad48db97dc"}, + {file = "jiter-0.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1a0508fddc70ce00b872e463b387d49308ef02b0787992ca471c8d4ba1c0fa1"}, + {file = "jiter-0.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f84c9996664c460f24213ff1e5881530abd8fafd82058d39af3682d5fd2d6316"}, + {file = "jiter-0.7.1-cp310-none-win32.whl", hash = "sha256:c915e1a1960976ba4dfe06551ea87063b2d5b4d30759012210099e712a414d9f"}, + {file = "jiter-0.7.1-cp310-none-win_amd64.whl", hash = "sha256:75bf3b7fdc5c0faa6ffffcf8028a1f974d126bac86d96490d1b51b3210aa0f3f"}, + {file = "jiter-0.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ad04a23a91f3d10d69d6c87a5f4471b61c2c5cd6e112e85136594a02043f462c"}, + {file = "jiter-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e47a554de88dff701226bb5722b7f1b6bccd0b98f1748459b7e56acac2707a5"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e44fff69c814a2e96a20b4ecee3e2365e9b15cf5fe4e00869d18396daa91dab"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df0a1d05081541b45743c965436f8b5a1048d6fd726e4a030113a2699a6046ea"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f22cf8f236a645cb6d8ffe2a64edb5d2b66fb148bf7c75eea0cb36d17014a7bc"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8589f50b728ea4bf22e0632eefa125c8aa9c38ed202a5ee6ca371f05eeb3ff"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f20de711224f2ca2dbb166a8d512f6ff48c9c38cc06b51f796520eb4722cc2ce"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a9803396032117b85ec8cbf008a54590644a062fedd0425cbdb95e4b2b60479"}, + {file = "jiter-0.7.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d8bae77c82741032e9d89a4026479061aba6e646de3bf5f2fc1ae2bbd9d06e0"}, + {file = "jiter-0.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3dc9939e576bbc68c813fc82f6620353ed68c194c7bcf3d58dc822591ec12490"}, + {file = "jiter-0.7.1-cp311-none-win32.whl", hash = "sha256:f7605d24cd6fab156ec89e7924578e21604feee9c4f1e9da34d8b67f63e54892"}, + {file = "jiter-0.7.1-cp311-none-win_amd64.whl", hash = "sha256:f3ea649e7751a1a29ea5ecc03c4ada0a833846c59c6da75d747899f9b48b7282"}, + {file = "jiter-0.7.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ad36a1155cbd92e7a084a568f7dc6023497df781adf2390c345dd77a120905ca"}, + {file = "jiter-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7ba52e6aaed2dc5c81a3d9b5e4ab95b039c4592c66ac973879ba57c3506492bb"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b7de0b6f6728b678540c7927587e23f715284596724be203af952418acb8a2d"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9463b62bd53c2fb85529c700c6a3beb2ee54fde8bef714b150601616dcb184a6"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:627164ec01d28af56e1f549da84caf0fe06da3880ebc7b7ee1ca15df106ae172"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25d0e5bf64e368b0aa9e0a559c3ab2f9b67e35fe7269e8a0d81f48bbd10e8963"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c244261306f08f8008b3087059601997016549cb8bb23cf4317a4827f07b7d74"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ded4e4b75b68b843b7cea5cd7c55f738c20e1394c68c2cb10adb655526c5f1b"}, + {file = "jiter-0.7.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:80dae4f1889b9d09e5f4de6b58c490d9c8ce7730e35e0b8643ab62b1538f095c"}, + {file = "jiter-0.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5970cf8ec943b51bce7f4b98d2e1ed3ada170c2a789e2db3cb484486591a176a"}, + {file = "jiter-0.7.1-cp312-none-win32.whl", hash = "sha256:701d90220d6ecb3125d46853c8ca8a5bc158de8c49af60fd706475a49fee157e"}, + {file = "jiter-0.7.1-cp312-none-win_amd64.whl", hash = "sha256:7824c3ecf9ecf3321c37f4e4d4411aad49c666ee5bc2a937071bdd80917e4533"}, + {file = "jiter-0.7.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:097676a37778ba3c80cb53f34abd6943ceb0848263c21bf423ae98b090f6c6ba"}, + {file = "jiter-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3298af506d4271257c0a8f48668b0f47048d69351675dd8500f22420d4eec378"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12fd88cfe6067e2199964839c19bd2b422ca3fd792949b8f44bb8a4e7d21946a"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dacca921efcd21939123c8ea8883a54b9fa7f6545c8019ffcf4f762985b6d0c8"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de3674a5fe1f6713a746d25ad9c32cd32fadc824e64b9d6159b3b34fd9134143"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65df9dbae6d67e0788a05b4bad5706ad40f6f911e0137eb416b9eead6ba6f044"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ba9a358d59a0a55cccaa4957e6ae10b1a25ffdabda863c0343c51817610501d"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:576eb0f0c6207e9ede2b11ec01d9c2182973986514f9c60bc3b3b5d5798c8f50"}, + {file = "jiter-0.7.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e550e29cdf3577d2c970a18f3959e6b8646fd60ef1b0507e5947dc73703b5627"}, + {file = "jiter-0.7.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81d968dbf3ce0db2e0e4dec6b0a0d5d94f846ee84caf779b07cab49f5325ae43"}, + {file = "jiter-0.7.1-cp313-none-win32.whl", hash = "sha256:f892e547e6e79a1506eb571a676cf2f480a4533675f834e9ae98de84f9b941ac"}, + {file = "jiter-0.7.1-cp313-none-win_amd64.whl", hash = "sha256:0302f0940b1455b2a7fb0409b8d5b31183db70d2b07fd177906d83bf941385d1"}, + {file = "jiter-0.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c65a3ce72b679958b79d556473f192a4dfc5895e8cc1030c9f4e434690906076"}, + {file = "jiter-0.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e80052d3db39f9bb8eb86d207a1be3d9ecee5e05fdec31380817f9609ad38e60"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a497859c4f3f7acd71c8bd89a6f9cf753ebacacf5e3e799138b8e1843084e3"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c1288bc22b9e36854a0536ba83666c3b1fb066b811019d7b682c9cf0269cdf9f"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b096ca72dd38ef35675e1d3b01785874315182243ef7aea9752cb62266ad516f"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dbbd52c50b605af13dbee1a08373c520e6fcc6b5d32f17738875847fea4e2cd"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af29c5c6eb2517e71ffa15c7ae9509fa5e833ec2a99319ac88cc271eca865519"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f114a4df1e40c03c0efbf974b376ed57756a1141eb27d04baee0680c5af3d424"}, + {file = "jiter-0.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:191fbaee7cf46a9dd9b817547bf556facde50f83199d07fc48ebeff4082f9df4"}, + {file = "jiter-0.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e2b445e5ee627fb4ee6bbceeb486251e60a0c881a8e12398dfdff47c56f0723"}, + {file = "jiter-0.7.1-cp38-none-win32.whl", hash = "sha256:47ac4c3cf8135c83e64755b7276339b26cd3c7ddadf9e67306ace4832b283edf"}, + {file = "jiter-0.7.1-cp38-none-win_amd64.whl", hash = "sha256:60b49c245cd90cde4794f5c30f123ee06ccf42fb8730a019a2870cd005653ebd"}, + {file = "jiter-0.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8f212eeacc7203256f526f550d105d8efa24605828382cd7d296b703181ff11d"}, + {file = "jiter-0.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d9e247079d88c00e75e297e6cb3a18a039ebcd79fefc43be9ba4eb7fb43eb726"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0aacaa56360139c53dcf352992b0331f4057a0373bbffd43f64ba0c32d2d155"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc1b55314ca97dbb6c48d9144323896e9c1a25d41c65bcb9550b3e0c270ca560"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f281aae41b47e90deb70e7386558e877a8e62e1693e0086f37d015fa1c102289"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93c20d2730a84d43f7c0b6fb2579dc54335db742a59cf9776d0b80e99d587382"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e81ccccd8069110e150613496deafa10da2f6ff322a707cbec2b0d52a87b9671"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a7d5e85766eff4c9be481d77e2226b4c259999cb6862ccac5ef6621d3c8dcce"}, + {file = "jiter-0.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f52ce5799df5b6975439ecb16b1e879d7655e1685b6e3758c9b1b97696313bfb"}, + {file = "jiter-0.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0c91a0304373fdf97d56f88356a010bba442e6d995eb7773cbe32885b71cdd8"}, + {file = "jiter-0.7.1-cp39-none-win32.whl", hash = "sha256:5c08adf93e41ce2755970e8aa95262298afe2bf58897fb9653c47cd93c3c6cdc"}, + {file = "jiter-0.7.1-cp39-none-win_amd64.whl", hash = "sha256:6592f4067c74176e5f369228fb2995ed01400c9e8e1225fb73417183a5e635f0"}, + {file = "jiter-0.7.1.tar.gz", hash = "sha256:448cf4f74f7363c34cdef26214da527e8eeffd88ba06d0b80b485ad0667baf5d"}, ] [[package]] @@ -1617,26 +1623,29 @@ files = [ [[package]] name = "json-repair" -version = "0.30.1" +version = "0.30.2" description = "A package to repair broken json strings" optional = false python-versions = ">=3.9" files = [ - {file = "json_repair-0.30.1-py3-none-any.whl", hash = "sha256:6fa8a05d246e282df2f812fa542bd837d671d7774eaae11191aabaac97d41e33"}, - {file = "json_repair-0.30.1.tar.gz", hash = "sha256:5f075c4e3b098d78fb6cd60c34aec07a4517f14e9d423ad5364214b0e870e218"}, + {file = "json_repair-0.30.2-py3-none-any.whl", hash = "sha256:824d7ab208f5daadf7925e362979870ba91f9a5e6242d59f7073c7171abe27b5"}, + {file = "json_repair-0.30.2.tar.gz", hash = "sha256:aa244f0d91e81c9587b2b6981a5657a7d4fadb20051f74bc6110f1ca6a963fb9"}, ] [[package]] name = "json5" -version = "0.9.25" +version = "0.9.28" description = "A Python implementation of the JSON5 data format." optional = false -python-versions = ">=3.8" +python-versions = ">=3.8.0" files = [ - {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, - {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, + {file = "json5-0.9.28-py3-none-any.whl", hash = "sha256:29c56f1accdd8bc2e037321237662034a7e07921e2b7223281a5ce2c46f0c4df"}, + {file = "json5-0.9.28.tar.gz", hash = "sha256:1f82f36e615bc5b42f1bbd49dbc94b12563c56408c6ffa06414ea310890e9a6e"}, ] +[package.extras] +dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"] + [[package]] name = "jsonpointer" version = "3.0.0" @@ -1872,13 +1881,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.3.0" +version = "4.3.1" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.3.0-py3-none-any.whl", hash = "sha256:f67e1095ad61ae04349024f0b40345062ab108a0c6998d9810fec6a3c1a70cd5"}, - {file = "jupyterlab-4.3.0.tar.gz", hash = "sha256:7c6835cbf8df0af0ec8a39332e85ff11693fb9a468205343b4fc0bfbc74817e5"}, + {file = "jupyterlab-4.3.1-py3-none-any.whl", hash = "sha256:2d9a1c305bc748e277819a17a5d5e22452e533e835f4237b2f30f3b0e491e01f"}, + {file = "jupyterlab-4.3.1.tar.gz", hash = "sha256:a4a338327556443521731d82f2a6ccf926df478914ca029616621704d47c3c65"}, ] [package.dependencies] @@ -2506,13 +2515,13 @@ pygments = ">2.12.0" [[package]] name = "mkdocs-material" -version = "9.5.43" +version = "9.5.45" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.43-py3-none-any.whl", hash = "sha256:4aae0664c456fd12837a3192e0225c17960ba8bf55d7f0a7daef7e4b0b914a34"}, - {file = "mkdocs_material-9.5.43.tar.gz", hash = "sha256:83be7ff30b65a1e4930dfa4ab911e75780a3afc9583d162692e434581cb46979"}, + {file = "mkdocs_material-9.5.45-py3-none-any.whl", hash = "sha256:a9be237cfd0be14be75f40f1726d83aa3a81ce44808dc3594d47a7a592f44547"}, + {file = "mkdocs_material-9.5.45.tar.gz", hash = "sha256:286489cf0beca4a129d91d59d6417419c63bceed1ce5cd0ec1fc7e1ebffb8189"}, ] [package.dependencies] @@ -2561,13 +2570,13 @@ typer = "==0.*" [[package]] name = "msal" -version = "1.31.0" +version = "1.31.1" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false python-versions = ">=3.7" files = [ - {file = "msal-1.31.0-py3-none-any.whl", hash = "sha256:96bc37cff82ebe4b160d5fc0f1196f6ca8b50e274ecd0ec5bf69c438514086e7"}, - {file = "msal-1.31.0.tar.gz", hash = "sha256:2c4f189cf9cc8f00c80045f66d39b7c0f3ed45873fd3d1f2af9f22db2e12ff4b"}, + {file = "msal-1.31.1-py3-none-any.whl", hash = "sha256:29d9882de247e96db01386496d59f29035e5e841bcac892e6d7bf4390bf6bd17"}, + {file = "msal-1.31.1.tar.gz", hash = "sha256:11b5e6a3f802ffd3a72107203e20c4eac6ef53401961b880af2835b723d80578"}, ] [package.dependencies] @@ -2860,13 +2869,13 @@ files = [ [[package]] name = "openai" -version = "1.54.0" +version = "1.55.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.54.0-py3-none-any.whl", hash = "sha256:24ed8874b56e919f0fbb80b7136c3fb022dc82ce9f5f21579b7b280ea4bba249"}, - {file = "openai-1.54.0.tar.gz", hash = "sha256:df2a84384314165b706722a7ac8988dc33eba20dd7fc3b939d138110e608b1ce"}, + {file = "openai-1.55.0-py3-none-any.whl", hash = "sha256:446e08918f8dd70d8723274be860404c8c7cc46b91b93bbc0ef051f57eb503c1"}, + {file = "openai-1.55.0.tar.gz", hash = "sha256:6c0975ac8540fe639d12b4ff5a8e0bf1424c844c4a4251148f59f06c4b2bd5db"}, ] [package.dependencies] @@ -2895,13 +2904,13 @@ files = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -3055,18 +3064,17 @@ files = [ [[package]] name = "patsy" -version = "0.5.6" +version = "1.0.1" description = "A Python package for describing statistical models and for building design matrices." optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "patsy-0.5.6-py2.py3-none-any.whl", hash = "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6"}, - {file = "patsy-0.5.6.tar.gz", hash = "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb"}, + {file = "patsy-1.0.1-py2.py3-none-any.whl", hash = "sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c"}, + {file = "patsy-1.0.1.tar.gz", hash = "sha256:e786a9391eec818c054e359b737bbce692f051aee4c661f4141cc88fb459c0c4"}, ] [package.dependencies] numpy = ">=1.4" -six = "*" [package.extras] test = ["pytest", "pytest-cov", "scipy"] @@ -3247,52 +3255,52 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "pot" -version = "0.9.4" +version = "0.9.5" description = "Python Optimal Transport Library" optional = false python-versions = ">=3.7" files = [ - {file = "POT-0.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8418ab9c24f549290fdc452caebb58ded05b986a024063fe3354cfd2e704b378"}, - {file = "POT-0.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:096cd3b454f87ff9c8f48d8e221bc26509d8f9355ce99d9fefe83560f82278b5"}, - {file = "POT-0.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6e67d420a479ed66f4549c785e157bb3dce2c5489bf81a44ac922a6e9471fe69"}, - {file = "POT-0.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:107bc7225906a3fa3aafdb441e1d24c55eaf1ee3badd1c93ab6199865f689221"}, - {file = "POT-0.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfee044f744b1722912654c8b905bc289ce160524db5ca0e853f1aa442ffea55"}, - {file = "POT-0.9.4-cp310-cp310-win32.whl", hash = "sha256:421c3efb8da2f1ce9605f9f2068047ea629b95de87baa15b8786b3e664de9dbd"}, - {file = "POT-0.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:6e76194a62f29ddadc975e18cf7f07d22060735bd3fb9a023781e0e126a05822"}, - {file = "POT-0.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:148040b89063790ab784458d5d200ba4a7f36c54fdb62ea0842f8d5d4c5c6ccb"}, - {file = "POT-0.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1109fc77989834a1467be731ff957d90c2b558e772cff6c06fb90f7cbe58b014"}, - {file = "POT-0.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8218cd419e8457b37fe2b8060b5bf9bd07d4671d5f5fa4d5ac98c58b5be8c0"}, - {file = "POT-0.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ea0055f18e26917ff326f39dd5e5fd43bcc9eccaab4b09a4f8d7785c8921250"}, - {file = "POT-0.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f03b4af3f56234787d2a34e0637dac9c1e1de4cb3f7386ca4f91331f0c4af187"}, - {file = "POT-0.9.4-cp311-cp311-win32.whl", hash = "sha256:a69f6d554df1de47dd312fc065d9171bdbedf48c90c8409889485945ffaaeacf"}, - {file = "POT-0.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:8791c8f09a852901e03e2dc1c6aec4f374b58b3ee905a90349713587aa16e26a"}, - {file = "POT-0.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1a7a55b3fd528e6808f99de0165dcacf185eb86ae3aff4d358b850479b76a8ba"}, - {file = "POT-0.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a9bbd2507605be6eae4f0f0d6f6f0ff91ce3eeb5b7c8eeb350e4eb76bcc6940a"}, - {file = "POT-0.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5594ab0e78329307ce4cd293f2de409513876695d60fb4c1013b5dd46069f256"}, - {file = "POT-0.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0ca658105d129b752c8d20751ff2cb965d1bdcaecec319ae489b135c58d9da9"}, - {file = "POT-0.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6732f1acd94959b8fa13a4fa250ad49c1e6894ece488a81f4427dbf13df4776"}, - {file = "POT-0.9.4-cp312-cp312-win32.whl", hash = "sha256:bf7f5253fee6ba7df5dd854b739540f701153cabab80dd25332dfac93d84bec1"}, - {file = "POT-0.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:597ff64b06a157871feb84e6e82b3f5dfbfff57161c14660ab2ddbcc93c940e6"}, - {file = "POT-0.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:385b41606943fbc73f1ab96fd994117d79c4ad782c91bbb7ba74c0359e9de887"}, - {file = "POT-0.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3f697e084243b9fe0a975331e471fd09610343c6aa28172232958e39100ede6"}, - {file = "POT-0.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b967fb9cafc6ad30a6d51b21d6307b384491a106d6dc75f37bee52a3f63575c3"}, - {file = "POT-0.9.4-cp37-cp37m-win32.whl", hash = "sha256:35926c2f4d2ee49309dce340f7f6646fe451ca1e0d11b2d017a851d482bf4468"}, - {file = "POT-0.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:f29fa1fcd591d1940e2279dc1422ff46c0c273f6be4ecbcaa819d91dd196573e"}, - {file = "POT-0.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:63f8b50f448e32a4ae274dd1e68e22b1a2bc291c53c5c6ec5afadfb930b6a809"}, - {file = "POT-0.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cabd13a728d2db40b3989ad57810769dfba8972b686ae7f4881dbd315252e5d9"}, - {file = "POT-0.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5984157d5a819bd6c55db3b0d8fe631ff398c243e80a9e9e933cbd1ee7c7588c"}, - {file = "POT-0.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b8da4e3268eeee40dff96364f0a9f0326979d565d970ec74a1688b8ad338022"}, - {file = "POT-0.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ede957083299e4904627621f4d2c8a6b56af108fef9b486330f65519a395f10a"}, - {file = "POT-0.9.4-cp38-cp38-win32.whl", hash = "sha256:79716079d7970c6c0bf909f986c65d7103135e36b364ba5fa5caed97d7aa6464"}, - {file = "POT-0.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:3246493745bcf2b353312183b9ab547466cae711936f991a6754b62f55ff1dec"}, - {file = "POT-0.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:223c4ca199b679e4c2b8a79fb49d31f2c7fab2975c2c37d1e68a0a7fbe2bc55d"}, - {file = "POT-0.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c30d77994d02984ad32665f5975e272e8c02e8d5288c4edfbec08617c5c38f91"}, - {file = "POT-0.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b0fe5be45112c12cc0f6ab61fb85ed9161ca540b24a4037e5d53ab86f390a49"}, - {file = "POT-0.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab68bdfeae54719d202e923f18ec29869c09b105e42f94568221fc92996f0f4d"}, - {file = "POT-0.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2847015e3bb65171eb70eca786f8cebe806960af40625ebc17c858b6314a9e0b"}, - {file = "POT-0.9.4-cp39-cp39-win32.whl", hash = "sha256:2e35d68c6e676108d6eeb7e6b119c4c19dca364992bca57f3f513660bfb1810c"}, - {file = "POT-0.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:e7d029f024ed58f8d10b3e4d517df551bb9758ac12d0503be793f44258f2dffc"}, - {file = "pot-0.9.4.tar.gz", hash = "sha256:4cf8b46bf4992c37529161c32dd5e3334e0c089399142f08ed6d455b57015edd"}, + {file = "POT-0.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:34d766c38e65a69c087b01a854fe89fbd152c3e8af93da2227b6c40aed6d37b9"}, + {file = "POT-0.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5407377256de11b6fdc94bbba9b50ea5a2301570905fc9014541cc8473806d9"}, + {file = "POT-0.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f37039cd356198c1fb994e7d935b9bf75d44f2a40319d298bf8cc149eb360d5"}, + {file = "POT-0.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00a18427c9abdd107a2285ea0a814c6b22e95a1af8f88a37c56f23cd216f7a6b"}, + {file = "POT-0.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0dc608cea1107289a58dec33cddc1b0a3fea77ff36d66e2c8ac7aeea543969a"}, + {file = "POT-0.9.5-cp310-cp310-win32.whl", hash = "sha256:8312bee055389db47adab063749c8d77b5981534177ca6cd9b91e4fb68f69d00"}, + {file = "POT-0.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:043706d69202ac87e140121ba32ed1b038f2b3fc4a5549586187239a583cd50d"}, + {file = "POT-0.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b5f000da00e408ff781672a4895bfa8daacec055bd534c9e66ead479f3c6d83c"}, + {file = "POT-0.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9eddd9ff29bdb17d4db8ba00ba18d42656c694a128591502bf59afc1369e1bb3"}, + {file = "POT-0.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7eb9b88c73387a9966775a6f6d077d9d071814783701d2656dc05b5032a9662d"}, + {file = "POT-0.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f44446056f5fc9d132ed8e431732c33cbe754fb1e6d73636f1b6ae811be7df"}, + {file = "POT-0.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7f5d27bc9063e01b03d906bb77e7b3428065fdd72ed64233b249584ead2e2bf"}, + {file = "POT-0.9.5-cp311-cp311-win32.whl", hash = "sha256:cd79a8b4d35b706f2124f73ebff3bb1ce3450e01cc8f610eda3b6ce13616b829"}, + {file = "POT-0.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:6680aadb69df2f75a413fe9c58bd1c5cb744d017a7c8ba8841654fd0dc75433b"}, + {file = "POT-0.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7d57f96b333c9816a2af7817753108739b38155e52648c5967681dbd89d92ed2"}, + {file = "POT-0.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:afad647c78f999439f8c5cbcf74b03c5c0afefb08727cd7d68994130fabfc761"}, + {file = "POT-0.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bca891c28592d6e0e8f04b35989de7005f0fb9b3923f00537f1b269c5084aa7b"}, + {file = "POT-0.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:088c930a5fcd1e8e36fb6af710df47ce6e9331b6b5a28eb09c673df4186dcb10"}, + {file = "POT-0.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfb18268fac1e982e21821a03f802802a0d579c4690988b764115dd886dc38f5"}, + {file = "POT-0.9.5-cp312-cp312-win32.whl", hash = "sha256:931fa46ff8e01d47309207243988c783a2d8364452bc080b130c5d319349ad3f"}, + {file = "POT-0.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:be786612b391c2e4d3b5db4e7d51cdb2360284e3a6949990051c2eb102f60d3c"}, + {file = "POT-0.9.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:844820020240bad66ca07255289df9ed1e46c5f71ba2401852833c0dd114c660"}, + {file = "POT-0.9.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a76a5bed3af51db1a10c59ba376f500a743f8e20c2a6d4851c4535dbbed17714"}, + {file = "POT-0.9.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a03da3283cb04a1fa3258f0096ad9cfa3311192d5a6bee3a2ca0e15304f8652"}, + {file = "POT-0.9.5-cp37-cp37m-win32.whl", hash = "sha256:dc50b8005b4dfa3478f0bf841c22d8b3500a8a04e5673da146d71f7039607e3a"}, + {file = "POT-0.9.5-cp37-cp37m-win_amd64.whl", hash = "sha256:a9cab787bcb3ce6d23ef297c115baad34ed578a98b4a02afba8cb4e30e39d171"}, + {file = "POT-0.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:926ba491b5b1f43fb0f3bc6e9d92b6cc634c12e2fa778eba88d9350e82fc2c88"}, + {file = "POT-0.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b77b630a303868ee14015a4306d7e852b174d4a734815c67e27cd45fd59cc07"}, + {file = "POT-0.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:db0dd974328cbdd7b20477fb5757326dda22d77cb639f4759296fcd206db380f"}, + {file = "POT-0.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb29c375d02bb5aadad527133e9c20dd73930d8e2294434dc5306fb740a49d9e"}, + {file = "POT-0.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:293e0993d66b09db69c2282edbf859e1de57a3f15b99bd909609ce120380b398"}, + {file = "POT-0.9.5-cp38-cp38-win32.whl", hash = "sha256:5996d538885b834e36a3838bc73adeb747bd54ab0a2b3178addbb35b3edafa45"}, + {file = "POT-0.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:0131aab58d57bf5876d826461d0968d1a655b611cc8c0297c38ab8a235e0d627"}, + {file = "POT-0.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95c29ee3e647b272bfcb35c3c4cb7409326a0a6d3bf3ed8460495e9ac3f3a76d"}, + {file = "POT-0.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b1bca1b3465eadab9d5e1c075122963da3e921102555d1c6b7ff3c1f437d3e18"}, + {file = "POT-0.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e64f5d8890e21eb1e7decac694c34820496238e7d9c95309411e58cb0b04d384"}, + {file = "POT-0.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fa190662670868126a2372499aec513bd4ac50b4565fe2014525c7cef11e2bf"}, + {file = "POT-0.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9b775daf69cb4043897050961f9b654c30261543e531d53248a99e5599db0c8"}, + {file = "POT-0.9.5-cp39-cp39-win32.whl", hash = "sha256:ceea4cffebce88211cd63bfddc878e2f29a6b6347125cbac40fa214308315878"}, + {file = "POT-0.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:2f6af660505772833d4ccc189d9de264b429d9ec8e0cb564f33d2181e6f1bbce"}, + {file = "pot-0.9.5.tar.gz", hash = "sha256:9644ee7ff51c3cffa3c2632b9dd9dff4f3520266f9fb771450935ffb646d6042"}, ] [package.dependencies] @@ -3481,19 +3489,19 @@ files = [ [[package]] name = "pydantic" -version = "2.9.2" +version = "2.10.0" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, - {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, + {file = "pydantic-2.10.0-py3-none-any.whl", hash = "sha256:5e7807ba9201bdf61b1b58aa6eb690916c40a47acfb114b1b4fef3e7fd5b30fc"}, + {file = "pydantic-2.10.0.tar.gz", hash = "sha256:0aca0f045ff6e2f097f1fe89521115335f15049eeb8a7bef3dafe4b19a74e289"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.23.4" -typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} +pydantic-core = "2.27.0" +typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] @@ -3501,100 +3509,111 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.23.4" +version = "2.27.0" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, - {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, - {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, - {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, - {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, - {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, - {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, - {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, - {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, - {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, - {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, - {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, - {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, - {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, - {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, - {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, - {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, - {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, - {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, - {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, - {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, - {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, - {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, - {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, - {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, - {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, - {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, - {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, - {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, - {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, - {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, - {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, - {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, - {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, + {file = "pydantic_core-2.27.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2ac6b919f7fed71b17fe0b4603c092a4c9b5bae414817c9c81d3c22d1e1bcc"}, + {file = "pydantic_core-2.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e015833384ca3e1a0565a79f5d953b0629d9138021c27ad37c92a9fa1af7623c"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db72e40628967f6dc572020d04b5f800d71264e0531c6da35097e73bdf38b003"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df45c4073bed486ea2f18757057953afed8dd77add7276ff01bccb79982cf46c"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:836a4bfe0cc6d36dc9a9cc1a7b391265bf6ce9d1eb1eac62ac5139f5d8d9a6fa"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bf1340ae507f6da6360b24179c2083857c8ca7644aab65807023cf35404ea8d"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ab325fc86fbc077284c8d7f996d904d30e97904a87d6fb303dce6b3de7ebba9"}, + {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1da0c98a85a6c6ed702d5556db3b09c91f9b0b78de37b7593e2de8d03238807a"}, + {file = "pydantic_core-2.27.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b0202ebf2268954090209a84f9897345719e46a57c5f2c9b7b250ca0a9d3e63"}, + {file = "pydantic_core-2.27.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:35380671c3c921fe8adf31ad349dc6f7588b7e928dbe44e1093789734f607399"}, + {file = "pydantic_core-2.27.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b4c19525c3538fbc0bbda6229f9682fb8199ce9ac37395880e6952798e00373"}, + {file = "pydantic_core-2.27.0-cp310-none-win32.whl", hash = "sha256:333c840a1303d1474f491e7be0b718226c730a39ead0f7dab2c7e6a2f3855555"}, + {file = "pydantic_core-2.27.0-cp310-none-win_amd64.whl", hash = "sha256:99b2863c1365f43f74199c980a3d40f18a218fbe683dd64e470199db426c4d6a"}, + {file = "pydantic_core-2.27.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4523c4009c3f39d948e01962223c9f5538602e7087a628479b723c939fab262d"}, + {file = "pydantic_core-2.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84af1cf7bfdcbc6fcf5a5f70cc9896205e0350306e4dd73d54b6a18894f79386"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e65466b31be1070b4a5b7dbfbd14b247884cb8e8b79c64fb0f36b472912dbaea"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a5c022bb0d453192426221605efc865373dde43b17822a264671c53b068ac20c"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6bb69bf3b6500f195c3deb69c1205ba8fc3cb21d1915f1f158a10d6b1ef29b6a"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aa4d1b2eba9a325897308b3124014a142cdccb9f3e016f31d3ebee6b5ea5e75"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e96ca781e0c01e32115912ebdf7b3fb0780ce748b80d7d28a0802fa9fbaf44e"}, + {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b872c86d8d71827235c7077461c502feb2db3f87d9d6d5a9daa64287d75e4fa0"}, + {file = "pydantic_core-2.27.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:82e1ad4ca170e8af4c928b67cff731b6296e6a0a0981b97b2eb7c275cc4e15bd"}, + {file = "pydantic_core-2.27.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:eb40f828bc2f73f777d1eb8fee2e86cd9692a4518b63b6b5aa8af915dfd3207b"}, + {file = "pydantic_core-2.27.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9a8fbf506fde1529a1e3698198fe64bfbe2e0c09557bc6a7dcf872e7c01fec40"}, + {file = "pydantic_core-2.27.0-cp311-none-win32.whl", hash = "sha256:24f984fc7762ed5f806d9e8c4c77ea69fdb2afd987b4fd319ef06c87595a8c55"}, + {file = "pydantic_core-2.27.0-cp311-none-win_amd64.whl", hash = "sha256:68950bc08f9735306322bfc16a18391fcaac99ded2509e1cc41d03ccb6013cfe"}, + {file = "pydantic_core-2.27.0-cp311-none-win_arm64.whl", hash = "sha256:3eb8849445c26b41c5a474061032c53e14fe92a11a5db969f722a2716cd12206"}, + {file = "pydantic_core-2.27.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8117839a9bdbba86e7f9df57018fe3b96cec934c3940b591b0fd3fbfb485864a"}, + {file = "pydantic_core-2.27.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a291d0b4243a259c8ea7e2b84eb9ccb76370e569298875a7c5e3e71baf49057a"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e35afd9e10b2698e6f2f32256678cb23ca6c1568d02628033a837638b3ed12"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58ab0d979c969983cdb97374698d847a4acffb217d543e172838864636ef10d9"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d06b667e53320332be2bf6f9461f4a9b78092a079b8ce8634c9afaa7e10cd9f"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78f841523729e43e3928a364ec46e2e3f80e6625a4f62aca5c345f3f626c6e8a"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:400bf470e4327e920883b51e255617dfe4496d4e80c3fea0b5a5d0bf2c404dd4"}, + {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:951e71da6c89d354572098bada5ba5b5dc3a9390c933af8a614e37755d3d1840"}, + {file = "pydantic_core-2.27.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a51ce96224eadd1845150b204389623c8e129fde5a67a84b972bd83a85c6c40"}, + {file = "pydantic_core-2.27.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:483c2213a609e7db2c592bbc015da58b6c75af7360ca3c981f178110d9787bcf"}, + {file = "pydantic_core-2.27.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:359e7951f04ad35111b5ddce184db3391442345d0ab073aa63a95eb8af25a5ef"}, + {file = "pydantic_core-2.27.0-cp312-none-win32.whl", hash = "sha256:ee7d9d5537daf6d5c74a83b38a638cc001b648096c1cae8ef695b0c919d9d379"}, + {file = "pydantic_core-2.27.0-cp312-none-win_amd64.whl", hash = "sha256:2be0ad541bb9f059954ccf8877a49ed73877f862529575ff3d54bf4223e4dd61"}, + {file = "pydantic_core-2.27.0-cp312-none-win_arm64.whl", hash = "sha256:6e19401742ed7b69e51d8e4df3c03ad5ec65a83b36244479fd70edde2828a5d9"}, + {file = "pydantic_core-2.27.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5f2b19b8d6fca432cb3acf48cf5243a7bf512988029b6e6fd27e9e8c0a204d85"}, + {file = "pydantic_core-2.27.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c86679f443e7085ea55a7376462553996c688395d18ef3f0d3dbad7838f857a2"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:510b11e9c3b1a852876d1ccd8d5903684336d635214148637ceb27366c75a467"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb704155e73b833801c247f39d562229c0303f54770ca14fb1c053acb376cf10"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ce048deb1e033e7a865ca384770bccc11d44179cf09e5193a535c4c2f497bdc"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58560828ee0951bb125c6f2862fbc37f039996d19ceb6d8ff1905abf7da0bf3d"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb4785894936d7682635726613c44578c420a096729f1978cd061a7e72d5275"}, + {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2883b260f7a93235488699d39cbbd94fa7b175d3a8063fbfddd3e81ad9988cb2"}, + {file = "pydantic_core-2.27.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c6fcb3fa3855d583aa57b94cf146f7781d5d5bc06cb95cb3afece33d31aac39b"}, + {file = "pydantic_core-2.27.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e851a051f7260e6d688267eb039c81f05f23a19431bd7dfa4bf5e3cb34c108cd"}, + {file = "pydantic_core-2.27.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edb1bfd45227dec8d50bc7c7d86463cd8728bcc574f9b07de7369880de4626a3"}, + {file = "pydantic_core-2.27.0-cp313-none-win32.whl", hash = "sha256:678f66462058dd978702db17eb6a3633d634f7aa0deaea61e0a674152766d3fc"}, + {file = "pydantic_core-2.27.0-cp313-none-win_amd64.whl", hash = "sha256:d28ca7066d6cdd347a50d8b725dc10d9a1d6a1cce09836cf071ea6a2d4908be0"}, + {file = "pydantic_core-2.27.0-cp313-none-win_arm64.whl", hash = "sha256:6f4a53af9e81d757756508b57cae1cf28293f0f31b9fa2bfcb416cc7fb230f9d"}, + {file = "pydantic_core-2.27.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:e9f9feee7f334b72ceae46313333d002b56f325b5f04271b4ae2aadd9e993ae4"}, + {file = "pydantic_core-2.27.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:225bfff5d425c34e1fd562cef52d673579d59b967d9de06178850c4802af9039"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921ad596ff1a82f9c692b0758c944355abc9f0de97a4c13ca60ffc6d8dc15d4"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6354e18a9be37bfa124d6b288a87fb30c673745806c92956f1a25e3ae6e76b96"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ee4c2a75af9fe21269a4a0898c5425afb01af1f5d276063f57e2ae1bc64e191"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c91e3c04f5191fd3fb68764bddeaf02025492d5d9f23343b283870f6ace69708"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a6ebfac28fd51890a61df36ef202adbd77d00ee5aca4a3dadb3d9ed49cfb929"}, + {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36aa167f69d8807ba7e341d67ea93e50fcaaf6bc433bb04939430fa3dab06f31"}, + {file = "pydantic_core-2.27.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e8d89c276234579cd3d095d5fa2a44eb10db9a218664a17b56363cddf226ff3"}, + {file = "pydantic_core-2.27.0-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:5cc822ab90a70ea3a91e6aed3afac570b276b1278c6909b1d384f745bd09c714"}, + {file = "pydantic_core-2.27.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e15315691fe2253eb447503153acef4d7223dfe7e7702f9ed66539fcd0c43801"}, + {file = "pydantic_core-2.27.0-cp38-none-win32.whl", hash = "sha256:dfa5f5c0a4c8fced1422dc2ca7eefd872d5d13eb33cf324361dbf1dbfba0a9fe"}, + {file = "pydantic_core-2.27.0-cp38-none-win_amd64.whl", hash = "sha256:513cb14c0cc31a4dfd849a4674b20c46d87b364f997bbcb02282306f5e187abf"}, + {file = "pydantic_core-2.27.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:4148dc9184ab79e356dc00a4199dc0ee8647973332cb385fc29a7cced49b9f9c"}, + {file = "pydantic_core-2.27.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5fc72fbfebbf42c0856a824b8b0dc2b5cd2e4a896050281a21cfa6fed8879cb1"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:185ef205256cd8b38431205698531026979db89a79587725c1e55c59101d64e9"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:395e3e1148fa7809016231f8065f30bb0dc285a97b4dc4360cd86e17bab58af7"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33d14369739c5d07e2e7102cdb0081a1fa46ed03215e07f097b34e020b83b1ae"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7820bb0d65e3ce1e3e70b6708c2f66143f55912fa02f4b618d0f08b61575f12"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43b61989068de9ce62296cde02beffabcadb65672207fc51e7af76dca75e6636"}, + {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15e350efb67b855cd014c218716feea4986a149ed1f42a539edd271ee074a196"}, + {file = "pydantic_core-2.27.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:433689845288f9a1ee5714444e65957be26d30915f7745091ede4a83cfb2d7bb"}, + {file = "pydantic_core-2.27.0-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:3fd8bc2690e7c39eecdf9071b6a889ce7b22b72073863940edc2a0a23750ca90"}, + {file = "pydantic_core-2.27.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:884f1806609c2c66564082540cffc96868c5571c7c3cf3a783f63f2fb49bd3cd"}, + {file = "pydantic_core-2.27.0-cp39-none-win32.whl", hash = "sha256:bf37b72834e7239cf84d4a0b2c050e7f9e48bced97bad9bdf98d26b8eb72e846"}, + {file = "pydantic_core-2.27.0-cp39-none-win_amd64.whl", hash = "sha256:31a2cae5f059329f9cfe3d8d266d3da1543b60b60130d186d9b6a3c20a346361"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4fb49cfdb53af5041aba909be00cccfb2c0d0a2e09281bf542371c5fd36ad04c"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:49633583eb7dc5cba61aaf7cdb2e9e662323ad394e543ee77af265736bcd3eaa"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:153017e3d6cd3ce979de06d84343ca424bb6092727375eba1968c8b4693c6ecb"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff63a92f6e249514ef35bc795de10745be0226eaea06eb48b4bbeaa0c8850a4a"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5982048129f40b082c2654de10c0f37c67a14f5ff9d37cf35be028ae982f26df"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:91bc66f878557313c2a6bcf396e7befcffe5ab4354cfe4427318968af31143c3"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:68ef5377eb582fa4343c9d0b57a5b094046d447b4c73dd9fbd9ffb216f829e7d"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c5726eec789ee38f2c53b10b1821457b82274f81f4f746bb1e666d8741fcfadb"}, + {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c0c431e4be5c1a0c6654e0c31c661cd89e0ca956ef65305c3c3fd96f4e72ca39"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:8e21d927469d04b39386255bf00d0feedead16f6253dcc85e9e10ddebc334084"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b51f964fcbb02949fc546022e56cdb16cda457af485e9a3e8b78ac2ecf5d77e"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a7fd4de38f7ff99a37e18fa0098c3140286451bc823d1746ba80cec5b433a1"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fda87808429c520a002a85d6e7cdadbf58231d60e96260976c5b8f9a12a8e13"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a150392102c402c538190730fda06f3bce654fc498865579a9f2c1d2b425833"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c9ed88b398ba7e3bad7bd64d66cc01dcde9cfcb7ec629a6fd78a82fa0b559d78"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:9fe94d9d2a2b4edd7a4b22adcd45814b1b59b03feb00e56deb2e89747aec7bfe"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d8b5ee4ae9170e2775d495b81f414cc20268041c42571530513496ba61e94ba3"}, + {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d29e235ce13c91902ef3efc3d883a677655b3908b1cbc73dee816e5e1f8f7739"}, + {file = "pydantic_core-2.27.0.tar.gz", hash = "sha256:f57783fbaf648205ac50ae7d646f27582fc706be3977e87c3c124e7a92407b10"}, ] [package.dependencies] @@ -3616,13 +3635,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.9.0" +version = "2.10.0" description = "JSON Web Token implementation in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "PyJWT-2.9.0-py3-none-any.whl", hash = "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850"}, - {file = "pyjwt-2.9.0.tar.gz", hash = "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c"}, + {file = "PyJWT-2.10.0-py3-none-any.whl", hash = "sha256:543b77207db656de204372350926bed5a86201c4cbff159f623f79c7bb487a15"}, + {file = "pyjwt-2.10.0.tar.gz", hash = "sha256:7628a7eb7938959ac1b26e819a1df0fd3259505627b575e4bad6d08f76db695c"}, ] [package.dependencies] @@ -3712,13 +3731,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyright" -version = "1.1.387" +version = "1.1.389" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.387-py3-none-any.whl", hash = "sha256:6a1f495a261a72e12ad17e20d1ae3df4511223c773b19407cfa006229b1b08a5"}, - {file = "pyright-1.1.387.tar.gz", hash = "sha256:577de60224f7fe36505d5b181231e3a395d427b7873be0bbcaa962a29ea93a60"}, + {file = "pyright-1.1.389-py3-none-any.whl", hash = "sha256:41e9620bba9254406dc1f621a88ceab5a88af4c826feb4f614d95691ed243a60"}, + {file = "pyright-1.1.389.tar.gz", hash = "sha256:716bf8cc174ab8b4dcf6828c3298cac05c5ed775dda9910106a5dcfe4c7fe220"}, ] [package.dependencies] @@ -4090,105 +4109,105 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.9.11" +version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, - {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, - {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, - {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, - {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, - {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, - {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, - {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, - {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, - {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, - {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, - {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, - {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, - {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, - {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, - {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, - {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, - {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, - {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, - {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, - {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, - {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, - {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, - {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, - {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, - {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, - {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, - {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, - {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, - {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, - {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, - {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, + {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, + {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, + {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, + {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, + {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, + {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, + {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, + {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, + {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, + {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, + {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, + {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, + {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, + {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, + {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, + {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, + {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, + {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, + {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, + {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, + {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, + {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, + {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, + {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, + {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, + {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, + {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, + {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, + {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, + {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, + {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, ] [[package]] @@ -4273,114 +4292,101 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.20.1" +version = "0.21.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "rpds_py-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a649dfd735fff086e8a9d0503a9f0c7d01b7912a333c7ae77e1515c08c146dad"}, - {file = "rpds_py-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f16bc1334853e91ddaaa1217045dd7be166170beec337576818461268a3de67f"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14511a539afee6f9ab492b543060c7491c99924314977a55c98bfa2ee29ce78c"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ccb8ac2d3c71cda472b75af42818981bdacf48d2e21c36331b50b4f16930163"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c142b88039b92e7e0cb2552e8967077e3179b22359e945574f5e2764c3953dcf"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f19169781dddae7478a32301b499b2858bc52fc45a112955e798ee307e294977"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13c56de6518e14b9bf6edde23c4c39dac5b48dcf04160ea7bce8fca8397cdf86"}, - {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:925d176a549f4832c6f69fa6026071294ab5910e82a0fe6c6228fce17b0706bd"}, - {file = "rpds_py-0.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78f0b6877bfce7a3d1ff150391354a410c55d3cdce386f862926a4958ad5ab7e"}, - {file = "rpds_py-0.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3dd645e2b0dcb0fd05bf58e2e54c13875847687d0b71941ad2e757e5d89d4356"}, - {file = "rpds_py-0.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4f676e21db2f8c72ff0936f895271e7a700aa1f8d31b40e4e43442ba94973899"}, - {file = "rpds_py-0.20.1-cp310-none-win32.whl", hash = "sha256:648386ddd1e19b4a6abab69139b002bc49ebf065b596119f8f37c38e9ecee8ff"}, - {file = "rpds_py-0.20.1-cp310-none-win_amd64.whl", hash = "sha256:d9ecb51120de61e4604650666d1f2b68444d46ae18fd492245a08f53ad2b7711"}, - {file = "rpds_py-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:762703bdd2b30983c1d9e62b4c88664df4a8a4d5ec0e9253b0231171f18f6d75"}, - {file = "rpds_py-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0b581f47257a9fce535c4567782a8976002d6b8afa2c39ff616edf87cbeff712"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842c19a6ce894493563c3bd00d81d5100e8e57d70209e84d5491940fdb8b9e3a"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42cbde7789f5c0bcd6816cb29808e36c01b960fb5d29f11e052215aa85497c93"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c8e9340ce5a52f95fa7d3b552b35c7e8f3874d74a03a8a69279fd5fca5dc751"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ba6f89cac95c0900d932c9efb7f0fb6ca47f6687feec41abcb1bd5e2bd45535"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a916087371afd9648e1962e67403c53f9c49ca47b9680adbeef79da3a7811b0"}, - {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:200a23239781f46149e6a415f1e870c5ef1e712939fe8fa63035cd053ac2638e"}, - {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58b1d5dd591973d426cbb2da5e27ba0339209832b2f3315928c9790e13f159e8"}, - {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6b73c67850ca7cae0f6c56f71e356d7e9fa25958d3e18a64927c2d930859b8e4"}, - {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8761c3c891cc51e90bc9926d6d2f59b27beaf86c74622c8979380a29cc23ac3"}, - {file = "rpds_py-0.20.1-cp311-none-win32.whl", hash = "sha256:cd945871335a639275eee904caef90041568ce3b42f402c6959b460d25ae8732"}, - {file = "rpds_py-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:7e21b7031e17c6b0e445f42ccc77f79a97e2687023c5746bfb7a9e45e0921b84"}, - {file = "rpds_py-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:36785be22066966a27348444b40389f8444671630063edfb1a2eb04318721e17"}, - {file = "rpds_py-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:142c0a5124d9bd0e2976089484af5c74f47bd3298f2ed651ef54ea728d2ea42c"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbddc10776ca7ebf2a299c41a4dde8ea0d8e3547bfd731cb87af2e8f5bf8962d"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15a842bb369e00295392e7ce192de9dcbf136954614124a667f9f9f17d6a216f"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be5ef2f1fc586a7372bfc355986226484e06d1dc4f9402539872c8bb99e34b01"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbcf360c9e3399b056a238523146ea77eeb2a596ce263b8814c900263e46031a"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd27a66740ffd621d20b9a2f2b5ee4129a56e27bfb9458a3bcc2e45794c96cb"}, - {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0b937b2a1988f184a3e9e577adaa8aede21ec0b38320d6009e02bd026db04fa"}, - {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6889469bfdc1eddf489729b471303739bf04555bb151fe8875931f8564309afc"}, - {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19b73643c802f4eaf13d97f7855d0fb527fbc92ab7013c4ad0e13a6ae0ed23bd"}, - {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c6afcf2338e7f374e8edc765c79fbcb4061d02b15dd5f8f314a4af2bdc7feb5"}, - {file = "rpds_py-0.20.1-cp312-none-win32.whl", hash = "sha256:dc73505153798c6f74854aba69cc75953888cf9866465196889c7cdd351e720c"}, - {file = "rpds_py-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:8bbe951244a838a51289ee53a6bae3a07f26d4e179b96fc7ddd3301caf0518eb"}, - {file = "rpds_py-0.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6ca91093a4a8da4afae7fe6a222c3b53ee4eef433ebfee4d54978a103435159e"}, - {file = "rpds_py-0.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b9c2fe36d1f758b28121bef29ed1dee9b7a2453e997528e7d1ac99b94892527c"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f009c69bc8c53db5dfab72ac760895dc1f2bc1b62ab7408b253c8d1ec52459fc"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6740a3e8d43a32629bb9b009017ea5b9e713b7210ba48ac8d4cb6d99d86c8ee8"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32b922e13d4c0080d03e7b62991ad7f5007d9cd74e239c4b16bc85ae8b70252d"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe00a9057d100e69b4ae4a094203a708d65b0f345ed546fdef86498bf5390982"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fe9b04b6fa685bd39237d45fad89ba19e9163a1ccaa16611a812e682913496"}, - {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa7ac11e294304e615b43f8c441fee5d40094275ed7311f3420d805fde9b07b4"}, - {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aa97af1558a9bef4025f8f5d8c60d712e0a3b13a2fe875511defc6ee77a1ab7"}, - {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:483b29f6f7ffa6af845107d4efe2e3fa8fb2693de8657bc1849f674296ff6a5a"}, - {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37fe0f12aebb6a0e3e17bb4cd356b1286d2d18d2e93b2d39fe647138458b4bcb"}, - {file = "rpds_py-0.20.1-cp313-none-win32.whl", hash = "sha256:a624cc00ef2158e04188df5e3016385b9353638139a06fb77057b3498f794782"}, - {file = "rpds_py-0.20.1-cp313-none-win_amd64.whl", hash = "sha256:b71b8666eeea69d6363248822078c075bac6ed135faa9216aa85f295ff009b1e"}, - {file = "rpds_py-0.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5b48e790e0355865197ad0aca8cde3d8ede347831e1959e158369eb3493d2191"}, - {file = "rpds_py-0.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3e310838a5801795207c66c73ea903deda321e6146d6f282e85fa7e3e4854804"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249280b870e6a42c0d972339e9cc22ee98730a99cd7f2f727549af80dd5a963"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e79059d67bea28b53d255c1437b25391653263f0e69cd7dec170d778fdbca95e"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b431c777c9653e569986ecf69ff4a5dba281cded16043d348bf9ba505486f36"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da584ff96ec95e97925174eb8237e32f626e7a1a97888cdd27ee2f1f24dd0ad8"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a0629ec053fc013808a85178524e3cb63a61dbc35b22499870194a63578fb9"}, - {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fbf15aff64a163db29a91ed0868af181d6f68ec1a3a7d5afcfe4501252840bad"}, - {file = "rpds_py-0.20.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:07924c1b938798797d60c6308fa8ad3b3f0201802f82e4a2c41bb3fafb44cc28"}, - {file = "rpds_py-0.20.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4a5a844f68776a7715ecb30843b453f07ac89bad393431efbf7accca3ef599c1"}, - {file = "rpds_py-0.20.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:518d2ca43c358929bf08f9079b617f1c2ca6e8848f83c1225c88caeac46e6cbc"}, - {file = "rpds_py-0.20.1-cp38-none-win32.whl", hash = "sha256:3aea7eed3e55119635a74bbeb80b35e776bafccb70d97e8ff838816c124539f1"}, - {file = "rpds_py-0.20.1-cp38-none-win_amd64.whl", hash = "sha256:7dca7081e9a0c3b6490a145593f6fe3173a94197f2cb9891183ef75e9d64c425"}, - {file = "rpds_py-0.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b41b6321805c472f66990c2849e152aff7bc359eb92f781e3f606609eac877ad"}, - {file = "rpds_py-0.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a90c373ea2975519b58dece25853dbcb9779b05cc46b4819cb1917e3b3215b6"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16d4477bcb9fbbd7b5b0e4a5d9b493e42026c0bf1f06f723a9353f5153e75d30"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84b8382a90539910b53a6307f7c35697bc7e6ffb25d9c1d4e998a13e842a5e83"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4888e117dd41b9d34194d9e31631af70d3d526efc363085e3089ab1a62c32ed1"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5265505b3d61a0f56618c9b941dc54dc334dc6e660f1592d112cd103d914a6db"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e75ba609dba23f2c95b776efb9dd3f0b78a76a151e96f96cc5b6b1b0004de66f"}, - {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1791ff70bc975b098fe6ecf04356a10e9e2bd7dc21fa7351c1742fdeb9b4966f"}, - {file = "rpds_py-0.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d126b52e4a473d40232ec2052a8b232270ed1f8c9571aaf33f73a14cc298c24f"}, - {file = "rpds_py-0.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c14937af98c4cc362a1d4374806204dd51b1e12dded1ae30645c298e5a5c4cb1"}, - {file = "rpds_py-0.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3d089d0b88996df627693639d123c8158cff41c0651f646cd8fd292c7da90eaf"}, - {file = "rpds_py-0.20.1-cp39-none-win32.whl", hash = "sha256:653647b8838cf83b2e7e6a0364f49af96deec64d2a6578324db58380cff82aca"}, - {file = "rpds_py-0.20.1-cp39-none-win_amd64.whl", hash = "sha256:fa41a64ac5b08b292906e248549ab48b69c5428f3987b09689ab2441f267d04d"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a07ced2b22f0cf0b55a6a510078174c31b6d8544f3bc00c2bcee52b3d613f74"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:68cb0a499f2c4a088fd2f521453e22ed3527154136a855c62e148b7883b99f9a"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa3060d885657abc549b2a0f8e1b79699290e5d83845141717c6c90c2df38311"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f3b65d2392e1c5cec27cff08fdc0080270d5a1a4b2ea1d51d5f4a2620ff08d"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cc3712a4b0b76a1d45a9302dd2f53ff339614b1c29603a911318f2357b04dd2"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d4eea0761e37485c9b81400437adb11c40e13ef513375bbd6973e34100aeb06"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f5179583d7a6cdb981151dd349786cbc318bab54963a192692d945dd3f6435d"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fbb0ffc754490aff6dabbf28064be47f0f9ca0b9755976f945214965b3ace7e"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a94e52537a0e0a85429eda9e49f272ada715506d3b2431f64b8a3e34eb5f3e75"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:92b68b79c0da2a980b1c4197e56ac3dd0c8a149b4603747c4378914a68706979"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:93da1d3db08a827eda74356f9f58884adb254e59b6664f64cc04cdff2cc19b0d"}, - {file = "rpds_py-0.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:754bbed1a4ca48479e9d4182a561d001bbf81543876cdded6f695ec3d465846b"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ca449520e7484534a2a44faf629362cae62b660601432d04c482283c47eaebab"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9c4cb04a16b0f199a8c9bf807269b2f63b7b5b11425e4a6bd44bd6961d28282c"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63804105143c7e24cee7db89e37cb3f3941f8e80c4379a0b355c52a52b6780"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:55cd1fa4ecfa6d9f14fbd97ac24803e6f73e897c738f771a9fe038f2f11ff07c"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f8f741b6292c86059ed175d80eefa80997125b7c478fb8769fd9ac8943a16c0"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fc212779bf8411667234b3cdd34d53de6c2b8b8b958e1e12cb473a5f367c338"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ad56edabcdb428c2e33bbf24f255fe2b43253b7d13a2cdbf05de955217313e6"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a3a1e9ee9728b2c1734f65d6a1d376c6f2f6fdcc13bb007a08cc4b1ff576dc5"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e13de156137b7095442b288e72f33503a469aa1980ed856b43c353ac86390519"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:07f59760ef99f31422c49038964b31c4dfcfeb5d2384ebfc71058a7c9adae2d2"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:59240685e7da61fb78f65a9f07f8108e36a83317c53f7b276b4175dc44151684"}, - {file = "rpds_py-0.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:83cba698cfb3c2c5a7c3c6bac12fe6c6a51aae69513726be6411076185a8b24a"}, - {file = "rpds_py-0.20.1.tar.gz", hash = "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350"}, + {file = "rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590"}, + {file = "rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5"}, + {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e"}, + {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153"}, + {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624"}, + {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664"}, + {file = "rpds_py-0.21.0-cp310-none-win32.whl", hash = "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682"}, + {file = "rpds_py-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5"}, + {file = "rpds_py-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95"}, + {file = "rpds_py-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d"}, + {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a"}, + {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8"}, + {file = "rpds_py-0.21.0-cp311-none-win32.whl", hash = "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a"}, + {file = "rpds_py-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e"}, + {file = "rpds_py-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d"}, + {file = "rpds_py-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf"}, + {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b"}, + {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11"}, + {file = "rpds_py-0.21.0-cp312-none-win32.whl", hash = "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952"}, + {file = "rpds_py-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd"}, + {file = "rpds_py-0.21.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937"}, + {file = "rpds_py-0.21.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94"}, + {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3"}, + {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a"}, + {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3"}, + {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976"}, + {file = "rpds_py-0.21.0-cp313-none-win32.whl", hash = "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202"}, + {file = "rpds_py-0.21.0-cp313-none-win_amd64.whl", hash = "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e"}, + {file = "rpds_py-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928"}, + {file = "rpds_py-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592"}, + {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d"}, + {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd"}, + {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87"}, + {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed"}, + {file = "rpds_py-0.21.0-cp39-none-win32.whl", hash = "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8"}, + {file = "rpds_py-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c"}, + {file = "rpds_py-0.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e"}, + {file = "rpds_py-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89"}, + {file = "rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db"}, ] [[package]] @@ -4432,6 +4438,11 @@ files = [ {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5"}, + {file = "scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3"}, + {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12"}, + {file = "scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f"}, {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, @@ -4552,23 +4563,23 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "75.3.0" +version = "75.6.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"}, - {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"}, + {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, + {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.12.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] [[package]] name = "shellingham" @@ -4828,13 +4839,13 @@ test = ["pytest", "ruff"] [[package]] name = "tomli" -version = "2.0.2" +version = "2.1.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, + {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, + {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, ] [[package]] @@ -4870,13 +4881,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.6" +version = "4.67.0" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63"}, - {file = "tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090"}, + {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, + {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, ] [package.dependencies] @@ -4884,6 +4895,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] @@ -5077,19 +5089,15 @@ files = [ [[package]] name = "webcolors" -version = "24.8.0" +version = "24.11.1" description = "A library for working with the color formats defined by HTML and CSS." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a"}, - {file = "webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d"}, + {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, + {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, ] -[package.extras] -docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] -tests = ["coverage[toml]"] - [[package]] name = "webencodings" version = "0.5.1" @@ -5210,4 +5218,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "a53f642c91942635ab0b62af62591c9d146d58f7b91d8f04799f3730dca4f5f0" +content-hash = "dab7f0399361f6d47b78c4dfe8f76dcab87b272660fa6cde5245ea772192bcc6" diff --git a/pyproject.toml b/pyproject.toml index e92ae626df..3397bce940 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,6 +87,7 @@ typing-extensions = "^4.12.2" #Azure azure-storage-blob = "^12.22.0" azure-identity = "^1.17.1" +azure-cosmos = "^4.9.0" json-repair = "^0.30.0" future = "^1.0.0" # Needed until graspologic fixes their dependency From 48b7bd9e3f45ae2390a7b133d6d0e360cefc5f0b Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 2 Dec 2024 18:44:09 -0500 Subject: [PATCH 031/104] apply fixes after merge from main --- graphrag/cache/factory.py | 11 +++++++++++ graphrag/cli/query.py | 4 ---- graphrag/index/run/workflow.py | 2 +- graphrag/storage/factory.py | 10 ++++++++++ graphrag/utils/storage.py | 1 - 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/graphrag/cache/factory.py b/graphrag/cache/factory.py index 7253fc9d64..5abb8532cf 100644 --- a/graphrag/cache/factory.py +++ b/graphrag/cache/factory.py @@ -10,9 +10,11 @@ from graphrag.config.enums import CacheType from graphrag.index.config.cache import ( PipelineBlobCacheConfig, + PipelineCosmosDBCacheConfig, PipelineFileCacheConfig, ) from graphrag.storage.blob_pipeline_storage import BlobPipelineStorage +from graphrag.storage.cosmosdb_pipeline_storage import create_cosmosdb_storage from graphrag.storage.file_pipeline_storage import FilePipelineStorage if TYPE_CHECKING: @@ -50,6 +52,15 @@ def create_cache( storage_account_blob_url=config.storage_account_blob_url, ).child(config.base_dir) return JsonPipelineCache(storage) + case CacheType.cosmosdb: + config = cast(PipelineCosmosDBCacheConfig, config) + storage = create_cosmosdb_storage( + cosmosdb_account_url=config.cosmosdb_account_url, + connection_string=config.connection_string, + container_name=config.container_name, + base_dir=config.base_dir, + ) + return JsonPipelineCache(storage) case _: msg = f"Unknown cache type: {config.type}" raise ValueError(msg) diff --git a/graphrag/cli/query.py b/graphrag/cli/query.py index 1eab14a9e3..43349edc16 100644 --- a/graphrag/cli/query.py +++ b/graphrag/cli/query.py @@ -42,7 +42,6 @@ def run_global_search( resolve_paths(config) dataframe_dict = _resolve_output_files( - root_dir=root_dir, config=config, output_list=[ f"create_final_nodes.{output_filetype}", @@ -129,7 +128,6 @@ def run_local_search( # TODO remove optional create_final_entities_description_embeddings.parquet to delete backwards compatibility dataframe_dict = _resolve_output_files( - root_dir=root_dir, config=config, output_list=[ f"create_final_nodes.{output_filetype}", @@ -221,7 +219,6 @@ def run_drift_search( resolve_paths(config) dataframe_dict = _resolve_output_files( - root_dir=root_dir, config=config, output_list=[ f"create_final_nodes.{output_filetype}", @@ -265,7 +262,6 @@ def run_drift_search( def _resolve_output_files( - root_dir: Path, config: GraphRagConfig, output_list: list[str], optional_list: list[str] | None = None, diff --git a/graphrag/index/run/workflow.py b/graphrag/index/run/workflow.py index d7ab3fc527..e3746eab31 100644 --- a/graphrag/index/run/workflow.py +++ b/graphrag/index/run/workflow.py @@ -98,7 +98,7 @@ async def _process_workflow( context.stats.workflows[workflow_name] = {"overall": 0.0} await _inject_workflow_data_dependencies( - workflow, workflow_dependencies, dataset, context.storage, emitters[0].extension + workflow, workflow_dependencies, dataset, context.storage, "parquet" ) workflow_start_time = time.time() diff --git a/graphrag/storage/factory.py b/graphrag/storage/factory.py index b7b677808d..6cd0a35950 100644 --- a/graphrag/storage/factory.py +++ b/graphrag/storage/factory.py @@ -10,10 +10,12 @@ from graphrag.config.enums import StorageType from graphrag.index.config.storage import ( PipelineBlobStorageConfig, + PipelineCosmosDBStorageConfig, PipelineFileStorageConfig, PipelineStorageConfig, ) from graphrag.storage.blob_pipeline_storage import create_blob_storage +from graphrag.storage.cosmosdb_pipeline_storage import create_cosmosdb_storage from graphrag.storage.file_pipeline_storage import create_file_storage from graphrag.storage.memory_pipeline_storage import MemoryPipelineStorage @@ -31,6 +33,14 @@ def create_storage(config: PipelineStorageConfig): config.container_name, config.base_dir, ) + case StorageType.cosmosdb: + config = cast(PipelineCosmosDBStorageConfig, config) + return create_cosmosdb_storage( + connection_string=config.connection_string, + cosmosdb_account_url=config.cosmosdb_account_url, + container_name=config.container_name, + base_dir=config.base_dir, + ) case StorageType.file: config = cast(PipelineFileStorageConfig, config) return create_file_storage(config.base_dir) diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index ae50de4be6..193e2bf3c0 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -5,7 +5,6 @@ import logging from io import BytesIO, StringIO -from pathlib import Path import pandas as pd From c6c7494cf94029cc98a38e85699432ce45307a78 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 2 Dec 2024 22:52:45 -0500 Subject: [PATCH 032/104] add temporary comments --- graphrag/config/init_content.py | 4 ++-- graphrag/storage/cosmosdb_pipeline_storage.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/graphrag/config/init_content.py b/graphrag/config/init_content.py index 5056428dc6..e2e46ac077 100644 --- a/graphrag/config/init_content.py +++ b/graphrag/config/init_content.py @@ -63,7 +63,7 @@ ## connection_string and container_name must be provided cache: - type: {defs.CACHE_TYPE.value} # or blob + type: {defs.CACHE_TYPE.value} # one of [blob, cosmosdb, file] base_dir: "{defs.CACHE_BASE_DIR}" reporting: @@ -71,7 +71,7 @@ base_dir: "{defs.REPORTING_BASE_DIR}" storage: - type: {defs.STORAGE_TYPE.value} # or blob + type: {defs.STORAGE_TYPE.value} # one of [blob, cosmodb, file] base_dir: "{defs.STORAGE_BASE_DIR}" ## only turn this on if running `graphrag index` with custom settings diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index fd0d4d7ca3..c77e61330d 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -278,6 +278,8 @@ def container_exists(self) -> bool: return self._current_container in container_names +# TODO remove this helper function and have the factory instantiate the class directly +# once the new config system is in place and will enforce the correct types/existence of certain fields def create_cosmosdb_storage( cosmosdb_account_url: str | None, connection_string: str | None, From aa4a996562063ea725807ffd8bed5626a528789b Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 01:41:52 -0500 Subject: [PATCH 033/104] refactor cache factory --- graphrag/api/query.py | 2 +- graphrag/cache/factory.py | 77 ++++++++----------- graphrag/cache/json_pipeline_cache.py | 2 +- .../index/operations/embed_text/embed_text.py | 2 +- graphrag/index/run/run.py | 12 ++- graphrag/storage/cosmosdb_pipeline_storage.py | 18 ++--- graphrag/vector_stores/factory.py | 7 +- 7 files changed, 57 insertions(+), 63 deletions(-) diff --git a/graphrag/api/query.py b/graphrag/api/query.py index 2eab003cb6..9e96f61581 100644 --- a/graphrag/api/query.py +++ b/graphrag/api/query.py @@ -541,7 +541,7 @@ def _get_embedding_store( collection_name = create_collection_name( config_args.get("container_name", "default"), embedding_name ) - embedding_store = VectorStoreFactory.get_vector_store( + embedding_store = VectorStoreFactory.create_vector_store( vector_store_type=vector_store_type, kwargs={**config_args, "collection_name": collection_name}, ) diff --git a/graphrag/cache/factory.py b/graphrag/cache/factory.py index 5abb8532cf..cbc1833a5c 100644 --- a/graphrag/cache/factory.py +++ b/graphrag/cache/factory.py @@ -5,62 +5,53 @@ from __future__ import annotations -from typing import TYPE_CHECKING, cast +from typing import TYPE_CHECKING, ClassVar from graphrag.config.enums import CacheType -from graphrag.index.config.cache import ( - PipelineBlobCacheConfig, - PipelineCosmosDBCacheConfig, - PipelineFileCacheConfig, -) from graphrag.storage.blob_pipeline_storage import BlobPipelineStorage from graphrag.storage.cosmosdb_pipeline_storage import create_cosmosdb_storage from graphrag.storage.file_pipeline_storage import FilePipelineStorage if TYPE_CHECKING: from graphrag.cache.pipeline_cache import PipelineCache - from graphrag.index.config.cache import ( - PipelineCacheConfig, - ) from graphrag.cache.json_pipeline_cache import JsonPipelineCache from graphrag.cache.memory_pipeline_cache import InMemoryCache from graphrag.cache.noop_pipeline_cache import NoopPipelineCache -def create_cache( - config: PipelineCacheConfig | None, root_dir: str | None -) -> PipelineCache: - """Create a cache from the given config.""" - if config is None: - return NoopPipelineCache() +class CacheFactory: + """A factory class for cache implementations.""" - match config.type: - case CacheType.none: + cache_types: ClassVar[dict[str, type]] = {} + + @classmethod + def register(cls, cache_type: str, cache: type): + """Register a vector store type.""" + cls.cache_types[cache_type] = cache + + @classmethod + def create_cache( + cls, cache_type: CacheType | str | None, root_dir: str | None, kwargs: dict + ) -> PipelineCache: + """Create or get a cache from the provided type.""" + if not cache_type: return NoopPipelineCache() - case CacheType.memory: - return InMemoryCache() - case CacheType.file: - config = cast(PipelineFileCacheConfig, config) - storage = FilePipelineStorage(root_dir).child(config.base_dir) - return JsonPipelineCache(storage) - case CacheType.blob: - config = cast(PipelineBlobCacheConfig, config) - storage = BlobPipelineStorage( - config.connection_string, - config.container_name, - storage_account_blob_url=config.storage_account_blob_url, - ).child(config.base_dir) - return JsonPipelineCache(storage) - case CacheType.cosmosdb: - config = cast(PipelineCosmosDBCacheConfig, config) - storage = create_cosmosdb_storage( - cosmosdb_account_url=config.cosmosdb_account_url, - connection_string=config.connection_string, - container_name=config.container_name, - base_dir=config.base_dir, - ) - return JsonPipelineCache(storage) - case _: - msg = f"Unknown cache type: {config.type}" - raise ValueError(msg) + match cache_type: + case CacheType.none: + return NoopPipelineCache() + case CacheType.memory: + return InMemoryCache() + case CacheType.file: + return JsonPipelineCache( + FilePipelineStorage(root_dir).child(kwargs["base_dir"]) + ) + case CacheType.blob: + return JsonPipelineCache(BlobPipelineStorage(**kwargs)) + case CacheType.cosmosdb: + return JsonPipelineCache(create_cosmosdb_storage(**kwargs)) + case _: + if cache_type in cls.cache_types: + return cls.cache_types[cache_type](**kwargs) + msg = f"Unknown cache type: {cache_type}" + raise ValueError(msg) diff --git a/graphrag/cache/json_pipeline_cache.py b/graphrag/cache/json_pipeline_cache.py index 8993e04f3b..84cd180c52 100644 --- a/graphrag/cache/json_pipeline_cache.py +++ b/graphrag/cache/json_pipeline_cache.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing 'FilePipelineCache' model.""" +"""A module containing 'JsonPipelineCache' model.""" import json from typing import Any diff --git a/graphrag/index/operations/embed_text/embed_text.py b/graphrag/index/operations/embed_text/embed_text.py index 06964ebd3f..3fb2fcceb9 100644 --- a/graphrag/index/operations/embed_text/embed_text.py +++ b/graphrag/index/operations/embed_text/embed_text.py @@ -217,7 +217,7 @@ def _create_vector_store( if collection_name: vector_store_config.update({"collection_name": collection_name}) - vector_store = VectorStoreFactory.get_vector_store( + vector_store = VectorStoreFactory.create_vector_store( vector_store_type, kwargs=vector_store_config ) diff --git a/graphrag/index/run/run.py b/graphrag/index/run/run.py index 8af345f9c9..ac2d24e102 100644 --- a/graphrag/index/run/run.py +++ b/graphrag/index/run/run.py @@ -14,11 +14,10 @@ import pandas as pd from datashaper import NoopVerbCallbacks, WorkflowCallbacks -from graphrag.cache.factory import create_cache +from graphrag.cache.factory import CacheFactory from graphrag.cache.pipeline_cache import PipelineCache from graphrag.callbacks.console_workflow_callbacks import ConsoleWorkflowCallbacks from graphrag.callbacks.factory import create_pipeline_reporter -from graphrag.index.config.cache import PipelineMemoryCacheConfig from graphrag.index.config.pipeline import ( PipelineConfig, PipelineWorkflowReference, @@ -112,8 +111,13 @@ async def run_pipeline_with_config( or PipelineFileStorageConfig(base_dir=str(Path(root_dir) / "output")) ) - # TODO: remove the default choice (PipelineMemoryCacheConfig) when the new config system guarantees the existence of a cache config - cache = cache or create_cache(config.cache or PipelineMemoryCacheConfig(), root_dir) + # TODO: remove the type ignore when the new config system guarantees the existence of a cache config + cache_config = config.cache.model_dump() # type: ignore + cache = cache or CacheFactory.create_cache( + cache_type=cache_config["type"], # type: ignore + root_dir=root_dir, + kwargs=cache_config, + ) callbacks = ( create_pipeline_reporter(config.reporting, root_dir) if config.reporting diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index c77e61330d..15cfd7b17a 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -17,8 +17,7 @@ from datashaper import Progress from graphrag.logging.base import ProgressReporter - -from .pipeline_storage import PipelineStorage +from graphrag.storage.pipeline_storage import PipelineStorage log = logging.getLogger(__name__) @@ -249,7 +248,7 @@ def keys(self) -> list[str]: msg = "CosmosDB storage does yet not support listing keys." raise NotImplementedError(msg) - def child(self, name: str | None) -> "PipelineStorage": + def child(self, name: str | None) -> PipelineStorage: """Create a child storage instance.""" return self @@ -280,15 +279,14 @@ def container_exists(self) -> bool: # TODO remove this helper function and have the factory instantiate the class directly # once the new config system is in place and will enforce the correct types/existence of certain fields -def create_cosmosdb_storage( - cosmosdb_account_url: str | None, - connection_string: str | None, - base_dir: str, - container_name: str | None, -) -> PipelineStorage: +def create_cosmosdb_storage(**kwargs: Any) -> PipelineStorage: """Create a CosmosDB storage instance.""" log.info("Creating cosmosdb storage") - if base_dir is None: + cosmosdb_account_url = kwargs.get("cosmosdb_account_url") + connection_string = kwargs.get("connection_string") + base_dir = kwargs.get("base_dir") + container_name = kwargs.get("container_name") + if not base_dir: msg = "No base_dir provided for database name" raise ValueError(msg) if connection_string is None and cosmosdb_account_url is None: diff --git a/graphrag/vector_stores/factory.py b/graphrag/vector_stores/factory.py index 174a5c98d0..38d8eb0035 100644 --- a/graphrag/vector_stores/factory.py +++ b/graphrag/vector_stores/factory.py @@ -7,6 +7,7 @@ from typing import ClassVar from graphrag.vector_stores.azure_ai_search import AzureAISearch +from graphrag.vector_stores.base import BaseVectorStore from graphrag.vector_stores.lancedb import LanceDBVectorStore @@ -28,10 +29,10 @@ def register(cls, vector_store_type: str, vector_store: type): cls.vector_store_types[vector_store_type] = vector_store @classmethod - def get_vector_store( + def create_vector_store( cls, vector_store_type: VectorStoreType | str, kwargs: dict - ) -> LanceDBVectorStore | AzureAISearch: - """Get the vector store type from a string.""" + ) -> BaseVectorStore: + """Create or get a vector store from the provided type.""" match vector_store_type: case VectorStoreType.LanceDB: return LanceDBVectorStore(**kwargs) From 2113de622f17eb8a9da183b8fab2f2deeaee4fd8 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 02:50:01 -0500 Subject: [PATCH 034/104] refactored storage factory --- graphrag/cli/query.py | 7 ++-- graphrag/index/run/run.py | 17 ++++++---- graphrag/storage/factory.py | 67 ++++++++++++++++++------------------- 3 files changed, 48 insertions(+), 43 deletions(-) diff --git a/graphrag/cli/query.py b/graphrag/cli/query.py index 43349edc16..85f9ba3ae5 100644 --- a/graphrag/cli/query.py +++ b/graphrag/cli/query.py @@ -15,7 +15,7 @@ from graphrag.config.resolve_path import resolve_paths from graphrag.index.create_pipeline_config import create_pipeline_config from graphrag.logging.print_progress import PrintProgressReporter -from graphrag.storage.factory import create_storage +from graphrag.storage.factory import StorageFactory from graphrag.utils.storage import _load_table_from_storage reporter = PrintProgressReporter("") @@ -269,7 +269,10 @@ def _resolve_output_files( """Read indexing output files to a dataframe dict.""" dataframe_dict = {} pipeline_config = create_pipeline_config(config) - storage_obj = create_storage(pipeline_config.storage) # type: ignore + storage_config = pipeline_config.storage.model_dump() # type: ignore + storage_obj = StorageFactory.create_storage( + storage_type=storage_config["type"], kwargs=storage_config + ) for output_file in output_list: df_key = output_file.split(".")[0] df_value = asyncio.run( diff --git a/graphrag/index/run/run.py b/graphrag/index/run/run.py index ac2d24e102..7c854d77ac 100644 --- a/graphrag/index/run/run.py +++ b/graphrag/index/run/run.py @@ -8,7 +8,6 @@ import time import traceback from collections.abc import AsyncIterable -from pathlib import Path from typing import cast import pandas as pd @@ -22,7 +21,6 @@ PipelineConfig, PipelineWorkflowReference, ) -from graphrag.index.config.storage import PipelineFileStorageConfig from graphrag.index.config.workflow import PipelineWorkflowStep from graphrag.index.exporter import ParquetExporter from graphrag.index.input.factory import create_input @@ -53,7 +51,7 @@ ) from graphrag.logging.base import ProgressReporter from graphrag.logging.null_progress import NullProgressReporter -from graphrag.storage.factory import create_storage +from graphrag.storage.factory import StorageFactory from graphrag.storage.pipeline_storage import PipelineStorage log = logging.getLogger(__name__) @@ -103,12 +101,17 @@ async def run_pipeline_with_config( root_dir = config.root_dir or "" progress_reporter = progress_reporter or NullProgressReporter() - storage = storage = create_storage(config.storage) # type: ignore + storage_config = config.storage.model_dump() # type: ignore + storage = storage or StorageFactory.create_storage( + storage_type=storage_config["type"], # type: ignore + kwargs=storage_config, + ) if is_update_run: - update_index_storage = update_index_storage or create_storage( - config.update_index_storage - or PipelineFileStorageConfig(base_dir=str(Path(root_dir) / "output")) + update_storage_config = config.update_index_storage.model_dump() # type: ignore + update_index_storage = update_index_storage or StorageFactory.create_storage( + storage_type=update_storage_config["type"], # type: ignore + kwargs=update_storage_config, ) # TODO: remove the type ignore when the new config system guarantees the existence of a cache config diff --git a/graphrag/storage/factory.py b/graphrag/storage/factory.py index 6cd0a35950..7cc97a4679 100644 --- a/graphrag/storage/factory.py +++ b/graphrag/storage/factory.py @@ -5,45 +5,44 @@ from __future__ import annotations -from typing import cast +from typing import TYPE_CHECKING, ClassVar from graphrag.config.enums import StorageType -from graphrag.index.config.storage import ( - PipelineBlobStorageConfig, - PipelineCosmosDBStorageConfig, - PipelineFileStorageConfig, - PipelineStorageConfig, -) from graphrag.storage.blob_pipeline_storage import create_blob_storage from graphrag.storage.cosmosdb_pipeline_storage import create_cosmosdb_storage from graphrag.storage.file_pipeline_storage import create_file_storage from graphrag.storage.memory_pipeline_storage import MemoryPipelineStorage +if TYPE_CHECKING: + from graphrag.storage.pipeline_storage import PipelineStorage -def create_storage(config: PipelineStorageConfig): - """Create a storage object based on the config.""" - match config.type: - case StorageType.memory: - return MemoryPipelineStorage() - case StorageType.blob: - config = cast(PipelineBlobStorageConfig, config) - return create_blob_storage( - config.connection_string, - config.storage_account_blob_url, - config.container_name, - config.base_dir, - ) - case StorageType.cosmosdb: - config = cast(PipelineCosmosDBStorageConfig, config) - return create_cosmosdb_storage( - connection_string=config.connection_string, - cosmosdb_account_url=config.cosmosdb_account_url, - container_name=config.container_name, - base_dir=config.base_dir, - ) - case StorageType.file: - config = cast(PipelineFileStorageConfig, config) - return create_file_storage(config.base_dir) - case _: - msg = f"Unknown storage type: {config.type}" - raise ValueError(msg) + +class StorageFactory: + """A factory class for storage implementations.""" + + storage_types: ClassVar[dict[str, type]] = {} + + @classmethod + def register(cls, storage_type: str, storage: type): + """Register a vector store type.""" + cls.storage_types[storage_type] = storage + + @classmethod + def create_storage( + cls, storage_type: StorageType | str, kwargs: dict + ) -> PipelineStorage: + """Create or get a storage object from the provided type.""" + match storage_type: + case StorageType.blob: + return create_blob_storage(**kwargs) + case StorageType.cosmosdb: + return create_cosmosdb_storage(**kwargs) + case StorageType.file: + return create_file_storage(**kwargs) + case StorageType.memory: + return MemoryPipelineStorage() + case _: + if storage_type in cls.storage_types: + return cls.storage_types[storage_type](**kwargs) + msg = f"Unknown storage type: {storage_type}" + raise ValueError(msg) From 11b5b620d4bdb26a5817714f9e53d6d6f7482638 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 02:54:56 -0500 Subject: [PATCH 035/104] minor formatting --- graphrag/cache/factory.py | 5 ++++- graphrag/storage/factory.py | 5 ++++- graphrag/vector_stores/factory.py | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/graphrag/cache/factory.py b/graphrag/cache/factory.py index cbc1833a5c..b9e7631888 100644 --- a/graphrag/cache/factory.py +++ b/graphrag/cache/factory.py @@ -21,7 +21,10 @@ class CacheFactory: - """A factory class for cache implementations.""" + """A factory class for cache implementations. + + Includes a method for users to register a custom cache implementation. + """ cache_types: ClassVar[dict[str, type]] = {} diff --git a/graphrag/storage/factory.py b/graphrag/storage/factory.py index 7cc97a4679..2471d72a73 100644 --- a/graphrag/storage/factory.py +++ b/graphrag/storage/factory.py @@ -18,7 +18,10 @@ class StorageFactory: - """A factory class for storage implementations.""" + """A factory class for storage implementations. + + Includes a method for users to register a custom storage implementation. + """ storage_types: ClassVar[dict[str, type]] = {} diff --git a/graphrag/vector_stores/factory.py b/graphrag/vector_stores/factory.py index 38d8eb0035..d154469e85 100644 --- a/graphrag/vector_stores/factory.py +++ b/graphrag/vector_stores/factory.py @@ -19,7 +19,10 @@ class VectorStoreType(str, Enum): class VectorStoreFactory: - """A factory class for vector stores.""" + """A factory for vector stores. + + Includes a method for users to register a custom vector store implementation. + """ vector_store_types: ClassVar[dict[str, type]] = {} From 8f3e44c20609b0c25b96252d72c3ace77e73dcf4 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 03:01:37 -0500 Subject: [PATCH 036/104] update dictionary --- dictionary.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dictionary.txt b/dictionary.txt index e2ea99f021..c577b15323 100644 --- a/dictionary.txt +++ b/dictionary.txt @@ -28,6 +28,7 @@ ints # Azure abfs +cosmosdb Hnsw odata From 447cbe769fcd905e405d52e973787ada6abddaac Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 03:03:26 -0500 Subject: [PATCH 037/104] fix spellcheck typo --- graphrag/config/init_content.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/config/init_content.py b/graphrag/config/init_content.py index e2e46ac077..636a0c3c0c 100644 --- a/graphrag/config/init_content.py +++ b/graphrag/config/init_content.py @@ -71,7 +71,7 @@ base_dir: "{defs.REPORTING_BASE_DIR}" storage: - type: {defs.STORAGE_TYPE.value} # one of [blob, cosmodb, file] + type: {defs.STORAGE_TYPE.value} # one of [blob, cosmosdb, file] base_dir: "{defs.STORAGE_BASE_DIR}" ## only turn this on if running `graphrag index` with custom settings From 6f91dfbb0f19f28379c842e809c7ace75efa0eba Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 03:13:32 -0500 Subject: [PATCH 038/104] fix default value --- graphrag/config/models/graph_rag_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/config/models/graph_rag_config.py b/graphrag/config/models/graph_rag_config.py index 3dc5f71d82..0eb1d27809 100644 --- a/graphrag/config/models/graph_rag_config.py +++ b/graphrag/config/models/graph_rag_config.py @@ -41,7 +41,7 @@ def __str__(self): return self.model_dump_json(indent=4) root_dir: str = Field( - description="The root directory for the configuration.", default=None + description="The root directory for the configuration.", default="", ) reporting: ReportingConfig = Field( From c79e63cbf0aebc04cc02a56d7624c5b785aeea2f Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 03:24:07 -0500 Subject: [PATCH 039/104] fix pydantic model defaults --- graphrag/config/models/graph_rag_config.py | 3 ++- graphrag/index/config/cache.py | 18 +++++++++--------- graphrag/index/create_pipeline_config.py | 4 ++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/graphrag/config/models/graph_rag_config.py b/graphrag/config/models/graph_rag_config.py index 0eb1d27809..1f11da752c 100644 --- a/graphrag/config/models/graph_rag_config.py +++ b/graphrag/config/models/graph_rag_config.py @@ -41,7 +41,8 @@ def __str__(self): return self.model_dump_json(indent=4) root_dir: str = Field( - description="The root directory for the configuration.", default="", + description="The root directory for the configuration.", + default="", ) reporting: ReportingConfig = Field( diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 37e7ca0e28..b5d1109447 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -53,8 +53,8 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): type: Literal[CacheType.blob] = CacheType.blob """The type of cache.""" - base_dir: str | None = pydantic_Field( - description="The base directory for the cache.", default=None + base_dir: str = pydantic_Field( + description="The base directory for the cache.", default="" ) """The base directory for the cache.""" @@ -64,12 +64,12 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): """The blob cache connection string for the cache.""" container_name: str = pydantic_Field( - description="The container name for cache", default=None + description="The container name for cache", default="" ) """The container name for cache""" - storage_account_blob_url: str | None = pydantic_Field( - description="The storage account blob url for cache", default=None + storage_account_blob_url: str = pydantic_Field( + description="The storage account blob url for cache", default="" ) """The storage account blob url for cache""" @@ -81,12 +81,12 @@ class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb """The type of cache.""" base_dir: str = pydantic_Field( - description="The cosmosdb database name for the cache.", default=None + description="The cosmosdb database name for the cache.", default="" ) """The cosmosdb database name for the cache.""" container_name: str = pydantic_Field( - description="The container name for cache.", default=None + description="The container name for cache.", default="" ) """The container name for cache.""" @@ -95,8 +95,8 @@ class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb ) """The cosmosdb primary key for the cache.""" - cosmosdb_account_url: str | None = pydantic_Field( - description="The cosmosdb account url for cache", default=None + cosmosdb_account_url: str = pydantic_Field( + description="The cosmosdb account url for cache", default="" ) """The cosmosdb account url for cache""" diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index f05f58e059..408d0c24d6 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -472,7 +472,7 @@ def _get_cache_config( connection_string=connection_string, container_name=container_name, base_dir=settings.cache.base_dir, - storage_account_blob_url=storage_account_blob_url, + storage_account_blob_url=storage_account_blob_url, # type: ignore ) case CacheType.cosmosdb: cosmosdb_account_url = settings.cache.cosmosdb_account_url @@ -489,7 +489,7 @@ def _get_cache_config( msg = "Connection string or cosmosDB account url must be provided for cosmosdb cache." raise ValueError(msg) return PipelineCosmosDBCacheConfig( - cosmosdb_account_url=cosmosdb_account_url, + cosmosdb_account_url=cosmosdb_account_url, # type: ignore connection_string=connection_string, base_dir=base_dir, container_name=container_name, From aeceacb9f54540c7fd8febee3249899e613c4655 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 03:28:29 -0500 Subject: [PATCH 040/104] update pydantic models --- graphrag/index/config/reporting.py | 10 +++++----- graphrag/index/config/storage.py | 8 ++++---- graphrag/index/create_pipeline_config.py | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/graphrag/index/config/reporting.py b/graphrag/index/config/reporting.py index 921e24ae4e..5464546a39 100644 --- a/graphrag/index/config/reporting.py +++ b/graphrag/index/config/reporting.py @@ -55,17 +55,17 @@ class PipelineBlobReportingConfig(PipelineReportingConfig[Literal[ReportingType. """The blob reporting connection string for the reporting.""" container_name: str = pydantic_Field( - description="The container name for reporting", default=None + description="The container name for reporting", default="" ) """The container name for reporting""" - storage_account_blob_url: str | None = pydantic_Field( - description="The storage account blob url for reporting", default=None + storage_account_blob_url: str = pydantic_Field( + description="The storage account blob url for reporting", default="" ) """The storage account blob url for reporting""" - base_dir: str | None = pydantic_Field( - description="The base directory for the reporting.", default=None + base_dir: str = pydantic_Field( + description="The base directory for the reporting.", default="" ) """The base directory for the reporting.""" diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index bbcb9f863a..80aee2963d 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -81,17 +81,17 @@ class PipelineCosmosDBStorageConfig( """The cosmosdb storage primary key for the storage.""" container_name: str = pydantic_Field( - description="The container name for storage", default=None + description="The container name for storage", default="" ) """The container name for storage.""" base_dir: str = pydantic_Field( - description="The base directory for the storage.", default=None + description="The base directory for the storage.", default="" ) """The base directory for the storage.""" - cosmosdb_account_url: str | None = pydantic_Field( - description="The cosmosdb account url.", default=None + cosmosdb_account_url: str = pydantic_Field( + description="The cosmosdb account url.", default="" ) """The cosmosdb account url.""" diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 408d0c24d6..7ea14dfe97 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -374,7 +374,7 @@ def _get_reporting_config( connection_string=connection_string, container_name=container_name, base_dir=settings.reporting.base_dir, - storage_account_blob_url=storage_account_blob_url, + storage_account_blob_url=storage_account_blob_url, # type: ignore ) case ReportingType.console: return PipelineConsoleReportingConfig() From b3feb446355e0db13bafa449675e0226dea66464 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 03:48:36 -0500 Subject: [PATCH 041/104] fix init_content --- graphrag/config/init_content.py | 2 +- graphrag/index/config/storage.py | 10 +++++----- graphrag/index/create_pipeline_config.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/graphrag/config/init_content.py b/graphrag/config/init_content.py index 636a0c3c0c..bdc311f8d0 100644 --- a/graphrag/config/init_content.py +++ b/graphrag/config/init_content.py @@ -33,7 +33,7 @@ embeddings: async_mode: {defs.ASYNC_MODE.value} # or asyncio - vector_store:{defs.VECTOR_STORE} + vector_store: {defs.VECTOR_STORE} llm: api_key: ${{GRAPHRAG_API_KEY}} type: {defs.EMBEDDING_TYPE.value} # or azure_openai_embedding diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index 80aee2963d..4193511b54 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -52,17 +52,17 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] """The blob storage connection string for the storage.""" container_name: str = pydantic_Field( - description="The container name for storage", default=None + description="The container name for storage", default="" ) """The container name for storage.""" - base_dir: str | None = pydantic_Field( - description="The base directory for the storage.", default=None + base_dir: str = pydantic_Field( + description="The base directory for the storage.", default="" ) """The base directory for the storage.""" - storage_account_blob_url: str | None = pydantic_Field( - description="The storage account blob url.", default=None + storage_account_blob_url: str = pydantic_Field( + description="The storage account blob url.", default="" ) """The storage account blob url.""" diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 7ea14dfe97..8ddd070a8e 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -415,7 +415,7 @@ def _get_storage_config( connection_string=connection_string, container_name=container_name, base_dir=storage_settings.base_dir, - storage_account_blob_url=storage_account_blob_url, + storage_account_blob_url=storage_account_blob_url, # type: ignore ) case StorageType.cosmosdb: cosmosdb_account_url = storage_settings.cosmosdb_account_url From 03e7d3577e74e8f662b328a21e4ff4ba4da7a82f Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 21:22:02 -0500 Subject: [PATCH 042/104] cleanup how factory passes parameters to file storage --- graphrag/index/create_pipeline_config.py | 2 +- graphrag/storage/file_pipeline_storage.py | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 8ddd070a8e..9fba1fae4a 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -415,7 +415,7 @@ def _get_storage_config( connection_string=connection_string, container_name=container_name, base_dir=storage_settings.base_dir, - storage_account_blob_url=storage_account_blob_url, # type: ignore + storage_account_blob_url=storage_account_blob_url, # type: ignore ) case StorageType.cosmosdb: cosmosdb_account_url = storage_settings.cosmosdb_account_url diff --git a/graphrag/storage/file_pipeline_storage.py b/graphrag/storage/file_pipeline_storage.py index 082569d08d..e09bc8df8e 100644 --- a/graphrag/storage/file_pipeline_storage.py +++ b/graphrag/storage/file_pipeline_storage.py @@ -28,10 +28,10 @@ class FilePipelineStorage(PipelineStorage): _root_dir: str _encoding: str - def __init__(self, root_dir: str | None = None, encoding: str | None = None): + def __init__(self, root_dir: str = "", encoding: str = "utf-8"): """Init method definition.""" - self._root_dir = root_dir or "" - self._encoding = encoding or "utf-8" + self._root_dir = root_dir + self._encoding = encoding Path(self._root_dir).mkdir(parents=True, exist_ok=True) def find( @@ -152,10 +152,11 @@ def join_path(file_path: str, file_name: str) -> Path: return Path(file_path) / Path(file_name).parent / Path(file_name).name -def create_file_storage(out_dir: str | None) -> PipelineStorage: +def create_file_storage(**kwargs: Any) -> PipelineStorage: """Create a file based storage.""" - log.info("Creating file storage at %s", out_dir) - return FilePipelineStorage(out_dir) + base_dir = kwargs["base_dir"] + log.info("Creating file storage at %s", base_dir) + return FilePipelineStorage(root_dir=base_dir) def _create_progress_status( From f2a5a4df13cd58101e4f3d0e08d46f8868669166 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 21:38:56 -0500 Subject: [PATCH 043/104] remove unnecessary output file type --- graphrag/cache/factory.py | 4 +-- graphrag/cli/main.py | 9 ----- graphrag/cli/query.py | 33 +++++++++---------- .../cache/test_file_pipeline_cache.py | 2 +- 4 files changed, 18 insertions(+), 30 deletions(-) diff --git a/graphrag/cache/factory.py b/graphrag/cache/factory.py index b9e7631888..c85a0678b4 100644 --- a/graphrag/cache/factory.py +++ b/graphrag/cache/factory.py @@ -35,7 +35,7 @@ def register(cls, cache_type: str, cache: type): @classmethod def create_cache( - cls, cache_type: CacheType | str | None, root_dir: str | None, kwargs: dict + cls, cache_type: CacheType | str | None, root_dir: str, kwargs: dict ) -> PipelineCache: """Create or get a cache from the provided type.""" if not cache_type: @@ -47,7 +47,7 @@ def create_cache( return InMemoryCache() case CacheType.file: return JsonPipelineCache( - FilePipelineStorage(root_dir).child(kwargs["base_dir"]) + FilePipelineStorage(root_dir=root_dir).child(kwargs["base_dir"]) ) case CacheType.blob: return JsonPipelineCache(BlobPipelineStorage(**kwargs)) diff --git a/graphrag/cli/main.py b/graphrag/cli/main.py index 08ad6e6974..c084d06253 100644 --- a/graphrag/cli/main.py +++ b/graphrag/cli/main.py @@ -408,12 +408,6 @@ def _query_cli( help="Free form text describing the response type and format, can be anything, e.g. Multiple Paragraphs, Single Paragraph, Single Sentence, List of 3-7 Points, Single Page, Multi-Page Report. Default: Multiple Paragraphs" ), ] = "Multiple Paragraphs", - output_filetype: Annotated[ - str, - typer.Option( - help="The file type of the indexing outputs, e.g. parquet, json, csv. Default: parquet", - ), - ] = "parquet", streaming: Annotated[ bool, typer.Option(help="Print response in a streaming manner.") ] = False, @@ -429,7 +423,6 @@ def _query_cli( root_dir=root, community_level=community_level, response_type=response_type, - output_filetype=output_filetype, streaming=streaming, query=query, ) @@ -441,7 +434,6 @@ def _query_cli( community_level=community_level, dynamic_community_selection=dynamic_community_selection, response_type=response_type, - output_filetype=output_filetype, streaming=streaming, query=query, ) @@ -451,7 +443,6 @@ def _query_cli( data_dir=data, root_dir=root, community_level=community_level, - output_filetype=output_filetype, streaming=False, # Drift search does not support streaming (yet) query=query, ) diff --git a/graphrag/cli/query.py b/graphrag/cli/query.py index 85f9ba3ae5..28d275b752 100644 --- a/graphrag/cli/query.py +++ b/graphrag/cli/query.py @@ -28,7 +28,6 @@ def run_global_search( community_level: int | None, dynamic_community_selection: bool, response_type: str, - output_filetype: str, streaming: bool, query: str, ): @@ -44,10 +43,10 @@ def run_global_search( dataframe_dict = _resolve_output_files( config=config, output_list=[ - f"create_final_nodes.{output_filetype}", - f"create_final_entities.{output_filetype}", - f"create_final_communities.{output_filetype}", - f"create_final_community_reports.{output_filetype}", + "create_final_nodes.parquet", + "create_final_entities.parquet", + "create_final_communities.parquet", + "create_final_community_reports.parquet", ], optional_list=[], ) @@ -113,7 +112,6 @@ def run_local_search( root_dir: Path, community_level: int, response_type: str, - output_filetype: str, streaming: bool, query: str, ): @@ -130,14 +128,14 @@ def run_local_search( dataframe_dict = _resolve_output_files( config=config, output_list=[ - f"create_final_nodes.{output_filetype}", - f"create_final_community_reports.{output_filetype}", - f"create_final_text_units.{output_filetype}", - f"create_final_relationships.{output_filetype}", - f"create_final_entities.{output_filetype}", + "create_final_nodes.parquet", + "create_final_community_reports.parquet", + "create_final_text_units.parquet", + "create_final_relationships.parquet", + "create_final_entities.parquet", ], optional_list=[ - f"create_final_covariates.{output_filetype}", + "create_final_covariates.parquet", ], ) final_nodes: pd.DataFrame = dataframe_dict["create_final_nodes"] @@ -205,7 +203,6 @@ def run_drift_search( data_dir: Path | None, root_dir: Path, community_level: int, - output_filetype: str, streaming: bool, query: str, ): @@ -221,11 +218,11 @@ def run_drift_search( dataframe_dict = _resolve_output_files( config=config, output_list=[ - f"create_final_nodes.{output_filetype}", - f"create_final_community_reports.{output_filetype}", - f"create_final_text_units.{output_filetype}", - f"create_final_relationships.{output_filetype}", - f"create_final_entities.{output_filetype}", + "create_final_nodes.parquet", + "create_final_community_reports.parquet", + "create_final_text_units.parquet", + "create_final_relationships.parquet", + "create_final_entities.parquet", ], ) final_nodes: pd.DataFrame = dataframe_dict["create_final_nodes"] diff --git a/tests/unit/indexing/cache/test_file_pipeline_cache.py b/tests/unit/indexing/cache/test_file_pipeline_cache.py index 045581ad49..d08bd6ebfc 100644 --- a/tests/unit/indexing/cache/test_file_pipeline_cache.py +++ b/tests/unit/indexing/cache/test_file_pipeline_cache.py @@ -13,7 +13,7 @@ def create_cache(): - storage = FilePipelineStorage(os.path.join(os.getcwd(), ".tmp")) + storage = FilePipelineStorage(root_dir=os.path.join(os.getcwd(), ".tmp")) return JsonPipelineCache(storage) From dbd67373bb95febe339dfeae243871dbcf8f3a65 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 3 Dec 2024 23:18:38 -0500 Subject: [PATCH 044/104] update pydantic model --- graphrag/config/models/text_embedding_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/config/models/text_embedding_config.py b/graphrag/config/models/text_embedding_config.py index 1fde9a41dd..ea2a78aefd 100644 --- a/graphrag/config/models/text_embedding_config.py +++ b/graphrag/config/models/text_embedding_config.py @@ -26,7 +26,7 @@ class TextEmbeddingConfig(LLMConfig): ) skip: list[str] = Field(description="The specific embeddings to skip.", default=[]) vector_store: dict | None = Field( - description="The vector storage configuration", default=defs.VECTOR_STORE + description="The vector storage configuration", default=None ) strategy: dict | None = Field( description="The override strategy to use.", default=None From a0593335c5f91a22619b8c5fcc11cf53d0c54a53 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 4 Dec 2024 02:43:11 -0500 Subject: [PATCH 045/104] cleanup code --- graphrag/storage/cosmosdb_pipeline_storage.py | 70 ++++++++----------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 15cfd7b17a..05e6f92c39 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -36,10 +36,10 @@ def __init__( cosmosdb_account_url: str | None, connection_string: str | None, database_name: str, - encoding: str | None = None, + encoding: str = "utf-8", current_container: str | None = None, ): - """Initialize the CosmosDB-Storage.""" + """Initialize the CosmosDB Storage.""" if connection_string: self._cosmos_client = CosmosClient.from_connection_string(connection_string) else: @@ -54,11 +54,11 @@ def __init__( credential=DefaultAzureCredential(), ) - self._encoding = encoding or "utf-8" + self._encoding = encoding self._database_name = database_name self._connection_string = connection_string self._cosmosdb_account_url = cosmosdb_account_url - self._current_container = current_container or None + self._current_container = current_container self._cosmosdb_account_name = ( cosmosdb_account_url.split("//")[1].split(".")[0] if cosmosdb_account_url @@ -73,27 +73,25 @@ def __init__( self._cosmosdb_account_name, self._database_name, ) - self.create_database() - if self._current_container is not None: - self.create_container() + self._create_database() + if self._current_container: + self._create_container() - def create_database(self) -> None: + def _create_database(self) -> None: """Create the database if it doesn't exist.""" - database_name = self._database_name - self._cosmos_client.create_database_if_not_exists(id=database_name) + self._cosmos_client.create_database_if_not_exists(id=self._database_name) - def delete_database(self) -> None: + def _delete_database(self) -> None: """Delete the database if it exists.""" - if self.database_exists(): + if self._database_exists(): self._cosmos_client.delete_database(self._database_name) - def database_exists(self) -> bool: + def _database_exists(self) -> bool: """Check if the database exists.""" - database_name = self._database_name database_names = [ database["id"] for database in self._cosmos_client.list_databases() ] - return database_name in database_names + return self._database_name in database_names def find( self, @@ -131,8 +129,7 @@ def item_filter(item: dict[str, Any]) -> bool: ) try: - database_client = self._database_client - container_client = database_client.get_container_client( + container_client = self._database_client.get_container_client( str(self._current_container) ) query = "SELECT * FROM c WHERE CONTAINS(c.id, @pattern)" @@ -176,9 +173,8 @@ async def get( ) -> Any: """Get a file in the database for the given key.""" try: - database_client = self._database_client - if self._current_container is not None: - container_client = database_client.get_container_client( + if self._current_container: + container_client = self._database_client.get_container_client( self._current_container ) item = container_client.read_item(item=key, partition_key=key) @@ -199,9 +195,8 @@ async def get( async def set(self, key: str, value: Any, encoding: str | None = None) -> None: """Set a file in the database for the given key.""" try: - database_client = self._database_client - if self._current_container is not None: - container_client = database_client.get_container_client( + if self._current_container: + container_client = self._database_client.get_container_client( self._current_container ) if isinstance(value, bytes): @@ -222,9 +217,8 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: async def has(self, key: str) -> bool: """Check if the given file exists in the cosmosdb storage.""" - database_client = self._database_client - if self._current_container is not None: - container_client = database_client.get_container_client( + if self._current_container: + container_client = self._database_client.get_container_client( self._current_container ) item_names = [item["id"] for item in container_client.read_all_items()] @@ -233,9 +227,8 @@ async def has(self, key: str) -> bool: async def delete(self, key: str) -> None: """Delete the given file from the cosmosdb storage.""" - database_client = self._database_client - if self._current_container is not None: - container_client = database_client.get_container_client( + if self._current_container: + container_client = self._database_client.get_container_client( self._current_container ) container_client.delete_item(item=key, partition_key=key) @@ -252,27 +245,24 @@ def child(self, name: str | None) -> PipelineStorage: """Create a child storage instance.""" return self - def create_container(self) -> None: + def _create_container(self) -> None: """Create a container for the current container name if it doesn't exist.""" - database_client = self._database_client - if self._current_container is not None: + if self._current_container: partition_key = PartitionKey(path="/id", kind="Hash") - database_client.create_container_if_not_exists( + self._database_client.create_container_if_not_exists( id=self._current_container, partition_key=partition_key, ) - def delete_container(self) -> None: + def _delete_container(self) -> None: """Delete the container with the current container name if it exists.""" - database_client = self._database_client - if self.container_exists() and self._current_container is not None: - database_client.delete_container(self._current_container) + if self._container_exists() and self._current_container: + self._database_client.delete_container(self._current_container) - def container_exists(self) -> bool: + def _container_exists(self) -> bool: """Check if the container with the current container name exists.""" - database_client = self._database_client container_names = [ - container["id"] for container in database_client.list_containers() + container["id"] for container in self._database_client.list_containers() ] return self._current_container in container_names From a0272a6de794da9ddcb1be15fd97050f5e587d34 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 4 Dec 2024 13:26:53 -0500 Subject: [PATCH 046/104] implemented clear method --- graphrag/storage/cosmosdb_pipeline_storage.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 05e6f92c39..94b2328432 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -233,8 +233,18 @@ async def delete(self, key: str) -> None: ) container_client.delete_item(item=key, partition_key=key) + # Function currently deletes all items within the current container, then deletes the container itself. + # TODO: Decide the granularity of deletion (e.g. delete all items within the current container, delete the current container, delete the current database) async def clear(self) -> None: """Clear the cosmosdb storage.""" + if self._current_container: + container_client = self._database_client.get_container_client( + self._current_container + ) + for item in container_client.read_all_items(): + item_id = item["id"] + container_client.delete_item(item=item_id, partition_key=item_id) + self._delete_container() def keys(self) -> list[str]: """Return the keys in the storage.""" From 10b899636a96f22f901e6e1f4f3e549f50160c6e Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Thu, 5 Dec 2024 22:44:37 -0500 Subject: [PATCH 047/104] fix merge from main --- graphrag/index/run/run.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/graphrag/index/run/run.py b/graphrag/index/run/run.py index b037a503a3..055e0ea0e8 100644 --- a/graphrag/index/run/run.py +++ b/graphrag/index/run/run.py @@ -16,7 +16,6 @@ from graphrag.cache.factory import CacheFactory from graphrag.cache.pipeline_cache import PipelineCache from graphrag.callbacks.console_workflow_callbacks import ConsoleWorkflowCallbacks -from graphrag.callbacks.factory import create_pipeline_reporter from graphrag.index.config.pipeline import ( PipelineConfig, PipelineWorkflowReference, @@ -121,11 +120,6 @@ async def run_pipeline_with_config( root_dir=root_dir, kwargs=cache_config, ) - callbacks = ( - create_pipeline_reporter(config.reporting, root_dir) - if config.reporting - else None - ) # TODO: remove the type ignore when the new config system guarantees the existence of an input config dataset = ( dataset From 91d0348227c5cc8c6f58dc1c9276699199041717 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 6 Dec 2024 01:34:35 -0500 Subject: [PATCH 048/104] add test stub for cosmosdb --- .../workflows/python-integration-tests.yml | 4 ++++ .../storage/test_cosmosdb_storage.py | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 tests/integration/storage/test_cosmosdb_storage.py diff --git a/.github/workflows/python-integration-tests.yml b/.github/workflows/python-integration-tests.yml index ffdbbef760..dc4dd46101 100644 --- a/.github/workflows/python-integration-tests.yml +++ b/.github/workflows/python-integration-tests.yml @@ -83,6 +83,10 @@ jobs: - name: Install Azurite id: azuright uses: potatoqualitee/azuright@v1.1 + + - name: Azure Cosmos DB Emulator + if: runner.os == 'Windows' + uses: southpolesteve/cosmos-emulator-github-action@v1 - name: Integration Test run: | diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py new file mode 100644 index 0000000000..ddba235419 --- /dev/null +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -0,0 +1,21 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License +"""CosmosDB Storage Tests.""" + +import sys + +import pytest + +# the cosmosdb emulator is only available on windows runners at this time +if not sys.platform.startswith("win"): + pytest.skip("skipping windows-only tests", allow_module_level=True) + + +def test_find(): + print("test_find") + assert True + + +def test_child(): + print("test_child") + assert True From 7f62af2a4a9304e8640ce0fe3199d504fa0e4c92 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 6 Dec 2024 11:21:55 -0500 Subject: [PATCH 049/104] regenerate lock file --- poetry.lock | 1392 ++++++++++++++++++++++++--------------------------- 1 file changed, 666 insertions(+), 726 deletions(-) diff --git a/poetry.lock b/poetry.lock index b71df603e4..31fe535426 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,13 +13,13 @@ files = [ [[package]] name = "aiolimiter" -version = "1.1.0" +version = "1.2.0" description = "asyncio rate limiter, a leaky bucket implementation" optional = false -python-versions = ">=3.7,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "aiolimiter-1.1.0-py3-none-any.whl", hash = "sha256:0b4997961fc58b8df40279e739f9cf0d3e255e63e9a44f64df567a8c17241e24"}, - {file = "aiolimiter-1.1.0.tar.gz", hash = "sha256:461cf02f82a29347340d031626c92853645c099cb5ff85577b831a7bd21132b5"}, + {file = "aiolimiter-1.2.0-py3-none-any.whl", hash = "sha256:e3fc486a4506248cfdd1f3976920459945944518bbb1d1e6b2be1060232829e2"}, + {file = "aiolimiter-1.2.0.tar.gz", hash = "sha256:761455d26df0d7a393f78bd39b022579e02ca5a65beb303a67bed2ded2f740ac"}, ] [[package]] @@ -35,24 +35,24 @@ files = [ [[package]] name = "anyio" -version = "4.6.2.post1" +version = "4.7.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" files = [ - {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, - {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, + {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, + {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" -typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -726,73 +726,73 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "coverage" -version = "7.6.7" +version = "7.6.9" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" files = [ - {file = "coverage-7.6.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e"}, - {file = "coverage-7.6.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45"}, - {file = "coverage-7.6.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1"}, - {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c"}, - {file = "coverage-7.6.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2"}, - {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06"}, - {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777"}, - {file = "coverage-7.6.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314"}, - {file = "coverage-7.6.7-cp310-cp310-win32.whl", hash = "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a"}, - {file = "coverage-7.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163"}, - {file = "coverage-7.6.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469"}, - {file = "coverage-7.6.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99"}, - {file = "coverage-7.6.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec"}, - {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b"}, - {file = "coverage-7.6.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a"}, - {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b"}, - {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d"}, - {file = "coverage-7.6.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4"}, - {file = "coverage-7.6.7-cp311-cp311-win32.whl", hash = "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2"}, - {file = "coverage-7.6.7-cp311-cp311-win_amd64.whl", hash = "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f"}, - {file = "coverage-7.6.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9"}, - {file = "coverage-7.6.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b"}, - {file = "coverage-7.6.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c"}, - {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1"}, - {file = "coverage-7.6.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354"}, - {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433"}, - {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f"}, - {file = "coverage-7.6.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb"}, - {file = "coverage-7.6.7-cp312-cp312-win32.whl", hash = "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76"}, - {file = "coverage-7.6.7-cp312-cp312-win_amd64.whl", hash = "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c"}, - {file = "coverage-7.6.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3"}, - {file = "coverage-7.6.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab"}, - {file = "coverage-7.6.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808"}, - {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc"}, - {file = "coverage-7.6.7-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8"}, - {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a"}, - {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55"}, - {file = "coverage-7.6.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384"}, - {file = "coverage-7.6.7-cp313-cp313-win32.whl", hash = "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30"}, - {file = "coverage-7.6.7-cp313-cp313-win_amd64.whl", hash = "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42"}, - {file = "coverage-7.6.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413"}, - {file = "coverage-7.6.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd"}, - {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37"}, - {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b"}, - {file = "coverage-7.6.7-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d"}, - {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529"}, - {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b"}, - {file = "coverage-7.6.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3"}, - {file = "coverage-7.6.7-cp313-cp313t-win32.whl", hash = "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8"}, - {file = "coverage-7.6.7-cp313-cp313t-win_amd64.whl", hash = "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56"}, - {file = "coverage-7.6.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874"}, - {file = "coverage-7.6.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0"}, - {file = "coverage-7.6.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c"}, - {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7"}, - {file = "coverage-7.6.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3"}, - {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327"}, - {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c"}, - {file = "coverage-7.6.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289"}, - {file = "coverage-7.6.7-cp39-cp39-win32.whl", hash = "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c"}, - {file = "coverage-7.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13"}, - {file = "coverage-7.6.7-pp39.pp310-none-any.whl", hash = "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671"}, - {file = "coverage-7.6.7.tar.gz", hash = "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, + {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, + {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, + {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, + {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, + {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, + {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, + {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, + {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, + {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, + {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, + {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, + {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, + {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, + {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, ] [package.extras] @@ -800,51 +800,53 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "43.0.3" +version = "44.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = ">=3.7" -files = [ - {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, - {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, - {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, - {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, - {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, - {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, - {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, - {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, - {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, - {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, - {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, - {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, - {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +files = [ + {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, + {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, + {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, + {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, + {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, + {file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"}, + {file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, + {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, + {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, + {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, + {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, + {file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, + {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, + {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, ] [package.dependencies] cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] -nox = ["nox"] -pep8test = ["check-sdist", "click", "mypy", "ruff"] -sdist = ["build"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] +pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1064,13 +1066,13 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastjsonschema" -version = "2.20.0" +version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, - {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, + {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, + {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, ] [package.extras] @@ -1100,61 +1102,61 @@ openai = ["openai (>=1.35.12)", "tiktoken (>=0.7.0)"] [[package]] name = "fonttools" -version = "4.55.0" +version = "4.55.2" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:51c029d4c0608a21a3d3d169dfc3fb776fde38f00b35ca11fdab63ba10a16f61"}, - {file = "fonttools-4.55.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bca35b4e411362feab28e576ea10f11268b1aeed883b9f22ed05675b1e06ac69"}, - {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ce4ba6981e10f7e0ccff6348e9775ce25ffadbee70c9fd1a3737e3e9f5fa74f"}, - {file = "fonttools-4.55.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31d00f9852a6051dac23294a4cf2df80ced85d1d173a61ba90a3d8f5abc63c60"}, - {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e198e494ca6e11f254bac37a680473a311a88cd40e58f9cc4dc4911dfb686ec6"}, - {file = "fonttools-4.55.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7208856f61770895e79732e1dcbe49d77bd5783adf73ae35f87fcc267df9db81"}, - {file = "fonttools-4.55.0-cp310-cp310-win32.whl", hash = "sha256:e7e6a352ff9e46e8ef8a3b1fe2c4478f8a553e1b5a479f2e899f9dc5f2055880"}, - {file = "fonttools-4.55.0-cp310-cp310-win_amd64.whl", hash = "sha256:636caaeefe586d7c84b5ee0734c1a5ab2dae619dc21c5cf336f304ddb8f6001b"}, - {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fa34aa175c91477485c44ddfbb51827d470011e558dfd5c7309eb31bef19ec51"}, - {file = "fonttools-4.55.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:37dbb3fdc2ef7302d3199fb12468481cbebaee849e4b04bc55b77c24e3c49189"}, - {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5263d8e7ef3c0ae87fbce7f3ec2f546dc898d44a337e95695af2cd5ea21a967"}, - {file = "fonttools-4.55.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f307f6b5bf9e86891213b293e538d292cd1677e06d9faaa4bf9c086ad5f132f6"}, - {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f0a4b52238e7b54f998d6a56b46a2c56b59c74d4f8a6747fb9d4042190f37cd3"}, - {file = "fonttools-4.55.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3e569711464f777a5d4ef522e781dc33f8095ab5efd7548958b36079a9f2f88c"}, - {file = "fonttools-4.55.0-cp311-cp311-win32.whl", hash = "sha256:2b3ab90ec0f7b76c983950ac601b58949f47aca14c3f21eed858b38d7ec42b05"}, - {file = "fonttools-4.55.0-cp311-cp311-win_amd64.whl", hash = "sha256:aa046f6a63bb2ad521004b2769095d4c9480c02c1efa7d7796b37826508980b6"}, - {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:838d2d8870f84fc785528a692e724f2379d5abd3fc9dad4d32f91cf99b41e4a7"}, - {file = "fonttools-4.55.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f46b863d74bab7bb0d395f3b68d3f52a03444964e67ce5c43ce43a75efce9246"}, - {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33b52a9cfe4e658e21b1f669f7309b4067910321757fec53802ca8f6eae96a5a"}, - {file = "fonttools-4.55.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:732a9a63d6ea4a81b1b25a1f2e5e143761b40c2e1b79bb2b68e4893f45139a40"}, - {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7dd91ac3fcb4c491bb4763b820bcab6c41c784111c24172616f02f4bc227c17d"}, - {file = "fonttools-4.55.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1f0e115281a32ff532118aa851ef497a1b7cda617f4621c1cdf81ace3e36fb0c"}, - {file = "fonttools-4.55.0-cp312-cp312-win32.whl", hash = "sha256:6c99b5205844f48a05cb58d4a8110a44d3038c67ed1d79eb733c4953c628b0f6"}, - {file = "fonttools-4.55.0-cp312-cp312-win_amd64.whl", hash = "sha256:f8c8c76037d05652510ae45be1cd8fb5dd2fd9afec92a25374ac82255993d57c"}, - {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8118dc571921dc9e4b288d9cb423ceaf886d195a2e5329cc427df82bba872cd9"}, - {file = "fonttools-4.55.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01124f2ca6c29fad4132d930da69158d3f49b2350e4a779e1efbe0e82bd63f6c"}, - {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ffd58d2691f11f7c8438796e9f21c374828805d33e83ff4b76e4635633674c"}, - {file = "fonttools-4.55.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5435e5f1eb893c35c2bc2b9cd3c9596b0fcb0a59e7a14121562986dd4c47b8dd"}, - {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d12081729280c39d001edd0f4f06d696014c26e6e9a0a55488fabc37c28945e4"}, - {file = "fonttools-4.55.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a7ad1f1b98ab6cb927ab924a38a8649f1ffd7525c75fe5b594f5dab17af70e18"}, - {file = "fonttools-4.55.0-cp313-cp313-win32.whl", hash = "sha256:abe62987c37630dca69a104266277216de1023cf570c1643bb3a19a9509e7a1b"}, - {file = "fonttools-4.55.0-cp313-cp313-win_amd64.whl", hash = "sha256:2863555ba90b573e4201feaf87a7e71ca3b97c05aa4d63548a4b69ea16c9e998"}, - {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00f7cf55ad58a57ba421b6a40945b85ac7cc73094fb4949c41171d3619a3a47e"}, - {file = "fonttools-4.55.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f27526042efd6f67bfb0cc2f1610fa20364396f8b1fc5edb9f45bb815fb090b2"}, - {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e67974326af6a8879dc2a4ec63ab2910a1c1a9680ccd63e4a690950fceddbe"}, - {file = "fonttools-4.55.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61dc0a13451143c5e987dec5254d9d428f3c2789a549a7cf4f815b63b310c1cc"}, - {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e526b325a903868c62155a6a7e24df53f6ce4c5c3160214d8fe1be2c41b478"}, - {file = "fonttools-4.55.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b7ef9068a1297714e6fefe5932c33b058aa1d45a2b8be32a4c6dee602ae22b5c"}, - {file = "fonttools-4.55.0-cp38-cp38-win32.whl", hash = "sha256:55718e8071be35dff098976bc249fc243b58efa263768c611be17fe55975d40a"}, - {file = "fonttools-4.55.0-cp38-cp38-win_amd64.whl", hash = "sha256:553bd4f8cc327f310c20158e345e8174c8eed49937fb047a8bda51daf2c353c8"}, - {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f901cef813f7c318b77d1c5c14cf7403bae5cb977cede023e22ba4316f0a8f6"}, - {file = "fonttools-4.55.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c9679fc0dd7e8a5351d321d8d29a498255e69387590a86b596a45659a39eb0d"}, - {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2820a8b632f3307ebb0bf57948511c2208e34a4939cf978333bc0a3f11f838"}, - {file = "fonttools-4.55.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23bbbb49bec613a32ed1b43df0f2b172313cee690c2509f1af8fdedcf0a17438"}, - {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a656652e1f5d55b9728937a7e7d509b73d23109cddd4e89ee4f49bde03b736c6"}, - {file = "fonttools-4.55.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f50a1f455902208486fbca47ce33054208a4e437b38da49d6721ce2fef732fcf"}, - {file = "fonttools-4.55.0-cp39-cp39-win32.whl", hash = "sha256:161d1ac54c73d82a3cded44202d0218ab007fde8cf194a23d3dd83f7177a2f03"}, - {file = "fonttools-4.55.0-cp39-cp39-win_amd64.whl", hash = "sha256:ca7fd6987c68414fece41c96836e945e1f320cda56fc96ffdc16e54a44ec57a2"}, - {file = "fonttools-4.55.0-py3-none-any.whl", hash = "sha256:12db5888cd4dd3fcc9f0ee60c6edd3c7e1fd44b7dd0f31381ea03df68f8a153f"}, - {file = "fonttools-4.55.0.tar.gz", hash = "sha256:7636acc6ab733572d5e7eec922b254ead611f1cdad17be3f0be7418e8bfaca71"}, + {file = "fonttools-4.55.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bef0f8603834643b1a6419d57902f18e7d950ec1a998fb70410635c598dc1a1e"}, + {file = "fonttools-4.55.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:944228b86d472612d3b48bcc83b31c25c2271e63fdc74539adfcfa7a96d487fb"}, + {file = "fonttools-4.55.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f0e55f5da594b85f269cfbecd2f6bd3e07d0abba68870bc3f34854de4fa4678"}, + {file = "fonttools-4.55.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b1a6e576db0c83c1b91925bf1363478c4bb968dbe8433147332fb5782ce6190"}, + {file = "fonttools-4.55.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:616368b15716781bc84df5c2191dc0540137aaef56c2771eb4b89b90933f347a"}, + {file = "fonttools-4.55.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7bbae4f3915225c2c37670da68e2bf18a21206060ad31dfb95fec91ef641caa7"}, + {file = "fonttools-4.55.2-cp310-cp310-win32.whl", hash = "sha256:8b02b10648d69d67a7eb055f4d3eedf4a85deb22fb7a19fbd9acbae7c7538199"}, + {file = "fonttools-4.55.2-cp310-cp310-win_amd64.whl", hash = "sha256:bbea0ab841113ac8e8edde067e099b7288ffc6ac2dded538b131c2c0595d5f77"}, + {file = "fonttools-4.55.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d34525e8141286fa976e14806639d32294bfb38d28bbdb5f6be9f46a1cd695a6"}, + {file = "fonttools-4.55.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ecd1c2b1c2ec46bb73685bc5473c72e16ed0930ef79bc2919ccadc43a99fb16"}, + {file = "fonttools-4.55.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9008438ad59e5a8e403a62fbefef2b2ff377eb3857d90a3f2a5f4d674ff441b2"}, + {file = "fonttools-4.55.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:131591ac8d7a47043aaf29581aba755ae151d46e49d2bf49608601efd71e8b4d"}, + {file = "fonttools-4.55.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4c83381c3e3e3d9caa25527c4300543578341f21aae89e4fbbb4debdda8d82a2"}, + {file = "fonttools-4.55.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:42aca564b575252fd9954ed0d91d97a24de24289a16ce8ff74ed0bdf5ecebf11"}, + {file = "fonttools-4.55.2-cp311-cp311-win32.whl", hash = "sha256:c6457f650ebe15baa17fc06e256227f0a47f46f80f27ec5a0b00160de8dc2c13"}, + {file = "fonttools-4.55.2-cp311-cp311-win_amd64.whl", hash = "sha256:5cfa67414d7414442a5635ff634384101c54f53bb7b0e04aa6a61b013fcce194"}, + {file = "fonttools-4.55.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:18f082445b8fe5e91c53e6184f4c1c73f3f965c8bcc614c6cd6effd573ce6c1a"}, + {file = "fonttools-4.55.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c0f91adbbd706e8acd1db73e3e510118e62d0ffb651864567dccc5b2339f90"}, + {file = "fonttools-4.55.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d8ccce035320d63dba0c35f52499322f5531dbe85bba1514c7cea26297e4c54"}, + {file = "fonttools-4.55.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96e126df9615df214ec7f04bebcf60076297fbc10b75c777ce58b702d7708ffb"}, + {file = "fonttools-4.55.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:508ebb42956a7a931c4092dfa2d9b4ffd4f94cea09b8211199090d2bd082506b"}, + {file = "fonttools-4.55.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1b9de46ef7b683d50400abf9f1578eaceee271ff51c36bf4b7366f2be29f498"}, + {file = "fonttools-4.55.2-cp312-cp312-win32.whl", hash = "sha256:2df61d9fc15199cc86dad29f64dd686874a3a52dda0c2d8597d21f509f95c332"}, + {file = "fonttools-4.55.2-cp312-cp312-win_amd64.whl", hash = "sha256:d337ec087da8216a828574aa0525d869df0a2ac217a2efc1890974ddd1fbc5b9"}, + {file = "fonttools-4.55.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:10aff204e2edee1d312fa595c06f201adf8d528a3b659cfb34cd47eceaaa6a26"}, + {file = "fonttools-4.55.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09fe922a3eff181fd07dd724cdb441fb6b9fc355fd1c0f1aa79aca60faf1fbdd"}, + {file = "fonttools-4.55.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:487e1e8b524143a799bda0169c48b44a23a6027c1bb1957d5a172a7d3a1dd704"}, + {file = "fonttools-4.55.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b1726872e09268bbedb14dc02e58b7ea31ecdd1204c6073eda4911746b44797"}, + {file = "fonttools-4.55.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6fc88cfb58b0cd7b48718c3e61dd0d0a3ee8e2c86b973342967ce09fbf1db6d4"}, + {file = "fonttools-4.55.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e857fe1859901ad8c5cab32e0eebc920adb09f413d2d73b74b677cf47b28590c"}, + {file = "fonttools-4.55.2-cp313-cp313-win32.whl", hash = "sha256:81ccd2b3a420b8050c7d9db3be0555d71662973b3ef2a1d921a2880b58957db8"}, + {file = "fonttools-4.55.2-cp313-cp313-win_amd64.whl", hash = "sha256:d559eb1744c7dcfa90ae60cb1a4b3595e898e48f4198738c321468c01180cd83"}, + {file = "fonttools-4.55.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6b5917ef79cac8300b88fd6113003fd01bbbbea2ea060a27b95d8f77cb4c65c2"}, + {file = "fonttools-4.55.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:663eba5615d6abaaf616432354eb7ce951d518e43404371bcc2b0694ef21e8d6"}, + {file = "fonttools-4.55.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:803d5cef5fc47f44f5084d154aa3d6f069bb1b60e32390c225f897fa19b0f939"}, + {file = "fonttools-4.55.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bc5f100de0173cc39102c0399bd6c3bd544bbdf224957933f10ee442d43cddd"}, + {file = "fonttools-4.55.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3d9bbc1e380fdaf04ad9eabd8e3e6a4301eaf3487940893e9fd98537ea2e283b"}, + {file = "fonttools-4.55.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:42a9afedff07b6f75aa0f39b5e49922ac764580ef3efce035ca30284b2ee65c8"}, + {file = "fonttools-4.55.2-cp38-cp38-win32.whl", hash = "sha256:f1c76f423f1a241df08f87614364dff6e0b7ce23c962c1b74bd995ec7c0dad13"}, + {file = "fonttools-4.55.2-cp38-cp38-win_amd64.whl", hash = "sha256:25062b6ca03464dd5179fc2040fb19e03391b7cc49b9cc4f879312e638605c5c"}, + {file = "fonttools-4.55.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d1100d8e665fe386a79cab59446992de881ea74d0d6c191bb988642692aa2421"}, + {file = "fonttools-4.55.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbdc251c5e472e5ae6bc816f9b82718b8e93ff7992e7331d6cf3562b96aa268e"}, + {file = "fonttools-4.55.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0bf24d2b02dbc9376d795a63062632ff73e3e9e60c0229373f500aed7e86dd7"}, + {file = "fonttools-4.55.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ff250ed4ff05015dfd9cf2adf7570c7a383ca80f4d9732ac484a5ed0d8453c"}, + {file = "fonttools-4.55.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44cf2a98aa661dbdeb8c03f5e405b074e2935196780bb729888639f5276067d9"}, + {file = "fonttools-4.55.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22ef222740eb89d189bf0612eb98fbae592c61d7efeac51bfbc2a1592d469557"}, + {file = "fonttools-4.55.2-cp39-cp39-win32.whl", hash = "sha256:93f439ca27e55f585e7aaa04a74990acd983b5f2245e41d6b79f0a8b44e684d8"}, + {file = "fonttools-4.55.2-cp39-cp39-win_amd64.whl", hash = "sha256:627cf10d6f5af5bec6324c18a2670f134c29e1b7dce3fb62e8ef88baa6cba7a9"}, + {file = "fonttools-4.55.2-py3-none-any.whl", hash = "sha256:8e2d89fbe9b08d96e22c7a81ec04a4e8d8439c31223e2dc6f2f9fc8ff14bdf9f"}, + {file = "fonttools-4.55.2.tar.gz", hash = "sha256:45947e7b3f9673f91df125d375eb57b9a23f2a603f438a1aebf3171bffa7a205"}, ] [package.extras] @@ -1332,13 +1334,13 @@ trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" -version = "0.27.2" +version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] [package.dependencies] @@ -1346,7 +1348,6 @@ anyio = "*" certifi = "*" httpcore = "==1.*" idna = "*" -sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] @@ -1432,13 +1433,13 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio [[package]] name = "ipython" -version = "8.29.0" +version = "8.30.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.29.0-py3-none-any.whl", hash = "sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8"}, - {file = "ipython-8.29.0.tar.gz", hash = "sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb"}, + {file = "ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321"}, + {file = "ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e"}, ] [package.dependencies] @@ -1448,16 +1449,16 @@ exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} -prompt-toolkit = ">=3.0.41,<3.1.0" +prompt_toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" -stack-data = "*" +stack_data = "*" traitlets = ">=5.13.0" -typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} +typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -1552,84 +1553,86 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.7.1" +version = "0.8.0" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:262e96d06696b673fad6f257e6a0abb6e873dc22818ca0e0600f4a1189eb334f"}, - {file = "jiter-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be6de02939aac5be97eb437f45cfd279b1dc9de358b13ea6e040e63a3221c40d"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935f10b802bc1ce2b2f61843e498c7720aa7f4e4bb7797aa8121eab017293c3d"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9cd3cccccabf5064e4bb3099c87bf67db94f805c1e62d1aefd2b7476e90e0ee2"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aa919ebfc5f7b027cc368fe3964c0015e1963b92e1db382419dadb098a05192"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ae2d01e82c94491ce4d6f461a837f63b6c4e6dd5bb082553a70c509034ff3d4"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f9568cd66dbbdab67ae1b4c99f3f7da1228c5682d65913e3f5f95586b3cb9a9"}, - {file = "jiter-0.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9ecbf4e20ec2c26512736284dc1a3f8ed79b6ca7188e3b99032757ad48db97dc"}, - {file = "jiter-0.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1a0508fddc70ce00b872e463b387d49308ef02b0787992ca471c8d4ba1c0fa1"}, - {file = "jiter-0.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f84c9996664c460f24213ff1e5881530abd8fafd82058d39af3682d5fd2d6316"}, - {file = "jiter-0.7.1-cp310-none-win32.whl", hash = "sha256:c915e1a1960976ba4dfe06551ea87063b2d5b4d30759012210099e712a414d9f"}, - {file = "jiter-0.7.1-cp310-none-win_amd64.whl", hash = "sha256:75bf3b7fdc5c0faa6ffffcf8028a1f974d126bac86d96490d1b51b3210aa0f3f"}, - {file = "jiter-0.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ad04a23a91f3d10d69d6c87a5f4471b61c2c5cd6e112e85136594a02043f462c"}, - {file = "jiter-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e47a554de88dff701226bb5722b7f1b6bccd0b98f1748459b7e56acac2707a5"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e44fff69c814a2e96a20b4ecee3e2365e9b15cf5fe4e00869d18396daa91dab"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df0a1d05081541b45743c965436f8b5a1048d6fd726e4a030113a2699a6046ea"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f22cf8f236a645cb6d8ffe2a64edb5d2b66fb148bf7c75eea0cb36d17014a7bc"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8589f50b728ea4bf22e0632eefa125c8aa9c38ed202a5ee6ca371f05eeb3ff"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f20de711224f2ca2dbb166a8d512f6ff48c9c38cc06b51f796520eb4722cc2ce"}, - {file = "jiter-0.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a9803396032117b85ec8cbf008a54590644a062fedd0425cbdb95e4b2b60479"}, - {file = "jiter-0.7.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d8bae77c82741032e9d89a4026479061aba6e646de3bf5f2fc1ae2bbd9d06e0"}, - {file = "jiter-0.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3dc9939e576bbc68c813fc82f6620353ed68c194c7bcf3d58dc822591ec12490"}, - {file = "jiter-0.7.1-cp311-none-win32.whl", hash = "sha256:f7605d24cd6fab156ec89e7924578e21604feee9c4f1e9da34d8b67f63e54892"}, - {file = "jiter-0.7.1-cp311-none-win_amd64.whl", hash = "sha256:f3ea649e7751a1a29ea5ecc03c4ada0a833846c59c6da75d747899f9b48b7282"}, - {file = "jiter-0.7.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ad36a1155cbd92e7a084a568f7dc6023497df781adf2390c345dd77a120905ca"}, - {file = "jiter-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7ba52e6aaed2dc5c81a3d9b5e4ab95b039c4592c66ac973879ba57c3506492bb"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b7de0b6f6728b678540c7927587e23f715284596724be203af952418acb8a2d"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9463b62bd53c2fb85529c700c6a3beb2ee54fde8bef714b150601616dcb184a6"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:627164ec01d28af56e1f549da84caf0fe06da3880ebc7b7ee1ca15df106ae172"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25d0e5bf64e368b0aa9e0a559c3ab2f9b67e35fe7269e8a0d81f48bbd10e8963"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c244261306f08f8008b3087059601997016549cb8bb23cf4317a4827f07b7d74"}, - {file = "jiter-0.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ded4e4b75b68b843b7cea5cd7c55f738c20e1394c68c2cb10adb655526c5f1b"}, - {file = "jiter-0.7.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:80dae4f1889b9d09e5f4de6b58c490d9c8ce7730e35e0b8643ab62b1538f095c"}, - {file = "jiter-0.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5970cf8ec943b51bce7f4b98d2e1ed3ada170c2a789e2db3cb484486591a176a"}, - {file = "jiter-0.7.1-cp312-none-win32.whl", hash = "sha256:701d90220d6ecb3125d46853c8ca8a5bc158de8c49af60fd706475a49fee157e"}, - {file = "jiter-0.7.1-cp312-none-win_amd64.whl", hash = "sha256:7824c3ecf9ecf3321c37f4e4d4411aad49c666ee5bc2a937071bdd80917e4533"}, - {file = "jiter-0.7.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:097676a37778ba3c80cb53f34abd6943ceb0848263c21bf423ae98b090f6c6ba"}, - {file = "jiter-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3298af506d4271257c0a8f48668b0f47048d69351675dd8500f22420d4eec378"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12fd88cfe6067e2199964839c19bd2b422ca3fd792949b8f44bb8a4e7d21946a"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dacca921efcd21939123c8ea8883a54b9fa7f6545c8019ffcf4f762985b6d0c8"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de3674a5fe1f6713a746d25ad9c32cd32fadc824e64b9d6159b3b34fd9134143"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65df9dbae6d67e0788a05b4bad5706ad40f6f911e0137eb416b9eead6ba6f044"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ba9a358d59a0a55cccaa4957e6ae10b1a25ffdabda863c0343c51817610501d"}, - {file = "jiter-0.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:576eb0f0c6207e9ede2b11ec01d9c2182973986514f9c60bc3b3b5d5798c8f50"}, - {file = "jiter-0.7.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e550e29cdf3577d2c970a18f3959e6b8646fd60ef1b0507e5947dc73703b5627"}, - {file = "jiter-0.7.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81d968dbf3ce0db2e0e4dec6b0a0d5d94f846ee84caf779b07cab49f5325ae43"}, - {file = "jiter-0.7.1-cp313-none-win32.whl", hash = "sha256:f892e547e6e79a1506eb571a676cf2f480a4533675f834e9ae98de84f9b941ac"}, - {file = "jiter-0.7.1-cp313-none-win_amd64.whl", hash = "sha256:0302f0940b1455b2a7fb0409b8d5b31183db70d2b07fd177906d83bf941385d1"}, - {file = "jiter-0.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c65a3ce72b679958b79d556473f192a4dfc5895e8cc1030c9f4e434690906076"}, - {file = "jiter-0.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e80052d3db39f9bb8eb86d207a1be3d9ecee5e05fdec31380817f9609ad38e60"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a497859c4f3f7acd71c8bd89a6f9cf753ebacacf5e3e799138b8e1843084e3"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c1288bc22b9e36854a0536ba83666c3b1fb066b811019d7b682c9cf0269cdf9f"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b096ca72dd38ef35675e1d3b01785874315182243ef7aea9752cb62266ad516f"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dbbd52c50b605af13dbee1a08373c520e6fcc6b5d32f17738875847fea4e2cd"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af29c5c6eb2517e71ffa15c7ae9509fa5e833ec2a99319ac88cc271eca865519"}, - {file = "jiter-0.7.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f114a4df1e40c03c0efbf974b376ed57756a1141eb27d04baee0680c5af3d424"}, - {file = "jiter-0.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:191fbaee7cf46a9dd9b817547bf556facde50f83199d07fc48ebeff4082f9df4"}, - {file = "jiter-0.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e2b445e5ee627fb4ee6bbceeb486251e60a0c881a8e12398dfdff47c56f0723"}, - {file = "jiter-0.7.1-cp38-none-win32.whl", hash = "sha256:47ac4c3cf8135c83e64755b7276339b26cd3c7ddadf9e67306ace4832b283edf"}, - {file = "jiter-0.7.1-cp38-none-win_amd64.whl", hash = "sha256:60b49c245cd90cde4794f5c30f123ee06ccf42fb8730a019a2870cd005653ebd"}, - {file = "jiter-0.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8f212eeacc7203256f526f550d105d8efa24605828382cd7d296b703181ff11d"}, - {file = "jiter-0.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d9e247079d88c00e75e297e6cb3a18a039ebcd79fefc43be9ba4eb7fb43eb726"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0aacaa56360139c53dcf352992b0331f4057a0373bbffd43f64ba0c32d2d155"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc1b55314ca97dbb6c48d9144323896e9c1a25d41c65bcb9550b3e0c270ca560"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f281aae41b47e90deb70e7386558e877a8e62e1693e0086f37d015fa1c102289"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93c20d2730a84d43f7c0b6fb2579dc54335db742a59cf9776d0b80e99d587382"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e81ccccd8069110e150613496deafa10da2f6ff322a707cbec2b0d52a87b9671"}, - {file = "jiter-0.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a7d5e85766eff4c9be481d77e2226b4c259999cb6862ccac5ef6621d3c8dcce"}, - {file = "jiter-0.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f52ce5799df5b6975439ecb16b1e879d7655e1685b6e3758c9b1b97696313bfb"}, - {file = "jiter-0.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0c91a0304373fdf97d56f88356a010bba442e6d995eb7773cbe32885b71cdd8"}, - {file = "jiter-0.7.1-cp39-none-win32.whl", hash = "sha256:5c08adf93e41ce2755970e8aa95262298afe2bf58897fb9653c47cd93c3c6cdc"}, - {file = "jiter-0.7.1-cp39-none-win_amd64.whl", hash = "sha256:6592f4067c74176e5f369228fb2995ed01400c9e8e1225fb73417183a5e635f0"}, - {file = "jiter-0.7.1.tar.gz", hash = "sha256:448cf4f74f7363c34cdef26214da527e8eeffd88ba06d0b80b485ad0667baf5d"}, + {file = "jiter-0.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dee4eeb293ffcd2c3b31ebab684dbf7f7b71fe198f8eddcdf3a042cc6e10205a"}, + {file = "jiter-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aad1e6e9b01cf0304dcee14db03e92e0073287a6297caf5caf2e9dbfea16a924"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:504099fb7acdbe763e10690d560a25d4aee03d918d6a063f3a761d8a09fb833f"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2373487caad7fe39581f588ab5c9262fc1ade078d448626fec93f4ffba528858"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c341ecc3f9bccde952898b0c97c24f75b84b56a7e2f8bbc7c8e38cab0875a027"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e48e7a336529b9419d299b70c358d4ebf99b8f4b847ed3f1000ec9f320e8c0c"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ee157a8afd2943be690db679f82fafb8d347a8342e8b9c34863de30c538d55"}, + {file = "jiter-0.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d7dceae3549b80087f913aad4acc2a7c1e0ab7cb983effd78bdc9c41cabdcf18"}, + {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e29e9ecce53d396772590438214cac4ab89776f5e60bd30601f1050b34464019"}, + {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fa1782f22d5f92c620153133f35a9a395d3f3823374bceddd3e7032e2fdfa0b1"}, + {file = "jiter-0.8.0-cp310-none-win32.whl", hash = "sha256:f754ef13b4e4f67a3bf59fe974ef4342523801c48bf422f720bd37a02a360584"}, + {file = "jiter-0.8.0-cp310-none-win_amd64.whl", hash = "sha256:796f750b65f5d605f5e7acaccc6b051675e60c41d7ac3eab40dbd7b5b81a290f"}, + {file = "jiter-0.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f6f4e645efd96b4690b9b6091dbd4e0fa2885ba5c57a0305c1916b75b4f30ff6"}, + {file = "jiter-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f61cf6d93c1ade9b8245c9f14b7900feadb0b7899dbe4aa8de268b705647df81"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0396bc5cb1309c6dab085e70bb3913cdd92218315e47b44afe9eace68ee8adaa"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62d0e42ec5dc772bd8554a304358220be5d97d721c4648b23f3a9c01ccc2cb26"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec4b711989860705733fc59fb8c41b2def97041cea656b37cf6c8ea8dee1c3f4"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859cc35bf304ab066d88f10a44a3251a9cd057fb11ec23e00be22206db878f4f"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5000195921aa293b39b9b5bc959d7fa658e7f18f938c0e52732da8e3cc70a278"}, + {file = "jiter-0.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36050284c0abde57aba34964d3920f3d6228211b65df7187059bb7c7f143759a"}, + {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a88f608e050cfe45c48d771e86ecdbf5258314c883c986d4217cc79e1fb5f689"}, + {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:646cf4237665b2e13b4159d8f26d53f59bc9f2e6e135e3a508a2e5dd26d978c6"}, + {file = "jiter-0.8.0-cp311-none-win32.whl", hash = "sha256:21fe5b8345db1b3023052b2ade9bb4d369417827242892051244af8fae8ba231"}, + {file = "jiter-0.8.0-cp311-none-win_amd64.whl", hash = "sha256:30c2161c5493acf6b6c3c909973fb64ae863747def01cc7574f3954e0a15042c"}, + {file = "jiter-0.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d91a52d8f49ada2672a4b808a0c5c25d28f320a2c9ca690e30ebd561eb5a1002"}, + {file = "jiter-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c38cf25cf7862f61410b7a49684d34eb3b5bcbd7ddaf4773eea40e0bd43de706"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6189beb5c4b3117624be6b2e84545cff7611f5855d02de2d06ff68e316182be"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e13fa849c0e30643554add089983caa82f027d69fad8f50acadcb21c462244ab"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7765ca159d0a58e8e0f8ca972cd6d26a33bc97b4480d0d2309856763807cd28"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b0befe7c6e9fc867d5bed21bab0131dfe27d1fa5cd52ba2bced67da33730b7d"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7d6363d4c6f1052b1d8b494eb9a72667c3ef5f80ebacfe18712728e85327000"}, + {file = "jiter-0.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a873e57009863eeac3e3969e4653f07031d6270d037d6224415074ac17e5505c"}, + {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2582912473c0d9940791479fe1bf2976a34f212eb8e0a82ee9e645ac275c5d16"}, + {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:646163201af42f55393ee6e8f6136b8df488253a6533f4230a64242ecbfe6048"}, + {file = "jiter-0.8.0-cp312-none-win32.whl", hash = "sha256:96e75c9abfbf7387cba89a324d2356d86d8897ac58c956017d062ad510832dae"}, + {file = "jiter-0.8.0-cp312-none-win_amd64.whl", hash = "sha256:ed6074552b4a32e047b52dad5ab497223721efbd0e9efe68c67749f094a092f7"}, + {file = "jiter-0.8.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:dd5e351cb9b3e676ec3360a85ea96def515ad2b83c8ae3a251ce84985a2c9a6f"}, + {file = "jiter-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba9f12b0f801ecd5ed0cec29041dc425d1050922b434314c592fc30d51022467"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7ba461c3681728d556392e8ae56fb44a550155a24905f01982317b367c21dd4"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a15ed47ab09576db560dbc5c2c5a64477535beb056cd7d997d5dd0f2798770e"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cef55042816d0737142b0ec056c0356a5f681fb8d6aa8499b158e87098f4c6f8"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:549f170215adeb5e866f10617c3d019d8eb4e6d4e3c6b724b3b8c056514a3487"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f867edeb279d22020877640d2ea728de5817378c60a51be8af731a8a8f525306"}, + {file = "jiter-0.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aef8845f463093799db4464cee2aa59d61aa8edcb3762aaa4aacbec3f478c929"}, + {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:d0d6e22e4062c3d3c1bf3594baa2f67fc9dcdda8275abad99e468e0c6540bc54"}, + {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:079e62e64696241ac3f408e337aaac09137ed760ccf2b72b1094b48745c13641"}, + {file = "jiter-0.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74d2b56ed3da5760544df53b5f5c39782e68efb64dc3aa0bba4cc08815e6fae8"}, + {file = "jiter-0.8.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:798dafe108cba58a7bb0a50d4d5971f98bb7f3c974e1373e750de6eb21c1a329"}, + {file = "jiter-0.8.0-cp313-none-win32.whl", hash = "sha256:ca6d3064dfc743eb0d3d7539d89d4ba886957c717567adc72744341c1e3573c9"}, + {file = "jiter-0.8.0-cp313-none-win_amd64.whl", hash = "sha256:38caedda64fe1f04b06d7011fc15e86b3b837ed5088657bf778656551e3cd8f9"}, + {file = "jiter-0.8.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:bb5c8a0a8d081c338db22e5b8d53a89a121790569cbb85f7d3cfb1fe0fbe9836"}, + {file = "jiter-0.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:202dbe8970bfb166fab950eaab8f829c505730a0b33cc5e1cfb0a1c9dd56b2f9"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9046812e5671fdcfb9ae02881fff1f6a14d484b7e8b3316179a372cdfa1e8026"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6ac56425023e52d65150918ae25480d0a1ce2a6bf5ea2097f66a2cc50f6d692"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dfcf97210c6eab9d2a1c6af15dd39e1d5154b96a7145d0a97fa1df865b7b834"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4e3c8444d418686f78c9a547b9b90031faf72a0a1a46bfec7fb31edbd889c0d"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6507011a299b7f578559084256405a8428875540d8d13530e00b688e41b09493"}, + {file = "jiter-0.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0aae4738eafdd34f0f25c2d3668ce9e8fa0d7cb75a2efae543c9a69aebc37323"}, + {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5d782e790396b13f2a7b36bdcaa3736a33293bdda80a4bf1a3ce0cd5ef9f15"}, + {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc7f993bc2c4e03015445adbb16790c303282fce2e8d9dc3a3905b1d40e50564"}, + {file = "jiter-0.8.0-cp38-none-win32.whl", hash = "sha256:d4a8a6eda018a991fa58ef707dd51524055d11f5acb2f516d70b1be1d15ab39c"}, + {file = "jiter-0.8.0-cp38-none-win_amd64.whl", hash = "sha256:4cca948a3eda8ea24ed98acb0ee19dc755b6ad2e570ec85e1527d5167f91ff67"}, + {file = "jiter-0.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ef89663678d8257063ce7c00d94638e05bd72f662c5e1eb0e07a172e6c1a9a9f"}, + {file = "jiter-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c402ddcba90b4cc71db3216e8330f4db36e0da2c78cf1d8a9c3ed8f272602a94"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6dfe795b7a173a9f8ba7421cdd92193d60c1c973bbc50dc3758a9ad0fa5eb6"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ec29a31b9abd6be39453a2c45da067138a3005d65d2c0507c530e0f1fdcd9a4"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a488f8c54bddc3ddefaf3bfd6de4a52c97fc265d77bc2dcc6ee540c17e8c342"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aeb5561adf4d26ca0d01b5811b4d7b56a8986699a473d700757b4758ef787883"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab961858d7ad13132328517d29f121ae1b2d94502191d6bcf96bddcc8bb5d1c"}, + {file = "jiter-0.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a207e718d114d23acf0850a2174d290f42763d955030d9924ffa4227dbd0018f"}, + {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:733bc9dc8ff718a0ae4695239e9268eb93e88b73b367dfac3ec227d8ce2f1e77"}, + {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1ec27299e22d05e13a06e460bf7f75f26f9aaa0e0fb7d060f40e88df1d81faa"}, + {file = "jiter-0.8.0-cp39-none-win32.whl", hash = "sha256:e8dbfcb46553e6661d3fc1f33831598fcddf73d0f67834bce9fc3e9ebfe5c439"}, + {file = "jiter-0.8.0-cp39-none-win_amd64.whl", hash = "sha256:af2ce2487b3a93747e2cb5150081d4ae1e5874fce5924fc1a12e9e768e489ad8"}, + {file = "jiter-0.8.0.tar.gz", hash = "sha256:86fee98b569d4cc511ff2e3ec131354fafebd9348a487549c31ad371ae730310"}, ] [[package]] @@ -1645,24 +1648,24 @@ files = [ [[package]] name = "json-repair" -version = "0.30.2" +version = "0.30.3" description = "A package to repair broken json strings" optional = false python-versions = ">=3.9" files = [ - {file = "json_repair-0.30.2-py3-none-any.whl", hash = "sha256:824d7ab208f5daadf7925e362979870ba91f9a5e6242d59f7073c7171abe27b5"}, - {file = "json_repair-0.30.2.tar.gz", hash = "sha256:aa244f0d91e81c9587b2b6981a5657a7d4fadb20051f74bc6110f1ca6a963fb9"}, + {file = "json_repair-0.30.3-py3-none-any.whl", hash = "sha256:63bb588162b0958ae93d85356ecbe54c06b8c33f8a4834f93fa2719ea669804e"}, + {file = "json_repair-0.30.3.tar.gz", hash = "sha256:0ac56e7ae9253ee9c507a7e1a3a26799c9b0bbe5e2bec1b2cc5053e90d5b05e3"}, ] [[package]] name = "json5" -version = "0.9.28" +version = "0.10.0" description = "A Python implementation of the JSON5 data format." optional = false python-versions = ">=3.8.0" files = [ - {file = "json5-0.9.28-py3-none-any.whl", hash = "sha256:29c56f1accdd8bc2e037321237662034a7e07921e2b7223281a5ce2c46f0c4df"}, - {file = "json5-0.9.28.tar.gz", hash = "sha256:1f82f36e615bc5b42f1bbd49dbc94b12563c56408c6ffa06414ea310890e9a6e"}, + {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, + {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, ] [package.extras] @@ -1903,18 +1906,18 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.3.1" +version = "4.3.2" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.3.1-py3-none-any.whl", hash = "sha256:2d9a1c305bc748e277819a17a5d5e22452e533e835f4237b2f30f3b0e491e01f"}, - {file = "jupyterlab-4.3.1.tar.gz", hash = "sha256:a4a338327556443521731d82f2a6ccf926df478914ca029616621704d47c3c65"}, + {file = "jupyterlab-4.3.2-py3-none-any.whl", hash = "sha256:e87100cbab8b886ff7a4f325c856100ba6fdfe916162a85409daf0e707e19d1d"}, + {file = "jupyterlab-4.3.2.tar.gz", hash = "sha256:3c0a6882dbddcc0a7bfdd5e2236f351b2b263e48780236e6996c2aca13ac5b22"}, ] [package.dependencies] async-lru = ">=1.0.0" -httpx = ">=0.25.0" +httpx = ">=0.28.0,<0.29.0" ipykernel = ">=6.5.0" jinja2 = ">=3.0.3" jupyter-core = "*" @@ -1923,7 +1926,7 @@ jupyter-server = ">=2.4.0,<3" jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2" packaging = "*" -setuptools = ">=40.1.0" +setuptools = ">=40.8.0" tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} tornado = ">=6.2.0" traitlets = "*" @@ -2329,51 +2332,52 @@ tests = ["pytest", "simplejson"] [[package]] name = "matplotlib" -version = "3.9.2" +version = "3.9.3" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"}, - {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"}, - {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"}, - {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"}, - {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"}, - {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"}, - {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"}, - {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"}, - {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"}, - {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"}, - {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"}, - {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"}, - {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"}, - {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"}, - {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"}, - {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"}, - {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"}, - {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"}, - {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"}, - {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"}, - {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"}, - {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"}, - {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"}, - {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"}, - {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"}, - {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"}, - {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"}, - {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"}, - {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"}, - {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"}, - {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"}, - {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"}, - {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"}, - {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"}, - {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"}, - {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"}, - {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"}, + {file = "matplotlib-3.9.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:41b016e3be4e740b66c79a031a0a6e145728dbc248142e751e8dab4f3188ca1d"}, + {file = "matplotlib-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e0143975fc2a6d7136c97e19c637321288371e8f09cff2564ecd73e865ea0b9"}, + {file = "matplotlib-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f459c8ee2c086455744723628264e43c884be0c7d7b45d84b8cd981310b4815"}, + {file = "matplotlib-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687df7ceff57b8f070d02b4db66f75566370e7ae182a0782b6d3d21b0d6917dc"}, + {file = "matplotlib-3.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:edd14cf733fdc4f6e6fe3f705af97676a7e52859bf0044aa2c84e55be739241c"}, + {file = "matplotlib-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c40c244221a1adbb1256692b1133c6fb89418df27bf759a31a333e7912a4010"}, + {file = "matplotlib-3.9.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:cf2a60daf6cecff6828bc608df00dbc794380e7234d2411c0ec612811f01969d"}, + {file = "matplotlib-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:213d6dc25ce686516208d8a3e91120c6a4fdae4a3e06b8505ced5b716b50cc04"}, + {file = "matplotlib-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c52f48eb75fcc119a4fdb68ba83eb5f71656999420375df7c94cc68e0e14686e"}, + {file = "matplotlib-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c93796b44fa111049b88a24105e947f03c01966b5c0cc782e2ee3887b790a3"}, + {file = "matplotlib-3.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cd1077b9a09b16d8c3c7075a8add5ffbfe6a69156a57e290c800ed4d435bef1d"}, + {file = "matplotlib-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:c96eeeb8c68b662c7747f91a385688d4b449687d29b691eff7068a4602fe6dc4"}, + {file = "matplotlib-3.9.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0a361bd5583bf0bcc08841df3c10269617ee2a36b99ac39d455a767da908bbbc"}, + {file = "matplotlib-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e14485bb1b83eeb3d55b6878f9560240981e7bbc7a8d4e1e8c38b9bd6ec8d2de"}, + {file = "matplotlib-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a8d279f78844aad213c4935c18f8292a9432d51af2d88bca99072c903948045"}, + {file = "matplotlib-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6c12514329ac0d03128cf1dcceb335f4fbf7c11da98bca68dca8dcb983153a9"}, + {file = "matplotlib-3.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6e9de2b390d253a508dd497e9b5579f3a851f208763ed67fdca5dc0c3ea6849c"}, + {file = "matplotlib-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d796272408f8567ff7eaa00eb2856b3a00524490e47ad505b0b4ca6bb8a7411f"}, + {file = "matplotlib-3.9.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:203d18df84f5288973b2d56de63d4678cc748250026ca9e1ad8f8a0fd8a75d83"}, + {file = "matplotlib-3.9.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b651b0d3642991259109dc0351fc33ad44c624801367bb8307be9bfc35e427ad"}, + {file = "matplotlib-3.9.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66d7b171fecf96940ce069923a08ba3df33ef542de82c2ff4fe8caa8346fa95a"}, + {file = "matplotlib-3.9.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be0ba61f6ff2e6b68e4270fb63b6813c9e7dec3d15fc3a93f47480444fd72f0"}, + {file = "matplotlib-3.9.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d6b2e8856dec3a6db1ae51aec85c82223e834b228c1d3228aede87eee2b34f9"}, + {file = "matplotlib-3.9.3-cp313-cp313-win_amd64.whl", hash = "sha256:90a85a004fefed9e583597478420bf904bb1a065b0b0ee5b9d8d31b04b0f3f70"}, + {file = "matplotlib-3.9.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3119b2f16de7f7b9212ba76d8fe6a0e9f90b27a1e04683cd89833a991682f639"}, + {file = "matplotlib-3.9.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:87ad73763d93add1b6c1f9fcd33af662fd62ed70e620c52fcb79f3ac427cf3a6"}, + {file = "matplotlib-3.9.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:026bdf3137ab6022c866efa4813b6bbeddc2ed4c9e7e02f0e323a7bca380dfa0"}, + {file = "matplotlib-3.9.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760a5e89ebbb172989e8273024a1024b0f084510b9105261b3b00c15e9c9f006"}, + {file = "matplotlib-3.9.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a42b9dc42de2cfe357efa27d9c50c7833fc5ab9b2eb7252ccd5d5f836a84e1e4"}, + {file = "matplotlib-3.9.3-cp313-cp313t-win_amd64.whl", hash = "sha256:e0fcb7da73fbf67b5f4bdaa57d85bb585a4e913d4a10f3e15b32baea56a67f0a"}, + {file = "matplotlib-3.9.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:031b7f5b8e595cc07def77ec5b58464e9bb67dc5760be5d6f26d9da24892481d"}, + {file = "matplotlib-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fa6e193c14d6944e0685cdb527cb6b38b0e4a518043e7212f214113af7391da"}, + {file = "matplotlib-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e6eefae6effa0c35bbbc18c25ee6e0b1da44d2359c3cd526eb0c9e703cf055d"}, + {file = "matplotlib-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d3e5c7a99bd28afb957e1ae661323b0800d75b419f24d041ed1cc5d844a764"}, + {file = "matplotlib-3.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:816a966d5d376bf24c92af8f379e78e67278833e4c7cbc9fa41872eec629a060"}, + {file = "matplotlib-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fb0b37c896172899a4a93d9442ffdc6f870165f59e05ce2e07c6fded1c15749"}, + {file = "matplotlib-3.9.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f2a4ea08e6876206d511365b0bc234edc813d90b930be72c3011bbd7898796f"}, + {file = "matplotlib-3.9.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9b081dac96ab19c54fd8558fac17c9d2c9cb5cc4656e7ed3261ddc927ba3e2c5"}, + {file = "matplotlib-3.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a0a63cb8404d1d1f94968ef35738900038137dab8af836b6c21bb6f03d75465"}, + {file = "matplotlib-3.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:896774766fd6be4571a43bc2fcbcb1dcca0807e53cab4a5bf88c4aa861a08e12"}, + {file = "matplotlib-3.9.3.tar.gz", hash = "sha256:cd5dbbc8e25cad5f706845c4d100e2c8b34691b412b93717ce38d8ae803bcfa5"}, ] [package.dependencies] @@ -2388,7 +2392,7 @@ pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [package.extras] -dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] +dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] [[package]] name = "matplotlib-inline" @@ -2537,13 +2541,13 @@ pygments = ">2.12.0" [[package]] name = "mkdocs-material" -version = "9.5.45" +version = "9.5.47" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.45-py3-none-any.whl", hash = "sha256:a9be237cfd0be14be75f40f1726d83aa3a81ce44808dc3594d47a7a592f44547"}, - {file = "mkdocs_material-9.5.45.tar.gz", hash = "sha256:286489cf0beca4a129d91d59d6417419c63bceed1ce5cd0ec1fc7e1ebffb8189"}, + {file = "mkdocs_material-9.5.47-py3-none-any.whl", hash = "sha256:53fb9c9624e7865da6ec807d116cd7be24b3cb36ab31b1d1d1a9af58c56009a2"}, + {file = "mkdocs_material-9.5.47.tar.gz", hash = "sha256:fc3b7a8e00ad896660bd3a5cc12ca0cb28bdc2bcbe2a946b5714c23ac91b0ede"}, ] [package.dependencies] @@ -2626,13 +2630,13 @@ portalocker = ">=1.4,<3" [[package]] name = "nbclient" -version = "0.10.0" +version = "0.10.1" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, - {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, + {file = "nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d"}, + {file = "nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68"}, ] [package.dependencies] @@ -2643,7 +2647,7 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] @@ -2772,26 +2776,26 @@ files = [ [[package]] name = "notebook" -version = "7.0.7" +version = "7.3.1" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.0.7-py3-none-any.whl", hash = "sha256:289b606d7e173f75a18beb1406ef411b43f97f7a9c55ba03efa3622905a62346"}, - {file = "notebook-7.0.7.tar.gz", hash = "sha256:3bcff00c17b3ac142ef5f436d50637d936b274cfa0b41f6ac0175363de9b4e09"}, + {file = "notebook-7.3.1-py3-none-any.whl", hash = "sha256:212e1486b2230fe22279043f33c7db5cf9a01d29feb063a85cb139747b7c9483"}, + {file = "notebook-7.3.1.tar.gz", hash = "sha256:84381c2a82d867517fd25b86e986dae1fe113a70b98f03edff9b94e499fec8fa"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.0.2,<5" -jupyterlab-server = ">=2.22.1,<3" +jupyterlab = ">=4.3.2,<4.4" +jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -2891,13 +2895,13 @@ files = [ [[package]] name = "openai" -version = "1.55.0" +version = "1.57.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.55.0-py3-none-any.whl", hash = "sha256:446e08918f8dd70d8723274be860404c8c7cc46b91b93bbc0ef051f57eb503c1"}, - {file = "openai-1.55.0.tar.gz", hash = "sha256:6c0975ac8540fe639d12b4ff5a8e0bf1424c844c4a4251148f59f06c4b2bd5db"}, + {file = "openai-1.57.0-py3-none-any.whl", hash = "sha256:972e36960b821797952da3dc4532f486c28e28a2a332d7d0c5407f242e9d9c39"}, + {file = "openai-1.57.0.tar.gz", hash = "sha256:76f91971c4bdbd78380c9970581075e0337b5d497c2fbf7b5255078f4b31abf9"}, ] [package.dependencies] @@ -3341,13 +3345,13 @@ plot = ["matplotlib"] [[package]] name = "prometheus-client" -version = "0.21.0" +version = "0.21.1" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.21.0-py3-none-any.whl", hash = "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166"}, - {file = "prometheus_client-0.21.0.tar.gz", hash = "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e"}, + {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, + {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, ] [package.extras] @@ -3511,18 +3515,18 @@ files = [ [[package]] name = "pydantic" -version = "2.10.0" +version = "2.10.3" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.10.0-py3-none-any.whl", hash = "sha256:5e7807ba9201bdf61b1b58aa6eb690916c40a47acfb114b1b4fef3e7fd5b30fc"}, - {file = "pydantic-2.10.0.tar.gz", hash = "sha256:0aca0f045ff6e2f097f1fe89521115335f15049eeb8a7bef3dafe4b19a74e289"}, + {file = "pydantic-2.10.3-py3-none-any.whl", hash = "sha256:be04d85bbc7b65651c5f8e6b9976ed9c6f41782a55524cef079a34a0bb82144d"}, + {file = "pydantic-2.10.3.tar.gz", hash = "sha256:cb5ac360ce894ceacd69c403187900a02c4b20b693a9dd1d643e1effab9eadf9"}, ] [package.dependencies] annotated-types = ">=0.6.0" -pydantic-core = "2.27.0" +pydantic-core = "2.27.1" typing-extensions = ">=4.12.2" [package.extras] @@ -3531,111 +3535,111 @@ timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.27.0" +version = "2.27.1" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.27.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2ac6b919f7fed71b17fe0b4603c092a4c9b5bae414817c9c81d3c22d1e1bcc"}, - {file = "pydantic_core-2.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e015833384ca3e1a0565a79f5d953b0629d9138021c27ad37c92a9fa1af7623c"}, - {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db72e40628967f6dc572020d04b5f800d71264e0531c6da35097e73bdf38b003"}, - {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df45c4073bed486ea2f18757057953afed8dd77add7276ff01bccb79982cf46c"}, - {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:836a4bfe0cc6d36dc9a9cc1a7b391265bf6ce9d1eb1eac62ac5139f5d8d9a6fa"}, - {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bf1340ae507f6da6360b24179c2083857c8ca7644aab65807023cf35404ea8d"}, - {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ab325fc86fbc077284c8d7f996d904d30e97904a87d6fb303dce6b3de7ebba9"}, - {file = "pydantic_core-2.27.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1da0c98a85a6c6ed702d5556db3b09c91f9b0b78de37b7593e2de8d03238807a"}, - {file = "pydantic_core-2.27.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7b0202ebf2268954090209a84f9897345719e46a57c5f2c9b7b250ca0a9d3e63"}, - {file = "pydantic_core-2.27.0-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:35380671c3c921fe8adf31ad349dc6f7588b7e928dbe44e1093789734f607399"}, - {file = "pydantic_core-2.27.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b4c19525c3538fbc0bbda6229f9682fb8199ce9ac37395880e6952798e00373"}, - {file = "pydantic_core-2.27.0-cp310-none-win32.whl", hash = "sha256:333c840a1303d1474f491e7be0b718226c730a39ead0f7dab2c7e6a2f3855555"}, - {file = "pydantic_core-2.27.0-cp310-none-win_amd64.whl", hash = "sha256:99b2863c1365f43f74199c980a3d40f18a218fbe683dd64e470199db426c4d6a"}, - {file = "pydantic_core-2.27.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4523c4009c3f39d948e01962223c9f5538602e7087a628479b723c939fab262d"}, - {file = "pydantic_core-2.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84af1cf7bfdcbc6fcf5a5f70cc9896205e0350306e4dd73d54b6a18894f79386"}, - {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e65466b31be1070b4a5b7dbfbd14b247884cb8e8b79c64fb0f36b472912dbaea"}, - {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a5c022bb0d453192426221605efc865373dde43b17822a264671c53b068ac20c"}, - {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6bb69bf3b6500f195c3deb69c1205ba8fc3cb21d1915f1f158a10d6b1ef29b6a"}, - {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aa4d1b2eba9a325897308b3124014a142cdccb9f3e016f31d3ebee6b5ea5e75"}, - {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e96ca781e0c01e32115912ebdf7b3fb0780ce748b80d7d28a0802fa9fbaf44e"}, - {file = "pydantic_core-2.27.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b872c86d8d71827235c7077461c502feb2db3f87d9d6d5a9daa64287d75e4fa0"}, - {file = "pydantic_core-2.27.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:82e1ad4ca170e8af4c928b67cff731b6296e6a0a0981b97b2eb7c275cc4e15bd"}, - {file = "pydantic_core-2.27.0-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:eb40f828bc2f73f777d1eb8fee2e86cd9692a4518b63b6b5aa8af915dfd3207b"}, - {file = "pydantic_core-2.27.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9a8fbf506fde1529a1e3698198fe64bfbe2e0c09557bc6a7dcf872e7c01fec40"}, - {file = "pydantic_core-2.27.0-cp311-none-win32.whl", hash = "sha256:24f984fc7762ed5f806d9e8c4c77ea69fdb2afd987b4fd319ef06c87595a8c55"}, - {file = "pydantic_core-2.27.0-cp311-none-win_amd64.whl", hash = "sha256:68950bc08f9735306322bfc16a18391fcaac99ded2509e1cc41d03ccb6013cfe"}, - {file = "pydantic_core-2.27.0-cp311-none-win_arm64.whl", hash = "sha256:3eb8849445c26b41c5a474061032c53e14fe92a11a5db969f722a2716cd12206"}, - {file = "pydantic_core-2.27.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8117839a9bdbba86e7f9df57018fe3b96cec934c3940b591b0fd3fbfb485864a"}, - {file = "pydantic_core-2.27.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a291d0b4243a259c8ea7e2b84eb9ccb76370e569298875a7c5e3e71baf49057a"}, - {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e35afd9e10b2698e6f2f32256678cb23ca6c1568d02628033a837638b3ed12"}, - {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58ab0d979c969983cdb97374698d847a4acffb217d543e172838864636ef10d9"}, - {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d06b667e53320332be2bf6f9461f4a9b78092a079b8ce8634c9afaa7e10cd9f"}, - {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78f841523729e43e3928a364ec46e2e3f80e6625a4f62aca5c345f3f626c6e8a"}, - {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:400bf470e4327e920883b51e255617dfe4496d4e80c3fea0b5a5d0bf2c404dd4"}, - {file = "pydantic_core-2.27.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:951e71da6c89d354572098bada5ba5b5dc3a9390c933af8a614e37755d3d1840"}, - {file = "pydantic_core-2.27.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a51ce96224eadd1845150b204389623c8e129fde5a67a84b972bd83a85c6c40"}, - {file = "pydantic_core-2.27.0-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:483c2213a609e7db2c592bbc015da58b6c75af7360ca3c981f178110d9787bcf"}, - {file = "pydantic_core-2.27.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:359e7951f04ad35111b5ddce184db3391442345d0ab073aa63a95eb8af25a5ef"}, - {file = "pydantic_core-2.27.0-cp312-none-win32.whl", hash = "sha256:ee7d9d5537daf6d5c74a83b38a638cc001b648096c1cae8ef695b0c919d9d379"}, - {file = "pydantic_core-2.27.0-cp312-none-win_amd64.whl", hash = "sha256:2be0ad541bb9f059954ccf8877a49ed73877f862529575ff3d54bf4223e4dd61"}, - {file = "pydantic_core-2.27.0-cp312-none-win_arm64.whl", hash = "sha256:6e19401742ed7b69e51d8e4df3c03ad5ec65a83b36244479fd70edde2828a5d9"}, - {file = "pydantic_core-2.27.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5f2b19b8d6fca432cb3acf48cf5243a7bf512988029b6e6fd27e9e8c0a204d85"}, - {file = "pydantic_core-2.27.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c86679f443e7085ea55a7376462553996c688395d18ef3f0d3dbad7838f857a2"}, - {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:510b11e9c3b1a852876d1ccd8d5903684336d635214148637ceb27366c75a467"}, - {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb704155e73b833801c247f39d562229c0303f54770ca14fb1c053acb376cf10"}, - {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9ce048deb1e033e7a865ca384770bccc11d44179cf09e5193a535c4c2f497bdc"}, - {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58560828ee0951bb125c6f2862fbc37f039996d19ceb6d8ff1905abf7da0bf3d"}, - {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abb4785894936d7682635726613c44578c420a096729f1978cd061a7e72d5275"}, - {file = "pydantic_core-2.27.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2883b260f7a93235488699d39cbbd94fa7b175d3a8063fbfddd3e81ad9988cb2"}, - {file = "pydantic_core-2.27.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c6fcb3fa3855d583aa57b94cf146f7781d5d5bc06cb95cb3afece33d31aac39b"}, - {file = "pydantic_core-2.27.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e851a051f7260e6d688267eb039c81f05f23a19431bd7dfa4bf5e3cb34c108cd"}, - {file = "pydantic_core-2.27.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:edb1bfd45227dec8d50bc7c7d86463cd8728bcc574f9b07de7369880de4626a3"}, - {file = "pydantic_core-2.27.0-cp313-none-win32.whl", hash = "sha256:678f66462058dd978702db17eb6a3633d634f7aa0deaea61e0a674152766d3fc"}, - {file = "pydantic_core-2.27.0-cp313-none-win_amd64.whl", hash = "sha256:d28ca7066d6cdd347a50d8b725dc10d9a1d6a1cce09836cf071ea6a2d4908be0"}, - {file = "pydantic_core-2.27.0-cp313-none-win_arm64.whl", hash = "sha256:6f4a53af9e81d757756508b57cae1cf28293f0f31b9fa2bfcb416cc7fb230f9d"}, - {file = "pydantic_core-2.27.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:e9f9feee7f334b72ceae46313333d002b56f325b5f04271b4ae2aadd9e993ae4"}, - {file = "pydantic_core-2.27.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:225bfff5d425c34e1fd562cef52d673579d59b967d9de06178850c4802af9039"}, - {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921ad596ff1a82f9c692b0758c944355abc9f0de97a4c13ca60ffc6d8dc15d4"}, - {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6354e18a9be37bfa124d6b288a87fb30c673745806c92956f1a25e3ae6e76b96"}, - {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ee4c2a75af9fe21269a4a0898c5425afb01af1f5d276063f57e2ae1bc64e191"}, - {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c91e3c04f5191fd3fb68764bddeaf02025492d5d9f23343b283870f6ace69708"}, - {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a6ebfac28fd51890a61df36ef202adbd77d00ee5aca4a3dadb3d9ed49cfb929"}, - {file = "pydantic_core-2.27.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36aa167f69d8807ba7e341d67ea93e50fcaaf6bc433bb04939430fa3dab06f31"}, - {file = "pydantic_core-2.27.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e8d89c276234579cd3d095d5fa2a44eb10db9a218664a17b56363cddf226ff3"}, - {file = "pydantic_core-2.27.0-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:5cc822ab90a70ea3a91e6aed3afac570b276b1278c6909b1d384f745bd09c714"}, - {file = "pydantic_core-2.27.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e15315691fe2253eb447503153acef4d7223dfe7e7702f9ed66539fcd0c43801"}, - {file = "pydantic_core-2.27.0-cp38-none-win32.whl", hash = "sha256:dfa5f5c0a4c8fced1422dc2ca7eefd872d5d13eb33cf324361dbf1dbfba0a9fe"}, - {file = "pydantic_core-2.27.0-cp38-none-win_amd64.whl", hash = "sha256:513cb14c0cc31a4dfd849a4674b20c46d87b364f997bbcb02282306f5e187abf"}, - {file = "pydantic_core-2.27.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:4148dc9184ab79e356dc00a4199dc0ee8647973332cb385fc29a7cced49b9f9c"}, - {file = "pydantic_core-2.27.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5fc72fbfebbf42c0856a824b8b0dc2b5cd2e4a896050281a21cfa6fed8879cb1"}, - {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:185ef205256cd8b38431205698531026979db89a79587725c1e55c59101d64e9"}, - {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:395e3e1148fa7809016231f8065f30bb0dc285a97b4dc4360cd86e17bab58af7"}, - {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33d14369739c5d07e2e7102cdb0081a1fa46ed03215e07f097b34e020b83b1ae"}, - {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7820bb0d65e3ce1e3e70b6708c2f66143f55912fa02f4b618d0f08b61575f12"}, - {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43b61989068de9ce62296cde02beffabcadb65672207fc51e7af76dca75e6636"}, - {file = "pydantic_core-2.27.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15e350efb67b855cd014c218716feea4986a149ed1f42a539edd271ee074a196"}, - {file = "pydantic_core-2.27.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:433689845288f9a1ee5714444e65957be26d30915f7745091ede4a83cfb2d7bb"}, - {file = "pydantic_core-2.27.0-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:3fd8bc2690e7c39eecdf9071b6a889ce7b22b72073863940edc2a0a23750ca90"}, - {file = "pydantic_core-2.27.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:884f1806609c2c66564082540cffc96868c5571c7c3cf3a783f63f2fb49bd3cd"}, - {file = "pydantic_core-2.27.0-cp39-none-win32.whl", hash = "sha256:bf37b72834e7239cf84d4a0b2c050e7f9e48bced97bad9bdf98d26b8eb72e846"}, - {file = "pydantic_core-2.27.0-cp39-none-win_amd64.whl", hash = "sha256:31a2cae5f059329f9cfe3d8d266d3da1543b60b60130d186d9b6a3c20a346361"}, - {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4fb49cfdb53af5041aba909be00cccfb2c0d0a2e09281bf542371c5fd36ad04c"}, - {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:49633583eb7dc5cba61aaf7cdb2e9e662323ad394e543ee77af265736bcd3eaa"}, - {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:153017e3d6cd3ce979de06d84343ca424bb6092727375eba1968c8b4693c6ecb"}, - {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff63a92f6e249514ef35bc795de10745be0226eaea06eb48b4bbeaa0c8850a4a"}, - {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5982048129f40b082c2654de10c0f37c67a14f5ff9d37cf35be028ae982f26df"}, - {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:91bc66f878557313c2a6bcf396e7befcffe5ab4354cfe4427318968af31143c3"}, - {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:68ef5377eb582fa4343c9d0b57a5b094046d447b4c73dd9fbd9ffb216f829e7d"}, - {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c5726eec789ee38f2c53b10b1821457b82274f81f4f746bb1e666d8741fcfadb"}, - {file = "pydantic_core-2.27.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c0c431e4be5c1a0c6654e0c31c661cd89e0ca956ef65305c3c3fd96f4e72ca39"}, - {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:8e21d927469d04b39386255bf00d0feedead16f6253dcc85e9e10ddebc334084"}, - {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4b51f964fcbb02949fc546022e56cdb16cda457af485e9a3e8b78ac2ecf5d77e"}, - {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a7fd4de38f7ff99a37e18fa0098c3140286451bc823d1746ba80cec5b433a1"}, - {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fda87808429c520a002a85d6e7cdadbf58231d60e96260976c5b8f9a12a8e13"}, - {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a150392102c402c538190730fda06f3bce654fc498865579a9f2c1d2b425833"}, - {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c9ed88b398ba7e3bad7bd64d66cc01dcde9cfcb7ec629a6fd78a82fa0b559d78"}, - {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:9fe94d9d2a2b4edd7a4b22adcd45814b1b59b03feb00e56deb2e89747aec7bfe"}, - {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:d8b5ee4ae9170e2775d495b81f414cc20268041c42571530513496ba61e94ba3"}, - {file = "pydantic_core-2.27.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d29e235ce13c91902ef3efc3d883a677655b3908b1cbc73dee816e5e1f8f7739"}, - {file = "pydantic_core-2.27.0.tar.gz", hash = "sha256:f57783fbaf648205ac50ae7d646f27582fc706be3977e87c3c124e7a92407b10"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, + {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, + {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, + {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, + {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, + {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, + {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, + {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, + {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, + {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, + {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, + {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, + {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, + {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, + {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, + {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, + {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, + {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, + {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, + {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, + {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, + {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, + {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, + {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5897bec80a09b4084aee23f9b73a9477a46c3304ad1d2d07acca19723fb1de62"}, + {file = "pydantic_core-2.27.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0165ab2914379bd56908c02294ed8405c252250668ebcb438a55494c69f44ab"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b9af86e1d8e4cfc82c2022bfaa6f459381a50b94a29e95dcdda8442d6d83864"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f6c8a66741c5f5447e047ab0ba7a1c61d1e95580d64bce852e3df1f895c4067"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a42d6a8156ff78981f8aa56eb6394114e0dedb217cf8b729f438f643608cbcd"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64c65f40b4cd8b0e049a8edde07e38b476da7e3aaebe63287c899d2cff253fa5"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdcf339322a3fae5cbd504edcefddd5a50d9ee00d968696846f089b4432cf78"}, + {file = "pydantic_core-2.27.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf99c8404f008750c846cb4ac4667b798a9f7de673ff719d705d9b2d6de49c5f"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8f1edcea27918d748c7e5e4d917297b2a0ab80cad10f86631e488b7cddf76a36"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:159cac0a3d096f79ab6a44d77a961917219707e2a130739c64d4dd46281f5c2a"}, + {file = "pydantic_core-2.27.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:029d9757eb621cc6e1848fa0b0310310de7301057f623985698ed7ebb014391b"}, + {file = "pydantic_core-2.27.1-cp38-none-win32.whl", hash = "sha256:a28af0695a45f7060e6f9b7092558a928a28553366519f64083c63a44f70e618"}, + {file = "pydantic_core-2.27.1-cp38-none-win_amd64.whl", hash = "sha256:2d4567c850905d5eaaed2f7a404e61012a51caf288292e016360aa2b96ff38d4"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, + {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, + {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, + {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, + {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, + {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, + {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, + {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, + {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, ] [package.dependencies] @@ -3657,13 +3661,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" -version = "2.10.0" +version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" files = [ - {file = "PyJWT-2.10.0-py3-none-any.whl", hash = "sha256:543b77207db656de204372350926bed5a86201c4cbff159f623f79c7bb487a15"}, - {file = "pyjwt-2.10.0.tar.gz", hash = "sha256:7628a7eb7938959ac1b26e819a1df0fd3259505627b575e4bad6d08f76db695c"}, + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] [package.dependencies] @@ -3753,13 +3757,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyright" -version = "1.1.389" +version = "1.1.390" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ - {file = "pyright-1.1.389-py3-none-any.whl", hash = "sha256:41e9620bba9254406dc1f621a88ceab5a88af4c826feb4f614d95691ed243a60"}, - {file = "pyright-1.1.389.tar.gz", hash = "sha256:716bf8cc174ab8b4dcf6828c3298cac05c5ed775dda9910106a5dcfe4c7fe220"}, + {file = "pyright-1.1.390-py3-none-any.whl", hash = "sha256:ecebfba5b6b50af7c1a44c2ba144ba2ab542c227eb49bc1f16984ff714e0e110"}, + {file = "pyright-1.1.390.tar.gz", hash = "sha256:aad7f160c49e0fbf8209507a15e17b781f63a86a1facb69ca877c71ef2e9538d"}, ] [package.dependencies] @@ -3773,13 +3777,13 @@ nodejs = ["nodejs-wheel-binaries"] [[package]] name = "pytest" -version = "8.3.3" +version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, - {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, ] [package.dependencies] @@ -4329,193 +4333,114 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" -version = "0.21.0" -version = "0.21.0" +version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" -python-versions = ">=3.9" files = [ - {file = "rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590"}, - {file = "rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664"}, - {file = "rpds_py-0.21.0-cp310-none-win32.whl", hash = "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682"}, - {file = "rpds_py-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5"}, - {file = "rpds_py-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95"}, - {file = "rpds_py-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8"}, - {file = "rpds_py-0.21.0-cp311-none-win32.whl", hash = "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a"}, - {file = "rpds_py-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e"}, - {file = "rpds_py-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d"}, - {file = "rpds_py-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11"}, - {file = "rpds_py-0.21.0-cp312-none-win32.whl", hash = "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952"}, - {file = "rpds_py-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd"}, - {file = "rpds_py-0.21.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937"}, - {file = "rpds_py-0.21.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976"}, - {file = "rpds_py-0.21.0-cp313-none-win32.whl", hash = "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202"}, - {file = "rpds_py-0.21.0-cp313-none-win_amd64.whl", hash = "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e"}, - {file = "rpds_py-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928"}, - {file = "rpds_py-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed"}, - {file = "rpds_py-0.21.0-cp39-none-win32.whl", hash = "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8"}, - {file = "rpds_py-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89"}, - {file = "rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db"}, - {file = "rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590"}, - {file = "rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664"}, - {file = "rpds_py-0.21.0-cp310-none-win32.whl", hash = "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682"}, - {file = "rpds_py-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5"}, - {file = "rpds_py-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95"}, - {file = "rpds_py-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8"}, - {file = "rpds_py-0.21.0-cp311-none-win32.whl", hash = "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a"}, - {file = "rpds_py-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e"}, - {file = "rpds_py-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d"}, - {file = "rpds_py-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11"}, - {file = "rpds_py-0.21.0-cp312-none-win32.whl", hash = "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952"}, - {file = "rpds_py-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd"}, - {file = "rpds_py-0.21.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937"}, - {file = "rpds_py-0.21.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976"}, - {file = "rpds_py-0.21.0-cp313-none-win32.whl", hash = "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202"}, - {file = "rpds_py-0.21.0-cp313-none-win_amd64.whl", hash = "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e"}, - {file = "rpds_py-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928"}, - {file = "rpds_py-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed"}, - {file = "rpds_py-0.21.0-cp39-none-win32.whl", hash = "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8"}, - {file = "rpds_py-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89"}, - {file = "rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, + {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, + {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, + {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, + {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, + {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, + {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, + {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, + {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, + {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, + {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, + {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] [[package]] @@ -4567,16 +4492,6 @@ files = [ {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, - {file = "scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5"}, - {file = "scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908"}, - {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3"}, - {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12"}, - {file = "scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f"}, - {file = "scikit_learn-1.5.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9a702e2de732bbb20d3bad29ebd77fc05a6b427dc49964300340e4c9328b3f5"}, - {file = "scikit_learn-1.5.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:b0768ad641981f5d3a198430a1d31c3e044ed2e8a6f22166b4d546a5116d7908"}, - {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:178ddd0a5cb0044464fc1bfc4cca5b1833bfc7bb022d70b05db8530da4bb3dd3"}, - {file = "scikit_learn-1.5.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7284ade780084d94505632241bf78c44ab3b6f1e8ccab3d2af58e0e950f9c12"}, - {file = "scikit_learn-1.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:b7b0f9a0b1040830d38c39b91b3a44e1b643f4b36e36567b80b7c6bd2202a27f"}, {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, @@ -4728,13 +4643,13 @@ files = [ [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] @@ -4973,13 +4888,43 @@ test = ["pytest", "ruff"] [[package]] name = "tomli" -version = "2.1.0" +version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, - {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] @@ -4995,40 +4940,40 @@ files = [ [[package]] name = "tornado" -version = "6.4.1" +version = "6.4.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" files = [ - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, - {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, - {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, - {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, + {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, + {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, + {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, ] [[package]] name = "tqdm" -version = "4.67.0" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, - {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] @@ -5068,13 +5013,13 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "types-python-dateutil" -version = "2.9.0.20241003" +version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, - {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, ] [[package]] @@ -5272,84 +5217,79 @@ files = [ [[package]] name = "wrapt" -version = "1.16.0" +version = "1.17.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, + {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, + {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, + {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, + {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, + {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, + {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, + {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, + {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, + {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, + {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, + {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, + {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, + {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, + {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, + {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, + {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, + {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, + {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, + {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, + {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, + {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, + {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, + {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, + {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, + {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, + {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, + {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, + {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, + {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, + {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, + {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, + {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, + {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, + {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, + {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, + {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, + {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, ] [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "dab7f0399361f6d47b78c4dfe8f76dcab87b272660fa6cde5245ea772192bcc6" +content-hash = "2223fc2a592419fe4ebb29c66f5230fec4ce76e55531772f951ab04595c14654" From 42311890d4b829938c2919acdef0d10e17332ede Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Fri, 6 Dec 2024 13:31:20 -0500 Subject: [PATCH 050/104] modified set method to collapse parquet rows --- graphrag/storage/cosmosdb_pipeline_storage.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 94b2328432..f2fc3e8a90 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -207,11 +207,18 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: if value_json is None: log.exception("Error converting output %s to json", key) else: - cosmos_db_item = {"id": key, "body": json.loads(value_json)} - container_client.upsert_item(body=cosmos_db_item) + cosmosdb_item_list = json.loads(value_json) + for cosmosdb_item in cosmosdb_item_list: + prefixed_id = f"{key}-{cosmosdb_item['id']}" + cosmosdb_item["id"] = prefixed_id + container_client.upsert_item(body=cosmosdb_item) else: - cosmos_db_item = {"id": key, "body": json.loads(value)} - container_client.upsert_item(body=cosmos_db_item) + cosmosdb_item_list = json.loads(value) + for cosmosdb_item in cosmosdb_item_list: + prefixed_id = f"{key}-{cosmosdb_item['id']}" + cosmosdb_item["id"] = prefixed_id + container_client.upsert_item(body=cosmosdb_item) + except Exception: log.exception("Error writing item %s", key) From 110b10eb209f0732904f76cee3833923ee35d056 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Fri, 6 Dec 2024 14:13:57 -0500 Subject: [PATCH 051/104] modified get method to collapse parquet rows --- graphrag/storage/cosmosdb_pipeline_storage.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index f2fc3e8a90..c14b26b008 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -177,15 +177,20 @@ async def get( container_client = self._database_client.get_container_client( self._current_container ) - item = container_client.read_item(item=key, partition_key=key) - item_body = item.get("body") - item_json_str = json.dumps(item_body) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{key}-')" # noqa: S608 + queried_items = container_client.query_items( + query=query, enable_cross_partition_query=True + ) + for item in queried_items: + item["id"] = item["id"].split("-")[1] + + items_json_str = json.dumps(queried_items) if as_bytes: - item_df = pd.read_json( - StringIO(item_json_str), orient="records", lines=False + items_df = pd.read_json( + StringIO(items_json_str), orient="records", lines=False ) - return item_df.to_parquet() - return item_json_str + return items_df.to_parquet() + return items_json_str except Exception: log.exception("Error reading item %s", key) return None @@ -218,7 +223,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: prefixed_id = f"{key}-{cosmosdb_item['id']}" cosmosdb_item["id"] = prefixed_id container_client.upsert_item(body=cosmosdb_item) - + except Exception: log.exception("Error writing item %s", key) From 8e7a1e3456b938f00b6e9c64f231f0d6b678ceed Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Fri, 6 Dec 2024 14:57:11 -0500 Subject: [PATCH 052/104] updated has and delete methods and docstrings to adhere to new schema --- graphrag/storage/cosmosdb_pipeline_storage.py | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index c14b26b008..0e1d0c1a03 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -171,7 +171,7 @@ def item_filter(item: dict[str, Any]) -> bool: async def get( self, key: str, as_bytes: bool | None = None, encoding: str | None = None ) -> Any: - """Get a file in the database for the given key.""" + """Fetch all cosmosdb items belonging to the given filename key.""" try: if self._current_container: container_client = self._database_client.get_container_client( @@ -181,7 +181,8 @@ async def get( queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) - for item in queried_items: + items_list = list(queried_items) + for item in items_list: item["id"] = item["id"].split("-")[1] items_json_str = json.dumps(queried_items) @@ -198,7 +199,7 @@ async def get( return None async def set(self, key: str, value: Any, encoding: str | None = None) -> None: - """Set a file in the database for the given key.""" + """Insert the contents of a file into cosmosdb for the given filename key. For optimization, the file is destructured such that each row is a unique cosmosdb item.""" try: if self._current_container: container_client = self._database_client.get_container_client( @@ -228,22 +229,30 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: log.exception("Error writing item %s", key) async def has(self, key: str) -> bool: - """Check if the given file exists in the cosmosdb storage.""" + """Check if the contents of the given filename key exist in the cosmosdb storage.""" if self._current_container: container_client = self._database_client.get_container_client( self._current_container ) - item_names = [item["id"] for item in container_client.read_all_items()] - return key in item_names + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{key}-')" # noqa: S608 + queried_items = container_client.query_items( + query=query, enable_cross_partition_query=True + ) + return len(list(queried_items)) > 0 return False async def delete(self, key: str) -> None: - """Delete the given file from the cosmosdb storage.""" + """Delete all comsmosdb items belonging to the given filename key.""" if self._current_container: container_client = self._database_client.get_container_client( self._current_container ) - container_client.delete_item(item=key, partition_key=key) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{key}-')" # noqa: S608 + queried_items = container_client.query_items( + query=query, enable_cross_partition_query=True + ) + for item in queried_items: + container_client.delete_item(item=item["id"], partition_key=item["id"]) # Function currently deletes all items within the current container, then deletes the container itself. # TODO: Decide the granularity of deletion (e.g. delete all items within the current container, delete the current container, delete the current database) From 2db7f83ddd106caa974e101f27f2e5dce7e764f6 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Fri, 6 Dec 2024 15:45:01 -0500 Subject: [PATCH 053/104] added prefix helper function --- graphrag/storage/cosmosdb_pipeline_storage.py | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 0e1d0c1a03..6a225a25e9 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -177,7 +177,8 @@ async def get( container_client = self._database_client.get_container_client( self._current_container ) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{key}-')" # noqa: S608 + prefix = self._get_prefix(key) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}-')" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) @@ -185,7 +186,7 @@ async def get( for item in items_list: item["id"] = item["id"].split("-")[1] - items_json_str = json.dumps(queried_items) + items_json_str = json.dumps(items_list) if as_bytes: items_df = pd.read_json( StringIO(items_json_str), orient="records", lines=False @@ -205,6 +206,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: container_client = self._database_client.get_container_client( self._current_container ) + prefix = self._get_prefix(key) if isinstance(value, bytes): value_df = pd.read_parquet(BytesIO(value)) value_json = value_df.to_json( @@ -215,13 +217,13 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: else: cosmosdb_item_list = json.loads(value_json) for cosmosdb_item in cosmosdb_item_list: - prefixed_id = f"{key}-{cosmosdb_item['id']}" + prefixed_id = f"{prefix}-{cosmosdb_item['id']}" cosmosdb_item["id"] = prefixed_id container_client.upsert_item(body=cosmosdb_item) else: cosmosdb_item_list = json.loads(value) for cosmosdb_item in cosmosdb_item_list: - prefixed_id = f"{key}-{cosmosdb_item['id']}" + prefixed_id = f"{prefix}-{cosmosdb_item['id']}" cosmosdb_item["id"] = prefixed_id container_client.upsert_item(body=cosmosdb_item) @@ -234,7 +236,8 @@ async def has(self, key: str) -> bool: container_client = self._database_client.get_container_client( self._current_container ) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{key}-')" # noqa: S608 + prefix = self._get_prefix(key) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}-')" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) @@ -247,7 +250,8 @@ async def delete(self, key: str) -> None: container_client = self._database_client.get_container_client( self._current_container ) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{key}-')" # noqa: S608 + prefix = self._get_prefix(key) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}-')" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) @@ -275,6 +279,10 @@ def keys(self) -> list[str]: def child(self, name: str | None) -> PipelineStorage: """Create a child storage instance.""" return self + + def _get_prefix(self, key: str) -> str: + """Get the prefix of the filename key.""" + return key.split(".")[0] def _create_container(self) -> None: """Create a container for the current container name if it doesn't exist.""" From 4726bbf3a25bddbf817e5949155d2fc85cb81c6f Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Fri, 6 Dec 2024 16:26:18 -0500 Subject: [PATCH 054/104] replaced delimiter for prefixed id --- graphrag/storage/cosmosdb_pipeline_storage.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 6a225a25e9..67629d1684 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -178,13 +178,13 @@ async def get( self._current_container ) prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}-')" # noqa: S608 + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}:')" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) items_list = list(queried_items) for item in items_list: - item["id"] = item["id"].split("-")[1] + item["id"] = item["id"].split(":")[1] items_json_str = json.dumps(items_list) if as_bytes: @@ -217,13 +217,13 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: else: cosmosdb_item_list = json.loads(value_json) for cosmosdb_item in cosmosdb_item_list: - prefixed_id = f"{prefix}-{cosmosdb_item['id']}" + prefixed_id = f"{prefix}:{cosmosdb_item['id']}" cosmosdb_item["id"] = prefixed_id container_client.upsert_item(body=cosmosdb_item) else: cosmosdb_item_list = json.loads(value) for cosmosdb_item in cosmosdb_item_list: - prefixed_id = f"{prefix}-{cosmosdb_item['id']}" + prefixed_id = f"{prefix}:{cosmosdb_item['id']}" cosmosdb_item["id"] = prefixed_id container_client.upsert_item(body=cosmosdb_item) @@ -237,7 +237,7 @@ async def has(self, key: str) -> bool: self._current_container ) prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}-')" # noqa: S608 + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}:')" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) @@ -251,7 +251,7 @@ async def delete(self, key: str) -> None: self._current_container ) prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}-')" # noqa: S608 + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}:')" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) From 49a3639b10b6e08e0908f44adab46d272218bdd0 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 6 Dec 2024 16:44:03 -0500 Subject: [PATCH 055/104] verified empty tests are passing --- .github/workflows/python-integration-tests.yml | 2 +- tests/integration/storage/test_cosmosdb_storage.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-integration-tests.yml b/.github/workflows/python-integration-tests.yml index dc4dd46101..60757024ab 100644 --- a/.github/workflows/python-integration-tests.yml +++ b/.github/workflows/python-integration-tests.yml @@ -83,7 +83,7 @@ jobs: - name: Install Azurite id: azuright uses: potatoqualitee/azuright@v1.1 - + - name: Azure Cosmos DB Emulator if: runner.os == 'Windows' uses: southpolesteve/cosmos-emulator-github-action@v1 diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index ddba235419..8392c26b48 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -8,7 +8,7 @@ # the cosmosdb emulator is only available on windows runners at this time if not sys.platform.startswith("win"): - pytest.skip("skipping windows-only tests", allow_module_level=True) + pytest.skip("encountered windows-only tests -- skipping", allow_module_level=True) def test_find(): From 731b5dbe853b8056f942a8a47b174b0f973e3443 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 6 Dec 2024 17:04:42 -0500 Subject: [PATCH 056/104] fix merges from main --- graphrag/api/query.py | 6 ++++-- graphrag/index/config/cache.py | 20 +++++++------------- graphrag/index/config/reporting.py | 6 +++--- graphrag/index/config/storage.py | 18 +++++++----------- poetry.lock | 6 +++--- pyproject.toml | 7 +++---- 6 files changed, 27 insertions(+), 36 deletions(-) diff --git a/graphrag/api/query.py b/graphrag/api/query.py index c6b96597dc..e27396ab9c 100644 --- a/graphrag/api/query.py +++ b/graphrag/api/query.py @@ -19,7 +19,7 @@ from collections.abc import AsyncGenerator from pathlib import Path -from typing import Any +from typing import TYPE_CHECKING, Any import pandas as pd from pydantic import validate_call @@ -44,12 +44,14 @@ read_indexer_reports, read_indexer_text_units, ) -from graphrag.query.structured_search.base import SearchResult # noqa: TC001 from graphrag.utils.cli import redact from graphrag.utils.embeddings import create_collection_name from graphrag.vector_stores.base import BaseVectorStore from graphrag.vector_stores.factory import VectorStoreFactory, VectorStoreType +if TYPE_CHECKING: + from graphrag.query.structured_search.base import SearchResult + reporter = PrintProgressReporter("") diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 0040c71661..1e6df66c3c 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -52,9 +52,7 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): type: Literal[CacheType.blob] = CacheType.blob """The type of cache.""" - base_dir: str = pydantic_Field( - description="The base directory for the cache.", default="" - ) + base_dir: str = Field(description="The base directory for the cache.", default="") """The base directory for the cache.""" connection_string: str | None = Field( @@ -62,12 +60,10 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): ) """The blob cache connection string for the cache.""" - container_name: str = pydantic_Field( - description="The container name for cache", default="" - ) + container_name: str = Field(description="The container name for cache", default="") """The container name for cache""" - storage_account_blob_url: str = pydantic_Field( + storage_account_blob_url: str = Field( description="The storage account blob url for cache", default="" ) """The storage account blob url for cache""" @@ -79,22 +75,20 @@ class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb type: Literal[CacheType.cosmosdb] = CacheType.cosmosdb """The type of cache.""" - base_dir: str = pydantic_Field( + base_dir: str = Field( description="The cosmosdb database name for the cache.", default="" ) """The cosmosdb database name for the cache.""" - container_name: str = pydantic_Field( - description="The container name for cache.", default="" - ) + container_name: str = Field(description="The container name for cache.", default="") """The container name for cache.""" - connection_string: str | None = pydantic_Field( + connection_string: str | None = Field( description="The cosmosdb primary key for the cache.", default=None ) """The cosmosdb primary key for the cache.""" - cosmosdb_account_url: str = pydantic_Field( + cosmosdb_account_url: str = Field( description="The cosmosdb account url for cache", default="" ) """The cosmosdb account url for cache""" diff --git a/graphrag/index/config/reporting.py b/graphrag/index/config/reporting.py index 8d20216696..6c537931ce 100644 --- a/graphrag/index/config/reporting.py +++ b/graphrag/index/config/reporting.py @@ -53,17 +53,17 @@ class PipelineBlobReportingConfig(PipelineReportingConfig[Literal[ReportingType. ) """The blob reporting connection string for the reporting.""" - container_name: str = pydantic_Field( + container_name: str = Field( description="The container name for reporting", default="" ) """The container name for reporting""" - storage_account_blob_url: str = pydantic_Field( + storage_account_blob_url: str = Field( description="The storage account blob url for reporting", default="" ) """The storage account blob url for reporting""" - base_dir: str = pydantic_Field( + base_dir: str = Field( description="The base directory for the reporting.", default="" ) """The base directory for the reporting.""" diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index c25819085b..c4abd8c344 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -50,17 +50,15 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] ) """The blob storage connection string for the storage.""" - container_name: str = pydantic_Field( + container_name: str = Field( description="The container name for storage", default="" ) """The container name for storage.""" - base_dir: str = pydantic_Field( - description="The base directory for the storage.", default="" - ) + base_dir: str = Field(description="The base directory for the storage.", default="") """The base directory for the storage.""" - storage_account_blob_url: str = pydantic_Field( + storage_account_blob_url: str = Field( description="The storage account blob url.", default="" ) """The storage account blob url.""" @@ -74,22 +72,20 @@ class PipelineCosmosDBStorageConfig( type: Literal[StorageType.cosmosdb] = StorageType.cosmosdb """The type of storage.""" - connection_string: str | None = pydantic_Field( + connection_string: str | None = Field( description="The cosmosdb storage primary key for the storage.", default=None ) """The cosmosdb storage primary key for the storage.""" - container_name: str = pydantic_Field( + container_name: str = Field( description="The container name for storage", default="" ) """The container name for storage.""" - base_dir: str = pydantic_Field( - description="The base directory for the storage.", default="" - ) + base_dir: str = Field(description="The base directory for the storage.", default="") """The base directory for the storage.""" - cosmosdb_account_url: str = pydantic_Field( + cosmosdb_account_url: str = Field( description="The cosmosdb account url.", default="" ) """The cosmosdb account url.""" diff --git a/poetry.lock b/poetry.lock index 42d87f1619..9180792e89 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4992,8 +4992,8 @@ description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.9.0.20241003.tar.gz", hash = "sha256:58cb85449b2a56d6684e41aeefb4c4280631246a0da1a719bdbe6f3fb0317446"}, - {file = "types_python_dateutil-2.9.0.20241003-py3-none-any.whl", hash = "sha256:250e1d8e80e7bbc3a6c99b907762711d1a1cdd00e978ad39cb5940f6f0a87f3d"}, + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, ] [[package]] @@ -5277,4 +5277,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "204a7f9cd0035ffb8ba4eea3333301241fe408f96526604b92c069fb6661fa89" +content-hash = "70ab9a1a6ee4fcb96a0eabafaa2174386b6a414276e4cc3e3612cc23b51e52b9" diff --git a/pyproject.toml b/pyproject.toml index 42c6e4d450..c75bdeee08 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,10 +81,9 @@ devtools = "^0.12.2" typing-extensions = "^4.12.2" #Azure -azure-storage-blob = "^12.24.0" -azure-identity = "^1.19.0" azure-cosmos = "^4.9.0" -json-repair = "^0.30.0" +azure-identity = "^1.19.0" +azure-storage-blob = "^12.24.0" future = "^1.0.0" # Needed until graspologic fixes their dependency typer = "^0.15.1" @@ -273,4 +272,4 @@ exclude = ["**/node_modules", "**/__pycache__"] [tool.pytest.ini_options] asyncio_mode = "auto" timeout = 1000 -env_files = [".env"] +env_files = [".env"] \ No newline at end of file From e0865f93239f82c4b33f7621d8950c00554695f3 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 6 Dec 2024 19:00:23 -0500 Subject: [PATCH 057/104] add find test --- graphrag/index/run/workflow.py | 8 ++-- graphrag/storage/blob_pipeline_storage.py | 6 +-- graphrag/storage/cosmosdb_pipeline_storage.py | 40 ++++++++--------- graphrag/utils/storage.py | 20 ++------- .../storage/test_cosmosdb_storage.py | 45 +++++++++++++++++-- 5 files changed, 72 insertions(+), 47 deletions(-) diff --git a/graphrag/index/run/workflow.py b/graphrag/index/run/workflow.py index 3ada0b74e7..c89e58ae58 100644 --- a/graphrag/index/run/workflow.py +++ b/graphrag/index/run/workflow.py @@ -33,7 +33,6 @@ async def _inject_workflow_data_dependencies( workflow_dependencies: dict[str, list[str]], dataset: pd.DataFrame, storage: PipelineStorage, - extension: str, ) -> None: """Inject the data dependencies into the workflow.""" workflow.add_table(DEFAULT_INPUT_NAME, dataset) @@ -42,7 +41,7 @@ async def _inject_workflow_data_dependencies( for id in deps: workflow_id = f"workflow:{id}" try: - table = await _load_table_from_storage(f"{id}.{extension}", storage) + table = await _load_table_from_storage(f"{id}.parquet", storage) except ValueError: # our workflows allow for transient tables, and we avoid putting those in storage # however, we need to keep the table in the dependency list for proper execution order. @@ -98,7 +97,10 @@ async def _process_workflow( context.stats.workflows[workflow_name] = {"overall": 0.0} await _inject_workflow_data_dependencies( - workflow, workflow_dependencies, dataset, context.storage, "parquet" + workflow, + workflow_dependencies, + dataset, + context.storage, ) workflow_start_time = time.time() diff --git a/graphrag/storage/blob_pipeline_storage.py b/graphrag/storage/blob_pipeline_storage.py index 560c2eb048..c75755431c 100644 --- a/graphrag/storage/blob_pipeline_storage.py +++ b/graphrag/storage/blob_pipeline_storage.py @@ -32,7 +32,7 @@ def __init__( self, connection_string: str | None, container_name: str, - encoding: str | None = None, + encoding: str = "utf-8", path_prefix: str | None = None, storage_account_blob_url: str | None = None, ): @@ -50,7 +50,7 @@ def __init__( account_url=storage_account_blob_url, credential=DefaultAzureCredential(), ) - self._encoding = encoding or "utf-8" + self._encoding = encoding self._container_name = container_name self._connection_string = connection_string self._path_prefix = path_prefix or "" @@ -198,7 +198,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: if isinstance(value, bytes): blob_client.upload_blob(value, overwrite=True) else: - coding = encoding or "utf-8" + coding = encoding or self._encoding blob_client.upload_blob(value.encode(coding), overwrite=True) except Exception: log.exception("Error setting key %s: %s", key) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 94b2328432..cce0234b57 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -28,7 +28,7 @@ class CosmosDBPipelineStorage(PipelineStorage): _cosmosdb_account_url: str | None _connection_string: str | None _database_name: str - _current_container: str | None + container_name: str | None _encoding: str def __init__( @@ -58,7 +58,7 @@ def __init__( self._database_name = database_name self._connection_string = connection_string self._cosmosdb_account_url = cosmosdb_account_url - self._current_container = current_container + self.container_name = current_container self._cosmosdb_account_name = ( cosmosdb_account_url.split("//")[1].split(".")[0] if cosmosdb_account_url @@ -74,7 +74,7 @@ def __init__( self._database_name, ) self._create_database() - if self._current_container: + if self.container_name: self._create_container() def _create_database(self) -> None: @@ -117,7 +117,7 @@ def find( log.info( "search container %s for documents matching %s", - self._current_container, + self.container_name, file_pattern.pattern, ) @@ -130,7 +130,7 @@ def item_filter(item: dict[str, Any]) -> bool: try: container_client = self._database_client.get_container_client( - str(self._current_container) + str(self.container_name) ) query = "SELECT * FROM c WHERE CONTAINS(c.id, @pattern)" parameters: list[dict[str, Any]] = [ @@ -173,9 +173,9 @@ async def get( ) -> Any: """Get a file in the database for the given key.""" try: - if self._current_container: + if self.container_name: container_client = self._database_client.get_container_client( - self._current_container + self.container_name ) item = container_client.read_item(item=key, partition_key=key) item_body = item.get("body") @@ -195,9 +195,9 @@ async def get( async def set(self, key: str, value: Any, encoding: str | None = None) -> None: """Set a file in the database for the given key.""" try: - if self._current_container: + if self.container_name: container_client = self._database_client.get_container_client( - self._current_container + self.container_name ) if isinstance(value, bytes): value_df = pd.read_parquet(BytesIO(value)) @@ -217,9 +217,9 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: async def has(self, key: str) -> bool: """Check if the given file exists in the cosmosdb storage.""" - if self._current_container: + if self.container_name: container_client = self._database_client.get_container_client( - self._current_container + self.container_name ) item_names = [item["id"] for item in container_client.read_all_items()] return key in item_names @@ -227,9 +227,9 @@ async def has(self, key: str) -> bool: async def delete(self, key: str) -> None: """Delete the given file from the cosmosdb storage.""" - if self._current_container: + if self.container_name: container_client = self._database_client.get_container_client( - self._current_container + self.container_name ) container_client.delete_item(item=key, partition_key=key) @@ -237,9 +237,9 @@ async def delete(self, key: str) -> None: # TODO: Decide the granularity of deletion (e.g. delete all items within the current container, delete the current container, delete the current database) async def clear(self) -> None: """Clear the cosmosdb storage.""" - if self._current_container: + if self.container_name: container_client = self._database_client.get_container_client( - self._current_container + self.container_name ) for item in container_client.read_all_items(): item_id = item["id"] @@ -257,24 +257,24 @@ def child(self, name: str | None) -> PipelineStorage: def _create_container(self) -> None: """Create a container for the current container name if it doesn't exist.""" - if self._current_container: + if self.container_name: partition_key = PartitionKey(path="/id", kind="Hash") self._database_client.create_container_if_not_exists( - id=self._current_container, + id=self.container_name, partition_key=partition_key, ) def _delete_container(self) -> None: """Delete the container with the current container name if it exists.""" - if self._container_exists() and self._current_container: - self._database_client.delete_container(self._current_container) + if self._container_exists() and self.container_name: + self._database_client.delete_container(self.container_name) def _container_exists(self) -> bool: """Check if the container with the current container name exists.""" container_names = [ container["id"] for container in self._database_client.list_containers() ] - return self._current_container in container_names + return self.container_name in container_names # TODO remove this helper function and have the factory instantiate the class directly diff --git a/graphrag/utils/storage.py b/graphrag/utils/storage.py index 193e2bf3c0..3d191620a5 100644 --- a/graphrag/utils/storage.py +++ b/graphrag/utils/storage.py @@ -4,7 +4,7 @@ """Storage functions for the GraphRAG run module.""" import logging -from io import BytesIO, StringIO +from io import BytesIO import pandas as pd @@ -18,22 +18,8 @@ async def _load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Da msg = f"Could not find {name} in storage!" raise ValueError(msg) try: - log.info("read table from storage: %s", name) - match name.split(".")[-1]: - case "parquet": - return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) - case "json": - return pd.read_json( - StringIO(await storage.get(name)), - lines=False, - orient="records", - ) - case "csv": - return pd.read_csv(BytesIO(await storage.get(name, as_bytes=True))) - case _: - msg = f"Unknown file extension for {name}" - log.exception(msg) - raise + log.info("reading table from storage: %s", name) + return pd.read_parquet(BytesIO(await storage.get(name, as_bytes=True))) except Exception: log.exception("error loading table from storage: %s", name) raise diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 8392c26b48..ddd7a7bdc6 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -2,20 +2,57 @@ # Licensed under the MIT License """CosmosDB Storage Tests.""" +import re import sys import pytest +from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage + +# cspell:disable-next-line well-known-key +WELL_KNOWN_COSMOS_ACCOUNT_URL = "https://localhost:8081" +WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;" + # the cosmosdb emulator is only available on windows runners at this time if not sys.platform.startswith("win"): pytest.skip("encountered windows-only tests -- skipping", allow_module_level=True) -def test_find(): - print("test_find") - assert True +async def test_find(): + storage = CosmosDBPipelineStorage( + cosmosdb_account_url=WELL_KNOWN_COSMOS_ACCOUNT_URL, + connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, + database_name="testfind", + ) + try: + try: + items = list( + storage.find(base_dir="input", file_pattern=re.compile(r".*\.txt$")) + ) + items = [item[0] for item in items] + assert items == [] + + await storage.set("christmas.txt", "Merry Christmas!", encoding="utf-8") + items = list( + storage.find(base_dir="input", file_pattern=re.compile(r".*\.txt$")) + ) + items = [item[0] for item in items] + assert items == ["christmas.txt"] + + await storage.set("test.txt", "Hello, World!", encoding="utf-8") + items = list(storage.find(file_pattern=re.compile(r".*\.txt$"))) + items = [item[0] for item in items] + assert items == ["christmas.txt", "test.txt"] + + output = await storage.get("test.txt") + assert output == "Hello, World!" + finally: + await storage.delete("test.txt") + output = await storage.get("test.txt") + assert output is None + finally: + storage._delete_container() # noqa: SLF001 def test_child(): - print("test_child") assert True From 22429fd6a4e7bb3f6367f99c91c691938c708019 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 6 Dec 2024 19:12:47 -0500 Subject: [PATCH 058/104] update cicd step name --- .github/workflows/python-integration-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-integration-tests.yml b/.github/workflows/python-integration-tests.yml index 60757024ab..b21b198597 100644 --- a/.github/workflows/python-integration-tests.yml +++ b/.github/workflows/python-integration-tests.yml @@ -84,7 +84,7 @@ jobs: id: azuright uses: potatoqualitee/azuright@v1.1 - - name: Azure Cosmos DB Emulator + - name: Install Azure Cosmos DB Emulator if: runner.os == 'Windows' uses: southpolesteve/cosmos-emulator-github-action@v1 From f06ddfdc3a4ea6e0101ad1286586228ac37d8c26 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 9 Dec 2024 12:38:07 -0800 Subject: [PATCH 059/104] tested querying for new schema --- graphrag/storage/cosmosdb_pipeline_storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 67629d1684..5b25c45cfd 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -185,7 +185,7 @@ async def get( items_list = list(queried_items) for item in items_list: item["id"] = item["id"].split(":")[1] - + items_json_str = json.dumps(items_list) if as_bytes: items_df = pd.read_json( From 778d67fdc3d233b0cda1caf279faa4c3a2558204 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 9 Dec 2024 12:43:43 -0800 Subject: [PATCH 060/104] resolved errors from merge conflicts --- graphrag/storage/cosmosdb_pipeline_storage.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index a21515d088..5dc91994df 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -37,7 +37,7 @@ def __init__( connection_string: str | None, database_name: str, encoding: str = "utf-8", - current_container: str | None = None, + container_name: str | None = None, ): """Initialize the CosmosDB Storage.""" if connection_string: @@ -58,7 +58,7 @@ def __init__( self._database_name = database_name self._connection_string = connection_string self._cosmosdb_account_url = cosmosdb_account_url - self.container_name = current_container + self.container_name = container_name self._cosmosdb_account_name = ( cosmosdb_account_url.split("//")[1].split(".")[0] if cosmosdb_account_url @@ -232,7 +232,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: async def has(self, key: str) -> bool: """Check if the contents of the given filename key exist in the cosmosdb storage.""" - if self._current_container: + if self.container_name: container_client = self._database_client.get_container_client( self.container_name ) @@ -246,9 +246,9 @@ async def has(self, key: str) -> bool: async def delete(self, key: str) -> None: """Delete all comsmosdb items belonging to the given filename key.""" - if self._current_container: + if self.container_name: container_client = self._database_client.get_container_client( - self._current_container + self.container_name ) prefix = self._get_prefix(key) query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}:')" # noqa: S608 @@ -325,7 +325,7 @@ def create_cosmosdb_storage(**kwargs: Any) -> PipelineStorage: cosmosdb_account_url=cosmosdb_account_url, connection_string=connection_string, database_name=base_dir, - current_container=container_name, + container_name=container_name, ) From 7e47f44ca3f96da739fb4c80e6dd28601af41474 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 9 Dec 2024 15:35:29 -0800 Subject: [PATCH 061/104] refactored set method to handle cache in new schema --- graphrag/storage/cosmosdb_pipeline_storage.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 5dc91994df..d468485c38 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -206,8 +206,11 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: container_client = self._database_client.get_container_client( self.container_name ) - prefix = self._get_prefix(key) + # Value represents a parquet file output if isinstance(value, bytes): + print(key) + prefix = self._get_prefix(key) + print(prefix) value_df = pd.read_parquet(BytesIO(value)) value_json = value_df.to_json( orient="records", lines=False, force_ascii=False @@ -220,12 +223,13 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: prefixed_id = f"{prefix}:{cosmosdb_item['id']}" cosmosdb_item["id"] = prefixed_id container_client.upsert_item(body=cosmosdb_item) + # Value represents a cache output or stats.json else: - cosmosdb_item_list = json.loads(value) - for cosmosdb_item in cosmosdb_item_list: - prefixed_id = f"{prefix}:{cosmosdb_item['id']}" - cosmosdb_item["id"] = prefixed_id - container_client.upsert_item(body=cosmosdb_item) + cosmosdb_item = { + "id": key, + "body": json.loads(value), + } + container_client.upsert_item(body=cosmosdb_item) except Exception: log.exception("Error writing item %s", key) From 2c3d076342ac9ed708697f66131b2ba600fe0013 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Mon, 9 Dec 2024 15:41:37 -0800 Subject: [PATCH 062/104] refactored get method to handle cache in new schema --- graphrag/storage/cosmosdb_pipeline_storage.py | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index d468485c38..a724ced624 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -177,22 +177,27 @@ async def get( container_client = self._database_client.get_container_client( self.container_name ) - prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}:')" # noqa: S608 - queried_items = container_client.query_items( - query=query, enable_cross_partition_query=True - ) - items_list = list(queried_items) - for item in items_list: - item["id"] = item["id"].split(":")[1] - - items_json_str = json.dumps(items_list) if as_bytes: + prefix = self._get_prefix(key) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}:')" # noqa: S608 + queried_items = container_client.query_items( + query=query, enable_cross_partition_query=True + ) + items_list = list(queried_items) + for item in items_list: + item["id"] = item["id"].split(":")[1] + + items_json_str = json.dumps(items_list) + items_df = pd.read_json( StringIO(items_json_str), orient="records", lines=False ) return items_df.to_parquet() - return items_json_str + + item = container_client.read_item(item=key, partition_key=key) + item_body = item.get("body") + return json.dumps(item_body) + except Exception: log.exception("Error reading item %s", key) return None From 231ad57cfb024995c073ccb6f5209a3d528d0837 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 10 Dec 2024 15:17:10 -0800 Subject: [PATCH 063/104] force unique ids to be written to cosmos for nodes --- .../index/flows/create_final_community_reports.py | 2 +- .../summarize_communities/summarize_communities.py | 2 -- graphrag/storage/cosmosdb_pipeline_storage.py | 14 ++++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/graphrag/index/flows/create_final_community_reports.py b/graphrag/index/flows/create_final_community_reports.py index e49a01aee5..5c638cfc41 100644 --- a/graphrag/index/flows/create_final_community_reports.py +++ b/graphrag/index/flows/create_final_community_reports.py @@ -62,7 +62,7 @@ async def create_final_community_reports( claims = _prep_claims(claims_input) community_hierarchy = restore_community_hierarchy(nodes) - + local_contexts = prepare_community_reports( nodes, edges, diff --git a/graphrag/index/operations/summarize_communities/summarize_communities.py b/graphrag/index/operations/summarize_communities/summarize_communities.py index 35a0192b82..d14e52ca52 100644 --- a/graphrag/index/operations/summarize_communities/summarize_communities.py +++ b/graphrag/index/operations/summarize_communities/summarize_communities.py @@ -45,7 +45,6 @@ async def summarize_communities( reports: list[CommunityReport | None] = [] tick = progress_ticker(callbacks.progress, len(local_contexts)) runner = load_strategy(strategy["type"]) - for level in levels: level_contexts = prep_community_report_context( pd.DataFrame(reports), @@ -56,7 +55,6 @@ async def summarize_communities( "max_input_tokens", defaults.COMMUNITY_REPORT_MAX_INPUT_LENGTH ), ) - async def run_generate(record): result = await _generate_report( runner, diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index a724ced624..70c642739a 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -179,7 +179,7 @@ async def get( ) if as_bytes: prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}:')" # noqa: S608 + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) @@ -213,9 +213,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: ) # Value represents a parquet file output if isinstance(value, bytes): - print(key) prefix = self._get_prefix(key) - print(prefix) value_df = pd.read_parquet(BytesIO(value)) value_json = value_df.to_json( orient="records", lines=False, force_ascii=False @@ -225,7 +223,11 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: else: cosmosdb_item_list = json.loads(value_json) for cosmosdb_item in cosmosdb_item_list: - prefixed_id = f"{prefix}:{cosmosdb_item['id']}" + # Append an additional prefix to the id to force a unique identifier for the create_final_nodes rows + if (prefix == "create_final_nodes"): + prefixed_id = f"{prefix}-community_{cosmosdb_item['community']}:{cosmosdb_item['id']}" + else: + prefixed_id = f"{prefix}:{cosmosdb_item['id']}" cosmosdb_item["id"] = prefixed_id container_client.upsert_item(body=cosmosdb_item) # Value represents a cache output or stats.json @@ -246,7 +248,7 @@ async def has(self, key: str) -> bool: self.container_name ) prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}:')" # noqa: S608 + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) @@ -260,7 +262,7 @@ async def delete(self, key: str) -> None: self.container_name ) prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}:')" # noqa: S608 + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) From 02bd07e8235254c259e48a12776552b6be45363e Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Thu, 12 Dec 2024 16:20:31 -0800 Subject: [PATCH 064/104] found bug with has and delete methods --- graphrag/storage/cosmosdb_pipeline_storage.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 70c642739a..5525d4d306 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -247,12 +247,13 @@ async def has(self, key: str) -> bool: container_client = self._database_client.get_container_client( self.container_name ) - prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 - queried_items = container_client.query_items( - query=query, enable_cross_partition_query=True - ) - return len(list(queried_items)) > 0 + if ".parquet" in key: + prefix = self._get_prefix(key) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 + queried_items = container_client.query_items( + query=query, enable_cross_partition_query=True + ) + return len(list(queried_items)) > 0 return False async def delete(self, key: str) -> None: From d390b519c22bf385c7166d5a7a031a558c01f578 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Thu, 12 Dec 2024 16:25:45 -0800 Subject: [PATCH 065/104] modified has and delete to work with cache in new schema --- graphrag/storage/cosmosdb_pipeline_storage.py | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 5525d4d306..61ba1cb289 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -254,6 +254,11 @@ async def has(self, key: str) -> bool: query=query, enable_cross_partition_query=True ) return len(list(queried_items)) > 0 + item_names = [ + item["id"] + for item in container_client.read_all_items() + ] + return key in item_names return False async def delete(self, key: str) -> None: @@ -262,13 +267,16 @@ async def delete(self, key: str) -> None: container_client = self._database_client.get_container_client( self.container_name ) - prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 - queried_items = container_client.query_items( - query=query, enable_cross_partition_query=True - ) - for item in queried_items: - container_client.delete_item(item=item["id"], partition_key=item["id"]) + if ".parquet" in key: + prefix = self._get_prefix(key) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 + queried_items = container_client.query_items( + query=query, enable_cross_partition_query=True + ) + for item in queried_items: + container_client.delete_item(item=item["id"], partition_key=item["id"]) + else: + container_client.delete_item(item=key, partition_key=key) # Function currently deletes all items within the current container, then deletes the container itself. # TODO: Decide the granularity of deletion (e.g. delete all items within the current container, delete the current container, delete the current database) From 09037b6b8985bb442c03e81c9017044730a97477 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 16 Dec 2024 15:01:49 -0500 Subject: [PATCH 066/104] fix the merge from main --- graphrag/cache/factory.py | 1 - .../flows/create_final_community_reports.py | 2 +- .../summarize_communities.py | 1 + graphrag/storage/cosmosdb_pipeline_storage.py | 18 +++++++++--------- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/graphrag/cache/factory.py b/graphrag/cache/factory.py index bd3546682c..7490233cb7 100644 --- a/graphrag/cache/factory.py +++ b/graphrag/cache/factory.py @@ -5,7 +5,6 @@ from __future__ import annotations -from typing import TYPE_CHECKING, ClassVar from typing import TYPE_CHECKING, ClassVar from graphrag.config.enums import CacheType diff --git a/graphrag/index/flows/create_final_community_reports.py b/graphrag/index/flows/create_final_community_reports.py index f47d87bc00..496ddd2778 100644 --- a/graphrag/index/flows/create_final_community_reports.py +++ b/graphrag/index/flows/create_final_community_reports.py @@ -62,7 +62,7 @@ async def create_final_community_reports( claims = _prep_claims(claims_input) community_hierarchy = restore_community_hierarchy(nodes) - + local_contexts = prepare_community_reports( nodes, edges, diff --git a/graphrag/index/operations/summarize_communities/summarize_communities.py b/graphrag/index/operations/summarize_communities/summarize_communities.py index d14e52ca52..de8b5bc857 100644 --- a/graphrag/index/operations/summarize_communities/summarize_communities.py +++ b/graphrag/index/operations/summarize_communities/summarize_communities.py @@ -55,6 +55,7 @@ async def summarize_communities( "max_input_tokens", defaults.COMMUNITY_REPORT_MAX_INPUT_LENGTH ), ) + async def run_generate(record): result = await _generate_report( runner, diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 70c642739a..0ed6197c15 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -16,7 +16,7 @@ from azure.identity import DefaultAzureCredential from datashaper import Progress -from graphrag.logging.base import ProgressReporter +from graphrag.logger.base import ProgressLogger from graphrag.storage.pipeline_storage import PipelineStorage log = logging.getLogger(__name__) @@ -97,7 +97,7 @@ def find( self, file_pattern: re.Pattern[str], base_dir: str | None = None, - progress: ProgressReporter | None = None, + progress: ProgressLogger | None = None, file_filter: dict[str, Any] | None = None, max_count=-1, ) -> Iterator[tuple[str, dict[str, Any]]]: @@ -186,18 +186,18 @@ async def get( items_list = list(queried_items) for item in items_list: item["id"] = item["id"].split(":")[1] - + items_json_str = json.dumps(items_list) items_df = pd.read_json( StringIO(items_json_str), orient="records", lines=False ) return items_df.to_parquet() - + item = container_client.read_item(item=key, partition_key=key) item_body = item.get("body") return json.dumps(item_body) - + except Exception: log.exception("Error reading item %s", key) return None @@ -224,7 +224,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: cosmosdb_item_list = json.loads(value_json) for cosmosdb_item in cosmosdb_item_list: # Append an additional prefix to the id to force a unique identifier for the create_final_nodes rows - if (prefix == "create_final_nodes"): + if prefix == "create_final_nodes": prefixed_id = f"{prefix}-community_{cosmosdb_item['community']}:{cosmosdb_item['id']}" else: prefixed_id = f"{prefix}:{cosmosdb_item['id']}" @@ -250,7 +250,7 @@ async def has(self, key: str) -> bool: prefix = self._get_prefix(key) query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 queried_items = container_client.query_items( - query=query, enable_cross_partition_query=True + query=query, enable_cross_partition_query=True ) return len(list(queried_items)) > 0 return False @@ -264,7 +264,7 @@ async def delete(self, key: str) -> None: prefix = self._get_prefix(key) query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 queried_items = container_client.query_items( - query=query, enable_cross_partition_query=True + query=query, enable_cross_partition_query=True ) for item in queried_items: container_client.delete_item(item=item["id"], partition_key=item["id"]) @@ -290,7 +290,7 @@ def keys(self) -> list[str]: def child(self, name: str | None) -> PipelineStorage: """Create a child storage instance.""" return self - + def _get_prefix(self, key: str) -> str: """Get the prefix of the filename key.""" return key.split(".")[0] From b959e2b318fa79ab9fd749e3207a3798813b207d Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 16 Dec 2024 15:08:48 -0500 Subject: [PATCH 067/104] minor typo fixes --- graphrag/api/query.py | 3 --- .../operations/summarize_communities/summarize_communities.py | 1 + graphrag/storage/factory.py | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/graphrag/api/query.py b/graphrag/api/query.py index 34f482c2d7..1f5899a646 100644 --- a/graphrag/api/query.py +++ b/graphrag/api/query.py @@ -49,9 +49,6 @@ from graphrag.vector_stores.base import BaseVectorStore from graphrag.vector_stores.factory import VectorStoreFactory -if TYPE_CHECKING: - from graphrag.query.structured_search.base import SearchResult - if TYPE_CHECKING: from graphrag.query.structured_search.base import SearchResult diff --git a/graphrag/index/operations/summarize_communities/summarize_communities.py b/graphrag/index/operations/summarize_communities/summarize_communities.py index de8b5bc857..35a0192b82 100644 --- a/graphrag/index/operations/summarize_communities/summarize_communities.py +++ b/graphrag/index/operations/summarize_communities/summarize_communities.py @@ -45,6 +45,7 @@ async def summarize_communities( reports: list[CommunityReport | None] = [] tick = progress_ticker(callbacks.progress, len(local_contexts)) runner = load_strategy(strategy["type"]) + for level in levels: level_contexts = prep_community_report_context( pd.DataFrame(reports), diff --git a/graphrag/storage/factory.py b/graphrag/storage/factory.py index 2471d72a73..e3346af401 100644 --- a/graphrag/storage/factory.py +++ b/graphrag/storage/factory.py @@ -27,7 +27,7 @@ class StorageFactory: @classmethod def register(cls, storage_type: str, storage: type): - """Register a vector store type.""" + """Register a custom storage implementation.""" cls.storage_types[storage_type] = storage @classmethod From 9852d8a0b25a26904b1e527d305eeaac1bde21fe Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 16 Dec 2024 16:12:17 -0500 Subject: [PATCH 068/104] update lock file --- poetry.lock | 1344 +++++++++++---------------------------------------- 1 file changed, 276 insertions(+), 1068 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8260d79106..dc21b3802e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -36,15 +36,12 @@ files = [ [[package]] name = "anyio" version = "4.7.0" -version = "4.7.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" files = [ {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, - {file = "anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"}, - {file = "anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48"}, ] [package.dependencies] @@ -52,13 +49,10 @@ exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} -typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] -doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] trio = ["trio (>=0.26.1)"] [[package]] @@ -196,19 +190,19 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "attrs" -version = "24.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] @@ -402,13 +396,13 @@ css = ["tinycss2 (>=1.1.0,<1.5)"] [[package]] name = "certifi" -version = "2024.8.30" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -649,11 +643,9 @@ test = ["pytest"] [[package]] name = "contourpy" version = "1.3.1" -version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" -python-versions = ">=3.10" files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -709,60 +701,6 @@ files = [ {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"}, {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"}, {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, - {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, - {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, - {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1"}, - {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b"}, - {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453"}, - {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3"}, - {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277"}, - {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595"}, - {file = "contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697"}, - {file = "contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e"}, - {file = "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b"}, - {file = "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc"}, - {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86"}, - {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6"}, - {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85"}, - {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c"}, - {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291"}, - {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f"}, - {file = "contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375"}, - {file = "contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9"}, - {file = "contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509"}, - {file = "contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc"}, - {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454"}, - {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80"}, - {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec"}, - {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9"}, - {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b"}, - {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d"}, - {file = "contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e"}, - {file = "contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d"}, - {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"}, - {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"}, - {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"}, - {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"}, - {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"}, - {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"}, - {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"}, - {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"}, - {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"}, - {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"}, - {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"}, - {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"}, - {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"}, - {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"}, - {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"}, - {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"}, - {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"}, - {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"}, - {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"}, - {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"}, - {file = "contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6"}, - {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"}, - {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"}, - {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, ] [package.dependencies] @@ -778,7 +716,6 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "coverage" version = "7.6.9" -version = "7.6.9" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" @@ -845,68 +782,6 @@ files = [ {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, - {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, - {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, - {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, - {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, - {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, - {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, - {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, - {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, - {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, - {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, - {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, - {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, - {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, - {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, - {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, - {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, - {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, - {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, - {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, - {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, - {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, - {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, - {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, - {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, - {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, - {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, - {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, - {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, - {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, - {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, - {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, - {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, - {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, - {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, - {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, - {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, - {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, - {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, ] [package.extras] @@ -915,11 +790,9 @@ toml = ["tomli"] [[package]] name = "cryptography" version = "44.0.0" -version = "44.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" -python-versions = "!=3.9.0,!=3.9.1,>=3.7" files = [ {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, @@ -950,35 +823,6 @@ files = [ {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, - {file = "cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543"}, - {file = "cryptography-44.0.0-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385"}, - {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e"}, - {file = "cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e"}, - {file = "cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053"}, - {file = "cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd"}, - {file = "cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c"}, - {file = "cryptography-44.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba"}, - {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64"}, - {file = "cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285"}, - {file = "cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417"}, - {file = "cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa"}, - {file = "cryptography-44.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c"}, - {file = "cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02"}, ] [package.dependencies] @@ -990,14 +834,8 @@ docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelli nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] -docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0)"] -docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] -sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] -test = ["certifi (>=2024)", "cryptography-vectors (==44.0.0)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1034,64 +872,37 @@ pyarrow = ">=15.0.0,<16.0.0" [[package]] name = "debugpy" -version = "1.8.9" -version = "1.8.9" +version = "1.8.11" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.9-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:cfe1e6c6ad7178265f74981edf1154ffce97b69005212fbc90ca22ddfe3d017e"}, - {file = "debugpy-1.8.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada7fb65102a4d2c9ab62e8908e9e9f12aed9d76ef44880367bc9308ebe49a0f"}, - {file = "debugpy-1.8.9-cp310-cp310-win32.whl", hash = "sha256:c36856343cbaa448171cba62a721531e10e7ffb0abff838004701454149bc037"}, - {file = "debugpy-1.8.9-cp310-cp310-win_amd64.whl", hash = "sha256:17c5e0297678442511cf00a745c9709e928ea4ca263d764e90d233208889a19e"}, - {file = "debugpy-1.8.9-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:b74a49753e21e33e7cf030883a92fa607bddc4ede1aa4145172debc637780040"}, - {file = "debugpy-1.8.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d22dacdb0e296966d7d74a7141aaab4bec123fa43d1a35ddcb39bf9fd29d70"}, - {file = "debugpy-1.8.9-cp311-cp311-win32.whl", hash = "sha256:8138efff315cd09b8dcd14226a21afda4ca582284bf4215126d87342bba1cc66"}, - {file = "debugpy-1.8.9-cp311-cp311-win_amd64.whl", hash = "sha256:ff54ef77ad9f5c425398efb150239f6fe8e20c53ae2f68367eba7ece1e96226d"}, - {file = "debugpy-1.8.9-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:957363d9a7a6612a37458d9a15e72d03a635047f946e5fceee74b50d52a9c8e2"}, - {file = "debugpy-1.8.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e565fc54b680292b418bb809f1386f17081d1346dca9a871bf69a8ac4071afe"}, - {file = "debugpy-1.8.9-cp312-cp312-win32.whl", hash = "sha256:3e59842d6c4569c65ceb3751075ff8d7e6a6ada209ceca6308c9bde932bcef11"}, - {file = "debugpy-1.8.9-cp312-cp312-win_amd64.whl", hash = "sha256:66eeae42f3137eb428ea3a86d4a55f28da9bd5a4a3d369ba95ecc3a92c1bba53"}, - {file = "debugpy-1.8.9-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:957ecffff80d47cafa9b6545de9e016ae8c9547c98a538ee96ab5947115fb3dd"}, - {file = "debugpy-1.8.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1efbb3ff61487e2c16b3e033bc8595aea578222c08aaf3c4bf0f93fadbd662ee"}, - {file = "debugpy-1.8.9-cp313-cp313-win32.whl", hash = "sha256:7c4d65d03bee875bcb211c76c1d8f10f600c305dbd734beaed4077e902606fee"}, - {file = "debugpy-1.8.9-cp313-cp313-win_amd64.whl", hash = "sha256:e46b420dc1bea64e5bbedd678148be512442bc589b0111bd799367cde051e71a"}, - {file = "debugpy-1.8.9-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:472a3994999fe6c0756945ffa359e9e7e2d690fb55d251639d07208dbc37caea"}, - {file = "debugpy-1.8.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365e556a4772d7d0d151d7eb0e77ec4db03bcd95f26b67b15742b88cacff88e9"}, - {file = "debugpy-1.8.9-cp38-cp38-win32.whl", hash = "sha256:54a7e6d3014c408eb37b0b06021366ee985f1539e12fe49ca2ee0d392d9ceca5"}, - {file = "debugpy-1.8.9-cp38-cp38-win_amd64.whl", hash = "sha256:8e99c0b1cc7bf86d83fb95d5ccdc4ad0586d4432d489d1f54e4055bcc795f693"}, - {file = "debugpy-1.8.9-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:7e8b079323a56f719977fde9d8115590cb5e7a1cba2fcee0986ef8817116e7c1"}, - {file = "debugpy-1.8.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6953b335b804a41f16a192fa2e7851bdcfd92173cbb2f9f777bb934f49baab65"}, - {file = "debugpy-1.8.9-cp39-cp39-win32.whl", hash = "sha256:7e646e62d4602bb8956db88b1e72fe63172148c1e25c041e03b103a25f36673c"}, - {file = "debugpy-1.8.9-cp39-cp39-win_amd64.whl", hash = "sha256:3d9755e77a2d680ce3d2c5394a444cf42be4a592caaf246dbfbdd100ffcf7ae5"}, - {file = "debugpy-1.8.9-py2.py3-none-any.whl", hash = "sha256:cc37a6c9987ad743d9c3a14fa1b1a14b7e4e6041f9dd0c8abf8895fe7a97b899"}, - {file = "debugpy-1.8.9.zip", hash = "sha256:1339e14c7d980407248f09824d1b25ff5c5616651689f1e0f0e51bdead3ea13e"}, - {file = "debugpy-1.8.9-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:cfe1e6c6ad7178265f74981edf1154ffce97b69005212fbc90ca22ddfe3d017e"}, - {file = "debugpy-1.8.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada7fb65102a4d2c9ab62e8908e9e9f12aed9d76ef44880367bc9308ebe49a0f"}, - {file = "debugpy-1.8.9-cp310-cp310-win32.whl", hash = "sha256:c36856343cbaa448171cba62a721531e10e7ffb0abff838004701454149bc037"}, - {file = "debugpy-1.8.9-cp310-cp310-win_amd64.whl", hash = "sha256:17c5e0297678442511cf00a745c9709e928ea4ca263d764e90d233208889a19e"}, - {file = "debugpy-1.8.9-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:b74a49753e21e33e7cf030883a92fa607bddc4ede1aa4145172debc637780040"}, - {file = "debugpy-1.8.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d22dacdb0e296966d7d74a7141aaab4bec123fa43d1a35ddcb39bf9fd29d70"}, - {file = "debugpy-1.8.9-cp311-cp311-win32.whl", hash = "sha256:8138efff315cd09b8dcd14226a21afda4ca582284bf4215126d87342bba1cc66"}, - {file = "debugpy-1.8.9-cp311-cp311-win_amd64.whl", hash = "sha256:ff54ef77ad9f5c425398efb150239f6fe8e20c53ae2f68367eba7ece1e96226d"}, - {file = "debugpy-1.8.9-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:957363d9a7a6612a37458d9a15e72d03a635047f946e5fceee74b50d52a9c8e2"}, - {file = "debugpy-1.8.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e565fc54b680292b418bb809f1386f17081d1346dca9a871bf69a8ac4071afe"}, - {file = "debugpy-1.8.9-cp312-cp312-win32.whl", hash = "sha256:3e59842d6c4569c65ceb3751075ff8d7e6a6ada209ceca6308c9bde932bcef11"}, - {file = "debugpy-1.8.9-cp312-cp312-win_amd64.whl", hash = "sha256:66eeae42f3137eb428ea3a86d4a55f28da9bd5a4a3d369ba95ecc3a92c1bba53"}, - {file = "debugpy-1.8.9-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:957ecffff80d47cafa9b6545de9e016ae8c9547c98a538ee96ab5947115fb3dd"}, - {file = "debugpy-1.8.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1efbb3ff61487e2c16b3e033bc8595aea578222c08aaf3c4bf0f93fadbd662ee"}, - {file = "debugpy-1.8.9-cp313-cp313-win32.whl", hash = "sha256:7c4d65d03bee875bcb211c76c1d8f10f600c305dbd734beaed4077e902606fee"}, - {file = "debugpy-1.8.9-cp313-cp313-win_amd64.whl", hash = "sha256:e46b420dc1bea64e5bbedd678148be512442bc589b0111bd799367cde051e71a"}, - {file = "debugpy-1.8.9-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:472a3994999fe6c0756945ffa359e9e7e2d690fb55d251639d07208dbc37caea"}, - {file = "debugpy-1.8.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:365e556a4772d7d0d151d7eb0e77ec4db03bcd95f26b67b15742b88cacff88e9"}, - {file = "debugpy-1.8.9-cp38-cp38-win32.whl", hash = "sha256:54a7e6d3014c408eb37b0b06021366ee985f1539e12fe49ca2ee0d392d9ceca5"}, - {file = "debugpy-1.8.9-cp38-cp38-win_amd64.whl", hash = "sha256:8e99c0b1cc7bf86d83fb95d5ccdc4ad0586d4432d489d1f54e4055bcc795f693"}, - {file = "debugpy-1.8.9-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:7e8b079323a56f719977fde9d8115590cb5e7a1cba2fcee0986ef8817116e7c1"}, - {file = "debugpy-1.8.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6953b335b804a41f16a192fa2e7851bdcfd92173cbb2f9f777bb934f49baab65"}, - {file = "debugpy-1.8.9-cp39-cp39-win32.whl", hash = "sha256:7e646e62d4602bb8956db88b1e72fe63172148c1e25c041e03b103a25f36673c"}, - {file = "debugpy-1.8.9-cp39-cp39-win_amd64.whl", hash = "sha256:3d9755e77a2d680ce3d2c5394a444cf42be4a592caaf246dbfbdd100ffcf7ae5"}, - {file = "debugpy-1.8.9-py2.py3-none-any.whl", hash = "sha256:cc37a6c9987ad743d9c3a14fa1b1a14b7e4e6041f9dd0c8abf8895fe7a97b899"}, - {file = "debugpy-1.8.9.zip", hash = "sha256:1339e14c7d980407248f09824d1b25ff5c5616651689f1e0f0e51bdead3ea13e"}, + {file = "debugpy-1.8.11-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd"}, + {file = "debugpy-1.8.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f"}, + {file = "debugpy-1.8.11-cp310-cp310-win32.whl", hash = "sha256:c928bbf47f65288574b78518449edaa46c82572d340e2750889bbf8cd92f3737"}, + {file = "debugpy-1.8.11-cp310-cp310-win_amd64.whl", hash = "sha256:8da1db4ca4f22583e834dcabdc7832e56fe16275253ee53ba66627b86e304da1"}, + {file = "debugpy-1.8.11-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296"}, + {file = "debugpy-1.8.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1"}, + {file = "debugpy-1.8.11-cp311-cp311-win32.whl", hash = "sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9"}, + {file = "debugpy-1.8.11-cp311-cp311-win_amd64.whl", hash = "sha256:987bce16e86efa86f747d5151c54e91b3c1e36acc03ce1ddb50f9d09d16ded0e"}, + {file = "debugpy-1.8.11-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308"}, + {file = "debugpy-1.8.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768"}, + {file = "debugpy-1.8.11-cp312-cp312-win32.whl", hash = "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b"}, + {file = "debugpy-1.8.11-cp312-cp312-win_amd64.whl", hash = "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1"}, + {file = "debugpy-1.8.11-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3"}, + {file = "debugpy-1.8.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e"}, + {file = "debugpy-1.8.11-cp313-cp313-win32.whl", hash = "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28"}, + {file = "debugpy-1.8.11-cp313-cp313-win_amd64.whl", hash = "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1"}, + {file = "debugpy-1.8.11-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:ad7efe588c8f5cf940f40c3de0cd683cc5b76819446abaa50dc0829a30c094db"}, + {file = "debugpy-1.8.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:189058d03a40103a57144752652b3ab08ff02b7595d0ce1f651b9acc3a3a35a0"}, + {file = "debugpy-1.8.11-cp38-cp38-win32.whl", hash = "sha256:32db46ba45849daed7ccf3f2e26f7a386867b077f39b2a974bb5c4c2c3b0a280"}, + {file = "debugpy-1.8.11-cp38-cp38-win_amd64.whl", hash = "sha256:116bf8342062246ca749013df4f6ea106f23bc159305843491f64672a55af2e5"}, + {file = "debugpy-1.8.11-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:654130ca6ad5de73d978057eaf9e582244ff72d4574b3e106fb8d3d2a0d32458"}, + {file = "debugpy-1.8.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23dc34c5e03b0212fa3c49a874df2b8b1b8fda95160bd79c01eb3ab51ea8d851"}, + {file = "debugpy-1.8.11-cp39-cp39-win32.whl", hash = "sha256:52d8a3166c9f2815bfae05f386114b0b2d274456980d41f320299a8d9a5615a7"}, + {file = "debugpy-1.8.11-cp39-cp39-win_amd64.whl", hash = "sha256:52c3cf9ecda273a19cc092961ee34eb9ba8687d67ba34cc7b79a521c1c64c4c0"}, + {file = "debugpy-1.8.11-py2.py3-none-any.whl", hash = "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920"}, + {file = "debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57"}, ] [[package]] @@ -1199,15 +1010,12 @@ files = [ [[package]] name = "environs" version = "11.2.1" -version = "11.2.1" description = "simplified environment variable parsing" optional = false python-versions = ">=3.8" files = [ {file = "environs-11.2.1-py3-none-any.whl", hash = "sha256:9d2080cf25807a26fc0d4301e2d7b62c64fbf547540f21e3a30cc02bc5fbe948"}, {file = "environs-11.2.1.tar.gz", hash = "sha256:e068ae3174cef52ba4b95ead22e639056a02465f616e62323e04ae08e86a75a4"}, - {file = "environs-11.2.1-py3-none-any.whl", hash = "sha256:9d2080cf25807a26fc0d4301e2d7b62c64fbf547540f21e3a30cc02bc5fbe948"}, - {file = "environs-11.2.1.tar.gz", hash = "sha256:e068ae3174cef52ba4b95ead22e639056a02465f616e62323e04ae08e86a75a4"}, ] [package.dependencies] @@ -1216,7 +1024,6 @@ python-dotenv = "*" [package.extras] dev = ["environs[tests]", "pre-commit (>=3.5,<5.0)", "tox"] -dev = ["environs[tests]", "pre-commit (>=3.5,<5.0)", "tox"] django = ["dj-database-url", "dj-email-url", "django-cache-url"] tests = ["environs[django]", "pytest"] @@ -1251,15 +1058,12 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastjsonschema" version = "2.21.1" -version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, - {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, - {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, ] [package.extras] @@ -1289,112 +1093,61 @@ openai = ["openai (>=1.35.12)", "tiktoken (>=0.7.0)"] [[package]] name = "fonttools" -version = "4.55.2" -version = "4.55.2" +version = "4.55.3" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.55.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bef0f8603834643b1a6419d57902f18e7d950ec1a998fb70410635c598dc1a1e"}, - {file = "fonttools-4.55.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:944228b86d472612d3b48bcc83b31c25c2271e63fdc74539adfcfa7a96d487fb"}, - {file = "fonttools-4.55.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f0e55f5da594b85f269cfbecd2f6bd3e07d0abba68870bc3f34854de4fa4678"}, - {file = "fonttools-4.55.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b1a6e576db0c83c1b91925bf1363478c4bb968dbe8433147332fb5782ce6190"}, - {file = "fonttools-4.55.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:616368b15716781bc84df5c2191dc0540137aaef56c2771eb4b89b90933f347a"}, - {file = "fonttools-4.55.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7bbae4f3915225c2c37670da68e2bf18a21206060ad31dfb95fec91ef641caa7"}, - {file = "fonttools-4.55.2-cp310-cp310-win32.whl", hash = "sha256:8b02b10648d69d67a7eb055f4d3eedf4a85deb22fb7a19fbd9acbae7c7538199"}, - {file = "fonttools-4.55.2-cp310-cp310-win_amd64.whl", hash = "sha256:bbea0ab841113ac8e8edde067e099b7288ffc6ac2dded538b131c2c0595d5f77"}, - {file = "fonttools-4.55.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d34525e8141286fa976e14806639d32294bfb38d28bbdb5f6be9f46a1cd695a6"}, - {file = "fonttools-4.55.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ecd1c2b1c2ec46bb73685bc5473c72e16ed0930ef79bc2919ccadc43a99fb16"}, - {file = "fonttools-4.55.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9008438ad59e5a8e403a62fbefef2b2ff377eb3857d90a3f2a5f4d674ff441b2"}, - {file = "fonttools-4.55.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:131591ac8d7a47043aaf29581aba755ae151d46e49d2bf49608601efd71e8b4d"}, - {file = "fonttools-4.55.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4c83381c3e3e3d9caa25527c4300543578341f21aae89e4fbbb4debdda8d82a2"}, - {file = "fonttools-4.55.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:42aca564b575252fd9954ed0d91d97a24de24289a16ce8ff74ed0bdf5ecebf11"}, - {file = "fonttools-4.55.2-cp311-cp311-win32.whl", hash = "sha256:c6457f650ebe15baa17fc06e256227f0a47f46f80f27ec5a0b00160de8dc2c13"}, - {file = "fonttools-4.55.2-cp311-cp311-win_amd64.whl", hash = "sha256:5cfa67414d7414442a5635ff634384101c54f53bb7b0e04aa6a61b013fcce194"}, - {file = "fonttools-4.55.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:18f082445b8fe5e91c53e6184f4c1c73f3f965c8bcc614c6cd6effd573ce6c1a"}, - {file = "fonttools-4.55.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c0f91adbbd706e8acd1db73e3e510118e62d0ffb651864567dccc5b2339f90"}, - {file = "fonttools-4.55.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d8ccce035320d63dba0c35f52499322f5531dbe85bba1514c7cea26297e4c54"}, - {file = "fonttools-4.55.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96e126df9615df214ec7f04bebcf60076297fbc10b75c777ce58b702d7708ffb"}, - {file = "fonttools-4.55.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:508ebb42956a7a931c4092dfa2d9b4ffd4f94cea09b8211199090d2bd082506b"}, - {file = "fonttools-4.55.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1b9de46ef7b683d50400abf9f1578eaceee271ff51c36bf4b7366f2be29f498"}, - {file = "fonttools-4.55.2-cp312-cp312-win32.whl", hash = "sha256:2df61d9fc15199cc86dad29f64dd686874a3a52dda0c2d8597d21f509f95c332"}, - {file = "fonttools-4.55.2-cp312-cp312-win_amd64.whl", hash = "sha256:d337ec087da8216a828574aa0525d869df0a2ac217a2efc1890974ddd1fbc5b9"}, - {file = "fonttools-4.55.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:10aff204e2edee1d312fa595c06f201adf8d528a3b659cfb34cd47eceaaa6a26"}, - {file = "fonttools-4.55.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09fe922a3eff181fd07dd724cdb441fb6b9fc355fd1c0f1aa79aca60faf1fbdd"}, - {file = "fonttools-4.55.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:487e1e8b524143a799bda0169c48b44a23a6027c1bb1957d5a172a7d3a1dd704"}, - {file = "fonttools-4.55.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b1726872e09268bbedb14dc02e58b7ea31ecdd1204c6073eda4911746b44797"}, - {file = "fonttools-4.55.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6fc88cfb58b0cd7b48718c3e61dd0d0a3ee8e2c86b973342967ce09fbf1db6d4"}, - {file = "fonttools-4.55.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e857fe1859901ad8c5cab32e0eebc920adb09f413d2d73b74b677cf47b28590c"}, - {file = "fonttools-4.55.2-cp313-cp313-win32.whl", hash = "sha256:81ccd2b3a420b8050c7d9db3be0555d71662973b3ef2a1d921a2880b58957db8"}, - {file = "fonttools-4.55.2-cp313-cp313-win_amd64.whl", hash = "sha256:d559eb1744c7dcfa90ae60cb1a4b3595e898e48f4198738c321468c01180cd83"}, - {file = "fonttools-4.55.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6b5917ef79cac8300b88fd6113003fd01bbbbea2ea060a27b95d8f77cb4c65c2"}, - {file = "fonttools-4.55.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:663eba5615d6abaaf616432354eb7ce951d518e43404371bcc2b0694ef21e8d6"}, - {file = "fonttools-4.55.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:803d5cef5fc47f44f5084d154aa3d6f069bb1b60e32390c225f897fa19b0f939"}, - {file = "fonttools-4.55.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bc5f100de0173cc39102c0399bd6c3bd544bbdf224957933f10ee442d43cddd"}, - {file = "fonttools-4.55.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3d9bbc1e380fdaf04ad9eabd8e3e6a4301eaf3487940893e9fd98537ea2e283b"}, - {file = "fonttools-4.55.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:42a9afedff07b6f75aa0f39b5e49922ac764580ef3efce035ca30284b2ee65c8"}, - {file = "fonttools-4.55.2-cp38-cp38-win32.whl", hash = "sha256:f1c76f423f1a241df08f87614364dff6e0b7ce23c962c1b74bd995ec7c0dad13"}, - {file = "fonttools-4.55.2-cp38-cp38-win_amd64.whl", hash = "sha256:25062b6ca03464dd5179fc2040fb19e03391b7cc49b9cc4f879312e638605c5c"}, - {file = "fonttools-4.55.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d1100d8e665fe386a79cab59446992de881ea74d0d6c191bb988642692aa2421"}, - {file = "fonttools-4.55.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbdc251c5e472e5ae6bc816f9b82718b8e93ff7992e7331d6cf3562b96aa268e"}, - {file = "fonttools-4.55.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0bf24d2b02dbc9376d795a63062632ff73e3e9e60c0229373f500aed7e86dd7"}, - {file = "fonttools-4.55.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ff250ed4ff05015dfd9cf2adf7570c7a383ca80f4d9732ac484a5ed0d8453c"}, - {file = "fonttools-4.55.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44cf2a98aa661dbdeb8c03f5e405b074e2935196780bb729888639f5276067d9"}, - {file = "fonttools-4.55.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22ef222740eb89d189bf0612eb98fbae592c61d7efeac51bfbc2a1592d469557"}, - {file = "fonttools-4.55.2-cp39-cp39-win32.whl", hash = "sha256:93f439ca27e55f585e7aaa04a74990acd983b5f2245e41d6b79f0a8b44e684d8"}, - {file = "fonttools-4.55.2-cp39-cp39-win_amd64.whl", hash = "sha256:627cf10d6f5af5bec6324c18a2670f134c29e1b7dce3fb62e8ef88baa6cba7a9"}, - {file = "fonttools-4.55.2-py3-none-any.whl", hash = "sha256:8e2d89fbe9b08d96e22c7a81ec04a4e8d8439c31223e2dc6f2f9fc8ff14bdf9f"}, - {file = "fonttools-4.55.2.tar.gz", hash = "sha256:45947e7b3f9673f91df125d375eb57b9a23f2a603f438a1aebf3171bffa7a205"}, - {file = "fonttools-4.55.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bef0f8603834643b1a6419d57902f18e7d950ec1a998fb70410635c598dc1a1e"}, - {file = "fonttools-4.55.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:944228b86d472612d3b48bcc83b31c25c2271e63fdc74539adfcfa7a96d487fb"}, - {file = "fonttools-4.55.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f0e55f5da594b85f269cfbecd2f6bd3e07d0abba68870bc3f34854de4fa4678"}, - {file = "fonttools-4.55.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b1a6e576db0c83c1b91925bf1363478c4bb968dbe8433147332fb5782ce6190"}, - {file = "fonttools-4.55.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:616368b15716781bc84df5c2191dc0540137aaef56c2771eb4b89b90933f347a"}, - {file = "fonttools-4.55.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7bbae4f3915225c2c37670da68e2bf18a21206060ad31dfb95fec91ef641caa7"}, - {file = "fonttools-4.55.2-cp310-cp310-win32.whl", hash = "sha256:8b02b10648d69d67a7eb055f4d3eedf4a85deb22fb7a19fbd9acbae7c7538199"}, - {file = "fonttools-4.55.2-cp310-cp310-win_amd64.whl", hash = "sha256:bbea0ab841113ac8e8edde067e099b7288ffc6ac2dded538b131c2c0595d5f77"}, - {file = "fonttools-4.55.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d34525e8141286fa976e14806639d32294bfb38d28bbdb5f6be9f46a1cd695a6"}, - {file = "fonttools-4.55.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ecd1c2b1c2ec46bb73685bc5473c72e16ed0930ef79bc2919ccadc43a99fb16"}, - {file = "fonttools-4.55.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9008438ad59e5a8e403a62fbefef2b2ff377eb3857d90a3f2a5f4d674ff441b2"}, - {file = "fonttools-4.55.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:131591ac8d7a47043aaf29581aba755ae151d46e49d2bf49608601efd71e8b4d"}, - {file = "fonttools-4.55.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4c83381c3e3e3d9caa25527c4300543578341f21aae89e4fbbb4debdda8d82a2"}, - {file = "fonttools-4.55.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:42aca564b575252fd9954ed0d91d97a24de24289a16ce8ff74ed0bdf5ecebf11"}, - {file = "fonttools-4.55.2-cp311-cp311-win32.whl", hash = "sha256:c6457f650ebe15baa17fc06e256227f0a47f46f80f27ec5a0b00160de8dc2c13"}, - {file = "fonttools-4.55.2-cp311-cp311-win_amd64.whl", hash = "sha256:5cfa67414d7414442a5635ff634384101c54f53bb7b0e04aa6a61b013fcce194"}, - {file = "fonttools-4.55.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:18f082445b8fe5e91c53e6184f4c1c73f3f965c8bcc614c6cd6effd573ce6c1a"}, - {file = "fonttools-4.55.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c0f91adbbd706e8acd1db73e3e510118e62d0ffb651864567dccc5b2339f90"}, - {file = "fonttools-4.55.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d8ccce035320d63dba0c35f52499322f5531dbe85bba1514c7cea26297e4c54"}, - {file = "fonttools-4.55.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96e126df9615df214ec7f04bebcf60076297fbc10b75c777ce58b702d7708ffb"}, - {file = "fonttools-4.55.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:508ebb42956a7a931c4092dfa2d9b4ffd4f94cea09b8211199090d2bd082506b"}, - {file = "fonttools-4.55.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1b9de46ef7b683d50400abf9f1578eaceee271ff51c36bf4b7366f2be29f498"}, - {file = "fonttools-4.55.2-cp312-cp312-win32.whl", hash = "sha256:2df61d9fc15199cc86dad29f64dd686874a3a52dda0c2d8597d21f509f95c332"}, - {file = "fonttools-4.55.2-cp312-cp312-win_amd64.whl", hash = "sha256:d337ec087da8216a828574aa0525d869df0a2ac217a2efc1890974ddd1fbc5b9"}, - {file = "fonttools-4.55.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:10aff204e2edee1d312fa595c06f201adf8d528a3b659cfb34cd47eceaaa6a26"}, - {file = "fonttools-4.55.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09fe922a3eff181fd07dd724cdb441fb6b9fc355fd1c0f1aa79aca60faf1fbdd"}, - {file = "fonttools-4.55.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:487e1e8b524143a799bda0169c48b44a23a6027c1bb1957d5a172a7d3a1dd704"}, - {file = "fonttools-4.55.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b1726872e09268bbedb14dc02e58b7ea31ecdd1204c6073eda4911746b44797"}, - {file = "fonttools-4.55.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6fc88cfb58b0cd7b48718c3e61dd0d0a3ee8e2c86b973342967ce09fbf1db6d4"}, - {file = "fonttools-4.55.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e857fe1859901ad8c5cab32e0eebc920adb09f413d2d73b74b677cf47b28590c"}, - {file = "fonttools-4.55.2-cp313-cp313-win32.whl", hash = "sha256:81ccd2b3a420b8050c7d9db3be0555d71662973b3ef2a1d921a2880b58957db8"}, - {file = "fonttools-4.55.2-cp313-cp313-win_amd64.whl", hash = "sha256:d559eb1744c7dcfa90ae60cb1a4b3595e898e48f4198738c321468c01180cd83"}, - {file = "fonttools-4.55.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6b5917ef79cac8300b88fd6113003fd01bbbbea2ea060a27b95d8f77cb4c65c2"}, - {file = "fonttools-4.55.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:663eba5615d6abaaf616432354eb7ce951d518e43404371bcc2b0694ef21e8d6"}, - {file = "fonttools-4.55.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:803d5cef5fc47f44f5084d154aa3d6f069bb1b60e32390c225f897fa19b0f939"}, - {file = "fonttools-4.55.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bc5f100de0173cc39102c0399bd6c3bd544bbdf224957933f10ee442d43cddd"}, - {file = "fonttools-4.55.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3d9bbc1e380fdaf04ad9eabd8e3e6a4301eaf3487940893e9fd98537ea2e283b"}, - {file = "fonttools-4.55.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:42a9afedff07b6f75aa0f39b5e49922ac764580ef3efce035ca30284b2ee65c8"}, - {file = "fonttools-4.55.2-cp38-cp38-win32.whl", hash = "sha256:f1c76f423f1a241df08f87614364dff6e0b7ce23c962c1b74bd995ec7c0dad13"}, - {file = "fonttools-4.55.2-cp38-cp38-win_amd64.whl", hash = "sha256:25062b6ca03464dd5179fc2040fb19e03391b7cc49b9cc4f879312e638605c5c"}, - {file = "fonttools-4.55.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d1100d8e665fe386a79cab59446992de881ea74d0d6c191bb988642692aa2421"}, - {file = "fonttools-4.55.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dbdc251c5e472e5ae6bc816f9b82718b8e93ff7992e7331d6cf3562b96aa268e"}, - {file = "fonttools-4.55.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0bf24d2b02dbc9376d795a63062632ff73e3e9e60c0229373f500aed7e86dd7"}, - {file = "fonttools-4.55.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ff250ed4ff05015dfd9cf2adf7570c7a383ca80f4d9732ac484a5ed0d8453c"}, - {file = "fonttools-4.55.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44cf2a98aa661dbdeb8c03f5e405b074e2935196780bb729888639f5276067d9"}, - {file = "fonttools-4.55.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22ef222740eb89d189bf0612eb98fbae592c61d7efeac51bfbc2a1592d469557"}, - {file = "fonttools-4.55.2-cp39-cp39-win32.whl", hash = "sha256:93f439ca27e55f585e7aaa04a74990acd983b5f2245e41d6b79f0a8b44e684d8"}, - {file = "fonttools-4.55.2-cp39-cp39-win_amd64.whl", hash = "sha256:627cf10d6f5af5bec6324c18a2670f134c29e1b7dce3fb62e8ef88baa6cba7a9"}, - {file = "fonttools-4.55.2-py3-none-any.whl", hash = "sha256:8e2d89fbe9b08d96e22c7a81ec04a4e8d8439c31223e2dc6f2f9fc8ff14bdf9f"}, - {file = "fonttools-4.55.2.tar.gz", hash = "sha256:45947e7b3f9673f91df125d375eb57b9a23f2a603f438a1aebf3171bffa7a205"}, + {file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1dcc07934a2165ccdc3a5a608db56fb3c24b609658a5b340aee4ecf3ba679dc0"}, + {file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f7d66c15ba875432a2d2fb419523f5d3d347f91f48f57b8b08a2dfc3c39b8a3f"}, + {file = "fonttools-4.55.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e4ae3592e62eba83cd2c4ccd9462dcfa603ff78e09110680a5444c6925d841"}, + {file = "fonttools-4.55.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d65a3022c35e404d19ca14f291c89cc5890032ff04f6c17af0bd1927299674"}, + {file = "fonttools-4.55.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d342e88764fb201286d185093781bf6628bbe380a913c24adf772d901baa8276"}, + {file = "fonttools-4.55.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd68c87a2bfe37c5b33bcda0fba39b65a353876d3b9006fde3adae31f97b3ef5"}, + {file = "fonttools-4.55.3-cp310-cp310-win32.whl", hash = "sha256:1bc7ad24ff98846282eef1cbeac05d013c2154f977a79886bb943015d2b1b261"}, + {file = "fonttools-4.55.3-cp310-cp310-win_amd64.whl", hash = "sha256:b54baf65c52952db65df39fcd4820668d0ef4766c0ccdf32879b77f7c804d5c5"}, + {file = "fonttools-4.55.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e"}, + {file = "fonttools-4.55.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b"}, + {file = "fonttools-4.55.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90"}, + {file = "fonttools-4.55.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da9da6d65cd7aa6b0f806556f4985bcbf603bf0c5c590e61b43aa3e5a0f822d0"}, + {file = "fonttools-4.55.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e894b5bd60d9f473bed7a8f506515549cc194de08064d829464088d23097331b"}, + {file = "fonttools-4.55.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aee3b57643827e237ff6ec6d28d9ff9766bd8b21e08cd13bff479e13d4b14765"}, + {file = "fonttools-4.55.3-cp311-cp311-win32.whl", hash = "sha256:eb6ca911c4c17eb51853143624d8dc87cdcdf12a711fc38bf5bd21521e79715f"}, + {file = "fonttools-4.55.3-cp311-cp311-win_amd64.whl", hash = "sha256:6314bf82c54c53c71805318fcf6786d986461622dd926d92a465199ff54b1b72"}, + {file = "fonttools-4.55.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9e736f60f4911061235603a6119e72053073a12c6d7904011df2d8fad2c0e35"}, + {file = "fonttools-4.55.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a8aa2c5e5b8b3bcb2e4538d929f6589a5c6bdb84fd16e2ed92649fb5454f11c"}, + {file = "fonttools-4.55.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f8288aacf0a38d174445fc78377a97fb0b83cfe352a90c9d9c1400571963c7"}, + {file = "fonttools-4.55.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8d5e8916c0970fbc0f6f1bece0063363bb5857a7f170121a4493e31c3db3314"}, + {file = "fonttools-4.55.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae3b6600565b2d80b7c05acb8e24d2b26ac407b27a3f2e078229721ba5698427"}, + {file = "fonttools-4.55.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:54153c49913f45065c8d9e6d0c101396725c5621c8aee744719300f79771d75a"}, + {file = "fonttools-4.55.3-cp312-cp312-win32.whl", hash = "sha256:827e95fdbbd3e51f8b459af5ea10ecb4e30af50221ca103bea68218e9615de07"}, + {file = "fonttools-4.55.3-cp312-cp312-win_amd64.whl", hash = "sha256:e6e8766eeeb2de759e862004aa11a9ea3d6f6d5ec710551a88b476192b64fd54"}, + {file = "fonttools-4.55.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a430178ad3e650e695167cb53242dae3477b35c95bef6525b074d87493c4bf29"}, + {file = "fonttools-4.55.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:529cef2ce91dc44f8e407cc567fae6e49a1786f2fefefa73a294704c415322a4"}, + {file = "fonttools-4.55.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e75f12c82127486fac2d8bfbf5bf058202f54bf4f158d367e41647b972342ca"}, + {file = "fonttools-4.55.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:859c358ebf41db18fb72342d3080bce67c02b39e86b9fbcf1610cca14984841b"}, + {file = "fonttools-4.55.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:546565028e244a701f73df6d8dd6be489d01617863ec0c6a42fa25bf45d43048"}, + {file = "fonttools-4.55.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:aca318b77f23523309eec4475d1fbbb00a6b133eb766a8bdc401faba91261abe"}, + {file = "fonttools-4.55.3-cp313-cp313-win32.whl", hash = "sha256:8c5ec45428edaa7022f1c949a632a6f298edc7b481312fc7dc258921e9399628"}, + {file = "fonttools-4.55.3-cp313-cp313-win_amd64.whl", hash = "sha256:11e5de1ee0d95af4ae23c1a138b184b7f06e0b6abacabf1d0db41c90b03d834b"}, + {file = "fonttools-4.55.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:caf8230f3e10f8f5d7593eb6d252a37caf58c480b19a17e250a63dad63834cf3"}, + {file = "fonttools-4.55.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b586ab5b15b6097f2fb71cafa3c98edfd0dba1ad8027229e7b1e204a58b0e09d"}, + {file = "fonttools-4.55.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8c2794ded89399cc2169c4d0bf7941247b8d5932b2659e09834adfbb01589aa"}, + {file = "fonttools-4.55.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf4fe7c124aa3f4e4c1940880156e13f2f4d98170d35c749e6b4f119a872551e"}, + {file = "fonttools-4.55.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:86721fbc389ef5cc1e2f477019e5069e8e4421e8d9576e9c26f840dbb04678de"}, + {file = "fonttools-4.55.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:89bdc5d88bdeec1b15af790810e267e8332d92561dce4f0748c2b95c9bdf3926"}, + {file = "fonttools-4.55.3-cp38-cp38-win32.whl", hash = "sha256:bc5dbb4685e51235ef487e4bd501ddfc49be5aede5e40f4cefcccabc6e60fb4b"}, + {file = "fonttools-4.55.3-cp38-cp38-win_amd64.whl", hash = "sha256:cd70de1a52a8ee2d1877b6293af8a2484ac82514f10b1c67c1c5762d38073e56"}, + {file = "fonttools-4.55.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bdcc9f04b36c6c20978d3f060e5323a43f6222accc4e7fcbef3f428e216d96af"}, + {file = "fonttools-4.55.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c3ca99e0d460eff46e033cd3992a969658c3169ffcd533e0a39c63a38beb6831"}, + {file = "fonttools-4.55.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22f38464daa6cdb7b6aebd14ab06609328fe1e9705bb0fcc7d1e69de7109ee02"}, + {file = "fonttools-4.55.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed63959d00b61959b035c7d47f9313c2c1ece090ff63afea702fe86de00dbed4"}, + {file = "fonttools-4.55.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5e8d657cd7326eeaba27de2740e847c6b39dde2f8d7cd7cc56f6aad404ddf0bd"}, + {file = "fonttools-4.55.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fb594b5a99943042c702c550d5494bdd7577f6ef19b0bc73877c948a63184a32"}, + {file = "fonttools-4.55.3-cp39-cp39-win32.whl", hash = "sha256:dc5294a3d5c84226e3dbba1b6f61d7ad813a8c0238fceea4e09aa04848c3d851"}, + {file = "fonttools-4.55.3-cp39-cp39-win_amd64.whl", hash = "sha256:aedbeb1db64496d098e6be92b2e63b5fac4e53b1b92032dfc6988e1ea9134a4d"}, + {file = "fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977"}, + {file = "fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45"}, ] [package.extras] @@ -1552,15 +1305,12 @@ files = [ [[package]] name = "httpcore" version = "1.0.7" -version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, - {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, - {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, ] [package.dependencies] @@ -1675,15 +1425,12 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio [[package]] name = "ipython" version = "8.30.0" -version = "8.30.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ {file = "ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321"}, {file = "ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e"}, - {file = "ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321"}, - {file = "ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e"}, ] [package.dependencies] @@ -1694,19 +1441,15 @@ jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} prompt_toolkit = ">=3.0.41,<3.1.0" -prompt_toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack_data = "*" -stack_data = "*" traitlets = ">=5.13.0" typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} -typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] -doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -1766,26 +1509,21 @@ arrow = ">=0.15.0" [[package]] name = "jedi" version = "0.19.2" -version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, - {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, - {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] parso = ">=0.8.4,<0.9.0" -parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" @@ -1806,162 +1544,87 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jiter" -version = "0.8.0" -version = "0.8.0" +version = "0.8.2" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dee4eeb293ffcd2c3b31ebab684dbf7f7b71fe198f8eddcdf3a042cc6e10205a"}, - {file = "jiter-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aad1e6e9b01cf0304dcee14db03e92e0073287a6297caf5caf2e9dbfea16a924"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:504099fb7acdbe763e10690d560a25d4aee03d918d6a063f3a761d8a09fb833f"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2373487caad7fe39581f588ab5c9262fc1ade078d448626fec93f4ffba528858"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c341ecc3f9bccde952898b0c97c24f75b84b56a7e2f8bbc7c8e38cab0875a027"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e48e7a336529b9419d299b70c358d4ebf99b8f4b847ed3f1000ec9f320e8c0c"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ee157a8afd2943be690db679f82fafb8d347a8342e8b9c34863de30c538d55"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d7dceae3549b80087f913aad4acc2a7c1e0ab7cb983effd78bdc9c41cabdcf18"}, - {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e29e9ecce53d396772590438214cac4ab89776f5e60bd30601f1050b34464019"}, - {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fa1782f22d5f92c620153133f35a9a395d3f3823374bceddd3e7032e2fdfa0b1"}, - {file = "jiter-0.8.0-cp310-none-win32.whl", hash = "sha256:f754ef13b4e4f67a3bf59fe974ef4342523801c48bf422f720bd37a02a360584"}, - {file = "jiter-0.8.0-cp310-none-win_amd64.whl", hash = "sha256:796f750b65f5d605f5e7acaccc6b051675e60c41d7ac3eab40dbd7b5b81a290f"}, - {file = "jiter-0.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f6f4e645efd96b4690b9b6091dbd4e0fa2885ba5c57a0305c1916b75b4f30ff6"}, - {file = "jiter-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f61cf6d93c1ade9b8245c9f14b7900feadb0b7899dbe4aa8de268b705647df81"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0396bc5cb1309c6dab085e70bb3913cdd92218315e47b44afe9eace68ee8adaa"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62d0e42ec5dc772bd8554a304358220be5d97d721c4648b23f3a9c01ccc2cb26"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec4b711989860705733fc59fb8c41b2def97041cea656b37cf6c8ea8dee1c3f4"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859cc35bf304ab066d88f10a44a3251a9cd057fb11ec23e00be22206db878f4f"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5000195921aa293b39b9b5bc959d7fa658e7f18f938c0e52732da8e3cc70a278"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36050284c0abde57aba34964d3920f3d6228211b65df7187059bb7c7f143759a"}, - {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a88f608e050cfe45c48d771e86ecdbf5258314c883c986d4217cc79e1fb5f689"}, - {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:646cf4237665b2e13b4159d8f26d53f59bc9f2e6e135e3a508a2e5dd26d978c6"}, - {file = "jiter-0.8.0-cp311-none-win32.whl", hash = "sha256:21fe5b8345db1b3023052b2ade9bb4d369417827242892051244af8fae8ba231"}, - {file = "jiter-0.8.0-cp311-none-win_amd64.whl", hash = "sha256:30c2161c5493acf6b6c3c909973fb64ae863747def01cc7574f3954e0a15042c"}, - {file = "jiter-0.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d91a52d8f49ada2672a4b808a0c5c25d28f320a2c9ca690e30ebd561eb5a1002"}, - {file = "jiter-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c38cf25cf7862f61410b7a49684d34eb3b5bcbd7ddaf4773eea40e0bd43de706"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6189beb5c4b3117624be6b2e84545cff7611f5855d02de2d06ff68e316182be"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e13fa849c0e30643554add089983caa82f027d69fad8f50acadcb21c462244ab"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7765ca159d0a58e8e0f8ca972cd6d26a33bc97b4480d0d2309856763807cd28"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b0befe7c6e9fc867d5bed21bab0131dfe27d1fa5cd52ba2bced67da33730b7d"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7d6363d4c6f1052b1d8b494eb9a72667c3ef5f80ebacfe18712728e85327000"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a873e57009863eeac3e3969e4653f07031d6270d037d6224415074ac17e5505c"}, - {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2582912473c0d9940791479fe1bf2976a34f212eb8e0a82ee9e645ac275c5d16"}, - {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:646163201af42f55393ee6e8f6136b8df488253a6533f4230a64242ecbfe6048"}, - {file = "jiter-0.8.0-cp312-none-win32.whl", hash = "sha256:96e75c9abfbf7387cba89a324d2356d86d8897ac58c956017d062ad510832dae"}, - {file = "jiter-0.8.0-cp312-none-win_amd64.whl", hash = "sha256:ed6074552b4a32e047b52dad5ab497223721efbd0e9efe68c67749f094a092f7"}, - {file = "jiter-0.8.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:dd5e351cb9b3e676ec3360a85ea96def515ad2b83c8ae3a251ce84985a2c9a6f"}, - {file = "jiter-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba9f12b0f801ecd5ed0cec29041dc425d1050922b434314c592fc30d51022467"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7ba461c3681728d556392e8ae56fb44a550155a24905f01982317b367c21dd4"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a15ed47ab09576db560dbc5c2c5a64477535beb056cd7d997d5dd0f2798770e"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cef55042816d0737142b0ec056c0356a5f681fb8d6aa8499b158e87098f4c6f8"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:549f170215adeb5e866f10617c3d019d8eb4e6d4e3c6b724b3b8c056514a3487"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f867edeb279d22020877640d2ea728de5817378c60a51be8af731a8a8f525306"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aef8845f463093799db4464cee2aa59d61aa8edcb3762aaa4aacbec3f478c929"}, - {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:d0d6e22e4062c3d3c1bf3594baa2f67fc9dcdda8275abad99e468e0c6540bc54"}, - {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:079e62e64696241ac3f408e337aaac09137ed760ccf2b72b1094b48745c13641"}, - {file = "jiter-0.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74d2b56ed3da5760544df53b5f5c39782e68efb64dc3aa0bba4cc08815e6fae8"}, - {file = "jiter-0.8.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:798dafe108cba58a7bb0a50d4d5971f98bb7f3c974e1373e750de6eb21c1a329"}, - {file = "jiter-0.8.0-cp313-none-win32.whl", hash = "sha256:ca6d3064dfc743eb0d3d7539d89d4ba886957c717567adc72744341c1e3573c9"}, - {file = "jiter-0.8.0-cp313-none-win_amd64.whl", hash = "sha256:38caedda64fe1f04b06d7011fc15e86b3b837ed5088657bf778656551e3cd8f9"}, - {file = "jiter-0.8.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:bb5c8a0a8d081c338db22e5b8d53a89a121790569cbb85f7d3cfb1fe0fbe9836"}, - {file = "jiter-0.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:202dbe8970bfb166fab950eaab8f829c505730a0b33cc5e1cfb0a1c9dd56b2f9"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9046812e5671fdcfb9ae02881fff1f6a14d484b7e8b3316179a372cdfa1e8026"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6ac56425023e52d65150918ae25480d0a1ce2a6bf5ea2097f66a2cc50f6d692"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dfcf97210c6eab9d2a1c6af15dd39e1d5154b96a7145d0a97fa1df865b7b834"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4e3c8444d418686f78c9a547b9b90031faf72a0a1a46bfec7fb31edbd889c0d"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6507011a299b7f578559084256405a8428875540d8d13530e00b688e41b09493"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0aae4738eafdd34f0f25c2d3668ce9e8fa0d7cb75a2efae543c9a69aebc37323"}, - {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5d782e790396b13f2a7b36bdcaa3736a33293bdda80a4bf1a3ce0cd5ef9f15"}, - {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc7f993bc2c4e03015445adbb16790c303282fce2e8d9dc3a3905b1d40e50564"}, - {file = "jiter-0.8.0-cp38-none-win32.whl", hash = "sha256:d4a8a6eda018a991fa58ef707dd51524055d11f5acb2f516d70b1be1d15ab39c"}, - {file = "jiter-0.8.0-cp38-none-win_amd64.whl", hash = "sha256:4cca948a3eda8ea24ed98acb0ee19dc755b6ad2e570ec85e1527d5167f91ff67"}, - {file = "jiter-0.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ef89663678d8257063ce7c00d94638e05bd72f662c5e1eb0e07a172e6c1a9a9f"}, - {file = "jiter-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c402ddcba90b4cc71db3216e8330f4db36e0da2c78cf1d8a9c3ed8f272602a94"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6dfe795b7a173a9f8ba7421cdd92193d60c1c973bbc50dc3758a9ad0fa5eb6"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ec29a31b9abd6be39453a2c45da067138a3005d65d2c0507c530e0f1fdcd9a4"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a488f8c54bddc3ddefaf3bfd6de4a52c97fc265d77bc2dcc6ee540c17e8c342"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aeb5561adf4d26ca0d01b5811b4d7b56a8986699a473d700757b4758ef787883"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab961858d7ad13132328517d29f121ae1b2d94502191d6bcf96bddcc8bb5d1c"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a207e718d114d23acf0850a2174d290f42763d955030d9924ffa4227dbd0018f"}, - {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:733bc9dc8ff718a0ae4695239e9268eb93e88b73b367dfac3ec227d8ce2f1e77"}, - {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1ec27299e22d05e13a06e460bf7f75f26f9aaa0e0fb7d060f40e88df1d81faa"}, - {file = "jiter-0.8.0-cp39-none-win32.whl", hash = "sha256:e8dbfcb46553e6661d3fc1f33831598fcddf73d0f67834bce9fc3e9ebfe5c439"}, - {file = "jiter-0.8.0-cp39-none-win_amd64.whl", hash = "sha256:af2ce2487b3a93747e2cb5150081d4ae1e5874fce5924fc1a12e9e768e489ad8"}, - {file = "jiter-0.8.0.tar.gz", hash = "sha256:86fee98b569d4cc511ff2e3ec131354fafebd9348a487549c31ad371ae730310"}, - {file = "jiter-0.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:dee4eeb293ffcd2c3b31ebab684dbf7f7b71fe198f8eddcdf3a042cc6e10205a"}, - {file = "jiter-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aad1e6e9b01cf0304dcee14db03e92e0073287a6297caf5caf2e9dbfea16a924"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:504099fb7acdbe763e10690d560a25d4aee03d918d6a063f3a761d8a09fb833f"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2373487caad7fe39581f588ab5c9262fc1ade078d448626fec93f4ffba528858"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c341ecc3f9bccde952898b0c97c24f75b84b56a7e2f8bbc7c8e38cab0875a027"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e48e7a336529b9419d299b70c358d4ebf99b8f4b847ed3f1000ec9f320e8c0c"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5ee157a8afd2943be690db679f82fafb8d347a8342e8b9c34863de30c538d55"}, - {file = "jiter-0.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d7dceae3549b80087f913aad4acc2a7c1e0ab7cb983effd78bdc9c41cabdcf18"}, - {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e29e9ecce53d396772590438214cac4ab89776f5e60bd30601f1050b34464019"}, - {file = "jiter-0.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fa1782f22d5f92c620153133f35a9a395d3f3823374bceddd3e7032e2fdfa0b1"}, - {file = "jiter-0.8.0-cp310-none-win32.whl", hash = "sha256:f754ef13b4e4f67a3bf59fe974ef4342523801c48bf422f720bd37a02a360584"}, - {file = "jiter-0.8.0-cp310-none-win_amd64.whl", hash = "sha256:796f750b65f5d605f5e7acaccc6b051675e60c41d7ac3eab40dbd7b5b81a290f"}, - {file = "jiter-0.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f6f4e645efd96b4690b9b6091dbd4e0fa2885ba5c57a0305c1916b75b4f30ff6"}, - {file = "jiter-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f61cf6d93c1ade9b8245c9f14b7900feadb0b7899dbe4aa8de268b705647df81"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0396bc5cb1309c6dab085e70bb3913cdd92218315e47b44afe9eace68ee8adaa"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62d0e42ec5dc772bd8554a304358220be5d97d721c4648b23f3a9c01ccc2cb26"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec4b711989860705733fc59fb8c41b2def97041cea656b37cf6c8ea8dee1c3f4"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859cc35bf304ab066d88f10a44a3251a9cd057fb11ec23e00be22206db878f4f"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5000195921aa293b39b9b5bc959d7fa658e7f18f938c0e52732da8e3cc70a278"}, - {file = "jiter-0.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36050284c0abde57aba34964d3920f3d6228211b65df7187059bb7c7f143759a"}, - {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a88f608e050cfe45c48d771e86ecdbf5258314c883c986d4217cc79e1fb5f689"}, - {file = "jiter-0.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:646cf4237665b2e13b4159d8f26d53f59bc9f2e6e135e3a508a2e5dd26d978c6"}, - {file = "jiter-0.8.0-cp311-none-win32.whl", hash = "sha256:21fe5b8345db1b3023052b2ade9bb4d369417827242892051244af8fae8ba231"}, - {file = "jiter-0.8.0-cp311-none-win_amd64.whl", hash = "sha256:30c2161c5493acf6b6c3c909973fb64ae863747def01cc7574f3954e0a15042c"}, - {file = "jiter-0.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d91a52d8f49ada2672a4b808a0c5c25d28f320a2c9ca690e30ebd561eb5a1002"}, - {file = "jiter-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c38cf25cf7862f61410b7a49684d34eb3b5bcbd7ddaf4773eea40e0bd43de706"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6189beb5c4b3117624be6b2e84545cff7611f5855d02de2d06ff68e316182be"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e13fa849c0e30643554add089983caa82f027d69fad8f50acadcb21c462244ab"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7765ca159d0a58e8e0f8ca972cd6d26a33bc97b4480d0d2309856763807cd28"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b0befe7c6e9fc867d5bed21bab0131dfe27d1fa5cd52ba2bced67da33730b7d"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7d6363d4c6f1052b1d8b494eb9a72667c3ef5f80ebacfe18712728e85327000"}, - {file = "jiter-0.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a873e57009863eeac3e3969e4653f07031d6270d037d6224415074ac17e5505c"}, - {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2582912473c0d9940791479fe1bf2976a34f212eb8e0a82ee9e645ac275c5d16"}, - {file = "jiter-0.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:646163201af42f55393ee6e8f6136b8df488253a6533f4230a64242ecbfe6048"}, - {file = "jiter-0.8.0-cp312-none-win32.whl", hash = "sha256:96e75c9abfbf7387cba89a324d2356d86d8897ac58c956017d062ad510832dae"}, - {file = "jiter-0.8.0-cp312-none-win_amd64.whl", hash = "sha256:ed6074552b4a32e047b52dad5ab497223721efbd0e9efe68c67749f094a092f7"}, - {file = "jiter-0.8.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:dd5e351cb9b3e676ec3360a85ea96def515ad2b83c8ae3a251ce84985a2c9a6f"}, - {file = "jiter-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba9f12b0f801ecd5ed0cec29041dc425d1050922b434314c592fc30d51022467"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7ba461c3681728d556392e8ae56fb44a550155a24905f01982317b367c21dd4"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a15ed47ab09576db560dbc5c2c5a64477535beb056cd7d997d5dd0f2798770e"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cef55042816d0737142b0ec056c0356a5f681fb8d6aa8499b158e87098f4c6f8"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:549f170215adeb5e866f10617c3d019d8eb4e6d4e3c6b724b3b8c056514a3487"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f867edeb279d22020877640d2ea728de5817378c60a51be8af731a8a8f525306"}, - {file = "jiter-0.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aef8845f463093799db4464cee2aa59d61aa8edcb3762aaa4aacbec3f478c929"}, - {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:d0d6e22e4062c3d3c1bf3594baa2f67fc9dcdda8275abad99e468e0c6540bc54"}, - {file = "jiter-0.8.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:079e62e64696241ac3f408e337aaac09137ed760ccf2b72b1094b48745c13641"}, - {file = "jiter-0.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74d2b56ed3da5760544df53b5f5c39782e68efb64dc3aa0bba4cc08815e6fae8"}, - {file = "jiter-0.8.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:798dafe108cba58a7bb0a50d4d5971f98bb7f3c974e1373e750de6eb21c1a329"}, - {file = "jiter-0.8.0-cp313-none-win32.whl", hash = "sha256:ca6d3064dfc743eb0d3d7539d89d4ba886957c717567adc72744341c1e3573c9"}, - {file = "jiter-0.8.0-cp313-none-win_amd64.whl", hash = "sha256:38caedda64fe1f04b06d7011fc15e86b3b837ed5088657bf778656551e3cd8f9"}, - {file = "jiter-0.8.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:bb5c8a0a8d081c338db22e5b8d53a89a121790569cbb85f7d3cfb1fe0fbe9836"}, - {file = "jiter-0.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:202dbe8970bfb166fab950eaab8f829c505730a0b33cc5e1cfb0a1c9dd56b2f9"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9046812e5671fdcfb9ae02881fff1f6a14d484b7e8b3316179a372cdfa1e8026"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e6ac56425023e52d65150918ae25480d0a1ce2a6bf5ea2097f66a2cc50f6d692"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7dfcf97210c6eab9d2a1c6af15dd39e1d5154b96a7145d0a97fa1df865b7b834"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4e3c8444d418686f78c9a547b9b90031faf72a0a1a46bfec7fb31edbd889c0d"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6507011a299b7f578559084256405a8428875540d8d13530e00b688e41b09493"}, - {file = "jiter-0.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0aae4738eafdd34f0f25c2d3668ce9e8fa0d7cb75a2efae543c9a69aebc37323"}, - {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f5d782e790396b13f2a7b36bdcaa3736a33293bdda80a4bf1a3ce0cd5ef9f15"}, - {file = "jiter-0.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cc7f993bc2c4e03015445adbb16790c303282fce2e8d9dc3a3905b1d40e50564"}, - {file = "jiter-0.8.0-cp38-none-win32.whl", hash = "sha256:d4a8a6eda018a991fa58ef707dd51524055d11f5acb2f516d70b1be1d15ab39c"}, - {file = "jiter-0.8.0-cp38-none-win_amd64.whl", hash = "sha256:4cca948a3eda8ea24ed98acb0ee19dc755b6ad2e570ec85e1527d5167f91ff67"}, - {file = "jiter-0.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:ef89663678d8257063ce7c00d94638e05bd72f662c5e1eb0e07a172e6c1a9a9f"}, - {file = "jiter-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c402ddcba90b4cc71db3216e8330f4db36e0da2c78cf1d8a9c3ed8f272602a94"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a6dfe795b7a173a9f8ba7421cdd92193d60c1c973bbc50dc3758a9ad0fa5eb6"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ec29a31b9abd6be39453a2c45da067138a3005d65d2c0507c530e0f1fdcd9a4"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a488f8c54bddc3ddefaf3bfd6de4a52c97fc265d77bc2dcc6ee540c17e8c342"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aeb5561adf4d26ca0d01b5811b4d7b56a8986699a473d700757b4758ef787883"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab961858d7ad13132328517d29f121ae1b2d94502191d6bcf96bddcc8bb5d1c"}, - {file = "jiter-0.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a207e718d114d23acf0850a2174d290f42763d955030d9924ffa4227dbd0018f"}, - {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:733bc9dc8ff718a0ae4695239e9268eb93e88b73b367dfac3ec227d8ce2f1e77"}, - {file = "jiter-0.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1ec27299e22d05e13a06e460bf7f75f26f9aaa0e0fb7d060f40e88df1d81faa"}, - {file = "jiter-0.8.0-cp39-none-win32.whl", hash = "sha256:e8dbfcb46553e6661d3fc1f33831598fcddf73d0f67834bce9fc3e9ebfe5c439"}, - {file = "jiter-0.8.0-cp39-none-win_amd64.whl", hash = "sha256:af2ce2487b3a93747e2cb5150081d4ae1e5874fce5924fc1a12e9e768e489ad8"}, - {file = "jiter-0.8.0.tar.gz", hash = "sha256:86fee98b569d4cc511ff2e3ec131354fafebd9348a487549c31ad371ae730310"}, + {file = "jiter-0.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ca8577f6a413abe29b079bc30f907894d7eb07a865c4df69475e868d73e71c7b"}, + {file = "jiter-0.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b25bd626bde7fb51534190c7e3cb97cee89ee76b76d7585580e22f34f5e3f393"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c826a221851a8dc028eb6d7d6429ba03184fa3c7e83ae01cd6d3bd1d4bd17d"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d35c864c2dff13dfd79fb070fc4fc6235d7b9b359efe340e1261deb21b9fcb66"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f557c55bc2b7676e74d39d19bcb8775ca295c7a028246175d6a8b431e70835e5"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:580ccf358539153db147e40751a0b41688a5ceb275e6f3e93d91c9467f42b2e3"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af102d3372e917cffce49b521e4c32c497515119dc7bd8a75665e90a718bbf08"}, + {file = "jiter-0.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cadcc978f82397d515bb2683fc0d50103acff2a180552654bb92d6045dec2c49"}, + {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba5bdf56969cad2019d4e8ffd3f879b5fdc792624129741d3d83fc832fef8c7d"}, + {file = "jiter-0.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3b94a33a241bee9e34b8481cdcaa3d5c2116f575e0226e421bed3f7a6ea71cff"}, + {file = "jiter-0.8.2-cp310-cp310-win32.whl", hash = "sha256:6e5337bf454abddd91bd048ce0dca5134056fc99ca0205258766db35d0a2ea43"}, + {file = "jiter-0.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:4a9220497ca0cb1fe94e3f334f65b9b5102a0b8147646118f020d8ce1de70105"}, + {file = "jiter-0.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2dd61c5afc88a4fda7d8b2cf03ae5947c6ac7516d32b7a15bf4b49569a5c076b"}, + {file = "jiter-0.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6c710d657c8d1d2adbbb5c0b0c6bfcec28fd35bd6b5f016395f9ac43e878a15"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9584de0cd306072635fe4b89742bf26feae858a0683b399ad0c2509011b9dc0"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a90a923338531b7970abb063cfc087eebae6ef8ec8139762007188f6bc69a9f"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21974d246ed0181558087cd9f76e84e8321091ebfb3a93d4c341479a736f099"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32475a42b2ea7b344069dc1e81445cfc00b9d0e3ca837f0523072432332e9f74"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9931fd36ee513c26b5bf08c940b0ac875de175341cbdd4fa3be109f0492586"}, + {file = "jiter-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0820f4a3a59ddced7fce696d86a096d5cc48d32a4183483a17671a61edfddc"}, + {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ffc86ae5e3e6a93765d49d1ab47b6075a9c978a2b3b80f0f32628f39caa0c88"}, + {file = "jiter-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5127dc1abd809431172bc3fbe8168d6b90556a30bb10acd5ded41c3cfd6f43b6"}, + {file = "jiter-0.8.2-cp311-cp311-win32.whl", hash = "sha256:66227a2c7b575720c1871c8800d3a0122bb8ee94edb43a5685aa9aceb2782d44"}, + {file = "jiter-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:cde031d8413842a1e7501e9129b8e676e62a657f8ec8166e18a70d94d4682855"}, + {file = "jiter-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e6ec2be506e7d6f9527dae9ff4b7f54e68ea44a0ef6b098256ddf895218a2f8f"}, + {file = "jiter-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76e324da7b5da060287c54f2fabd3db5f76468006c811831f051942bf68c9d44"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:180a8aea058f7535d1c84183c0362c710f4750bef66630c05f40c93c2b152a0f"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025337859077b41548bdcbabe38698bcd93cfe10b06ff66617a48ff92c9aec60"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecff0dc14f409599bbcafa7e470c00b80f17abc14d1405d38ab02e4b42e55b57"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd9fee7d0775ebaba131f7ca2e2d83839a62ad65e8e02fe2bd8fc975cedeb9e"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14601dcac4889e0a1c75ccf6a0e4baf70dbc75041e51bcf8d0e9274519df6887"}, + {file = "jiter-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92249669925bc1c54fcd2ec73f70f2c1d6a817928480ee1c65af5f6b81cdf12d"}, + {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e725edd0929fa79f8349ab4ec7f81c714df51dc4e991539a578e5018fa4a7152"}, + {file = "jiter-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bf55846c7b7a680eebaf9c3c48d630e1bf51bdf76c68a5f654b8524335b0ad29"}, + {file = "jiter-0.8.2-cp312-cp312-win32.whl", hash = "sha256:7efe4853ecd3d6110301665a5178b9856be7e2a9485f49d91aa4d737ad2ae49e"}, + {file = "jiter-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:83c0efd80b29695058d0fd2fa8a556490dbce9804eac3e281f373bbc99045f6c"}, + {file = "jiter-0.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ca1f08b8e43dc3bd0594c992fb1fd2f7ce87f7bf0d44358198d6da8034afdf84"}, + {file = "jiter-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5672a86d55416ccd214c778efccf3266b84f87b89063b582167d803246354be4"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58dc9bc9767a1101f4e5e22db1b652161a225874d66f0e5cb8e2c7d1c438b587"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37b2998606d6dadbb5ccda959a33d6a5e853252d921fec1792fc902351bb4e2c"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab9a87f3784eb0e098f84a32670cfe4a79cb6512fd8f42ae3d0709f06405d18"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79aec8172b9e3c6d05fd4b219d5de1ac616bd8da934107325a6c0d0e866a21b6"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:711e408732d4e9a0208008e5892c2966b485c783cd2d9a681f3eb147cf36c7ef"}, + {file = "jiter-0.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:653cf462db4e8c41995e33d865965e79641ef45369d8a11f54cd30888b7e6ff1"}, + {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:9c63eaef32b7bebac8ebebf4dabebdbc6769a09c127294db6babee38e9f405b9"}, + {file = "jiter-0.8.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:eb21aaa9a200d0a80dacc7a81038d2e476ffe473ffdd9c91eb745d623561de05"}, + {file = "jiter-0.8.2-cp313-cp313-win32.whl", hash = "sha256:789361ed945d8d42850f919342a8665d2dc79e7e44ca1c97cc786966a21f627a"}, + {file = "jiter-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:ab7f43235d71e03b941c1630f4b6e3055d46b6cb8728a17663eaac9d8e83a865"}, + {file = "jiter-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b426f72cd77da3fec300ed3bc990895e2dd6b49e3bfe6c438592a3ba660e41ca"}, + {file = "jiter-0.8.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2dd880785088ff2ad21ffee205e58a8c1ddabc63612444ae41e5e4b321b39c0"}, + {file = "jiter-0.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:3ac9f578c46f22405ff7f8b1f5848fb753cc4b8377fbec8470a7dc3997ca7566"}, + {file = "jiter-0.8.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9e1fa156ee9454642adb7e7234a383884452532bc9d53d5af2d18d98ada1d79c"}, + {file = "jiter-0.8.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0cf5dfa9956d96ff2efb0f8e9c7d055904012c952539a774305aaaf3abdf3d6c"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e52bf98c7e727dd44f7c4acb980cb988448faeafed8433c867888268899b298b"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a2ecaa3c23e7a7cf86d00eda3390c232f4d533cd9ddea4b04f5d0644faf642c5"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08d4c92bf480e19fc3f2717c9ce2aa31dceaa9163839a311424b6862252c943e"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99d9a1eded738299ba8e106c6779ce5c3893cffa0e32e4485d680588adae6db8"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20be8b7f606df096e08b0b1b4a3c6f0515e8dac296881fe7461dfa0fb5ec817"}, + {file = "jiter-0.8.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d33f94615fcaf872f7fd8cd98ac3b429e435c77619777e8a449d9d27e01134d1"}, + {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:317b25e98a35ffec5c67efe56a4e9970852632c810d35b34ecdd70cc0e47b3b6"}, + {file = "jiter-0.8.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc9043259ee430ecd71d178fccabd8c332a3bf1e81e50cae43cc2b28d19e4cb7"}, + {file = "jiter-0.8.2-cp38-cp38-win32.whl", hash = "sha256:fc5adda618205bd4678b146612ce44c3cbfdee9697951f2c0ffdef1f26d72b63"}, + {file = "jiter-0.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cd646c827b4f85ef4a78e4e58f4f5854fae0caf3db91b59f0d73731448a970c6"}, + {file = "jiter-0.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e41e75344acef3fc59ba4765df29f107f309ca9e8eace5baacabd9217e52a5ee"}, + {file = "jiter-0.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f22b16b35d5c1df9dfd58843ab2cd25e6bf15191f5a236bed177afade507bfc"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7200b8f7619d36aa51c803fd52020a2dfbea36ffec1b5e22cab11fd34d95a6d"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70bf4c43652cc294040dbb62256c83c8718370c8b93dd93d934b9a7bf6c4f53c"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9d471356dc16f84ed48768b8ee79f29514295c7295cb41e1133ec0b2b8d637d"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859e8eb3507894093d01929e12e267f83b1d5f6221099d3ec976f0c995cb6bd9"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa58399c01db555346647a907b4ef6d4f584b123943be6ed5588c3f2359c9f4"}, + {file = "jiter-0.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f2d5ed877f089862f4c7aacf3a542627c1496f972a34d0474ce85ee7d939c27"}, + {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:03c9df035d4f8d647f8c210ddc2ae0728387275340668fb30d2421e17d9a0841"}, + {file = "jiter-0.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8bd2a824d08d8977bb2794ea2682f898ad3d8837932e3a74937e93d62ecbb637"}, + {file = "jiter-0.8.2-cp39-cp39-win32.whl", hash = "sha256:ca29b6371ebc40e496995c94b988a101b9fbbed48a51190a4461fcb0a68b4a36"}, + {file = "jiter-0.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1c0dfbd1be3cbefc7510102370d86e35d1d53e5a93d48519688b1bf0f761160a"}, + {file = "jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d"}, ] [[package]] @@ -1989,24 +1652,17 @@ files = [ [[package]] name = "json5" version = "0.10.0" -version = "0.10.0" description = "A Python implementation of the JSON5 data format." optional = false python-versions = ">=3.8.0" -python-versions = ">=3.8.0" files = [ {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, - {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, - {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, ] [package.extras] dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"] -[package.extras] -dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"] - [[package]] name = "jsonpointer" version = "3.0.0" @@ -2242,22 +1898,18 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.3.2" -version = "4.3.2" +version = "4.3.3" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.3.2-py3-none-any.whl", hash = "sha256:e87100cbab8b886ff7a4f325c856100ba6fdfe916162a85409daf0e707e19d1d"}, - {file = "jupyterlab-4.3.2.tar.gz", hash = "sha256:3c0a6882dbddcc0a7bfdd5e2236f351b2b263e48780236e6996c2aca13ac5b22"}, - {file = "jupyterlab-4.3.2-py3-none-any.whl", hash = "sha256:e87100cbab8b886ff7a4f325c856100ba6fdfe916162a85409daf0e707e19d1d"}, - {file = "jupyterlab-4.3.2.tar.gz", hash = "sha256:3c0a6882dbddcc0a7bfdd5e2236f351b2b263e48780236e6996c2aca13ac5b22"}, + {file = "jupyterlab-4.3.3-py3-none-any.whl", hash = "sha256:32a8fd30677e734ffcc3916a4758b9dab21b02015b668c60eb36f84357b7d4b1"}, + {file = "jupyterlab-4.3.3.tar.gz", hash = "sha256:76fa39e548fdac94dc1204af5956c556f54c785f70ee26aa47ea08eda4d5bbcd"}, ] [package.dependencies] async-lru = ">=1.0.0" -httpx = ">=0.28.0,<0.29.0" -httpx = ">=0.28.0,<0.29.0" +httpx = ">=0.25.0" ipykernel = ">=6.5.0" jinja2 = ">=3.0.3" jupyter-core = "*" @@ -2267,7 +1919,6 @@ jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2" packaging = "*" setuptools = ">=40.8.0" -setuptools = ">=40.8.0" tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} tornado = ">=6.2.0" traitlets = "*" @@ -2328,13 +1979,13 @@ files = [ [[package]] name = "jupytext" -version = "1.16.4" +version = "1.16.5" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.4-py3-none-any.whl", hash = "sha256:76989d2690e65667ea6fb411d8056abe7cd0437c07bd774660b83d62acf9490a"}, - {file = "jupytext-1.16.4.tar.gz", hash = "sha256:28e33f46f2ce7a41fb9d677a4a2c95327285579b64ca104437c4b9eb1e4174e9"}, + {file = "jupytext-1.16.5-py3-none-any.whl", hash = "sha256:0c96841e364b0ac401e7f45ee67ee523d69eb7bee59476b8ee96ba39fc964491"}, + {file = "jupytext-1.16.5.tar.gz", hash = "sha256:2d5f896f11ebee8342f0f5f9c4818a336e12db164bcaec009ea612cd5dc2caa8"}, ] [package.dependencies] @@ -2346,11 +1997,11 @@ pyyaml = "*" tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx (<8)", "sphinx-gallery (<0.8)"] docs = ["myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] test = ["pytest", "pytest-randomly", "pytest-xdist"] test-cov = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist"] -test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx (<8)", "sphinx-gallery (<0.8)"] test-functional = ["pytest", "pytest-randomly", "pytest-xdist"] test-integration = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-randomly", "pytest-xdist"] test-ui = ["calysto-bash"] @@ -2669,94 +2320,45 @@ tests = ["pytest", "simplejson"] [[package]] name = "matplotlib" -version = "3.9.3" -version = "3.9.3" +version = "3.10.0" description = "Python plotting package" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "matplotlib-3.9.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:41b016e3be4e740b66c79a031a0a6e145728dbc248142e751e8dab4f3188ca1d"}, - {file = "matplotlib-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e0143975fc2a6d7136c97e19c637321288371e8f09cff2564ecd73e865ea0b9"}, - {file = "matplotlib-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f459c8ee2c086455744723628264e43c884be0c7d7b45d84b8cd981310b4815"}, - {file = "matplotlib-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687df7ceff57b8f070d02b4db66f75566370e7ae182a0782b6d3d21b0d6917dc"}, - {file = "matplotlib-3.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:edd14cf733fdc4f6e6fe3f705af97676a7e52859bf0044aa2c84e55be739241c"}, - {file = "matplotlib-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c40c244221a1adbb1256692b1133c6fb89418df27bf759a31a333e7912a4010"}, - {file = "matplotlib-3.9.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:cf2a60daf6cecff6828bc608df00dbc794380e7234d2411c0ec612811f01969d"}, - {file = "matplotlib-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:213d6dc25ce686516208d8a3e91120c6a4fdae4a3e06b8505ced5b716b50cc04"}, - {file = "matplotlib-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c52f48eb75fcc119a4fdb68ba83eb5f71656999420375df7c94cc68e0e14686e"}, - {file = "matplotlib-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c93796b44fa111049b88a24105e947f03c01966b5c0cc782e2ee3887b790a3"}, - {file = "matplotlib-3.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cd1077b9a09b16d8c3c7075a8add5ffbfe6a69156a57e290c800ed4d435bef1d"}, - {file = "matplotlib-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:c96eeeb8c68b662c7747f91a385688d4b449687d29b691eff7068a4602fe6dc4"}, - {file = "matplotlib-3.9.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0a361bd5583bf0bcc08841df3c10269617ee2a36b99ac39d455a767da908bbbc"}, - {file = "matplotlib-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e14485bb1b83eeb3d55b6878f9560240981e7bbc7a8d4e1e8c38b9bd6ec8d2de"}, - {file = "matplotlib-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a8d279f78844aad213c4935c18f8292a9432d51af2d88bca99072c903948045"}, - {file = "matplotlib-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6c12514329ac0d03128cf1dcceb335f4fbf7c11da98bca68dca8dcb983153a9"}, - {file = "matplotlib-3.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6e9de2b390d253a508dd497e9b5579f3a851f208763ed67fdca5dc0c3ea6849c"}, - {file = "matplotlib-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d796272408f8567ff7eaa00eb2856b3a00524490e47ad505b0b4ca6bb8a7411f"}, - {file = "matplotlib-3.9.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:203d18df84f5288973b2d56de63d4678cc748250026ca9e1ad8f8a0fd8a75d83"}, - {file = "matplotlib-3.9.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b651b0d3642991259109dc0351fc33ad44c624801367bb8307be9bfc35e427ad"}, - {file = "matplotlib-3.9.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66d7b171fecf96940ce069923a08ba3df33ef542de82c2ff4fe8caa8346fa95a"}, - {file = "matplotlib-3.9.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be0ba61f6ff2e6b68e4270fb63b6813c9e7dec3d15fc3a93f47480444fd72f0"}, - {file = "matplotlib-3.9.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d6b2e8856dec3a6db1ae51aec85c82223e834b228c1d3228aede87eee2b34f9"}, - {file = "matplotlib-3.9.3-cp313-cp313-win_amd64.whl", hash = "sha256:90a85a004fefed9e583597478420bf904bb1a065b0b0ee5b9d8d31b04b0f3f70"}, - {file = "matplotlib-3.9.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3119b2f16de7f7b9212ba76d8fe6a0e9f90b27a1e04683cd89833a991682f639"}, - {file = "matplotlib-3.9.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:87ad73763d93add1b6c1f9fcd33af662fd62ed70e620c52fcb79f3ac427cf3a6"}, - {file = "matplotlib-3.9.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:026bdf3137ab6022c866efa4813b6bbeddc2ed4c9e7e02f0e323a7bca380dfa0"}, - {file = "matplotlib-3.9.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760a5e89ebbb172989e8273024a1024b0f084510b9105261b3b00c15e9c9f006"}, - {file = "matplotlib-3.9.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a42b9dc42de2cfe357efa27d9c50c7833fc5ab9b2eb7252ccd5d5f836a84e1e4"}, - {file = "matplotlib-3.9.3-cp313-cp313t-win_amd64.whl", hash = "sha256:e0fcb7da73fbf67b5f4bdaa57d85bb585a4e913d4a10f3e15b32baea56a67f0a"}, - {file = "matplotlib-3.9.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:031b7f5b8e595cc07def77ec5b58464e9bb67dc5760be5d6f26d9da24892481d"}, - {file = "matplotlib-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fa6e193c14d6944e0685cdb527cb6b38b0e4a518043e7212f214113af7391da"}, - {file = "matplotlib-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e6eefae6effa0c35bbbc18c25ee6e0b1da44d2359c3cd526eb0c9e703cf055d"}, - {file = "matplotlib-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d3e5c7a99bd28afb957e1ae661323b0800d75b419f24d041ed1cc5d844a764"}, - {file = "matplotlib-3.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:816a966d5d376bf24c92af8f379e78e67278833e4c7cbc9fa41872eec629a060"}, - {file = "matplotlib-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fb0b37c896172899a4a93d9442ffdc6f870165f59e05ce2e07c6fded1c15749"}, - {file = "matplotlib-3.9.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f2a4ea08e6876206d511365b0bc234edc813d90b930be72c3011bbd7898796f"}, - {file = "matplotlib-3.9.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9b081dac96ab19c54fd8558fac17c9d2c9cb5cc4656e7ed3261ddc927ba3e2c5"}, - {file = "matplotlib-3.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a0a63cb8404d1d1f94968ef35738900038137dab8af836b6c21bb6f03d75465"}, - {file = "matplotlib-3.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:896774766fd6be4571a43bc2fcbcb1dcca0807e53cab4a5bf88c4aa861a08e12"}, - {file = "matplotlib-3.9.3.tar.gz", hash = "sha256:cd5dbbc8e25cad5f706845c4d100e2c8b34691b412b93717ce38d8ae803bcfa5"}, - {file = "matplotlib-3.9.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:41b016e3be4e740b66c79a031a0a6e145728dbc248142e751e8dab4f3188ca1d"}, - {file = "matplotlib-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e0143975fc2a6d7136c97e19c637321288371e8f09cff2564ecd73e865ea0b9"}, - {file = "matplotlib-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f459c8ee2c086455744723628264e43c884be0c7d7b45d84b8cd981310b4815"}, - {file = "matplotlib-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687df7ceff57b8f070d02b4db66f75566370e7ae182a0782b6d3d21b0d6917dc"}, - {file = "matplotlib-3.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:edd14cf733fdc4f6e6fe3f705af97676a7e52859bf0044aa2c84e55be739241c"}, - {file = "matplotlib-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c40c244221a1adbb1256692b1133c6fb89418df27bf759a31a333e7912a4010"}, - {file = "matplotlib-3.9.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:cf2a60daf6cecff6828bc608df00dbc794380e7234d2411c0ec612811f01969d"}, - {file = "matplotlib-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:213d6dc25ce686516208d8a3e91120c6a4fdae4a3e06b8505ced5b716b50cc04"}, - {file = "matplotlib-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c52f48eb75fcc119a4fdb68ba83eb5f71656999420375df7c94cc68e0e14686e"}, - {file = "matplotlib-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c93796b44fa111049b88a24105e947f03c01966b5c0cc782e2ee3887b790a3"}, - {file = "matplotlib-3.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cd1077b9a09b16d8c3c7075a8add5ffbfe6a69156a57e290c800ed4d435bef1d"}, - {file = "matplotlib-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:c96eeeb8c68b662c7747f91a385688d4b449687d29b691eff7068a4602fe6dc4"}, - {file = "matplotlib-3.9.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0a361bd5583bf0bcc08841df3c10269617ee2a36b99ac39d455a767da908bbbc"}, - {file = "matplotlib-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e14485bb1b83eeb3d55b6878f9560240981e7bbc7a8d4e1e8c38b9bd6ec8d2de"}, - {file = "matplotlib-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a8d279f78844aad213c4935c18f8292a9432d51af2d88bca99072c903948045"}, - {file = "matplotlib-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6c12514329ac0d03128cf1dcceb335f4fbf7c11da98bca68dca8dcb983153a9"}, - {file = "matplotlib-3.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6e9de2b390d253a508dd497e9b5579f3a851f208763ed67fdca5dc0c3ea6849c"}, - {file = "matplotlib-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d796272408f8567ff7eaa00eb2856b3a00524490e47ad505b0b4ca6bb8a7411f"}, - {file = "matplotlib-3.9.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:203d18df84f5288973b2d56de63d4678cc748250026ca9e1ad8f8a0fd8a75d83"}, - {file = "matplotlib-3.9.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b651b0d3642991259109dc0351fc33ad44c624801367bb8307be9bfc35e427ad"}, - {file = "matplotlib-3.9.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66d7b171fecf96940ce069923a08ba3df33ef542de82c2ff4fe8caa8346fa95a"}, - {file = "matplotlib-3.9.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6be0ba61f6ff2e6b68e4270fb63b6813c9e7dec3d15fc3a93f47480444fd72f0"}, - {file = "matplotlib-3.9.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d6b2e8856dec3a6db1ae51aec85c82223e834b228c1d3228aede87eee2b34f9"}, - {file = "matplotlib-3.9.3-cp313-cp313-win_amd64.whl", hash = "sha256:90a85a004fefed9e583597478420bf904bb1a065b0b0ee5b9d8d31b04b0f3f70"}, - {file = "matplotlib-3.9.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3119b2f16de7f7b9212ba76d8fe6a0e9f90b27a1e04683cd89833a991682f639"}, - {file = "matplotlib-3.9.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:87ad73763d93add1b6c1f9fcd33af662fd62ed70e620c52fcb79f3ac427cf3a6"}, - {file = "matplotlib-3.9.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:026bdf3137ab6022c866efa4813b6bbeddc2ed4c9e7e02f0e323a7bca380dfa0"}, - {file = "matplotlib-3.9.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:760a5e89ebbb172989e8273024a1024b0f084510b9105261b3b00c15e9c9f006"}, - {file = "matplotlib-3.9.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a42b9dc42de2cfe357efa27d9c50c7833fc5ab9b2eb7252ccd5d5f836a84e1e4"}, - {file = "matplotlib-3.9.3-cp313-cp313t-win_amd64.whl", hash = "sha256:e0fcb7da73fbf67b5f4bdaa57d85bb585a4e913d4a10f3e15b32baea56a67f0a"}, - {file = "matplotlib-3.9.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:031b7f5b8e595cc07def77ec5b58464e9bb67dc5760be5d6f26d9da24892481d"}, - {file = "matplotlib-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fa6e193c14d6944e0685cdb527cb6b38b0e4a518043e7212f214113af7391da"}, - {file = "matplotlib-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e6eefae6effa0c35bbbc18c25ee6e0b1da44d2359c3cd526eb0c9e703cf055d"}, - {file = "matplotlib-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d3e5c7a99bd28afb957e1ae661323b0800d75b419f24d041ed1cc5d844a764"}, - {file = "matplotlib-3.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:816a966d5d376bf24c92af8f379e78e67278833e4c7cbc9fa41872eec629a060"}, - {file = "matplotlib-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fb0b37c896172899a4a93d9442ffdc6f870165f59e05ce2e07c6fded1c15749"}, - {file = "matplotlib-3.9.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f2a4ea08e6876206d511365b0bc234edc813d90b930be72c3011bbd7898796f"}, - {file = "matplotlib-3.9.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9b081dac96ab19c54fd8558fac17c9d2c9cb5cc4656e7ed3261ddc927ba3e2c5"}, - {file = "matplotlib-3.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a0a63cb8404d1d1f94968ef35738900038137dab8af836b6c21bb6f03d75465"}, - {file = "matplotlib-3.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:896774766fd6be4571a43bc2fcbcb1dcca0807e53cab4a5bf88c4aa861a08e12"}, - {file = "matplotlib-3.9.3.tar.gz", hash = "sha256:cd5dbbc8e25cad5f706845c4d100e2c8b34691b412b93717ce38d8ae803bcfa5"}, + {file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"}, + {file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:607b16c8a73943df110f99ee2e940b8a1cbf9714b65307c040d422558397dac5"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01d2b19f13aeec2e759414d3bfe19ddfb16b13a1250add08d46d5ff6f9be83c6"}, + {file = "matplotlib-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e6c6461e1fc63df30bf6f80f0b93f5b6784299f721bc28530477acd51bfc3d1"}, + {file = "matplotlib-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:994c07b9d9fe8d25951e3202a68c17900679274dadfc1248738dcfa1bd40d7f3"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fd44fc75522f58612ec4a33958a7e5552562b7705b42ef1b4f8c0818e304a363"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c58a9622d5dbeb668f407f35f4e6bfac34bb9ecdcc81680c04d0258169747997"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:845d96568ec873be63f25fa80e9e7fae4be854a66a7e2f0c8ccc99e94a8bd4ef"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5439f4c5a3e2e8eab18e2f8c3ef929772fd5641876db71f08127eed95ab64683"}, + {file = "matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4673ff67a36152c48ddeaf1135e74ce0d4bce1bbf836ae40ed39c29edf7e2765"}, + {file = "matplotlib-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e8632baebb058555ac0cde75db885c61f1212e47723d63921879806b40bec6a"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4659665bc7c9b58f8c00317c3c2a299f7f258eeae5a5d56b4c64226fca2f7c59"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d44cb942af1693cced2604c33a9abcef6205601c445f6d0dc531d813af8a2f5a"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a994f29e968ca002b50982b27168addfd65f0105610b6be7fa515ca4b5307c95"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0558bae37f154fffda54d779a592bc97ca8b4701f1c710055b609a3bac44c8"}, + {file = "matplotlib-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:503feb23bd8c8acc75541548a1d709c059b7184cde26314896e10a9f14df5f12"}, + {file = "matplotlib-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:c40ba2eb08b3f5de88152c2333c58cee7edcead0a2a0d60fcafa116b17117adc"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96f2886f5c1e466f21cc41b70c5a0cd47bfa0015eb2d5793c88ebce658600e25"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:12eaf48463b472c3c0f8dbacdbf906e573013df81a0ab82f0616ea4b11281908"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fbbabc82fde51391c4da5006f965e36d86d95f6ee83fb594b279564a4c5d0d2"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2e15300530c1a94c63cfa546e3b7864bd18ea2901317bae8bbf06a5ade6dcf"}, + {file = "matplotlib-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3547d153d70233a8496859097ef0312212e2689cdf8d7ed764441c77604095ae"}, + {file = "matplotlib-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c55b20591ced744aa04e8c3e4b7543ea4d650b6c3c4b208c08a05b4010e8b442"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ade1003376731a971e398cc4ef38bb83ee8caf0aee46ac6daa4b0506db1fd06"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95b710fea129c76d30be72c3b38f330269363fbc6e570a5dd43580487380b5ff"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdbaf909887373c3e094b0318d7ff230b2ad9dcb64da7ade654182872ab2593"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d907fddb39f923d011875452ff1eca29a9e7f21722b873e90db32e5d8ddff12e"}, + {file = "matplotlib-3.10.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3b427392354d10975c1d0f4ee18aa5844640b512d5311ef32efd4dd7db106ede"}, + {file = "matplotlib-3.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:81713dd0d103b379de4516b861d964b1d789a144103277769238c732229d7f03"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:359f87baedb1f836ce307f0e850d12bb5f1936f70d035561f90d41d305fdacea"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80dc3a4add4665cf2faa90138384a7ffe2a4e37c58d83e115b54287c4f06ef"}, + {file = "matplotlib-3.10.0.tar.gz", hash = "sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278"}, ] [package.dependencies] @@ -2771,8 +2373,7 @@ pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [package.extras] -dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] -dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] [[package]] name = "matplotlib-inline" @@ -2921,13 +2522,13 @@ pygments = ">2.12.0" [[package]] name = "mkdocs-material" -version = "9.5.47" +version = "9.5.49" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.47-py3-none-any.whl", hash = "sha256:53fb9c9624e7865da6ec807d116cd7be24b3cb36ab31b1d1d1a9af58c56009a2"}, - {file = "mkdocs_material-9.5.47.tar.gz", hash = "sha256:fc3b7a8e00ad896660bd3a5cc12ca0cb28bdc2bcbe2a946b5714c23ac91b0ede"}, + {file = "mkdocs_material-9.5.49-py3-none-any.whl", hash = "sha256:c3c2d8176b18198435d3a3e119011922f3e11424074645c24019c2dcf08a360e"}, + {file = "mkdocs_material-9.5.49.tar.gz", hash = "sha256:3671bb282b4f53a1c72e08adbe04d2481a98f85fed392530051f80ff94a9621d"}, ] [package.dependencies] @@ -2977,15 +2578,12 @@ typer = "==0.*" [[package]] name = "msal" version = "1.31.1" -version = "1.31.1" description = "The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of users with Microsoft Azure Active Directory accounts (AAD) and Microsoft Accounts (MSA) using industry standard OAuth2 and OpenID Connect." optional = false python-versions = ">=3.7" files = [ {file = "msal-1.31.1-py3-none-any.whl", hash = "sha256:29d9882de247e96db01386496d59f29035e5e841bcac892e6d7bf4390bf6bd17"}, {file = "msal-1.31.1.tar.gz", hash = "sha256:11b5e6a3f802ffd3a72107203e20c4eac6ef53401961b880af2835b723d80578"}, - {file = "msal-1.31.1-py3-none-any.whl", hash = "sha256:29d9882de247e96db01386496d59f29035e5e841bcac892e6d7bf4390bf6bd17"}, - {file = "msal-1.31.1.tar.gz", hash = "sha256:11b5e6a3f802ffd3a72107203e20c4eac6ef53401961b880af2835b723d80578"}, ] [package.dependencies] @@ -3014,15 +2612,12 @@ portalocker = ">=1.4,<3" [[package]] name = "nbclient" version = "0.10.1" -version = "0.10.1" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ {file = "nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d"}, {file = "nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68"}, - {file = "nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d"}, - {file = "nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68"}, ] [package.dependencies] @@ -3034,7 +2629,6 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] -docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] @@ -3164,23 +2758,18 @@ files = [ [[package]] name = "notebook" version = "7.3.1" -version = "7.3.1" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ {file = "notebook-7.3.1-py3-none-any.whl", hash = "sha256:212e1486b2230fe22279043f33c7db5cf9a01d29feb063a85cb139747b7c9483"}, {file = "notebook-7.3.1.tar.gz", hash = "sha256:84381c2a82d867517fd25b86e986dae1fe113a70b98f03edff9b94e499fec8fa"}, - {file = "notebook-7.3.1-py3-none-any.whl", hash = "sha256:212e1486b2230fe22279043f33c7db5cf9a01d29feb063a85cb139747b7c9483"}, - {file = "notebook-7.3.1.tar.gz", hash = "sha256:84381c2a82d867517fd25b86e986dae1fe113a70b98f03edff9b94e499fec8fa"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" jupyterlab = ">=4.3.2,<4.4" jupyterlab-server = ">=2.27.1,<3" -jupyterlab = ">=4.3.2,<4.4" -jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" @@ -3188,7 +2777,6 @@ tornado = ">=6.2.0" dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -3288,13 +2876,13 @@ files = [ [[package]] name = "openai" -version = "1.57.0" +version = "1.57.4" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.57.0-py3-none-any.whl", hash = "sha256:972e36960b821797952da3dc4532f486c28e28a2a332d7d0c5407f242e9d9c39"}, - {file = "openai-1.57.0.tar.gz", hash = "sha256:76f91971c4bdbd78380c9970581075e0337b5d497c2fbf7b5255078f4b31abf9"}, + {file = "openai-1.57.4-py3-none-any.whl", hash = "sha256:7def1ab2d52f196357ce31b9cfcf4181529ce00838286426bb35be81c035dafb"}, + {file = "openai-1.57.4.tar.gz", hash = "sha256:a8f071a3e9198e2818f63aade68e759417b9f62c0971bdb83de82504b70b77f7"}, ] [package.dependencies] @@ -3324,15 +2912,12 @@ files = [ [[package]] name = "packaging" version = "24.2" -version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] @@ -3487,16 +3072,12 @@ files = [ [[package]] name = "patsy" version = "1.0.1" -version = "1.0.1" description = "A Python package for describing statistical models and for building design matrices." optional = false python-versions = ">=3.6" -python-versions = ">=3.6" files = [ {file = "patsy-1.0.1-py2.py3-none-any.whl", hash = "sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c"}, {file = "patsy-1.0.1.tar.gz", hash = "sha256:e786a9391eec818c054e359b737bbce692f051aee4c661f4141cc88fb459c0c4"}, - {file = "patsy-1.0.1-py2.py3-none-any.whl", hash = "sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c"}, - {file = "patsy-1.0.1.tar.gz", hash = "sha256:e786a9391eec818c054e359b737bbce692f051aee4c661f4141cc88fb459c0c4"}, ] [package.dependencies] @@ -3683,7 +3264,6 @@ tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "p [[package]] name = "pot" version = "0.9.5" -version = "0.9.5" description = "Python Optimal Transport Library" optional = false python-versions = ">=3.7" @@ -3729,47 +3309,6 @@ files = [ {file = "POT-0.9.5-cp39-cp39-win32.whl", hash = "sha256:ceea4cffebce88211cd63bfddc878e2f29a6b6347125cbac40fa214308315878"}, {file = "POT-0.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:2f6af660505772833d4ccc189d9de264b429d9ec8e0cb564f33d2181e6f1bbce"}, {file = "pot-0.9.5.tar.gz", hash = "sha256:9644ee7ff51c3cffa3c2632b9dd9dff4f3520266f9fb771450935ffb646d6042"}, - {file = "POT-0.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:34d766c38e65a69c087b01a854fe89fbd152c3e8af93da2227b6c40aed6d37b9"}, - {file = "POT-0.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5407377256de11b6fdc94bbba9b50ea5a2301570905fc9014541cc8473806d9"}, - {file = "POT-0.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f37039cd356198c1fb994e7d935b9bf75d44f2a40319d298bf8cc149eb360d5"}, - {file = "POT-0.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00a18427c9abdd107a2285ea0a814c6b22e95a1af8f88a37c56f23cd216f7a6b"}, - {file = "POT-0.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0dc608cea1107289a58dec33cddc1b0a3fea77ff36d66e2c8ac7aeea543969a"}, - {file = "POT-0.9.5-cp310-cp310-win32.whl", hash = "sha256:8312bee055389db47adab063749c8d77b5981534177ca6cd9b91e4fb68f69d00"}, - {file = "POT-0.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:043706d69202ac87e140121ba32ed1b038f2b3fc4a5549586187239a583cd50d"}, - {file = "POT-0.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b5f000da00e408ff781672a4895bfa8daacec055bd534c9e66ead479f3c6d83c"}, - {file = "POT-0.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9eddd9ff29bdb17d4db8ba00ba18d42656c694a128591502bf59afc1369e1bb3"}, - {file = "POT-0.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7eb9b88c73387a9966775a6f6d077d9d071814783701d2656dc05b5032a9662d"}, - {file = "POT-0.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f44446056f5fc9d132ed8e431732c33cbe754fb1e6d73636f1b6ae811be7df"}, - {file = "POT-0.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7f5d27bc9063e01b03d906bb77e7b3428065fdd72ed64233b249584ead2e2bf"}, - {file = "POT-0.9.5-cp311-cp311-win32.whl", hash = "sha256:cd79a8b4d35b706f2124f73ebff3bb1ce3450e01cc8f610eda3b6ce13616b829"}, - {file = "POT-0.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:6680aadb69df2f75a413fe9c58bd1c5cb744d017a7c8ba8841654fd0dc75433b"}, - {file = "POT-0.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7d57f96b333c9816a2af7817753108739b38155e52648c5967681dbd89d92ed2"}, - {file = "POT-0.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:afad647c78f999439f8c5cbcf74b03c5c0afefb08727cd7d68994130fabfc761"}, - {file = "POT-0.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bca891c28592d6e0e8f04b35989de7005f0fb9b3923f00537f1b269c5084aa7b"}, - {file = "POT-0.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:088c930a5fcd1e8e36fb6af710df47ce6e9331b6b5a28eb09c673df4186dcb10"}, - {file = "POT-0.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfb18268fac1e982e21821a03f802802a0d579c4690988b764115dd886dc38f5"}, - {file = "POT-0.9.5-cp312-cp312-win32.whl", hash = "sha256:931fa46ff8e01d47309207243988c783a2d8364452bc080b130c5d319349ad3f"}, - {file = "POT-0.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:be786612b391c2e4d3b5db4e7d51cdb2360284e3a6949990051c2eb102f60d3c"}, - {file = "POT-0.9.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:844820020240bad66ca07255289df9ed1e46c5f71ba2401852833c0dd114c660"}, - {file = "POT-0.9.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a76a5bed3af51db1a10c59ba376f500a743f8e20c2a6d4851c4535dbbed17714"}, - {file = "POT-0.9.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a03da3283cb04a1fa3258f0096ad9cfa3311192d5a6bee3a2ca0e15304f8652"}, - {file = "POT-0.9.5-cp37-cp37m-win32.whl", hash = "sha256:dc50b8005b4dfa3478f0bf841c22d8b3500a8a04e5673da146d71f7039607e3a"}, - {file = "POT-0.9.5-cp37-cp37m-win_amd64.whl", hash = "sha256:a9cab787bcb3ce6d23ef297c115baad34ed578a98b4a02afba8cb4e30e39d171"}, - {file = "POT-0.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:926ba491b5b1f43fb0f3bc6e9d92b6cc634c12e2fa778eba88d9350e82fc2c88"}, - {file = "POT-0.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b77b630a303868ee14015a4306d7e852b174d4a734815c67e27cd45fd59cc07"}, - {file = "POT-0.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:db0dd974328cbdd7b20477fb5757326dda22d77cb639f4759296fcd206db380f"}, - {file = "POT-0.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb29c375d02bb5aadad527133e9c20dd73930d8e2294434dc5306fb740a49d9e"}, - {file = "POT-0.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:293e0993d66b09db69c2282edbf859e1de57a3f15b99bd909609ce120380b398"}, - {file = "POT-0.9.5-cp38-cp38-win32.whl", hash = "sha256:5996d538885b834e36a3838bc73adeb747bd54ab0a2b3178addbb35b3edafa45"}, - {file = "POT-0.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:0131aab58d57bf5876d826461d0968d1a655b611cc8c0297c38ab8a235e0d627"}, - {file = "POT-0.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95c29ee3e647b272bfcb35c3c4cb7409326a0a6d3bf3ed8460495e9ac3f3a76d"}, - {file = "POT-0.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b1bca1b3465eadab9d5e1c075122963da3e921102555d1c6b7ff3c1f437d3e18"}, - {file = "POT-0.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e64f5d8890e21eb1e7decac694c34820496238e7d9c95309411e58cb0b04d384"}, - {file = "POT-0.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fa190662670868126a2372499aec513bd4ac50b4565fe2014525c7cef11e2bf"}, - {file = "POT-0.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9b775daf69cb4043897050961f9b654c30261543e531d53248a99e5599db0c8"}, - {file = "POT-0.9.5-cp39-cp39-win32.whl", hash = "sha256:ceea4cffebce88211cd63bfddc878e2f29a6b6347125cbac40fa214308315878"}, - {file = "POT-0.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:2f6af660505772833d4ccc189d9de264b429d9ec8e0cb564f33d2181e6f1bbce"}, - {file = "pot-0.9.5.tar.gz", hash = "sha256:9644ee7ff51c3cffa3c2632b9dd9dff4f3520266f9fb771450935ffb646d6042"}, ] [package.dependencies] @@ -3789,15 +3328,12 @@ plot = ["matplotlib"] [[package]] name = "prometheus-client" version = "0.21.1" -version = "0.21.1" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" files = [ {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, - {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, - {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, ] [package.extras] @@ -4097,16 +3633,12 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" version = "2.10.1" -version = "2.10.1" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.9" -python-versions = ">=3.9" files = [ {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, - {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, - {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, ] [package.dependencies] @@ -4199,15 +3731,12 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyright" version = "1.1.390" -version = "1.1.390" description = "Command line wrapper for pyright" optional = false python-versions = ">=3.7" files = [ {file = "pyright-1.1.390-py3-none-any.whl", hash = "sha256:ecebfba5b6b50af7c1a44c2ba144ba2ab542c227eb49bc1f16984ff714e0e110"}, {file = "pyright-1.1.390.tar.gz", hash = "sha256:aad7f160c49e0fbf8209507a15e17b781f63a86a1facb69ca877c71ef2e9538d"}, - {file = "pyright-1.1.390-py3-none-any.whl", hash = "sha256:ecebfba5b6b50af7c1a44c2ba144ba2ab542c227eb49bc1f16984ff714e0e110"}, - {file = "pyright-1.1.390.tar.gz", hash = "sha256:aad7f160c49e0fbf8209507a15e17b781f63a86a1facb69ca877c71ef2e9538d"}, ] [package.dependencies] @@ -4222,15 +3751,12 @@ nodejs = ["nodejs-wheel-binaries"] [[package]] name = "pytest" version = "8.3.4" -version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, - {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, - {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, ] [package.dependencies] @@ -4321,15 +3847,18 @@ cli = ["click (>=5.0)"] [[package]] name = "python-json-logger" -version = "2.0.7" -description = "A python library adding a json log formatter" +version = "3.2.1" +description = "JSON Log Formatter for the Python Logging Package" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, - {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, + {file = "python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090"}, + {file = "python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008"}, ] +[package.extras] +dev = ["backports.zoneinfo", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec", "msgspec-python313-pre", "mypy", "orjson", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] + [[package]] name = "pytz" version = "2024.2" @@ -4598,7 +4127,6 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" version = "2024.11.6" -version = "2024.11.6" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" @@ -4697,100 +4225,6 @@ files = [ {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, - {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"}, - {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"}, - {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"}, - {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"}, - {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"}, - {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"}, - {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"}, - {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"}, - {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"}, - {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"}, - {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"}, - {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"}, - {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"}, - {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"}, - {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"}, - {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"}, - {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"}, - {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"}, - {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"}, - {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"}, - {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"}, - {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"}, - {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"}, - {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"}, - {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"}, - {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"}, - {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"}, - {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"}, - {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"}, - {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"}, - {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"}, - {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"}, - {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"}, ] [[package]] @@ -4876,7 +4310,6 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "rpds-py" version = "0.22.3" -version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" @@ -4984,166 +4417,72 @@ files = [ {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, - {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, - {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, - {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, - {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, - {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, - {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, - {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, - {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, - {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, - {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, - {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, - {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, - {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, - {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, - {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, - {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, - {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, - {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, - {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, - {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, - {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, - {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, - {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, - {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, - {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, - {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, - {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, - {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, - {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, - {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, - {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, - {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, - {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, - {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, - {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, - {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, - {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, - {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, - {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, - {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, - {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, - {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, - {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, - {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, - {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, - {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, - {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, - {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, - {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, - {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, - {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] [[package]] name = "ruff" -version = "0.8.2" +version = "0.8.3" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.2-py3-none-linux_armv6l.whl", hash = "sha256:c49ab4da37e7c457105aadfd2725e24305ff9bc908487a9bf8d548c6dad8bb3d"}, - {file = "ruff-0.8.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ec016beb69ac16be416c435828be702ee694c0d722505f9c1f35e1b9c0cc1bf5"}, - {file = "ruff-0.8.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f05cdf8d050b30e2ba55c9b09330b51f9f97d36d4673213679b965d25a785f3c"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60f578c11feb1d3d257b2fb043ddb47501ab4816e7e221fbb0077f0d5d4e7b6f"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cbd5cf9b0ae8f30eebc7b360171bd50f59ab29d39f06a670b3e4501a36ba5897"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b402ddee3d777683de60ff76da801fa7e5e8a71038f57ee53e903afbcefdaa58"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:705832cd7d85605cb7858d8a13d75993c8f3ef1397b0831289109e953d833d29"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32096b41aaf7a5cc095fa45b4167b890e4c8d3fd217603f3634c92a541de7248"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e769083da9439508833cfc7c23e351e1809e67f47c50248250ce1ac52c21fb93"}, - {file = "ruff-0.8.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fe716592ae8a376c2673fdfc1f5c0c193a6d0411f90a496863c99cd9e2ae25d"}, - {file = "ruff-0.8.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:81c148825277e737493242b44c5388a300584d73d5774defa9245aaef55448b0"}, - {file = "ruff-0.8.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d261d7850c8367704874847d95febc698a950bf061c9475d4a8b7689adc4f7fa"}, - {file = "ruff-0.8.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1ca4e3a87496dc07d2427b7dd7ffa88a1e597c28dad65ae6433ecb9f2e4f022f"}, - {file = "ruff-0.8.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:729850feed82ef2440aa27946ab39c18cb4a8889c1128a6d589ffa028ddcfc22"}, - {file = "ruff-0.8.2-py3-none-win32.whl", hash = "sha256:ac42caaa0411d6a7d9594363294416e0e48fc1279e1b0e948391695db2b3d5b1"}, - {file = "ruff-0.8.2-py3-none-win_amd64.whl", hash = "sha256:2aae99ec70abf43372612a838d97bfe77d45146254568d94926e8ed5bbb409ea"}, - {file = "ruff-0.8.2-py3-none-win_arm64.whl", hash = "sha256:fb88e2a506b70cfbc2de6fae6681c4f944f7dd5f2fe87233a7233d888bad73e8"}, - {file = "ruff-0.8.2.tar.gz", hash = "sha256:b84f4f414dda8ac7f75075c1fa0b905ac0ff25361f42e6d5da681a465e0f78e5"}, + {file = "ruff-0.8.3-py3-none-linux_armv6l.whl", hash = "sha256:8d5d273ffffff0acd3db5bf626d4b131aa5a5ada1276126231c4174543ce20d6"}, + {file = "ruff-0.8.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e4d66a21de39f15c9757d00c50c8cdd20ac84f55684ca56def7891a025d7e939"}, + {file = "ruff-0.8.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c356e770811858bd20832af696ff6c7e884701115094f427b64b25093d6d932d"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c0a60a825e3e177116c84009d5ebaa90cf40dfab56e1358d1df4e29a9a14b13"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fb782f4db39501210ac093c79c3de581d306624575eddd7e4e13747e61ba18"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f26bc76a133ecb09a38b7868737eded6941b70a6d34ef53a4027e83913b6502"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:01b14b2f72a37390c1b13477c1c02d53184f728be2f3ffc3ace5b44e9e87b90d"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53babd6e63e31f4e96ec95ea0d962298f9f0d9cc5990a1bbb023a6baf2503a82"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ae441ce4cf925b7f363d33cd6570c51435972d697e3e58928973994e56e1452"}, + {file = "ruff-0.8.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c65bc0cadce32255e93c57d57ecc2cca23149edd52714c0c5d6fa11ec328cd"}, + {file = "ruff-0.8.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5be450bb18f23f0edc5a4e5585c17a56ba88920d598f04a06bd9fd76d324cb20"}, + {file = "ruff-0.8.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8faeae3827eaa77f5721f09b9472a18c749139c891dbc17f45e72d8f2ca1f8fc"}, + {file = "ruff-0.8.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:db503486e1cf074b9808403991663e4277f5c664d3fe237ee0d994d1305bb060"}, + {file = "ruff-0.8.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6567be9fb62fbd7a099209257fef4ad2c3153b60579818b31a23c886ed4147ea"}, + {file = "ruff-0.8.3-py3-none-win32.whl", hash = "sha256:19048f2f878f3ee4583fc6cb23fb636e48c2635e30fb2022b3a1cd293402f964"}, + {file = "ruff-0.8.3-py3-none-win_amd64.whl", hash = "sha256:f7df94f57d7418fa7c3ffb650757e0c2b96cf2501a0b192c18e4fb5571dfada9"}, + {file = "ruff-0.8.3-py3-none-win_arm64.whl", hash = "sha256:fe2756edf68ea79707c8d68b78ca9a58ed9af22e430430491ee03e718b5e4936"}, + {file = "ruff-0.8.3.tar.gz", hash = "sha256:5e7558304353b84279042fc584a4f4cb8a07ae79b2bf3da1a7551d960b5626d3"}, ] [[package]] name = "scikit-learn" -version = "1.5.2" +version = "1.6.0" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6"}, - {file = "scikit_learn-1.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0"}, - {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540"}, - {file = "scikit_learn-1.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8"}, - {file = "scikit_learn-1.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113"}, - {file = "scikit_learn-1.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445"}, - {file = "scikit_learn-1.5.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de"}, - {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675"}, - {file = "scikit_learn-1.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1"}, - {file = "scikit_learn-1.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6"}, - {file = "scikit_learn-1.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a"}, - {file = "scikit_learn-1.5.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1"}, - {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd"}, - {file = "scikit_learn-1.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6"}, - {file = "scikit_learn-1.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1"}, - {file = "scikit_learn-1.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9"}, - {file = "scikit_learn-1.5.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1"}, - {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8"}, - {file = "scikit_learn-1.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7"}, - {file = "scikit_learn-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe"}, - {file = "scikit_learn-1.5.2.tar.gz", hash = "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d"}, + {file = "scikit_learn-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:366fb3fa47dce90afed3d6106183f4978d6f24cfd595c2373424171b915ee718"}, + {file = "scikit_learn-1.6.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:59cd96a8d9f8dfd546f5d6e9787e1b989e981388d7803abbc9efdcde61e47460"}, + {file = "scikit_learn-1.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7a579606c73a0b3d210e33ea410ea9e1af7933fe324cb7e6fbafae4ea5948"}, + {file = "scikit_learn-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a46d3ca0f11a540b8eaddaf5e38172d8cd65a86cb3e3632161ec96c0cffb774c"}, + {file = "scikit_learn-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:5be4577769c5dde6e1b53de8e6520f9b664ab5861dd57acee47ad119fd7405d6"}, + {file = "scikit_learn-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1f50b4f24cf12a81c3c09958ae3b864d7534934ca66ded3822de4996d25d7285"}, + {file = "scikit_learn-1.6.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:eb9ae21f387826da14b0b9cb1034f5048ddb9182da429c689f5f4a87dc96930b"}, + {file = "scikit_learn-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0baa91eeb8c32632628874a5c91885eaedd23b71504d24227925080da075837a"}, + {file = "scikit_learn-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c716d13ba0a2f8762d96ff78d3e0cde90bc9c9b5c13d6ab6bb9b2d6ca6705fd"}, + {file = "scikit_learn-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:9aafd94bafc841b626681e626be27bf1233d5a0f20f0a6fdb4bee1a1963c6643"}, + {file = "scikit_learn-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:04a5ba45c12a5ff81518aa4f1604e826a45d20e53da47b15871526cda4ff5174"}, + {file = "scikit_learn-1.6.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:21fadfc2ad7a1ce8bd1d90f23d17875b84ec765eecbbfc924ff11fb73db582ce"}, + {file = "scikit_learn-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30f34bb5fde90e020653bb84dcb38b6c83f90c70680dbd8c38bd9becbad7a127"}, + {file = "scikit_learn-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dad624cffe3062276a0881d4e441bc9e3b19d02d17757cd6ae79a9d192a0027"}, + {file = "scikit_learn-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2fce7950a3fad85e0a61dc403df0f9345b53432ac0e47c50da210d22c60b6d85"}, + {file = "scikit_learn-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e5453b2e87ef8accedc5a8a4e6709f887ca01896cd7cc8a174fe39bd4bb00aef"}, + {file = "scikit_learn-1.6.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:5fe11794236fb83bead2af26a87ced5d26e3370b8487430818b915dafab1724e"}, + {file = "scikit_learn-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61fe3dcec0d82ae280877a818ab652f4988371e32dd5451e75251bece79668b1"}, + {file = "scikit_learn-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44e3a51e181933bdf9a4953cc69c6025b40d2b49e238233f149b98849beb4bf"}, + {file = "scikit_learn-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:a17860a562bac54384454d40b3f6155200c1c737c9399e6a97962c63fce503ac"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:98717d3c152f6842d36a70f21e1468fb2f1a2f8f2624d9a3f382211798516426"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:34e20bfac8ff0ebe0ff20fb16a4d6df5dc4cc9ce383e00c2ab67a526a3c67b18"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eba06d75815406091419e06dd650b91ebd1c5f836392a0d833ff36447c2b1bfa"}, + {file = "scikit_learn-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b6916d1cec1ff163c7d281e699d7a6a709da2f2c5ec7b10547e08cc788ddd3ae"}, + {file = "scikit_learn-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:66b1cf721a9f07f518eb545098226796c399c64abdcbf91c2b95d625068363da"}, + {file = "scikit_learn-1.6.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b35b60cf4cd6564b636e4a40516b3c61a4fa7a8b1f7a3ce80c38ebe04750bc3"}, + {file = "scikit_learn-1.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a73b1c2038c93bc7f4bf21f6c9828d5116c5d2268f7a20cfbbd41d3074d52083"}, + {file = "scikit_learn-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c3fa7d3dd5a0ec2d0baba0d644916fa2ab180ee37850c5d536245df916946bd"}, + {file = "scikit_learn-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:df778486a32518cda33818b7e3ce48c78cef1d5f640a6bc9d97c6d2e71449a51"}, + {file = "scikit_learn-1.6.0.tar.gz", hash = "sha256:9d58481f9f7499dff4196927aedd4285a0baec8caa3790efbe205f13de37dd6e"}, ] [package.dependencies] @@ -5155,11 +4494,11 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] -tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.2.1)", "scikit-image (>=0.17.2)"] +tests = ["black (>=24.3.0)", "matplotlib (>=3.3.4)", "mypy (>=1.9)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.5.1)", "scikit-image (>=0.17.2)"] [[package]] name = "scipy" @@ -5259,30 +4598,22 @@ win32 = ["pywin32"] [[package]] name = "setuptools" version = "75.6.0" -version = "75.6.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" -python-versions = ">=3.9" files = [ {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, - {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, - {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] -core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] [[package]] name = "shellingham" @@ -5298,16 +4629,12 @@ files = [ [[package]] name = "six" version = "1.17.0" -version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, - {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, - {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] @@ -5542,7 +4869,6 @@ test = ["pytest", "ruff"] [[package]] name = "tomli" version = "2.2.1" -version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" @@ -5579,38 +4905,6 @@ files = [ {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] @@ -5627,7 +4921,6 @@ files = [ [[package]] name = "tornado" version = "6.4.2" -version = "6.4.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" @@ -5643,17 +4936,6 @@ files = [ {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, - {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, - {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, - {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, - {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, - {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, - {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, - {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, - {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, - {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, - {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, - {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, ] [[package]] @@ -5712,15 +4994,12 @@ typing-extensions = ">=3.7.4.3" [[package]] name = "types-python-dateutil" version = "2.9.0.20241206" -version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, - {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, - {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, ] [[package]] @@ -5881,16 +5160,12 @@ files = [ [[package]] name = "webcolors" version = "24.11.1" -version = "24.11.1" description = "A library for working with the color formats defined by HTML and CSS." optional = false python-versions = ">=3.9" -python-versions = ">=3.9" files = [ {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, - {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, - {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, ] [[package]] @@ -5934,11 +5209,9 @@ files = [ [[package]] name = "wrapt" version = "1.17.0" -version = "1.17.0" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -python-versions = ">=3.8" files = [ {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, @@ -6005,74 +5278,9 @@ files = [ {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, - {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, - {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, - {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, - {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, - {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, - {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, - {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, - {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, - {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, - {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, - {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, - {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, - {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, - {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, - {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, - {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, - {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, - {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, - {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, - {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, - {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, - {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, - {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, ] [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.13" -content-hash = "70ab9a1a6ee4fcb96a0eabafaa2174386b6a414276e4cc3e3612cc23b51e52b9" +content-hash = "54d5f5d253d47c5c28c874c9aa56eaeba543fa3c27fed6143ae266b0a07ed391" From cccd6bd7461de9c12d4420cf4a4e1bb13fc2ea5a Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 16 Dec 2024 16:19:41 -0500 Subject: [PATCH 069/104] spellcheck fix --- graphrag/storage/cosmosdb_pipeline_storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 0ed6197c15..ffcc41b711 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -256,7 +256,7 @@ async def has(self, key: str) -> bool: return False async def delete(self, key: str) -> None: - """Delete all comsmosdb items belonging to the given filename key.""" + """Delete all cosmosdb items belonging to the given filename key.""" if self.container_name: container_client = self._database_client.get_container_client( self.container_name From 1f8be94cb20d7db78a92c5ba58c15ea936775728 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 16 Dec 2024 16:34:30 -0500 Subject: [PATCH 070/104] fix init function signature --- graphrag/storage/cosmosdb_pipeline_storage.py | 4 ++-- tests/integration/storage/test_cosmosdb_storage.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index ffcc41b711..2b9183d2f9 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -33,9 +33,9 @@ class CosmosDBPipelineStorage(PipelineStorage): def __init__( self, - cosmosdb_account_url: str | None, - connection_string: str | None, database_name: str, + cosmosdb_account_url: str | None = None, + connection_string: str | None = None, encoding: str = "utf-8", container_name: str | None = None, ): diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index ddd7a7bdc6..e816ec86d2 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -20,7 +20,6 @@ async def test_find(): storage = CosmosDBPipelineStorage( - cosmosdb_account_url=WELL_KNOWN_COSMOS_ACCOUNT_URL, connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, database_name="testfind", ) From 07899b89dc59dc290aa953a02de63c53a05e1f3b Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 16 Dec 2024 17:27:52 -0500 Subject: [PATCH 071/104] minor formatting updates --- pyproject.toml | 3 ++- tests/conftest.py | 2 ++ tests/integration/storage/test_cosmosdb_storage.py | 5 +++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8cf44cfe84..4bbdb467dc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -268,6 +268,7 @@ include = ["graphrag", "tests", "examples", "examples_notebooks"] exclude = ["**/node_modules", "**/__pycache__"] [tool.pytest.ini_options] +asyncio_default_fixture_loop_scope = "function" asyncio_mode = "auto" timeout = 1000 -env_files = [".env"] \ No newline at end of file +env_files = [".env"] diff --git a/tests/conftest.py b/tests/conftest.py index c6536014b8..17a8835feb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License + + def pytest_addoption(parser): parser.addoption( "--run_slow", action="store_true", default=False, help="run slow tests" diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index e816ec86d2..6690025c3f 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -10,12 +10,13 @@ from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage # cspell:disable-next-line well-known-key -WELL_KNOWN_COSMOS_ACCOUNT_URL = "https://localhost:8081" WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;" # the cosmosdb emulator is only available on windows runners at this time if not sys.platform.startswith("win"): - pytest.skip("encountered windows-only tests -- skipping", allow_module_level=True) + pytest.skip( + "encountered windows-only tests -- will skip for now", allow_module_level=True + ) async def test_find(): From 61894a23a36cfefb94f1abbce08da08142035af0 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 16 Dec 2024 21:27:08 -0500 Subject: [PATCH 072/104] remove https protocol --- tests/integration/storage/test_cosmosdb_storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 6690025c3f..ad5afd9e83 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -10,7 +10,7 @@ from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage # cspell:disable-next-line well-known-key -WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;" +WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;" # the cosmosdb emulator is only available on windows runners at this time if not sys.platform.startswith("win"): From 070013ee8d8f7e56ff6cd24a8259328686295568 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 16 Dec 2024 22:13:40 -0500 Subject: [PATCH 073/104] change localhost to 127.0.0.1 address --- tests/integration/storage/test_cosmosdb_storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index ad5afd9e83..1d45c71aa0 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -10,7 +10,7 @@ from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage # cspell:disable-next-line well-known-key -WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;" +WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=http://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;" # the cosmosdb emulator is only available on windows runners at this time if not sys.platform.startswith("win"): From 82f05c02139aae89503990076a773ee26d1797e1 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 16 Dec 2024 22:37:49 -0500 Subject: [PATCH 074/104] update pytest to use bacj engine --- graphrag/storage/blob_pipeline_storage.py | 20 +++++++++---------- graphrag/storage/file_pipeline_storage.py | 1 - .../storage/test_blob_pipeline_storage.py | 6 +++--- tests/smoke/test_fixtures.py | 6 +++--- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/graphrag/storage/blob_pipeline_storage.py b/graphrag/storage/blob_pipeline_storage.py index c7081644e8..701e59e25c 100644 --- a/graphrag/storage/blob_pipeline_storage.py +++ b/graphrag/storage/blob_pipeline_storage.py @@ -65,11 +65,11 @@ def __init__( self._container_name, self._path_prefix, ) - self.create_container() + self._create_container() - def create_container(self) -> None: + def _create_container(self) -> None: """Create the container if it does not exist.""" - if not self.container_exists(): + if not self._container_exists(): container_name = self._container_name container_names = [ container.name @@ -78,12 +78,12 @@ def create_container(self) -> None: if container_name not in container_names: self._blob_service_client.create_container(container_name) - def delete_container(self) -> None: + def _delete_container(self) -> None: """Delete the container.""" - if self.container_exists(): + if self._container_exists(): self._blob_service_client.delete_container(self._container_name) - def container_exists(self) -> bool: + def _container_exists(self) -> bool: """Check if the container exists.""" container_name = self._container_name container_names = [ @@ -119,7 +119,7 @@ def find( file_pattern.pattern, ) - def blobname(blob_name: str) -> str: + def _blobname(blob_name: str) -> str: if blob_name.startswith(self._path_prefix): blob_name = blob_name.replace(self._path_prefix, "", 1) if blob_name.startswith("/"): @@ -146,7 +146,7 @@ def item_filter(item: dict[str, Any]) -> bool: if match and blob.name.startswith(base_dir): group = match.groupdict() if item_filter(group): - yield (blobname(blob.name), group) + yield (_blobname(blob.name), group) num_loaded += 1 if max_count > 0 and num_loaded >= max_count: break @@ -203,7 +203,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: except Exception: log.exception("Error setting key %s: %s", key) - def set_df_json(self, key: str, dataframe: Any) -> None: + def _set_df_json(self, key: str, dataframe: Any) -> None: """Set a json dataframe.""" if self._connection_string is None and self._storage_account_name: dataframe.to_json( @@ -225,7 +225,7 @@ def set_df_json(self, key: str, dataframe: Any) -> None: force_ascii=False, ) - def set_df_parquet(self, key: str, dataframe: Any) -> None: + def _set_df_parquet(self, key: str, dataframe: Any) -> None: """Set a parquet dataframe.""" if self._connection_string is None and self._storage_account_name: dataframe.to_parquet( diff --git a/graphrag/storage/file_pipeline_storage.py b/graphrag/storage/file_pipeline_storage.py index 895616d62a..f64df723b4 100644 --- a/graphrag/storage/file_pipeline_storage.py +++ b/graphrag/storage/file_pipeline_storage.py @@ -47,7 +47,6 @@ def find( def item_filter(item: dict[str, Any]) -> bool: if file_filter is None: return True - return all(re.match(value, item[key]) for key, value in file_filter.items()) search_path = Path(self._root_dir) / (base_dir or "") diff --git a/tests/integration/storage/test_blob_pipeline_storage.py b/tests/integration/storage/test_blob_pipeline_storage.py index af5b26e071..6883920136 100644 --- a/tests/integration/storage/test_blob_pipeline_storage.py +++ b/tests/integration/storage/test_blob_pipeline_storage.py @@ -44,7 +44,7 @@ async def test_find(): output = await storage.get("test.txt") assert output is None finally: - storage.delete_container() + storage._delete_container() # noqa: SLF001 async def test_dotprefix(): @@ -59,7 +59,7 @@ async def test_dotprefix(): items = [item[0] for item in items] assert items == ["input/christmas.txt"] finally: - storage.delete_container() + storage._delete_container() # noqa: SLF001 async def test_child(): @@ -93,4 +93,4 @@ async def test_child(): has_test = await parent.has("input/test.txt") assert not has_test finally: - parent.delete_container() + parent._delete_container() # noqa: SLF001 diff --git a/tests/smoke/test_fixtures.py b/tests/smoke/test_fixtures.py index 1f0c449753..af6a5cd96d 100644 --- a/tests/smoke/test_fixtures.py +++ b/tests/smoke/test_fixtures.py @@ -100,8 +100,8 @@ async def prepare_azurite_data(input_path: str, azure: dict) -> Callable[[], Non container_name=input_container, ) # Bounce the container if it exists to clear out old run data - input_storage.delete_container() - input_storage.create_container() + input_storage._delete_container() # noqa: SLF001 + input_storage._create_container() # noqa: SLF001 # Upload data files txt_files = list((root / "input").glob("*.txt")) @@ -116,7 +116,7 @@ async def prepare_azurite_data(input_path: str, azure: dict) -> Callable[[], Non ) await input_storage.set(file_path, text, encoding="utf-8") - return lambda: input_storage.delete_container() + return lambda: input_storage._delete_container() # noqa: SLF001 class TestIndexer: From a1571f3f2df82f34202eb8977a2f5a481ef35bb5 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 17 Dec 2024 11:49:49 -0500 Subject: [PATCH 075/104] verified cache tests --- graphrag/storage/file_pipeline_storage.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/graphrag/storage/file_pipeline_storage.py b/graphrag/storage/file_pipeline_storage.py index aa0b111f4f..75766d43d2 100644 --- a/graphrag/storage/file_pipeline_storage.py +++ b/graphrag/storage/file_pipeline_storage.py @@ -122,7 +122,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: async def has(self, key: str) -> bool: """Has method definition.""" return await exists(join_path(self._root_dir, key)) - + async def delete(self, key: str) -> None: """Delete method definition.""" if await self.has(key): @@ -146,7 +146,6 @@ def keys(self) -> list[str]: """Return the keys in the storage.""" return [item.name for item in Path(self._root_dir).iterdir() if item.is_file()] - def join_path(file_path: str, file_name: str) -> Path: """Join a path and a file. Independent of the OS.""" return Path(file_path) / Path(file_name).parent / Path(file_name).name From aac3c622548e692eb876dfa7b13760c75e3b6065 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 17 Dec 2024 13:31:41 -0500 Subject: [PATCH 076/104] improved speed of has function --- graphrag/storage/cosmosdb_pipeline_storage.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index c0d44265ab..c75793c9ff 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -254,11 +254,12 @@ async def has(self, key: str) -> bool: query=query, enable_cross_partition_query=True ) return len(list(queried_items)) > 0 - item_names = [ - item["id"] - for item in container_client.read_all_items() - ] - return key in item_names + query = f"SELECT * FROM c WHERE c.id = '{key}'" # noqa: S608 + queried_items = container_client.query_items( + query=query, enable_cross_partition_query=True + ) + return len(list(queried_items)) == 1 + return False async def delete(self, key: str) -> None: From 2eb102a42631dd08b604c33f80344aba151ffde0 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 17 Dec 2024 17:24:33 -0500 Subject: [PATCH 077/104] resolved pytest error with find function --- graphrag/storage/cosmosdb_pipeline_storage.py | 12 ++++-- .../storage/test_cosmosdb_storage.py | 37 +++++++++++++------ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index c75793c9ff..a2b26d554e 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -132,7 +132,7 @@ def item_filter(item: dict[str, Any]) -> bool: container_client = self._database_client.get_container_client( str(self.container_name) ) - query = "SELECT * FROM c WHERE CONTAINS(c.id, @pattern)" + query = "SELECT * FROM c WHERE RegexMatch(c.id, @pattern)" parameters: list[dict[str, Any]] = [ {"name": "@pattern", "value": file_pattern.pattern} ] @@ -140,11 +140,15 @@ def item_filter(item: dict[str, Any]) -> bool: for key, value in file_filter.items(): query += f" AND c.{key} = @{key}" parameters.append({"name": f"@{key}", "value": value}) - items = container_client.query_items( - query=query, parameters=parameters, enable_cross_partition_query=True + items = list( + container_client.query_items( + query=query, parameters=parameters, enable_cross_partition_query=True + ) ) num_loaded = 0 - num_total = len(list(items)) + num_total = len(items) + if num_total == 0: + return num_filtered = 0 for item in items: match = file_pattern.match(item["id"]) diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 1d45c71aa0..8599ac46e8 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -2,6 +2,7 @@ # Licensed under the MIT License """CosmosDB Storage Tests.""" +import json import re import sys @@ -23,35 +24,49 @@ async def test_find(): storage = CosmosDBPipelineStorage( connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, database_name="testfind", + container_name="testfindcontainer", ) try: try: items = list( - storage.find(base_dir="input", file_pattern=re.compile(r".*\.txt$")) + storage.find(base_dir="input", file_pattern=re.compile(r".*\.json$")) ) items = [item[0] for item in items] assert items == [] - await storage.set("christmas.txt", "Merry Christmas!", encoding="utf-8") + christmas_json = { + "content": "Merry Christmas!", + } + await storage.set("christmas.json", json.dumps(christmas_json), encoding="utf-8") items = list( - storage.find(base_dir="input", file_pattern=re.compile(r".*\.txt$")) + storage.find(base_dir="input", file_pattern=re.compile(r".*\.json$")) ) items = [item[0] for item in items] - assert items == ["christmas.txt"] + assert items == ["christmas.json"] - await storage.set("test.txt", "Hello, World!", encoding="utf-8") - items = list(storage.find(file_pattern=re.compile(r".*\.txt$"))) + hello_world_json = { + "content": "Hello, World!", + } + await storage.set("test.json", json.dumps(hello_world_json), encoding="utf-8") + items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) items = [item[0] for item in items] - assert items == ["christmas.txt", "test.txt"] + assert items == ["christmas.json", "test.json"] - output = await storage.get("test.txt") - assert output == "Hello, World!" + output = await storage.get("test.json") + output_json = json.loads(output) + assert output_json["content"] == "Hello, World!" + + christmas_exists = await storage.has("christmas.json") + assert christmas_exists is True + easter_exists = await storage.has("easter.json") + assert easter_exists is False finally: - await storage.delete("test.txt") - output = await storage.get("test.txt") + await storage.delete("test.json") + output = await storage.get("test.json") assert output is None finally: storage._delete_container() # noqa: SLF001 + storage._delete_database() # noqa: SLF001 def test_child(): From 3fc6001b2f34aa50d53d7207769617444fb567b3 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Tue, 17 Dec 2024 17:49:04 -0500 Subject: [PATCH 078/104] added test for child method --- tests/integration/storage/test_cosmosdb_storage.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 8599ac46e8..bd3df91764 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -19,7 +19,6 @@ "encountered windows-only tests -- will skip for now", allow_module_level=True ) - async def test_find(): storage = CosmosDBPipelineStorage( connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, @@ -70,4 +69,15 @@ async def test_find(): def test_child(): - assert True + storage = CosmosDBPipelineStorage( + connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, + database_name="testchild", + container_name="testchildcontainer", + ) + try: + child_storage = storage.child("child") + assert type(child_storage) is CosmosDBPipelineStorage + + finally: + storage._delete_container() # noqa: SLF001 + storage._delete_database() # noqa: SLF001 From 0036fc4aa306e7f3f1a8a2e030646f2fe28d8712 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 17 Dec 2024 18:32:04 -0500 Subject: [PATCH 079/104] make container_name variable private as _container_name --- graphrag/storage/cosmosdb_pipeline_storage.py | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index a2b26d554e..5f057a67e5 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -58,7 +58,7 @@ def __init__( self._database_name = database_name self._connection_string = connection_string self._cosmosdb_account_url = cosmosdb_account_url - self.container_name = container_name + self._container_name = container_name self._cosmosdb_account_name = ( cosmosdb_account_url.split("//")[1].split(".")[0] if cosmosdb_account_url @@ -74,7 +74,7 @@ def __init__( self._database_name, ) self._create_database() - if self.container_name: + if self._container_name: self._create_container() def _create_database(self) -> None: @@ -117,7 +117,7 @@ def find( log.info( "search container %s for documents matching %s", - self.container_name, + self._container_name, file_pattern.pattern, ) @@ -130,7 +130,7 @@ def item_filter(item: dict[str, Any]) -> bool: try: container_client = self._database_client.get_container_client( - str(self.container_name) + str(self._container_name) ) query = "SELECT * FROM c WHERE RegexMatch(c.id, @pattern)" parameters: list[dict[str, Any]] = [ @@ -142,7 +142,9 @@ def item_filter(item: dict[str, Any]) -> bool: parameters.append({"name": f"@{key}", "value": value}) items = list( container_client.query_items( - query=query, parameters=parameters, enable_cross_partition_query=True + query=query, + parameters=parameters, + enable_cross_partition_query=True, ) ) num_loaded = 0 @@ -177,9 +179,9 @@ async def get( ) -> Any: """Fetch all cosmosdb items belonging to the given filename key.""" try: - if self.container_name: + if self._container_name: container_client = self._database_client.get_container_client( - self.container_name + self._container_name ) if as_bytes: prefix = self._get_prefix(key) @@ -211,9 +213,9 @@ async def get( async def set(self, key: str, value: Any, encoding: str | None = None) -> None: """Insert the contents of a file into cosmosdb for the given filename key. For optimization, the file is destructured such that each row is a unique cosmosdb item.""" try: - if self.container_name: + if self._container_name: container_client = self._database_client.get_container_client( - self.container_name + self._container_name ) # Value represents a parquet file output if isinstance(value, bytes): @@ -247,39 +249,41 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: async def has(self, key: str) -> bool: """Check if the contents of the given filename key exist in the cosmosdb storage.""" - if self.container_name: + if self._container_name: container_client = self._database_client.get_container_client( - self.container_name + self._container_name ) if ".parquet" in key: prefix = self._get_prefix(key) query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 queried_items = container_client.query_items( - query=query, enable_cross_partition_query=True + query=query, enable_cross_partition_query=True ) return len(list(queried_items)) > 0 - query = f"SELECT * FROM c WHERE c.id = '{key}'" # noqa: S608 + query = f"SELECT * FROM c WHERE c.id = '{key}'" # noqa: S608 queried_items = container_client.query_items( query=query, enable_cross_partition_query=True ) return len(list(queried_items)) == 1 - + return False async def delete(self, key: str) -> None: """Delete all cosmosdb items belonging to the given filename key.""" - if self.container_name: + if self._container_name: container_client = self._database_client.get_container_client( - self.container_name + self._container_name ) if ".parquet" in key: prefix = self._get_prefix(key) query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 queried_items = container_client.query_items( - query=query, enable_cross_partition_query=True + query=query, enable_cross_partition_query=True ) for item in queried_items: - container_client.delete_item(item=item["id"], partition_key=item["id"]) + container_client.delete_item( + item=item["id"], partition_key=item["id"] + ) else: container_client.delete_item(item=key, partition_key=key) @@ -287,9 +291,9 @@ async def delete(self, key: str) -> None: # TODO: Decide the granularity of deletion (e.g. delete all items within the current container, delete the current container, delete the current database) async def clear(self) -> None: """Clear the cosmosdb storage.""" - if self.container_name: + if self._container_name: container_client = self._database_client.get_container_client( - self.container_name + self._container_name ) for item in container_client.read_all_items(): item_id = item["id"] @@ -311,24 +315,24 @@ def _get_prefix(self, key: str) -> str: def _create_container(self) -> None: """Create a container for the current container name if it doesn't exist.""" - if self.container_name: + if self._container_name: partition_key = PartitionKey(path="/id", kind="Hash") self._database_client.create_container_if_not_exists( - id=self.container_name, + id=self._container_name, partition_key=partition_key, ) def _delete_container(self) -> None: """Delete the container with the current container name if it exists.""" - if self._container_exists() and self.container_name: - self._database_client.delete_container(self.container_name) + if self._container_exists() and self._container_name: + self._database_client.delete_container(self._container_name) def _container_exists(self) -> bool: """Check if the container with the current container name exists.""" container_names = [ container["id"] for container in self._database_client.list_containers() ] - return self.container_name in container_names + return self._container_name in container_names # TODO remove this helper function and have the factory instantiate the class directly From 7480cff4b3c7e1227c68b0149de22e7f8e4fcc41 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 17 Dec 2024 18:43:50 -0500 Subject: [PATCH 080/104] minor variable name fix --- graphrag/storage/cosmosdb_pipeline_storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 5f057a67e5..1f0cd2cd05 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -28,7 +28,7 @@ class CosmosDBPipelineStorage(PipelineStorage): _cosmosdb_account_url: str | None _connection_string: str | None _database_name: str - container_name: str | None + _container_name: str | None _encoding: str def __init__( From 20d867dddcc10b5ed683186bce5512647ad99398 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 03:01:13 -0500 Subject: [PATCH 081/104] cleanup cosmos pytest and make the cosmosdb storage class operations more efficient --- graphrag/storage/cosmosdb_pipeline_storage.py | 259 ++++++++---------- graphrag/storage/file_pipeline_storage.py | 3 +- .../storage/test_cosmosdb_storage.py | 17 +- 3 files changed, 129 insertions(+), 150 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 1f0cd2cd05..b99754fcd3 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -11,7 +11,8 @@ from typing import Any import pandas as pd -from azure.cosmos import CosmosClient +from azure.cosmos import ContainerProxy, CosmosClient, DatabaseProxy +from azure.cosmos.exceptions import CosmosResourceNotFoundError from azure.cosmos.partition_key import PartitionKey from azure.identity import DefaultAzureCredential from datashaper import Progress @@ -25,19 +26,22 @@ class CosmosDBPipelineStorage(PipelineStorage): """The CosmosDB-Storage Implementation.""" + _cosmos_client: CosmosClient + _database_client: DatabaseProxy | None + _container_client: ContainerProxy | None _cosmosdb_account_url: str | None _connection_string: str | None _database_name: str - _container_name: str | None + _container_name: str _encoding: str def __init__( self, database_name: str, + container_name: str, cosmosdb_account_url: str | None = None, connection_string: str | None = None, encoding: str = "utf-8", - container_name: str | None = None, ): """Initialize the CosmosDB Storage.""" if connection_string: @@ -48,12 +52,10 @@ def __init__( "Either connection_string or cosmosdb_account_url must be provided." ) raise ValueError(msg) - self._cosmos_client = CosmosClient( url=cosmosdb_account_url, credential=DefaultAzureCredential(), ) - self._encoding = encoding self._database_name = database_name self._connection_string = connection_string @@ -64,34 +66,45 @@ def __init__( if cosmosdb_account_url else None ) - self._database_client = self._cosmos_client.get_database_client( - self._database_name - ) - log.info( - "creating cosmosdb storage with account: %s and database: %s", + "creating cosmosdb storage with account: %s and database: %s and container: %s", self._cosmosdb_account_name, self._database_name, + self._container_name, ) self._create_database() - if self._container_name: - self._create_container() + self._create_container() def _create_database(self) -> None: """Create the database if it doesn't exist.""" - self._cosmos_client.create_database_if_not_exists(id=self._database_name) + self._database_client = self._cosmos_client.create_database_if_not_exists( + id=self._database_name + ) def _delete_database(self) -> None: """Delete the database if it exists.""" - if self._database_exists(): - self._cosmos_client.delete_database(self._database_name) + if self._database_client: + self._database_client = self._cosmos_client.delete_database( + self._database_client + ) - def _database_exists(self) -> bool: - """Check if the database exists.""" - database_names = [ - database["id"] for database in self._cosmos_client.list_databases() - ] - return self._database_name in database_names + def _create_container(self) -> None: + """Create a container for the current container name if it doesn't exist.""" + partition_key = PartitionKey(path="/id", kind="Hash") + if self._database_client: + self._container_client = ( + self._database_client.create_container_if_not_exists( + id=self._container_name, + partition_key=partition_key, + ) + ) + + def _delete_container(self) -> None: + """Delete the container with the current container name if it exists.""" + if self._database_client and self._container_client: + self._container_client = self._database_client.delete_container( + self._container_client + ) def find( self, @@ -101,7 +114,7 @@ def find( file_filter: dict[str, Any] | None = None, max_count=-1, ) -> Iterator[tuple[str, dict[str, Any]]]: - """Find documents in a Cosmos DB container using a file pattern and custom filter function. + """Find documents in a Cosmos DB container using a file pattern regex and custom file filter (optional). Params: base_dir: The name of the base directory (not used in Cosmos DB context). @@ -114,12 +127,13 @@ def find( An iterator of document IDs and their corresponding regex matches. """ base_dir = base_dir or "" - log.info( "search container %s for documents matching %s", self._container_name, file_pattern.pattern, ) + if not self._database_client or not self._container_client: + return def item_filter(item: dict[str, Any]) -> bool: if file_filter is None: @@ -129,9 +143,6 @@ def item_filter(item: dict[str, Any]) -> bool: ) try: - container_client = self._database_client.get_container_client( - str(self._container_name) - ) query = "SELECT * FROM c WHERE RegexMatch(c.id, @pattern)" parameters: list[dict[str, Any]] = [ {"name": "@pattern", "value": file_pattern.pattern} @@ -141,7 +152,7 @@ def item_filter(item: dict[str, Any]) -> bool: query += f" AND c.{key} = @{key}" parameters.append({"name": f"@{key}", "value": value}) items = list( - container_client.query_items( + self._container_client.query_items( query=query, parameters=parameters, enable_cross_partition_query=True, @@ -177,128 +188,117 @@ def item_filter(item: dict[str, Any]) -> bool: async def get( self, key: str, as_bytes: bool | None = None, encoding: str | None = None ) -> Any: - """Fetch all cosmosdb items belonging to the given filename key.""" + """Fetch all items in a container that match the given key.""" try: - if self._container_name: - container_client = self._database_client.get_container_client( - self._container_name + if not self._database_client or not self._container_client: + return None + if as_bytes: + prefix = self._get_prefix(key) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 + queried_items = self._container_client.query_items( + query=query, enable_cross_partition_query=True ) - if as_bytes: - prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 - queried_items = container_client.query_items( - query=query, enable_cross_partition_query=True - ) - items_list = list(queried_items) - for item in items_list: - item["id"] = item["id"].split(":")[1] + items_list = list(queried_items) + for item in items_list: + item["id"] = item["id"].split(":")[1] - items_json_str = json.dumps(items_list) - - items_df = pd.read_json( - StringIO(items_json_str), orient="records", lines=False - ) - return items_df.to_parquet() - - item = container_client.read_item(item=key, partition_key=key) - item_body = item.get("body") - return json.dumps(item_body) + items_json_str = json.dumps(items_list) + items_df = pd.read_json( + StringIO(items_json_str), orient="records", lines=False + ) + return items_df.to_parquet() + item = self._container_client.read_item(item=key, partition_key=key) + item_body = item.get("body") + return json.dumps(item_body) except Exception: log.exception("Error reading item %s", key) return None - else: - return None async def set(self, key: str, value: Any, encoding: str | None = None) -> None: - """Insert the contents of a file into cosmosdb for the given filename key. For optimization, the file is destructured such that each row is a unique cosmosdb item.""" + """Insert the contents of a file into a cosmosdb container for the given filename key. + + For better optimization, the file is destructured such that each row is a unique cosmosdb item. + """ try: - if self._container_name: - container_client = self._database_client.get_container_client( - self._container_name + if not self._database_client or not self._container_client: + msg = "Database or container not initialized" + raise ValueError(msg) # noqa: TRY301 + # value represents a parquet file + if isinstance(value, bytes): + prefix = self._get_prefix(key) + value_df = pd.read_parquet(BytesIO(value)) + value_json = value_df.to_json( + orient="records", lines=False, force_ascii=False ) - # Value represents a parquet file output - if isinstance(value, bytes): - prefix = self._get_prefix(key) - value_df = pd.read_parquet(BytesIO(value)) - value_json = value_df.to_json( - orient="records", lines=False, force_ascii=False - ) - if value_json is None: - log.exception("Error converting output %s to json", key) - else: - cosmosdb_item_list = json.loads(value_json) - for cosmosdb_item in cosmosdb_item_list: - # Append an additional prefix to the id to force a unique identifier for the create_final_nodes rows - if prefix == "create_final_nodes": - prefixed_id = f"{prefix}-community_{cosmosdb_item['community']}:{cosmosdb_item['id']}" - else: - prefixed_id = f"{prefix}:{cosmosdb_item['id']}" - cosmosdb_item["id"] = prefixed_id - container_client.upsert_item(body=cosmosdb_item) - # Value represents a cache output or stats.json + if value_json is None: + log.exception("Error converting output %s to json", key) else: - cosmosdb_item = { - "id": key, - "body": json.loads(value), - } - container_client.upsert_item(body=cosmosdb_item) - + cosmosdb_item_list = json.loads(value_json) + for cosmosdb_item in cosmosdb_item_list: + # Append an additional prefix to the id to force a unique identifier for the create_final_nodes rows + if prefix == "create_final_nodes": + prefixed_id = f"{prefix}-community_{cosmosdb_item['community']}:{cosmosdb_item['id']}" + else: + prefixed_id = f"{prefix}:{cosmosdb_item['id']}" + cosmosdb_item["id"] = prefixed_id + self._container_client.upsert_item(body=cosmosdb_item) + # value represents a cache output or stats.json + else: + cosmosdb_item = { + "id": key, + "body": json.loads(value), + } + self._container_client.upsert_item(body=cosmosdb_item) except Exception: log.exception("Error writing item %s", key) async def has(self, key: str) -> bool: """Check if the contents of the given filename key exist in the cosmosdb storage.""" - if self._container_name: - container_client = self._database_client.get_container_client( - self._container_name - ) - if ".parquet" in key: - prefix = self._get_prefix(key) - query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 - queried_items = container_client.query_items( - query=query, enable_cross_partition_query=True - ) - return len(list(queried_items)) > 0 - query = f"SELECT * FROM c WHERE c.id = '{key}'" # noqa: S608 - queried_items = container_client.query_items( + if not self._database_client or not self._container_client: + return False + if ".parquet" in key: + prefix = self._get_prefix(key) + query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 + queried_items = self._container_client.query_items( query=query, enable_cross_partition_query=True ) - return len(list(queried_items)) == 1 - - return False + return len(list(queried_items)) > 0 + query = f"SELECT * FROM c WHERE c.id = '{key}'" # noqa: S608 + queried_items = self._container_client.query_items( + query=query, enable_cross_partition_query=True + ) + return len(list(queried_items)) == 1 async def delete(self, key: str) -> None: """Delete all cosmosdb items belonging to the given filename key.""" - if self._container_name: - container_client = self._database_client.get_container_client( - self._container_name - ) + if not self._database_client or not self._container_client: + return + try: if ".parquet" in key: prefix = self._get_prefix(key) query = f"SELECT * FROM c WHERE STARTSWITH(c.id, '{prefix}')" # noqa: S608 - queried_items = container_client.query_items( + queried_items = self._container_client.query_items( query=query, enable_cross_partition_query=True ) for item in queried_items: - container_client.delete_item( + self._container_client.delete_item( item=item["id"], partition_key=item["id"] ) else: - container_client.delete_item(item=key, partition_key=key) + self._container_client.delete_item(item=key, partition_key=key) + except CosmosResourceNotFoundError: + return + except Exception: + log.exception("Error deleting item %s", key) - # Function currently deletes all items within the current container, then deletes the container itself. - # TODO: Decide the granularity of deletion (e.g. delete all items within the current container, delete the current container, delete the current database) async def clear(self) -> None: - """Clear the cosmosdb storage.""" - if self._container_name: - container_client = self._database_client.get_container_client( - self._container_name - ) - for item in container_client.read_all_items(): - item_id = item["id"] - container_client.delete_item(item=item_id, partition_key=item_id) - self._delete_container() + """Clear all contents from storage. + + # This currently deletes the database, including all containers and data within it. + # TODO: We should decide what granularity of deletion is the ideal behavior (e.g. delete all items within a container, delete the current container, delete the current database) + """ + self._delete_database() def keys(self) -> list[str]: """Return the keys in the storage.""" @@ -313,27 +313,6 @@ def _get_prefix(self, key: str) -> str: """Get the prefix of the filename key.""" return key.split(".")[0] - def _create_container(self) -> None: - """Create a container for the current container name if it doesn't exist.""" - if self._container_name: - partition_key = PartitionKey(path="/id", kind="Hash") - self._database_client.create_container_if_not_exists( - id=self._container_name, - partition_key=partition_key, - ) - - def _delete_container(self) -> None: - """Delete the container with the current container name if it exists.""" - if self._container_exists() and self._container_name: - self._database_client.delete_container(self._container_name) - - def _container_exists(self) -> bool: - """Check if the container with the current container name exists.""" - container_names = [ - container["id"] for container in self._database_client.list_containers() - ] - return self._container_name in container_names - # TODO remove this helper function and have the factory instantiate the class directly # once the new config system is in place and will enforce the correct types/existence of certain fields @@ -342,13 +321,13 @@ def create_cosmosdb_storage(**kwargs: Any) -> PipelineStorage: log.info("Creating cosmosdb storage") cosmosdb_account_url = kwargs.get("cosmosdb_account_url") connection_string = kwargs.get("connection_string") - base_dir = kwargs.get("base_dir") - container_name = kwargs.get("container_name") + base_dir = kwargs["base_dir"] + container_name = kwargs["container_name"] if not base_dir: msg = "No base_dir provided for database name" raise ValueError(msg) if connection_string is None and cosmosdb_account_url is None: - msg = "No cosmosdb account url provided" + msg = "connection_string or cosmosdb_account_url is required." raise ValueError(msg) return CosmosDBPipelineStorage( cosmosdb_account_url=cosmosdb_account_url, diff --git a/graphrag/storage/file_pipeline_storage.py b/graphrag/storage/file_pipeline_storage.py index a5085ea0b0..f64df723b4 100644 --- a/graphrag/storage/file_pipeline_storage.py +++ b/graphrag/storage/file_pipeline_storage.py @@ -121,7 +121,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: async def has(self, key: str) -> bool: """Has method definition.""" return await exists(join_path(self._root_dir, key)) - + async def delete(self, key: str) -> None: """Delete method definition.""" if await self.has(key): @@ -145,6 +145,7 @@ def keys(self) -> list[str]: """Return the keys in the storage.""" return [item.name for item in Path(self._root_dir).iterdir() if item.is_file()] + def join_path(file_path: str, file_name: str) -> Path: """Join a path and a file. Independent of the OS.""" return Path(file_path) / Path(file_name).parent / Path(file_name).name diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 8599ac46e8..67ed258715 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -28,26 +28,26 @@ async def test_find(): ) try: try: - items = list( - storage.find(base_dir="input", file_pattern=re.compile(r".*\.json$")) - ) + items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) items = [item[0] for item in items] assert items == [] christmas_json = { "content": "Merry Christmas!", } - await storage.set("christmas.json", json.dumps(christmas_json), encoding="utf-8") - items = list( - storage.find(base_dir="input", file_pattern=re.compile(r".*\.json$")) + await storage.set( + "christmas.json", json.dumps(christmas_json), encoding="utf-8" ) + items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) items = [item[0] for item in items] assert items == ["christmas.json"] hello_world_json = { "content": "Hello, World!", } - await storage.set("test.json", json.dumps(hello_world_json), encoding="utf-8") + await storage.set( + "test.json", json.dumps(hello_world_json), encoding="utf-8" + ) items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) items = [item[0] for item in items] assert items == ["christmas.json", "test.json"] @@ -65,8 +65,7 @@ async def test_find(): output = await storage.get("test.json") assert output is None finally: - storage._delete_container() # noqa: SLF001 - storage._delete_database() # noqa: SLF001 + await storage.clear() def test_child(): From fb945b2c99ccf3a71a729696461d57ef1d4662ed Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 10:21:11 -0500 Subject: [PATCH 082/104] update cicd to use different cosmosdb emulator --- .github/workflows/python-integration-tests.yml | 5 ++++- tests/integration/storage/test_cosmosdb_storage.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-integration-tests.yml b/.github/workflows/python-integration-tests.yml index b21b198597..e1431c012f 100644 --- a/.github/workflows/python-integration-tests.yml +++ b/.github/workflows/python-integration-tests.yml @@ -86,7 +86,10 @@ jobs: - name: Install Azure Cosmos DB Emulator if: runner.os == 'Windows' - uses: southpolesteve/cosmos-emulator-github-action@v1 + run: | + Write-Host "Launching Cosmos DB Emulator" + Import-Module "$env:ProgramFiles\Azure Cosmos DB Emulator\PSModules\Microsoft.Azure.CosmosDB.Emulator" + Start-CosmosDbEmulator - name: Integration Test run: | diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 67ed258715..837d540eea 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -11,7 +11,7 @@ from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage # cspell:disable-next-line well-known-key -WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=http://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;" +WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=https://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" # the cosmosdb emulator is only available on windows runners at this time if not sys.platform.startswith("win"): From 1cddde177c0e40432017fac75f864feedb997eeb Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 10:59:20 -0500 Subject: [PATCH 083/104] test with http protocol --- tests/integration/storage/test_cosmosdb_storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 837d540eea..39e3243e85 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -11,7 +11,7 @@ from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage # cspell:disable-next-line well-known-key -WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=https://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" +WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=http://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" # the cosmosdb emulator is only available on windows runners at this time if not sys.platform.startswith("win"): From 74320c9b526f821fbc00da39b04bb1dcb48b6226 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 18 Dec 2024 11:24:31 -0500 Subject: [PATCH 084/104] added pytest for clear() --- graphrag/storage/cosmosdb_pipeline_storage.py | 2 + .../storage/test_cosmosdb_storage.py | 39 +++++++++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index b99754fcd3..148242b427 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -87,6 +87,7 @@ def _delete_database(self) -> None: self._database_client = self._cosmos_client.delete_database( self._database_client ) + self._database_client = None def _create_container(self) -> None: """Create a container for the current container name if it doesn't exist.""" @@ -105,6 +106,7 @@ def _delete_container(self) -> None: self._container_client = self._database_client.delete_container( self._container_client ) + self._container_client = None def find( self, diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index de674d517a..04d86eb128 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -67,7 +67,7 @@ async def test_find(): await storage.clear() -def test_child(): +async def test_child(): storage = CosmosDBPipelineStorage( connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, database_name="testchild", @@ -76,7 +76,38 @@ def test_child(): try: child_storage = storage.child("child") assert type(child_storage) is CosmosDBPipelineStorage - finally: - storage._delete_container() # noqa: SLF001 - storage._delete_database() # noqa: SLF001 + await storage.clear() + +async def test_clear(): + storage = CosmosDBPipelineStorage( + connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, + database_name="testclear", + container_name="testclearcontainer", + ) + try: + christmas_json = { + "content": "Merry Christmas!", + } + await storage.set( + "christmas.json", json.dumps(christmas_json), encoding="utf-8" + ) + easter_json = { + "content": "Happy Easter!", + } + await storage.set( + "easter.json", json.dumps(easter_json), encoding="utf-8" + ) + await storage.clear() + + items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) + items = [item[0] for item in items] + assert items == [] + + output = await storage.get("easter.json") + assert output is None + + assert storage._container_client is None # noqa: SLF001 + assert storage._database_client is None # noqa: SLF001 + finally: + await storage.clear() \ No newline at end of file From 16932b38989421abe956fcfd04a8541ab82b93d4 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 11:48:36 -0500 Subject: [PATCH 085/104] add longer timeout for cosmosdb emulator startup --- .github/workflows/python-integration-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-integration-tests.yml b/.github/workflows/python-integration-tests.yml index e1431c012f..39ae8da640 100644 --- a/.github/workflows/python-integration-tests.yml +++ b/.github/workflows/python-integration-tests.yml @@ -89,7 +89,7 @@ jobs: run: | Write-Host "Launching Cosmos DB Emulator" Import-Module "$env:ProgramFiles\Azure Cosmos DB Emulator\PSModules\Microsoft.Azure.CosmosDB.Emulator" - Start-CosmosDbEmulator + Start-CosmosDbEmulator -Timeout 500 - name: Integration Test run: | From dbf2be28b48e95b0dd6598da1efca41722592719 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 12:10:58 -0500 Subject: [PATCH 086/104] revert http connection back to https --- tests/integration/storage/test_cosmosdb_storage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 39e3243e85..837d540eea 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -11,7 +11,7 @@ from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage # cspell:disable-next-line well-known-key -WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=http://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" +WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=https://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" # the cosmosdb emulator is only available on windows runners at this time if not sys.platform.startswith("win"): From 6a702bfaa42de191951fbf443b41b329c8b25621 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 12:32:46 -0500 Subject: [PATCH 087/104] add comments to cicd code for future dev usage --- .github/workflows/python-integration-tests.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-integration-tests.yml b/.github/workflows/python-integration-tests.yml index 39ae8da640..c8887b2be8 100644 --- a/.github/workflows/python-integration-tests.yml +++ b/.github/workflows/python-integration-tests.yml @@ -23,7 +23,7 @@ permissions: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - # Only run the for the latest commit + # only run the for the latest commit cancel-in-progress: true env: @@ -37,7 +37,7 @@ jobs: matrix: python-version: ["3.10"] os: [ubuntu-latest, windows-latest] - fail-fast: false # Continue running all jobs even if one fails + fail-fast: false # continue running all jobs even if one fails env: DEBUG: 1 @@ -84,6 +84,9 @@ jobs: id: azuright uses: potatoqualitee/azuright@v1.1 + # For more information on installation/setup of Azure Cosmos DB Emulator + # https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-develop-emulator?tabs=docker-linux%2Cpython&pivots=api-nosql + # Note: the emulator is only available on Windows runners - name: Install Azure Cosmos DB Emulator if: runner.os == 'Windows' run: | From 2ca43ce730bcbcf0f0a322b5a249550a66fc0eb2 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 18 Dec 2024 12:42:05 -0500 Subject: [PATCH 088/104] set to container and database clients to none upon deletion --- graphrag/storage/cosmosdb_pipeline_storage.py | 1 + tests/integration/storage/test_cosmosdb_storage.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 148242b427..4aa088ff32 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -300,6 +300,7 @@ async def clear(self) -> None: # This currently deletes the database, including all containers and data within it. # TODO: We should decide what granularity of deletion is the ideal behavior (e.g. delete all items within a container, delete the current container, delete the current database) """ + self._delete_container() self._delete_database() def keys(self) -> list[str]: diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 04d86eb128..590307aca7 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -11,7 +11,7 @@ from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage # cspell:disable-next-line well-known-key -WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=http://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" +WELL_KNOWN_COSMOS_CONNECTION_STRING = "https://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" # the cosmosdb emulator is only available on windows runners at this time if not sys.platform.startswith("win"): @@ -107,7 +107,7 @@ async def test_clear(): output = await storage.get("easter.json") assert output is None - assert storage._container_client is None # noqa: SLF001 + assert storage._container_client is None # noqa: SLF001 assert storage._database_client is None # noqa: SLF001 finally: await storage.clear() \ No newline at end of file From e2b3cf023a5d27f8c706edb00cd3ab0b6a494994 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 18 Dec 2024 12:46:02 -0500 Subject: [PATCH 089/104] ruff changes --- tests/integration/_pipeline/test_run.py | 12 ++--- .../storage/test_cosmosdb_storage.py | 10 ++--- tests/smoke/test_fixtures.py | 44 +++++++++---------- .../community_reports/test_sort_context.py | 6 +-- tests/unit/indexing/workflows/test_export.py | 6 +-- tests/verbs/test_create_base_text_units.py | 6 +-- tests/verbs/test_extract_graph.py | 12 ++--- tests/verbs/util.py | 6 +-- 8 files changed, 51 insertions(+), 51 deletions(-) diff --git a/tests/integration/_pipeline/test_run.py b/tests/integration/_pipeline/test_run.py index dad314daeb..5eba5de80d 100644 --- a/tests/integration/_pipeline/test_run.py +++ b/tests/integration/_pipeline/test_run.py @@ -66,10 +66,10 @@ def _assert_text_units_and_entities_reference_each_other( entity_ids = set(entity_text_unit_map.keys()) for text_unit_id, text_unit_entities in text_unit_entity_map.items(): - assert text_unit_entities.issubset(entity_ids), ( - f"Text unit {text_unit_id} has entities {text_unit_entities} that are not in the entity set" - ) + assert text_unit_entities.issubset( + entity_ids + ), f"Text unit {text_unit_id} has entities {text_unit_entities} that are not in the entity set" for entity_id, entity_text_units in entity_text_unit_map.items(): - assert entity_text_units.issubset(text_unit_ids), ( - f"Entity {entity_id} has text units {entity_text_units} that are not in the text unit set" - ) + assert entity_text_units.issubset( + text_unit_ids + ), f"Entity {entity_id} has text units {entity_text_units} that are not in the text unit set" diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 40a223e056..bc51a40789 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -19,6 +19,7 @@ "encountered windows-only tests -- will skip for now", allow_module_level=True ) + async def test_find(): storage = CosmosDBPipelineStorage( connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, @@ -79,6 +80,7 @@ async def test_child(): finally: await storage.clear() + async def test_clear(): storage = CosmosDBPipelineStorage( connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, @@ -95,9 +97,7 @@ async def test_clear(): easter_json = { "content": "Happy Easter!", } - await storage.set( - "easter.json", json.dumps(easter_json), encoding="utf-8" - ) + await storage.set("easter.json", json.dumps(easter_json), encoding="utf-8") await storage.clear() items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) @@ -107,7 +107,7 @@ async def test_clear(): output = await storage.get("easter.json") assert output is None - assert storage._container_client is None # noqa: SLF001 + assert storage._container_client is None # noqa: SLF001 assert storage._database_client is None # noqa: SLF001 finally: - await storage.clear() \ No newline at end of file + await storage.clear() diff --git a/tests/smoke/test_fixtures.py b/tests/smoke/test_fixtures.py index af6a5cd96d..d7786564a9 100644 --- a/tests/smoke/test_fixtures.py +++ b/tests/smoke/test_fixtures.py @@ -145,9 +145,9 @@ def __run_indexer( completion = subprocess.run( command, env={**os.environ, "GRAPHRAG_INPUT_FILE_TYPE": input_file_type} ) - assert completion.returncode == 0, ( - f"Indexer failed with return code: {completion.returncode}" - ) + assert ( + completion.returncode == 0 + ), f"Indexer failed with return code: {completion.returncode}" def __assert_indexer_outputs( self, root: Path, workflow_config: dict[str, dict[str, Any]] @@ -158,9 +158,9 @@ def __assert_indexer_outputs( output_entries.sort(key=lambda entry: entry.stat().st_ctime, reverse=True) if not debug: - assert len(output_entries) == 1, ( - f"Expected one output folder, found {len(output_entries)}" - ) + assert ( + len(output_entries) == 1 + ), f"Expected one output folder, found {len(output_entries)}" output_path = output_entries[0] assert output_path.exists(), "output folder does not exist" @@ -175,9 +175,9 @@ def __assert_indexer_outputs( expected_artifacts = 0 expected_workflows = set(workflow_config.keys()) workflows = set(stats["workflows"].keys()) - assert workflows == expected_workflows, ( - f"Workflows missing from stats.json: {expected_workflows - workflows}. Unexpected workflows in stats.json: {workflows - expected_workflows}" - ) + assert ( + workflows == expected_workflows + ), f"Workflows missing from stats.json: {expected_workflows - workflows}. Unexpected workflows in stats.json: {workflows - expected_workflows}" # [OPTIONAL] Check runtime for workflow in expected_workflows: @@ -188,15 +188,17 @@ def __assert_indexer_outputs( # Check max runtime max_runtime = workflow_config[workflow].get("max_runtime", None) if max_runtime: - assert stats["workflows"][workflow]["overall"] <= max_runtime, ( - f"Expected max runtime of {max_runtime}, found: {stats['workflows'][workflow]['overall']} for workflow: {workflow}" - ) + assert ( + stats["workflows"][workflow]["overall"] <= max_runtime + ), f"Expected max runtime of {max_runtime}, found: {stats['workflows'][workflow]['overall']} for workflow: {workflow}" # Check artifacts artifact_files = os.listdir(artifacts) # check that the number of workflows matches the number of artifacts - assert len(artifact_files) == (expected_artifacts + 3), ( + assert ( + len(artifact_files) == (expected_artifacts + 3) + ), ( f"Expected {expected_artifacts + 3} artifacts, found: {len(artifact_files)}" ) # Embeddings add to the count @@ -213,9 +215,7 @@ def __assert_indexer_outputs( workflow["row_range"][0] <= len(output_df) <= workflow["row_range"][1] - ), ( - f"Expected between {workflow['row_range'][0]} and {workflow['row_range'][1]}, found: {len(output_df)} for file: {artifact}" - ) + ), f"Expected between {workflow['row_range'][0]} and {workflow['row_range'][1]}, found: {len(output_df)} for file: {artifact}" # Get non-nan rows nan_df = output_df.loc[ @@ -225,9 +225,9 @@ def __assert_indexer_outputs( ), ] nan_df = nan_df[nan_df.isna().any(axis=1)] - assert len(nan_df) == 0, ( - f"Found {len(nan_df)} rows with NaN values for file: {artifact} on columns: {nan_df.columns[nan_df.isna().any()].tolist()}" - ) + assert ( + len(nan_df) == 0 + ), f"Found {len(nan_df)} rows with NaN values for file: {artifact} on columns: {nan_df.columns[nan_df.isna().any()].tolist()}" except KeyError: log.warning("No workflow config found %s", artifact_name) @@ -305,8 +305,8 @@ def test_fixture( result.stderr if "No existing dataset at" not in result.stderr else "" ) - assert stderror == "" or stderror.replace("\n", "") in KNOWN_WARNINGS, ( - f"Query failed with error: {stderror}" - ) + assert ( + stderror == "" or stderror.replace("\n", "") in KNOWN_WARNINGS + ), f"Query failed with error: {stderror}" assert result.stdout is not None, "Query returned no output" assert len(result.stdout) > 0, "Query returned empty output" diff --git a/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py b/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py index 3610c55983..873eb45616 100644 --- a/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py +++ b/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py @@ -205,9 +205,9 @@ def test_sort_context(): ctx = sort_context(context) assert ctx is not None, "Context is none" num = num_tokens(ctx) - assert num == 828 if platform.system() == "Windows" else 826, ( - f"num_tokens is not matched for platform (win = 827, else 826): {num}" - ) + assert ( + num == 828 if platform.system() == "Windows" else 826 + ), f"num_tokens is not matched for platform (win = 827, else 826): {num}" def test_sort_context_max_tokens(): diff --git a/tests/unit/indexing/workflows/test_export.py b/tests/unit/indexing/workflows/test_export.py index 206b4869e6..b3d03fb7bb 100644 --- a/tests/unit/indexing/workflows/test_export.py +++ b/tests/unit/indexing/workflows/test_export.py @@ -82,9 +82,9 @@ async def test_normal_result_exports_parquet(): ] assert len(pipeline_result) == 1 - assert storage.keys() == ["stats.json", "mock_write", "mock_workflow.parquet"], ( - "Mock workflow output should be written to storage by the exporter when there is a non-empty data frame" - ) + assert ( + storage.keys() == ["stats.json", "mock_write", "mock_workflow.parquet"] + ), "Mock workflow output should be written to storage by the exporter when there is a non-empty data frame" async def test_empty_result_does_not_export_parquet(): diff --git a/tests/verbs/test_create_base_text_units.py b/tests/verbs/test_create_base_text_units.py index 1485bedc83..b179e1153c 100644 --- a/tests/verbs/test_create_base_text_units.py +++ b/tests/verbs/test_create_base_text_units.py @@ -60,6 +60,6 @@ async def test_create_base_text_units_with_snapshot(): context, ) - assert context.storage.keys() == ["create_base_text_units.parquet"], ( - "Text unit snapshot keys differ" - ) + assert context.storage.keys() == [ + "create_base_text_units.parquet" + ], "Text unit snapshot keys differ" diff --git a/tests/verbs/test_extract_graph.py b/tests/verbs/test_extract_graph.py index 9e4d0a4280..1d191ae834 100644 --- a/tests/verbs/test_extract_graph.py +++ b/tests/verbs/test_extract_graph.py @@ -79,13 +79,13 @@ async def test_extract_graph(): nodes_actual = await context.runtime_storage.get("base_entity_nodes") edges_actual = await context.runtime_storage.get("base_relationship_edges") - assert len(nodes_actual.columns) == len(nodes_expected.columns), ( - "Nodes dataframe columns differ" - ) + assert len(nodes_actual.columns) == len( + nodes_expected.columns + ), "Nodes dataframe columns differ" - assert len(edges_actual.columns) == len(edges_expected.columns), ( - "Edges dataframe columns differ" - ) + assert len(edges_actual.columns) == len( + edges_expected.columns + ), "Edges dataframe columns differ" # TODO: with the combined verb we can't force summarization # this is because the mock responses always result in a single description, which is returned verbatim rather than summarized diff --git a/tests/verbs/util.py b/tests/verbs/util.py index 8c9cc990ef..640f08677d 100644 --- a/tests/verbs/util.py +++ b/tests/verbs/util.py @@ -80,9 +80,9 @@ def compare_outputs( """ cols = expected.columns if columns is None else columns - assert len(actual) == len(expected), ( - f"Expected: {len(expected)} rows, Actual: {len(actual)} rows" - ) + assert len(actual) == len( + expected + ), f"Expected: {len(expected)} rows, Actual: {len(actual)} rows" for column in cols: assert column in actual.columns From 944b9d3d5eb61e8fedb72c1b88c190ae373142bc Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 12:50:00 -0500 Subject: [PATCH 090/104] add comments to cicd code --- .github/workflows/python-integration-tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-integration-tests.yml b/.github/workflows/python-integration-tests.yml index c8887b2be8..238d32c690 100644 --- a/.github/workflows/python-integration-tests.yml +++ b/.github/workflows/python-integration-tests.yml @@ -86,7 +86,8 @@ jobs: # For more information on installation/setup of Azure Cosmos DB Emulator # https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-develop-emulator?tabs=docker-linux%2Cpython&pivots=api-nosql - # Note: the emulator is only available on Windows runners + # Note: the emulator is only available on Windows runners. It can take longer than the default to initially startup so we increase the default timeout. + # If a job fails due to timeout, restarting the cicd job usually resolves the problem. - name: Install Azure Cosmos DB Emulator if: runner.os == 'Windows' run: | From 26bba960d103bab9892d847d166ef03f9bae5e83 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 18 Dec 2024 13:05:28 -0500 Subject: [PATCH 091/104] removed unneeded None statements and ruff fixes --- graphrag/storage/cosmosdb_pipeline_storage.py | 4 +--- tests/verbs/test_extract_graph.py | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 4aa088ff32..9de9cf6dc0 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -87,7 +87,7 @@ def _delete_database(self) -> None: self._database_client = self._cosmos_client.delete_database( self._database_client ) - self._database_client = None + self._container_client = None def _create_container(self) -> None: """Create a container for the current container name if it doesn't exist.""" @@ -106,7 +106,6 @@ def _delete_container(self) -> None: self._container_client = self._database_client.delete_container( self._container_client ) - self._container_client = None def find( self, @@ -300,7 +299,6 @@ async def clear(self) -> None: # This currently deletes the database, including all containers and data within it. # TODO: We should decide what granularity of deletion is the ideal behavior (e.g. delete all items within a container, delete the current container, delete the current database) """ - self._delete_container() self._delete_database() def keys(self) -> list[str]: diff --git a/tests/verbs/test_extract_graph.py b/tests/verbs/test_extract_graph.py index 1d191ae834..f70ea164d0 100644 --- a/tests/verbs/test_extract_graph.py +++ b/tests/verbs/test_extract_graph.py @@ -92,7 +92,7 @@ async def test_extract_graph(): # we need to update the mocking to provide somewhat unique graphs so a true merge happens # the assertion should grab a node and ensure the description matches the mock description, not the original as we are doing below - assert nodes_actual["description"].values[0] == "Company_A is a test company" + assert nodes_actual["description"].values[0] == "Company_A is a test company" # noqa: PD011 assert len(context.storage.keys()) == 0, "Storage should be empty" From 3ba1516cfadd870be631bd3bdf643d23268b6a89 Mon Sep 17 00:00:00 2001 From: Kenny Zhang Date: Wed, 18 Dec 2024 13:12:34 -0500 Subject: [PATCH 092/104] more ruff fixes --- tests/verbs/test_extract_graph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/verbs/test_extract_graph.py b/tests/verbs/test_extract_graph.py index f70ea164d0..04dbc5ae7f 100644 --- a/tests/verbs/test_extract_graph.py +++ b/tests/verbs/test_extract_graph.py @@ -92,7 +92,7 @@ async def test_extract_graph(): # we need to update the mocking to provide somewhat unique graphs so a true merge happens # the assertion should grab a node and ensure the description matches the mock description, not the original as we are doing below - assert nodes_actual["description"].values[0] == "Company_A is a test company" # noqa: PD011 + assert nodes_actual["description"].to_numpy()[0] == "Company_A is a test company" assert len(context.storage.keys()) == 0, "Storage should be empty" From cc9e977f3fe4138a8722c26019418022e814ebe0 Mon Sep 17 00:00:00 2001 From: KennyZhang1 <90438893+KennyZhang1@users.noreply.github.com> Date: Wed, 18 Dec 2024 13:37:11 -0500 Subject: [PATCH 093/104] Update test_run.py --- tests/integration/_pipeline/test_run.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration/_pipeline/test_run.py b/tests/integration/_pipeline/test_run.py index 5eba5de80d..73d0a8d950 100644 --- a/tests/integration/_pipeline/test_run.py +++ b/tests/integration/_pipeline/test_run.py @@ -73,3 +73,4 @@ def _assert_text_units_and_entities_reference_each_other( assert entity_text_units.issubset( text_unit_ids ), f"Entity {entity_id} has text units {entity_text_units} that are not in the text unit set" + From 0c62cf7252fc2b8874699b9261ec16a9fb2daea0 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 13:39:26 -0500 Subject: [PATCH 094/104] remove unnecessary call to delete container --- graphrag/storage/cosmosdb_pipeline_storage.py | 1 - 1 file changed, 1 deletion(-) diff --git a/graphrag/storage/cosmosdb_pipeline_storage.py b/graphrag/storage/cosmosdb_pipeline_storage.py index 4aa088ff32..148242b427 100644 --- a/graphrag/storage/cosmosdb_pipeline_storage.py +++ b/graphrag/storage/cosmosdb_pipeline_storage.py @@ -300,7 +300,6 @@ async def clear(self) -> None: # This currently deletes the database, including all containers and data within it. # TODO: We should decide what granularity of deletion is the ideal behavior (e.g. delete all items within a container, delete the current container, delete the current database) """ - self._delete_container() self._delete_database() def keys(self) -> list[str]: From 9bac7efb204a08328968474a9daae4f9abc955f1 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 13:40:16 -0500 Subject: [PATCH 095/104] ruff format updates --- tests/integration/_pipeline/test_run.py | 12 ++--- tests/smoke/test_fixtures.py | 44 +++++++++---------- .../community_reports/test_sort_context.py | 6 +-- tests/unit/indexing/workflows/test_export.py | 6 +-- tests/verbs/test_create_base_text_units.py | 6 +-- tests/verbs/test_extract_graph.py | 12 ++--- tests/verbs/util.py | 6 +-- 7 files changed, 46 insertions(+), 46 deletions(-) diff --git a/tests/integration/_pipeline/test_run.py b/tests/integration/_pipeline/test_run.py index 5eba5de80d..dad314daeb 100644 --- a/tests/integration/_pipeline/test_run.py +++ b/tests/integration/_pipeline/test_run.py @@ -66,10 +66,10 @@ def _assert_text_units_and_entities_reference_each_other( entity_ids = set(entity_text_unit_map.keys()) for text_unit_id, text_unit_entities in text_unit_entity_map.items(): - assert text_unit_entities.issubset( - entity_ids - ), f"Text unit {text_unit_id} has entities {text_unit_entities} that are not in the entity set" + assert text_unit_entities.issubset(entity_ids), ( + f"Text unit {text_unit_id} has entities {text_unit_entities} that are not in the entity set" + ) for entity_id, entity_text_units in entity_text_unit_map.items(): - assert entity_text_units.issubset( - text_unit_ids - ), f"Entity {entity_id} has text units {entity_text_units} that are not in the text unit set" + assert entity_text_units.issubset(text_unit_ids), ( + f"Entity {entity_id} has text units {entity_text_units} that are not in the text unit set" + ) diff --git a/tests/smoke/test_fixtures.py b/tests/smoke/test_fixtures.py index d7786564a9..af6a5cd96d 100644 --- a/tests/smoke/test_fixtures.py +++ b/tests/smoke/test_fixtures.py @@ -145,9 +145,9 @@ def __run_indexer( completion = subprocess.run( command, env={**os.environ, "GRAPHRAG_INPUT_FILE_TYPE": input_file_type} ) - assert ( - completion.returncode == 0 - ), f"Indexer failed with return code: {completion.returncode}" + assert completion.returncode == 0, ( + f"Indexer failed with return code: {completion.returncode}" + ) def __assert_indexer_outputs( self, root: Path, workflow_config: dict[str, dict[str, Any]] @@ -158,9 +158,9 @@ def __assert_indexer_outputs( output_entries.sort(key=lambda entry: entry.stat().st_ctime, reverse=True) if not debug: - assert ( - len(output_entries) == 1 - ), f"Expected one output folder, found {len(output_entries)}" + assert len(output_entries) == 1, ( + f"Expected one output folder, found {len(output_entries)}" + ) output_path = output_entries[0] assert output_path.exists(), "output folder does not exist" @@ -175,9 +175,9 @@ def __assert_indexer_outputs( expected_artifacts = 0 expected_workflows = set(workflow_config.keys()) workflows = set(stats["workflows"].keys()) - assert ( - workflows == expected_workflows - ), f"Workflows missing from stats.json: {expected_workflows - workflows}. Unexpected workflows in stats.json: {workflows - expected_workflows}" + assert workflows == expected_workflows, ( + f"Workflows missing from stats.json: {expected_workflows - workflows}. Unexpected workflows in stats.json: {workflows - expected_workflows}" + ) # [OPTIONAL] Check runtime for workflow in expected_workflows: @@ -188,17 +188,15 @@ def __assert_indexer_outputs( # Check max runtime max_runtime = workflow_config[workflow].get("max_runtime", None) if max_runtime: - assert ( - stats["workflows"][workflow]["overall"] <= max_runtime - ), f"Expected max runtime of {max_runtime}, found: {stats['workflows'][workflow]['overall']} for workflow: {workflow}" + assert stats["workflows"][workflow]["overall"] <= max_runtime, ( + f"Expected max runtime of {max_runtime}, found: {stats['workflows'][workflow]['overall']} for workflow: {workflow}" + ) # Check artifacts artifact_files = os.listdir(artifacts) # check that the number of workflows matches the number of artifacts - assert ( - len(artifact_files) == (expected_artifacts + 3) - ), ( + assert len(artifact_files) == (expected_artifacts + 3), ( f"Expected {expected_artifacts + 3} artifacts, found: {len(artifact_files)}" ) # Embeddings add to the count @@ -215,7 +213,9 @@ def __assert_indexer_outputs( workflow["row_range"][0] <= len(output_df) <= workflow["row_range"][1] - ), f"Expected between {workflow['row_range'][0]} and {workflow['row_range'][1]}, found: {len(output_df)} for file: {artifact}" + ), ( + f"Expected between {workflow['row_range'][0]} and {workflow['row_range'][1]}, found: {len(output_df)} for file: {artifact}" + ) # Get non-nan rows nan_df = output_df.loc[ @@ -225,9 +225,9 @@ def __assert_indexer_outputs( ), ] nan_df = nan_df[nan_df.isna().any(axis=1)] - assert ( - len(nan_df) == 0 - ), f"Found {len(nan_df)} rows with NaN values for file: {artifact} on columns: {nan_df.columns[nan_df.isna().any()].tolist()}" + assert len(nan_df) == 0, ( + f"Found {len(nan_df)} rows with NaN values for file: {artifact} on columns: {nan_df.columns[nan_df.isna().any()].tolist()}" + ) except KeyError: log.warning("No workflow config found %s", artifact_name) @@ -305,8 +305,8 @@ def test_fixture( result.stderr if "No existing dataset at" not in result.stderr else "" ) - assert ( - stderror == "" or stderror.replace("\n", "") in KNOWN_WARNINGS - ), f"Query failed with error: {stderror}" + assert stderror == "" or stderror.replace("\n", "") in KNOWN_WARNINGS, ( + f"Query failed with error: {stderror}" + ) assert result.stdout is not None, "Query returned no output" assert len(result.stdout) > 0, "Query returned empty output" diff --git a/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py b/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py index 873eb45616..3610c55983 100644 --- a/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py +++ b/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py @@ -205,9 +205,9 @@ def test_sort_context(): ctx = sort_context(context) assert ctx is not None, "Context is none" num = num_tokens(ctx) - assert ( - num == 828 if platform.system() == "Windows" else 826 - ), f"num_tokens is not matched for platform (win = 827, else 826): {num}" + assert num == 828 if platform.system() == "Windows" else 826, ( + f"num_tokens is not matched for platform (win = 827, else 826): {num}" + ) def test_sort_context_max_tokens(): diff --git a/tests/unit/indexing/workflows/test_export.py b/tests/unit/indexing/workflows/test_export.py index b3d03fb7bb..206b4869e6 100644 --- a/tests/unit/indexing/workflows/test_export.py +++ b/tests/unit/indexing/workflows/test_export.py @@ -82,9 +82,9 @@ async def test_normal_result_exports_parquet(): ] assert len(pipeline_result) == 1 - assert ( - storage.keys() == ["stats.json", "mock_write", "mock_workflow.parquet"] - ), "Mock workflow output should be written to storage by the exporter when there is a non-empty data frame" + assert storage.keys() == ["stats.json", "mock_write", "mock_workflow.parquet"], ( + "Mock workflow output should be written to storage by the exporter when there is a non-empty data frame" + ) async def test_empty_result_does_not_export_parquet(): diff --git a/tests/verbs/test_create_base_text_units.py b/tests/verbs/test_create_base_text_units.py index b179e1153c..1485bedc83 100644 --- a/tests/verbs/test_create_base_text_units.py +++ b/tests/verbs/test_create_base_text_units.py @@ -60,6 +60,6 @@ async def test_create_base_text_units_with_snapshot(): context, ) - assert context.storage.keys() == [ - "create_base_text_units.parquet" - ], "Text unit snapshot keys differ" + assert context.storage.keys() == ["create_base_text_units.parquet"], ( + "Text unit snapshot keys differ" + ) diff --git a/tests/verbs/test_extract_graph.py b/tests/verbs/test_extract_graph.py index 1d191ae834..9e4d0a4280 100644 --- a/tests/verbs/test_extract_graph.py +++ b/tests/verbs/test_extract_graph.py @@ -79,13 +79,13 @@ async def test_extract_graph(): nodes_actual = await context.runtime_storage.get("base_entity_nodes") edges_actual = await context.runtime_storage.get("base_relationship_edges") - assert len(nodes_actual.columns) == len( - nodes_expected.columns - ), "Nodes dataframe columns differ" + assert len(nodes_actual.columns) == len(nodes_expected.columns), ( + "Nodes dataframe columns differ" + ) - assert len(edges_actual.columns) == len( - edges_expected.columns - ), "Edges dataframe columns differ" + assert len(edges_actual.columns) == len(edges_expected.columns), ( + "Edges dataframe columns differ" + ) # TODO: with the combined verb we can't force summarization # this is because the mock responses always result in a single description, which is returned verbatim rather than summarized diff --git a/tests/verbs/util.py b/tests/verbs/util.py index 640f08677d..8c9cc990ef 100644 --- a/tests/verbs/util.py +++ b/tests/verbs/util.py @@ -80,9 +80,9 @@ def compare_outputs( """ cols = expected.columns if columns is None else columns - assert len(actual) == len( - expected - ), f"Expected: {len(expected)} rows, Actual: {len(actual)} rows" + assert len(actual) == len(expected), ( + f"Expected: {len(expected)} rows, Actual: {len(actual)} rows" + ) for column in cols: assert column in actual.columns From 9c342c28a596e76353b32470e81976b12b0e7620 Mon Sep 17 00:00:00 2001 From: KennyZhang1 <90438893+KennyZhang1@users.noreply.github.com> Date: Wed, 18 Dec 2024 13:42:16 -0500 Subject: [PATCH 096/104] Reverted test_run.py --- tests/integration/_pipeline/test_run.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/integration/_pipeline/test_run.py b/tests/integration/_pipeline/test_run.py index 73d0a8d950..5eba5de80d 100644 --- a/tests/integration/_pipeline/test_run.py +++ b/tests/integration/_pipeline/test_run.py @@ -73,4 +73,3 @@ def _assert_text_units_and_entities_reference_each_other( assert entity_text_units.issubset( text_unit_ids ), f"Entity {entity_id} has text units {entity_text_units} that are not in the text unit set" - From 0e50eefca859ad3c1e3b7d301c5b22f1fd9abf2f Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 13:45:49 -0500 Subject: [PATCH 097/104] fix ruff formatter errors --- tests/integration/_pipeline/test_run.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/_pipeline/test_run.py b/tests/integration/_pipeline/test_run.py index ecb044b347..dad314daeb 100644 --- a/tests/integration/_pipeline/test_run.py +++ b/tests/integration/_pipeline/test_run.py @@ -70,6 +70,6 @@ def _assert_text_units_and_entities_reference_each_other( f"Text unit {text_unit_id} has entities {text_unit_entities} that are not in the entity set" ) for entity_id, entity_text_units in entity_text_unit_map.items(): - assert entity_text_units.issubset( - text_unit_ids - ), f"Entity {entity_id} has text units {entity_text_units} that are not in the text unit set" + assert entity_text_units.issubset(text_unit_ids), ( + f"Entity {entity_id} has text units {entity_text_units} that are not in the text unit set" + ) From 25c281b8ccf9c273dc900adce750c247c5a0289d Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 17:13:43 -0500 Subject: [PATCH 098/104] cleanup variable names to be more consistent --- .../storage/test_cosmosdb_storage.py | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index bc51a40789..5b82e0d83e 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -32,22 +32,20 @@ async def test_find(): items = [item[0] for item in items] assert items == [] - christmas_json = { + json_content = { "content": "Merry Christmas!", } await storage.set( - "christmas.json", json.dumps(christmas_json), encoding="utf-8" + "christmas.json", json.dumps(json_content), encoding="utf-8" ) items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) items = [item[0] for item in items] assert items == ["christmas.json"] - hello_world_json = { + json_content = { "content": "Hello, World!", } - await storage.set( - "test.json", json.dumps(hello_world_json), encoding="utf-8" - ) + await storage.set("test.json", json.dumps(json_content), encoding="utf-8") items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) items = [item[0] for item in items] assert items == ["christmas.json", "test.json"] @@ -56,10 +54,10 @@ async def test_find(): output_json = json.loads(output) assert output_json["content"] == "Hello, World!" - christmas_exists = await storage.has("christmas.json") - assert christmas_exists is True - easter_exists = await storage.has("easter.json") - assert easter_exists is False + json_exists = await storage.has("christmas.json") + assert json_exists is True + json_exists = await storage.has("easter.json") + assert json_exists is False finally: await storage.delete("test.json") output = await storage.get("test.json") @@ -88,16 +86,14 @@ async def test_clear(): container_name="testclearcontainer", ) try: - christmas_json = { + json_exists = { "content": "Merry Christmas!", } - await storage.set( - "christmas.json", json.dumps(christmas_json), encoding="utf-8" - ) - easter_json = { + await storage.set("christmas.json", json.dumps(json_exists), encoding="utf-8") + json_exists = { "content": "Happy Easter!", } - await storage.set("easter.json", json.dumps(easter_json), encoding="utf-8") + await storage.set("easter.json", json.dumps(json_exists), encoding="utf-8") await storage.clear() items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) From 04bf8c6cb38f038fcd157c9e3942e818362fb789 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 18:33:33 -0500 Subject: [PATCH 099/104] remove extra semversioner file --- .semversioner/next-release/patch-20241114001527332372.json | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .semversioner/next-release/patch-20241114001527332372.json diff --git a/.semversioner/next-release/patch-20241114001527332372.json b/.semversioner/next-release/patch-20241114001527332372.json deleted file mode 100644 index a2fe39602e..0000000000 --- a/.semversioner/next-release/patch-20241114001527332372.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "patch", - "description": "Fix issue when using emitters that are not the default parque output" -} From a6a4694df4c7e0513c240f1897ed75cef41dae04 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 22:50:47 -0500 Subject: [PATCH 100/104] revert pydantic model changes --- graphrag/index/config/cache.py | 12 ++++++------ graphrag/index/config/reporting.py | 8 ++++---- graphrag/index/config/storage.py | 16 ++++++++++------ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index 1e6df66c3c..c51a7621e3 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -63,8 +63,8 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): container_name: str = Field(description="The container name for cache", default="") """The container name for cache""" - storage_account_blob_url: str = Field( - description="The storage account blob url for cache", default="" + storage_account_blob_url: str | None = Field( + description="The storage account blob url for cache", default=None ) """The storage account blob url for cache""" @@ -75,8 +75,8 @@ class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb type: Literal[CacheType.cosmosdb] = CacheType.cosmosdb """The type of cache.""" - base_dir: str = Field( - description="The cosmosdb database name for the cache.", default="" + base_dir: str | None = Field( + description="The cosmosdb database name for the cache.", default=None ) """The cosmosdb database name for the cache.""" @@ -88,8 +88,8 @@ class PipelineCosmosDBCacheConfig(PipelineCacheConfig[Literal[CacheType.cosmosdb ) """The cosmosdb primary key for the cache.""" - cosmosdb_account_url: str = Field( - description="The cosmosdb account url for cache", default="" + cosmosdb_account_url: str | None = Field( + description="The cosmosdb account url for cache", default=None ) """The cosmosdb account url for cache""" diff --git a/graphrag/index/config/reporting.py b/graphrag/index/config/reporting.py index 6c537931ce..47e99a6e50 100644 --- a/graphrag/index/config/reporting.py +++ b/graphrag/index/config/reporting.py @@ -58,13 +58,13 @@ class PipelineBlobReportingConfig(PipelineReportingConfig[Literal[ReportingType. ) """The container name for reporting""" - storage_account_blob_url: str = Field( - description="The storage account blob url for reporting", default="" + storage_account_blob_url: str | None = Field( + description="The storage account blob url for reporting", default=None ) """The storage account blob url for reporting""" - base_dir: str = Field( - description="The base directory for the reporting.", default="" + base_dir: str | None = Field( + description="The base directory for the reporting.", default=None ) """The base directory for the reporting.""" diff --git a/graphrag/index/config/storage.py b/graphrag/index/config/storage.py index c4abd8c344..482b4056e4 100644 --- a/graphrag/index/config/storage.py +++ b/graphrag/index/config/storage.py @@ -55,11 +55,13 @@ class PipelineBlobStorageConfig(PipelineStorageConfig[Literal[StorageType.blob]] ) """The container name for storage.""" - base_dir: str = Field(description="The base directory for the storage.", default="") + base_dir: str | None = Field( + description="The base directory for the storage.", default=None + ) """The base directory for the storage.""" - storage_account_blob_url: str = Field( - description="The storage account blob url.", default="" + storage_account_blob_url: str | None = Field( + description="The storage account blob url.", default=None ) """The storage account blob url.""" @@ -82,11 +84,13 @@ class PipelineCosmosDBStorageConfig( ) """The container name for storage.""" - base_dir: str = Field(description="The base directory for the storage.", default="") + base_dir: str | None = Field( + description="The base directory for the storage.", default=None + ) """The base directory for the storage.""" - cosmosdb_account_url: str = Field( - description="The cosmosdb account url.", default="" + cosmosdb_account_url: str | None = Field( + description="The cosmosdb account url.", default=None ) """The cosmosdb account url.""" From 143e2316c8450fb731d42a722dd4aa52d4a74500 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 22:55:25 -0500 Subject: [PATCH 101/104] revert pydantic model change --- graphrag/index/config/cache.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/graphrag/index/config/cache.py b/graphrag/index/config/cache.py index c51a7621e3..2ad6d5b8af 100644 --- a/graphrag/index/config/cache.py +++ b/graphrag/index/config/cache.py @@ -52,7 +52,9 @@ class PipelineBlobCacheConfig(PipelineCacheConfig[Literal[CacheType.blob]]): type: Literal[CacheType.blob] = CacheType.blob """The type of cache.""" - base_dir: str = Field(description="The base directory for the cache.", default="") + base_dir: str | None = Field( + description="The base directory for the cache.", default=None + ) """The base directory for the cache.""" connection_string: str | None = Field( From 6926dfe39b9510e453eb1503eb9fb82f18d338a6 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 23:09:42 -0500 Subject: [PATCH 102/104] revert pydantic model change --- graphrag/config/models/text_embedding_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphrag/config/models/text_embedding_config.py b/graphrag/config/models/text_embedding_config.py index ea2a78aefd..d92c23f1a1 100644 --- a/graphrag/config/models/text_embedding_config.py +++ b/graphrag/config/models/text_embedding_config.py @@ -26,7 +26,7 @@ class TextEmbeddingConfig(LLMConfig): ) skip: list[str] = Field(description="The specific embeddings to skip.", default=[]) vector_store: dict | None = Field( - description="The vector storage configuration", default=None + description="The vector storage configuration", default=defs.VECTOR_STORE_DICT ) strategy: dict | None = Field( description="The override strategy to use.", default=None From 52dc631f3f3df1907a9646f7728056ae9b3fb70d Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 23:12:55 -0500 Subject: [PATCH 103/104] re-enable inline formatting rule --- graphrag/index/create_pipeline_config.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/graphrag/index/create_pipeline_config.py b/graphrag/index/create_pipeline_config.py index 940ccb3c1c..4d88c5ad57 100644 --- a/graphrag/index/create_pipeline_config.py +++ b/graphrag/index/create_pipeline_config.py @@ -379,7 +379,7 @@ def _get_reporting_config( connection_string=connection_string, container_name=container_name, base_dir=settings.reporting.base_dir, - storage_account_blob_url=storage_account_blob_url, # type: ignore + storage_account_blob_url=storage_account_blob_url, ) case ReportingType.console: return PipelineConsoleReportingConfig() @@ -420,7 +420,7 @@ def _get_storage_config( connection_string=connection_string, container_name=container_name, base_dir=storage_settings.base_dir, - storage_account_blob_url=storage_account_blob_url, # type: ignore + storage_account_blob_url=storage_account_blob_url, ) case StorageType.cosmosdb: cosmosdb_account_url = storage_settings.cosmosdb_account_url @@ -477,7 +477,7 @@ def _get_cache_config( connection_string=connection_string, container_name=container_name, base_dir=settings.cache.base_dir, - storage_account_blob_url=storage_account_blob_url, # type: ignore + storage_account_blob_url=storage_account_blob_url, ) case CacheType.cosmosdb: cosmosdb_account_url = settings.cache.cosmosdb_account_url @@ -494,7 +494,7 @@ def _get_cache_config( msg = "Connection string or cosmosDB account url must be provided for cosmosdb cache." raise ValueError(msg) return PipelineCosmosDBCacheConfig( - cosmosdb_account_url=cosmosdb_account_url, # type: ignore + cosmosdb_account_url=cosmosdb_account_url, connection_string=connection_string, base_dir=base_dir, container_name=container_name, From c5b4c787c70a36bf718433ebfea276c000d6bc6e Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 18 Dec 2024 23:56:34 -0500 Subject: [PATCH 104/104] update documentation in dev guide --- DEVELOPING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/DEVELOPING.md b/DEVELOPING.md index be018e0583..d344bc7cd3 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -45,7 +45,6 @@ graphrag ├── config # configuration management ├── index # indexing engine | └─ run/run.py # main entrypoint to build an index -├── llm # generic llm interfaces ├── logger # logger module supporting several options │   └─ factory.py # └─ main entrypoint to create a logger ├── model # data model definitions associated with the knowledge graph