diff --git a/chromadb/api/__init__.py b/chromadb/api/__init__.py index 5c7b789c280..27ee973f9a2 100644 --- a/chromadb/api/__init__.py +++ b/chromadb/api/__init__.py @@ -1,8 +1,12 @@ from abc import ABC, abstractmethod from typing import Sequence, Optional, List from uuid import UUID +import sys -from overrides import override +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.api.collection_configuration import ( CreateCollectionConfiguration, UpdateCollectionConfiguration, diff --git a/chromadb/api/async_api.py b/chromadb/api/async_api.py index 3675e472940..60c001f5486 100644 --- a/chromadb/api/async_api.py +++ b/chromadb/api/async_api.py @@ -1,8 +1,12 @@ from abc import ABC, abstractmethod from typing import Sequence, Optional, List from uuid import UUID +import sys -from overrides import override +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.api.collection_configuration import ( CreateCollectionConfiguration, UpdateCollectionConfiguration, diff --git a/chromadb/api/async_client.py b/chromadb/api/async_client.py index da47d4889cf..385064222c2 100644 --- a/chromadb/api/async_client.py +++ b/chromadb/api/async_client.py @@ -1,7 +1,12 @@ import httpx from typing import Optional, Sequence from uuid import UUID -from overrides import override +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.auth import UserIdentity from chromadb.auth.utils import maybe_set_tenant_and_database diff --git a/chromadb/api/async_fastapi.py b/chromadb/api/async_fastapi.py index 99f09c3029e..438107d574b 100644 --- a/chromadb/api/async_fastapi.py +++ b/chromadb/api/async_fastapi.py @@ -5,7 +5,12 @@ from typing import Any, Optional, cast, Tuple, Sequence, Dict, List import logging import httpx -from overrides import override +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb import __version__ from chromadb.auth import UserIdentity from chromadb.api.async_api import AsyncServerAPI diff --git a/chromadb/api/client.py b/chromadb/api/client.py index f2d55698b22..d530db20219 100644 --- a/chromadb/api/client.py +++ b/chromadb/api/client.py @@ -1,7 +1,11 @@ from typing import Optional, Sequence from uuid import UUID +import sys -from overrides import override +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override import httpx from chromadb.api import AdminAPI, ClientAPI, ServerAPI from chromadb.api.collection_configuration import ( diff --git a/chromadb/api/configuration.py b/chromadb/api/configuration.py index 7e1fbaaee1d..84bf07a91e0 100644 --- a/chromadb/api/configuration.py +++ b/chromadb/api/configuration.py @@ -1,6 +1,6 @@ from abc import abstractmethod import json -from overrides import override +import sys from typing import ( Any, ClassVar, @@ -15,6 +15,11 @@ from typing_extensions import Self from multiprocessing import cpu_count +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override + from chromadb.serde import JSONSerializable # TODO: move out of API diff --git a/chromadb/api/fastapi.py b/chromadb/api/fastapi.py index 24e9cbfca5a..81317214b10 100644 --- a/chromadb/api/fastapi.py +++ b/chromadb/api/fastapi.py @@ -4,8 +4,13 @@ from typing import Sequence from uuid import UUID import httpx +import sys import urllib.parse -from overrides import override + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.api.collection_configuration import ( CreateCollectionConfiguration, diff --git a/chromadb/api/rust.py b/chromadb/api/rust.py index 3cb21687918..079ce5b4374 100644 --- a/chromadb/api/rust.py +++ b/chromadb/api/rust.py @@ -44,10 +44,15 @@ from typing import Optional, Sequence, List -from overrides import override from uuid import UUID import json import platform +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override if platform.system() != "Windows": import resource diff --git a/chromadb/api/segment.py b/chromadb/api/segment.py index fc9e6266cf4..c48d0fc722c 100644 --- a/chromadb/api/segment.py +++ b/chromadb/api/segment.py @@ -69,14 +69,19 @@ Callable, TypeVar, ) -from overrides import override from uuid import UUID, uuid4 from functools import wraps import time import logging import re +import sys from chromadb.execution.expression.plan import Search +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override + T = TypeVar("T", bound=Callable[..., Any]) logger = logging.getLogger(__name__) diff --git a/chromadb/auth/basic_authn/__init__.py b/chromadb/auth/basic_authn/__init__.py index 66af698513b..75fabe42989 100644 --- a/chromadb/auth/basic_authn/__init__.py +++ b/chromadb/auth/basic_authn/__init__.py @@ -6,8 +6,12 @@ import bcrypt import logging +import sys -from overrides import override +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from pydantic import SecretStr from chromadb.auth import ( diff --git a/chromadb/auth/simple_rbac_authz/__init__.py b/chromadb/auth/simple_rbac_authz/__init__.py index ed499ff2fc3..5790dce2d4b 100644 --- a/chromadb/auth/simple_rbac_authz/__init__.py +++ b/chromadb/auth/simple_rbac_authz/__init__.py @@ -1,7 +1,12 @@ import logging from typing import Dict, Set -from overrides import override +import sys import yaml + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.auth import ( AuthzAction, AuthzResource, diff --git a/chromadb/auth/token_authn/__init__.py b/chromadb/auth/token_authn/__init__.py index 00c6ae3a449..1c643df3b44 100644 --- a/chromadb/auth/token_authn/__init__.py +++ b/chromadb/auth/token_authn/__init__.py @@ -2,13 +2,16 @@ import random import re import string +import sys import time import traceback from enum import Enum from typing import cast, Dict, List, Optional, TypedDict, TypeVar - -from overrides import override +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from pydantic import SecretStr import yaml diff --git a/chromadb/config.py b/chromadb/config.py index d2a4a87b725..72ac4dabb48 100644 --- a/chromadb/config.py +++ b/chromadb/config.py @@ -1,14 +1,21 @@ import importlib import inspect import logging +import sys from abc import ABC from enum import Enum from graphlib import TopologicalSorter from typing import Optional, List, Any, Dict, Set, Iterable, Union from typing import Type, TypeVar, cast -from overrides import EnforceOverrides -from overrides import override +if sys.version_info >= (3, 12): + from typing import override + + class EnforceOverrides: + pass +else: + from overrides import overrides as override + from overrides import EnforceOverrides from typing_extensions import Literal import platform diff --git a/chromadb/db/base.py b/chromadb/db/base.py index a9a5269c196..26d0f2af8a6 100644 --- a/chromadb/db/base.py +++ b/chromadb/db/base.py @@ -3,7 +3,16 @@ from typing_extensions import Protocol, Self, Literal from abc import ABC, abstractmethod from threading import local -from overrides import override, EnforceOverrides +import sys + +if sys.version_info >= (3, 12): + from typing import override + + class EnforceOverrides: + pass +else: + from overrides import overrides as override + from overrides import EnforceOverrides import pypika import pypika.queries from chromadb.config import System, Component diff --git a/chromadb/db/impl/grpc/client.py b/chromadb/db/impl/grpc/client.py index ef1086cd1bf..9b0860d4b41 100644 --- a/chromadb/db/impl/grpc/client.py +++ b/chromadb/db/impl/grpc/client.py @@ -1,6 +1,11 @@ from typing import List, Optional, Sequence, Tuple, Union, cast from uuid import UUID -from overrides import overrides +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.api.collection_configuration import ( CreateCollectionConfiguration, create_collection_configuration_to_json_str, @@ -84,7 +89,7 @@ def __init__(self, system: System): ) return super().__init__(system) - @overrides + @override def start(self) -> None: self._channel = grpc.insecure_channel( f"{self._coordinator_url}:{self._coordinator_port}", @@ -95,17 +100,17 @@ def start(self) -> None: self._sys_db_stub = SysDBStub(self._channel) # type: ignore return super().start() - @overrides + @override def stop(self) -> None: self._channel.close() return super().stop() - @overrides + @override def reset_state(self) -> None: self._sys_db_stub.ResetState(Empty()) return super().reset_state() - @overrides + @override def create_database( self, id: UUID, name: str, tenant: str = DEFAULT_TENANT ) -> None: @@ -122,7 +127,7 @@ def create_database( raise UniqueConstraintError() raise InternalError() - @overrides + @override def get_database(self, name: str, tenant: str = DEFAULT_TENANT) -> Database: try: request = GetDatabaseRequest(name=name, tenant=tenant) @@ -142,7 +147,7 @@ def get_database(self, name: str, tenant: str = DEFAULT_TENANT) -> Database: raise NotFoundError() raise InternalError() - @overrides + @override def delete_database(self, name: str, tenant: str = DEFAULT_TENANT) -> None: try: request = DeleteDatabaseRequest(name=name, tenant=tenant) @@ -157,7 +162,7 @@ def delete_database(self, name: str, tenant: str = DEFAULT_TENANT) -> None: raise NotFoundError() raise InternalError - @overrides + @override def list_databases( self, limit: Optional[int] = None, @@ -185,7 +190,7 @@ def list_databases( ) raise InternalError() - @overrides + @override def create_tenant(self, name: str) -> None: try: request = CreateTenantRequest(name=name) @@ -198,7 +203,7 @@ def create_tenant(self, name: str) -> None: raise UniqueConstraintError() raise InternalError() - @overrides + @override def get_tenant(self, name: str) -> Tenant: try: request = GetTenantRequest(name=name) @@ -214,7 +219,7 @@ def get_tenant(self, name: str) -> Tenant: raise NotFoundError() raise InternalError() - @overrides + @override def create_segment(self, segment: Segment) -> None: try: proto_segment = to_proto_segment(segment) @@ -230,7 +235,7 @@ def create_segment(self, segment: Segment) -> None: raise UniqueConstraintError() raise InternalError() - @overrides + @override def delete_segment(self, collection: UUID, id: UUID) -> None: try: request = DeleteSegmentRequest( @@ -248,7 +253,7 @@ def delete_segment(self, collection: UUID, id: UUID) -> None: raise NotFoundError() raise InternalError() - @overrides + @override def get_segments( self, collection: UUID, @@ -277,7 +282,7 @@ def get_segments( ) raise InternalError() - @overrides + @override def update_segment( self, collection: UUID, @@ -310,7 +315,7 @@ def update_segment( ) raise InternalError() - @overrides + @override def create_collection( self, id: UUID, @@ -350,7 +355,7 @@ def create_collection( raise UniqueConstraintError() raise InternalError() - @overrides + @override def delete_collection( self, id: UUID, @@ -378,7 +383,7 @@ def delete_collection( raise NotFoundError() raise InternalError() - @overrides + @override def get_collections( self, id: Optional[UUID] = None, @@ -429,7 +434,7 @@ def get_collections( ) raise InternalError() - @overrides + @override def count_collections( self, tenant: str = DEFAULT_TENANT, @@ -455,7 +460,7 @@ def count_collections( logger.error(f"Failed to count collections due to error: {e}") raise InternalError() - @overrides + @override def get_collection_size(self, id: UUID) -> int: try: request = GetCollectionSizeRequest(id=id.hex) @@ -470,7 +475,7 @@ def get_collection_size(self, id: UUID) -> int: @trace_method( "SysDB.get_collection_with_segments", OpenTelemetryGranularity.OPERATION ) - @overrides + @override def get_collection_with_segments( self, collection_id: UUID ) -> CollectionAndSegments: @@ -491,7 +496,7 @@ def get_collection_with_segments( ) raise InternalError() - @overrides + @override def update_collection( self, id: UUID, diff --git a/chromadb/db/impl/grpc/server.py b/chromadb/db/impl/grpc/server.py index 5526958f927..9cae862adec 100644 --- a/chromadb/db/impl/grpc/server.py +++ b/chromadb/db/impl/grpc/server.py @@ -1,8 +1,13 @@ from concurrent import futures from typing import Any, Dict, List, cast from uuid import UUID -from overrides import overrides import json +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.config import DEFAULT_DATABASE, DEFAULT_TENANT, Component, System from chromadb.proto.convert import ( @@ -73,7 +78,7 @@ def __init__(self, system: System): self._server_port = system.settings.require("chroma_server_grpc_port") return super().__init__(system) - @overrides + @override def start(self) -> None: self._server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) add_SysDBServicer_to_server(self, self._server) # type: ignore @@ -81,12 +86,12 @@ def start(self) -> None: self._server.start() return super().start() - @overrides + @override def stop(self) -> None: self._server.stop(None) return super().stop() - @overrides + @override def reset_state(self) -> None: self._segments = {} self._tenants_to_databases_to_collections = {} @@ -97,7 +102,7 @@ def reset_state(self) -> None: self._tenants_to_database_to_id[DEFAULT_TENANT][DEFAULT_DATABASE] = UUID(int=0) return super().reset_state() - @overrides(check_signature=False) + @override(check_signature=False) def CreateDatabase( self, request: CreateDatabaseRequest, context: grpc.ServicerContext ) -> CreateDatabaseResponse: @@ -113,7 +118,7 @@ def CreateDatabase( self._tenants_to_database_to_id[tenant][database] = UUID(hex=request.id) return CreateDatabaseResponse() - @overrides(check_signature=False) + @override(check_signature=False) def GetDatabase( self, request: GetDatabaseRequest, context: grpc.ServicerContext ) -> GetDatabaseResponse: @@ -128,7 +133,7 @@ def GetDatabase( database=proto.Database(id=id.hex, name=database, tenant=tenant), ) - @overrides(check_signature=False) + @override(check_signature=False) def CreateTenant( self, request: CreateTenantRequest, context: grpc.ServicerContext ) -> CreateTenantResponse: @@ -141,7 +146,7 @@ def CreateTenant( self._tenants_to_database_to_id[tenant] = {} return CreateTenantResponse() - @overrides(check_signature=False) + @override(check_signature=False) def GetTenant( self, request: GetTenantRequest, context: grpc.ServicerContext ) -> GetTenantResponse: @@ -155,7 +160,7 @@ def GetTenant( # We are forced to use check_signature=False because the generated proto code # does not have type annotations for the request and response objects. # TODO: investigate generating types for the request and response objects - @overrides(check_signature=False) + @override(check_signature=False) def CreateSegment( self, request: CreateSegmentRequest, context: grpc.ServicerContext ) -> CreateSegmentResponse: @@ -173,7 +178,7 @@ def CreateSegmentHelper( self._segments[segment["id"].hex] = segment return CreateSegmentResponse() - @overrides(check_signature=False) + @override(check_signature=False) def DeleteSegment( self, request: DeleteSegmentRequest, context: grpc.ServicerContext ) -> DeleteSegmentResponse: @@ -186,7 +191,7 @@ def DeleteSegment( grpc.StatusCode.NOT_FOUND, f"Segment {id_to_delete} not found" ) - @overrides(check_signature=False) + @override(check_signature=False) def GetSegments( self, request: GetSegmentsRequest, context: grpc.ServicerContext ) -> GetSegmentsResponse: @@ -214,7 +219,7 @@ def GetSegments( segments=[to_proto_segment(segment) for segment in found_segments] ) - @overrides(check_signature=False) + @override(check_signature=False) def UpdateSegment( self, request: UpdateSegmentRequest, context: grpc.ServicerContext ) -> UpdateSegmentResponse: @@ -234,7 +239,7 @@ def UpdateSegment( segment["metadata"] = {} return UpdateSegmentResponse() - @overrides(check_signature=False) + @override(check_signature=False) def CreateCollection( self, request: CreateCollectionRequest, context: grpc.ServicerContext ) -> CreateCollectionResponse: @@ -324,7 +329,7 @@ def CreateCollection( created=True, ) - @overrides(check_signature=False) + @override(check_signature=False) def DeleteCollection( self, request: DeleteCollectionRequest, context: grpc.ServicerContext ) -> DeleteCollectionResponse: @@ -349,7 +354,7 @@ def DeleteCollection( grpc.StatusCode.NOT_FOUND, f"Collection {collection_id} not found" ) - @overrides(check_signature=False) + @override(check_signature=False) def GetCollections( self, request: GetCollectionsRequest, context: grpc.ServicerContext ) -> GetCollectionsResponse: @@ -380,7 +385,7 @@ def GetCollections( ] ) - @overrides(check_signature=False) + @override(check_signature=False) def CountCollections( self, request: CountCollectionsRequest, context: grpc.ServicerContext ) -> CountCollectionsResponse: @@ -391,7 +396,7 @@ def CountCollections( collections = self.GetCollections(request, context) return CountCollectionsResponse(count=len(collections.collections)) - @overrides(check_signature=False) + @override(check_signature=False) def GetCollectionSize( self, request: GetCollectionSizeRequest, context: grpc.ServicerContext ) -> GetCollectionSizeResponse: @@ -399,7 +404,7 @@ def GetCollectionSize( total_records_post_compaction=0, ) - @overrides(check_signature=False) + @override(check_signature=False) def GetCollectionWithSegments( self, request: GetCollectionWithSegmentsRequest, context: grpc.ServicerContext ) -> GetCollectionWithSegmentsResponse: @@ -437,7 +442,7 @@ def GetCollectionWithSegments( segments=[to_proto_segment(segment) for segment in segments], ) - @overrides(check_signature=False) + @override(check_signature=False) def UpdateCollection( self, request: UpdateCollectionRequest, context: grpc.ServicerContext ) -> UpdateCollectionResponse: @@ -479,7 +484,7 @@ def UpdateCollection( return UpdateCollectionResponse() - @overrides(check_signature=False) + @override(check_signature=False) def ResetState( self, request: Empty, context: grpc.ServicerContext ) -> ResetStateResponse: diff --git a/chromadb/db/impl/sqlite.py b/chromadb/db/impl/sqlite.py index ce50b165c72..fd5c945f6ce 100644 --- a/chromadb/db/impl/sqlite.py +++ b/chromadb/db/impl/sqlite.py @@ -11,7 +11,12 @@ trace_method, ) import sqlite3 -from overrides import override +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override import pypika from typing import Sequence, cast, Optional, Type, Any from typing_extensions import Literal diff --git a/chromadb/db/impl/sqlite_pool.py b/chromadb/db/impl/sqlite_pool.py index 5444d71b4bc..9df5e5b005c 100644 --- a/chromadb/db/impl/sqlite_pool.py +++ b/chromadb/db/impl/sqlite_pool.py @@ -2,8 +2,13 @@ import weakref from abc import ABC, abstractmethod from typing import Any, Set +import sys import threading -from overrides import override + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from typing_extensions import Annotated diff --git a/chromadb/db/mixins/embeddings_queue.py b/chromadb/db/mixins/embeddings_queue.py index a8899f6bcf7..da37f31e4ea 100644 --- a/chromadb/db/mixins/embeddings_queue.py +++ b/chromadb/db/mixins/embeddings_queue.py @@ -1,5 +1,11 @@ from functools import cached_property import json +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.api.configuration import ( ConfigurationParameter, EmbeddingsQueueConfigurationInternal, @@ -26,7 +32,6 @@ OpenTelemetryGranularity, trace_method, ) -from overrides import override from collections import defaultdict from typing import Sequence, Optional, Dict, Set, Tuple, cast from uuid import UUID diff --git a/chromadb/db/mixins/sysdb.py b/chromadb/db/mixins/sysdb.py index 83d2244dde4..770a8c0246c 100644 --- a/chromadb/db/mixins/sysdb.py +++ b/chromadb/db/mixins/sysdb.py @@ -2,7 +2,11 @@ import sys from typing import Optional, Sequence, Any, Tuple, cast, Dict, Union, Set from uuid import UUID -from overrides import override + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from pypika import Table, Column from itertools import groupby diff --git a/chromadb/errors.py b/chromadb/errors.py index d528ba1b872..01ebd1606df 100644 --- a/chromadb/errors.py +++ b/chromadb/errors.py @@ -1,6 +1,15 @@ from abc import abstractmethod from typing import Dict, Optional, Type -from overrides import overrides, EnforceOverrides +import sys + +if sys.version_info >= (3, 12): + from typing import override + + class EnforceOverrides: + pass +else: + from overrides import overrides as override + from overrides import EnforceOverrides class ChromaError(Exception, EnforceOverrides): @@ -22,153 +31,153 @@ def name(cls) -> str: class InvalidDimensionException(ChromaError): @classmethod - @overrides + @override def name(cls) -> str: return "InvalidDimension" class IDAlreadyExistsError(ChromaError): - @overrides + @override def code(self) -> int: return 409 # Conflict @classmethod - @overrides + @override def name(cls) -> str: return "IDAlreadyExists" class ChromaAuthError(ChromaError): - @overrides + @override def code(self) -> int: return 403 @classmethod - @overrides + @override def name(cls) -> str: return "AuthError" - @overrides + @override def message(self) -> str: return "Forbidden" class DuplicateIDError(ChromaError): @classmethod - @overrides + @override def name(cls) -> str: return "DuplicateID" class InvalidArgumentError(ChromaError): - @overrides + @override def code(self) -> int: return 400 @classmethod - @overrides + @override def name(cls) -> str: return "InvalidArgument" class InvalidUUIDError(ChromaError): @classmethod - @overrides + @override def name(cls) -> str: return "InvalidUUID" class InvalidHTTPVersion(ChromaError): @classmethod - @overrides + @override def name(cls) -> str: return "InvalidHTTPVersion" class AuthorizationError(ChromaError): - @overrides + @override def code(self) -> int: return 401 @classmethod - @overrides + @override def name(cls) -> str: return "AuthorizationError" class NotFoundError(ChromaError): - @overrides + @override def code(self) -> int: return 404 @classmethod - @overrides + @override def name(cls) -> str: return "NotFoundError" class UniqueConstraintError(ChromaError): - @overrides + @override def code(self) -> int: return 409 @classmethod - @overrides + @override def name(cls) -> str: return "UniqueConstraintError" class BatchSizeExceededError(ChromaError): - @overrides + @override def code(self) -> int: return 413 @classmethod - @overrides + @override def name(cls) -> str: return "BatchSizeExceededError" class VersionMismatchError(ChromaError): - @overrides + @override def code(self) -> int: return 500 @classmethod - @overrides + @override def name(cls) -> str: return "VersionMismatchError" class InternalError(ChromaError): - @overrides + @override def code(self) -> int: return 500 @classmethod - @overrides + @override def name(cls) -> str: return "InternalError" class RateLimitError(ChromaError): - @overrides + @override def code(self) -> int: return 429 @classmethod - @overrides + @override def name(cls) -> str: return "RateLimitError" class QuotaError(ChromaError): - @overrides + @override def code(self) -> int: return 400 @classmethod - @overrides + @override def name(cls) -> str: return "QuotaError" diff --git a/chromadb/execution/executor/distributed.py b/chromadb/execution/executor/distributed.py index b47e3c6d012..cd07bf310cd 100644 --- a/chromadb/execution/executor/distributed.py +++ b/chromadb/execution/executor/distributed.py @@ -2,7 +2,12 @@ import random from typing import Callable, Dict, List, Optional, TypeVar import grpc -from overrides import overrides +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.api.types import GetResult, Metadata, QueryResult from chromadb.config import System from chromadb.execution.executor.abstract import Executor @@ -109,7 +114,7 @@ def before_sleep(_: RetryCallState) -> None: # NOTE(hammadb) because Retrying() will always either return or raise an exception, this line should never be reached raise Exception("Unreachable code error - should never reach here") - @overrides + @override def count(self, plan: CountPlan) -> int: endpoints = self._get_grpc_endpoints(plan.scan) count_funcs = [self._get_stub(endpoint).Count for endpoint in endpoints] @@ -118,7 +123,7 @@ def count(self, plan: CountPlan) -> int: ) return convert.from_proto_count_result(count_result) - @overrides + @override def get(self, plan: GetPlan) -> GetResult: endpoints = self._get_grpc_endpoints(plan.scan) get_funcs = [self._get_stub(endpoint).Get for endpoint in endpoints] @@ -158,7 +163,7 @@ def get(self, plan: GetPlan) -> GetResult: included=plan.projection.included, ) - @overrides + @override def knn(self, plan: KNNPlan) -> QueryResult: endpoints = self._get_grpc_endpoints(plan.scan) knn_funcs = [self._get_stub(endpoint).KNN for endpoint in endpoints] diff --git a/chromadb/execution/executor/local.py b/chromadb/execution/executor/local.py index f522200b646..f6c9fc84a85 100644 --- a/chromadb/execution/executor/local.py +++ b/chromadb/execution/executor/local.py @@ -1,6 +1,10 @@ from typing import Optional, Sequence +import sys -from overrides import overrides +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.api.types import GetResult, Metadata, QueryResult from chromadb.config import System @@ -47,11 +51,11 @@ def __init__(self, system: System): super().__init__(system) self._manager = self.require(LocalSegmentManager) - @overrides + @override def count(self, plan: CountPlan) -> int: return self._metadata_segment(plan.scan.collection).count(plan.scan.version) - @overrides + @override def get(self, plan: GetPlan) -> GetResult: records = self._metadata_segment(plan.scan.collection).get_metadata( request_version_context=plan.scan.version, @@ -103,7 +107,7 @@ def get(self, plan: GetPlan) -> GetResult: included=included, ) - @overrides + @override def knn(self, plan: KNNPlan) -> QueryResult: prefiltered_ids = None if plan.filter.user_ids or plan.filter.where or plan.filter.where_document: diff --git a/chromadb/logservice/logservice.py b/chromadb/logservice/logservice.py index 5da500c1e5b..6db50e26cf1 100644 --- a/chromadb/logservice/logservice.py +++ b/chromadb/logservice/logservice.py @@ -23,7 +23,11 @@ add_attributes_to_current_span, trace_method, ) -from overrides import override + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from typing import Sequence, Optional, cast from uuid import UUID import logging diff --git a/chromadb/quota/simple_quota_enforcer/__init__.py b/chromadb/quota/simple_quota_enforcer/__init__.py index 4ad166a6c0b..f0f178487fe 100644 --- a/chromadb/quota/simple_quota_enforcer/__init__.py +++ b/chromadb/quota/simple_quota_enforcer/__init__.py @@ -1,7 +1,12 @@ -from overrides import override +import sys from typing import Any, Callable, TypeVar, Dict, Optional from uuid import UUID +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override + from chromadb.api.types import ( Embeddings, Metadatas, diff --git a/chromadb/rate_limit/simple_rate_limit/__init__.py b/chromadb/rate_limit/simple_rate_limit/__init__.py index 323d9b1f5cd..401ba993a5e 100644 --- a/chromadb/rate_limit/simple_rate_limit/__init__.py +++ b/chromadb/rate_limit/simple_rate_limit/__init__.py @@ -1,7 +1,12 @@ -from overrides import override +import sys from typing import Any, Awaitable, Callable, TypeVar from functools import wraps +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override + from chromadb.rate_limit import RateLimitEnforcer from chromadb.config import System diff --git a/chromadb/segment/distributed/__init__.py b/chromadb/segment/distributed/__init__.py index beb48102ac6..f95490b619a 100644 --- a/chromadb/segment/distributed/__init__.py +++ b/chromadb/segment/distributed/__init__.py @@ -1,8 +1,16 @@ from abc import abstractmethod from dataclasses import dataclass from typing import Any, Callable, List +import sys -from overrides import EnforceOverrides, overrides +if sys.version_info >= (3, 12): + from typing import override + + class EnforceOverrides: + pass +else: + from overrides import overrides as override + from overrides import EnforceOverrides from chromadb.config import Component, System from chromadb.types import Segment @@ -56,7 +64,7 @@ def set_memberlist_name(self, memberlist: str) -> None: """Sets the memberlist that this provider will watch""" pass - @overrides + @override def stop(self) -> None: """Stops watching the memberlist""" self.callbacks = [] diff --git a/chromadb/segment/impl/distributed/segment_directory.py b/chromadb/segment/impl/distributed/segment_directory.py index 1366052e374..b565df24eb9 100644 --- a/chromadb/segment/impl/distributed/segment_directory.py +++ b/chromadb/segment/impl/distributed/segment_directory.py @@ -1,9 +1,18 @@ +import sys import threading import time from typing import Any, Callable, Dict, List, Optional, cast from kubernetes import client, config, watch from kubernetes.client.rest import ApiException -from overrides import EnforceOverrides, override + +if sys.version_info >= (3, 12): + from typing import override + + class EnforceOverrides: + pass +else: + from overrides import overrides as override + from overrides import EnforceOverrides from chromadb.config import RoutingMode, System from chromadb.segment.distributed import ( Member, diff --git a/chromadb/segment/impl/manager/cache/cache.py b/chromadb/segment/impl/manager/cache/cache.py index 24c68e8ecbf..b0626f8e702 100644 --- a/chromadb/segment/impl/manager/cache/cache.py +++ b/chromadb/segment/impl/manager/cache/cache.py @@ -1,11 +1,16 @@ +import sys import threading import uuid from typing import Any, Callable from chromadb.types import Segment -from overrides import override from typing import Dict, Optional from abc import ABC, abstractmethod +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override + class SegmentCache(ABC): @abstractmethod diff --git a/chromadb/segment/impl/manager/distributed.py b/chromadb/segment/impl/manager/distributed.py index 8563cd6e882..6dcff8f92c1 100644 --- a/chromadb/segment/impl/manager/distributed.py +++ b/chromadb/segment/impl/manager/distributed.py @@ -1,8 +1,12 @@ from threading import Lock from typing import Dict, List, Sequence from uuid import UUID, uuid4 +import sys -from overrides import override +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.config import System from chromadb.db.system import SysDB diff --git a/chromadb/segment/impl/manager/local.py b/chromadb/segment/impl/manager/local.py index 6073ea1b534..931c9b68060 100644 --- a/chromadb/segment/impl/manager/local.py +++ b/chromadb/segment/impl/manager/local.py @@ -14,10 +14,15 @@ SegmentCache, ) import os +import sys from chromadb.config import System, get_class from chromadb.db.system import SysDB -from overrides import override + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.segment.impl.vector.local_persistent_hnsw import ( PersistentLocalHnswSegment, ) diff --git a/chromadb/segment/impl/metadata/sqlite.py b/chromadb/segment/impl/metadata/sqlite.py index 22544f1948f..ac9be2ce1a9 100644 --- a/chromadb/segment/impl/metadata/sqlite.py +++ b/chromadb/segment/impl/metadata/sqlite.py @@ -1,10 +1,15 @@ from typing import Optional, Sequence, Any, Tuple, cast, Generator, Union, Dict, List +import sys from chromadb.segment import MetadataReader from chromadb.ingest import Consumer from chromadb.config import System from chromadb.types import RequestVersionContext, Segment, InclusionExclusionOperator from chromadb.db.impl.sqlite import SqliteDB -from overrides import override + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.db.base import ( Cursor, ParameterValue, diff --git a/chromadb/segment/impl/vector/local_hnsw.py b/chromadb/segment/impl/vector/local_hnsw.py index 8861ef98d43..29dd243df12 100644 --- a/chromadb/segment/impl/vector/local_hnsw.py +++ b/chromadb/segment/impl/vector/local_hnsw.py @@ -1,6 +1,11 @@ -from overrides import override +import sys from typing import Optional, Sequence, Dict, Set, List, cast from uuid import UUID + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.segment import VectorReader from chromadb.ingest import Consumer from chromadb.config import System, Settings diff --git a/chromadb/segment/impl/vector/local_persistent_hnsw.py b/chromadb/segment/impl/vector/local_persistent_hnsw.py index 33f20eb92e3..81d2f421102 100644 --- a/chromadb/segment/impl/vector/local_persistent_hnsw.py +++ b/chromadb/segment/impl/vector/local_persistent_hnsw.py @@ -1,8 +1,13 @@ import os import shutil -from overrides import override +import sys import pickle from typing import Dict, List, Optional, Sequence, Set, cast + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.config import System from chromadb.db.base import ParameterValue, get_sql from chromadb.db.impl.sqlite import SqliteDB diff --git a/chromadb/telemetry/product/posthog.py b/chromadb/telemetry/product/posthog.py index b07a3ab1903..8f235940154 100644 --- a/chromadb/telemetry/product/posthog.py +++ b/chromadb/telemetry/product/posthog.py @@ -2,12 +2,16 @@ import logging import sys from typing import Any, Dict, Set + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.config import System from chromadb.telemetry.product import ( ProductTelemetryClient, ProductTelemetryEvent, ) -from overrides import override logger = logging.getLogger(__name__) diff --git a/chromadb/test/client/test_database_tenant_auth.py b/chromadb/test/client/test_database_tenant_auth.py index 169dcb1b7d4..d3a767e3f7b 100644 --- a/chromadb/test/client/test_database_tenant_auth.py +++ b/chromadb/test/client/test_database_tenant_auth.py @@ -1,6 +1,11 @@ from typing import Dict +import sys from fastapi import HTTPException -from overrides import override + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.auth import ( AuthzAction, AuthzResource, diff --git a/chromadb/test/configurations/test_configurations.py b/chromadb/test/configurations/test_configurations.py index 0d952957a73..91cf46a9f58 100644 --- a/chromadb/test/configurations/test_configurations.py +++ b/chromadb/test/configurations/test_configurations.py @@ -1,5 +1,10 @@ -from overrides import overrides +import sys import pytest + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.api.configuration import ( ConfigurationInternal, ConfigurationDefinition, @@ -26,7 +31,7 @@ class TestConfiguration(ConfigurationInternal): ), } - @overrides + @override def configuration_validator(self) -> None: pass @@ -96,7 +101,7 @@ class FooConfiguration(ConfigurationInternal): ), } - @overrides + @override def configuration_validator(self) -> None: if self.parameter_map.get("foo") != "bar": raise InvalidConfigurationError("foo must be 'bar'") diff --git a/chromadb/test/property/test_collections_with_database_tenant_overwrite.py b/chromadb/test/property/test_collections_with_database_tenant_overwrite.py index e4844dcca2f..faa0417e85d 100644 --- a/chromadb/test/property/test_collections_with_database_tenant_overwrite.py +++ b/chromadb/test/property/test_collections_with_database_tenant_overwrite.py @@ -1,5 +1,5 @@ from typing import Dict, Optional, Tuple -from overrides import overrides +import sys from hypothesis.stateful import ( initialize, invariant, @@ -7,6 +7,11 @@ run_state_machine_as_test, ) +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override + import uuid import logging import pytest @@ -81,11 +86,11 @@ def change_clients(self) -> None: self.client = self.singleton_client self.admin_client = self.singleton_admin_client - @overrides + @override def set_api_tenant_database(self, tenant: str, database: str) -> None: self.root_client.set_tenant(tenant, database) - @overrides + @override def get_tenant_model( self, tenant: str ) -> Dict[str, Dict[str, Optional[types.CollectionMetadata]]]: @@ -93,7 +98,7 @@ def get_tenant_model( tenant = SINGLETON_TENANT return self.tenant_to_database_to_model[tenant] - @overrides + @override def set_tenant_model( self, tenant: str, @@ -108,7 +113,7 @@ def set_tenant_model( raise ValueError("trying to overwrite the model for singleton??") self.tenant_to_database_to_model[tenant] = model - @overrides + @override def set_database_model_for_tenant( self, tenant: str, @@ -124,13 +129,13 @@ def set_database_model_for_tenant( raise ValueError("trying to overwrite the model for singleton??") self.tenant_to_database_to_model[tenant][database] = database_model - @overrides + @override def overwrite_database(self, database: str) -> str: if self.client == self.singleton_client: return SINGLETON_DATABASE return database - @overrides + @override def overwrite_tenant(self, tenant: str) -> str: if self.client == self.singleton_client: return SINGLETON_TENANT diff --git a/chromadb/test/property/test_embeddings.py b/chromadb/test/property/test_embeddings.py index e4d8f9478a4..1edd09d1b73 100644 --- a/chromadb/test/property/test_embeddings.py +++ b/chromadb/test/property/test_embeddings.py @@ -1,9 +1,14 @@ import hypothesis.stateful import hypothesis.strategies -from overrides import overrides +import sys import pytest import logging import hypothesis + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override import hypothesis.strategies as st from hypothesis import given, settings, HealthCheck from typing import Dict, Set, cast, Union, DefaultDict, Any, List @@ -112,7 +117,7 @@ def initialize(self, collection: strategies.Collection): ids=[], metadatas=[], documents=[], embeddings=[] ) - @overrides + @override def teardown(self) -> None: self.client.delete_collection(self.collection.name) diff --git a/chromadb/test/property/test_fork.py b/chromadb/test/property/test_fork.py index 95044c16413..fac1611d5da 100644 --- a/chromadb/test/property/test_fork.py +++ b/chromadb/test/property/test_fork.py @@ -5,6 +5,7 @@ import hypothesis.strategies as hyst import logging import pytest +import sys from chromadb.api.models.Collection import Collection from chromadb.test.conftest import reset, skip_if_not_cluster @@ -19,7 +20,11 @@ run_state_machine_as_test, MultipleResults, ) -from overrides import overrides + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from typing import Dict, cast, Union, Tuple, Set collection_st = hyst.shared(strategies.collections(with_hnsw_params=True), key="source") @@ -53,7 +58,7 @@ def initialize( ids=[], metadatas=[], documents=[], embeddings=[] ) - @overrides + @override def teardown(self) -> None: reset(self.client) diff --git a/chromadb/test/property/test_restart_persist.py b/chromadb/test/property/test_restart_persist.py index d9e2e6b4c51..f5731d0bc59 100644 --- a/chromadb/test/property/test_restart_persist.py +++ b/chromadb/test/property/test_restart_persist.py @@ -1,4 +1,9 @@ -from overrides import overrides +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from chromadb.api.client import Client from chromadb.config import System import hypothesis.strategies as st @@ -40,7 +45,7 @@ def __init__(self, system: System) -> None: super().__init__(client) @initialize(collection=collection_persistent_st) # type: ignore - @overrides + @override def initialize(self, collection: strategies.Collection): self.client.reset() @@ -69,7 +74,7 @@ def restart_system(self) -> None: self.collection.name, embedding_function=self.embedding_function ) - @overrides + @override def teardown(self) -> None: super().teardown() # Need to manually stop the system to cleanup resources because we may have created a new system (above rule). diff --git a/chromadb/test/test_config.py b/chromadb/test/test_config.py index f24af28381f..48524b8fcd3 100644 --- a/chromadb/test/test_config.py +++ b/chromadb/test/test_config.py @@ -1,7 +1,12 @@ from chromadb.config import Component, System, Settings -from overrides import overrides from threading import local import random +import sys + +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override data = local() # use thread local just in case tests ever run in parallel @@ -20,11 +25,11 @@ def __init__(self, system: System): self.require(ComponentB) self.require(ComponentC) - @overrides + @override def start(self) -> None: data.starts += "A" - @overrides + @override def stop(self) -> None: data.stops += "A" @@ -36,11 +41,11 @@ def __init__(self, system: System): self.require(ComponentC) self.require(ComponentD) - @overrides + @override def start(self) -> None: data.starts += "B" - @overrides + @override def stop(self) -> None: data.stops += "B" @@ -51,11 +56,11 @@ def __init__(self, system: System): super().__init__(system) self.require(ComponentD) - @overrides + @override def start(self) -> None: data.starts += "C" - @overrides + @override def stop(self) -> None: data.stops += "C" @@ -65,11 +70,11 @@ def __init__(self, system: System): data.inits += "D" super().__init__(system) - @overrides + @override def start(self) -> None: data.starts += "D" - @overrides + @override def stop(self) -> None: data.stops += "D" @@ -165,11 +170,11 @@ def __init__(self, system: System): super().__init__(system) self.require(ComponentC) - @overrides + @override def start(self) -> None: pass - @overrides + @override def stop(self) -> None: pass diff --git a/chromadb/types.py b/chromadb/types.py index 11190932b28..d4a86a56fd7 100644 --- a/chromadb/types.py +++ b/chromadb/types.py @@ -1,10 +1,14 @@ from abc import ABC, abstractmethod from dataclasses import dataclass from typing import Any, Optional, Union, Sequence, Dict, Mapping, Generic +import sys from typing_extensions import Self -from overrides import override +if sys.version_info >= (3, 12): + from typing import override +else: + from overrides import overrides as override from typing_extensions import TypedDict, TypeVar from uuid import UUID from enum import Enum diff --git a/clients/python/pyproject.toml b/clients/python/pyproject.toml index 8448765b299..d34d77a77cf 100644 --- a/clients/python/pyproject.toml +++ b/clients/python/pyproject.toml @@ -18,7 +18,7 @@ dependencies = [ 'opentelemetry-api>=1.2.0', 'opentelemetry-exporter-otlp-proto-grpc>=1.2.0', 'opentelemetry-sdk>=1.2.0', - 'overrides >= 7.3.1', + 'overrides >= 7.3.1; python_version < "3.12"', 'posthog >= 2.4.0, < 6.0.0', 'pydantic>=1.9', 'typing_extensions >= 4.5.0', diff --git a/clients/python/requirements.txt b/clients/python/requirements.txt index 94f622de48f..f23564aa404 100644 --- a/clients/python/requirements.txt +++ b/clients/python/requirements.txt @@ -4,7 +4,7 @@ opentelemetry-api>=1.2.0 opentelemetry-exporter-otlp-proto-grpc>=1.2.0 opentelemetry-sdk>=1.2.0 orjson>=3.9.12 -overrides >= 7.3.1 +overrides >= 7.3.1; python_version < "3.12" posthog>=2.4.0,<6.0.0 pybase64>=1.4.1 pydantic>=1.9 diff --git a/pyproject.toml b/pyproject.toml index 6cb42955dea..1e8b30113a5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ description = "Chroma." readme = "README.md" requires-python = ">=3.9" classifiers = ["Programming Language :: Python :: 3", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent"] -dependencies = ['build >= 1.0.3', 'pydantic >= 1.9', 'pybase64>=1.4.1', 'uvicorn[standard] >= 0.18.3', 'numpy >= 1.22.5', 'posthog >= 2.4.0, < 6.0.0', 'typing_extensions >= 4.5.0', 'onnxruntime >= 1.14.1', 'opentelemetry-api>=1.2.0', 'opentelemetry-exporter-otlp-proto-grpc>=1.2.0', 'opentelemetry-sdk>=1.2.0', 'tokenizers >= 0.13.2', 'pypika >= 0.48.9', 'tqdm >= 4.65.0', 'overrides >= 7.3.1', 'importlib-resources', 'graphlib_backport >= 1.0.3; python_version < "3.9"', 'grpcio >= 1.58.0', 'bcrypt >= 4.0.1', 'typer >= 0.9.0', 'kubernetes>=28.1.0', 'tenacity>=8.2.3', 'PyYAML>=6.0.0', 'mmh3>=4.0.1', 'orjson>=3.9.12', 'httpx>=0.27.0', 'rich>=10.11.0', 'jsonschema>=4.19.0'] +dependencies = ['build >= 1.0.3', 'pydantic >= 1.9', 'pybase64>=1.4.1', 'uvicorn[standard] >= 0.18.3', 'numpy >= 1.22.5', 'posthog >= 2.4.0, < 6.0.0', 'typing_extensions >= 4.5.0', 'onnxruntime >= 1.14.1', 'opentelemetry-api>=1.2.0', 'opentelemetry-exporter-otlp-proto-grpc>=1.2.0', 'opentelemetry-sdk>=1.2.0', 'tokenizers >= 0.13.2', 'pypika >= 0.48.9', 'tqdm >= 4.65.0', 'overrides >= 7.3.1; python_version < "3.12"', 'importlib-resources', 'graphlib_backport >= 1.0.3; python_version < "3.9"', 'grpcio >= 1.58.0', 'bcrypt >= 4.0.1', 'typer >= 0.9.0', 'kubernetes>=28.1.0', 'tenacity>=8.2.3', 'PyYAML>=6.0.0', 'mmh3>=4.0.1', 'orjson>=3.9.12', 'httpx>=0.27.0', 'rich>=10.11.0', 'jsonschema>=4.19.0'] [project.optional-dependencies] dev = ['chroma-hnswlib==0.7.6', 'fastapi>=0.115.9', 'opentelemetry-instrumentation-fastapi>=0.41b0']