From 4517a1e4bb0ce527e921bb6246b5abe8caf47b0d Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 30 Nov 2023 20:22:34 +0000 Subject: [PATCH 01/37] Add models, repos, config --- aana/configs/db.py | 85 ++++++++++++++++++++ aana/configs/settings.py | 7 ++ aana/exceptions/database.py | 16 ++++ aana/models/db/base.py | 23 ++++++ aana/models/db/caption.py | 22 +++++ aana/models/db/media.py | 26 ++++++ aana/models/db/transcript.py | 27 +++++++ aana/repository/datastore/base.py | 83 +++++++++++++++++++ aana/repository/datastore/caption_repo.py | 12 +++ aana/repository/datastore/engine.py | 4 + aana/repository/datastore/media_repo.py | 12 +++ aana/repository/datastore/session.py | 8 ++ aana/repository/datastore/transcript_repo.py | 12 +++ pyproject.toml | 1 + 14 files changed, 338 insertions(+) create mode 100644 aana/configs/db.py create mode 100644 aana/exceptions/database.py create mode 100644 aana/models/db/base.py create mode 100644 aana/models/db/caption.py create mode 100644 aana/models/db/media.py create mode 100644 aana/models/db/transcript.py create mode 100644 aana/repository/datastore/base.py create mode 100644 aana/repository/datastore/caption_repo.py create mode 100644 aana/repository/datastore/engine.py create mode 100644 aana/repository/datastore/media_repo.py create mode 100644 aana/repository/datastore/session.py create mode 100644 aana/repository/datastore/transcript_repo.py diff --git a/aana/configs/db.py b/aana/configs/db.py new file mode 100644 index 00000000..bf263b10 --- /dev/null +++ b/aana/configs/db.py @@ -0,0 +1,85 @@ +from enum import Enum +from os import PathLike +from typing import TypeAlias, TypedDict + +from sqlalchemy import Integer, create_engine + +# These are here so we can change types in a single place. + +id_type: TypeAlias = int +IdSqlType: TypeAlias = Integer + + +class SQLiteConfig(TypedDict): + """Config values for SQLite.""" + + path: PathLike | str + + +class PostgreSQLConfig(TypedDict): + """Config values for PostgreSQL.""" + + host: str + port: str + user: str + password: str + database: str + + +class DbType(str, Enum): + """Engine types for relational database.""" + + POSTGRESQL = "postgresql" + SQLITE = "sqlite" + + +class DBConfig(TypedDict): + """Database configuration.""" + + datastore_type: DbType | str + datastore_config: SQLiteConfig | PostgreSQLConfig + + +def create_database_engine(db_config): + """Create SQLAlchemy engine based on the provided configuration. + + Args: + db_config (DbConfig): Database configuration. + + Returns: + sqlalchemy.engine.Engine: SQLAlchemy engine instance. + """ + db_type = db_config.get("datastore_type", "").lower() + + if db_type == DbType.POSTGRESQL: + return create_postgresql_engine(db_config["datastore_config"]) + elif db_type == DbType.SQLITE: + return create_sqlite_engine(db_config["datastore_config"]) + else: + raise ValueError(f"Unsupported database type: {db_type}") # noqa: TRY003 + + +def create_postgresql_engine(config): + """Create PostgreSQL engine based on the provided configuration. + + Args: + config (PostgreSQLConfig): Configuration for PostgreSQL. + + Returns: + sqlalchemy.engine.Engine: SQLAlchemy engine instance. + """ + connection_string = f"postgresql://{config['user']}:{config['password']}@{config['host']}:{config['port']}/{config['database']}" + return create_engine(connection_string) + + +def create_sqlite_engine(config): + """Create an SQLite SQLAlchemy engine based on the provided configuration. + + Args: + config (SQLite config): Configuration for SQLite. + + Returns: + sqlalchemy.engine.Engine: SQLAlchemy engine instance. + """ + connection_string = f"sqlite:///{config['path']}" + return create_engine(connection_string) diff --git a/aana/configs/settings.py b/aana/configs/settings.py index b8f9c82a..d0dc16d9 100644 --- a/aana/configs/settings.py +++ b/aana/configs/settings.py @@ -2,6 +2,8 @@ from pydantic import BaseSettings +from aana.configs.db import DBConfig + class Settings(BaseSettings): """A pydantic model for SDK settings.""" @@ -10,5 +12,10 @@ class Settings(BaseSettings): youtube_video_dir = tmp_data_dir / "youtube_videos" image_dir = tmp_data_dir / "images" + db_config: DBConfig = { + "datastore_type": "sqlite", + "datastore_config": {"path": Path("/var/lib/aana_data")}, + } + settings = Settings() diff --git a/aana/exceptions/database.py b/aana/exceptions/database.py new file mode 100644 index 00000000..828258b4 --- /dev/null +++ b/aana/exceptions/database.py @@ -0,0 +1,16 @@ +from mobius_pipeline.exceptions import BaseException + +from aana.configs.db import id_type + + +class NotFoundException(BaseException): + """Raised when an item searched by id is not found.""" + + def __init__(self, table_name: str, id: id_type): # noqa: A002 + """Constructor. + + Arguments: + table_name (str): the name of the table being queried. + id (id_type): the id of the item to be retrieved. + """ + super().__init__(table=table_name, id=id) diff --git a/aana/models/db/base.py b/aana/models/db/base.py new file mode 100644 index 00000000..1810c2ba --- /dev/null +++ b/aana/models/db/base.py @@ -0,0 +1,23 @@ +from sqlalchemy import Column, DateTime, func +from sqlalchemy.orm import DeclarativeBase + + +class BaseModel(DeclarativeBase): + """Base for all ORM classes.""" + + pass + + +class TimeStampEntity: + """Mixin for database entities that will have create/update timestamps.""" + + create_ts = Column( + DateTime(timezone=True), + server_default=func.now(), + comment="Timestamp when row is inserted", + ) + update_ts = Column( + DateTime(timezone=True), + onupdate=func.now(), + comment="Timestamp when row is updated", + ) diff --git a/aana/models/db/caption.py b/aana/models/db/caption.py new file mode 100644 index 00000000..772937c7 --- /dev/null +++ b/aana/models/db/caption.py @@ -0,0 +1,22 @@ +from sqlalchemy import Column, Float, ForeignKey, Integer, String +from sqlalchemy.orm import relationship + +from aana.configs.db import IdSqlType, id_type +from aana.models.db.base import BaseModel, TimeStampEntity + + +class Caption(BaseModel, TimeStampEntity): + """ORM model for media captions.""" + + __tablename__ = "captions" + + id: id_type = Column(IdSqlType, primary_key=True) # noqa: A003 + model = Column(String, comment="Name of model used to generate the caption") + media_id = Column( + IdSqlType, ForeignKey("media.id"), comment="Foreign key to media table" + ) + frame_id = Column(Integer, comment="The 0-based frame id of media for caption") + caption = Column(String, comment="Frame caption") + timestamp = Column(Float, comment="Frame timestamp in seconds") + + media = relationship("Media", back_populates="captions") diff --git a/aana/models/db/media.py b/aana/models/db/media.py new file mode 100644 index 00000000..0f6598c7 --- /dev/null +++ b/aana/models/db/media.py @@ -0,0 +1,26 @@ +from enum import Enum + +from sqlalchemy import Column, Float, String +from sqlalchemy.orm import relationship + +from aana.configs.db import IdSqlType, id_type +from aana.models.db.base import BaseModel, TimeStampEntity + + +class MediaType(str, Enum): + """Enum for types of media file.""" + + VIDEO = "video" + + +class Media(BaseModel, TimeStampEntity): + """ORM class for media file (video, etc).""" + + __tablename__ = "media" + + id: id_type = Column(IdSqlType, primary_key=True) # noqa: A003 + duration = Column(Float, comment="Media duration in seconds") + media_type = Column(String, comment="Media type") + + captions = relationship("Caption", back_populates="media") + transcripts = relationship("Transcript", back_populates="media") diff --git a/aana/models/db/transcript.py b/aana/models/db/transcript.py new file mode 100644 index 00000000..55f1fce1 --- /dev/null +++ b/aana/models/db/transcript.py @@ -0,0 +1,27 @@ +from sqlalchemy import Column, Float, ForeignKey, String +from sqlalchemy.orm import relationship + +from aana.configs.db import IdSqlType, id_type +from aana.models.db.base import BaseModel, TimeStampEntity + + +class Transcript(BaseModel, TimeStampEntity): + """ORM class for media transcripts generated by a model.""" + + __tablename__ = "transcripts" + + id: id_type = Column(IdSqlType, primary_key=True) # noqa: A003 + model = Column(String, comment="Name of model used to generate transcript") + media_id = Column( + IdSqlType, ForeignKey("media.id"), comment="Foreign key to media table" + ) + transcript = Column(String, comment="Full text transcript of media") + segments = Column(String, comment="Segments of the transcript") + language = Column( + String, comment="Language of the transcript as predicted by model" + ) + language_confidence = Column( + Float, comment="Confidence score of language prediction" + ) + + media = relationship("Media", back_populates="transcripts") diff --git a/aana/repository/datastore/base.py b/aana/repository/datastore/base.py new file mode 100644 index 00000000..76a98139 --- /dev/null +++ b/aana/repository/datastore/base.py @@ -0,0 +1,83 @@ +# ruff: noqa: A002 +from collections.abc import Iterable +from typing import Generic, TypeVar + +from sqlalchemy.orm import Session + +from aana.configs.db import id_type +from aana.exceptions.database import NotFoundException +from aana.models.db.base import BaseModel + +T = TypeVar("T", bound=BaseModel) + + +# Does not yet have an update method because I'm not sure if we'll need one. +class BaseRepository(Generic[T]): + """Base class for repositories.""" + + session: Session + table_name: str + model_class: type[T] + + def __init__(self, session: Session, model_class: type[T]): + """Constructor.""" + self.session = session + self.table_name = model_class.__tablename__ + self.model_class = model_class + + def create(self, entity: T) -> T: + """Inserts a single new entity.""" + self.session.add(entity) + self.session.commit() + return entity + + def create_multiple(self, entities: Iterable[T]) -> list[T]: + """Inserts multiple entities. + + Returns: + list[T] - entities as a list. + """ + entities = list(entities) + self.session.add_all(entities) + self.session.commit() + return entities + + def read(self, item_id: id_type) -> T: + """Reads a single item by id from the database. + + Arguments: + item_id (id_type): id of the item to retrieve + + Returns: + The corresponding entity from the database if found. + + Raises: + NotFoundException: The id does not correspond to a record in the database. + """ + entity: T | None = self.session.query(self.model_class).get(item_id) + if not entity: + raise NotFoundException(self.table_name, item_id) + return entity + + def delete(self, id: id_type, check: bool = False) -> T | None: + """Deletes an entity. + + Arguments: + id (id_type): the id of the item to be deleted. + check (bool): whether to raise if the entity is not found (defaults to True). + + Returns: + The entity, if found. None, if not and `check` is False. + + Raises: + NotFoundException if the entity is not found and `check` is True. + """ + entity = self.read(id) + if entity: + self.session.delete(entity) + self.session.commit() + return entity + elif check: + raise NotFoundException(self.table_name, id) + else: + return None diff --git a/aana/repository/datastore/caption_repo.py b/aana/repository/datastore/caption_repo.py new file mode 100644 index 00000000..4aa68ae4 --- /dev/null +++ b/aana/repository/datastore/caption_repo.py @@ -0,0 +1,12 @@ +from sqlalchemy.orm import Session + +from aana.models.db.caption import Caption +from aana.repository.datastore.base import BaseRepository + + +class CaptionRepository(BaseRepository[Caption]): + """Repository for Captions.""" + + def __init__(self, session: Session): + """Constructor.""" + super().__init__(session, Caption) diff --git a/aana/repository/datastore/engine.py b/aana/repository/datastore/engine.py new file mode 100644 index 00000000..bb03c61b --- /dev/null +++ b/aana/repository/datastore/engine.py @@ -0,0 +1,4 @@ +from aana.configs.db import create_database_engine +from aana.configs.settings import settings + +engine = create_database_engine(settings) diff --git a/aana/repository/datastore/media_repo.py b/aana/repository/datastore/media_repo.py new file mode 100644 index 00000000..783a8335 --- /dev/null +++ b/aana/repository/datastore/media_repo.py @@ -0,0 +1,12 @@ +from sqlalchemy.orm import Session + +from aana.models.db.media import Media +from aana.repository.datastore.base import BaseRepository + + +class MediaRepository(BaseRepository[Media]): + """Repository for media files.""" + + def __init__(self, session: Session): + """Constructor.""" + super().__init__(session, Media) diff --git a/aana/repository/datastore/session.py b/aana/repository/datastore/session.py new file mode 100644 index 00000000..f6c1574e --- /dev/null +++ b/aana/repository/datastore/session.py @@ -0,0 +1,8 @@ +from sqlalchemy.orm import Session + +from aana.repository.datastore.engine import engine + + +def get_session() -> Session: + """Provides a SQLAlchemy Session object.""" + return Session(engine) diff --git a/aana/repository/datastore/transcript_repo.py b/aana/repository/datastore/transcript_repo.py new file mode 100644 index 00000000..b6ac2dee --- /dev/null +++ b/aana/repository/datastore/transcript_repo.py @@ -0,0 +1,12 @@ +from sqlalchemy.orm import Session + +from aana.models.db.transcript import Transcript +from aana.repository.datastore.base import BaseRepository + + +class TranscriptRepository(BaseRepository[Transcript]): + """Repository for Transcripts.""" + + def __init__(self, session: Session): + """Constructor.""" + super().__init__(session=session, model_class=Transcript) diff --git a/pyproject.toml b/pyproject.toml index c93eca25..ecd6acd6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ python-multipart = "^0.0.6" ray = {extras = ["serve"], version = "^2.7.1"} rapidfuzz = "^3.4.0" scipy = "^1.11.3" +sqlalchemy = "^2.0.23" transformers = "^4.34.1" torch = { url = "https://download.pytorch.org/whl/cu118/torch-2.0.1%2Bcu118-cp310-cp310-linux_x86_64.whl" } torchvision = { url = "https://download.pytorch.org/whl/cu118/torchvision-0.15.2%2Bcu118-cp310-cp310-linux_x86_64.whl" } From 7ee5a4aac02c853c96877949f3189050d9b15ff8 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 30 Nov 2023 20:22:58 +0000 Subject: [PATCH 02/37] Add db util functions for saving --- aana/utils/db.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 aana/utils/db.py diff --git a/aana/utils/db.py b/aana/utils/db.py new file mode 100644 index 00000000..f3cd2e30 --- /dev/null +++ b/aana/utils/db.py @@ -0,0 +1,49 @@ +# ruff: noqa: A002 +from sqlalchemy.orm import Session + +from aana.configs.db import id_type +from aana.models.db.caption import Caption +from aana.models.db.media import Media, MediaType +from aana.models.db.transcript import Transcript +from aana.models.pydantic.asr_output import AsrTranscriptionList +from aana.models.pydantic.captions import VideoCaptionsList +from aana.repository.datastore.caption_repo import CaptionRepository +from aana.repository.datastore.engine import engine +from aana.repository.datastore.media_repo import MediaRepository +from aana.repository.datastore.transcript_repo import TranscriptRepository + + +# Just using raw utility functions like this isn't a permanent solution, but +# it's good enough for now to validate what we're working on. +def save_media(type: MediaType, duration: float) -> id_type: + """Creates and saves media to datastore. + + Arguments: + type (MediaType): type of media + duration (float): duration of media + + Returns: + id_type: datastore id of the inserted Media. + """ + with Session(engine) as session: + media = Media(duration=duration, type=type) + repo = MediaRepository(session) + media = repo.create(media) + return media.id + +def save_captions(media_id: id_type, captions: VideoCaptionsList) -> list[id_type]: + """Save captions.""" + with Session(engine) as session: + captions_ = [Caption(media_id=media_id, **c.dict()) for c in captions] + repo = CaptionRepository(session) + results = repo.create_multiple(captions_) + return [c.id for c in results] + + +def save_transcripts(media_id: id_type, transcripts: AsrTranscriptionList) -> list[id_type]: + """Save transcripts.""" + with Session(engine) as session: + entities = [Transcript(media_id=media_id, **t.dict()) for t in transcripts] + repo = TranscriptRepository(session) + entities = repo.create_multiple(entities) + return [c.id for c in entities] \ No newline at end of file From 7ea7d99d8e265124c0220ee14d9b875b832184f5 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 30 Nov 2023 21:13:07 +0000 Subject: [PATCH 03/37] Try to resolve sqlalchemy typing trilemma There appears to be a problem with how SQLAlchemy's type annotations work. Column[int] is incompatible with int, unless you install sqlalchemy-stubs, which breaks the type annotations for reference() fields. But you can manually cast things to int (id_type), so we do that. --- aana/models/db/caption.py | 2 +- aana/models/db/media.py | 2 +- aana/models/db/transcript.py | 2 +- aana/utils/db.py | 6 +++--- pyproject.toml | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/aana/models/db/caption.py b/aana/models/db/caption.py index 772937c7..c6efa574 100644 --- a/aana/models/db/caption.py +++ b/aana/models/db/caption.py @@ -10,7 +10,7 @@ class Caption(BaseModel, TimeStampEntity): __tablename__ = "captions" - id: id_type = Column(IdSqlType, primary_key=True) # noqa: A003 + id = Column(IdSqlType, primary_key=True) # noqa: A003 model = Column(String, comment="Name of model used to generate the caption") media_id = Column( IdSqlType, ForeignKey("media.id"), comment="Foreign key to media table" diff --git a/aana/models/db/media.py b/aana/models/db/media.py index 0f6598c7..e5fa0116 100644 --- a/aana/models/db/media.py +++ b/aana/models/db/media.py @@ -18,7 +18,7 @@ class Media(BaseModel, TimeStampEntity): __tablename__ = "media" - id: id_type = Column(IdSqlType, primary_key=True) # noqa: A003 + id = Column(IdSqlType, primary_key=True) # noqa: A003 duration = Column(Float, comment="Media duration in seconds") media_type = Column(String, comment="Media type") diff --git a/aana/models/db/transcript.py b/aana/models/db/transcript.py index 55f1fce1..09d57f7f 100644 --- a/aana/models/db/transcript.py +++ b/aana/models/db/transcript.py @@ -10,7 +10,7 @@ class Transcript(BaseModel, TimeStampEntity): __tablename__ = "transcripts" - id: id_type = Column(IdSqlType, primary_key=True) # noqa: A003 + id = Column(IdSqlType, primary_key=True) # noqa: A003 model = Column(String, comment="Name of model used to generate transcript") media_id = Column( IdSqlType, ForeignKey("media.id"), comment="Foreign key to media table" diff --git a/aana/utils/db.py b/aana/utils/db.py index f3cd2e30..89a3b57e 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -29,7 +29,7 @@ def save_media(type: MediaType, duration: float) -> id_type: media = Media(duration=duration, type=type) repo = MediaRepository(session) media = repo.create(media) - return media.id + return id_type(media.id) def save_captions(media_id: id_type, captions: VideoCaptionsList) -> list[id_type]: """Save captions.""" @@ -37,7 +37,7 @@ def save_captions(media_id: id_type, captions: VideoCaptionsList) -> list[id_typ captions_ = [Caption(media_id=media_id, **c.dict()) for c in captions] repo = CaptionRepository(session) results = repo.create_multiple(captions_) - return [c.id for c in results] + return [id_type(c.id) for c in results] def save_transcripts(media_id: id_type, transcripts: AsrTranscriptionList) -> list[id_type]: @@ -46,4 +46,4 @@ def save_transcripts(media_id: id_type, transcripts: AsrTranscriptionList) -> li entities = [Transcript(media_id=media_id, **t.dict()) for t in transcripts] repo = TranscriptRepository(session) entities = repo.create_multiple(entities) - return [c.id for c in entities] \ No newline at end of file + return [id_type(c.id) for c in entities] diff --git a/pyproject.toml b/pyproject.toml index ecd6acd6..7a1370a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ python-multipart = "^0.0.6" ray = {extras = ["serve"], version = "^2.7.1"} rapidfuzz = "^3.4.0" scipy = "^1.11.3" -sqlalchemy = "^2.0.23" +sqlalchemy = {extras = ["mypy"], version = "^2.0.23"} transformers = "^4.34.1" torch = { url = "https://download.pytorch.org/whl/cu118/torch-2.0.1%2Bcu118-cp310-cp310-linux_x86_64.whl" } torchvision = { url = "https://download.pytorch.org/whl/cu118/torchvision-0.15.2%2Bcu118-cp310-cp310-linux_x86_64.whl" } From c1ef1def5032035158412279c688ceb7e27f6861 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Fri, 1 Dec 2023 13:18:10 +0000 Subject: [PATCH 04/37] Add alembic + tests --- README.md | 24 ++++ aana/alembic.ini | 116 ++++++++++++++++++ aana/alembic/README | 1 + aana/alembic/env.py | 83 +++++++++++++ aana/alembic/script.py.mako | 28 +++++ .../versions/d540b01b2c34_initialize.py | 65 ++++++++++ aana/models/db/__init__.py | 15 +++ aana/repository/datastore/base.py | 2 +- aana/repository/datastore/caption_repo.py | 2 +- aana/repository/datastore/media_repo.py | 2 +- aana/repository/datastore/transcript_repo.py | 2 +- aana/tests/db/datastore/test_config.py | 75 +++++++++++ aana/tests/db/datastore/test_repo.py | 107 ++++++++++++++++ aana/utils/db.py | 11 +- pyproject.toml | 3 + 15 files changed, 527 insertions(+), 9 deletions(-) create mode 100644 aana/alembic.ini create mode 100644 aana/alembic/README create mode 100644 aana/alembic/env.py create mode 100644 aana/alembic/script.py.mako create mode 100644 aana/alembic/versions/d540b01b2c34_initialize.py create mode 100644 aana/models/db/__init__.py create mode 100644 aana/tests/db/datastore/test_config.py create mode 100644 aana/tests/db/datastore/test_repo.py diff --git a/README.md b/README.md index e2e36ba0..e7354ea5 100644 --- a/README.md +++ b/README.md @@ -132,3 +132,27 @@ command is available in your default shell. You can also simply run For users of VS Code, the included `settings.json` should ensure that Ruff problems appear while you edit, and formatting is applied automatically on save. + + +## Databases +The project uses two databases: a vector database as well as a tradtional SQL database, +referred to internally as vectorstore and datastore, respectively. + +### Vectorstore +TBD + +### Datastore +The datastore uses SQLAlchemy as an ORM layer and Alembic for migrations. Before running the project, +it is necessary to run `alembic upgrade head` to ensure the database exists and has the correct tables +and columns. If changes are made to the SQLAlchemy models, it is necessary to also create an alembic +migration that can be run to upgrade the database. The easiest way to do so is as follows: + +```bash +alembic revision --autogenerate -m "" +``` + +ORM models referenced in the rest of the code should be imported from `aana.models.db` directly, +not from that model's file for reasons explained in `aana/models/db/__init__.py`. This also means that +if you add a new model class, it should be added to `__init__.py` in addition to creating a migration. + +Higher level code for interacting with the ORM is available in `aana.repository.data`. \ No newline at end of file diff --git a/aana/alembic.ini b/aana/alembic.ini new file mode 100644 index 00000000..7cba3205 --- /dev/null +++ b/aana/alembic.ini @@ -0,0 +1,116 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = alembic + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file +# for all available tokens +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python-dateutil library that can be +# installed by adding `alembic[tz]` to the pip requirements +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +# sqlalchemy.url = driver://user:pass@localhost/dbname + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# lint with attempts to fix using "ruff" - use the exec runner, execute a binary +hooks = ruff +ruff.type = exec +ruff.executable = ruff +ruff.options = --fix REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/aana/alembic/README b/aana/alembic/README new file mode 100644 index 00000000..98e4f9c4 --- /dev/null +++ b/aana/alembic/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/aana/alembic/env.py b/aana/alembic/env.py new file mode 100644 index 00000000..66547685 --- /dev/null +++ b/aana/alembic/env.py @@ -0,0 +1,83 @@ +from logging.config import fileConfig + +from alembic import context +from sqlalchemy import engine_from_config, pool + +from aana.configs.db import create_database_engine +from aana.configs.settings import settings +from aana.models.db.base import BaseModel + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata + +target_metadata = BaseModel.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + ~~This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available.~~ + Modified to use our existing db config module. + + Calls to context.execute() here emit the given string to the + script output. + + """ + engine = create_database_engine(settings.db_config) + context.configure( + url=engine.url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + config_section = config.get_section(config.config_ini_section, {}) + engine = create_database_engine(settings.db_config) + config_section["sqlalchemy.url"] = engine.url + connectable = engine_from_config( + config_section, + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure(connection=connection, target_metadata=target_metadata) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/aana/alembic/script.py.mako b/aana/alembic/script.py.mako new file mode 100644 index 00000000..02849b83 --- /dev/null +++ b/aana/alembic/script.py.mako @@ -0,0 +1,28 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from typing import Sequence + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision: str = ${repr(up_revision)} +down_revision: str | None = ${repr(down_revision)} +branch_labels: str | Sequence[str] | None = ${repr(branch_labels)} +depends_on: str | Sequence[str] | None = ${repr(depends_on)} + + +def upgrade() -> None: + """Upgrade database to this revision from previous.""" + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + """Downgrade database from this revision to previous.""" + ${downgrades if downgrades else "pass"} diff --git a/aana/alembic/versions/d540b01b2c34_initialize.py b/aana/alembic/versions/d540b01b2c34_initialize.py new file mode 100644 index 00000000..d0468662 --- /dev/null +++ b/aana/alembic/versions/d540b01b2c34_initialize.py @@ -0,0 +1,65 @@ +"""Initialize. + +Revision ID: d540b01b2c34 +Revises: +Create Date: 2023-12-01 12:04:04.960099 + +""" +from collections.abc import Sequence + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = 'd540b01b2c34' +down_revision: str | None = None +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade() -> None: + """Upgrade database to this revision from previous.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('media', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('duration', sa.Float(), nullable=True, comment='Media duration in seconds'), + sa.Column('media_type', sa.String(), nullable=True, comment='Media type'), + sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), + sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('captions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('model', sa.String(), nullable=True, comment='Name of model used to generate the caption'), + sa.Column('media_id', sa.Integer(), nullable=True, comment='Foreign key to media table'), + sa.Column('frame_id', sa.Integer(), nullable=True, comment='The 0-based frame id of media for caption'), + sa.Column('caption', sa.String(), nullable=True, comment='Frame caption'), + sa.Column('timestamp', sa.Float(), nullable=True, comment='Frame timestamp in seconds'), + sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), + sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), + sa.ForeignKeyConstraint(['media_id'], ['media.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('transcripts', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('model', sa.String(), nullable=True, comment='Name of model used to generate transcript'), + sa.Column('media_id', sa.Integer(), nullable=True, comment='Foreign key to media table'), + sa.Column('transcript', sa.String(), nullable=True, comment='Full text transcript of media'), + sa.Column('segments', sa.String(), nullable=True, comment='Segments of the transcript'), + sa.Column('language', sa.String(), nullable=True, comment='Language of the transcript as predicted by model'), + sa.Column('language_confidence', sa.Float(), nullable=True, comment='Confidence score of language prediction'), + sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), + sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), + sa.ForeignKeyConstraint(['media_id'], ['media.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade database from this revision to previous.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('transcripts') + op.drop_table('captions') + op.drop_table('media') + # ### end Alembic commands ### diff --git a/aana/models/db/__init__.py b/aana/models/db/__init__.py new file mode 100644 index 00000000..d2a11e75 --- /dev/null +++ b/aana/models/db/__init__.py @@ -0,0 +1,15 @@ +# ruff: noqa: F401 +# We need to import all db models here and, other than in the class definitions +# themselves, only import them from aana.models.db directly. The reason for +# this is the way SQLAlchemy's declarative base works. You can use forward +# references like `parent = reference("Parent", backreferences="child")`, but the +# forward reference needs to have been resolved before the first constructor +# is called so that SqlAlchemy "knows" about it. +# See: +# https://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/database/sqlalchemy.html#importing-all-sqlalchemy-models +# (even if not using Pyramid) + +from aana.models.db.base import BaseModel +from aana.models.db.caption import Caption +from aana.models.db.media import Media +from aana.models.db.transcript import Transcript diff --git a/aana/repository/datastore/base.py b/aana/repository/datastore/base.py index 76a98139..6fc424d4 100644 --- a/aana/repository/datastore/base.py +++ b/aana/repository/datastore/base.py @@ -6,7 +6,7 @@ from aana.configs.db import id_type from aana.exceptions.database import NotFoundException -from aana.models.db.base import BaseModel +from aana.models.db import BaseModel T = TypeVar("T", bound=BaseModel) diff --git a/aana/repository/datastore/caption_repo.py b/aana/repository/datastore/caption_repo.py index 4aa68ae4..b0ab848e 100644 --- a/aana/repository/datastore/caption_repo.py +++ b/aana/repository/datastore/caption_repo.py @@ -1,6 +1,6 @@ from sqlalchemy.orm import Session -from aana.models.db.caption import Caption +from aana.models.db import Caption from aana.repository.datastore.base import BaseRepository diff --git a/aana/repository/datastore/media_repo.py b/aana/repository/datastore/media_repo.py index 783a8335..bfe816fa 100644 --- a/aana/repository/datastore/media_repo.py +++ b/aana/repository/datastore/media_repo.py @@ -1,6 +1,6 @@ from sqlalchemy.orm import Session -from aana.models.db.media import Media +from aana.models.db import Media from aana.repository.datastore.base import BaseRepository diff --git a/aana/repository/datastore/transcript_repo.py b/aana/repository/datastore/transcript_repo.py index b6ac2dee..87f3d11b 100644 --- a/aana/repository/datastore/transcript_repo.py +++ b/aana/repository/datastore/transcript_repo.py @@ -1,6 +1,6 @@ from sqlalchemy.orm import Session -from aana.models.db.transcript import Transcript +from aana.models.db import Transcript from aana.repository.datastore.base import BaseRepository diff --git a/aana/tests/db/datastore/test_config.py b/aana/tests/db/datastore/test_config.py new file mode 100644 index 00000000..c9967f68 --- /dev/null +++ b/aana/tests/db/datastore/test_config.py @@ -0,0 +1,75 @@ +# ruff: noqa: S101 +import pytest + +from aana.configs.db import create_database_engine + + +def test_pg_datastore_config(): + """Tests datastore config.""" + db_config = { + "datastore_type": "postgresql", + "datastore_config": { + "host": "0.0.0.0", # noqa: S104 + "port": "5432", + "database": "postgres", + "user": "postgres", + "password": "bogus", + }, + } + + engine = create_database_engine(db_config) + + assert engine.name == "postgresql" + assert str(engine.url) == "postgresql://postgres:***@0.0.0.0:5432/postgres" + + +def test_sqlite_datastore_config(): + """Tests datastore config.""" + db_config = { + "datastore_type": "sqlite", + "datastore_config": {"path": "/tmp/deleteme.sqlite"}, # noqa: S108 + } + + engine = create_database_engine(db_config) + + assert engine.name == "sqlite" + assert str(engine.url) == f"sqlite:///{db_config['datastore_config']['path']}" + + +def test_nonexistent_datastore_config(): + """Tests datastore config.""" + db_config = { + "datastore_type": "oracle🤮", + "datastore_config": { + "host": "0.0.0.0", # noqa: S104 + "port": "5432", + "database": "oracle", + "user": "oracle", + "password": "bogus", + }, + } + with pytest.raises(ValueError): + _ = create_database_engine(db_config) + + +def test_invalid_datastore_config(): + """Tests that a datastore with the wrong config raises errors.""" + config_1 = { + "datastore_type": "postgresql", + "datastore_config": {"path": "/tmp/deleteme.sqlite"}, # noqa: S108 + } + config_2 = { + "datastore_type": "sqlite", + "datastore_config": { + "host": "0.0.0.0", # noqa: S104 + "port": "5432", + "database": "postgres", + "user": "postgres", + "password": "bogus", + }, + } + + with pytest.raises(KeyError): + _ = create_database_engine(config_1) + with pytest.raises(KeyError): + _ = create_database_engine(config_2) diff --git a/aana/tests/db/datastore/test_repo.py b/aana/tests/db/datastore/test_repo.py new file mode 100644 index 00000000..e95d73ae --- /dev/null +++ b/aana/tests/db/datastore/test_repo.py @@ -0,0 +1,107 @@ +# ruff: noqa: S101 +import pytest +from sqlalchemy.orm import Session + +from aana.configs.db import create_database_engine +from aana.models.db import Caption, Media, Transcript +from aana.repository.datastore.caption_repo import CaptionRepository +from aana.repository.datastore.media_repo import MediaRepository +from aana.repository.datastore.transcript_repo import TranscriptRepository + + +@pytest.fixture +def mocked_session(mocker): + """Creates a mocked sqlalchemy.Session.""" + return mocker.MagicMock(spec=Session) + + +@pytest.fixture +def sqlite_session(): + """Provides a SQLite session with a temporary file.""" + db_config = { + "datastore_type": "sqlite", + "datastore_config": {"path": "/tmp/deleteme.sqlite"}, # noqa: S108 + } + engine = create_database_engine(db_config) + return Session(engine) + + +def test_create_media(mocked_session): + """Tests that media creation behaves as expected.""" + repo = MediaRepository(mocked_session) + duration = 0.5 + media_type = "video" + media = Media(duration=duration, media_type=media_type) + media2 = repo.create(media) + + # We need an integreation test to ensure that that the id gets set + # on creation, because the mocked version won't set it. + assert media2 == media + assert media2.duration == duration + assert media2.media_type == media_type + + mocked_session.add.assert_called_once_with(media) + mocked_session.commit.assert_called_once() + + +def test_create_caption(mocked_session): + """Tests caption creation.""" + repo = CaptionRepository(mocked_session) + duration = 500.25 + media_type = "video" + model_name = "no_model" + caption_text = "This is the right caption text." + frame_id = 32767 + timestamp = 327.6 + media = Media(duration=duration, media_type=media_type) + caption = Caption( + media=media, + model=model_name, + frame_id=frame_id, + caption=caption_text, + timestamp=timestamp, + ) + caption2 = repo.create(caption) + + # See above + assert caption2.media == media + assert caption2.model == model_name + assert caption2.frame_id == frame_id + assert caption2.caption == caption_text + assert caption2.timestamp == timestamp + + mocked_session.add.assert_called_once_with(caption) + mocked_session.commit.assert_called_once() + + +def test_create_transcript(mocked_session): + """Tests transcript creation.""" + repo = TranscriptRepository(mocked_session) + duration = 500.25 + media_type = "video" + model_name = "no_model" + transcript_text = "This is the right transcript text." + segments = "This is a segments string." + language = "en" + language_confidence = 0.5 + media = Media(duration=duration, media_type=media_type) + transcript = Transcript( + media=media, + model=model_name, + transcript=transcript_text, + segments=segments, + language=language, + language_confidence=language_confidence, + ) + transcript2 = repo.create(transcript) + + # See above + assert transcript2.media == media + assert transcript2.model == model_name + assert transcript2.transcript == transcript_text + assert transcript2.segments == segments + assert transcript2.language == language + assert transcript2.language_confidence == language_confidence + + mocked_session.add.assert_called_once_with(transcript) + mocked_session.commit.assert_called_once() diff --git a/aana/utils/db.py b/aana/utils/db.py index 89a3b57e..37cd90b8 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -2,9 +2,7 @@ from sqlalchemy.orm import Session from aana.configs.db import id_type -from aana.models.db.caption import Caption -from aana.models.db.media import Media, MediaType -from aana.models.db.transcript import Transcript +from aana.models.db import Caption, Media, MediaType, Transcript from aana.models.pydantic.asr_output import AsrTranscriptionList from aana.models.pydantic.captions import VideoCaptionsList from aana.repository.datastore.caption_repo import CaptionRepository @@ -31,6 +29,7 @@ def save_media(type: MediaType, duration: float) -> id_type: media = repo.create(media) return id_type(media.id) + def save_captions(media_id: id_type, captions: VideoCaptionsList) -> list[id_type]: """Save captions.""" with Session(engine) as session: @@ -38,9 +37,11 @@ def save_captions(media_id: id_type, captions: VideoCaptionsList) -> list[id_typ repo = CaptionRepository(session) results = repo.create_multiple(captions_) return [id_type(c.id) for c in results] - -def save_transcripts(media_id: id_type, transcripts: AsrTranscriptionList) -> list[id_type]: + +def save_transcripts( + media_id: id_type, transcripts: AsrTranscriptionList +) -> list[id_type]: """Save transcripts.""" with Session(engine) as session: entities = [Transcript(media_id=media_id, **t.dict()) for t in transcripts] diff --git a/pyproject.toml b/pyproject.toml index 7a1370a0..a2c6bd4d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,11 +29,14 @@ torch = { url = "https://download.pytorch.org/whl/cu118/torch-2.0.1%2Bcu118-cp31 torchvision = { url = "https://download.pytorch.org/whl/cu118/torchvision-0.15.2%2Bcu118-cp310-cp310-linux_x86_64.whl" } vllm = "^0.2.1.post1" yt-dlp = "^2023.10.13" +alembic = "^1.12.1" [tool.poetry.group.dev.dependencies] ipykernel = "^6.25.2" mypy = "^1.6.1" ruff = "^0.1.5" +psycopg2-binary = "^2.9.9" +sqlalchemy-utils = "^0.41.1" [build-system] requires = ["poetry-core"] From 58f45f725368156a3856a2722bc4af99ed4cd1a9 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Mon, 4 Dec 2023 12:50:26 +0000 Subject: [PATCH 05/37] Fix tests --- aana/models/db/__init__.py | 2 +- aana/repository/datastore/engine.py | 2 +- aana/tests/db/datastore/test_repo.py | 11 ----- aana/tests/db/datastore/test_utils.py | 69 +++++++++++++++++++++++++++ aana/utils/db.py | 21 ++++---- 5 files changed, 84 insertions(+), 21 deletions(-) create mode 100644 aana/tests/db/datastore/test_utils.py diff --git a/aana/models/db/__init__.py b/aana/models/db/__init__.py index d2a11e75..3978a259 100644 --- a/aana/models/db/__init__.py +++ b/aana/models/db/__init__.py @@ -11,5 +11,5 @@ from aana.models.db.base import BaseModel from aana.models.db.caption import Caption -from aana.models.db.media import Media +from aana.models.db.media import Media, MediaType from aana.models.db.transcript import Transcript diff --git a/aana/repository/datastore/engine.py b/aana/repository/datastore/engine.py index bb03c61b..feb4d0d6 100644 --- a/aana/repository/datastore/engine.py +++ b/aana/repository/datastore/engine.py @@ -1,4 +1,4 @@ from aana.configs.db import create_database_engine from aana.configs.settings import settings -engine = create_database_engine(settings) +engine = create_database_engine(settings.db_config) diff --git a/aana/tests/db/datastore/test_repo.py b/aana/tests/db/datastore/test_repo.py index e95d73ae..f4ee07e6 100644 --- a/aana/tests/db/datastore/test_repo.py +++ b/aana/tests/db/datastore/test_repo.py @@ -15,17 +15,6 @@ def mocked_session(mocker): return mocker.MagicMock(spec=Session) -@pytest.fixture -def sqlite_session(): - """Provides a SQLite session with a temporary file.""" - db_config = { - "datastore_type": "sqlite", - "datastore_config": {"path": "/tmp/deleteme.sqlite"}, # noqa: S108 - } - engine = create_database_engine(db_config) - return Session(engine) - - def test_create_media(mocked_session): """Tests that media creation behaves as expected.""" repo = MediaRepository(mocked_session) diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py new file mode 100644 index 00000000..ac49b321 --- /dev/null +++ b/aana/tests/db/datastore/test_utils.py @@ -0,0 +1,69 @@ +# ruff: noqa: S101 +import pytest +from sqlalchemy.orm import Session + +from aana.models.db import MediaType +from aana.models.pydantic.asr_output import AsrTranscription, AsrTranscriptionList +from aana.models.pydantic.captions import Caption, CaptionsList +from aana.utils.db import save_captions, save_media, save_transcripts + + +@pytest.fixture() +def mock_session(mocker): + """Patches the Session object with a mock.""" + session_mock = mocker.MagicMock(spec=Session) + context_var_mock = mocker.MagicMock(spec=Session) + # Ensure that the object used inside a with block is the same. + # Using `session_mock` doesn't work here, perhaps because it creates a + # reference cycle. + session_mock.return_value.__enter__.return_value = context_var_mock + # Ensure that the context var is visible on the injected mock. + session_mock.context_var = context_var_mock + mocker.patch("aana.utils.db.Session", session_mock) + return session_mock + + +def test_save_media(mock_session): + """Tests save media function.""" + media_type = MediaType.VIDEO + duration = 0.5 + + media_id = save_media(media_type, duration) + + assert media_id is None + mock_session.context_var.add.assert_called_once() + mock_session.context_var.commit.assert_called_once() + + +def test_save_transcripts(mock_session): + """Tests save transcripts function.""" + media_id = 0 + transcripts_list = AsrTranscriptionList.construct() + transcripts_list.__root__ = [] + for text in ("A transcript", "Another transcript", "A third transcript"): + tt = AsrTranscription.construct() + tt.text = text + transcripts_list.__root__.append(tt) + + ids = save_transcripts(media_id, transcripts_list) + + assert len(ids) == len(transcripts_list) + mock_session.context_var.add_all.assert_called_once() + mock_session.context_var.commit.assert_called_once() + + +def test_save_captions(mock_session): + """Tests save captions function.""" + media_id = 0 + captions_list = CaptionsList.construct() + captions_list.__root__ = [] + for caption in ["A caption", "Another caption", "A third caption"]: + c = Caption.construct() + c.__root__ = caption + captions_list.__root__.append(c) + + ids = save_captions(media_id, captions_list) + + assert len(ids) == len(captions_list) + mock_session.context_var.add_all.assert_called_once() + mock_session.context_var.commit.assert_called_once() diff --git a/aana/utils/db.py b/aana/utils/db.py index 37cd90b8..18c8547b 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -13,30 +13,33 @@ # Just using raw utility functions like this isn't a permanent solution, but # it's good enough for now to validate what we're working on. -def save_media(type: MediaType, duration: float) -> id_type: +def save_media(media_type: MediaType, duration: float) -> id_type: """Creates and saves media to datastore. Arguments: - type (MediaType): type of media + media_type (MediaType): type of media duration (float): duration of media Returns: id_type: datastore id of the inserted Media. """ with Session(engine) as session: - media = Media(duration=duration, type=type) + media = Media(duration=duration, media_type=media_type) repo = MediaRepository(session) media = repo.create(media) - return id_type(media.id) + return media.id # type: ignore def save_captions(media_id: id_type, captions: VideoCaptionsList) -> list[id_type]: """Save captions.""" with Session(engine) as session: - captions_ = [Caption(media_id=media_id, **c.dict()) for c in captions] + captions_ = [ + Caption(media_id=media_id, frame_id=i, caption=c) + for i, c in enumerate(captions) + ] repo = CaptionRepository(session) results = repo.create_multiple(captions_) - return [id_type(c.id) for c in results] + return [c.id for c in results] # type: ignore def save_transcripts( @@ -44,7 +47,9 @@ def save_transcripts( ) -> list[id_type]: """Save transcripts.""" with Session(engine) as session: - entities = [Transcript(media_id=media_id, **t.dict()) for t in transcripts] + entities = [ + Transcript(media_id=media_id, transcript=t.text) for t in transcripts + ] repo = TranscriptRepository(session) entities = repo.create_multiple(entities) - return [id_type(c.id) for c in entities] + return [c.id for c in entities] # type: ignore From 8ec53a779af34ad2c282812639ecdf0ee60f0150 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Tue, 5 Dec 2023 14:24:53 +0000 Subject: [PATCH 06/37] Commit poetry.lock --- poetry.lock | 514 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 506 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index f3628802..9fd52891 100644 --- a/poetry.lock +++ b/poetry.lock @@ -135,6 +135,25 @@ files = [ [package.dependencies] frozenlist = ">=1.1.0" +[[package]] +name = "alembic" +version = "1.12.1" +description = "A database migration tool for SQLAlchemy." +optional = false +python-versions = ">=3.7" +files = [ + {file = "alembic-1.12.1-py3-none-any.whl", hash = "sha256:47d52e3dfb03666ed945becb723d6482e52190917fdb47071440cfdba05d92cb"}, + {file = "alembic-1.12.1.tar.gz", hash = "sha256:bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f"}, +] + +[package.dependencies] +Mako = "*" +SQLAlchemy = ">=1.3.0" +typing-extensions = ">=4" + +[package.extras] +tz = ["python-dateutil"] + [[package]] name = "ansicon" version = "1.89.0" @@ -1129,6 +1148,76 @@ psutil = ">=5.6.0" completion = ["shtab"] test = ["mockito (>=1.2.1)", "pytest (>=5.4.1)", "pytest-runner"] +[[package]] +name = "greenlet" +version = "3.0.1" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2"}, + {file = "greenlet-3.0.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e"}, + {file = "greenlet-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846"}, + {file = "greenlet-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9"}, + {file = "greenlet-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72"}, + {file = "greenlet-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884"}, + {file = "greenlet-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94"}, + {file = "greenlet-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c"}, + {file = "greenlet-3.0.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0"}, + {file = "greenlet-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d"}, + {file = "greenlet-3.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445"}, + {file = "greenlet-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a"}, + {file = "greenlet-3.0.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166"}, + {file = "greenlet-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36"}, + {file = "greenlet-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1"}, + {file = "greenlet-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8"}, + {file = "greenlet-3.0.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd"}, + {file = "greenlet-3.0.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e"}, + {file = "greenlet-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a"}, + {file = "greenlet-3.0.1-cp38-cp38-win32.whl", hash = "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd"}, + {file = "greenlet-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6"}, + {file = "greenlet-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1"}, + {file = "greenlet-3.0.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8"}, + {file = "greenlet-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546"}, + {file = "greenlet-3.0.1-cp39-cp39-win32.whl", hash = "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57"}, + {file = "greenlet-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619"}, + {file = "greenlet-3.0.1.tar.gz", hash = "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b"}, +] + +[package.extras] +docs = ["Sphinx"] +test = ["objgraph", "psutil"] + [[package]] name = "grpcio" version = "1.59.3" @@ -1195,6 +1284,74 @@ files = [ [package.extras] protobuf = ["grpcio-tools (>=1.59.3)"] +[[package]] +name = "grpcio-tools" +version = "1.59.3" +description = "Protobuf code generator for gRPC" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-tools-1.59.3.tar.gz", hash = "sha256:cd160ac4281cd1ae77a2c880377a7728349340b4c91e24285037b57c18e9f651"}, + {file = "grpcio_tools-1.59.3-cp310-cp310-linux_armv7l.whl", hash = "sha256:17017fe74734c158e0f93817f1ff17aeda37d0f105ed6e63b12c26b66743a7a8"}, + {file = "grpcio_tools-1.59.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:ac1013e4f84ffd15c45ead6d19c9d188b76c14466a799aa9c338ce3b9ebf6dcc"}, + {file = "grpcio_tools-1.59.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0a5d760619305eb51a8719ce9c081398f145a46bc7c86a6e2cebe0648a21f40c"}, + {file = "grpcio_tools-1.59.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de3d9649b7a3091ec785a67d5bf006584440f03896ee52259c6d9ff412d08afb"}, + {file = "grpcio_tools-1.59.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21868aa510317d3f39e5de40208ffb8ab1beb1cbcab333317939b59a9b5db055"}, + {file = "grpcio_tools-1.59.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0b116a888580317e421358f26bfaeec47d6f73079e8a47bad60d1f9f7b30f2a5"}, + {file = "grpcio_tools-1.59.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6bd4a72c27abda191e2360b2b720ada1880aba96a63604a6f9d7c37bb3bbf5c4"}, + {file = "grpcio_tools-1.59.3-cp310-cp310-win32.whl", hash = "sha256:d70cad744e92c7576c226a72998ae8dd59240c942f73798bbde40284eb9eb991"}, + {file = "grpcio_tools-1.59.3-cp310-cp310-win_amd64.whl", hash = "sha256:2b8a4aca0c11f2a8b3bfe103362984bdc427ab762428446ef2e12922fd48ee10"}, + {file = "grpcio_tools-1.59.3-cp311-cp311-linux_armv7l.whl", hash = "sha256:b4418b78408ff56ee70a0b14484c07f5e48c2e6f4fa7be390d486a686d0cd6e4"}, + {file = "grpcio_tools-1.59.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:58de83ced4f86458f45288a5f76d9765dc245a9ce4e783a194decccc7e0674ea"}, + {file = "grpcio_tools-1.59.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:76b0cdcbcb38722840d3eaff6439ddb4b8f0210c6718553d7b7c911834b10e60"}, + {file = "grpcio_tools-1.59.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0cacf59513b100bfb3d8de51ba43db6140aa9bcb7bba872badb48acb430c002"}, + {file = "grpcio_tools-1.59.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:019fdd986c80b13187574c291df5054f241bdbe87dbc86e4cee73ffa28328647"}, + {file = "grpcio_tools-1.59.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ff304b9d6c23d8e2ecc860bebac1ec6768a2d920985bcea9ce4a7aaeeea44f76"}, + {file = "grpcio_tools-1.59.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ca286affe613beaf2d5a6b8bd83203dcf488917194b416da48aa849047b5f081"}, + {file = "grpcio_tools-1.59.3-cp311-cp311-win32.whl", hash = "sha256:8f69141ff370729ceaad0286b8c6e15352c9bb39aa8f18c0500ce3d0238c2981"}, + {file = "grpcio_tools-1.59.3-cp311-cp311-win_amd64.whl", hash = "sha256:05ec4ffe16b6eab12813476e6d7465a0027bee33999d4776ae1d9c0664d0fc54"}, + {file = "grpcio_tools-1.59.3-cp312-cp312-linux_armv7l.whl", hash = "sha256:21d976419630f72a7cefebe7dcfc451b33d70c805a43ff5a60c43367813f0527"}, + {file = "grpcio_tools-1.59.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:396106f92ea6ab2157535e1a009bac99aa15680ca8addbc8e7c1a4d3f5b1fb2c"}, + {file = "grpcio_tools-1.59.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:4f064483e0046a4a193d6c67b26ea0f61737e8232ff61636a7fa0bc5244458be"}, + {file = "grpcio_tools-1.59.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6dc6da8e3780df25095c1952f45c334e1554f25b991ffe75dbf0408795d27a0"}, + {file = "grpcio_tools-1.59.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87111be05c1a159ce3fffbfad86ff69fd4bf1702cde127eb698d8e8c3a018ab6"}, + {file = "grpcio_tools-1.59.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:83453a13c2120238eb7fb993b03b370496e76071a7b45c816aa682d9226d29c1"}, + {file = "grpcio_tools-1.59.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4384b29d8e126bc6e24a5efd9d60a2a2015867c7109fa67ff2ed274b3f4a05c5"}, + {file = "grpcio_tools-1.59.3-cp312-cp312-win32.whl", hash = "sha256:ce1372c9acde9d74c7e54858598ac0c5203dd3ec24b9085f7a8b2f33cc156736"}, + {file = "grpcio_tools-1.59.3-cp312-cp312-win_amd64.whl", hash = "sha256:84179e3a7c9067e993700b3255f2adc10e9b16e8dd28525d1dd1a02b9ca603ee"}, + {file = "grpcio_tools-1.59.3-cp37-cp37m-linux_armv7l.whl", hash = "sha256:592208a9a02df75993cc4dba111d2b81f0e6a3f3837856be239e1aceb6651f31"}, + {file = "grpcio_tools-1.59.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:1abe30ce770ac4fed966d017771fa7f8ced6a279de7ce68023e2c07f07911e76"}, + {file = "grpcio_tools-1.59.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4dce57668e2aa8c3bb0b2a0bb766a2654ee0f4d8d31e02a6001e98af18569285"}, + {file = "grpcio_tools-1.59.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acaefd3c362250a02cc93fc1b5440e3cb30ab8d7fd81594b2975ea19f123aae3"}, + {file = "grpcio_tools-1.59.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76542e1c11e3f2c22c19cff6b3233caab35924fad1f685ce63184d31b4050fa8"}, + {file = "grpcio_tools-1.59.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:64fd1efb23da054f61aca2346c5139f317b7f4c545f6dbda5ec246f281af8e86"}, + {file = "grpcio_tools-1.59.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ea6454acde508c9a62dab3f59e98b32e32b26aa60df20080982503bb7db51304"}, + {file = "grpcio_tools-1.59.3-cp37-cp37m-win_amd64.whl", hash = "sha256:a048d4bde526f3c6e364abea2c3a481f3bbebc4bfa7fdcfcc3e5ee4f8ab9c4c5"}, + {file = "grpcio_tools-1.59.3-cp38-cp38-linux_armv7l.whl", hash = "sha256:b4db59a62d31c98105af08b1bfb8878c239e4cf31088f2d9864756cdfec67746"}, + {file = "grpcio_tools-1.59.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:05ac0f6683759e5508081c09af26cb6cc949c2c54d75ff8b76344709f78dda53"}, + {file = "grpcio_tools-1.59.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a031e1ced828a00f1eb59db5f5d4dd39d3bd6a7df8187f84830d4a32a1bbc686"}, + {file = "grpcio_tools-1.59.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f48b4409b306675b7673dad725c9cf3234bf05623bf8a193ad14af39d0368ba6"}, + {file = "grpcio_tools-1.59.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36524d97cc936767a69815b90be76a1420b3218a7724ce69cde6ece794e72a17"}, + {file = "grpcio_tools-1.59.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7cc7e8b893a6c37a8a28735fede1aa40275988a668d1e22c5f234938a77d811d"}, + {file = "grpcio_tools-1.59.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:917be645a71cf9592d2f5a3589c20c074a6539954017e8e2dca5e8ba13025625"}, + {file = "grpcio_tools-1.59.3-cp38-cp38-win32.whl", hash = "sha256:a1394b7a65d738ee0ce4eac1fc95158dd9c97b5c3f690d259e6ee0bf131697de"}, + {file = "grpcio_tools-1.59.3-cp38-cp38-win_amd64.whl", hash = "sha256:007745bd3c5a788dcb73eeb6cd773613a834bd2442e7d062dcafe46dbd4bb5f6"}, + {file = "grpcio_tools-1.59.3-cp39-cp39-linux_armv7l.whl", hash = "sha256:102b5f14a500dbb766f24a96884d9572a3ea7a56d69695461100fb71ec922ef6"}, + {file = "grpcio_tools-1.59.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:46c384a0e30a8422a3e2c5530b3cd69b652dd659549907e2eaac7ca4e0ab614d"}, + {file = "grpcio_tools-1.59.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:ee013da4f5a4ef50fdeca372470733bc402677a4dc0023ee94bf42478b5a620d"}, + {file = "grpcio_tools-1.59.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b7883ce3d532c09f29c016fdac107f9a3dc43f9e6b60faf8b91fcba21824269"}, + {file = "grpcio_tools-1.59.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2861e4814ebc147854c2246092c433931f4c15f3c8105ae8716b1e282313a5ae"}, + {file = "grpcio_tools-1.59.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d93590a6a82469f3e58e39692230d99c43a39b215cb581e072dcd52286471152"}, + {file = "grpcio_tools-1.59.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f8396183e6e0a16178773963dc21b58c0c532783476fda314198a9e42f57af7d"}, + {file = "grpcio_tools-1.59.3-cp39-cp39-win32.whl", hash = "sha256:6747b1d82d08e0f5e1a6438532343a1c5504147d1a199c5756e702e5f916de4c"}, + {file = "grpcio_tools-1.59.3-cp39-cp39-win_amd64.whl", hash = "sha256:3a560dcb176dd42c37af5d37299e318341a572547e32b942247daa834d2164c0"}, +] + +[package.dependencies] +grpcio = ">=1.59.3" +protobuf = ">=4.21.6,<5.0dev" +setuptools = "*" + [[package]] name = "h11" version = "0.14.0" @@ -1206,6 +1363,53 @@ files = [ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, ] +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] + +[[package]] +name = "httpcore" +version = "1.0.2" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, + {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.23.0)"] + [[package]] name = "httptools" version = "0.6.1" @@ -1254,6 +1458,31 @@ files = [ [package.extras] test = ["Cython (>=0.29.24,<0.30.0)"] +[[package]] +name = "httpx" +version = "0.25.2" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118"}, + {file = "httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + [[package]] name = "huggingface-hub" version = "0.17.3" @@ -1301,6 +1530,17 @@ files = [ [package.dependencies] pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] + [[package]] name = "idna" version = "3.4" @@ -1530,6 +1770,25 @@ files = [ {file = "lit-17.0.5.tar.gz", hash = "sha256:696199a629c73712a5bebda533729ea2c7e4c798bcfc38d9cd1375aa668ced98"}, ] +[[package]] +name = "mako" +version = "1.3.0" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Mako-1.3.0-py3-none-any.whl", hash = "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9"}, + {file = "Mako-1.3.0.tar.gz", hash = "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + [[package]] name = "markupsafe" version = "2.1.3" @@ -2343,6 +2602,25 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "portalocker" +version = "2.8.2" +description = "Wraps the portalocker recipe for easy usage" +optional = false +python-versions = ">=3.8" +files = [ + {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, + {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, +] + +[package.dependencies] +pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} + +[package.extras] +docs = ["sphinx (>=1.7.1)"] +redis = ["redis"] +tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] + [[package]] name = "prometheus-client" version = "0.19.0" @@ -2419,6 +2697,87 @@ files = [ [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] +[[package]] +name = "psycopg2-binary" +version = "2.9.9" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, + {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, + {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, + {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, + {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, + {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, + {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, +] + [[package]] name = "ptyprocess" version = "0.7.0" @@ -2960,6 +3319,29 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} +[[package]] +name = "qdrant-client" +version = "1.6.9" +description = "Client library for the Qdrant vector search engine" +optional = false +python-versions = ">=3.8,<3.13" +files = [ + {file = "qdrant_client-1.6.9-py3-none-any.whl", hash = "sha256:6546f96ceec389375e323586f0948a04183bd494c5c48d0f3daa267b358ad008"}, + {file = "qdrant_client-1.6.9.tar.gz", hash = "sha256:81affd66f50aa66d60835fe2f55efe727358bf9db24eada35ff1b32794a82159"}, +] + +[package.dependencies] +grpcio = ">=1.41.0" +grpcio-tools = ">=1.41.0" +httpx = {version = ">=0.14.0", extras = ["http2"]} +numpy = {version = ">=1.21", markers = "python_version >= \"3.8\" and python_version < \"3.12\""} +portalocker = ">=2.7.0,<3.0.0" +pydantic = ">=1.10.8" +urllib3 = ">=1.26.14,<2.0.0" + +[package.extras] +fastembed = ["fastembed (==0.1.1)"] + [[package]] name = "rapidfuzz" version = "3.5.2" @@ -3689,6 +4071,122 @@ files = [ {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, ] +[[package]] +name = "sqlalchemy" +version = "2.0.23" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-win32.whl", hash = "sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8"}, + {file = "SQLAlchemy-2.0.23-cp310-cp310-win_amd64.whl", hash = "sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-win32.whl", hash = "sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855"}, + {file = "SQLAlchemy-2.0.23-cp311-cp311-win_amd64.whl", hash = "sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-win32.whl", hash = "sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846"}, + {file = "SQLAlchemy-2.0.23-cp312-cp312-win_amd64.whl", hash = "sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-win32.whl", hash = "sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18"}, + {file = "SQLAlchemy-2.0.23-cp37-cp37m-win_amd64.whl", hash = "sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-win32.whl", hash = "sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306"}, + {file = "SQLAlchemy-2.0.23-cp38-cp38-win_amd64.whl", hash = "sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-win32.whl", hash = "sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884"}, + {file = "SQLAlchemy-2.0.23-cp39-cp39-win_amd64.whl", hash = "sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b"}, + {file = "SQLAlchemy-2.0.23-py3-none-any.whl", hash = "sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d"}, + {file = "SQLAlchemy-2.0.23.tar.gz", hash = "sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +mypy = {version = ">=0.910", optional = true, markers = "extra == \"mypy\""} +typing-extensions = ">=4.2.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "sqlalchemy-utils" +version = "0.41.1" +description = "Various utility functions for SQLAlchemy." +optional = false +python-versions = ">=3.6" +files = [ + {file = "SQLAlchemy-Utils-0.41.1.tar.gz", hash = "sha256:a2181bff01eeb84479e38571d2c0718eb52042f9afd8c194d0d02877e84b7d74"}, + {file = "SQLAlchemy_Utils-0.41.1-py3-none-any.whl", hash = "sha256:6c96b0768ea3f15c0dc56b363d386138c562752b84f647fb8d31a2223aaab801"}, +] + +[package.dependencies] +SQLAlchemy = ">=1.3" + +[package.extras] +arrow = ["arrow (>=0.3.4)"] +babel = ["Babel (>=1.3)"] +color = ["colour (>=0.0.4)"] +encrypted = ["cryptography (>=0.6)"] +intervals = ["intervals (>=0.7.1)"] +password = ["passlib (>=1.6,<2.0)"] +pendulum = ["pendulum (>=2.0.5)"] +phone = ["phonenumbers (>=5.9.2)"] +test = ["Jinja2 (>=2.3)", "Pygments (>=1.2)", "backports.zoneinfo", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "isort (>=4.2.2)", "pg8000 (>=1.12.4)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +test-all = ["Babel (>=1.3)", "Jinja2 (>=2.3)", "Pygments (>=1.2)", "arrow (>=0.3.4)", "backports.zoneinfo", "colour (>=0.0.4)", "cryptography (>=0.6)", "docutils (>=0.10)", "flake8 (>=2.4.0)", "flexmock (>=0.9.7)", "furl (>=0.4.1)", "intervals (>=0.7.1)", "isort (>=4.2.2)", "passlib (>=1.6,<2.0)", "pendulum (>=2.0.5)", "pg8000 (>=1.12.4)", "phonenumbers (>=5.9.2)", "psycopg (>=3.1.8)", "psycopg2 (>=2.5.1)", "psycopg2cffi (>=2.8.1)", "pymysql", "pyodbc", "pytest (>=2.7.1)", "python-dateutil", "python-dateutil (>=2.6)", "pytz (>=2014.2)"] +timezone = ["python-dateutil"] +url = ["furl (>=0.4.1)"] + [[package]] name = "stack-data" version = "0.6.3" @@ -4097,19 +4595,19 @@ files = [ [[package]] name = "urllib3" -version = "2.1.0" +version = "1.26.18" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, + {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "uvicorn" @@ -4559,4 +5057,4 @@ websockets = "*" [metadata] lock-version = "2.0" python-versions = "~3.10" -content-hash = "5f645f828ae6b95fa47b59df0178fd18f7393ae740d430d1e2c8f97cf539ed98" +content-hash = "72b0755ddbb50bb339a211464922dda089d2ca7acafe073f0b1d3a7a95a1c036" From c9e0db6938e4f9fd791d7101c0c6f51025cbb43c Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Tue, 5 Dec 2023 15:29:23 +0000 Subject: [PATCH 07/37] Fix "Args" in docstrings --- aana/exceptions/database.py | 2 +- aana/models/pydantic/sampling_params.py | 2 +- aana/models/pydantic/whisper_params.py | 2 +- aana/repository/datastore/base.py | 4 ++-- aana/utils/db.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aana/exceptions/database.py b/aana/exceptions/database.py index 828258b4..4027cdc1 100644 --- a/aana/exceptions/database.py +++ b/aana/exceptions/database.py @@ -9,7 +9,7 @@ class NotFoundException(BaseException): def __init__(self, table_name: str, id: id_type): # noqa: A002 """Constructor. - Arguments: + Args: table_name (str): the name of the table being queried. id (id_type): the id of the item to be retrieved. """ diff --git a/aana/models/pydantic/sampling_params.py b/aana/models/pydantic/sampling_params.py index 0044ba7f..e487f026 100644 --- a/aana/models/pydantic/sampling_params.py +++ b/aana/models/pydantic/sampling_params.py @@ -53,7 +53,7 @@ def check_top_k(cls, v: int): Makes sure it is either -1, or at least 1. - Arguments: + Args: v (int): Value to validate. Raises: diff --git a/aana/models/pydantic/whisper_params.py b/aana/models/pydantic/whisper_params.py index 4b8898e6..28f92111 100644 --- a/aana/models/pydantic/whisper_params.py +++ b/aana/models/pydantic/whisper_params.py @@ -49,7 +49,7 @@ class WhisperParams(BaseModel): def check_temperature(cls, v: float): """Validates a temperature value. - Arguments: + Args: v (float): Value to validate. Raises: diff --git a/aana/repository/datastore/base.py b/aana/repository/datastore/base.py index 6fc424d4..57149a58 100644 --- a/aana/repository/datastore/base.py +++ b/aana/repository/datastore/base.py @@ -45,7 +45,7 @@ def create_multiple(self, entities: Iterable[T]) -> list[T]: def read(self, item_id: id_type) -> T: """Reads a single item by id from the database. - Arguments: + Args: item_id (id_type): id of the item to retrieve Returns: @@ -62,7 +62,7 @@ def read(self, item_id: id_type) -> T: def delete(self, id: id_type, check: bool = False) -> T | None: """Deletes an entity. - Arguments: + Args: id (id_type): the id of the item to be deleted. check (bool): whether to raise if the entity is not found (defaults to True). diff --git a/aana/utils/db.py b/aana/utils/db.py index 18c8547b..1a93dcdc 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -16,7 +16,7 @@ def save_media(media_type: MediaType, duration: float) -> id_type: """Creates and saves media to datastore. - Arguments: + Args: media_type (MediaType): type of media duration (float): duration of media From f2724ad01bae88d3205c1b7a623069dbfa539973 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 7 Dec 2023 10:33:00 +0000 Subject: [PATCH 08/37] PR feedback rename SqlAlchemy models to ...Entity --- aana/models/db/__init__.py | 6 +- aana/models/db/caption.py | 25 +++++++- aana/models/db/media.py | 8 ++- aana/models/db/transcript.py | 34 ++++++++++- aana/repository/datastore/caption_repo.py | 6 +- aana/repository/datastore/media_repo.py | 6 +- aana/repository/datastore/transcript_repo.py | 6 +- aana/tests/db/datastore/test_repo.py | 12 ++-- aana/tests/db/datastore/test_utils.py | 63 +++++++++++++------- aana/utils/db.py | 43 +++++++++---- 10 files changed, 151 insertions(+), 58 deletions(-) diff --git a/aana/models/db/__init__.py b/aana/models/db/__init__.py index 3978a259..ba637fb9 100644 --- a/aana/models/db/__init__.py +++ b/aana/models/db/__init__.py @@ -10,6 +10,6 @@ # (even if not using Pyramid) from aana.models.db.base import BaseModel -from aana.models.db.caption import Caption -from aana.models.db.media import Media, MediaType -from aana.models.db.transcript import Transcript +from aana.models.db.caption import CaptionEntity +from aana.models.db.media import MediaEntity, MediaType +from aana.models.db.transcript import TranscriptEntity diff --git a/aana/models/db/caption.py b/aana/models/db/caption.py index c6efa574..8dd7a6f1 100644 --- a/aana/models/db/caption.py +++ b/aana/models/db/caption.py @@ -1,11 +1,14 @@ +from __future__ import annotations # Let classes use themselves in type annotations + from sqlalchemy import Column, Float, ForeignKey, Integer, String from sqlalchemy.orm import relationship from aana.configs.db import IdSqlType, id_type from aana.models.db.base import BaseModel, TimeStampEntity +from aana.models.pydantic.captions import Caption -class Caption(BaseModel, TimeStampEntity): +class CaptionEntity(BaseModel, TimeStampEntity): """ORM model for media captions.""" __tablename__ = "captions" @@ -19,4 +22,22 @@ class Caption(BaseModel, TimeStampEntity): caption = Column(String, comment="Frame caption") timestamp = Column(Float, comment="Frame timestamp in seconds") - media = relationship("Media", back_populates="captions") + media = relationship("MediaEntity", back_populates="captions") + + @classmethod + def from_caption_output( + cls, + model_name: str, + media_id: id_type, + frame_id: int, + frame_timestamp: float, + caption: Caption, + ) -> CaptionEntity: + """Converts a Caption pydantic model to a CaptionEntity.""" + return CaptionEntity( + model=model_name, + media_id=media_id, + frame_id=frame_id, + caption=str(caption), + timestamp=frame_timestamp, + ) diff --git a/aana/models/db/media.py b/aana/models/db/media.py index e5fa0116..37087c9d 100644 --- a/aana/models/db/media.py +++ b/aana/models/db/media.py @@ -13,7 +13,7 @@ class MediaType(str, Enum): VIDEO = "video" -class Media(BaseModel, TimeStampEntity): +class MediaEntity(BaseModel, TimeStampEntity): """ORM class for media file (video, etc).""" __tablename__ = "media" @@ -21,6 +21,8 @@ class Media(BaseModel, TimeStampEntity): id = Column(IdSqlType, primary_key=True) # noqa: A003 duration = Column(Float, comment="Media duration in seconds") media_type = Column(String, comment="Media type") + orig_filename = Column(String, comment="Original filename") + orig_url = Column(String, comment="Original URL") - captions = relationship("Caption", back_populates="media") - transcripts = relationship("Transcript", back_populates="media") + captions = relationship("CaptionEntity", back_populates="media") + transcripts = relationship("TranscriptEntity", back_populates="media") diff --git a/aana/models/db/transcript.py b/aana/models/db/transcript.py index 09d57f7f..9ff10728 100644 --- a/aana/models/db/transcript.py +++ b/aana/models/db/transcript.py @@ -1,11 +1,22 @@ +from __future__ import annotations # Let classes use themselves in type annotations + +from typing import TYPE_CHECKING + from sqlalchemy import Column, Float, ForeignKey, String from sqlalchemy.orm import relationship from aana.configs.db import IdSqlType, id_type from aana.models.db.base import BaseModel, TimeStampEntity +if TYPE_CHECKING: + from aana.models.pydantic.asr_output import ( + AsrSegments, + AsrTranscription, + AsrTranscriptionInfo, + ) -class Transcript(BaseModel, TimeStampEntity): + +class TranscriptEntity(BaseModel, TimeStampEntity): """ORM class for media transcripts generated by a model.""" __tablename__ = "transcripts" @@ -24,4 +35,23 @@ class Transcript(BaseModel, TimeStampEntity): Float, comment="Confidence score of language prediction" ) - media = relationship("Media", back_populates="transcripts") + media = relationship("MediaEntity", back_populates="transcripts") + + @classmethod + def from_asr_output( + cls, + model_name: str, + media_id: id_type, + info: AsrTranscriptionInfo, + transcription: AsrTranscription, + segments: AsrSegments, + ) -> TranscriptEntity: + """Converts an AsrTranscriptionInfo and AsrTranscription to a single Transcript entity.""" + return TranscriptEntity( + model=model_name, + media_id=media_id, + language=info.language, + language_confidence=info.language_confidence, + transcript=transcription.text, + segments=segments.json(), + ) diff --git a/aana/repository/datastore/caption_repo.py b/aana/repository/datastore/caption_repo.py index b0ab848e..0d0f3d91 100644 --- a/aana/repository/datastore/caption_repo.py +++ b/aana/repository/datastore/caption_repo.py @@ -1,12 +1,12 @@ from sqlalchemy.orm import Session -from aana.models.db import Caption +from aana.models.db import CaptionEntity from aana.repository.datastore.base import BaseRepository -class CaptionRepository(BaseRepository[Caption]): +class CaptionRepository(BaseRepository[CaptionEntity]): """Repository for Captions.""" def __init__(self, session: Session): """Constructor.""" - super().__init__(session, Caption) + super().__init__(session, CaptionEntity) diff --git a/aana/repository/datastore/media_repo.py b/aana/repository/datastore/media_repo.py index bfe816fa..4d68f1c5 100644 --- a/aana/repository/datastore/media_repo.py +++ b/aana/repository/datastore/media_repo.py @@ -1,12 +1,12 @@ from sqlalchemy.orm import Session -from aana.models.db import Media +from aana.models.db import MediaEntity from aana.repository.datastore.base import BaseRepository -class MediaRepository(BaseRepository[Media]): +class MediaRepository(BaseRepository[MediaEntity]): """Repository for media files.""" def __init__(self, session: Session): """Constructor.""" - super().__init__(session, Media) + super().__init__(session, MediaEntity) diff --git a/aana/repository/datastore/transcript_repo.py b/aana/repository/datastore/transcript_repo.py index 87f3d11b..fcc22dd6 100644 --- a/aana/repository/datastore/transcript_repo.py +++ b/aana/repository/datastore/transcript_repo.py @@ -1,12 +1,12 @@ from sqlalchemy.orm import Session -from aana.models.db import Transcript +from aana.models.db import TranscriptEntity from aana.repository.datastore.base import BaseRepository -class TranscriptRepository(BaseRepository[Transcript]): +class TranscriptRepository(BaseRepository[TranscriptEntity]): """Repository for Transcripts.""" def __init__(self, session: Session): """Constructor.""" - super().__init__(session=session, model_class=Transcript) + super().__init__(session=session, model_class=TranscriptEntity) diff --git a/aana/tests/db/datastore/test_repo.py b/aana/tests/db/datastore/test_repo.py index f4ee07e6..6b20d380 100644 --- a/aana/tests/db/datastore/test_repo.py +++ b/aana/tests/db/datastore/test_repo.py @@ -3,7 +3,7 @@ from sqlalchemy.orm import Session from aana.configs.db import create_database_engine -from aana.models.db import Caption, Media, Transcript +from aana.models.db import CaptionEntity, MediaEntity, TranscriptEntity from aana.repository.datastore.caption_repo import CaptionRepository from aana.repository.datastore.media_repo import MediaRepository from aana.repository.datastore.transcript_repo import TranscriptRepository @@ -20,7 +20,7 @@ def test_create_media(mocked_session): repo = MediaRepository(mocked_session) duration = 0.5 media_type = "video" - media = Media(duration=duration, media_type=media_type) + media = MediaEntity(duration=duration, media_type=media_type) media2 = repo.create(media) # We need an integreation test to ensure that that the id gets set @@ -42,8 +42,8 @@ def test_create_caption(mocked_session): caption_text = "This is the right caption text." frame_id = 32767 timestamp = 327.6 - media = Media(duration=duration, media_type=media_type) - caption = Caption( + media = MediaEntity(duration=duration, media_type=media_type) + caption = CaptionEntity( media=media, model=model_name, frame_id=frame_id, @@ -73,8 +73,8 @@ def test_create_transcript(mocked_session): segments = "This is a segments string." language = "en" language_confidence = 0.5 - media = Media(duration=duration, media_type=media_type) - transcript = Transcript( + media = MediaEntity(duration=duration, media_type=media_type) + transcript = TranscriptEntity( media=media, model=model_name, transcript=transcript_text, diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index ac49b321..d6c0f4ad 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -3,9 +3,16 @@ from sqlalchemy.orm import Session from aana.models.db import MediaType -from aana.models.pydantic.asr_output import AsrTranscription, AsrTranscriptionList +from aana.models.pydantic.asr_output import ( + AsrSegments, + AsrSegmentsList, + AsrTranscription, + AsrTranscriptionInfo, + AsrTranscriptionInfoList, + AsrTranscriptionList, +) from aana.models.pydantic.captions import Caption, CaptionsList -from aana.utils.db import save_captions, save_media, save_transcripts +from aana.utils.db import save_captions_batch, save_media, save_transcripts_batch @pytest.fixture() @@ -37,33 +44,47 @@ def test_save_media(mock_session): def test_save_transcripts(mock_session): """Tests save transcripts function.""" - media_id = 0 - transcripts_list = AsrTranscriptionList.construct() - transcripts_list.__root__ = [] - for text in ("A transcript", "Another transcript", "A third transcript"): - tt = AsrTranscription.construct() - tt.text = text - transcripts_list.__root__.append(tt) + media_ids = [0] * 3 + models = ["test_model"] * 3 + texts = ("A transcript", "Another transcript", "A third transcript") + infos = [("en", 0.5), ("de", 0.36), ("fr", 0.99)] + transcripts = AsrTranscriptionList( + __root__=[AsrTranscription(text=text) for text in texts] + ) + transcription_infos = AsrTranscriptionInfoList( + __root__=[ + AsrTranscriptionInfo(language=lang, language_confidence=conf) + for lang, conf in infos + ] + ) + segments = AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3) + ids = save_transcripts_batch( + media_ids, models, transcription_infos, transcripts, segments + ) - ids = save_transcripts(media_id, transcripts_list) - - assert len(ids) == len(transcripts_list) + assert len(ids) == len(transcripts) == len(transcription_infos) == len(segments) mock_session.context_var.add_all.assert_called_once() mock_session.context_var.commit.assert_called_once() def test_save_captions(mock_session): """Tests save captions function.""" - media_id = 0 - captions_list = CaptionsList.construct() - captions_list.__root__ = [] - for caption in ["A caption", "Another caption", "A third caption"]: - c = Caption.construct() - c.__root__ = caption - captions_list.__root__.append(c) + media_ids = [0] * 3 + models = ["test_model"] * 3 + captions = ["A caption", "Another caption", "A third caption"] + captions_list = CaptionsList( + __root__=[Caption(__root__=caption) for caption in captions] + ) + timestamps = [0.1, 0.2, 0.3] - ids = save_captions(media_id, captions_list) + ids = save_captions_batch(media_ids, models, captions_list, timestamps) - assert len(ids) == len(captions_list) + assert ( + len(ids) + == len(captions_list) + == len(timestamps) + == len(models) + == len(media_ids) + ) mock_session.context_var.add_all.assert_called_once() mock_session.context_var.commit.assert_called_once() diff --git a/aana/utils/db.py b/aana/utils/db.py index 1a93dcdc..71c5b8c1 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -2,9 +2,13 @@ from sqlalchemy.orm import Session from aana.configs.db import id_type -from aana.models.db import Caption, Media, MediaType, Transcript -from aana.models.pydantic.asr_output import AsrTranscriptionList -from aana.models.pydantic.captions import VideoCaptionsList +from aana.models.db import CaptionEntity, MediaEntity, MediaType, TranscriptEntity +from aana.models.pydantic.asr_output import ( + AsrSegments, + AsrTranscriptionInfoList, + AsrTranscriptionList, +) +from aana.models.pydantic.captions import CaptionsList from aana.repository.datastore.caption_repo import CaptionRepository from aana.repository.datastore.engine import engine from aana.repository.datastore.media_repo import MediaRepository @@ -24,32 +28,47 @@ def save_media(media_type: MediaType, duration: float) -> id_type: id_type: datastore id of the inserted Media. """ with Session(engine) as session: - media = Media(duration=duration, media_type=media_type) + media = MediaEntity(duration=duration, media_type=media_type) repo = MediaRepository(session) media = repo.create(media) return media.id # type: ignore -def save_captions(media_id: id_type, captions: VideoCaptionsList) -> list[id_type]: +def save_captions_batch( + media_ids: list[id_type], + model_name: str, + captions: CaptionsList, + timestamps: list[float], +) -> list[id_type]: """Save captions.""" with Session(engine) as session: - captions_ = [ - Caption(media_id=media_id, frame_id=i, caption=c) - for i, c in enumerate(captions) + entities = [ + CaptionEntity.from_caption_output(model_name, media_id, i, t, c) + for i, (media_id, c, t) in enumerate( + zip(media_ids, captions, timestamps, strict=True) + ) ] repo = CaptionRepository(session) - results = repo.create_multiple(captions_) + results = repo.create_multiple(entities) return [c.id for c in results] # type: ignore -def save_transcripts( - media_id: id_type, transcripts: AsrTranscriptionList +def save_transcripts_batch( + model_name: str, + media_ids: list[id_type], + transcript_info: AsrTranscriptionInfoList, + transcripts: AsrTranscriptionList, + segments: AsrSegments, ) -> list[id_type]: """Save transcripts.""" with Session(engine) as session: entities = [ - Transcript(media_id=media_id, transcript=t.text) for t in transcripts + TranscriptEntity.from_asr_output(model_name, media_id, info, txn, seg) + for media_id, info, txn, seg in zip( + media_ids, transcript_info, transcripts, segments, strict=True + ) ] + repo = TranscriptRepository(session) entities = repo.create_multiple(entities) return [c.id for c in entities] # type: ignore From 6c6de8998369b02193980c79867d10875b2d4764 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 7 Dec 2023 13:06:04 +0000 Subject: [PATCH 09/37] Fixes for tests and configs (PR) --- aana/alembic/__init__.py | 0 ...itialize.py => d63d3838d344_initialize.py} | 18 +- aana/configs/db.py | 6 +- aana/configs/pipeline.py | 100 ++ aana/utils/db.py | 32 + poetry.lock | 1480 +++++++---------- 6 files changed, 788 insertions(+), 848 deletions(-) create mode 100644 aana/alembic/__init__.py rename aana/alembic/versions/{d540b01b2c34_initialize.py => d63d3838d344_initialize.py} (83%) diff --git a/aana/alembic/__init__.py b/aana/alembic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/aana/alembic/versions/d540b01b2c34_initialize.py b/aana/alembic/versions/d63d3838d344_initialize.py similarity index 83% rename from aana/alembic/versions/d540b01b2c34_initialize.py rename to aana/alembic/versions/d63d3838d344_initialize.py index d0468662..70124597 100644 --- a/aana/alembic/versions/d540b01b2c34_initialize.py +++ b/aana/alembic/versions/d63d3838d344_initialize.py @@ -1,8 +1,8 @@ """Initialize. -Revision ID: d540b01b2c34 +Revision ID: d63d3838d344 Revises: -Create Date: 2023-12-01 12:04:04.960099 +Create Date: 2023-12-07 11:58:35.095546 """ from collections.abc import Sequence @@ -11,7 +11,7 @@ from alembic import op # revision identifiers, used by Alembic. -revision: str = 'd540b01b2c34' +revision: str = 'd63d3838d344' down_revision: str | None = None branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None @@ -21,17 +21,19 @@ def upgrade() -> None: """Upgrade database to this revision from previous.""" # ### commands auto generated by Alembic - please adjust! ### op.create_table('media', - sa.Column('id', sa.Integer(), nullable=False), + sa.Column('id', sa.String(), nullable=False), sa.Column('duration', sa.Float(), nullable=True, comment='Media duration in seconds'), sa.Column('media_type', sa.String(), nullable=True, comment='Media type'), + sa.Column('orig_filename', sa.String(), nullable=True, comment='Original filename'), + sa.Column('orig_url', sa.String(), nullable=True, comment='Original URL'), sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), sa.PrimaryKeyConstraint('id') ) op.create_table('captions', - sa.Column('id', sa.Integer(), nullable=False), + sa.Column('id', sa.String(), nullable=False), sa.Column('model', sa.String(), nullable=True, comment='Name of model used to generate the caption'), - sa.Column('media_id', sa.Integer(), nullable=True, comment='Foreign key to media table'), + sa.Column('media_id', sa.String(), nullable=True, comment='Foreign key to media table'), sa.Column('frame_id', sa.Integer(), nullable=True, comment='The 0-based frame id of media for caption'), sa.Column('caption', sa.String(), nullable=True, comment='Frame caption'), sa.Column('timestamp', sa.Float(), nullable=True, comment='Frame timestamp in seconds'), @@ -41,9 +43,9 @@ def upgrade() -> None: sa.PrimaryKeyConstraint('id') ) op.create_table('transcripts', - sa.Column('id', sa.Integer(), nullable=False), + sa.Column('id', sa.String(), nullable=False), sa.Column('model', sa.String(), nullable=True, comment='Name of model used to generate transcript'), - sa.Column('media_id', sa.Integer(), nullable=True, comment='Foreign key to media table'), + sa.Column('media_id', sa.String(), nullable=True, comment='Foreign key to media table'), sa.Column('transcript', sa.String(), nullable=True, comment='Full text transcript of media'), sa.Column('segments', sa.String(), nullable=True, comment='Segments of the transcript'), sa.Column('language', sa.String(), nullable=True, comment='Language of the transcript as predicted by model'), diff --git a/aana/configs/db.py b/aana/configs/db.py index bf263b10..56771b9c 100644 --- a/aana/configs/db.py +++ b/aana/configs/db.py @@ -2,12 +2,12 @@ from os import PathLike from typing import TypeAlias, TypedDict -from sqlalchemy import Integer, create_engine +from sqlalchemy import String, create_engine # These are here so we can change types in a single place. -id_type: TypeAlias = int -IdSqlType: TypeAlias = Integer +id_type: TypeAlias = str +IdSqlType: TypeAlias = String class SQLiteConfig(TypedDict): diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index 2287ddb8..fc15c4d9 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -479,4 +479,104 @@ }, ], }, + { + "name": "save_video_info", + "type": "ray_task", + "function": "aana.utils.db.save_video_batch", + "batched": True, + "flatten_by": "video_batch.videos.[*]", + "inputs": [ + { + "name": "videos", + "key": "video_inputs", + "path": "video_batch.videos.[*].video_input", + }, + ], + "outputs": [ + { + "name": "media_ids", + "key": "media_ids", + "path": "video_batch.videos.[*].id", + } + ], + }, + { + "name": "save_transcripts_medium", + "type": "ray_task", + "function": "aana.utils.db.save_transcripts_batch", + "batched": True, + "flatten_by": "video_batch.videos.[*]", + "inputs": [ + { + "name": "media_ids", + "key": "media_ids", + "path": "video_batch.videos.[*].id", + }, + {"name": "model_name", "key": "model_name", "path": "model_name"}, + { + "name": "video_transcriptions_info_whisper_medium", + "key": "transcription_info", + "path": "video_batch.videos.[*].transcription_info", + }, + { + "name": "video_transcriptions_segments_whisper_medium", + "key": "segments", + "path": "video_batch.videos.[*].segments", + }, + { + "name": "video_transcriptions_whisper_medium", + "key": "transcription", + "path": "video_batch.videos.[*].transcription", + }, + ], + "outputs": [ + { + "name": "transcription_id", + "key": "transcription_id", + "path": "video_batch.videos.[*].transcription.id", + } + ], + }, + { + "name": "save_video_captions_hf_blip2_opt_2_7b", + "type": "ray_task", + "function": "aana.utils.db.save_captions_batch", + "batched": True, + "flatten_by": "video_batch.videos.[*]", + "inputs": [ + { + "name": "media_ids", + "key": "media_ids", + "path": "video_batch.videos.[*].id", + }, + {"name": "model_name", "key": "model_name", "path": "model_name"}, + { + "name": "timestamps", + "key": "timestamps", + "path": "video_batch.videos.[*].timestamp", + }, + { + "name": "duration", + "key": "duration", + "path": "video_batch.videos.[*].duration", + }, + { + "name": "video_captions_hf_blip2_opt_2_7b", + "key": "captions", + "path": "video_batch.videos.[*].frames.[*].caption_hf_blip2_opt_2_7b", + }, + { + "name": "frame_id", + "key": "frame_id", + "path": "video_batch.videos.[*].frames.[*].id", + }, + ], + "outputs": [ + { + "name": "caption_id", + "key": "caption_id", + "path": "video_batch.videos.[*].frames.[*].caption_hf_blip2_opt_2_7b.id", + } + ], + }, ] diff --git a/aana/utils/db.py b/aana/utils/db.py index 71c5b8c1..399a53af 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -1,4 +1,7 @@ # ruff: noqa: A002 +from pathlib import Path +from urllib.parse import urlparse + from sqlalchemy.orm import Session from aana.configs.db import id_type @@ -9,6 +12,7 @@ AsrTranscriptionList, ) from aana.models.pydantic.captions import CaptionsList +from aana.models.pydantic.video_input import VideoInputList from aana.repository.datastore.caption_repo import CaptionRepository from aana.repository.datastore.engine import engine from aana.repository.datastore.media_repo import MediaRepository @@ -17,6 +21,34 @@ # Just using raw utility functions like this isn't a permanent solution, but # it's good enough for now to validate what we're working on. +def save_video_batch(video_inputs: VideoInputList) -> list[id_type]: + """Saves a batch of videos to datastore.""" + entities = [] + for video_input in video_inputs: + if video_input.url is not None: + orig_url = video_input.url + parsed_url = urlparse(orig_url) + orig_filename = Path(parsed_url.path).name + elif video_input.path is not None: + parsed_path = Path(video_input.path) + orig_filename = parsed_path.name + orig_url = None + else: + orig_url = None + orig_filename = None + entity = MediaEntity( + id=video_input.media_id, + media_type=MediaType.VIDEO, + orig_filename=orig_filename, + orig_url=orig_url, + ) + entities.append(entity) + with Session(engine) as session: + repo = MediaRepository(session) + results = repo.create_multiple(entities) + return [result.id for result in results] # type: ignore + + def save_media(media_type: MediaType, duration: float) -> id_type: """Creates and saves media to datastore. diff --git a/poetry.lock b/poetry.lock index 9fd52891..3090bf89 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,87 +2,87 @@ [[package]] name = "aiohttp" -version = "3.9.0" +version = "3.9.1" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6896b8416be9ada4d22cd359d7cb98955576ce863eadad5596b7cdfbf3e17c6c"}, - {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1736d87dad8ef46a8ec9cddd349fa9f7bd3a064c47dd6469c0d6763d3d49a4fc"}, - {file = "aiohttp-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c9e5f4d7208cda1a2bb600e29069eecf857e6980d0ccc922ccf9d1372c16f4b"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8488519aa05e636c5997719fe543c8daf19f538f4fa044f3ce94bee608817cff"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ab16c254e2312efeb799bc3c06897f65a133b38b69682bf75d1f1ee1a9c43a9"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a94bde005a8f926d0fa38b88092a03dea4b4875a61fbcd9ac6f4351df1b57cd"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b777c9286b6c6a94f50ddb3a6e730deec327e9e2256cb08b5530db0f7d40fd8"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:571760ad7736b34d05597a1fd38cbc7d47f7b65deb722cb8e86fd827404d1f6b"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:deac0a32aec29608eb25d730f4bc5a261a65b6c48ded1ed861d2a1852577c932"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4ee1b4152bc3190cc40ddd6a14715e3004944263ea208229ab4c297712aa3075"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:3607375053df58ed6f23903aa10cf3112b1240e8c799d243bbad0f7be0666986"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:65b0a70a25456d329a5e1426702dde67be0fb7a4ead718005ba2ca582d023a94"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a2eb5311a37fe105aa35f62f75a078537e1a9e4e1d78c86ec9893a3c97d7a30"}, - {file = "aiohttp-3.9.0-cp310-cp310-win32.whl", hash = "sha256:2cbc14a13fb6b42d344e4f27746a4b03a2cb0c1c3c5b932b0d6ad8881aa390e3"}, - {file = "aiohttp-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ac9669990e2016d644ba8ae4758688534aabde8dbbc81f9af129c3f5f01ca9cd"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8e05f5163528962ce1d1806fce763ab893b1c5b7ace0a3538cd81a90622f844"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4afa8f71dba3a5a2e1e1282a51cba7341ae76585345c43d8f0e624882b622218"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f929f4c9b9a00f3e6cc0587abb95ab9c05681f8b14e0fe1daecfa83ea90f8318"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28185e36a78d247c55e9fbea2332d16aefa14c5276a582ce7a896231c6b1c208"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a486ddf57ab98b6d19ad36458b9f09e6022de0381674fe00228ca7b741aacb2f"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70e851f596c00f40a2f00a46126c95c2e04e146015af05a9da3e4867cfc55911"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5b7bf8fe4d39886adc34311a233a2e01bc10eb4e842220235ed1de57541a896"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c67a51ea415192c2e53e4e048c78bab82d21955b4281d297f517707dc836bf3d"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:694df243f394629bcae2d8ed94c589a181e8ba8604159e6e45e7b22e58291113"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3dd8119752dd30dd7bca7d4bc2a92a59be6a003e4e5c2cf7e248b89751b8f4b7"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:eb6dfd52063186ac97b4caa25764cdbcdb4b10d97f5c5f66b0fa95052e744eb7"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d97c3e286d0ac9af6223bc132dc4bad6540b37c8d6c0a15fe1e70fb34f9ec411"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:816f4db40555026e4cdda604a1088577c1fb957d02f3f1292e0221353403f192"}, - {file = "aiohttp-3.9.0-cp311-cp311-win32.whl", hash = "sha256:3abf0551874fecf95f93b58f25ef4fc9a250669a2257753f38f8f592db85ddea"}, - {file = "aiohttp-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:e18d92c3e9e22553a73e33784fcb0ed484c9874e9a3e96c16a8d6a1e74a0217b"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:99ae01fb13a618b9942376df77a1f50c20a281390dad3c56a6ec2942e266220d"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:05857848da443c8c12110d99285d499b4e84d59918a21132e45c3f0804876994"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:317719d7f824eba55857fe0729363af58e27c066c731bc62cd97bc9c3d9c7ea4"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1e3b3c107ccb0e537f309f719994a55621acd2c8fdf6d5ce5152aed788fb940"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45820ddbb276113ead8d4907a7802adb77548087ff5465d5c554f9aa3928ae7d"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a183f1978802588711aed0dea31e697d760ce9055292db9dc1604daa9a8ded"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a4cd44788ea0b5e6bb8fa704597af3a30be75503a7ed1098bc5b8ffdf6c982"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673343fbc0c1ac44d0d2640addc56e97a052504beacd7ade0dc5e76d3a4c16e8"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e8a3b79b6d186a9c99761fd4a5e8dd575a48d96021f220ac5b5fa856e5dd029"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6777a390e41e78e7c45dab43a4a0196c55c3b8c30eebe017b152939372a83253"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7ae5f99a32c53731c93ac3075abd3e1e5cfbe72fc3eaac4c27c9dd64ba3b19fe"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:f1e4f254e9c35d8965d377e065c4a8a55d396fe87c8e7e8429bcfdeeb229bfb3"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11ca808f9a6b63485059f5f6e164ef7ec826483c1212a44f268b3653c91237d8"}, - {file = "aiohttp-3.9.0-cp312-cp312-win32.whl", hash = "sha256:de3cc86f4ea8b4c34a6e43a7306c40c1275e52bfa9748d869c6b7d54aa6dad80"}, - {file = "aiohttp-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca4fddf84ac7d8a7d0866664936f93318ff01ee33e32381a115b19fb5a4d1202"}, - {file = "aiohttp-3.9.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f09960b5bb1017d16c0f9e9f7fc42160a5a49fa1e87a175fd4a2b1a1833ea0af"}, - {file = "aiohttp-3.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8303531e2c17b1a494ffaeba48f2da655fe932c4e9a2626c8718403c83e5dd2b"}, - {file = "aiohttp-3.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4790e44f46a4aa07b64504089def5744d3b6780468c4ec3a1a36eb7f2cae9814"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1d7edf74a36de0e5ca50787e83a77cf352f5504eb0ffa3f07000a911ba353fb"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94697c7293199c2a2551e3e3e18438b4cba293e79c6bc2319f5fd652fccb7456"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a1b66dbb8a7d5f50e9e2ea3804b01e766308331d0cac76eb30c563ac89c95985"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9623cfd9e85b76b83ef88519d98326d4731f8d71869867e47a0b979ffec61c73"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f32c86dc967ab8c719fd229ce71917caad13cc1e8356ee997bf02c5b368799bf"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f50b4663c3e0262c3a361faf440761fbef60ccdde5fe8545689a4b3a3c149fb4"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dcf71c55ec853826cd70eadb2b6ac62ec577416442ca1e0a97ad875a1b3a0305"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:42fe4fd9f0dfcc7be4248c162d8056f1d51a04c60e53366b0098d1267c4c9da8"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76a86a9989ebf82ee61e06e2bab408aec4ea367dc6da35145c3352b60a112d11"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f9e09a1c83521d770d170b3801eea19b89f41ccaa61d53026ed111cb6f088887"}, - {file = "aiohttp-3.9.0-cp38-cp38-win32.whl", hash = "sha256:a00ce44c21612d185c5275c5cba4bab8d7c1590f248638b667ed8a782fa8cd6f"}, - {file = "aiohttp-3.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:d5b9345ab92ebe6003ae11d8092ce822a0242146e6fa270889b9ba965457ca40"}, - {file = "aiohttp-3.9.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98d21092bf2637c5fa724a428a69e8f5955f2182bff61f8036827cf6ce1157bf"}, - {file = "aiohttp-3.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:35a68cd63ca6aaef5707888f17a70c36efe62b099a4e853d33dc2e9872125be8"}, - {file = "aiohttp-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7f6235c7475658acfc1769d968e07ab585c79f6ca438ddfecaa9a08006aee2"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db04d1de548f7a62d1dd7e7cdf7c22893ee168e22701895067a28a8ed51b3735"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:536b01513d67d10baf6f71c72decdf492fb7433c5f2f133e9a9087379d4b6f31"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c8b0a6487e8109427ccf638580865b54e2e3db4a6e0e11c02639231b41fc0f"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7276fe0017664414fdc3618fca411630405f1aaf0cc3be69def650eb50441787"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23170247ef89ffa842a02bbfdc425028574d9e010611659abeb24d890bc53bb8"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b1a2ea8252cacc7fd51df5a56d7a2bb1986ed39be9397b51a08015727dfb69bd"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d71abc15ff7047412ef26bf812dfc8d0d1020d664617f4913df2df469f26b76"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2d820162c8c2bdbe97d328cd4f417c955ca370027dce593345e437b2e9ffdc4d"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:2779f5e7c70f7b421915fd47db332c81de365678180a9f3ab404088f87ba5ff9"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:366bc870d7ac61726f32a489fbe3d1d8876e87506870be66b01aeb84389e967e"}, - {file = "aiohttp-3.9.0-cp39-cp39-win32.whl", hash = "sha256:1df43596b826022b14998f0460926ce261544fedefe0d2f653e1b20f49e96454"}, - {file = "aiohttp-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:9c196b30f1b1aa3363a69dd69079ae9bec96c2965c4707eaa6914ba099fb7d4f"}, - {file = "aiohttp-3.9.0.tar.gz", hash = "sha256:09f23292d29135025e19e8ff4f0a68df078fe4ee013bca0105b2e803989de92d"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"}, + {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"}, + {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"}, + {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"}, + {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"}, + {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"}, + {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"}, + {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"}, + {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"}, + {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"}, + {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"}, + {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"}, + {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"}, + {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"}, + {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"}, + {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672"}, + {file = "aiohttp-3.9.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361"}, + {file = "aiohttp-3.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a"}, + {file = "aiohttp-3.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8"}, + {file = "aiohttp-3.9.1-cp38-cp38-win32.whl", hash = "sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4"}, + {file = "aiohttp-3.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0"}, + {file = "aiohttp-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f"}, + {file = "aiohttp-3.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f"}, + {file = "aiohttp-3.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c"}, + {file = "aiohttp-3.9.1-cp39-cp39-win32.whl", hash = "sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7"}, + {file = "aiohttp-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf"}, + {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"}, ] [package.dependencies] @@ -137,13 +137,13 @@ frozenlist = ">=1.1.0" [[package]] name = "alembic" -version = "1.12.1" +version = "1.13.0" description = "A database migration tool for SQLAlchemy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "alembic-1.12.1-py3-none-any.whl", hash = "sha256:47d52e3dfb03666ed945becb723d6482e52190917fdb47071440cfdba05d92cb"}, - {file = "alembic-1.12.1.tar.gz", hash = "sha256:bca5877e9678b454706347bc10b97cb7d67f300320fa5c3a94423e8266e2823f"}, + {file = "alembic-1.13.0-py3-none-any.whl", hash = "sha256:a23974ea301c3ee52705db809c7413cecd165290c6679b9998dd6c74342ca23a"}, + {file = "alembic-1.13.0.tar.gz", hash = "sha256:ab4b3b94d2e1e5f81e34be8a9b7b7575fc9dd5398fccb0bef351ec9b14872623"}, ] [package.dependencies] @@ -152,7 +152,7 @@ SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" [package.extras] -tz = ["python-dateutil"] +tz = ["backports.zoneinfo"] [[package]] name = "ansicon" @@ -656,32 +656,32 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cmake" -version = "3.27.7" +version = "3.27.9" description = "CMake is an open-source, cross-platform family of tools designed to build, test and package software" optional = false python-versions = "*" files = [ - {file = "cmake-3.27.7-py2.py3-none-macosx_10_10_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:d582ef3e9ff0bd113581c1a32e881d1c2f9a34d2de76c93324a28593a76433db"}, - {file = "cmake-3.27.7-py2.py3-none-manylinux2010_i686.manylinux_2_12_i686.whl", hash = "sha256:8056c99e371ff57229df2068364d7c32fea716cb53b4675f639edfb62663decf"}, - {file = "cmake-3.27.7-py2.py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:68983b09de633fc1ce6ab6bce9a25bfa181e41598e7c6bc0a6c0108773ee01cb"}, - {file = "cmake-3.27.7-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bd1e1fa4fc8de7605c663d9408dceb649112f855aab05cca31fdb72e4d78364"}, - {file = "cmake-3.27.7-py2.py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c981aafcca2cd7210bd210ec75710c0f34e1fde1998cdcab812e4133e3ab615d"}, - {file = "cmake-3.27.7-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1b9067ce0251cba3d4c018f2e1577ba9078e9c1eff6ad607ad5ce867843d4571"}, - {file = "cmake-3.27.7-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b8a2fcb619b89d1cce7b52828316de9a1f27f0c90c2e39d1eae886428c8ee8c6"}, - {file = "cmake-3.27.7-py2.py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:499b38c77d52fb1964dbb38d0228fed246263a181939a8e753fde8ca227c8e1e"}, - {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:2fb48c780f1a6a3d19e785ebbb754be79d369e25a1cb81043fab049e709564da"}, - {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:7bf96237ba11ce2437dc5e071d96b510120a1be4708c631a64b2f38fb46bbd77"}, - {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:009058bdf4f488709f38eaa5dd0ef0f89c6b9c6b6edd9d5b475a308ef75f80bb"}, - {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:591f6b056527aefec009bc61a388776b2fc62444deb0038112a471031f61aeca"}, - {file = "cmake-3.27.7-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:bd40d46dbad3555d5b3ce054bef24b85f256b19139493773751ab6f2b71c1219"}, - {file = "cmake-3.27.7-py2.py3-none-win32.whl", hash = "sha256:bdbf0256f554f68c7b1d9740f5d059daf875b685c81a479cbe69038e84eb2fb9"}, - {file = "cmake-3.27.7-py2.py3-none-win_amd64.whl", hash = "sha256:810e592b606d05a3080a9c19ea839b13226f62cae447a22485b2365782f6b926"}, - {file = "cmake-3.27.7-py2.py3-none-win_arm64.whl", hash = "sha256:72289361866314f73be2ae63ddee224ff70223dcef9feb66d0072bf17e245564"}, - {file = "cmake-3.27.7.tar.gz", hash = "sha256:9f4a7c7be2a25de5901f045618f41b833ea6c0f647115201d38e4fdf7e2815bc"}, + {file = "cmake-3.27.9-py2.py3-none-macosx_10_10_universal2.macosx_10_10_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:9163fabf484b437cd11d5abe0b5161de57e9c22c75f779c9e6df7765b8138b42"}, + {file = "cmake-3.27.9-py2.py3-none-manylinux2010_i686.manylinux_2_12_i686.whl", hash = "sha256:5c83fe2c6059aaa3ad86f49e6e3da4483e582994a6c152aa7efa175282f7b207"}, + {file = "cmake-3.27.9-py2.py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:c0603c6dc9c7a4c6fce2717e5813bc6126d86388ce057f5bf1a643384966d784"}, + {file = "cmake-3.27.9-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d8306b6e4442496dc1d87e3e64394ebbf02c04f1c6324a1a37cad3695f7d835a"}, + {file = "cmake-3.27.9-py2.py3-none-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:64c7cd776d07a82163c3265cc82920e64e328d1c87049644005bfd49e4de4d7b"}, + {file = "cmake-3.27.9-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5c91df483ebaa03107f8b9488de207ff32fc74ef93bba79ac52dd830fff40b06"}, + {file = "cmake-3.27.9-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:07bf268f42c9cdf3b06e04cc145c203b83d5a700f7c2a597772610f48c3dca04"}, + {file = "cmake-3.27.9-py2.py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:434714990d82e3c3936a726c1706c6a1d5a34964a7415d1433af0904a994e414"}, + {file = "cmake-3.27.9-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d3030f9f3773154cf6e8c581eac7b0225822f08d6bce37995180d901dfc62465"}, + {file = "cmake-3.27.9-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:baad87ffe2b257ad51f66fab23f3ba5c16e24d757ba1543d4edb3b6cb4de47a2"}, + {file = "cmake-3.27.9-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:5e8cc5554de86a072e6cbfef725e7dff542bc164a08f5fd41bc194f7778710b7"}, + {file = "cmake-3.27.9-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:e09cddb8338aab68b17f99ac0ac39ec3d9f8923f0d1527d25f9b4e1bdf8fa057"}, + {file = "cmake-3.27.9-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:87e95c452e522c9379bbd04b300a0b28ba03841d57532166e109669f82f2bdef"}, + {file = "cmake-3.27.9-py2.py3-none-win32.whl", hash = "sha256:d7880be7798bd58e43e0eb2e0ce67e7bb0d2ae29b3dc8f3cfbc1f991ae94305d"}, + {file = "cmake-3.27.9-py2.py3-none-win_amd64.whl", hash = "sha256:8eb760800b8bd0178a29334ea3c729ac0534865a30f40994cdfc9c0897488a9e"}, + {file = "cmake-3.27.9-py2.py3-none-win_arm64.whl", hash = "sha256:f564e739b0ef37c1422fe91938b2ab971e21756b848bf840e3672ef3acacf73f"}, + {file = "cmake-3.27.9.tar.gz", hash = "sha256:d8a40eef1268c91e5b520b28fd5fe0591d750e48e44276dbfd493a14ee595c41"}, ] [package.extras] -test = ["coverage (>=4.2)", "flake8 (>=3.0.4)", "path.py (>=11.5.0)", "pytest (>=3.0.3)", "pytest-cov (>=2.4.0)", "pytest-runner (>=2.9)", "pytest-virtualenv (>=1.7.0)", "scikit-build (>=0.10.0)", "setuptools (>=28.0.0)", "virtualenv (>=15.0.3)", "wheel"] +test = ["coverage (>=4.2)", "importlib-metadata (>=2.0)", "pytest (>=3.0.3)", "pytest-cov (>=2.4.0)"] [[package]] name = "colorama" @@ -744,36 +744,36 @@ test = ["pytest"] [[package]] name = "ctranslate2" -version = "3.22.0" +version = "3.23.0" description = "Fast inference engine for Transformer models" optional = false python-versions = ">=3.8" files = [ - {file = "ctranslate2-3.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2162d8ac1e93b032a21e78c22e538bc599780b120091113d69aec6e965c2fd29"}, - {file = "ctranslate2-3.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:158a9b35f589e9172de388706f49dd73a9663d78e8803e6f41ac0fc903f787e2"}, - {file = "ctranslate2-3.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65f7bc22cf3b052ac3be42fd7e982147cf08c96192a95316edc3b5aaec591e0b"}, - {file = "ctranslate2-3.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a616fc7bb5e8c7ea7843c71165fc6d2e83f3939940d730e963851be8fc78131"}, - {file = "ctranslate2-3.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:bb1e8ea9f523431747ad8eb28f82822254ca96cf1e55fbc8a2bed12d5ddd4439"}, - {file = "ctranslate2-3.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b63d95a970f598eaf06913879327672386ff335fc6d546dd0d7281da448c8a4"}, - {file = "ctranslate2-3.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b592f429b3d5615cb2d1837e065235cc9955f82a732145b3dc16e1a11fb67249"}, - {file = "ctranslate2-3.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c067221ed4e958a68ff482498379896ec60c7b07047e3c20a848008cbc9ba7ee"}, - {file = "ctranslate2-3.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd2403ec90faf389a54767e2563dcda2713036f32545453aa25a1b0589b62b0f"}, - {file = "ctranslate2-3.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:ce57bb42cc40dbecf77b4034a796a71be603933f653353b7e9f1ed488fb7a102"}, - {file = "ctranslate2-3.22.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1ec50358a0af04fb40454ddb8b60e8c9612cb7bea8de828ee0b5d834c0341ca7"}, - {file = "ctranslate2-3.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e9bbd74c98ff96318f7275f4f622b7a3e215460e64957a7bac1af6b96c6cdb6"}, - {file = "ctranslate2-3.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8fcfbce7b8440e8d42297d855c9600e2f6f2be74f046103e1ea1aa6ed1c8a8f"}, - {file = "ctranslate2-3.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ededd8ea8335261cf982517d04129e7be49c0f41e38a0a5f48639bb08bdfd5f1"}, - {file = "ctranslate2-3.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:b9d48e396451af160412e5bd0de0711337cdb4f3f654542f56943114ac1debc3"}, - {file = "ctranslate2-3.22.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:82a91d755283999571b3f9eb1a1ab5b7ab0deae795df70f036a09903ead42a85"}, - {file = "ctranslate2-3.22.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28b0ca0e00e6c037347d89de9e3a670a4dc2ee0fb6c462b51f84a8256aa92e28"}, - {file = "ctranslate2-3.22.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71c1f2b1dc0c6a3910c2c0ff34e2fc1df43f84cbd7922281430ba83e9a0cbad9"}, - {file = "ctranslate2-3.22.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb88611a9588fb778837ca8e67c5ae4a7601a417c53f97a2db5f58270dc49b5"}, - {file = "ctranslate2-3.22.0-cp38-cp38-win_amd64.whl", hash = "sha256:3cb851070db35c4210df15854d0bd0ef0eb1fd073c566059f4fa756e417cb031"}, - {file = "ctranslate2-3.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7cdc96b94cc9dee07820306118f1c61c67b2ee0a291456f5bf61696fa2897687"}, - {file = "ctranslate2-3.22.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2d3d77092b6e53c7945cb38df8fcc84e6e40d57fd59c060ece56922a036b407b"}, - {file = "ctranslate2-3.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02e19061181661036e92df409c69989a2668093b04d2274cf5a2ee3d1878d944"}, - {file = "ctranslate2-3.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:794c1fa62d2d3b9ce936250a957a20fe2506f150a073a068fb5e36672e0a71af"}, - {file = "ctranslate2-3.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:58199cc5d3fd970dcabd08a9173ab0c16229af618511d7013d141377b2742a0e"}, + {file = "ctranslate2-3.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f42013c51599efce30303286022095b084143d5bd45537e1acb36c032c4f683c"}, + {file = "ctranslate2-3.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e055981ba85a7a27a125749eee20e1dfa0740af9dd1f771eab5ef8e7af3d6ed7"}, + {file = "ctranslate2-3.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b211cd1cc22356c94ae260a11d9274eaed2f331bae91bbe502542edabc9c0bea"}, + {file = "ctranslate2-3.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87648abc1026ec9e1657ed88b8407db057c570ecc2ae5dbd321ddec1a21272c6"}, + {file = "ctranslate2-3.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:8d55b4689e866f62095cfed7c79f3ece75a4cba9a193df96129f83f33d049ccc"}, + {file = "ctranslate2-3.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc8e7a8900a9911854d4c820badbdff9ffde94e6d853f27f82a282f01f6c61a1"}, + {file = "ctranslate2-3.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b974d63c769e2246eb8384613a3a38417c8a47c00db78a972d3435d3fb92d54b"}, + {file = "ctranslate2-3.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f9f2554810157ca8a7dcb6da76aa326e0ea7424c8c62cec743d601dae45f051"}, + {file = "ctranslate2-3.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8a0d3085297373208f6e703e096bfd3b19ec80bf133e006fdcd7e88996b11b"}, + {file = "ctranslate2-3.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:9999956b88cdff4d102868b90c5526af3910010db0acd1bdeb3a1b4c1380800d"}, + {file = "ctranslate2-3.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a4bea2124f8ad6e3b218612bc40323922001720d2939653ca69a497583f566eb"}, + {file = "ctranslate2-3.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:517c40e1d19efd08572549249146af493812e76e05c08d5b5bab5baff09d6403"}, + {file = "ctranslate2-3.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d77e3249ea3e93f72941fb2da118e9b07aab3da3dc339ed17b97a3a10116b9"}, + {file = "ctranslate2-3.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46ec9a53ebc1f286d6407694311e9c83b48c42c0a6dff4975610d7d708cbab37"}, + {file = "ctranslate2-3.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:14db7daeee240c71c41e8021d431a865bb25a1f7ec0d1b37a0dd8cc0ecd64cc0"}, + {file = "ctranslate2-3.23.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aecc6e3944619a72c873d76ef658a44b1b998ecfe4678b1f7fb4190c2fdb3a11"}, + {file = "ctranslate2-3.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8603950fb1816e0943b6713dabe0b4e651fbc65addc88fb185dce2bd6d29522f"}, + {file = "ctranslate2-3.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a4c465b65697499bb992a2fd00d9957dc5e6baa479c76dc2a5fb2912c2eb28d"}, + {file = "ctranslate2-3.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f16d6e283c4b490fc8b847c49d813c541b780c2738243e34b12db96879f3385"}, + {file = "ctranslate2-3.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:bca8e286b0156208656eafedec73896b40318a0be9b925fca7d6bc8dd665827c"}, + {file = "ctranslate2-3.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f37424b57f6dc0ebeca513632d10d15608631b2f9ee7410537b8ca96a73e2c30"}, + {file = "ctranslate2-3.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:deaa43c1b47e20f2a79f1df699f41de62a881cc860889e027040d14b9b140db6"}, + {file = "ctranslate2-3.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38bdb154e149e954f63aff4d3291d4c8abd7799b2729c5aed533069f8c299b1"}, + {file = "ctranslate2-3.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b82e0dfa2ab179f185d0052ee5b1390cc2f7f905f8d9bfbaf736eefc8e5ed182"}, + {file = "ctranslate2-3.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:720d324f4fe2a56148f7a81248d6a703720685462b96d09c6f8c3ae1615f2f24"}, ] [package.dependencies] @@ -1034,13 +1034,13 @@ files = [ [[package]] name = "fsspec" -version = "2023.10.0" +version = "2023.12.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2023.10.0-py3-none-any.whl", hash = "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529"}, - {file = "fsspec-2023.10.0.tar.gz", hash = "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5"}, + {file = "fsspec-2023.12.1-py3-none-any.whl", hash = "sha256:6271f1d3075a378bfe432f6f42bf7e1d2a6ba74f78dd9b512385474c579146a0"}, + {file = "fsspec-2023.12.1.tar.gz", hash = "sha256:c4da01a35ac65c853f833e43f67802c25213f560820d54ddf248f92eddd5e990"}, ] [package.extras] @@ -1091,13 +1091,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "2.23.4" +version = "2.25.1" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ - {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, - {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, + {file = "google-auth-2.25.1.tar.gz", hash = "sha256:d5d66b8f4f6e3273740d7bb73ddefa6c2d1ff691704bd407d51c6b5800e7c97b"}, + {file = "google_auth-2.25.1-py2.py3-none-any.whl", hash = "sha256:dfd7b44935d498e106c08883b2dac0ad36d8aa10402a6412e9a1c9d74b4773f1"}, ] [package.dependencies] @@ -1284,74 +1284,6 @@ files = [ [package.extras] protobuf = ["grpcio-tools (>=1.59.3)"] -[[package]] -name = "grpcio-tools" -version = "1.59.3" -description = "Protobuf code generator for gRPC" -optional = false -python-versions = ">=3.7" -files = [ - {file = "grpcio-tools-1.59.3.tar.gz", hash = "sha256:cd160ac4281cd1ae77a2c880377a7728349340b4c91e24285037b57c18e9f651"}, - {file = "grpcio_tools-1.59.3-cp310-cp310-linux_armv7l.whl", hash = "sha256:17017fe74734c158e0f93817f1ff17aeda37d0f105ed6e63b12c26b66743a7a8"}, - {file = "grpcio_tools-1.59.3-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:ac1013e4f84ffd15c45ead6d19c9d188b76c14466a799aa9c338ce3b9ebf6dcc"}, - {file = "grpcio_tools-1.59.3-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:0a5d760619305eb51a8719ce9c081398f145a46bc7c86a6e2cebe0648a21f40c"}, - {file = "grpcio_tools-1.59.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de3d9649b7a3091ec785a67d5bf006584440f03896ee52259c6d9ff412d08afb"}, - {file = "grpcio_tools-1.59.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21868aa510317d3f39e5de40208ffb8ab1beb1cbcab333317939b59a9b5db055"}, - {file = "grpcio_tools-1.59.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0b116a888580317e421358f26bfaeec47d6f73079e8a47bad60d1f9f7b30f2a5"}, - {file = "grpcio_tools-1.59.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6bd4a72c27abda191e2360b2b720ada1880aba96a63604a6f9d7c37bb3bbf5c4"}, - {file = "grpcio_tools-1.59.3-cp310-cp310-win32.whl", hash = "sha256:d70cad744e92c7576c226a72998ae8dd59240c942f73798bbde40284eb9eb991"}, - {file = "grpcio_tools-1.59.3-cp310-cp310-win_amd64.whl", hash = "sha256:2b8a4aca0c11f2a8b3bfe103362984bdc427ab762428446ef2e12922fd48ee10"}, - {file = "grpcio_tools-1.59.3-cp311-cp311-linux_armv7l.whl", hash = "sha256:b4418b78408ff56ee70a0b14484c07f5e48c2e6f4fa7be390d486a686d0cd6e4"}, - {file = "grpcio_tools-1.59.3-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:58de83ced4f86458f45288a5f76d9765dc245a9ce4e783a194decccc7e0674ea"}, - {file = "grpcio_tools-1.59.3-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:76b0cdcbcb38722840d3eaff6439ddb4b8f0210c6718553d7b7c911834b10e60"}, - {file = "grpcio_tools-1.59.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0cacf59513b100bfb3d8de51ba43db6140aa9bcb7bba872badb48acb430c002"}, - {file = "grpcio_tools-1.59.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:019fdd986c80b13187574c291df5054f241bdbe87dbc86e4cee73ffa28328647"}, - {file = "grpcio_tools-1.59.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ff304b9d6c23d8e2ecc860bebac1ec6768a2d920985bcea9ce4a7aaeeea44f76"}, - {file = "grpcio_tools-1.59.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ca286affe613beaf2d5a6b8bd83203dcf488917194b416da48aa849047b5f081"}, - {file = "grpcio_tools-1.59.3-cp311-cp311-win32.whl", hash = "sha256:8f69141ff370729ceaad0286b8c6e15352c9bb39aa8f18c0500ce3d0238c2981"}, - {file = "grpcio_tools-1.59.3-cp311-cp311-win_amd64.whl", hash = "sha256:05ec4ffe16b6eab12813476e6d7465a0027bee33999d4776ae1d9c0664d0fc54"}, - {file = "grpcio_tools-1.59.3-cp312-cp312-linux_armv7l.whl", hash = "sha256:21d976419630f72a7cefebe7dcfc451b33d70c805a43ff5a60c43367813f0527"}, - {file = "grpcio_tools-1.59.3-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:396106f92ea6ab2157535e1a009bac99aa15680ca8addbc8e7c1a4d3f5b1fb2c"}, - {file = "grpcio_tools-1.59.3-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:4f064483e0046a4a193d6c67b26ea0f61737e8232ff61636a7fa0bc5244458be"}, - {file = "grpcio_tools-1.59.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6dc6da8e3780df25095c1952f45c334e1554f25b991ffe75dbf0408795d27a0"}, - {file = "grpcio_tools-1.59.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87111be05c1a159ce3fffbfad86ff69fd4bf1702cde127eb698d8e8c3a018ab6"}, - {file = "grpcio_tools-1.59.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:83453a13c2120238eb7fb993b03b370496e76071a7b45c816aa682d9226d29c1"}, - {file = "grpcio_tools-1.59.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4384b29d8e126bc6e24a5efd9d60a2a2015867c7109fa67ff2ed274b3f4a05c5"}, - {file = "grpcio_tools-1.59.3-cp312-cp312-win32.whl", hash = "sha256:ce1372c9acde9d74c7e54858598ac0c5203dd3ec24b9085f7a8b2f33cc156736"}, - {file = "grpcio_tools-1.59.3-cp312-cp312-win_amd64.whl", hash = "sha256:84179e3a7c9067e993700b3255f2adc10e9b16e8dd28525d1dd1a02b9ca603ee"}, - {file = "grpcio_tools-1.59.3-cp37-cp37m-linux_armv7l.whl", hash = "sha256:592208a9a02df75993cc4dba111d2b81f0e6a3f3837856be239e1aceb6651f31"}, - {file = "grpcio_tools-1.59.3-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:1abe30ce770ac4fed966d017771fa7f8ced6a279de7ce68023e2c07f07911e76"}, - {file = "grpcio_tools-1.59.3-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4dce57668e2aa8c3bb0b2a0bb766a2654ee0f4d8d31e02a6001e98af18569285"}, - {file = "grpcio_tools-1.59.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acaefd3c362250a02cc93fc1b5440e3cb30ab8d7fd81594b2975ea19f123aae3"}, - {file = "grpcio_tools-1.59.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76542e1c11e3f2c22c19cff6b3233caab35924fad1f685ce63184d31b4050fa8"}, - {file = "grpcio_tools-1.59.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:64fd1efb23da054f61aca2346c5139f317b7f4c545f6dbda5ec246f281af8e86"}, - {file = "grpcio_tools-1.59.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ea6454acde508c9a62dab3f59e98b32e32b26aa60df20080982503bb7db51304"}, - {file = "grpcio_tools-1.59.3-cp37-cp37m-win_amd64.whl", hash = "sha256:a048d4bde526f3c6e364abea2c3a481f3bbebc4bfa7fdcfcc3e5ee4f8ab9c4c5"}, - {file = "grpcio_tools-1.59.3-cp38-cp38-linux_armv7l.whl", hash = "sha256:b4db59a62d31c98105af08b1bfb8878c239e4cf31088f2d9864756cdfec67746"}, - {file = "grpcio_tools-1.59.3-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:05ac0f6683759e5508081c09af26cb6cc949c2c54d75ff8b76344709f78dda53"}, - {file = "grpcio_tools-1.59.3-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a031e1ced828a00f1eb59db5f5d4dd39d3bd6a7df8187f84830d4a32a1bbc686"}, - {file = "grpcio_tools-1.59.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f48b4409b306675b7673dad725c9cf3234bf05623bf8a193ad14af39d0368ba6"}, - {file = "grpcio_tools-1.59.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36524d97cc936767a69815b90be76a1420b3218a7724ce69cde6ece794e72a17"}, - {file = "grpcio_tools-1.59.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7cc7e8b893a6c37a8a28735fede1aa40275988a668d1e22c5f234938a77d811d"}, - {file = "grpcio_tools-1.59.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:917be645a71cf9592d2f5a3589c20c074a6539954017e8e2dca5e8ba13025625"}, - {file = "grpcio_tools-1.59.3-cp38-cp38-win32.whl", hash = "sha256:a1394b7a65d738ee0ce4eac1fc95158dd9c97b5c3f690d259e6ee0bf131697de"}, - {file = "grpcio_tools-1.59.3-cp38-cp38-win_amd64.whl", hash = "sha256:007745bd3c5a788dcb73eeb6cd773613a834bd2442e7d062dcafe46dbd4bb5f6"}, - {file = "grpcio_tools-1.59.3-cp39-cp39-linux_armv7l.whl", hash = "sha256:102b5f14a500dbb766f24a96884d9572a3ea7a56d69695461100fb71ec922ef6"}, - {file = "grpcio_tools-1.59.3-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:46c384a0e30a8422a3e2c5530b3cd69b652dd659549907e2eaac7ca4e0ab614d"}, - {file = "grpcio_tools-1.59.3-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:ee013da4f5a4ef50fdeca372470733bc402677a4dc0023ee94bf42478b5a620d"}, - {file = "grpcio_tools-1.59.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b7883ce3d532c09f29c016fdac107f9a3dc43f9e6b60faf8b91fcba21824269"}, - {file = "grpcio_tools-1.59.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2861e4814ebc147854c2246092c433931f4c15f3c8105ae8716b1e282313a5ae"}, - {file = "grpcio_tools-1.59.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d93590a6a82469f3e58e39692230d99c43a39b215cb581e072dcd52286471152"}, - {file = "grpcio_tools-1.59.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f8396183e6e0a16178773963dc21b58c0c532783476fda314198a9e42f57af7d"}, - {file = "grpcio_tools-1.59.3-cp39-cp39-win32.whl", hash = "sha256:6747b1d82d08e0f5e1a6438532343a1c5504147d1a199c5756e702e5f916de4c"}, - {file = "grpcio_tools-1.59.3-cp39-cp39-win_amd64.whl", hash = "sha256:3a560dcb176dd42c37af5d37299e318341a572547e32b942247daa834d2164c0"}, -] - -[package.dependencies] -grpcio = ">=1.59.3" -protobuf = ">=4.21.6,<5.0dev" -setuptools = "*" - [[package]] name = "h11" version = "0.14.0" @@ -1363,53 +1295,6 @@ files = [ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, ] -[[package]] -name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, -] - -[package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" - -[[package]] -name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, -] - -[[package]] -name = "httpcore" -version = "1.0.2" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, - {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.23.0)"] - [[package]] name = "httptools" version = "0.6.1" @@ -1458,31 +1343,6 @@ files = [ [package.extras] test = ["Cython (>=0.29.24,<0.30.0)"] -[[package]] -name = "httpx" -version = "0.25.2" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118"}, - {file = "httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -h2 = {version = ">=3,<5", optional = true, markers = "extra == \"http2\""} -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] - [[package]] name = "huggingface-hub" version = "0.17.3" @@ -1530,26 +1390,15 @@ files = [ [package.dependencies] pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} -[[package]] -name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, -] - [[package]] name = "idna" -version = "3.4" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] @@ -1565,13 +1414,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.27.0" +version = "6.27.1" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.27.0-py3-none-any.whl", hash = "sha256:4388caa3c2cba0a381e20d289545e88a8aef1fe57a884d4c018718ec8c23c121"}, - {file = "ipykernel-6.27.0.tar.gz", hash = "sha256:7f4986f606581be73bfb32dc7a1ac9fa0e804c9be50ddf1c7a119413e982693f"}, + {file = "ipykernel-6.27.1-py3-none-any.whl", hash = "sha256:dab88b47f112f9f7df62236511023c9bdeef67abc73af7c652e4ce4441601686"}, + {file = "ipykernel-6.27.1.tar.gz", hash = "sha256:7d5d594b6690654b4d299edba5e872dc17bb7396a8d0609c97cb7b8a1c605de6"}, ] [package.dependencies] @@ -1598,24 +1447,23 @@ test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio" [[package]] name = "ipython" -version = "8.17.2" +version = "8.18.1" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.9" files = [ - {file = "ipython-8.17.2-py3-none-any.whl", hash = "sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444"}, - {file = "ipython-8.17.2.tar.gz", hash = "sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb"}, + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, ] [package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +prompt-toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" stack-data = "*" traitlets = ">=5" @@ -1671,13 +1519,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jinxed" -version = "1.2.0" +version = "1.2.1" description = "Jinxed Terminal Library" optional = false python-versions = "*" files = [ - {file = "jinxed-1.2.0-py2.py3-none-any.whl", hash = "sha256:cfc2b2e4e3b4326954d546ba6d6b9a7a796ddcb0aef8d03161d005177eb0d48b"}, - {file = "jinxed-1.2.0.tar.gz", hash = "sha256:032acda92d5c57cd216033cbbd53de731e6ed50deb63eb4781336ca55f72cda5"}, + {file = "jinxed-1.2.1-py2.py3-none-any.whl", hash = "sha256:37422659c4925969c66148c5e64979f553386a4226b9484d910d3094ced37d30"}, + {file = "jinxed-1.2.1.tar.gz", hash = "sha256:30c3f861b73279fea1ed928cfd4dfb1f273e16cd62c8a32acfac362da0f78f3f"}, ] [package.dependencies] @@ -1706,13 +1554,13 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2023.11.1" +version = "2023.11.2" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema_specifications-2023.11.1-py3-none-any.whl", hash = "sha256:f596778ab612b3fd29f72ea0d990393d0540a5aab18bf0407a46632eab540779"}, - {file = "jsonschema_specifications-2023.11.1.tar.gz", hash = "sha256:c9b234904ffe02f079bf91b14d79987faa685fd4b39c377a0996954c0090b9ca"}, + {file = "jsonschema_specifications-2023.11.2-py3-none-any.whl", hash = "sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93"}, + {file = "jsonschema_specifications-2023.11.2.tar.gz", hash = "sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8"}, ] [package.dependencies] @@ -1762,12 +1610,12 @@ test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "lit" -version = "17.0.5" +version = "17.0.6" description = "A Software Testing Tool" optional = false python-versions = "*" files = [ - {file = "lit-17.0.5.tar.gz", hash = "sha256:696199a629c73712a5bebda533729ea2c7e4c798bcfc38d9cd1375aa668ced98"}, + {file = "lit-17.0.6.tar.gz", hash = "sha256:dfa9af9b55fc4509a56be7bf2346f079d7f4a242d583b9f2e0b078fd0abae31b"}, ] [[package]] @@ -2071,38 +1919,38 @@ files = [ [[package]] name = "mypy" -version = "1.7.0" +version = "1.7.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5da84d7bf257fd8f66b4f759a904fd2c5a765f70d8b52dde62b521972a0a2357"}, - {file = "mypy-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a3637c03f4025f6405737570d6cbfa4f1400eb3c649317634d273687a09ffc2f"}, - {file = "mypy-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b633f188fc5ae1b6edca39dae566974d7ef4e9aaaae00bc36efe1f855e5173ac"}, - {file = "mypy-1.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d6ed9a3997b90c6f891138e3f83fb8f475c74db4ccaa942a1c7bf99e83a989a1"}, - {file = "mypy-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fe46e96ae319df21359c8db77e1aecac8e5949da4773c0274c0ef3d8d1268a9"}, - {file = "mypy-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:df67fbeb666ee8828f675fee724cc2cbd2e4828cc3df56703e02fe6a421b7401"}, - {file = "mypy-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a79cdc12a02eb526d808a32a934c6fe6df07b05f3573d210e41808020aed8b5d"}, - {file = "mypy-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f65f385a6f43211effe8c682e8ec3f55d79391f70a201575def73d08db68ead1"}, - {file = "mypy-1.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e81ffd120ee24959b449b647c4b2fbfcf8acf3465e082b8d58fd6c4c2b27e46"}, - {file = "mypy-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:f29386804c3577c83d76520abf18cfcd7d68264c7e431c5907d250ab502658ee"}, - {file = "mypy-1.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:87c076c174e2c7ef8ab416c4e252d94c08cd4980a10967754f91571070bf5fbe"}, - {file = "mypy-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cb8d5f6d0fcd9e708bb190b224089e45902cacef6f6915481806b0c77f7786d"}, - {file = "mypy-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93e76c2256aa50d9c82a88e2f569232e9862c9982095f6d54e13509f01222fc"}, - {file = "mypy-1.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cddee95dea7990e2215576fae95f6b78a8c12f4c089d7e4367564704e99118d3"}, - {file = "mypy-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:d01921dbd691c4061a3e2ecdbfbfad029410c5c2b1ee88946bf45c62c6c91210"}, - {file = "mypy-1.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:185cff9b9a7fec1f9f7d8352dff8a4c713b2e3eea9c6c4b5ff7f0edf46b91e41"}, - {file = "mypy-1.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7a7b1e399c47b18feb6f8ad4a3eef3813e28c1e871ea7d4ea5d444b2ac03c418"}, - {file = "mypy-1.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9fe455ad58a20ec68599139ed1113b21f977b536a91b42bef3ffed5cce7391"}, - {file = "mypy-1.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d0fa29919d2e720c8dbaf07d5578f93d7b313c3e9954c8ec05b6d83da592e5d9"}, - {file = "mypy-1.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b53655a295c1ed1af9e96b462a736bf083adba7b314ae775563e3fb4e6795f5"}, - {file = "mypy-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1b06b4b109e342f7dccc9efda965fc3970a604db70f8560ddfdee7ef19afb05"}, - {file = "mypy-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bf7a2f0a6907f231d5e41adba1a82d7d88cf1f61a70335889412dec99feeb0f8"}, - {file = "mypy-1.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551d4a0cdcbd1d2cccdcc7cb516bb4ae888794929f5b040bb51aae1846062901"}, - {file = "mypy-1.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:55d28d7963bef00c330cb6461db80b0b72afe2f3c4e2963c99517cf06454e665"}, - {file = "mypy-1.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:870bd1ffc8a5862e593185a4c169804f2744112b4a7c55b93eb50f48e7a77010"}, - {file = "mypy-1.7.0-py3-none-any.whl", hash = "sha256:96650d9a4c651bc2a4991cf46f100973f656d69edc7faf91844e87fe627f7e96"}, - {file = "mypy-1.7.0.tar.gz", hash = "sha256:1e280b5697202efa698372d2f39e9a6713a0395a756b1c6bd48995f8d72690dc"}, + {file = "mypy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340"}, + {file = "mypy-1.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49"}, + {file = "mypy-1.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5"}, + {file = "mypy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d"}, + {file = "mypy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a"}, + {file = "mypy-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7"}, + {file = "mypy-1.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51"}, + {file = "mypy-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a"}, + {file = "mypy-1.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28"}, + {file = "mypy-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42"}, + {file = "mypy-1.7.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1"}, + {file = "mypy-1.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33"}, + {file = "mypy-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb"}, + {file = "mypy-1.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea"}, + {file = "mypy-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82"}, + {file = "mypy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200"}, + {file = "mypy-1.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7"}, + {file = "mypy-1.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e"}, + {file = "mypy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9"}, + {file = "mypy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7"}, + {file = "mypy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe"}, + {file = "mypy-1.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce"}, + {file = "mypy-1.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a"}, + {file = "mypy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120"}, + {file = "mypy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6"}, + {file = "mypy-1.7.1-py3-none-any.whl", hash = "sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea"}, + {file = "mypy-1.7.1.tar.gz", hash = "sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2"}, ] [package.dependencies] @@ -2493,13 +2341,13 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -2574,13 +2422,13 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [[package]] name = "platformdirs" -version = "4.0.0" +version = "4.1.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, - {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, ] [package.extras] @@ -2602,25 +2450,6 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "portalocker" -version = "2.8.2" -description = "Wraps the portalocker recipe for easy usage" -optional = false -python-versions = ">=3.8" -files = [ - {file = "portalocker-2.8.2-py3-none-any.whl", hash = "sha256:cfb86acc09b9aa7c3b43594e19be1345b9d16af3feb08bf92f23d4dce513a28e"}, - {file = "portalocker-2.8.2.tar.gz", hash = "sha256:2b035aa7828e46c58e9b31390ee1f169b98e1066ab10b9a6a861fe7e25ee4f33"}, -] - -[package.dependencies] -pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""} - -[package.extras] -docs = ["sphinx (>=1.7.1)"] -redis = ["redis"] -tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] - [[package]] name = "prometheus-client" version = "0.19.0" @@ -3046,13 +2875,13 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no [[package]] name = "pytest-asyncio" -version = "0.21.1" +version = "0.23.2" description = "Pytest support for asyncio" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-asyncio-0.21.1.tar.gz", hash = "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d"}, - {file = "pytest_asyncio-0.21.1-py3-none-any.whl", hash = "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b"}, + {file = "pytest-asyncio-0.23.2.tar.gz", hash = "sha256:c16052382554c7b22d48782ab3438d5b10f8cf7a4bdcae7f0f67f097d95beecc"}, + {file = "pytest_asyncio-0.23.2-py3-none-any.whl", hash = "sha256:ea9021364e32d58f0be43b91c6233fb8d2224ccef2398d6837559e587682808f"}, ] [package.dependencies] @@ -3060,7 +2889,7 @@ pytest = ">=7.0.0" [package.extras] docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] +testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"] [[package]] name = "pytest-mock" @@ -3216,132 +3045,109 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.1" +version = "25.1.2" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.6" files = [ - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:381469297409c5adf9a0e884c5eb5186ed33137badcbbb0560b86e910a2f1e76"}, - {file = "pyzmq-25.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:955215ed0604dac5b01907424dfa28b40f2b2292d6493445dd34d0dfa72586a8"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:985bbb1316192b98f32e25e7b9958088431d853ac63aca1d2c236f40afb17c83"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afea96f64efa98df4da6958bae37f1cbea7932c35878b185e5982821bc883369"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76705c9325d72a81155bb6ab48d4312e0032bf045fb0754889133200f7a0d849"}, - {file = "pyzmq-25.1.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77a41c26205d2353a4c94d02be51d6cbdf63c06fbc1295ea57dad7e2d3381b71"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:12720a53e61c3b99d87262294e2b375c915fea93c31fc2336898c26d7aed34cd"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:57459b68e5cd85b0be8184382cefd91959cafe79ae019e6b1ae6e2ba8a12cda7"}, - {file = "pyzmq-25.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:292fe3fc5ad4a75bc8df0dfaee7d0babe8b1f4ceb596437213821f761b4589f9"}, - {file = "pyzmq-25.1.1-cp310-cp310-win32.whl", hash = "sha256:35b5ab8c28978fbbb86ea54958cd89f5176ce747c1fb3d87356cf698048a7790"}, - {file = "pyzmq-25.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:11baebdd5fc5b475d484195e49bae2dc64b94a5208f7c89954e9e354fc609d8f"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:d20a0ddb3e989e8807d83225a27e5c2eb2260eaa851532086e9e0fa0d5287d83"}, - {file = "pyzmq-25.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e1c1be77bc5fb77d923850f82e55a928f8638f64a61f00ff18a67c7404faf008"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d89528b4943d27029a2818f847c10c2cecc79fa9590f3cb1860459a5be7933eb"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90f26dc6d5f241ba358bef79be9ce06de58d477ca8485e3291675436d3827cf8"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2b92812bd214018e50b6380ea3ac0c8bb01ac07fcc14c5f86a5bb25e74026e9"}, - {file = "pyzmq-25.1.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f957ce63d13c28730f7fd6b72333814221c84ca2421298f66e5143f81c9f91f"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:047a640f5c9c6ade7b1cc6680a0e28c9dd5a0825135acbd3569cc96ea00b2505"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7f7e58effd14b641c5e4dec8c7dab02fb67a13df90329e61c869b9cc607ef752"}, - {file = "pyzmq-25.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c2910967e6ab16bf6fbeb1f771c89a7050947221ae12a5b0b60f3bca2ee19bca"}, - {file = "pyzmq-25.1.1-cp311-cp311-win32.whl", hash = "sha256:76c1c8efb3ca3a1818b837aea423ff8a07bbf7aafe9f2f6582b61a0458b1a329"}, - {file = "pyzmq-25.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:44e58a0554b21fc662f2712814a746635ed668d0fbc98b7cb9d74cb798d202e6"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:e1ffa1c924e8c72778b9ccd386a7067cddf626884fd8277f503c48bb5f51c762"}, - {file = "pyzmq-25.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1af379b33ef33757224da93e9da62e6471cf4a66d10078cf32bae8127d3d0d4a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cff084c6933680d1f8b2f3b4ff5bbb88538a4aac00d199ac13f49d0698727ecb"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2400a94f7dd9cb20cd012951a0cbf8249e3d554c63a9c0cdfd5cbb6c01d2dec"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d81f1ddae3858b8299d1da72dd7d19dd36aab654c19671aa8a7e7fb02f6638a"}, - {file = "pyzmq-25.1.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:255ca2b219f9e5a3a9ef3081512e1358bd4760ce77828e1028b818ff5610b87b"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a882ac0a351288dd18ecae3326b8a49d10c61a68b01419f3a0b9a306190baf69"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:724c292bb26365659fc434e9567b3f1adbdb5e8d640c936ed901f49e03e5d32e"}, - {file = "pyzmq-25.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ca1ed0bb2d850aa8471387882247c68f1e62a4af0ce9c8a1dbe0d2bf69e41fb"}, - {file = "pyzmq-25.1.1-cp312-cp312-win32.whl", hash = "sha256:b3451108ab861040754fa5208bca4a5496c65875710f76789a9ad27c801a0075"}, - {file = "pyzmq-25.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eadbefd5e92ef8a345f0525b5cfd01cf4e4cc651a2cffb8f23c0dd184975d787"}, - {file = "pyzmq-25.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:db0b2af416ba735c6304c47f75d348f498b92952f5e3e8bff449336d2728795d"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7c133e93b405eb0d36fa430c94185bdd13c36204a8635470cccc200723c13bb"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:273bc3959bcbff3f48606b28229b4721716598d76b5aaea2b4a9d0ab454ec062"}, - {file = "pyzmq-25.1.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cbc8df5c6a88ba5ae385d8930da02201165408dde8d8322072e3e5ddd4f68e22"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:18d43df3f2302d836f2a56f17e5663e398416e9dd74b205b179065e61f1a6edf"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:73461eed88a88c866656e08f89299720a38cb4e9d34ae6bf5df6f71102570f2e"}, - {file = "pyzmq-25.1.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:34c850ce7976d19ebe7b9d4b9bb8c9dfc7aac336c0958e2651b88cbd46682123"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win32.whl", hash = "sha256:d2045d6d9439a0078f2a34b57c7b18c4a6aef0bee37f22e4ec9f32456c852c71"}, - {file = "pyzmq-25.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:458dea649f2f02a0b244ae6aef8dc29325a2810aa26b07af8374dc2a9faf57e3"}, - {file = "pyzmq-25.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7cff25c5b315e63b07a36f0c2bab32c58eafbe57d0dce61b614ef4c76058c115"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1579413ae492b05de5a6174574f8c44c2b9b122a42015c5292afa4be2507f28"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3d0a409d3b28607cc427aa5c30a6f1e4452cc44e311f843e05edb28ab5e36da0"}, - {file = "pyzmq-25.1.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21eb4e609a154a57c520e3d5bfa0d97e49b6872ea057b7c85257b11e78068222"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:034239843541ef7a1aee0c7b2cb7f6aafffb005ede965ae9cbd49d5ff4ff73cf"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f8115e303280ba09f3898194791a153862cbf9eef722ad8f7f741987ee2a97c7"}, - {file = "pyzmq-25.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a5d26fe8f32f137e784f768143728438877d69a586ddeaad898558dc971a5ae"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win32.whl", hash = "sha256:f32260e556a983bc5c7ed588d04c942c9a8f9c2e99213fec11a031e316874c7e"}, - {file = "pyzmq-25.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:abf34e43c531bbb510ae7e8f5b2b1f2a8ab93219510e2b287a944432fad135f3"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:87e34f31ca8f168c56d6fbf99692cc8d3b445abb5bfd08c229ae992d7547a92a"}, - {file = "pyzmq-25.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c9c6c9b2c2f80747a98f34ef491c4d7b1a8d4853937bb1492774992a120f475d"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5619f3f5a4db5dbb572b095ea3cb5cc035335159d9da950830c9c4db2fbb6995"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a34d2395073ef862b4032343cf0c32a712f3ab49d7ec4f42c9661e0294d106f"}, - {file = "pyzmq-25.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25f0e6b78220aba09815cd1f3a32b9c7cb3e02cb846d1cfc526b6595f6046618"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3669cf8ee3520c2f13b2e0351c41fea919852b220988d2049249db10046a7afb"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d163a18819277e49911f7461567bda923461c50b19d169a062536fffe7cd9d2"}, - {file = "pyzmq-25.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:df27ffddff4190667d40de7beba4a950b5ce78fe28a7dcc41d6f8a700a80a3c0"}, - {file = "pyzmq-25.1.1-cp38-cp38-win32.whl", hash = "sha256:a382372898a07479bd34bda781008e4a954ed8750f17891e794521c3e21c2e1c"}, - {file = "pyzmq-25.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:52533489f28d62eb1258a965f2aba28a82aa747202c8fa5a1c7a43b5db0e85c1"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:03b3f49b57264909aacd0741892f2aecf2f51fb053e7d8ac6767f6c700832f45"}, - {file = "pyzmq-25.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:330f9e188d0d89080cde66dc7470f57d1926ff2fb5576227f14d5be7ab30b9fa"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2ca57a5be0389f2a65e6d3bb2962a971688cbdd30b4c0bd188c99e39c234f414"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d457aed310f2670f59cc5b57dcfced452aeeed77f9da2b9763616bd57e4dbaae"}, - {file = "pyzmq-25.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c56d748ea50215abef7030c72b60dd723ed5b5c7e65e7bc2504e77843631c1a6"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f03d3f0d01cb5a018debeb412441996a517b11c5c17ab2001aa0597c6d6882c"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:820c4a08195a681252f46926de10e29b6bbf3e17b30037bd4250d72dd3ddaab8"}, - {file = "pyzmq-25.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17ef5f01d25b67ca8f98120d5fa1d21efe9611604e8eb03a5147360f517dd1e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win32.whl", hash = "sha256:04ccbed567171579ec2cebb9c8a3e30801723c575601f9a990ab25bcac6b51e2"}, - {file = "pyzmq-25.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:e61f091c3ba0c3578411ef505992d356a812fb200643eab27f4f70eed34a29ef"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ade6d25bb29c4555d718ac6d1443a7386595528c33d6b133b258f65f963bb0f6"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c95ddd4f6e9fca4e9e3afaa4f9df8552f0ba5d1004e89ef0a68e1f1f9807c7"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48e466162a24daf86f6b5ca72444d2bf39a5e58da5f96370078be67c67adc978"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abc719161780932c4e11aaebb203be3d6acc6b38d2f26c0f523b5b59d2fc1996"}, - {file = "pyzmq-25.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ccf825981640b8c34ae54231b7ed00271822ea1c6d8ba1090ebd4943759abf5"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2f20ce161ebdb0091a10c9ca0372e023ce24980d0e1f810f519da6f79c60800"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:deee9ca4727f53464daf089536e68b13e6104e84a37820a88b0a057b97bba2d2"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aa8d6cdc8b8aa19ceb319aaa2b660cdaccc533ec477eeb1309e2a291eaacc43a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:019e59ef5c5256a2c7378f2fb8560fc2a9ff1d315755204295b2eab96b254d0a"}, - {file = "pyzmq-25.1.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b9af3757495c1ee3b5c4e945c1df7be95562277c6e5bccc20a39aec50f826cd0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:548d6482dc8aadbe7e79d1b5806585c8120bafa1ef841167bc9090522b610fa6"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:057e824b2aae50accc0f9a0570998adc021b372478a921506fddd6c02e60308e"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2243700cc5548cff20963f0ca92d3e5e436394375ab8a354bbea2b12911b20b0"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79986f3b4af059777111409ee517da24a529bdbd46da578b33f25580adcff728"}, - {file = "pyzmq-25.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:11d58723d44d6ed4dd677c5615b2ffb19d5c426636345567d6af82be4dff8a55"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:49d238cf4b69652257db66d0c623cd3e09b5d2e9576b56bc067a396133a00d4a"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fedbdc753827cf014c01dbbee9c3be17e5a208dcd1bf8641ce2cd29580d1f0d4"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc16ac425cc927d0a57d242589f87ee093884ea4804c05a13834d07c20db203c"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11c1d2aed9079c6b0c9550a7257a836b4a637feb334904610f06d70eb44c56d2"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e8a701123029cc240cea61dd2d16ad57cab4691804143ce80ecd9286b464d180"}, - {file = "pyzmq-25.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61706a6b6c24bdece85ff177fec393545a3191eeda35b07aaa1458a027ad1304"}, - {file = "pyzmq-25.1.1.tar.gz", hash = "sha256:259c22485b71abacdfa8bf79720cd7bcf4b9d128b30ea554f01ae71fdbfdaa23"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, ] [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -[[package]] -name = "qdrant-client" -version = "1.6.9" -description = "Client library for the Qdrant vector search engine" -optional = false -python-versions = ">=3.8,<3.13" -files = [ - {file = "qdrant_client-1.6.9-py3-none-any.whl", hash = "sha256:6546f96ceec389375e323586f0948a04183bd494c5c48d0f3daa267b358ad008"}, - {file = "qdrant_client-1.6.9.tar.gz", hash = "sha256:81affd66f50aa66d60835fe2f55efe727358bf9db24eada35ff1b32794a82159"}, -] - -[package.dependencies] -grpcio = ">=1.41.0" -grpcio-tools = ">=1.41.0" -httpx = {version = ">=0.14.0", extras = ["http2"]} -numpy = {version = ">=1.21", markers = "python_version >= \"3.8\" and python_version < \"3.12\""} -portalocker = ">=2.7.0,<3.0.0" -pydantic = ">=1.10.8" -urllib3 = ">=1.26.14,<2.0.0" - -[package.extras] -fastembed = ["fastembed (==0.1.1)"] - [[package]] name = "rapidfuzz" version = "3.5.2" @@ -3446,31 +3252,31 @@ full = ["numpy"] [[package]] name = "ray" -version = "2.8.0" +version = "2.8.1" description = "Ray provides a simple, universal API for building distributed applications." optional = false python-versions = "*" files = [ - {file = "ray-2.8.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:34e0676a0dfa277efa688bccd83ecb7a799bc03078e5b1f1aa747fe9263175a8"}, - {file = "ray-2.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:72c696c1b784c55f0ad107d55bb58ecef5d368176765cf44fed87e714538d708"}, - {file = "ray-2.8.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:44dc3179d90f5c70954ac4a34760bab472efe2854add4905e6d5809e4d37d1f8"}, - {file = "ray-2.8.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:d3005c7c308624aaf191be8cdcc9056cd88921fe9aa2d84d7d579c193f87d2af"}, - {file = "ray-2.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:21189b49b7c74c2f98f0ecbd5cd01ef664fb05bd71784a9538680d2f26213b32"}, - {file = "ray-2.8.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:490768aeb9bfe137ea4e3605ef0f0dbe6e77fff78c8a65bafc89b784fb2839a4"}, - {file = "ray-2.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:370a2e2d9e49eab588a6bf26e20e5859a8a0cfcf0e4633bad7f2a0231a7431cf"}, - {file = "ray-2.8.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:c1ba046faf4f3bb7d58d99923ec042a82d86b243227642e864349d5ad5639a1e"}, - {file = "ray-2.8.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:bd9b4ed49cb89a6715e6ba4ec8bdebef7664b64fd05fb48fd0a913832784b746"}, - {file = "ray-2.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:60fd55aa5c11550bbbe7fd97cf51ec33e6b8cde7ee136e0182bd4298a1732421"}, - {file = "ray-2.8.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:19311606bc1eccbf07a4f420f2a9eb6548c463506868df1e1e81bb568add3c14"}, - {file = "ray-2.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1ed34be0ec7a290d5ceae651c3e49c7e42b46c0f5e755afca28b15df385f774d"}, - {file = "ray-2.8.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:df504921c4bea3588d45ac9aef13d974d6e1a23b107a89a60fa1e2f6005e0e08"}, - {file = "ray-2.8.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:cca3a73323328bf8d72c72a358efe7199bd5ef0fa8bb9a5b0565727e5fade141"}, - {file = "ray-2.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:300595421c7eecd98aa251fa8a0d6487c902fcde260d8e5dcb0ddd843050773b"}, - {file = "ray-2.8.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:ea544d77e5870c17d61ce0a8a86b1a69a64ee95c2618121c7db15525fcb8a46b"}, - {file = "ray-2.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fef1ad1bdd7b168f5fc667ba671b8e3bcc19cda1b979faa27cd2985cda76402f"}, - {file = "ray-2.8.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9cc6176013909d3cd9facf05d12222c2b7503e862b29738070a552e0eea0b48a"}, - {file = "ray-2.8.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:7058bfd14f8c6458721225f0d30983b41e6142fb9f22d8b46f0b8b1776d99593"}, - {file = "ray-2.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:89280325b01455fad14b67a7061e97a84eb8b7d0774daba3e5101d05d75f5022"}, + {file = "ray-2.8.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:2fe3174013d450dafbd219302112e670a035dac96443e9102e729eb914d9335f"}, + {file = "ray-2.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4e8b43c9e2dbddbddac281cb518138228f2742d829a488490664dad350ea1aff"}, + {file = "ray-2.8.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:b1c1986ce3ed32b7304e1480e2cdfad2af2118a4b5ab561a671b5d83b3353b65"}, + {file = "ray-2.8.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:8dab22b7d0659f1d8f8df7fc62895955c28c2c51ea5cb4c2b89ec0bbe4f1c573"}, + {file = "ray-2.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:b68388647d169e7b059dba5dcff7f704a0a31d46c91205862ceb477c7bf07cf5"}, + {file = "ray-2.8.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:84ce9d30f7c49ad5e4130fc0411b2f21d6148435b027cc8fb1711cb9c6eb7990"}, + {file = "ray-2.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9d20c20c14809dcfc93e441ac72028497ce4554d966ac950df455c2f68079d2c"}, + {file = "ray-2.8.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:8ec10b85058ce2e191ceb312382683e2cc9e81d063feab02527eecdc19220955"}, + {file = "ray-2.8.1-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:05cc635f579067419478f006406e1954268a3efa8409cb5621d5ed4c5426b8c7"}, + {file = "ray-2.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:f66a0ca8e07a851deab82f7592e1c3b7e4d95d27f5870c43e5266e8ca824aac0"}, + {file = "ray-2.8.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:932e7129007ea2152676bbd66b59c2df7c165c36fb669442f29b488b0027de21"}, + {file = "ray-2.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2c7dd115dabcb45a35b91b6c3e2a07bdc322aecd906d38679b487d125787d171"}, + {file = "ray-2.8.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:71d20d90cea033441de565ad8a4b66440435e27c79cc354f0c5ef245fe5dd491"}, + {file = "ray-2.8.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:7fd8e73af2635869b51828b2acff87f45d74a396729443a243804e306b8c8931"}, + {file = "ray-2.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:a256ccbec67f22fe9a2da1b72c9f2057ee2d97414779faf84685288e6008d451"}, + {file = "ray-2.8.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:6d0a4f08794c517fdadf5fc1e5442c6424cb6678e309731ff1d5bcbc7af168fb"}, + {file = "ray-2.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0054c59bd110a9e026a1fcfa1e35ee0909f197245bd20d4303d1cd862ecda870"}, + {file = "ray-2.8.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:67602e38ef01936027c4b298b99a8d839278a301af1892d72c6244b39a3ed01b"}, + {file = "ray-2.8.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fc39b645703470b3084c4ac02cde01decbf8427385cf8ea3ab574d49454872b6"}, + {file = "ray-2.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:cc8ae2d02abe2ef590794deb372b43be71ba8cf449c76724cfc06dc0b34f6b69"}, ] [package.dependencies] @@ -3504,9 +3310,9 @@ watchfiles = {version = "*", optional = true, markers = "extra == \"serve\""} [package.extras] air = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "fastapi", "fsspec", "gpustat (>=1.0.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "numpy (>=1.20)", "opencensus", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "requests", "smart-open", "starlette", "tensorboardX (>=1.9)", "uvicorn[standard]", "virtualenv (>=20.0.24,<20.21.1)", "watchfiles"] -all = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "dm-tree", "fastapi", "fsspec", "gpustat (>=1.0.0)", "grpcio (!=1.56.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "gymnasium (==0.28.1)", "lz4", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml", "ray-cpp (==2.8.0)", "requests", "rich", "scikit-image", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,<20.21.1)", "watchfiles"] +all = ["aiohttp (>=3.7)", "aiohttp-cors", "aiorwlock", "colorful", "dm-tree", "fastapi", "fsspec", "gpustat (>=1.0.0)", "grpcio (!=1.56.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "gymnasium (==0.28.1)", "lz4", "numpy (>=1.20)", "opencensus", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "pandas", "pandas (>=1.3)", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pyarrow (>=6.0.1)", "pydantic (<2)", "pyyaml", "ray-cpp (==2.8.1)", "requests", "rich", "scikit-image", "scipy", "smart-open", "starlette", "tensorboardX (>=1.9)", "typer", "uvicorn[standard]", "virtualenv (>=20.0.24,<20.21.1)", "watchfiles"] client = ["grpcio (!=1.56.0)"] -cpp = ["ray-cpp (==2.8.0)"] +cpp = ["ray-cpp (==2.8.1)"] data = ["fsspec", "numpy (>=1.20)", "pandas (>=1.3)", "pyarrow (>=6.0.1)"] default = ["aiohttp (>=3.7)", "aiohttp-cors", "colorful", "gpustat (>=1.0.0)", "grpcio (>=1.32.0)", "grpcio (>=1.42.0)", "opencensus", "prometheus-client (>=0.7.1)", "py-spy (>=0.2.0)", "pydantic (<2)", "requests", "smart-open", "virtualenv (>=20.0.24,<20.21.1)"] observability = ["opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk"] @@ -3518,13 +3324,13 @@ tune = ["fsspec", "pandas", "pyarrow (>=6.0.1)", "requests", "tensorboardX (>=1. [[package]] name = "referencing" -version = "0.31.0" +version = "0.31.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.31.0-py3-none-any.whl", hash = "sha256:381b11e53dd93babb55696c71cf42aef2d36b8a150c49bf0bc301e36d536c882"}, - {file = "referencing-0.31.0.tar.gz", hash = "sha256:cc28f2c88fbe7b961a7817a0abc034c09a1e36358f82fedb4ffdf29a25398863"}, + {file = "referencing-0.31.1-py3-none-any.whl", hash = "sha256:c19c4d006f1757e3dd75c4f784d38f8698d87b649c54f9ace14e5e8c9667c01d"}, + {file = "referencing-0.31.1.tar.gz", hash = "sha256:81a1471c68c9d5e3831c30ad1dd9815c45b558e596653db751a2bfdd17b3b9ec"}, ] [package.dependencies] @@ -3651,110 +3457,110 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rpds-py" -version = "0.13.1" +version = "0.13.2" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.13.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:83feb0f682d75a09ddc11aa37ba5c07dd9b824b22915207f6176ea458474ff75"}, - {file = "rpds_py-0.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa84bbe22ffa108f91631935c28a623001e335d66e393438258501e618fb0dde"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e04f8c76b8d5c70695b4e8f1d0b391d8ef91df00ef488c6c1ffb910176459bc6"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:032c242a595629aacace44128f9795110513ad27217b091e834edec2fb09e800"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91276caef95556faeb4b8f09fe4439670d3d6206fee78d47ddb6e6de837f0b4d"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d22f2cb82e0b40e427a74a93c9a4231335bbc548aed79955dde0b64ea7f88146"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c9e2794329ef070844ff9bfc012004aeddc0468dc26970953709723f76c8a5"}, - {file = "rpds_py-0.13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c797ea56f36c6f248656f0223b11307fdf4a1886f3555eba371f34152b07677f"}, - {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:82dbcd6463e580bcfb7561cece35046aaabeac5a9ddb775020160b14e6c58a5d"}, - {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:736817dbbbd030a69a1faf5413a319976c9c8ba8cdcfa98c022d3b6b2e01eca6"}, - {file = "rpds_py-0.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1f36a1e80ef4ed1996445698fd91e0d3e54738bf597c9995118b92da537d7a28"}, - {file = "rpds_py-0.13.1-cp310-none-win32.whl", hash = "sha256:4f13d3f6585bd07657a603780e99beda96a36c86acaba841f131e81393958336"}, - {file = "rpds_py-0.13.1-cp310-none-win_amd64.whl", hash = "sha256:545e94c84575057d3d5c62634611858dac859702b1519b6ffc58eca7fb1adfcf"}, - {file = "rpds_py-0.13.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:6bfe72b249264cc1ff2f3629be240d7d2fdc778d9d298087cdec8524c91cd11f"}, - {file = "rpds_py-0.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edc91c50e17f5cd945d821f0f1af830522dba0c10267c3aab186dc3dbaab8def"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2eca04a365be380ca1f8fa48b334462e19e3382c0bb7386444d8ca43aa01c481"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e3ac5b602fea378243f993d8b707189f9061e55ebb4e56cb9fdef8166060f28"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfb5d2ab183c0efe5e7b8917e4eaa2e837aacafad8a69b89aa6bc81550eed857"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d9793d46d3e6522ae58e9321032827c9c0df1e56cbe5d3de965facb311aed6aa"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cd935c0220d012a27c20135c140f9cdcbc6249d5954345c81bfb714071b985c"}, - {file = "rpds_py-0.13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37b08df45f02ff1866043b95096cbe91ac99de05936dd09d6611987a82a3306a"}, - {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad666a904212aa9a6c77da7dce9d5170008cda76b7776e6731928b3f8a0d40fa"}, - {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8a6ad8429340e0a4de89353447c6441329def3632e7b2293a7d6e873217d3c2b"}, - {file = "rpds_py-0.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7c40851b659d958c5245c1236e34f0d065cc53dca8d978b49a032c8e0adfda6e"}, - {file = "rpds_py-0.13.1-cp311-none-win32.whl", hash = "sha256:4145172ab59b6c27695db6d78d040795f635cba732cead19c78cede74800949a"}, - {file = "rpds_py-0.13.1-cp311-none-win_amd64.whl", hash = "sha256:46a07a258bda12270de02b34c4884f200f864bba3dcd6e3a37fef36a168b859d"}, - {file = "rpds_py-0.13.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:ba4432301ad7eeb1b00848cf46fae0e5fecfd18a8cb5fdcf856c67985f79ecc7"}, - {file = "rpds_py-0.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d22e0660de24bd8e9ac82f4230a22a5fe4e397265709289d61d5fb333839ba50"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76a8374b294e4ccb39ccaf11d39a0537ed107534139c00b4393ca3b542cc66e5"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7d152ec7bb431040af2500e01436c9aa0d993f243346f0594a15755016bf0be1"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74a2044b870df7c9360bb3ce7e12f9ddf8e72e49cd3a353a1528cbf166ad2383"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:960e7e460fda2d0af18c75585bbe0c99f90b8f09963844618a621b804f8c3abe"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37f79f4f1f06cc96151f4a187528c3fd4a7e1065538a4af9eb68c642365957f7"}, - {file = "rpds_py-0.13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd4ea56c9542ad0091dfdef3e8572ae7a746e1e91eb56c9e08b8d0808b40f1d1"}, - {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0290712eb5603a725769b5d857f7cf15cf6ca93dda3128065bbafe6fdb709beb"}, - {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0b70c1f800059c92479dc94dda41288fd6607f741f9b1b8f89a21a86428f6383"}, - {file = "rpds_py-0.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3dd5fb7737224e1497c886fb3ca681c15d9c00c76171f53b3c3cc8d16ccfa7fb"}, - {file = "rpds_py-0.13.1-cp312-none-win32.whl", hash = "sha256:74be3b215a5695690a0f1a9f68b1d1c93f8caad52e23242fcb8ba56aaf060281"}, - {file = "rpds_py-0.13.1-cp312-none-win_amd64.whl", hash = "sha256:f47eef55297799956464efc00c74ae55c48a7b68236856d56183fe1ddf866205"}, - {file = "rpds_py-0.13.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:e4a45ba34f904062c63049a760790c6a2fa7a4cc4bd160d8af243b12371aaa05"}, - {file = "rpds_py-0.13.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:20147996376be452cd82cd6c17701daba69a849dc143270fa10fe067bb34562a"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b9535aa22ab023704cfc6533e968f7e420affe802d85e956d8a7b4c0b0b5ea"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d4fa1eeb9bea6d9b64ac91ec51ee94cc4fc744955df5be393e1c923c920db2b0"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b2415d5a7b7ee96aa3a54d4775c1fec140476a17ee12353806297e900eaeddc"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:577d40a72550eac1386b77b43836151cb61ff6700adacda2ad4d883ca5a0b6f2"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af2d1648eb625a460eee07d3e1ea3a4a6e84a1fb3a107f6a8e95ac19f7dcce67"}, - {file = "rpds_py-0.13.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5b769396eb358d6b55dbf78f3f7ca631ca1b2fe02136faad5af74f0111b4b6b7"}, - {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:249c8e0055ca597707d71c5ad85fd2a1c8fdb99386a8c6c257e1b47b67a9bec1"}, - {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:fe30ef31172bdcf946502a945faad110e8fff88c32c4bec9a593df0280e64d8a"}, - {file = "rpds_py-0.13.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2647192facf63be9ed2d7a49ceb07efe01dc6cfb083bd2cc53c418437400cb99"}, - {file = "rpds_py-0.13.1-cp38-none-win32.whl", hash = "sha256:4011d5c854aa804c833331d38a2b6f6f2fe58a90c9f615afdb7aa7cf9d31f721"}, - {file = "rpds_py-0.13.1-cp38-none-win_amd64.whl", hash = "sha256:7cfae77da92a20f56cf89739a557b76e5c6edc094f6ad5c090b9e15fbbfcd1a4"}, - {file = "rpds_py-0.13.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:e9be1f7c5f9673616f875299339984da9447a40e3aea927750c843d6e5e2e029"}, - {file = "rpds_py-0.13.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:839676475ac2ccd1532d36af3d10d290a2ca149b702ed464131e450a767550df"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a90031658805c63fe488f8e9e7a88b260ea121ba3ee9cdabcece9c9ddb50da39"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ba9fbc5d6e36bfeb5292530321cc56c4ef3f98048647fabd8f57543c34174ec"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:08832078767545c5ee12561ce980714e1e4c6619b5b1e9a10248de60cddfa1fd"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19f5aa7f5078d35ed8e344bcba40f35bc95f9176dddb33fc4f2084e04289fa63"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80080972e1d000ad0341c7cc58b6855c80bd887675f92871221451d13a975072"}, - {file = "rpds_py-0.13.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ee352691c4434eb1c01802e9daa5edcc1007ff15023a320e2693fed6a661b"}, - {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d20da6b4c7aa9ee75ad0730beaba15d65157f5beeaca54a038bb968f92bf3ce3"}, - {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:faa12a9f34671a30ea6bb027f04ec4e1fb8fa3fb3ed030893e729d4d0f3a9791"}, - {file = "rpds_py-0.13.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7cf241dbb50ea71c2e628ab2a32b5bfcd36e199152fc44e5c1edb0b773f1583e"}, - {file = "rpds_py-0.13.1-cp39-none-win32.whl", hash = "sha256:dab979662da1c9fbb464e310c0b06cb5f1d174d09a462553af78f0bfb3e01920"}, - {file = "rpds_py-0.13.1-cp39-none-win_amd64.whl", hash = "sha256:a2b3c79586636f1fa69a7bd59c87c15fca80c0d34b5c003d57f2f326e5276575"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5967fa631d0ed9f8511dede08bc943a9727c949d05d1efac4ac82b2938024fb7"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8308a8d49d1354278d5c068c888a58d7158a419b2e4d87c7839ed3641498790c"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0580faeb9def6d0beb7aa666294d5604e569c4e24111ada423cf9936768d95c"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2da81c1492291c1a90987d76a47c7b2d310661bf7c93a9de0511e27b796a8b46"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c9a1dc5e898ce30e2f9c0aa57181cddd4532b22b7780549441d6429d22d3b58"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4ae6f423cb7d1c6256b7482025ace2825728f53b7ac58bcd574de6ee9d242c2"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc3179e0815827cf963e634095ae5715ee73a5af61defbc8d6ca79f1bdae1d1d"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0d9f8930092558fd15c9e07198625efb698f7cc00b3dc311c83eeec2540226a8"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d1d388d2f5f5a6065cf83c54dd12112b7389095669ff395e632003ae8999c6b8"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:08b335fb0c45f0a9e2478a9ece6a1bfb00b6f4c4780f9be3cf36479c5d8dd374"}, - {file = "rpds_py-0.13.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d11afdc5992bbd7af60ed5eb519873690d921425299f51d80aa3099ed49f2bcc"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:8c1f6c8df23be165eb0cb78f305483d00c6827a191e3a38394c658d5b9c80bbd"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:528e2afaa56d815d2601b857644aeb395afe7e59212ab0659906dc29ae68d9a6"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df2af1180b8eeececf4f819d22cc0668bfadadfd038b19a90bd2fb2ee419ec6f"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:88956c993a20201744282362e3fd30962a9d86dc4f1dcf2bdb31fab27821b61f"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee70ee5f4144a45a9e6169000b5b525d82673d5dab9f7587eccc92794814e7ac"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5fd099acaee2325f01281a130a39da08d885e4dedf01b84bf156ec2737d78fe"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9656a09653b18b80764647d585750df2dff8928e03a706763ab40ec8c4872acc"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ba239bb37663b2b4cd08e703e79e13321512dccd8e5f0e9451d9e53a6b8509a"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3f55ae773abd96b1de25fc5c3fb356f491bd19116f8f854ba705beffc1ddc3c5"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:f4b15a163448ec79241fb2f1bc5a8ae1a4a304f7a48d948d208a2935b26bf8a5"}, - {file = "rpds_py-0.13.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1a3b2583c86bbfbf417304eeb13400ce7f8725376dc7d3efbf35dc5d7052ad48"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f1059ca9a51c936c9a8d46fbc2c9a6b4c15ab3f13a97f1ad32f024b39666ba85"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f55601fb58f92e4f4f1d05d80c24cb77505dc42103ddfd63ddfdc51d3da46fa2"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcfd5f91b882eedf8d9601bd21261d6ce0e61a8c66a7152d1f5df08d3f643ab1"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6574f619e8734140d96c59bfa8a6a6e7a3336820ccd1bfd95ffa610673b650a2"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4b9d3f5c48bbe8d9e3758e498b3c34863f2c9b1ac57a4e6310183740e59c980"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdd6f8738e1f1d9df5b1603bb03cb30e442710e5672262b95d0f9fcb4edb0dab"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8c2bf286e5d755a075e5e97ba56b3de08cccdad6b323ab0b21cc98875176b03"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d4b390ee70ca9263b331ccfaf9819ee20e90dfd0201a295e23eb64a005dbef"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:db8d0f0ad92f74feb61c4e4a71f1d573ef37c22ef4dc19cab93e501bfdad8cbd"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2abd669a39be69cdfe145927c7eb53a875b157740bf1e2d49e9619fc6f43362e"}, - {file = "rpds_py-0.13.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2c173f529666bab8e3f948b74c6d91afa22ea147e6ebae49a48229d9020a47c4"}, - {file = "rpds_py-0.13.1.tar.gz", hash = "sha256:264f3a5906c62b9df3a00ad35f6da1987d321a053895bd85f9d5c708de5c0fbf"}, + {file = "rpds_py-0.13.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d"}, + {file = "rpds_py-0.13.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266"}, + {file = "rpds_py-0.13.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d"}, + {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f"}, + {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea"}, + {file = "rpds_py-0.13.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1"}, + {file = "rpds_py-0.13.2-cp310-none-win32.whl", hash = "sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc"}, + {file = "rpds_py-0.13.2-cp310-none-win_amd64.whl", hash = "sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd"}, + {file = "rpds_py-0.13.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad"}, + {file = "rpds_py-0.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0"}, + {file = "rpds_py-0.13.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c"}, + {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8"}, + {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e"}, + {file = "rpds_py-0.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d"}, + {file = "rpds_py-0.13.2-cp311-none-win32.whl", hash = "sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7"}, + {file = "rpds_py-0.13.2-cp311-none-win_amd64.whl", hash = "sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211"}, + {file = "rpds_py-0.13.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381"}, + {file = "rpds_py-0.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2"}, + {file = "rpds_py-0.13.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee"}, + {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2"}, + {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7"}, + {file = "rpds_py-0.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60"}, + {file = "rpds_py-0.13.2-cp312-none-win32.whl", hash = "sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d"}, + {file = "rpds_py-0.13.2-cp312-none-win_amd64.whl", hash = "sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27"}, + {file = "rpds_py-0.13.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1"}, + {file = "rpds_py-0.13.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca"}, + {file = "rpds_py-0.13.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083"}, + {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a"}, + {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66"}, + {file = "rpds_py-0.13.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b"}, + {file = "rpds_py-0.13.2-cp38-none-win32.whl", hash = "sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab"}, + {file = "rpds_py-0.13.2-cp38-none-win_amd64.whl", hash = "sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1"}, + {file = "rpds_py-0.13.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c"}, + {file = "rpds_py-0.13.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0"}, + {file = "rpds_py-0.13.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53"}, + {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b"}, + {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0"}, + {file = "rpds_py-0.13.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468"}, + {file = "rpds_py-0.13.2-cp39-none-win32.whl", hash = "sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c"}, + {file = "rpds_py-0.13.2-cp39-none-win_amd64.whl", hash = "sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21"}, + {file = "rpds_py-0.13.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007"}, + {file = "rpds_py-0.13.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9"}, + {file = "rpds_py-0.13.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31"}, + {file = "rpds_py-0.13.2.tar.gz", hash = "sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f"}, ] [[package]] @@ -3773,135 +3579,135 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.1.6" +version = "0.1.7" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.6-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:88b8cdf6abf98130991cbc9f6438f35f6e8d41a02622cc5ee130a02a0ed28703"}, - {file = "ruff-0.1.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c549ed437680b6105a1299d2cd30e4964211606eeb48a0ff7a93ef70b902248"}, - {file = "ruff-0.1.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cf5f701062e294f2167e66d11b092bba7af6a057668ed618a9253e1e90cfd76"}, - {file = "ruff-0.1.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:05991ee20d4ac4bb78385360c684e4b417edd971030ab12a4fbd075ff535050e"}, - {file = "ruff-0.1.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87455a0c1f739b3c069e2f4c43b66479a54dea0276dd5d4d67b091265f6fd1dc"}, - {file = "ruff-0.1.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:683aa5bdda5a48cb8266fcde8eea2a6af4e5700a392c56ea5fb5f0d4bfdc0240"}, - {file = "ruff-0.1.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:137852105586dcbf80c1717facb6781555c4e99f520c9c827bd414fac67ddfb6"}, - {file = "ruff-0.1.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd98138a98d48a1c36c394fd6b84cd943ac92a08278aa8ac8c0fdefcf7138f35"}, - {file = "ruff-0.1.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0cd909d25f227ac5c36d4e7e681577275fb74ba3b11d288aff7ec47e3ae745"}, - {file = "ruff-0.1.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8fd1c62a47aa88a02707b5dd20c5ff20d035d634aa74826b42a1da77861b5ff"}, - {file = "ruff-0.1.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fd89b45d374935829134a082617954120d7a1470a9f0ec0e7f3ead983edc48cc"}, - {file = "ruff-0.1.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:491262006e92f825b145cd1e52948073c56560243b55fb3b4ecb142f6f0e9543"}, - {file = "ruff-0.1.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ea284789861b8b5ca9d5443591a92a397ac183d4351882ab52f6296b4fdd5462"}, - {file = "ruff-0.1.6-py3-none-win32.whl", hash = "sha256:1610e14750826dfc207ccbcdd7331b6bd285607d4181df9c1c6ae26646d6848a"}, - {file = "ruff-0.1.6-py3-none-win_amd64.whl", hash = "sha256:4558b3e178145491e9bc3b2ee3c4b42f19d19384eaa5c59d10acf6e8f8b57e33"}, - {file = "ruff-0.1.6-py3-none-win_arm64.whl", hash = "sha256:03910e81df0d8db0e30050725a5802441c2022ea3ae4fe0609b76081731accbc"}, - {file = "ruff-0.1.6.tar.gz", hash = "sha256:1b09f29b16c6ead5ea6b097ef2764b42372aebe363722f1605ecbcd2b9207184"}, + {file = "ruff-0.1.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7f80496854fdc65b6659c271d2c26e90d4d401e6a4a31908e7e334fab4645aac"}, + {file = "ruff-0.1.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:1ea109bdb23c2a4413f397ebd8ac32cb498bee234d4191ae1a310af760e5d287"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0c2de9dd9daf5e07624c24add25c3a490dbf74b0e9bca4145c632457b3b42a"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:69a4bed13bc1d5dabf3902522b5a2aadfebe28226c6269694283c3b0cecb45fd"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de02ca331f2143195a712983a57137c5ec0f10acc4aa81f7c1f86519e52b92a1"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45b38c3f8788a65e6a2cab02e0f7adfa88872696839d9882c13b7e2f35d64c5f"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c64cb67b2025b1ac6d58e5ffca8f7b3f7fd921f35e78198411237e4f0db8e73"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dcc6bb2f4df59cb5b4b40ff14be7d57012179d69c6565c1da0d1f013d29951b"}, + {file = "ruff-0.1.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2bb4bb6bbe921f6b4f5b6fdd8d8468c940731cb9406f274ae8c5ed7a78c478"}, + {file = "ruff-0.1.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:276a89bcb149b3d8c1b11d91aa81898fe698900ed553a08129b38d9d6570e717"}, + {file = "ruff-0.1.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:90c958fe950735041f1c80d21b42184f1072cc3975d05e736e8d66fc377119ea"}, + {file = "ruff-0.1.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6b05e3b123f93bb4146a761b7a7d57af8cb7384ccb2502d29d736eaade0db519"}, + {file = "ruff-0.1.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:290ecab680dce94affebefe0bbca2322a6277e83d4f29234627e0f8f6b4fa9ce"}, + {file = "ruff-0.1.7-py3-none-win32.whl", hash = "sha256:416dfd0bd45d1a2baa3b1b07b1b9758e7d993c256d3e51dc6e03a5e7901c7d80"}, + {file = "ruff-0.1.7-py3-none-win_amd64.whl", hash = "sha256:4af95fd1d3b001fc41325064336db36e3d27d2004cdb6d21fd617d45a172dd96"}, + {file = "ruff-0.1.7-py3-none-win_arm64.whl", hash = "sha256:0683b7bfbb95e6df3c7c04fe9d78f631f8e8ba4868dfc932d43d690698057e2e"}, + {file = "ruff-0.1.7.tar.gz", hash = "sha256:dffd699d07abf54833e5f6cc50b85a6ff043715da8788c4a79bcd4ab4734d306"}, ] [[package]] name = "safetensors" -version = "0.4.0" +version = "0.4.1" description = "" optional = false python-versions = ">=3.7" files = [ - {file = "safetensors-0.4.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2289ae6dbe6d027ecee016b28ced13a2e21a0b3a3a757a23033a2d1c0b1bad55"}, - {file = "safetensors-0.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bf6458959f310f551cbbeef2255527ade5f783f952738e73e4d0136198cc3bfe"}, - {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6b60a58a8f7cc7aed3b5b73dce1f5259a53c83d9ba43a76a874e6ad868c1b4d"}, - {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:491b3477e4d0d4599bb75d79da4b75af2e6ed9b1f6ec2b715991f0bc927bf09a"}, - {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d2e10b7e0cd18bb73ed7c17c624a5957b003b81345e18159591771c26ee428"}, - {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f667a4c12fb593f5f66ce966cb1b14a7148898b2b1a7f79e0761040ae1e3c51"}, - {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f9909512bcb6f712bdd04c296cdfb0d8ff73d258ffc5af884bb62ea02d221e0"}, - {file = "safetensors-0.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d33d29e846821f0e4f92614022949b09ccf063cb36fe2f9fe099cde1efbfbb87"}, - {file = "safetensors-0.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4d512525a8e05a045ce6698066ba0c5378c174a83e0b3720a8c7799dc1bb06f3"}, - {file = "safetensors-0.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0219cea445177f6ad1f9acd3a8d025440c8ff436d70a4a7c7ba9c36066aa9474"}, - {file = "safetensors-0.4.0-cp310-none-win32.whl", hash = "sha256:67ab171eeaad6972d3971c53d29d53353c67f6743284c6d637b59fa3e54c8a94"}, - {file = "safetensors-0.4.0-cp310-none-win_amd64.whl", hash = "sha256:7ffc736039f08a9ca1f09816a7481b8e4469c06e8f8a5ffa8cb67ddd79e6d77f"}, - {file = "safetensors-0.4.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:4fe9e3737b30de458225a23926219ca30b902ee779b6a3df96eaab2b6d625ec2"}, - {file = "safetensors-0.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7916e814a90008de767b1c164a1d83803693c661ffe9af5a697b22e2752edb0"}, - {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbc4a4da01143472323c145f3c289e5f6fabde0ac0a3414dabf912a21692fff4"}, - {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a54c21654a47669b38e359e8f852af754b786c9da884bb61ad5e9af12bd71ccb"}, - {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25cd407955bad5340ba17f9f8ac789a0d751601a311e2f7b2733f9384478c95e"}, - {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82e8fc4e3503cd738fd40718a430fe0e5ce6e7ff91a73d6ce628bbb89c41e8ce"}, - {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48b92059b1a4ad163024d4f526e0e73ebe2bb3ae70537e15e347820b4de5dc27"}, - {file = "safetensors-0.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5daa05058f7dce85b5f9f60c4eab483ed7859d63978f08a76e52e78859ff20ca"}, - {file = "safetensors-0.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a86565a5c112dd855909e20144947b4f53abb78c4de207f36ca71ee63ba5b90d"}, - {file = "safetensors-0.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38032078ed9fea52d06584e441bccc73fb475c4581600c6d6166de2fe2deb3d1"}, - {file = "safetensors-0.4.0-cp311-none-win32.whl", hash = "sha256:2f99d90c91b7c76b40a862acd9085bc77f7974a27dee7cfcebe46149af5a99a1"}, - {file = "safetensors-0.4.0-cp311-none-win_amd64.whl", hash = "sha256:74e2a448ffe19be188b457b130168190ee73b5a75e45ba96796320c1f5ae35d2"}, - {file = "safetensors-0.4.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:1e2f9c69b41d03b4826ffb96b29e07444bb6b34a78a7bafd0b88d59e8ec75b8a"}, - {file = "safetensors-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3910fb5bf747413b59f1a34e6d2a993b589fa7d919709518823c70efaaa350bd"}, - {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8fdca709b2470a35a59b1e6dffea75cbe1214b22612b5dd4c93947697aea8b"}, - {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f27b8ef814c5fb43456caeb7f3cbb889b76115180aad1f42402839c14a47c5b"}, - {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b2d6101eccc43c7be0cb052f13ceda64288b3d8b344b988ed08d7133cbce2f3"}, - {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdc34027b545a69be3d4220c140b276129523e4e46db06ad1a0b60d6a4cf9214"}, - {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db7bb48ca9e90bb9526c71b388d38d8de160c0354f4c5126df23e8701a870dcb"}, - {file = "safetensors-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a78ffc0795d3595cd9e4d453502e35f764276c49e434b25556a15a337db4dafc"}, - {file = "safetensors-0.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8e735b0f79090f6855b55e205e820b7b595502ffca0009a5c13eef3661ce465b"}, - {file = "safetensors-0.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f8d2416734e850d5392afffbcb2b8985ea29fb171f1cb197e2ae51b8e35d6438"}, - {file = "safetensors-0.4.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:e853e189ba7d47eaf561094586692ba2bbdd258c096f1755805cac098de0e6ab"}, - {file = "safetensors-0.4.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:4b2aa57b5a4d576f3d1dd6e56980026340f156f8a13c13016bfac4e25295b53f"}, - {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b6c1316ffde6cb4bf22c7445bc9fd224b4d1b9dd7320695f5611c89e802e4b6"}, - {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:003077ec85261d00061058fa12e3c1d2055366b02ce8f2938929359ffbaff2b8"}, - {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd63d83a92f1437a8b0431779320376030ae43ace980bea5686d515de0784100"}, - {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2077801800b4b13301d8d6290c7fb5bd60737320001717153ebc4371776643b5"}, - {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7abe0e157a49a75aeeccfbc4f3dac38d8f98512d3cdb35c200f8e628dc5773cf"}, - {file = "safetensors-0.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bfed574f6b1e7e7fe1f17213278875ef6c6e8b1582ab6eda93947db1178cae6"}, - {file = "safetensors-0.4.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:964ef166a286ce3b023d0d0bd0e21d440a1c8028981c8abdb136bc7872ba9b3d"}, - {file = "safetensors-0.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:44f84373e42183bd56a13a1f2d8acb1db7fedaeffbd83e79cec861477eee1af4"}, - {file = "safetensors-0.4.0-cp37-none-win32.whl", hash = "sha256:c68132727dd86fb641102e494d445f705efe402f4d5e24b278183a15499ab400"}, - {file = "safetensors-0.4.0-cp37-none-win_amd64.whl", hash = "sha256:1db87155454c168aef118d5657a403aee48a4cb08d8851a981157f07351ea317"}, - {file = "safetensors-0.4.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:9e583fa68e5a07cc859c4e13c1ebff12029904aa2e27185cf04a1f57fe9a81c4"}, - {file = "safetensors-0.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73e7696dcf3f72f99545eb1abe6106ad65ff1f62381d6ce4b34be3272552897a"}, - {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4936096a57c62e84e200f92620a536be067fc5effe46ecc7f230ebb496ecd579"}, - {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87b328ee1591adac332543e1f5fc2c2d7f149b745ebb0d58d7850818ff9cee27"}, - {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b69554c143336256260eceff1d3c0969172a641b54d4668489a711b05f92a2c0"}, - {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ebf6bcece5d5d1bd6416472f94604d2c834ca752ac60ed42dba7157e595a990"}, - {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6686ce01b8602d55a7d9903c90d4a6e6f90aeb6ddced7cf4605892d0ba94bcb8"}, - {file = "safetensors-0.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b8fd6cc2f3bda444a048b541c843c7b7fefc89c4120d7898ea7d5b026e93891"}, - {file = "safetensors-0.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6abfe67692f81b8bdb99c837f28351c17e624ebf136970c850ee989c720446"}, - {file = "safetensors-0.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:27a24ca8822c469ee452db4c13418ba983315a0d863c018a9af15f2305eac38c"}, - {file = "safetensors-0.4.0-cp38-none-win32.whl", hash = "sha256:c4a0a47c8640167792d8261ee21b26430bbc39130a7edaad7f4c0bc05669d00e"}, - {file = "safetensors-0.4.0-cp38-none-win_amd64.whl", hash = "sha256:a738970a367f39249e2abb900d9441a8a86d7ff50083e5eaa6e7760a9f216014"}, - {file = "safetensors-0.4.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:806379f37e1abd5d302288c4b2f4186dd7ea7143d4c7811f90a8077f0ae8967b"}, - {file = "safetensors-0.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b9b94133ed2ae9dda0e95dcace7b7556eba023ffa4c4ae6df8f99377f571d6a"}, - {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b563a14c43614815a6b524d2e4edeaace50b717f7e7487bb227dd5b68350f5a"}, - {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00a9b157be660fb7ba88fa2eedd05ec93793a5b61e43e783e10cb0b995372802"}, - {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8f194f45ab6aa767993c24f0aeb950af169dbc5d611b94c9021a1d13b8a1a34"}, - {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:469360b9451db10bfed3881378d5a71b347ecb1ab4f42367d77b8164a13af70b"}, - {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5f75fa97ccf32a3c7af476c6a0e851023197d3c078f6de3612008fff94735f9"}, - {file = "safetensors-0.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:acf0180283c2efae72f1d8c0a4a7974662091df01be3aa43b5237b1e52ed0a01"}, - {file = "safetensors-0.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cd02b495ba0814619f40bda46771bb06dbbf1d42524b66fa03b2a736c77e4515"}, - {file = "safetensors-0.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c42bdea183dbaa99e2f0e6120dc524df79cf4289a6f90f30a534444ef20f49fa"}, - {file = "safetensors-0.4.0-cp39-none-win32.whl", hash = "sha256:cef7bb5d9feae7146c3c3c7b3aef7d2c8b39ba7f5ff4252d368eb69462a47076"}, - {file = "safetensors-0.4.0-cp39-none-win_amd64.whl", hash = "sha256:79dd46fb1f19282fd12f544471efb97823ede927cedbf9cf35550d92b349fdd2"}, - {file = "safetensors-0.4.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:002301c1afa32909f83745b0c124d002e7ae07e15671f3b43cbebd0ffc5e6037"}, - {file = "safetensors-0.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:67762d36ae088c73d4a3c96bfc4ea8d31233554f35b6cace3a18533238d462ea"}, - {file = "safetensors-0.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f45230f20a206e5e4c7f7bbf9342178410c6f8b0af889843aa99045a76f7691"}, - {file = "safetensors-0.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f2ca939bbd8fb2f4dfa28e39a146dad03bc9325e9fc831b68f7b98f69a5a2f1"}, - {file = "safetensors-0.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:61a00f281391fae5ce91df70918bb61c12d2d514a493fd8056e12114be729911"}, - {file = "safetensors-0.4.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:435fd136a42492b280cb55126f9ce9535b35dd49df2c5d572a5945455a439448"}, - {file = "safetensors-0.4.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f0daa788273d683258fb1e4a5e16bef4486b2fca536451a2591bc0f4a6488895"}, - {file = "safetensors-0.4.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0620ab0d41e390ccb1c4ea8f63dc00cb5f0b96a5cdd3cd0d64c21765720c074a"}, - {file = "safetensors-0.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1fa8d067733cb67f22926689ee808f08afacf7700d2ffb44efae90a0693eb1"}, - {file = "safetensors-0.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaa40bc363edda145db75cd030f3b1822e5478d550c3500a42502ecef32c959"}, - {file = "safetensors-0.4.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b561fbc044db7beff2ece0ec219a291809d45a38d30c6b38e7cc46482582f4ba"}, - {file = "safetensors-0.4.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:79a983b09782dacf9a1adb19bb98f4a8f6c3144108939f572c047b5797e43cf5"}, - {file = "safetensors-0.4.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:10b65cd3ad79f5d0daf281523b4146bc271a34bb7430d4e03212e0de8622dab8"}, - {file = "safetensors-0.4.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:114decacc475a6a9e2f9102a00c171d113ddb5d35cb0bda0db2c0c82b2eaa9ce"}, - {file = "safetensors-0.4.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:72ddb741dd5fe42521db76a70e012f76995516a12e7e0ef26be03ea9be77802a"}, - {file = "safetensors-0.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c5556c2ec75f5a6134866eddd7341cb36062e6edaea343478a279591b63ddba"}, - {file = "safetensors-0.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed50f239b0ce7ae85b078395593b4a351ede7e6f73af25f4873e3392336f64c9"}, - {file = "safetensors-0.4.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495dcaea8fbab70b927d2274e2547824462737acbf98ccd851a71124f779a5c6"}, - {file = "safetensors-0.4.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3f4d90c79a65ba2fe2ff0876f6140748f0a3ce6a21e27a35190f4f96321803f8"}, - {file = "safetensors-0.4.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:7a524382b5c55b5fbb168e0e9d3f502450c8cf3fb81b93e880018437c206a482"}, - {file = "safetensors-0.4.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9849ea60c7e840bfdd6030ad454d4a6ba837b3398c902f15a30460dd6961c28c"}, - {file = "safetensors-0.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:6c42623ae7045615d9eaa6877b9df1db4e9cc71ecc14bcc721ea1e475dddd595"}, - {file = "safetensors-0.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80cb8342f00f3c41b3b93b1a599b84723280d3ac90829bc62262efc03ab28793"}, - {file = "safetensors-0.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c4f5ed4ede384dea8c99bae76b0718a828dbf7b2c8ced1f44e3b9b1a124475"}, - {file = "safetensors-0.4.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40d7cf03493bfe75ef62e2c716314474b28d9ba5bf4909763e4b8dd14330c01a"}, - {file = "safetensors-0.4.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:232029f0a9fa6fa1f737324eda98a700409811186888536a2333cbbf64e41741"}, - {file = "safetensors-0.4.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:9ed55f4a20c78ff3e8477efb63c8303c2152cdfb3bfea4d025a80f54d38fd628"}, - {file = "safetensors-0.4.0.tar.gz", hash = "sha256:b985953c3cf11e942eac4317ef3db3da713e274109cf7cfb6076d877054f013e"}, + {file = "safetensors-0.4.1-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:cba01c6b76e01ec453933b3b3c0157c59b52881c83eaa0f7666244e71aa75fd1"}, + {file = "safetensors-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a8f6f679d97ea0135c7935c202feefbd042c149aa70ee759855e890c01c7814"}, + {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc2ce1f5ae5143a7fb72b71fa71db6a42b4f6cf912aa3acdc6b914084778e68"}, + {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d87d993eaefe6611a9c241a8bd364a5f1ffed5771c74840363a6c4ed8d868f6"}, + {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:097e9af2efa8778cd2f0cba451784253e62fa7cc9fc73c0744d27212f7294e25"}, + {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d10a9f7bae608ccfdc009351f01dc3d8535ff57f9488a58a4c38e45bf954fe93"}, + {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:270b99885ec14abfd56c1d7f28ada81740a9220b4bae960c3de1c6fe84af9e4d"}, + {file = "safetensors-0.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:285b52a481e7ba93e29ad4ec5841ef2c4479ef0a6c633c4e2629e0508453577b"}, + {file = "safetensors-0.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c3c9f0ca510e0de95abd6424789dcbc879942a3a4e29b0dfa99d9427bf1da75c"}, + {file = "safetensors-0.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:88b4653059c903015284a9722f9a46838c654257173b279c8f6f46dbe80b612d"}, + {file = "safetensors-0.4.1-cp310-none-win32.whl", hash = "sha256:2fe6926110e3d425c4b684a4379b7796fdc26ad7d16922ea1696c8e6ea7e920f"}, + {file = "safetensors-0.4.1-cp310-none-win_amd64.whl", hash = "sha256:a79e16222106b2f5edbca1b8185661477d8971b659a3c814cc6f15181a9b34c8"}, + {file = "safetensors-0.4.1-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:d93321eea0dd7e81b283e47a1d20dee6069165cc158286316d0d06d340de8fe8"}, + {file = "safetensors-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ff8e41c8037db17de0ea2a23bc684f43eaf623be7d34906fe1ac10985b8365e"}, + {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39d36f1d88468a87c437a1bc27c502e71b6ca44c385a9117a9f9ba03a75cc9c6"}, + {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ef010e9afcb4057fb6be3d0a0cfa07aac04fe97ef73fe4a23138d8522ba7c17"}, + {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b287304f2b2220d51ccb51fd857761e78bcffbeabe7b0238f8dc36f2edfd9542"}, + {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e09000b2599e1836314430f81a3884c66a5cbabdff5d9f175b5d560d4de38d78"}, + {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9c80ce0001efa16066358d2dd77993adc25f5a6c61850e4ad096a2232930bce"}, + {file = "safetensors-0.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:413e1f6ac248f7d1b755199a06635e70c3515493d3b41ba46063dec33aa2ebb7"}, + {file = "safetensors-0.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3ac139377cfe71ba04573f1cda66e663b7c3e95be850e9e6c2dd4b5984bd513"}, + {file = "safetensors-0.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:04157d008385bea66d12fe90844a80d4a76dc25ec5230b5bd9a630496d1b7c03"}, + {file = "safetensors-0.4.1-cp311-none-win32.whl", hash = "sha256:5f25297148ec665f0deb8bd67e9564634d8d6841041ab5393ccfe203379ea88b"}, + {file = "safetensors-0.4.1-cp311-none-win_amd64.whl", hash = "sha256:b2f8877990a72ff595507b80f4b69036a9a1986a641f8681adf3425d97d3d2a5"}, + {file = "safetensors-0.4.1-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:eb2c1da1cc39509d1a55620a5f4d14f8911c47a89c926a96e6f4876e864375a3"}, + {file = "safetensors-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:303d2c0415cf15a28f8d7f17379ea3c34c2b466119118a34edd9965983a1a8a6"}, + {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb4cb3e37a9b961ddd68e873b29fe9ab4a081e3703412e34aedd2b7a8e9cafd9"}, + {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae5497adc68669db2fed7cb2dad81e6a6106e79c9a132da3efdb6af1db1014fa"}, + {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b30abd0cddfe959d1daedf92edcd1b445521ebf7ddefc20860ed01486b33c90"}, + {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d784a98c492c751f228a4a894c3b8a092ff08b24e73b5568938c28b8c0e8f8df"}, + {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57a5ab08b0ec7a7caf30d2ac79bb30c89168431aca4f8854464bb9461686925"}, + {file = "safetensors-0.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:edcf3121890b5f0616aa5a54683b1a5d2332037b970e507d6bb7841a3a596556"}, + {file = "safetensors-0.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fdb58dee173ef33634c3016c459d671ca12d11e6acf9db008261cbe58107e579"}, + {file = "safetensors-0.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:780dc21eb3fd32ddd0e8c904bdb0290f2454f4ac21ae71e94f9ce72db1900a5a"}, + {file = "safetensors-0.4.1-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:48901bd540f8a3c1791314bc5c8a170927bf7f6acddb75bf0a263d081a3637d4"}, + {file = "safetensors-0.4.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3b0b7b2d5976fbed8a05e2bbdce5816a59e6902e9e7c7e07dc723637ed539787"}, + {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f69903ff49cb30b9227fb5d029bea276ea20d04b06803877a420c5b1b74c689"}, + {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0ddd050e01f3e843aa8c1c27bf68675b8a08e385d0045487af4d70418c3cb356"}, + {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a82bc2bd7a9a0e08239bdd6d7774d64121f136add93dfa344a2f1a6d7ef35fa"}, + {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ace9e66a40f98a216ad661245782483cf79cf56eb2b112650bb904b0baa9db5"}, + {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82cbb8f4d022f2e94498cbefca900698b8ded3d4f85212f47da614001ff06652"}, + {file = "safetensors-0.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:791edc10a3c359a2f5f52d5cddab0df8a45107d91027d86c3d44e57162e5d934"}, + {file = "safetensors-0.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:83c2cfbe8c6304f0891e7bb378d56f66d2148972eeb5f747cd8a2246886f0d8c"}, + {file = "safetensors-0.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:04dd14f53f5500eb4c4149674216ba1000670efbcf4b1b5c2643eb244e7882ea"}, + {file = "safetensors-0.4.1-cp37-none-win32.whl", hash = "sha256:d5b3defa74f3723a388bfde2f5d488742bc4879682bd93267c09a3bcdf8f869b"}, + {file = "safetensors-0.4.1-cp37-none-win_amd64.whl", hash = "sha256:25a043cbb59d4f75e9dd87fdf5c009dd8830105a2c57ace49b72167dd9808111"}, + {file = "safetensors-0.4.1-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:3f6a520af7f2717c5ecba112041f2c8af1ca6480b97bf957aba81ed9642e654c"}, + {file = "safetensors-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3807ac3b16288dffebb3474b555b56fe466baa677dfc16290dcd02dca1ab228"}, + {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b58ba13a9e82b4bc3fc221914f6ef237fe6c2adb13cede3ace64d1aacf49610"}, + {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dac4bb42f8679aadc59bd91a4c5a1784a758ad49d0912995945cd674089f628e"}, + {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911b48dc09e321a194def3a7431662ff4f03646832f3a8915bbf0f449b8a5fcb"}, + {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82571d20288c975c1b30b08deb9b1c3550f36b31191e1e81fae87669a92217d0"}, + {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da52ee0dc8ba03348ffceab767bd8230842fdf78f8a996e2a16445747143a778"}, + {file = "safetensors-0.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2536b11ce665834201072e9397404170f93f3be10cca9995b909f023a04501ee"}, + {file = "safetensors-0.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:998fbac99ca956c3a09fe07cc0b35fac26a521fa8865a690686d889f0ff4e4a6"}, + {file = "safetensors-0.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:845be0aafabf2a60c2d482d4e93023fecffe5e5443d801d7a7741bae9de41233"}, + {file = "safetensors-0.4.1-cp38-none-win32.whl", hash = "sha256:ce7a28bc8af685a69d7e869d09d3e180a275e3281e29cf5f1c7319e231932cc7"}, + {file = "safetensors-0.4.1-cp38-none-win_amd64.whl", hash = "sha256:e056fb9e22d118cc546107f97dc28b449d88274207dd28872bd668c86216e4f6"}, + {file = "safetensors-0.4.1-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:bdc0d039e44a727824639824090bd8869535f729878fa248addd3dc01db30eae"}, + {file = "safetensors-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c1b1d510c7aba71504ece87bf393ea82638df56303e371e5e2cf09d18977dd7"}, + {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd0afd95c1e497f520e680ea01e0397c0868a3a3030e128438cf6e9e3fcd671"}, + {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f603bdd8deac6726d39f41688ed353c532dd53935234405d79e9eb53f152fbfb"}, + {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8a85e3e47e0d4eebfaf9a58b40aa94f977a56050cb5598ad5396a9ee7c087c6"}, + {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0ccb5aa0f3be2727117e5631200fbb3a5b3a2b3757545a92647d6dd8be6658f"}, + {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d784938534e255473155e4d9f276ee69eb85455b6af1292172c731409bf9adee"}, + {file = "safetensors-0.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a257de175c254d39ccd6a21341cd62eb7373b05c1e618a78096a56a857e0c316"}, + {file = "safetensors-0.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6fd80f7794554091836d4d613d33a7d006e2b8d6ba014d06f97cebdfda744f64"}, + {file = "safetensors-0.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:35803201d980efcf964b75a0a2aee97fe5e9ecc5f3ad676b38fafdfe98e0620d"}, + {file = "safetensors-0.4.1-cp39-none-win32.whl", hash = "sha256:7ff8a36e0396776d3ed9a106fc9a9d7c55d4439ca9a056a24bf66d343041d3e6"}, + {file = "safetensors-0.4.1-cp39-none-win_amd64.whl", hash = "sha256:bfa2e20342b81921b98edba52f8deb68843fa9c95250739a56b52ceda5ea5c61"}, + {file = "safetensors-0.4.1-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ae2d5a31cfb8a973a318f7c4d2cffe0bd1fe753cdf7bb41a1939d45a0a06f964"}, + {file = "safetensors-0.4.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a45dbf03e8334d3a5dc93687d98b6dc422f5d04c7d519dac09b84a3c87dd7c6"}, + {file = "safetensors-0.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297b359d91126c0f9d4fd17bae3cfa2fe3a048a6971b8db07db746ad92f850c"}, + {file = "safetensors-0.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bda3d98e2bcece388232cfc551ebf063b55bdb98f65ab54df397da30efc7dcc5"}, + {file = "safetensors-0.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8934bdfd202ebd0697040a3dff40dd77bc4c5bbf3527ede0532f5e7fb4d970f"}, + {file = "safetensors-0.4.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:42c3710cec7e5c764c7999697516370bee39067de0aa089b7e2cfb97ac8c6b20"}, + {file = "safetensors-0.4.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:53134226053e56bd56e73f7db42596e7908ed79f3c9a1016e4c1dade593ac8e5"}, + {file = "safetensors-0.4.1-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:257d59e40a1b367cb544122e7451243d65b33c3f34d822a347f4eea6fdf97fdf"}, + {file = "safetensors-0.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d54c2f1826e790d1eb2d2512bfd0ee443f0206b423d6f27095057c7f18a0687"}, + {file = "safetensors-0.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:645b3f1138fce6e818e79d4128afa28f0657430764cc045419c1d069ff93f732"}, + {file = "safetensors-0.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e9a7ffb1e551c6df51d267f5a751f042b183df22690f6feceac8d27364fd51d7"}, + {file = "safetensors-0.4.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:44e230fbbe120de564b64f63ef3a8e6ff02840fa02849d9c443d56252a1646d4"}, + {file = "safetensors-0.4.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:9d16b3b2fcc6fca012c74bd01b5619c655194d3e3c13e4d4d0e446eefa39a463"}, + {file = "safetensors-0.4.1-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:5d95ea4d8b32233910734a904123bdd3979c137c461b905a5ed32511defc075f"}, + {file = "safetensors-0.4.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:dab431699b5d45e0ca043bc580651ce9583dda594e62e245b7497adb32e99809"}, + {file = "safetensors-0.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16d8bbb7344e39cb9d4762e85c21df94ebeb03edac923dd94bb9ed8c10eac070"}, + {file = "safetensors-0.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1faf5111c66a6ba91f85dff2e36edaaf36e6966172703159daeef330de4ddc7b"}, + {file = "safetensors-0.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:660ca1d8bff6c7bc7c6b30b9b32df74ef3ab668f5df42cefd7588f0d40feadcb"}, + {file = "safetensors-0.4.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ae2f67f04ed0bb2e56fd380a8bd3eef03f609df53f88b6f5c7e89c08e52aae00"}, + {file = "safetensors-0.4.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c8ed5d2c04cdc1afc6b3c28d59580448ac07732c50d94c15e14670f9c473a2ce"}, + {file = "safetensors-0.4.1-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:2b6a2814278b6660261aa9a9aae524616de9f1ec364e3716d219b6ed8f91801f"}, + {file = "safetensors-0.4.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3cfd1ca35eacc635f0eaa894e5c5ed83ffebd0f95cac298fd430014fa7323631"}, + {file = "safetensors-0.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4177b456c6b0c722d82429127b5beebdaf07149d265748e97e0a34ff0b3694c8"}, + {file = "safetensors-0.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313e8472197bde54e3ec54a62df184c414582979da8f3916981b6a7954910a1b"}, + {file = "safetensors-0.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fdb4adb76e21bad318210310590de61c9f4adcef77ee49b4a234f9dc48867869"}, + {file = "safetensors-0.4.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1d568628e9c43ca15eb96c217da73737c9ccb07520fafd8a1eba3f2750614105"}, + {file = "safetensors-0.4.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:573b6023a55a2f28085fc0a84e196c779b6cbef4d9e73acea14c8094fee7686f"}, + {file = "safetensors-0.4.1.tar.gz", hash = "sha256:2304658e6ada81a5223225b4efe84748e760c46079bffedf7e321763cafb36c9"}, ] [package.extras] @@ -4413,22 +4219,22 @@ url = "https://download.pytorch.org/whl/cu118/torchvision-0.15.2%2Bcu118-cp310-c [[package]] name = "tornado" -version = "6.3.3" +version = "6.4" 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.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, - {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, - {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, - {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, ] [[package]] @@ -4453,18 +4259,18 @@ telegram = ["requests"] [[package]] name = "traitlets" -version = "5.13.0" +version = "5.14.0" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, - {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, + {file = "traitlets-5.14.0-py3-none-any.whl", hash = "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33"}, + {file = "traitlets-5.14.0.tar.gz", hash = "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "transformers" @@ -4595,19 +4401,19 @@ files = [ [[package]] name = "urllib3" -version = "1.26.18" +version = "2.1.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, ] [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "uvicorn" @@ -4932,101 +4738,101 @@ torch = "2.0.1" [[package]] name = "yarl" -version = "1.9.3" +version = "1.9.4" description = "Yet another URL library" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32435d134414e01d937cd9d6cc56e8413a8d4741dea36af5840c7750f04d16ab"}, - {file = "yarl-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9a5211de242754b5e612557bca701f39f8b1a9408dff73c6db623f22d20f470e"}, - {file = "yarl-1.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:525cd69eff44833b01f8ef39aa33a9cc53a99ff7f9d76a6ef6a9fb758f54d0ff"}, - {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc94441bcf9cb8c59f51f23193316afefbf3ff858460cb47b5758bf66a14d130"}, - {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e36021db54b8a0475805acc1d6c4bca5d9f52c3825ad29ae2d398a9d530ddb88"}, - {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0f17d1df951336a02afc8270c03c0c6e60d1f9996fcbd43a4ce6be81de0bd9d"}, - {file = "yarl-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5f3faeb8100a43adf3e7925d556801d14b5816a0ac9e75e22948e787feec642"}, - {file = "yarl-1.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aed37db837ecb5962469fad448aaae0f0ee94ffce2062cf2eb9aed13328b5196"}, - {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:721ee3fc292f0d069a04016ef2c3a25595d48c5b8ddc6029be46f6158d129c92"}, - {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b8bc5b87a65a4e64bc83385c05145ea901b613d0d3a434d434b55511b6ab0067"}, - {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:dd952b9c64f3b21aedd09b8fe958e4931864dba69926d8a90c90d36ac4e28c9a"}, - {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:c405d482c320a88ab53dcbd98d6d6f32ada074f2d965d6e9bf2d823158fa97de"}, - {file = "yarl-1.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9df9a0d4c5624790a0dea2e02e3b1b3c69aed14bcb8650e19606d9df3719e87d"}, - {file = "yarl-1.9.3-cp310-cp310-win32.whl", hash = "sha256:d34c4f80956227f2686ddea5b3585e109c2733e2d4ef12eb1b8b4e84f09a2ab6"}, - {file = "yarl-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:cf7a4e8de7f1092829caef66fd90eaf3710bc5efd322a816d5677b7664893c93"}, - {file = "yarl-1.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d61a0ca95503867d4d627517bcfdc28a8468c3f1b0b06c626f30dd759d3999fd"}, - {file = "yarl-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73cc83f918b69110813a7d95024266072d987b903a623ecae673d1e71579d566"}, - {file = "yarl-1.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d81657b23e0edb84b37167e98aefb04ae16cbc5352770057893bd222cdc6e45f"}, - {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a1a8443091c7fbc17b84a0d9f38de34b8423b459fb853e6c8cdfab0eacf613"}, - {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe34befb8c765b8ce562f0200afda3578f8abb159c76de3ab354c80b72244c41"}, - {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c757f64afe53a422e45e3e399e1e3cf82b7a2f244796ce80d8ca53e16a49b9f"}, - {file = "yarl-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72a57b41a0920b9a220125081c1e191b88a4cdec13bf9d0649e382a822705c65"}, - {file = "yarl-1.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632c7aeb99df718765adf58eacb9acb9cbc555e075da849c1378ef4d18bf536a"}, - {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b0b8c06afcf2bac5a50b37f64efbde978b7f9dc88842ce9729c020dc71fae4ce"}, - {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1d93461e2cf76c4796355494f15ffcb50a3c198cc2d601ad8d6a96219a10c363"}, - {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4003f380dac50328c85e85416aca6985536812c082387255c35292cb4b41707e"}, - {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4d6d74a97e898c1c2df80339aa423234ad9ea2052f66366cef1e80448798c13d"}, - {file = "yarl-1.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b61e64b06c3640feab73fa4ff9cb64bd8182de52e5dc13038e01cfe674ebc321"}, - {file = "yarl-1.9.3-cp311-cp311-win32.whl", hash = "sha256:29beac86f33d6c7ab1d79bd0213aa7aed2d2f555386856bb3056d5fdd9dab279"}, - {file = "yarl-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:f7271d6bd8838c49ba8ae647fc06469137e1c161a7ef97d778b72904d9b68696"}, - {file = "yarl-1.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:dd318e6b75ca80bff0b22b302f83a8ee41c62b8ac662ddb49f67ec97e799885d"}, - {file = "yarl-1.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4b1efb11a8acd13246ffb0bee888dd0e8eb057f8bf30112e3e21e421eb82d4a"}, - {file = "yarl-1.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c6f034386e5550b5dc8ded90b5e2ff7db21f0f5c7de37b6efc5dac046eb19c10"}, - {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd49a908cb6d387fc26acee8b7d9fcc9bbf8e1aca890c0b2fdfd706057546080"}, - {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa4643635f26052401750bd54db911b6342eb1a9ac3e74f0f8b58a25d61dfe41"}, - {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e741bd48e6a417bdfbae02e088f60018286d6c141639359fb8df017a3b69415a"}, - {file = "yarl-1.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c86d0d0919952d05df880a1889a4f0aeb6868e98961c090e335671dea5c0361"}, - {file = "yarl-1.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3d5434b34100b504aabae75f0622ebb85defffe7b64ad8f52b8b30ec6ef6e4b9"}, - {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79e1df60f7c2b148722fb6cafebffe1acd95fd8b5fd77795f56247edaf326752"}, - {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:44e91a669c43f03964f672c5a234ae0d7a4d49c9b85d1baa93dec28afa28ffbd"}, - {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3cfa4dbe17b2e6fca1414e9c3bcc216f6930cb18ea7646e7d0d52792ac196808"}, - {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:88d2c3cc4b2f46d1ba73d81c51ec0e486f59cc51165ea4f789677f91a303a9a7"}, - {file = "yarl-1.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cccdc02e46d2bd7cb5f38f8cc3d9db0d24951abd082b2f242c9e9f59c0ab2af3"}, - {file = "yarl-1.9.3-cp312-cp312-win32.whl", hash = "sha256:96758e56dceb8a70f8a5cff1e452daaeff07d1cc9f11e9b0c951330f0a2396a7"}, - {file = "yarl-1.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:c4472fe53ebf541113e533971bd8c32728debc4c6d8cc177f2bff31d011ec17e"}, - {file = "yarl-1.9.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:126638ab961633f0940a06e1c9d59919003ef212a15869708dcb7305f91a6732"}, - {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c99ddaddb2fbe04953b84d1651149a0d85214780e4d0ee824e610ab549d98d92"}, - {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dab30b21bd6fb17c3f4684868c7e6a9e8468078db00f599fb1c14e324b10fca"}, - {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:828235a2a169160ee73a2fcfb8a000709edf09d7511fccf203465c3d5acc59e4"}, - {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc391e3941045fd0987c77484b2799adffd08e4b6735c4ee5f054366a2e1551d"}, - {file = "yarl-1.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51382c72dd5377861b573bd55dcf680df54cea84147c8648b15ac507fbef984d"}, - {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:28a108cb92ce6cf867690a962372996ca332d8cda0210c5ad487fe996e76b8bb"}, - {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8f18a7832ff85dfcd77871fe677b169b1bc60c021978c90c3bb14f727596e0ae"}, - {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:7eaf13af79950142ab2bbb8362f8d8d935be9aaf8df1df89c86c3231e4ff238a"}, - {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:66a6dbf6ca7d2db03cc61cafe1ee6be838ce0fbc97781881a22a58a7c5efef42"}, - {file = "yarl-1.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1a0a4f3aaa18580038cfa52a7183c8ffbbe7d727fe581300817efc1e96d1b0e9"}, - {file = "yarl-1.9.3-cp37-cp37m-win32.whl", hash = "sha256:946db4511b2d815979d733ac6a961f47e20a29c297be0d55b6d4b77ee4b298f6"}, - {file = "yarl-1.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:2dad8166d41ebd1f76ce107cf6a31e39801aee3844a54a90af23278b072f1ccf"}, - {file = "yarl-1.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bb72d2a94481e7dc7a0c522673db288f31849800d6ce2435317376a345728225"}, - {file = "yarl-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9a172c3d5447b7da1680a1a2d6ecdf6f87a319d21d52729f45ec938a7006d5d8"}, - {file = "yarl-1.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2dc72e891672343b99db6d497024bf8b985537ad6c393359dc5227ef653b2f17"}, - {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8d51817cf4b8d545963ec65ff06c1b92e5765aa98831678d0e2240b6e9fd281"}, - {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53ec65f7eee8655bebb1f6f1607760d123c3c115a324b443df4f916383482a67"}, - {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cfd77e8e5cafba3fb584e0f4b935a59216f352b73d4987be3af51f43a862c403"}, - {file = "yarl-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e73db54c967eb75037c178a54445c5a4e7461b5203b27c45ef656a81787c0c1b"}, - {file = "yarl-1.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09c19e5f4404574fcfb736efecf75844ffe8610606f3fccc35a1515b8b6712c4"}, - {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6280353940f7e5e2efaaabd686193e61351e966cc02f401761c4d87f48c89ea4"}, - {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c25ec06e4241e162f5d1f57c370f4078797ade95c9208bd0c60f484834f09c96"}, - {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7217234b10c64b52cc39a8d82550342ae2e45be34f5bff02b890b8c452eb48d7"}, - {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4ce77d289f8d40905c054b63f29851ecbfd026ef4ba5c371a158cfe6f623663e"}, - {file = "yarl-1.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5f74b015c99a5eac5ae589de27a1201418a5d9d460e89ccb3366015c6153e60a"}, - {file = "yarl-1.9.3-cp38-cp38-win32.whl", hash = "sha256:8a2538806be846ea25e90c28786136932ec385c7ff3bc1148e45125984783dc6"}, - {file = "yarl-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:6465d36381af057d0fab4e0f24ef0e80ba61f03fe43e6eeccbe0056e74aadc70"}, - {file = "yarl-1.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2f3c8822bc8fb4a347a192dd6a28a25d7f0ea3262e826d7d4ef9cc99cd06d07e"}, - {file = "yarl-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7831566595fe88ba17ea80e4b61c0eb599f84c85acaa14bf04dd90319a45b90"}, - {file = "yarl-1.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ff34cb09a332832d1cf38acd0f604c068665192c6107a439a92abfd8acf90fe2"}, - {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe8080b4f25dfc44a86bedd14bc4f9d469dfc6456e6f3c5d9077e81a5fedfba7"}, - {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8535e111a064f3bdd94c0ed443105934d6f005adad68dd13ce50a488a0ad1bf3"}, - {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d155a092bf0ebf4a9f6f3b7a650dc5d9a5bbb585ef83a52ed36ba46f55cc39d"}, - {file = "yarl-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:778df71c8d0c8c9f1b378624b26431ca80041660d7be7c3f724b2c7a6e65d0d6"}, - {file = "yarl-1.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f9cafaf031c34d95c1528c16b2fa07b710e6056b3c4e2e34e9317072da5d1a"}, - {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ca6b66f69e30f6e180d52f14d91ac854b8119553b524e0e28d5291a724f0f423"}, - {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0e7e83f31e23c5d00ff618045ddc5e916f9e613d33c5a5823bc0b0a0feb522f"}, - {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:af52725c7c39b0ee655befbbab5b9a1b209e01bb39128dce0db226a10014aacc"}, - {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0ab5baaea8450f4a3e241ef17e3d129b2143e38a685036b075976b9c415ea3eb"}, - {file = "yarl-1.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d350388ba1129bc867c6af1cd17da2b197dff0d2801036d2d7d83c2d771a682"}, - {file = "yarl-1.9.3-cp39-cp39-win32.whl", hash = "sha256:e2a16ef5fa2382af83bef4a18c1b3bcb4284c4732906aa69422cf09df9c59f1f"}, - {file = "yarl-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:d92d897cb4b4bf915fbeb5e604c7911021a8456f0964f3b8ebbe7f9188b9eabb"}, - {file = "yarl-1.9.3-py3-none-any.whl", hash = "sha256:271d63396460b6607b588555ea27a1a02b717ca2e3f2cf53bdde4013d7790929"}, - {file = "yarl-1.9.3.tar.gz", hash = "sha256:4a14907b597ec55740f63e52d7fee0e9ee09d5b9d57a4f399a7423268e457b57"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -5057,4 +4863,4 @@ websockets = "*" [metadata] lock-version = "2.0" python-versions = "~3.10" -content-hash = "72b0755ddbb50bb339a211464922dda089d2ca7acafe073f0b1d3a7a95a1c036" +content-hash = "7a480efd3d21ade7d71015f98585d1ee3c6db5b735a6d3faa31ec171f5249fd7" From 9261aa55ca6460b9149aeb6e482962960f7e6a83 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 7 Dec 2023 14:09:52 +0000 Subject: [PATCH 10/37] Add check constraints to columns --- aana/configs/pipeline.py | 9 ++------- aana/models/db/caption.py | 23 ++++++++++++++++++----- aana/models/db/transcript.py | 15 +++++++++++---- aana/tests/db/datastore/test_utils.py | 4 ++-- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index fc15c4d9..e69a6c6d 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -506,13 +506,13 @@ "function": "aana.utils.db.save_transcripts_batch", "batched": True, "flatten_by": "video_batch.videos.[*]", + "model_name": "whisper_medium", "inputs": [ { "name": "media_ids", "key": "media_ids", "path": "video_batch.videos.[*].id", }, - {"name": "model_name", "key": "model_name", "path": "model_name"}, { "name": "video_transcriptions_info_whisper_medium", "key": "transcription_info", @@ -543,18 +543,13 @@ "function": "aana.utils.db.save_captions_batch", "batched": True, "flatten_by": "video_batch.videos.[*]", + "model_name": "hf_blip2_opt_2_7b", "inputs": [ { "name": "media_ids", "key": "media_ids", "path": "video_batch.videos.[*].id", }, - {"name": "model_name", "key": "model_name", "path": "model_name"}, - { - "name": "timestamps", - "key": "timestamps", - "path": "video_batch.videos.[*].timestamp", - }, { "name": "duration", "key": "duration", diff --git a/aana/models/db/caption.py b/aana/models/db/caption.py index 8dd7a6f1..e5b6c0d6 100644 --- a/aana/models/db/caption.py +++ b/aana/models/db/caption.py @@ -1,6 +1,6 @@ from __future__ import annotations # Let classes use themselves in type annotations -from sqlalchemy import Column, Float, ForeignKey, Integer, String +from sqlalchemy import CheckConstraint, Column, Float, ForeignKey, Integer, String from sqlalchemy.orm import relationship from aana.configs.db import IdSqlType, id_type @@ -14,13 +14,26 @@ class CaptionEntity(BaseModel, TimeStampEntity): __tablename__ = "captions" id = Column(IdSqlType, primary_key=True) # noqa: A003 - model = Column(String, comment="Name of model used to generate the caption") + model = Column( + String, nullable=False, comment="Name of model used to generate the caption" + ) media_id = Column( - IdSqlType, ForeignKey("media.id"), comment="Foreign key to media table" + IdSqlType, + ForeignKey("media.id"), + nullable=False, + comment="Foreign key to media table", + ) + frame_id = Column( + Integer, + CheckConstraint("frame_id >= 0"), + comment="The 0-based frame id of media for caption", ) - frame_id = Column(Integer, comment="The 0-based frame id of media for caption") caption = Column(String, comment="Frame caption") - timestamp = Column(Float, comment="Frame timestamp in seconds") + timestamp = Column( + Float, + CheckConstraint("timestamp >= 0"), + comment="Frame timestamp in seconds", + ) media = relationship("MediaEntity", back_populates="captions") diff --git a/aana/models/db/transcript.py b/aana/models/db/transcript.py index 9ff10728..8a92c1e3 100644 --- a/aana/models/db/transcript.py +++ b/aana/models/db/transcript.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -from sqlalchemy import Column, Float, ForeignKey, String +from sqlalchemy import CheckConstraint, Column, Float, ForeignKey, String from sqlalchemy.orm import relationship from aana.configs.db import IdSqlType, id_type @@ -22,9 +22,14 @@ class TranscriptEntity(BaseModel, TimeStampEntity): __tablename__ = "transcripts" id = Column(IdSqlType, primary_key=True) # noqa: A003 - model = Column(String, comment="Name of model used to generate transcript") + model = Column( + String, nullable=False, comment="Name of model used to generate transcript" + ) media_id = Column( - IdSqlType, ForeignKey("media.id"), comment="Foreign key to media table" + IdSqlType, + ForeignKey("media.id"), + nullable=False, + comment="Foreign key to media table", ) transcript = Column(String, comment="Full text transcript of media") segments = Column(String, comment="Segments of the transcript") @@ -32,7 +37,9 @@ class TranscriptEntity(BaseModel, TimeStampEntity): String, comment="Language of the transcript as predicted by model" ) language_confidence = Column( - Float, comment="Confidence score of language prediction" + Float, + CheckConstraint("0 <= language_confidence <= 1"), + comment="Confidence score of language prediction", ) media = relationship("MediaEntity", back_populates="transcripts") diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index d6c0f4ad..bff833e8 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -44,7 +44,7 @@ def test_save_media(mock_session): def test_save_transcripts(mock_session): """Tests save transcripts function.""" - media_ids = [0] * 3 + media_ids = ["0"] * 3 models = ["test_model"] * 3 texts = ("A transcript", "Another transcript", "A third transcript") infos = [("en", 0.5), ("de", 0.36), ("fr", 0.99)] @@ -69,7 +69,7 @@ def test_save_transcripts(mock_session): def test_save_captions(mock_session): """Tests save captions function.""" - media_ids = [0] * 3 + media_ids = ["0"] * 3 models = ["test_model"] * 3 captions = ["A caption", "Another caption", "A third caption"] captions_list = CaptionsList( From 7f5c9e82343d3cc42ba56a043cf240b2066d88e0 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 7 Dec 2023 14:43:29 +0000 Subject: [PATCH 11/37] Replace old alembic init --- ...44_initialize.py => 1ab9c6aabdd8_initialize.py} | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) rename aana/alembic/versions/{d63d3838d344_initialize.py => 1ab9c6aabdd8_initialize.py} (86%) diff --git a/aana/alembic/versions/d63d3838d344_initialize.py b/aana/alembic/versions/1ab9c6aabdd8_initialize.py similarity index 86% rename from aana/alembic/versions/d63d3838d344_initialize.py rename to aana/alembic/versions/1ab9c6aabdd8_initialize.py index 70124597..f18d741a 100644 --- a/aana/alembic/versions/d63d3838d344_initialize.py +++ b/aana/alembic/versions/1ab9c6aabdd8_initialize.py @@ -1,8 +1,8 @@ """Initialize. -Revision ID: d63d3838d344 +Revision ID: 1ab9c6aabdd8 Revises: -Create Date: 2023-12-07 11:58:35.095546 +Create Date: 2023-12-07 14:42:52.006011 """ from collections.abc import Sequence @@ -11,7 +11,7 @@ from alembic import op # revision identifiers, used by Alembic. -revision: str = 'd63d3838d344' +revision: str = '1ab9c6aabdd8' down_revision: str | None = None branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None @@ -32,8 +32,8 @@ def upgrade() -> None: ) op.create_table('captions', sa.Column('id', sa.String(), nullable=False), - sa.Column('model', sa.String(), nullable=True, comment='Name of model used to generate the caption'), - sa.Column('media_id', sa.String(), nullable=True, comment='Foreign key to media table'), + sa.Column('model', sa.String(), nullable=False, comment='Name of model used to generate the caption'), + sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), sa.Column('frame_id', sa.Integer(), nullable=True, comment='The 0-based frame id of media for caption'), sa.Column('caption', sa.String(), nullable=True, comment='Frame caption'), sa.Column('timestamp', sa.Float(), nullable=True, comment='Frame timestamp in seconds'), @@ -44,8 +44,8 @@ def upgrade() -> None: ) op.create_table('transcripts', sa.Column('id', sa.String(), nullable=False), - sa.Column('model', sa.String(), nullable=True, comment='Name of model used to generate transcript'), - sa.Column('media_id', sa.String(), nullable=True, comment='Foreign key to media table'), + sa.Column('model', sa.String(), nullable=False, comment='Name of model used to generate transcript'), + sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), sa.Column('transcript', sa.String(), nullable=True, comment='Full text transcript of media'), sa.Column('segments', sa.String(), nullable=True, comment='Segments of the transcript'), sa.Column('language', sa.String(), nullable=True, comment='Language of the transcript as predicted by model'), From e59b10430b8fae2fc4f4ca736d790c9629ca5858 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 7 Dec 2023 20:04:13 +0000 Subject: [PATCH 12/37] Make TranscriptEntity.segments a JSON column --- aana/alembic/versions/1ab9c6aabdd8_initialize.py | 2 +- aana/models/db/transcript.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aana/alembic/versions/1ab9c6aabdd8_initialize.py b/aana/alembic/versions/1ab9c6aabdd8_initialize.py index f18d741a..288a93c0 100644 --- a/aana/alembic/versions/1ab9c6aabdd8_initialize.py +++ b/aana/alembic/versions/1ab9c6aabdd8_initialize.py @@ -47,7 +47,7 @@ def upgrade() -> None: sa.Column('model', sa.String(), nullable=False, comment='Name of model used to generate transcript'), sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), sa.Column('transcript', sa.String(), nullable=True, comment='Full text transcript of media'), - sa.Column('segments', sa.String(), nullable=True, comment='Segments of the transcript'), + sa.Column('segments', sa.JSON(), nullable=True, comment='Segments of the transcript'), sa.Column('language', sa.String(), nullable=True, comment='Language of the transcript as predicted by model'), sa.Column('language_confidence', sa.Float(), nullable=True, comment='Confidence score of language prediction'), sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), diff --git a/aana/models/db/transcript.py b/aana/models/db/transcript.py index 8a92c1e3..990de4e9 100644 --- a/aana/models/db/transcript.py +++ b/aana/models/db/transcript.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -from sqlalchemy import CheckConstraint, Column, Float, ForeignKey, String +from sqlalchemy import CheckConstraint, Column, Float, ForeignKey, JSON, String from sqlalchemy.orm import relationship from aana.configs.db import IdSqlType, id_type @@ -32,7 +32,7 @@ class TranscriptEntity(BaseModel, TimeStampEntity): comment="Foreign key to media table", ) transcript = Column(String, comment="Full text transcript of media") - segments = Column(String, comment="Segments of the transcript") + segments = Column(JSON, comment="Segments of the transcript") language = Column( String, comment="Language of the transcript as predicted by model" ) From 20c13f58fb689bcf6361677b4c749bd535b3e211 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 7 Dec 2023 21:24:30 +0000 Subject: [PATCH 13/37] Add frame_ids to frame extraction output --- aana/configs/pipeline.py | 9 +++++++-- aana/utils/video.py | 7 ++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index e69a6c6d..b009c34f 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -265,6 +265,11 @@ "key": "frames", "path": "video_batch.videos.[*].frames.[*].image", }, + { + "name": "frame_ids", + "key": "frame_ids", + "path": "video_batch.videos.[*].frames.[*].id", + }, { "name": "timestamps", "key": "timestamps", @@ -561,8 +566,8 @@ "path": "video_batch.videos.[*].frames.[*].caption_hf_blip2_opt_2_7b", }, { - "name": "frame_id", - "key": "frame_id", + "name": "frame_ids", + "key": "frame_ids", "path": "video_batch.videos.[*].frames.[*].id", }, ], diff --git a/aana/utils/video.py b/aana/utils/video.py index b7bbecc3..b4f503c5 100644 --- a/aana/utils/video.py +++ b/aana/utils/video.py @@ -62,7 +62,12 @@ def extract_frames_decord(video: Video, params: VideoParams) -> FramesDict: img = Image(numpy=frame) frames.append(img) - return FramesDict(frames=frames, timestamps=timestamps, duration=duration) + return FramesDict( + frames=frames, + timestamps=timestamps, + duration=duration, + frame_ids=range(len(frames)), + ) def generate_frames_decord( From 30917b976f736909545de004b82210a0a9872dc5 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Thu, 7 Dec 2023 21:25:35 +0000 Subject: [PATCH 14/37] Run alembic migration on app startup --- aana/alembic/env.py | 4 ---- aana/configs/db.py | 29 +++++++++++++++++++++++++++++ aana/main.py | 5 +++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/aana/alembic/env.py b/aana/alembic/env.py index 66547685..b43a27b0 100644 --- a/aana/alembic/env.py +++ b/aana/alembic/env.py @@ -32,10 +32,6 @@ def run_migrations_offline() -> None: """Run migrations in 'offline' mode. - ~~This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available.~~ Modified to use our existing db config module. Calls to context.execute() here emit the given string to the diff --git a/aana/configs/db.py b/aana/configs/db.py index 56771b9c..1b7be7d7 100644 --- a/aana/configs/db.py +++ b/aana/configs/db.py @@ -1,7 +1,10 @@ from enum import Enum from os import PathLike +from pathlib import Path from typing import TypeAlias, TypedDict +from alembic import command +from alembic.config import Config from sqlalchemy import String, create_engine # These are here so we can change types in a single place. @@ -83,3 +86,29 @@ def create_sqlite_engine(config): """ connection_string = f"sqlite:///{config['path']}" return create_engine(connection_string) + + +def get_alembic_config(app_config, ini_file_path, alembic_data_path) -> Config: + """Produces an alembic config to run migrations programmatically.""" + engine = create_database_engine(app_config.db_config) + alembic_config = Config(ini_file_path) + alembic_config.set_main_option('script_location', str(alembic_data_path)) + config_section = alembic_config.get_section(alembic_config.config_ini_section, {}) + config_section["sqlalchemy.url"] = engine.url + + return alembic_config + + +def run_alembic_migrations(settings): + """Runs alembic migrations before starting up.""" + # We need the path to aana/alembic and aana/alembic.ini + # This is a hack until we need something better. + current_path = Path(__file__) + aana_root = current_path.parent.parent # go up two directories + if aana_root.name != "aana": # we are not in the right place + raise RuntimeError("Not in right directory, exiting.") + ini_file_path = aana_root / "alembic.ini" + alembic_data_path = aana_root / "alembic" + + alembic_config = get_alembic_config(settings, ini_file_path, alembic_data_path) + command.upgrade(alembic_config, "head") diff --git a/aana/main.py b/aana/main.py index be8308e2..df70d8d1 100644 --- a/aana/main.py +++ b/aana/main.py @@ -3,6 +3,8 @@ import time import traceback +from aana.configs.db import run_alembic_migrations + DEFAULT_PORT = 8000 DEFAULT_HOST = "0.0.0.0" # noqa: S104 @@ -28,6 +30,9 @@ def run(): from aana.configs.deployments import deployments as all_deployments from aana.configs.endpoints import endpoints as all_endpoints from aana.configs.pipeline import nodes as all_nodes + from aana.configs.settings import settings as aana_settings + + run_alembic_migrations(aana_settings) configuration = get_configuration( args.target, From 730d9c8cf1ab81f5ac5cc9191c62539cd58ac997 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Mon, 11 Dec 2023 09:52:26 +0000 Subject: [PATCH 15/37] Use importlib with pytest to avoid pydantic import errors --- .github/workflows/python-package.yml | 2 +- .vscode/settings.json | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 5c4e0948..e8809a07 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -38,4 +38,4 @@ jobs: sudo apt-get update sudo apt-get install ffmpeg - name: Test with pytest - run: poetry run pytest + run: poetry run pytest --import-mode=importlib diff --git a/.vscode/settings.json b/.vscode/settings.json index a616d794..4ca15346 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,10 +5,12 @@ "editor.formatOnSave": true, }, "python.testing.pytestArgs": [ + "--import-mode=importlib", "aana" ], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, + "python.testing.pytestPath": "poetry run pytest", "ruff.fixAll": true, "ruff.organizeImports": true, } \ No newline at end of file From 8355f05071e7013bb43fda965e5ebaebf6093588 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Mon, 11 Dec 2023 11:59:43 +0000 Subject: [PATCH 16/37] PR feedback: add frame_ids to typeddict --- aana/utils/video.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/aana/utils/video.py b/aana/utils/video.py index b4f503c5..c7b4c2a5 100644 --- a/aana/utils/video.py +++ b/aana/utils/video.py @@ -7,6 +7,7 @@ import yt_dlp from yt_dlp.utils import DownloadError +from aana.configs.db import id_type from aana.configs.settings import settings from aana.exceptions.general import DownloadException, VideoReadingException from aana.models.core.image import Image @@ -17,11 +18,12 @@ class FramesDict(TypedDict): - """Represents a set of frames with timestamps and total duration.""" + """Represents a set of frames with ids, timestamps and total duration.""" frames: list[Image] timestamps: list[float] duration: float + frame_ids: list[id_type] def extract_frames_decord(video: Video, params: VideoParams) -> FramesDict: @@ -32,7 +34,7 @@ def extract_frames_decord(video: Video, params: VideoParams) -> FramesDict: params (VideoParams): the parameters of the video extraction Returns: - FramesDict: a dictionary containing the extracted frames, timestamps, and duration + FramesDict: a dictionary containing the extracted frames, frame_ids, timestamps, and duration """ device = decord.cpu(0) num_threads = 1 # TODO: see if we can use more threads From 797737757cee9c56c11bf398c5633295eb19add1 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Mon, 11 Dec 2023 12:38:52 +0000 Subject: [PATCH 17/37] PR feedback: fix batching for db util functions --- aana/configs/pipeline.py | 13 +++++-------- aana/utils/db.py | 26 +++++++++++++++----------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index b009c34f..ee7add60 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -488,13 +488,11 @@ "name": "save_video_info", "type": "ray_task", "function": "aana.utils.db.save_video_batch", - "batched": True, - "flatten_by": "video_batch.videos.[*]", "inputs": [ { - "name": "videos", - "key": "video_inputs", - "path": "video_batch.videos.[*].video_input", + "name": "video_objects", + "key": "videos", + "path": "video_batch.videos.[*].video", }, ], "outputs": [ @@ -509,7 +507,6 @@ "name": "save_transcripts_medium", "type": "ray_task", "function": "aana.utils.db.save_transcripts_batch", - "batched": True, "flatten_by": "video_batch.videos.[*]", "model_name": "whisper_medium", "inputs": [ @@ -546,8 +543,8 @@ "name": "save_video_captions_hf_blip2_opt_2_7b", "type": "ray_task", "function": "aana.utils.db.save_captions_batch", - "batched": True, - "flatten_by": "video_batch.videos.[*]", + "batched": False, + "flatten_by": "video_batch.videos.[*].frames.[*]", "model_name": "hf_blip2_opt_2_7b", "inputs": [ { diff --git a/aana/utils/db.py b/aana/utils/db.py index 399a53af..48176048 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -5,6 +5,7 @@ from sqlalchemy.orm import Session from aana.configs.db import id_type +from aana.models.core.video import Video from aana.models.db import CaptionEntity, MediaEntity, MediaType, TranscriptEntity from aana.models.pydantic.asr_output import ( AsrSegments, @@ -12,7 +13,7 @@ AsrTranscriptionList, ) from aana.models.pydantic.captions import CaptionsList -from aana.models.pydantic.video_input import VideoInputList +from aana.models.pydantic.video_params import VideoParams from aana.repository.datastore.caption_repo import CaptionRepository from aana.repository.datastore.engine import engine from aana.repository.datastore.media_repo import MediaRepository @@ -21,23 +22,25 @@ # Just using raw utility functions like this isn't a permanent solution, but # it's good enough for now to validate what we're working on. -def save_video_batch(video_inputs: VideoInputList) -> list[id_type]: +def save_video_batch( + video_objects: list[Video], video_params: list[VideoParams] +) -> list[id_type]: """Saves a batch of videos to datastore.""" entities = [] - for video_input in video_inputs: - if video_input.url is not None: - orig_url = video_input.url + for video_object, _ in zip(video_objects, video_params, strict=True): + if video_object.url is not None: + orig_url = video_object.url parsed_url = urlparse(orig_url) orig_filename = Path(parsed_url.path).name - elif video_input.path is not None: - parsed_path = Path(video_input.path) + elif video_object.path is not None: + parsed_path = Path(video_object.path) orig_filename = parsed_path.name orig_url = None else: orig_url = None orig_filename = None entity = MediaEntity( - id=video_input.media_id, + id=video_object.media_id, media_type=MediaType.VIDEO, orig_filename=orig_filename, orig_url=orig_url, @@ -71,13 +74,14 @@ def save_captions_batch( model_name: str, captions: CaptionsList, timestamps: list[float], + frame_ids: list[int], ) -> list[id_type]: """Save captions.""" with Session(engine) as session: entities = [ - CaptionEntity.from_caption_output(model_name, media_id, i, t, c) - for i, (media_id, c, t) in enumerate( - zip(media_ids, captions, timestamps, strict=True) + CaptionEntity.from_caption_output(model_name, media_id, frame_id, t, c) + for media_id, c, t, frame_id in zip( + media_ids, captions, timestamps, frame_ids, strict=True ) ] repo = CaptionRepository(session) From 9e9c0a40c06c8261a5a52ede696c4f6bf7d9aaf5 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Mon, 11 Dec 2023 14:13:28 +0000 Subject: [PATCH 18/37] PR: more fixes to new pipeline nodes --- aana/configs/pipeline.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index ee7add60..b7e2ed46 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -507,7 +507,6 @@ "name": "save_transcripts_medium", "type": "ray_task", "function": "aana.utils.db.save_transcripts_batch", - "flatten_by": "video_batch.videos.[*]", "model_name": "whisper_medium", "inputs": [ { @@ -543,8 +542,6 @@ "name": "save_video_captions_hf_blip2_opt_2_7b", "type": "ray_task", "function": "aana.utils.db.save_captions_batch", - "batched": False, - "flatten_by": "video_batch.videos.[*].frames.[*]", "model_name": "hf_blip2_opt_2_7b", "inputs": [ { @@ -552,16 +549,12 @@ "key": "media_ids", "path": "video_batch.videos.[*].id", }, - { - "name": "duration", - "key": "duration", - "path": "video_batch.videos.[*].duration", - }, { "name": "video_captions_hf_blip2_opt_2_7b", "key": "captions", "path": "video_batch.videos.[*].frames.[*].caption_hf_blip2_opt_2_7b", }, + {"name": "", "key": "", "path": ""}, { "name": "frame_ids", "key": "frame_ids", From e28f38c4f98e3e14a9fe2f37af2899ba98d62d47 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Mon, 11 Dec 2023 14:24:32 +0000 Subject: [PATCH 19/37] PR: try fix again --- aana/configs/pipeline.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index b7e2ed46..5369833c 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -554,7 +554,11 @@ "key": "captions", "path": "video_batch.videos.[*].frames.[*].caption_hf_blip2_opt_2_7b", }, - {"name": "", "key": "", "path": ""}, + { + "name": "timestamps", + "key": "timestamps", + "path": "video_batch.videos.[*].timestamp", + }, { "name": "frame_ids", "key": "frame_ids", From 994624ce4ec10526914d68d0a4912f82f4c82a9b Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Mon, 11 Dec 2023 15:29:50 +0000 Subject: [PATCH 20/37] PR: Fix tests --- aana/tests/db/datastore/test_utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index bff833e8..c7425426 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -76,8 +76,9 @@ def test_save_captions(mock_session): __root__=[Caption(__root__=caption) for caption in captions] ) timestamps = [0.1, 0.2, 0.3] + frame_ids = [0, 1, 2] - ids = save_captions_batch(media_ids, models, captions_list, timestamps) + ids = save_captions_batch(media_ids, models, captions_list, timestamps, frame_ids) assert ( len(ids) @@ -85,6 +86,7 @@ def test_save_captions(mock_session): == len(timestamps) == len(models) == len(media_ids) + == len(frame_ids) ) mock_session.context_var.add_all.assert_called_once() mock_session.context_var.commit.assert_called_once() From af68a852b8a53a5a5ef7a2d2d58254363dd12e83 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Tue, 12 Dec 2023 11:27:05 +0000 Subject: [PATCH 21/37] PR: fixes for batching, dict_output --- aana/configs/endpoints.py | 1 + aana/configs/pipeline.py | 25 +++++++++++------- aana/models/db/caption.py | 3 +++ aana/tests/db/datastore/test_utils.py | 28 ++++++++++---------- aana/utils/db.py | 37 +++++++++++++++++++-------- aana/utils/video.py | 2 +- 6 files changed, 61 insertions(+), 35 deletions(-) diff --git a/aana/configs/endpoints.py b/aana/configs/endpoints.py index d2b5f2f5..44e5413d 100644 --- a/aana/configs/endpoints.py +++ b/aana/configs/endpoints.py @@ -50,6 +50,7 @@ name="captions", output="videos_captions_hf_blip2_opt_2_7b" ), EndpointOutput(name="timestamps", output="timestamps"), + EndpointOutput(name="caption_ids", output="caption_ids"), ], ), ], diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index 5369833c..8a576556 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -488,6 +488,7 @@ "name": "save_video_info", "type": "ray_task", "function": "aana.utils.db.save_video_batch", + "dict_output": True, "inputs": [ { "name": "video_objects", @@ -507,7 +508,10 @@ "name": "save_transcripts_medium", "type": "ray_task", "function": "aana.utils.db.save_transcripts_batch", - "model_name": "whisper_medium", + "kwargs": { + "model_name": "whisper_medium", + }, + "dict_output": True, "inputs": [ { "name": "media_ids", @@ -532,8 +536,8 @@ ], "outputs": [ { - "name": "transcription_id", - "key": "transcription_id", + "name": "transcription_ids", + "key": "transcription_ids", "path": "video_batch.videos.[*].transcription.id", } ], @@ -542,7 +546,10 @@ "name": "save_video_captions_hf_blip2_opt_2_7b", "type": "ray_task", "function": "aana.utils.db.save_captions_batch", - "model_name": "hf_blip2_opt_2_7b", + "kwargs": { + "model_name": "hf_blip2_opt_2_7b", + }, + "dict_output": True, "inputs": [ { "name": "media_ids", @@ -551,24 +558,24 @@ }, { "name": "video_captions_hf_blip2_opt_2_7b", - "key": "captions", + "key": "captions_list", "path": "video_batch.videos.[*].frames.[*].caption_hf_blip2_opt_2_7b", }, { "name": "timestamps", - "key": "timestamps", + "key": "timestamps_list", "path": "video_batch.videos.[*].timestamp", }, { "name": "frame_ids", - "key": "frame_ids", + "key": "frame_ids_list", "path": "video_batch.videos.[*].frames.[*].id", }, ], "outputs": [ { - "name": "caption_id", - "key": "caption_id", + "name": "caption_ids", + "key": "caption_ids", "path": "video_batch.videos.[*].frames.[*].caption_hf_blip2_opt_2_7b.id", } ], diff --git a/aana/models/db/caption.py b/aana/models/db/caption.py index e5b6c0d6..c7fde501 100644 --- a/aana/models/db/caption.py +++ b/aana/models/db/caption.py @@ -1,5 +1,7 @@ from __future__ import annotations # Let classes use themselves in type annotations +import uuid + from sqlalchemy import CheckConstraint, Column, Float, ForeignKey, Integer, String from sqlalchemy.orm import relationship @@ -48,6 +50,7 @@ def from_caption_output( ) -> CaptionEntity: """Converts a Caption pydantic model to a CaptionEntity.""" return CaptionEntity( + id=str(uuid.uuid4()), model=model_name, media_id=media_id, frame_id=frame_id, diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index c7425426..db192cbb 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -69,24 +69,24 @@ def test_save_transcripts(mock_session): def test_save_captions(mock_session): """Tests save captions function.""" - media_ids = ["0"] * 3 - models = ["test_model"] * 3 + media_ids = ["0"] + models = "test_model" captions = ["A caption", "Another caption", "A third caption"] - captions_list = CaptionsList( - __root__=[Caption(__root__=caption) for caption in captions] - ) - timestamps = [0.1, 0.2, 0.3] - frame_ids = [0, 1, 2] + captions_list = [ + CaptionsList(__root__=[Caption(__root__=caption) for caption in captions]) + ] + timestamps = [[0.1, 0.2, 0.3, 0.4]] + frame_ids = [[0, 1, 2]] - ids = save_captions_batch(media_ids, models, captions_list, timestamps, frame_ids) + result = save_captions_batch( + media_ids, models, captions_list, timestamps, frame_ids + ) assert ( - len(ids) - == len(captions_list) - == len(timestamps) - == len(models) - == len(media_ids) - == len(frame_ids) + len(result["caption_id"]) + == len(captions_list[0]) + == len(timestamps[0][:-1]) + == len(frame_ids[0]) ) mock_session.context_var.add_all.assert_called_once() mock_session.context_var.commit.assert_called_once() diff --git a/aana/utils/db.py b/aana/utils/db.py index 48176048..8b7dfffe 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -23,11 +23,11 @@ # Just using raw utility functions like this isn't a permanent solution, but # it's good enough for now to validate what we're working on. def save_video_batch( - video_objects: list[Video], video_params: list[VideoParams] + videos: list[Video], # , video_params: list[VideoParams] ) -> list[id_type]: """Saves a batch of videos to datastore.""" entities = [] - for video_object, _ in zip(video_objects, video_params, strict=True): + for video_object, _ in zip(videos, videos, strict=True): if video_object.url is not None: orig_url = video_object.url parsed_url = urlparse(orig_url) @@ -49,7 +49,9 @@ def save_video_batch( with Session(engine) as session: repo = MediaRepository(session) results = repo.create_multiple(entities) - return [result.id for result in results] # type: ignore + return { + "media_ids": [result.id for result in results] # type: ignore + } def save_media(media_type: MediaType, duration: float) -> id_type: @@ -72,21 +74,32 @@ def save_media(media_type: MediaType, duration: float) -> id_type: def save_captions_batch( media_ids: list[id_type], model_name: str, - captions: CaptionsList, - timestamps: list[float], - frame_ids: list[int], + captions_list: list[CaptionsList], + timestamps_list: list[list[float]], + frame_ids_list: list[list[int]], ) -> list[id_type]: """Save captions.""" + print( + f"{len(media_ids)}\n{len(timestamps_list[0])}\n{len(list(frame_ids_list[0]))}\n{model_name=}\ncaptions: {len(captions_list[0])}" + ) with Session(engine) as session: entities = [ - CaptionEntity.from_caption_output(model_name, media_id, frame_id, t, c) - for media_id, c, t, frame_id in zip( - media_ids, captions, timestamps, frame_ids, strict=True + CaptionEntity.from_caption_output( + model_name, media_id, frame_id, timestamp, caption + ) + for media_id, captions, timestamps, frame_ids in zip( + media_ids, captions_list, timestamps_list, frame_ids_list, strict=True + ) + for caption, timestamp, frame_id in zip( + captions, timestamps[:-1], frame_ids, strict=True ) ] repo = CaptionRepository(session) results = repo.create_multiple(entities) - return [c.id for c in results] # type: ignore + # return [c.id for c in results] + return { + "caption_ids": [c.id for c in results] # type: ignore + } def save_transcripts_batch( @@ -107,4 +120,6 @@ def save_transcripts_batch( repo = TranscriptRepository(session) entities = repo.create_multiple(entities) - return [c.id for c in entities] # type: ignore + return { + "transcript_id": [c.id for c in entities] # type: ignore + } diff --git a/aana/utils/video.py b/aana/utils/video.py index c7b4c2a5..9ad29c0e 100644 --- a/aana/utils/video.py +++ b/aana/utils/video.py @@ -68,7 +68,7 @@ def extract_frames_decord(video: Video, params: VideoParams) -> FramesDict: frames=frames, timestamps=timestamps, duration=duration, - frame_ids=range(len(frames)), + frame_ids=list(range(len(frames))), ) From 5e588698a0a093073415f97c873e76f7224bf43e Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Tue, 12 Dec 2023 19:28:33 +0000 Subject: [PATCH 22/37] Fix transcription stuff --- aana/tests/db/datastore/test_utils.py | 40 ++++++++++++++++----------- aana/utils/db.py | 22 +++++++++++---- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index db192cbb..26415d6a 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -44,25 +44,33 @@ def test_save_media(mock_session): def test_save_transcripts(mock_session): """Tests save transcripts function.""" - media_ids = ["0"] * 3 - models = ["test_model"] * 3 + media_ids = ["0"] + model = "test_model" texts = ("A transcript", "Another transcript", "A third transcript") infos = [("en", 0.5), ("de", 0.36), ("fr", 0.99)] - transcripts = AsrTranscriptionList( - __root__=[AsrTranscription(text=text) for text in texts] - ) - transcription_infos = AsrTranscriptionInfoList( - __root__=[ - AsrTranscriptionInfo(language=lang, language_confidence=conf) - for lang, conf in infos - ] - ) - segments = AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3) - ids = save_transcripts_batch( - media_ids, models, transcription_infos, transcripts, segments + transcripts = [ + AsrTranscriptionList(__root__=[AsrTranscription(text=text) for text in texts]) + ] + transcription_infos = [ + AsrTranscriptionInfoList( + __root__=[ + AsrTranscriptionInfo(language=lang, language_confidence=conf) + for lang, conf in infos + ] + ) + ] + segments = [AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3)] + result = save_transcripts_batch( + model, media_ids, transcription_infos, transcripts, segments ) + result_ids = result["transcript_ids"] - assert len(ids) == len(transcripts) == len(transcription_infos) == len(segments) + assert ( + len(result_ids) + == len(transcripts[0]) + == len(transcription_infos[0]) + == len(segments[0]) + ) mock_session.context_var.add_all.assert_called_once() mock_session.context_var.commit.assert_called_once() @@ -83,7 +91,7 @@ def test_save_captions(mock_session): ) assert ( - len(result["caption_id"]) + len(result["caption_ids"]) == len(captions_list[0]) == len(timestamps[0][:-1]) == len(frame_ids[0]) diff --git a/aana/utils/db.py b/aana/utils/db.py index 8b7dfffe..13606169 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -105,21 +105,31 @@ def save_captions_batch( def save_transcripts_batch( model_name: str, media_ids: list[id_type], - transcript_info: AsrTranscriptionInfoList, - transcripts: AsrTranscriptionList, - segments: AsrSegments, + transcript_info_list: list[AsrTranscriptionInfoList], + transcripts_list: list[AsrTranscriptionList], + segments_list: list[AsrSegments], ) -> list[id_type]: """Save transcripts.""" + print( + f"{len(media_ids)}\n{len(transcript_info_list)}\n{len(transcripts_list)}\n{len(segments_list)}" + ) with Session(engine) as session: entities = [ TranscriptEntity.from_asr_output(model_name, media_id, info, txn, seg) - for media_id, info, txn, seg in zip( - media_ids, transcript_info, transcripts, segments, strict=True + for media_id, transcript_infos, transcripts, segments in zip( + media_ids, + transcript_info_list, + transcripts_list, + segments_list, + strict=True, + ) + for info, txn, seg in zip( + transcript_infos, transcripts, segments, strict=True ) ] repo = TranscriptRepository(session) entities = repo.create_multiple(entities) return { - "transcript_id": [c.id for c in entities] # type: ignore + "transcript_ids": [c.id for c in entities] # type: ignore } From b1eedb0d1cc042e1c16efd7270405ebec626ddf0 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Wed, 13 Dec 2023 10:01:50 +0000 Subject: [PATCH 23/37] Fix bug in blip2 video endpoint definition --- aana/configs/endpoints.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aana/configs/endpoints.py b/aana/configs/endpoints.py index 44e5413d..3d5afdcf 100644 --- a/aana/configs/endpoints.py +++ b/aana/configs/endpoints.py @@ -47,9 +47,9 @@ summary="Generate captions for videos using BLIP2 OPT-2.7B", outputs=[ EndpointOutput( - name="captions", output="videos_captions_hf_blip2_opt_2_7b" + name="captions", output="video_captions_hf_blip2_opt_2_7b" ), - EndpointOutput(name="timestamps", output="timestamps"), + EndpointOutput(name="timestamps", output="video_timestamps"), EndpointOutput(name="caption_ids", output="caption_ids"), ], ), From d6f63067c26f287545d202c9cb6bf66487fb4634 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Wed, 13 Dec 2023 11:01:50 +0000 Subject: [PATCH 24/37] PR: de-batchify video storage --- aana/configs/pipeline.py | 65 +++++++++++++++++---------------- aana/utils/db.py | 78 ++++++++++++++++++++++++++++++++++++++++ aana/utils/video.py | 7 ++-- 3 files changed, 118 insertions(+), 32 deletions(-) diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index 8a576556..18750983 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -409,6 +409,11 @@ "key": "frames", "path": "video.frames.[*].image", }, + { + "name": "video_frame_ids", + "key": "frame_ids", + "path": "video.frames.[*].id", + }, { "name": "video_timestamps", "key": "timestamps", @@ -487,96 +492,96 @@ { "name": "save_video_info", "type": "ray_task", - "function": "aana.utils.db.save_video_batch", + "function": "aana.utils.db.save_video_single", "dict_output": True, "inputs": [ { - "name": "video_objects", - "key": "videos", - "path": "video_batch.videos.[*].video", + "name": "video_object", + "key": "video", + "path": "video.video", }, ], "outputs": [ { - "name": "media_ids", - "key": "media_ids", - "path": "video_batch.videos.[*].id", + "name": "media_id", + "key": "media_id", + "path": "video.id", } ], }, { "name": "save_transcripts_medium", "type": "ray_task", - "function": "aana.utils.db.save_transcripts_batch", + "function": "aana.utils.db.save_video_transcripts", "kwargs": { "model_name": "whisper_medium", }, "dict_output": True, "inputs": [ { - "name": "media_ids", - "key": "media_ids", - "path": "video_batch.videos.[*].id", + "name": "media_id", + "key": "media_id", + "path": "video.id", }, { "name": "video_transcriptions_info_whisper_medium", "key": "transcription_info", - "path": "video_batch.videos.[*].transcription_info", + "path": "video.transcription_info", }, { "name": "video_transcriptions_segments_whisper_medium", "key": "segments", - "path": "video_batch.videos.[*].segments", + "path": "video.segments", }, { "name": "video_transcriptions_whisper_medium", "key": "transcription", - "path": "video_batch.videos.[*].transcription", + "path": "video.transcription", }, ], "outputs": [ { - "name": "transcription_ids", - "key": "transcription_ids", - "path": "video_batch.videos.[*].transcription.id", + "name": "transcription_id", + "key": "transcription_id", + "path": "video.transcription.id", } ], }, { "name": "save_video_captions_hf_blip2_opt_2_7b", "type": "ray_task", - "function": "aana.utils.db.save_captions_batch", + "function": "aana.utils.db.save_video_captions", "kwargs": { "model_name": "hf_blip2_opt_2_7b", }, "dict_output": True, "inputs": [ { - "name": "media_ids", - "key": "media_ids", - "path": "video_batch.videos.[*].id", + "name": "media_id", + "key": "media_id", + "path": "video.id", }, { "name": "video_captions_hf_blip2_opt_2_7b", - "key": "captions_list", - "path": "video_batch.videos.[*].frames.[*].caption_hf_blip2_opt_2_7b", + "key": "captions", + "path": "video.frames.[*].caption_hf_blip2_opt_2_7b", }, { - "name": "timestamps", - "key": "timestamps_list", - "path": "video_batch.videos.[*].timestamp", + "name": "video_timestamps", + "key": "timestamps", + "path": "video.timestamps", }, { - "name": "frame_ids", - "key": "frame_ids_list", - "path": "video_batch.videos.[*].frames.[*].id", + "name": "video_frame_ids", + "key": "frame_ids", + "path": "video.frames.[*].id", }, ], "outputs": [ { "name": "caption_ids", "key": "caption_ids", - "path": "video_batch.videos.[*].frames.[*].caption_hf_blip2_opt_2_7b.id", + "path": "video.frames.[*].caption_hf_blip2_opt_2_7b.id", } ], }, diff --git a/aana/utils/db.py b/aana/utils/db.py index 13606169..efab9ac6 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -54,6 +54,35 @@ def save_video_batch( } +def save_video_single( + video: Video, # , video_params: list[VideoParams] +) -> id_type: + """Saves a batch of videos to datastore.""" + if video.url is not None: + orig_url = video.url + parsed_url = urlparse(orig_url) + orig_filename = Path(parsed_url.path).name + elif video.path is not None: + parsed_path = Path(video.path) + orig_filename = parsed_path.name + orig_url = None + else: + orig_url = None + orig_filename = None + entity = MediaEntity( + id=video.media_id, + media_type=MediaType.VIDEO, + orig_filename=orig_filename, + orig_url=orig_url, + ) + with Session(engine) as session: + repo = MediaRepository(session) + result = repo.create(entity) + return { + "media_id": result.id # type: ignore + } + + def save_media(media_type: MediaType, duration: float) -> id_type: """Creates and saves media to datastore. @@ -102,6 +131,31 @@ def save_captions_batch( } +def save_video_captions( + media_id: id_type, + model_name: str, + captions: CaptionsList, + timestamps: list[float], + frame_ids: list[int], +) -> list[id_type]: + """Save captions.""" + with Session(engine) as session: + entities = [ + CaptionEntity.from_caption_output( + model_name, media_id, frame_id, timestamp, caption + ) + for caption, timestamp, frame_id in zip( + captions, timestamps, frame_ids, strict=True + ) + ] + repo = CaptionRepository(session) + results = repo.create_multiple(entities) + # return [c.id for c in results] + return { + "caption_ids": [c.id for c in results] # type: ignore + } + + def save_transcripts_batch( model_name: str, media_ids: list[id_type], @@ -133,3 +187,27 @@ def save_transcripts_batch( return { "transcript_ids": [c.id for c in entities] # type: ignore } + + +def save_video_transcripts( + model_name: str, + media_id: id_type, + transcript_infos: AsrTranscriptionInfoList, + transcripts: AsrTranscriptionList, + segments: AsrSegments, +) -> list[id_type]: + """Save transcripts.""" + with Session(engine) as session: + entities = [ + TranscriptEntity.from_asr_output(model_name, media_id, info, txn, seg) + for info, txn, seg in zip( + transcript_infos, transcripts, segments, strict=True + ) + ] + + repo = TranscriptRepository(session) + entities = repo.create_multiple(entities) + print(len(entities)) + return { + "transcript_ids": [c.id for c in entities] # type: ignore + } diff --git a/aana/utils/video.py b/aana/utils/video.py index 9ad29c0e..24ac733f 100644 --- a/aana/utils/video.py +++ b/aana/utils/video.py @@ -83,7 +83,7 @@ def generate_frames_decord( batch_size (int): the number of frames to yield at each iteration Yields: - FramesDict: a dictionary containing the extracted frames, timestamps, + FramesDict: a dictionary containing the extracted frames, frame ids, timestamps, and duration for each batch """ device = decord.cpu(0) @@ -118,7 +118,10 @@ def generate_frames_decord( batch_timestamps = timestamps[i : i + batch_size] yield FramesDict( - frames=batch_frames, timestamps=batch_timestamps, duration=duration + frames=batch_frames, + frame_ids=list(range(len(batch_frames))), + timestamps=batch_timestamps, + duration=duration, ) From bda03c511a4272cbf7f2b80b3a3cc5e83626ea07 Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Wed, 13 Dec 2023 12:53:53 +0000 Subject: [PATCH 25/37] Use a separate Video and Media entities --- ...nitialize.py => 824292b5d320_initalize.py} | 30 +++-- aana/configs/db.py | 6 +- aana/configs/pipeline.py | 17 ++- aana/exceptions/database.py | 6 +- aana/models/db/__init__.py | 1 + aana/models/db/caption.py | 24 ++-- aana/models/db/media.py | 24 ++-- aana/models/db/transcript.py | 20 +++- aana/models/db/video.py | 27 +++++ aana/repository/datastore/base.py | 10 +- aana/repository/datastore/video_repo.py | 12 ++ aana/tests/db/datastore/test_utils.py | 106 ++++++++++++++---- aana/utils/db.py | 83 +++++++------- aana/utils/video.py | 3 +- 14 files changed, 255 insertions(+), 114 deletions(-) rename aana/alembic/versions/{1ab9c6aabdd8_initialize.py => 824292b5d320_initalize.py} (69%) create mode 100644 aana/models/db/video.py create mode 100644 aana/repository/datastore/video_repo.py diff --git a/aana/alembic/versions/1ab9c6aabdd8_initialize.py b/aana/alembic/versions/824292b5d320_initalize.py similarity index 69% rename from aana/alembic/versions/1ab9c6aabdd8_initialize.py rename to aana/alembic/versions/824292b5d320_initalize.py index 288a93c0..e0c7d844 100644 --- a/aana/alembic/versions/1ab9c6aabdd8_initialize.py +++ b/aana/alembic/versions/824292b5d320_initalize.py @@ -1,8 +1,8 @@ -"""Initialize. +"""Initalize. -Revision ID: 1ab9c6aabdd8 +Revision ID: 824292b5d320 Revises: -Create Date: 2023-12-07 14:42:52.006011 +Create Date: 2023-12-13 12:43:46.181117 """ from collections.abc import Sequence @@ -11,7 +11,7 @@ from alembic import op # revision identifiers, used by Alembic. -revision: str = '1ab9c6aabdd8' +revision: str = '824292b5d320' down_revision: str | None = None branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None @@ -22,30 +22,44 @@ def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.create_table('media', sa.Column('id', sa.String(), nullable=False), + sa.Column('media_type', sa.String(), nullable=True, comment='The type of media'), + sa.Column('video_id', sa.Integer(), nullable=True, comment='If media_type is `video`, the id of the video this entry represents.'), + sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), + sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), + sa.ForeignKeyConstraint(['video_id'], ['video.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('video', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), sa.Column('duration', sa.Float(), nullable=True, comment='Media duration in seconds'), sa.Column('media_type', sa.String(), nullable=True, comment='Media type'), sa.Column('orig_filename', sa.String(), nullable=True, comment='Original filename'), sa.Column('orig_url', sa.String(), nullable=True, comment='Original URL'), sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), + sa.ForeignKeyConstraint(['media_id'], ['media.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_table('captions', - sa.Column('id', sa.String(), nullable=False), + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), sa.Column('model', sa.String(), nullable=False, comment='Name of model used to generate the caption'), sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), - sa.Column('frame_id', sa.Integer(), nullable=True, comment='The 0-based frame id of media for caption'), + sa.Column('video_id', sa.Integer(), nullable=False, comment='Foreign key to video table'), + sa.Column('frame_id', sa.Integer(), nullable=True, comment='The 0-based frame id of video for caption'), sa.Column('caption', sa.String(), nullable=True, comment='Frame caption'), sa.Column('timestamp', sa.Float(), nullable=True, comment='Frame timestamp in seconds'), sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), sa.ForeignKeyConstraint(['media_id'], ['media.id'], ), + sa.ForeignKeyConstraint(['video_id'], ['video.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_table('transcripts', - sa.Column('id', sa.String(), nullable=False), + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), sa.Column('model', sa.String(), nullable=False, comment='Name of model used to generate transcript'), sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), + sa.Column('video_id', sa.Integer(), nullable=False, comment='Foreign key to video table'), sa.Column('transcript', sa.String(), nullable=True, comment='Full text transcript of media'), sa.Column('segments', sa.JSON(), nullable=True, comment='Segments of the transcript'), sa.Column('language', sa.String(), nullable=True, comment='Language of the transcript as predicted by model'), @@ -53,6 +67,7 @@ def upgrade() -> None: sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), sa.ForeignKeyConstraint(['media_id'], ['media.id'], ), + sa.ForeignKeyConstraint(['video_id'], ['video.id'], ), sa.PrimaryKeyConstraint('id') ) # ### end Alembic commands ### @@ -63,5 +78,6 @@ def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.drop_table('transcripts') op.drop_table('captions') + op.drop_table('video') op.drop_table('media') # ### end Alembic commands ### diff --git a/aana/configs/db.py b/aana/configs/db.py index 1b7be7d7..06d964cb 100644 --- a/aana/configs/db.py +++ b/aana/configs/db.py @@ -9,8 +9,8 @@ # These are here so we can change types in a single place. -id_type: TypeAlias = str -IdSqlType: TypeAlias = String +media_id_type: TypeAlias = str +MediaIdSqlType: TypeAlias = String class SQLiteConfig(TypedDict): @@ -92,7 +92,7 @@ def get_alembic_config(app_config, ini_file_path, alembic_data_path) -> Config: """Produces an alembic config to run migrations programmatically.""" engine = create_database_engine(app_config.db_config) alembic_config = Config(ini_file_path) - alembic_config.set_main_option('script_location', str(alembic_data_path)) + alembic_config.set_main_option("script_location", str(alembic_data_path)) config_section = alembic_config.get_section(alembic_config.config_ini_section, {}) config_section["sqlalchemy.url"] = engine.url diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index 18750983..7d9adacd 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -505,8 +505,13 @@ { "name": "media_id", "key": "media_id", + "path": "video.media_id", + }, + { + "name": "video_id", + "key": "video_id", "path": "video.id", - } + }, ], }, { @@ -521,6 +526,11 @@ { "name": "media_id", "key": "media_id", + "path": "video.media_id", + }, + { + "name": "video_id", + "key": "video_id", "path": "video.id", }, { @@ -559,6 +569,11 @@ { "name": "media_id", "key": "media_id", + "path": "video.media_id", + }, + { + "name": "video_id", + "key": "video_id", "path": "video.id", }, { diff --git a/aana/exceptions/database.py b/aana/exceptions/database.py index 4027cdc1..754de65b 100644 --- a/aana/exceptions/database.py +++ b/aana/exceptions/database.py @@ -1,16 +1,16 @@ from mobius_pipeline.exceptions import BaseException -from aana.configs.db import id_type +from aana.configs.db import media_id_type class NotFoundException(BaseException): """Raised when an item searched by id is not found.""" - def __init__(self, table_name: str, id: id_type): # noqa: A002 + def __init__(self, table_name: str, id: int | media_id_type): # noqa: A002 """Constructor. Args: table_name (str): the name of the table being queried. - id (id_type): the id of the item to be retrieved. + id (imedia_d_type): the id of the item to be retrieved. """ super().__init__(table=table_name, id=id) diff --git a/aana/models/db/__init__.py b/aana/models/db/__init__.py index ba637fb9..50872ef9 100644 --- a/aana/models/db/__init__.py +++ b/aana/models/db/__init__.py @@ -13,3 +13,4 @@ from aana.models.db.caption import CaptionEntity from aana.models.db.media import MediaEntity, MediaType from aana.models.db.transcript import TranscriptEntity +from aana.models.db.video import VideoEntity diff --git a/aana/models/db/caption.py b/aana/models/db/caption.py index c7fde501..a6d6901e 100644 --- a/aana/models/db/caption.py +++ b/aana/models/db/caption.py @@ -5,30 +5,37 @@ from sqlalchemy import CheckConstraint, Column, Float, ForeignKey, Integer, String from sqlalchemy.orm import relationship -from aana.configs.db import IdSqlType, id_type +from aana.configs.db import MediaIdSqlType, media_id_type from aana.models.db.base import BaseModel, TimeStampEntity from aana.models.pydantic.captions import Caption class CaptionEntity(BaseModel, TimeStampEntity): - """ORM model for media captions.""" + """ORM model for video captions.""" __tablename__ = "captions" - id = Column(IdSqlType, primary_key=True) # noqa: A003 + id = Column(Integer, autoincrement=True, primary_key=True) # noqa: A003 model = Column( String, nullable=False, comment="Name of model used to generate the caption" ) media_id = Column( - IdSqlType, + MediaIdSqlType, ForeignKey("media.id"), nullable=False, comment="Foreign key to media table", ) + video_id = Column( + Integer, + ForeignKey("video.id"), + nullable=False, + comment="Foreign key to video table", + ) + frame_id = Column( Integer, CheckConstraint("frame_id >= 0"), - comment="The 0-based frame id of media for caption", + comment="The 0-based frame id of video for caption", ) caption = Column(String, comment="Frame caption") timestamp = Column( @@ -37,22 +44,23 @@ class CaptionEntity(BaseModel, TimeStampEntity): comment="Frame timestamp in seconds", ) - media = relationship("MediaEntity", back_populates="captions") + video = relationship("VideoEntity", back_populates="captions") @classmethod def from_caption_output( cls, model_name: str, - media_id: id_type, + media_id: media_id_type, + video_id: int, frame_id: int, frame_timestamp: float, caption: Caption, ) -> CaptionEntity: """Converts a Caption pydantic model to a CaptionEntity.""" return CaptionEntity( - id=str(uuid.uuid4()), model=model_name, media_id=media_id, + video_id=video_id, frame_id=frame_id, caption=str(caption), timestamp=frame_timestamp, diff --git a/aana/models/db/media.py b/aana/models/db/media.py index 37087c9d..7972cb33 100644 --- a/aana/models/db/media.py +++ b/aana/models/db/media.py @@ -1,9 +1,8 @@ from enum import Enum -from sqlalchemy import Column, Float, String -from sqlalchemy.orm import relationship +from sqlalchemy import Column, ForeignKey, Integer, String -from aana.configs.db import IdSqlType, id_type +from aana.configs.db import MediaIdSqlType from aana.models.db.base import BaseModel, TimeStampEntity @@ -14,15 +13,14 @@ class MediaType(str, Enum): class MediaEntity(BaseModel, TimeStampEntity): - """ORM class for media file (video, etc).""" + """Table for media items.""" __tablename__ = "media" - - id = Column(IdSqlType, primary_key=True) # noqa: A003 - duration = Column(Float, comment="Media duration in seconds") - media_type = Column(String, comment="Media type") - orig_filename = Column(String, comment="Original filename") - orig_url = Column(String, comment="Original URL") - - captions = relationship("CaptionEntity", back_populates="media") - transcripts = relationship("TranscriptEntity", back_populates="media") + id = Column(MediaIdSqlType, primary_key=True) # noqa: A003 + media_type = Column(String, comment="The type of media") + video_id = Column( + Integer, + ForeignKey("video.id"), + nullable=True, + comment="If media_type is `video`, the id of the video this entry represents.", + ) diff --git a/aana/models/db/transcript.py b/aana/models/db/transcript.py index 990de4e9..e1cfa7fc 100644 --- a/aana/models/db/transcript.py +++ b/aana/models/db/transcript.py @@ -2,10 +2,10 @@ from typing import TYPE_CHECKING -from sqlalchemy import CheckConstraint, Column, Float, ForeignKey, JSON, String +from sqlalchemy import JSON, CheckConstraint, Column, Float, ForeignKey, Integer, String from sqlalchemy.orm import relationship -from aana.configs.db import IdSqlType, id_type +from aana.configs.db import MediaIdSqlType, media_id_type from aana.models.db.base import BaseModel, TimeStampEntity if TYPE_CHECKING: @@ -21,16 +21,22 @@ class TranscriptEntity(BaseModel, TimeStampEntity): __tablename__ = "transcripts" - id = Column(IdSqlType, primary_key=True) # noqa: A003 + id = Column(Integer, autoincrement=True, primary_key=True) # noqa: A003 model = Column( String, nullable=False, comment="Name of model used to generate transcript" ) media_id = Column( - IdSqlType, + MediaIdSqlType, ForeignKey("media.id"), nullable=False, comment="Foreign key to media table", ) + video_id = Column( + Integer, + ForeignKey("video.id"), + nullable=False, + comment="Foreign key to video table", + ) transcript = Column(String, comment="Full text transcript of media") segments = Column(JSON, comment="Segments of the transcript") language = Column( @@ -42,13 +48,14 @@ class TranscriptEntity(BaseModel, TimeStampEntity): comment="Confidence score of language prediction", ) - media = relationship("MediaEntity", back_populates="transcripts") + video = relationship("VideoEntity", back_populates="transcripts") @classmethod def from_asr_output( cls, model_name: str, - media_id: id_type, + media_id: media_id_type, + video_id: int, info: AsrTranscriptionInfo, transcription: AsrTranscription, segments: AsrSegments, @@ -57,6 +64,7 @@ def from_asr_output( return TranscriptEntity( model=model_name, media_id=media_id, + video_id=video_id, language=info.language, language_confidence=info.language_confidence, transcript=transcription.text, diff --git a/aana/models/db/video.py b/aana/models/db/video.py new file mode 100644 index 00000000..82216a7b --- /dev/null +++ b/aana/models/db/video.py @@ -0,0 +1,27 @@ +from sqlalchemy import Column, Float, ForeignKey, Integer, String +from sqlalchemy.orm import relationship + +from aana.configs.db import MediaIdSqlType +from aana.models.db.base import BaseModel, TimeStampEntity + + +class VideoEntity(BaseModel, TimeStampEntity): + """ORM class for videp file (video, etc).""" + + __tablename__ = "video" + + id = Column(Integer, primary_key=True) # noqa: A003 + media_id = Column( + MediaIdSqlType, + ForeignKey("media.id"), + nullable=False, + comment="Foreign key to media table", + ) + duration = Column(Float, comment="Media duration in seconds") + media_type = Column(String, comment="Media type") + orig_filename = Column(String, comment="Original filename") + orig_url = Column(String, comment="Original URL") + + media = relationship("MediaEntity", foreign_keys=[media_id]) + captions = relationship("CaptionEntity", back_populates="video") + transcripts = relationship("TranscriptEntity", back_populates="video") diff --git a/aana/repository/datastore/base.py b/aana/repository/datastore/base.py index 57149a58..a5b2da8f 100644 --- a/aana/repository/datastore/base.py +++ b/aana/repository/datastore/base.py @@ -4,7 +4,7 @@ from sqlalchemy.orm import Session -from aana.configs.db import id_type +from aana.configs.db import media_id_type from aana.exceptions.database import NotFoundException from aana.models.db import BaseModel @@ -42,11 +42,11 @@ def create_multiple(self, entities: Iterable[T]) -> list[T]: self.session.commit() return entities - def read(self, item_id: id_type) -> T: + def read(self, item_id: int | media_id_type) -> T: """Reads a single item by id from the database. Args: - item_id (id_type): id of the item to retrieve + item_id (int): id of the item to retrieve Returns: The corresponding entity from the database if found. @@ -59,11 +59,11 @@ def read(self, item_id: id_type) -> T: raise NotFoundException(self.table_name, item_id) return entity - def delete(self, id: id_type, check: bool = False) -> T | None: + def delete(self, id: int | media_id_type, check: bool = False) -> T | None: """Deletes an entity. Args: - id (id_type): the id of the item to be deleted. + id (int): the id of the item to be deleted. check (bool): whether to raise if the entity is not found (defaults to True). Returns: diff --git a/aana/repository/datastore/video_repo.py b/aana/repository/datastore/video_repo.py new file mode 100644 index 00000000..95136125 --- /dev/null +++ b/aana/repository/datastore/video_repo.py @@ -0,0 +1,12 @@ +from sqlalchemy.orm import Session + +from aana.models.db import VideoEntity +from aana.repository.datastore.base import BaseRepository + + +class VideoRepository(BaseRepository[VideoEntity]): + """Repository for media files.""" + + def __init__(self, session: Session): + """Constructor.""" + super().__init__(session, VideoEntity) diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index 26415d6a..838799a1 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -1,8 +1,8 @@ # ruff: noqa: S101 import pytest from sqlalchemy.orm import Session +from aana.models.core.video import Video -from aana.models.db import MediaType from aana.models.pydantic.asr_output import ( AsrSegments, AsrSegmentsList, @@ -12,7 +12,13 @@ AsrTranscriptionList, ) from aana.models.pydantic.captions import Caption, CaptionsList -from aana.utils.db import save_captions_batch, save_media, save_transcripts_batch +from aana.utils.db import ( + save_captions_batch, + save_video_single, + save_transcripts_batch, + save_video_captions, + save_video_transcripts, +) @pytest.fixture() @@ -30,19 +36,19 @@ def mock_session(mocker): return session_mock -def test_save_media(mock_session): +def test_save_video(mock_session): """Tests save media function.""" - media_type = MediaType.VIDEO - duration = 0.5 - - media_id = save_media(media_type, duration) + media_id = "foobar" + video = Video(path="/foo/bar.tar.gz", media_id=media_id) + result = save_video_single(video) - assert media_id is None - mock_session.context_var.add.assert_called_once() + assert result["media_id"] == media_id + assert result["video_id"] is None + mock_session.context_var.add.assert_called_twice() mock_session.context_var.commit.assert_called_once() -def test_save_transcripts(mock_session): +def test_save_transcripts_batch(mock_session): """Tests save transcripts function.""" media_ids = ["0"] model = "test_model" @@ -60,22 +66,52 @@ def test_save_transcripts(mock_session): ) ] segments = [AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3)] - result = save_transcripts_batch( - model, media_ids, transcription_infos, transcripts, segments + with pytest.raises(NotImplementedError): + result = save_transcripts_batch( + model, media_ids, transcription_infos, transcripts, segments + ) + result_ids = result["transcript_ids"] + + assert ( + len(result_ids) + == len(transcripts[0]) + == len(transcription_infos[0]) + == len(segments[0]) + ) + mock_session.context_var.add_all.assert_called_once() + mock_session.context_var.commit.assert_called_once() + + +def test_save_transcripts_single(mock_session): + """Tests save transcripts function.""" + media_id = "0" + video_id = 0 + model = "test_model" + texts = ("A transcript", "Another transcript", "A third transcript") + infos = [("en", 0.5), ("de", 0.36), ("fr", 0.99)] + transcripts = AsrTranscriptionList( + __root__=[AsrTranscription(text=text) for text in texts] + ) + transcription_infos = AsrTranscriptionInfoList( + __root__=[ + AsrTranscriptionInfo(language=lang, language_confidence=conf) + for lang, conf in infos + ] + ) + segments = AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3) + result = save_video_transcripts( + model, media_id, video_id, transcription_infos, transcripts, segments ) result_ids = result["transcript_ids"] assert ( - len(result_ids) - == len(transcripts[0]) - == len(transcription_infos[0]) - == len(segments[0]) + len(result_ids) == len(transcripts) == len(transcription_infos) == len(segments) ) mock_session.context_var.add_all.assert_called_once() mock_session.context_var.commit.assert_called_once() -def test_save_captions(mock_session): +def test_save_captions_batch(mock_session): """Tests save captions function.""" media_ids = ["0"] models = "test_model" @@ -85,16 +121,42 @@ def test_save_captions(mock_session): ] timestamps = [[0.1, 0.2, 0.3, 0.4]] frame_ids = [[0, 1, 2]] + with pytest.raises(NotImplementedError): + result = save_captions_batch( + media_ids, models, captions_list, timestamps, frame_ids + ) + + assert ( + len(result["caption_ids"]) + == len(captions_list[0]) + == len(timestamps[0][:-1]) + == len(frame_ids[0]) + ) + mock_session.context_var.add_all.assert_called_once() + mock_session.context_var.commit.assert_called_once() + + +def test_save_captions_single(mock_session): + """Tests save captions function.""" + media_id = "0" + video_id = 0 + model_name = "test_model" + captions = ["A caption", "Another caption", "A third caption"] + captions_list = CaptionsList( + __root__=[Caption(__root__=caption) for caption in captions] + ) + timestamps = [0.1, 0.2, 0.3] + frame_ids = [0, 1, 2] - result = save_captions_batch( - media_ids, models, captions_list, timestamps, frame_ids + result = save_video_captions( + model_name, media_id, video_id, captions_list, timestamps, frame_ids ) assert ( len(result["caption_ids"]) - == len(captions_list[0]) - == len(timestamps[0][:-1]) - == len(frame_ids[0]) + == len(captions_list) + == len(timestamps) + == len(frame_ids) ) mock_session.context_var.add_all.assert_called_once() mock_session.context_var.commit.assert_called_once() diff --git a/aana/utils/db.py b/aana/utils/db.py index efab9ac6..1a72d4ab 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -4,28 +4,35 @@ from sqlalchemy.orm import Session -from aana.configs.db import id_type +from aana.configs.db import media_id_type from aana.models.core.video import Video -from aana.models.db import CaptionEntity, MediaEntity, MediaType, TranscriptEntity +from aana.models.db import ( + CaptionEntity, + MediaEntity, + MediaType, + TranscriptEntity, + VideoEntity, +) from aana.models.pydantic.asr_output import ( AsrSegments, AsrTranscriptionInfoList, AsrTranscriptionList, ) from aana.models.pydantic.captions import CaptionsList -from aana.models.pydantic.video_params import VideoParams from aana.repository.datastore.caption_repo import CaptionRepository from aana.repository.datastore.engine import engine from aana.repository.datastore.media_repo import MediaRepository from aana.repository.datastore.transcript_repo import TranscriptRepository +from aana.repository.datastore.video_repo import VideoRepository # Just using raw utility functions like this isn't a permanent solution, but # it's good enough for now to validate what we're working on. def save_video_batch( videos: list[Video], # , video_params: list[VideoParams] -) -> list[id_type]: +) -> dict: """Saves a batch of videos to datastore.""" + raise NotImplementedError("Needs to be fixed.") entities = [] for video_object, _ in zip(videos, videos, strict=True): if video_object.url is not None: @@ -55,8 +62,8 @@ def save_video_batch( def save_video_single( - video: Video, # , video_params: list[VideoParams] -) -> id_type: + video: Video, +) -> dict: """Saves a batch of videos to datastore.""" if video.url is not None: orig_url = video.url @@ -69,48 +76,34 @@ def save_video_single( else: orig_url = None orig_filename = None - entity = MediaEntity( - id=video.media_id, + media_entity = MediaEntity(id=video.media_id, media_type=MediaType.VIDEO) + video_entity = VideoEntity( + media=media_entity, media_type=MediaType.VIDEO, orig_filename=orig_filename, orig_url=orig_url, ) with Session(engine) as session: - repo = MediaRepository(session) - result = repo.create(entity) + media_repo = MediaRepository(session) + _ = media_repo.create(media_entity) + video_repo = VideoRepository(session) + _ = video_repo.create(video_entity) return { - "media_id": result.id # type: ignore + "media_id": media_entity.id, # type: ignore + "video_id": video_entity.id, } -def save_media(media_type: MediaType, duration: float) -> id_type: - """Creates and saves media to datastore. - - Args: - media_type (MediaType): type of media - duration (float): duration of media - - Returns: - id_type: datastore id of the inserted Media. - """ - with Session(engine) as session: - media = MediaEntity(duration=duration, media_type=media_type) - repo = MediaRepository(session) - media = repo.create(media) - return media.id # type: ignore - - def save_captions_batch( - media_ids: list[id_type], + media_ids: list[media_id_type], model_name: str, captions_list: list[CaptionsList], timestamps_list: list[list[float]], frame_ids_list: list[list[int]], -) -> list[id_type]: +) -> dict: """Save captions.""" - print( - f"{len(media_ids)}\n{len(timestamps_list[0])}\n{len(list(frame_ids_list[0]))}\n{model_name=}\ncaptions: {len(captions_list[0])}" - ) + raise NotImplementedError("Needs to be fixed") + with Session(engine) as session: entities = [ CaptionEntity.from_caption_output( @@ -132,17 +125,18 @@ def save_captions_batch( def save_video_captions( - media_id: id_type, model_name: str, + media_id: media_id_type, + video_id: int, captions: CaptionsList, timestamps: list[float], frame_ids: list[int], -) -> list[id_type]: +) -> dict: """Save captions.""" with Session(engine) as session: entities = [ CaptionEntity.from_caption_output( - model_name, media_id, frame_id, timestamp, caption + model_name, media_id, video_id, frame_id, timestamp, caption ) for caption, timestamp, frame_id in zip( captions, timestamps, frame_ids, strict=True @@ -158,15 +152,13 @@ def save_video_captions( def save_transcripts_batch( model_name: str, - media_ids: list[id_type], + media_ids: list[media_id_type], transcript_info_list: list[AsrTranscriptionInfoList], transcripts_list: list[AsrTranscriptionList], segments_list: list[AsrSegments], -) -> list[id_type]: +) -> dict: """Save transcripts.""" - print( - f"{len(media_ids)}\n{len(transcript_info_list)}\n{len(transcripts_list)}\n{len(segments_list)}" - ) + raise NotImplementedError("Needs to be fixed") with Session(engine) as session: entities = [ TranscriptEntity.from_asr_output(model_name, media_id, info, txn, seg) @@ -191,15 +183,18 @@ def save_transcripts_batch( def save_video_transcripts( model_name: str, - media_id: id_type, + media_id: media_id_type, + video_id: int, transcript_infos: AsrTranscriptionInfoList, transcripts: AsrTranscriptionList, segments: AsrSegments, -) -> list[id_type]: +) -> dict: """Save transcripts.""" with Session(engine) as session: entities = [ - TranscriptEntity.from_asr_output(model_name, media_id, info, txn, seg) + TranscriptEntity.from_asr_output( + model_name, media_id, video_id, info, txn, seg + ) for info, txn, seg in zip( transcript_infos, transcripts, segments, strict=True ) diff --git a/aana/utils/video.py b/aana/utils/video.py index 24ac733f..963116e0 100644 --- a/aana/utils/video.py +++ b/aana/utils/video.py @@ -7,7 +7,6 @@ import yt_dlp from yt_dlp.utils import DownloadError -from aana.configs.db import id_type from aana.configs.settings import settings from aana.exceptions.general import DownloadException, VideoReadingException from aana.models.core.image import Image @@ -23,7 +22,7 @@ class FramesDict(TypedDict): frames: list[Image] timestamps: list[float] duration: float - frame_ids: list[id_type] + frame_ids: list[int] def extract_frames_decord(video: Video, params: VideoParams) -> FramesDict: From 8e95a548a81903cbcf47e157302c60ebe5f1e65a Mon Sep 17 00:00:00 2001 From: Evan de Riel Date: Wed, 13 Dec 2023 13:42:16 +0000 Subject: [PATCH 26/37] Fix tests --- aana/tests/db/datastore/test_repo.py | 31 +++++++++++++++++---------- aana/tests/db/datastore/test_utils.py | 10 ++++++--- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/aana/tests/db/datastore/test_repo.py b/aana/tests/db/datastore/test_repo.py index 6b20d380..b59ab48b 100644 --- a/aana/tests/db/datastore/test_repo.py +++ b/aana/tests/db/datastore/test_repo.py @@ -3,7 +3,7 @@ from sqlalchemy.orm import Session from aana.configs.db import create_database_engine -from aana.models.db import CaptionEntity, MediaEntity, TranscriptEntity +from aana.models.db import CaptionEntity, MediaEntity, TranscriptEntity, VideoEntity from aana.repository.datastore.caption_repo import CaptionRepository from aana.repository.datastore.media_repo import MediaRepository from aana.repository.datastore.transcript_repo import TranscriptRepository @@ -18,16 +18,16 @@ def mocked_session(mocker): def test_create_media(mocked_session): """Tests that media creation behaves as expected.""" repo = MediaRepository(mocked_session) - duration = 0.5 media_type = "video" - media = MediaEntity(duration=duration, media_type=media_type) + media_id = "foo" + media = MediaEntity(id=media_id, media_type=media_type) media2 = repo.create(media) # We need an integreation test to ensure that that the id gets set # on creation, because the mocked version won't set it. assert media2 == media - assert media2.duration == duration assert media2.media_type == media_type + assert media2.id == media_id mocked_session.add.assert_called_once_with(media) mocked_session.commit.assert_called_once() @@ -36,15 +36,18 @@ def test_create_media(mocked_session): def test_create_caption(mocked_session): """Tests caption creation.""" repo = CaptionRepository(mocked_session) - duration = 500.25 + media_id = "foo" media_type = "video" + video_duration = 500.25 model_name = "no_model" caption_text = "This is the right caption text." frame_id = 32767 timestamp = 327.6 - media = MediaEntity(duration=duration, media_type=media_type) + media = MediaEntity(id=media_id, media_type=media_type) + video = VideoEntity(media_id=media_id, duration=video_duration) caption = CaptionEntity( - media=media, + media_id=media_id, + video=video, model=model_name, frame_id=frame_id, caption=caption_text, @@ -53,7 +56,9 @@ def test_create_caption(mocked_session): caption2 = repo.create(caption) # See above - assert caption2.media == media + assert caption2.video == video + assert caption2.media_id == media_id + assert caption2.video_id == video.id assert caption2.model == model_name assert caption2.frame_id == frame_id assert caption2.caption == caption_text @@ -66,6 +71,7 @@ def test_create_caption(mocked_session): def test_create_transcript(mocked_session): """Tests transcript creation.""" repo = TranscriptRepository(mocked_session) + media_id = "foo" duration = 500.25 media_type = "video" model_name = "no_model" @@ -73,9 +79,11 @@ def test_create_transcript(mocked_session): segments = "This is a segments string." language = "en" language_confidence = 0.5 - media = MediaEntity(duration=duration, media_type=media_type) + media = MediaEntity(id=media_id, media_type=media_type) + video = VideoEntity(media_id=media_id, duration=duration) transcript = TranscriptEntity( - media=media, + media_id=media_id, + video=video, model=model_name, transcript=transcript_text, segments=segments, @@ -85,7 +93,8 @@ def test_create_transcript(mocked_session): transcript2 = repo.create(transcript) # See above - assert transcript2.media == media + assert transcript2.video_id == video.id + assert transcript2.media_id == media.id assert transcript2.model == model_name assert transcript2.transcript == transcript_text assert transcript2.segments == segments diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index 838799a1..0aab552b 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -1,4 +1,6 @@ # ruff: noqa: S101 +from importlib import resources +from pathlib import Path import pytest from sqlalchemy.orm import Session from aana.models.core.video import Video @@ -39,13 +41,15 @@ def mock_session(mocker): def test_save_video(mock_session): """Tests save media function.""" media_id = "foobar" - video = Video(path="/foo/bar.tar.gz", media_id=media_id) + path = resources.path("aana.tests.files.videos", "squirrel.mp4") + video = Video(path=path, media_id=media_id) result = save_video_single(video) assert result["media_id"] == media_id assert result["video_id"] is None - mock_session.context_var.add.assert_called_twice() - mock_session.context_var.commit.assert_called_once() + # once each for MediaEntity and VideoEntity + assert mock_session.context_var.add.call_count == 2 + assert mock_session.context_var.commit.call_count == 2 def test_save_transcripts_batch(mock_session): From 99e92a29bab85bdd00b6a27438087d307b3eb95b Mon Sep 17 00:00:00 2001 From: evanderiel Date: Wed, 13 Dec 2023 14:37:23 +0000 Subject: [PATCH 27/37] PR: cleanup --- aana/configs/endpoints.py | 4 ++++ aana/tests/db/datastore/test_repo.py | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/aana/configs/endpoints.py b/aana/configs/endpoints.py index 3d5afdcf..2aecc36f 100644 --- a/aana/configs/endpoints.py +++ b/aana/configs/endpoints.py @@ -112,6 +112,10 @@ EndpointOutput( name="info", output="video_transcriptions_info_whisper_medium" ), + EndpointOutput( + name="transcription_id", output="transcription_id" + ) + ], streaming=True, ), diff --git a/aana/tests/db/datastore/test_repo.py b/aana/tests/db/datastore/test_repo.py index b59ab48b..a1c3e1dc 100644 --- a/aana/tests/db/datastore/test_repo.py +++ b/aana/tests/db/datastore/test_repo.py @@ -2,7 +2,6 @@ import pytest from sqlalchemy.orm import Session -from aana.configs.db import create_database_engine from aana.models.db import CaptionEntity, MediaEntity, TranscriptEntity, VideoEntity from aana.repository.datastore.caption_repo import CaptionRepository from aana.repository.datastore.media_repo import MediaRepository From 4bf5b676f00897c4bcf4fd7dc8e09a436ea9c088 Mon Sep 17 00:00:00 2001 From: evanderiel Date: Thu, 14 Dec 2023 09:22:27 +0000 Subject: [PATCH 28/37] Re-add batch transcript saving --- aana/configs/endpoints.py | 8 ++-- aana/configs/pipeline.py | 68 +++++++++++++++++++++++++++ aana/tests/db/datastore/test_utils.py | 56 ++++++++++++++-------- aana/utils/db.py | 32 ++++++++----- 4 files changed, 130 insertions(+), 34 deletions(-) diff --git a/aana/configs/endpoints.py b/aana/configs/endpoints.py index 2aecc36f..f032b67f 100644 --- a/aana/configs/endpoints.py +++ b/aana/configs/endpoints.py @@ -81,6 +81,9 @@ EndpointOutput( name="info", output="videos_transcriptions_info_whisper_medium" ), + EndpointOutput( + name="transcription_ids", output="videos_transcription_ids" + ) ], ) ], @@ -112,10 +115,7 @@ EndpointOutput( name="info", output="video_transcriptions_info_whisper_medium" ), - EndpointOutput( - name="transcription_id", output="transcription_id" - ) - + EndpointOutput(name="transcription_id", output="transcription_id"), ], streaming=True, ), diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index 7d9adacd..260a24a1 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -514,6 +514,31 @@ }, ], }, + { + "name": "save_videos_info", + "type": "ray_task", + "function": "aana.utils.db.save_video_batch", + "dict_output": True, + "inputs": [ + { + "name": "video_objects", + "key": "videos", + "path": "video_batch.videos.[*].video", + }, + ], + "outputs": [ + { + "name": "media_ids", + "key": "media_ids", + "path": "video_batch.[*].media_id", + }, + { + "name": "video_ids", + "key": "video_ids", + "path": "video_batch.[*].id", + }, + ], + }, { "name": "save_transcripts_medium", "type": "ray_task", @@ -557,6 +582,49 @@ } ], }, + { + "name": "save_transcripts_batch_medium", + "type": "ray_task", + "function": "aana.utils.db.save_transcripts_batch", + "kwargs": { + "model_name": "whisper_medium", + }, + "dict_output": True, + "inputs": [ + { + "name": "media_ids", + "key": "media_ids", + "path": "video_batch.[*].media_id", + }, + { + "name": "video_ids", + "key": "video_ids", + "path": "video_batch.[*].video_ids", + }, + { + "name": "videos_transcriptions_info_whisper_medium", + "key": "transcription_info_list", + "path": "video_batch.videos.[*].transcription_info", + }, + { + "name": "videos_transcriptions_segments_whisper_medium", + "key": "segments_list", + "path": "video_batch.videos.[*].segments", + }, + { + "name": "videos_transcriptions_whisper_medium", + "key": "transcription_list", + "path": "video_batch.videos.[*].transcription", + }, + ], + "outputs": [ + { + "name": "videos_transcription_ids", + "key": "transcription_ids", + "path": "video_batch.videos.[*].transcription.id", + } + ], + }, { "name": "save_video_captions_hf_blip2_opt_2_7b", "type": "ray_task", diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index 0aab552b..ff559203 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -1,10 +1,11 @@ # ruff: noqa: S101 from importlib import resources from pathlib import Path + import pytest from sqlalchemy.orm import Session -from aana.models.core.video import Video +from aana.models.core.video import Video from aana.models.pydantic.asr_output import ( AsrSegments, AsrSegmentsList, @@ -16,9 +17,10 @@ from aana.models.pydantic.captions import Caption, CaptionsList from aana.utils.db import ( save_captions_batch, - save_video_single, save_transcripts_batch, + save_video_batch, save_video_captions, + save_video_single, save_video_transcripts, ) @@ -52,15 +54,31 @@ def test_save_video(mock_session): assert mock_session.context_var.commit.call_count == 2 +def test_save_videos_batch(mock_session): + """Tests save media function.""" + media_ids = ["foo", "bar"] + path = resources.path("aana.tests.files.videos", "squirrel.mp4") + videos = [Video(path=path, media_id=m_id) for m_id in media_ids] + + result = save_video_batch(videos) + + assert result["media_ids"] == media_ids + assert result["video_ids"] == [None, None] + assert len(result["media_ids"]) == len(result["video_ids"]) + # once each for MediaEntities and VideoEntities + assert mock_session.context_var.add_all.call_count == 2 + assert mock_session.context_var.commit.call_count == 2 + + def test_save_transcripts_batch(mock_session): """Tests save transcripts function.""" - media_ids = ["0"] + media_ids = ["0", "1"] model = "test_model" texts = ("A transcript", "Another transcript", "A third transcript") infos = [("en", 0.5), ("de", 0.36), ("fr", 0.99)] transcripts = [ AsrTranscriptionList(__root__=[AsrTranscription(text=text) for text in texts]) - ] + ] * 2 transcription_infos = [ AsrTranscriptionInfoList( __root__=[ @@ -68,22 +86,22 @@ def test_save_transcripts_batch(mock_session): for lang, conf in infos ] ) - ] - segments = [AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3)] - with pytest.raises(NotImplementedError): - result = save_transcripts_batch( - model, media_ids, transcription_infos, transcripts, segments - ) - result_ids = result["transcript_ids"] + ] * 2 + segments = [AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3)] * 2 + video_ids = [0, 1] + result = save_transcripts_batch( + model, media_ids, video_ids, transcription_infos, transcripts, segments + ) + result_ids = result["transcript_ids"] - assert ( - len(result_ids) - == len(transcripts[0]) - == len(transcription_infos[0]) - == len(segments[0]) - ) - mock_session.context_var.add_all.assert_called_once() - mock_session.context_var.commit.assert_called_once() + assert ( + len(result_ids) + == len(transcripts[0]) + len(transcripts[1]) + == len(transcription_infos[0]) + len(transcription_infos[1]) + == len(segments[0]) + len(segments[1]) + ) + mock_session.context_var.add_all.assert_called_once() + mock_session.context_var.commit.assert_called_once() def test_save_transcripts_single(mock_session): diff --git a/aana/utils/db.py b/aana/utils/db.py index 1a72d4ab..7deb9106 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -32,8 +32,8 @@ def save_video_batch( videos: list[Video], # , video_params: list[VideoParams] ) -> dict: """Saves a batch of videos to datastore.""" - raise NotImplementedError("Needs to be fixed.") - entities = [] + media_entities = [] + video_entities = [] for video_object, _ in zip(videos, videos, strict=True): if video_object.url is not None: orig_url = video_object.url @@ -46,18 +46,25 @@ def save_video_batch( else: orig_url = None orig_filename = None - entity = MediaEntity( + media_entity = MediaEntity( id=video_object.media_id, media_type=MediaType.VIDEO, + ) + video_entity = VideoEntity( + media=media_entity, orig_filename=orig_filename, orig_url=orig_url, ) - entities.append(entity) + media_entities.append(media_entity) + video_entities.append(video_entity) with Session(engine) as session: - repo = MediaRepository(session) - results = repo.create_multiple(entities) + m_repo = MediaRepository(session) + v_repo = VideoRepository(session) + medias = m_repo.create_multiple(media_entities) + videos = v_repo.create_multiple(video_entities) return { - "media_ids": [result.id for result in results] # type: ignore + "media_ids": [m.id for m in medias], # type: ignore + "video_ids": [v.id for v in videos], } @@ -153,17 +160,20 @@ def save_video_captions( def save_transcripts_batch( model_name: str, media_ids: list[media_id_type], + video_ids: list[int], transcript_info_list: list[AsrTranscriptionInfoList], transcripts_list: list[AsrTranscriptionList], segments_list: list[AsrSegments], ) -> dict: - """Save transcripts.""" - raise NotImplementedError("Needs to be fixed") + """Save transcripts batch.""" with Session(engine) as session: entities = [ - TranscriptEntity.from_asr_output(model_name, media_id, info, txn, seg) - for media_id, transcript_infos, transcripts, segments in zip( + TranscriptEntity.from_asr_output( + model_name, media_id, video_id, info, txn, seg + ) + for media_id, video_id, transcript_infos, transcripts, segments in zip( media_ids, + video_ids, transcript_info_list, transcripts_list, segments_list, From 94ba4491ad64f86c857f8f951c80991839554bcd Mon Sep 17 00:00:00 2001 From: evanderiel Date: Thu, 14 Dec 2023 12:59:02 +0000 Subject: [PATCH 29/37] PR feedback: rename aana.models.db.BaseModel to BaseEntity --- aana/alembic/env.py | 4 ++-- ...292b5d320_initalize.py => b5a993b53e6c_initialize.py} | 9 ++++----- aana/models/db/__init__.py | 2 +- aana/models/db/base.py | 2 +- aana/models/db/caption.py | 4 ++-- aana/models/db/media.py | 4 ++-- aana/models/db/transcript.py | 4 ++-- aana/models/db/video.py | 5 ++--- aana/repository/datastore/base.py | 4 ++-- aana/utils/db.py | 1 - 10 files changed, 18 insertions(+), 21 deletions(-) rename aana/alembic/versions/{824292b5d320_initalize.py => b5a993b53e6c_initialize.py} (96%) diff --git a/aana/alembic/env.py b/aana/alembic/env.py index b43a27b0..49688b43 100644 --- a/aana/alembic/env.py +++ b/aana/alembic/env.py @@ -5,7 +5,7 @@ from aana.configs.db import create_database_engine from aana.configs.settings import settings -from aana.models.db.base import BaseModel +from aana.models.db.base import BaseEntity # this is the Alembic Config object, which provides # access to the values within the .ini file in use. @@ -21,7 +21,7 @@ # from myapp import mymodel # target_metadata = mymodel.Base.metadata -target_metadata = BaseModel.metadata +target_metadata = BaseEntity.metadata # other values from the config, defined by the needs of env.py, # can be acquired: diff --git a/aana/alembic/versions/824292b5d320_initalize.py b/aana/alembic/versions/b5a993b53e6c_initialize.py similarity index 96% rename from aana/alembic/versions/824292b5d320_initalize.py rename to aana/alembic/versions/b5a993b53e6c_initialize.py index e0c7d844..15affc4a 100644 --- a/aana/alembic/versions/824292b5d320_initalize.py +++ b/aana/alembic/versions/b5a993b53e6c_initialize.py @@ -1,8 +1,8 @@ -"""Initalize. +"""Initialize. -Revision ID: 824292b5d320 +Revision ID: b5a993b53e6c Revises: -Create Date: 2023-12-13 12:43:46.181117 +Create Date: 2023-12-14 13:00:38.921552 """ from collections.abc import Sequence @@ -11,7 +11,7 @@ from alembic import op # revision identifiers, used by Alembic. -revision: str = '824292b5d320' +revision: str = 'b5a993b53e6c' down_revision: str | None = None branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None @@ -33,7 +33,6 @@ def upgrade() -> None: sa.Column('id', sa.Integer(), nullable=False), sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), sa.Column('duration', sa.Float(), nullable=True, comment='Media duration in seconds'), - sa.Column('media_type', sa.String(), nullable=True, comment='Media type'), sa.Column('orig_filename', sa.String(), nullable=True, comment='Original filename'), sa.Column('orig_url', sa.String(), nullable=True, comment='Original URL'), sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), diff --git a/aana/models/db/__init__.py b/aana/models/db/__init__.py index 50872ef9..5327fc00 100644 --- a/aana/models/db/__init__.py +++ b/aana/models/db/__init__.py @@ -9,7 +9,7 @@ # https://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/database/sqlalchemy.html#importing-all-sqlalchemy-models # (even if not using Pyramid) -from aana.models.db.base import BaseModel +from aana.models.db.base import BaseEntity from aana.models.db.caption import CaptionEntity from aana.models.db.media import MediaEntity, MediaType from aana.models.db.transcript import TranscriptEntity diff --git a/aana/models/db/base.py b/aana/models/db/base.py index 1810c2ba..ed6e73af 100644 --- a/aana/models/db/base.py +++ b/aana/models/db/base.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import DeclarativeBase -class BaseModel(DeclarativeBase): +class BaseEntity(DeclarativeBase): """Base for all ORM classes.""" pass diff --git a/aana/models/db/caption.py b/aana/models/db/caption.py index a6d6901e..f3a286fe 100644 --- a/aana/models/db/caption.py +++ b/aana/models/db/caption.py @@ -6,11 +6,11 @@ from sqlalchemy.orm import relationship from aana.configs.db import MediaIdSqlType, media_id_type -from aana.models.db.base import BaseModel, TimeStampEntity +from aana.models.db.base import BaseEntity, TimeStampEntity from aana.models.pydantic.captions import Caption -class CaptionEntity(BaseModel, TimeStampEntity): +class CaptionEntity(BaseEntity, TimeStampEntity): """ORM model for video captions.""" __tablename__ = "captions" diff --git a/aana/models/db/media.py b/aana/models/db/media.py index 7972cb33..632a4c3a 100644 --- a/aana/models/db/media.py +++ b/aana/models/db/media.py @@ -3,7 +3,7 @@ from sqlalchemy import Column, ForeignKey, Integer, String from aana.configs.db import MediaIdSqlType -from aana.models.db.base import BaseModel, TimeStampEntity +from aana.models.db.base import BaseEntity, TimeStampEntity class MediaType(str, Enum): @@ -12,7 +12,7 @@ class MediaType(str, Enum): VIDEO = "video" -class MediaEntity(BaseModel, TimeStampEntity): +class MediaEntity(BaseEntity, TimeStampEntity): """Table for media items.""" __tablename__ = "media" diff --git a/aana/models/db/transcript.py b/aana/models/db/transcript.py index e1cfa7fc..ecce16cb 100644 --- a/aana/models/db/transcript.py +++ b/aana/models/db/transcript.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import relationship from aana.configs.db import MediaIdSqlType, media_id_type -from aana.models.db.base import BaseModel, TimeStampEntity +from aana.models.db.base import BaseEntity, TimeStampEntity if TYPE_CHECKING: from aana.models.pydantic.asr_output import ( @@ -16,7 +16,7 @@ ) -class TranscriptEntity(BaseModel, TimeStampEntity): +class TranscriptEntity(BaseEntity, TimeStampEntity): """ORM class for media transcripts generated by a model.""" __tablename__ = "transcripts" diff --git a/aana/models/db/video.py b/aana/models/db/video.py index 82216a7b..4001dc3e 100644 --- a/aana/models/db/video.py +++ b/aana/models/db/video.py @@ -2,10 +2,10 @@ from sqlalchemy.orm import relationship from aana.configs.db import MediaIdSqlType -from aana.models.db.base import BaseModel, TimeStampEntity +from aana.models.db.base import BaseEntity, TimeStampEntity -class VideoEntity(BaseModel, TimeStampEntity): +class VideoEntity(BaseEntity, TimeStampEntity): """ORM class for videp file (video, etc).""" __tablename__ = "video" @@ -18,7 +18,6 @@ class VideoEntity(BaseModel, TimeStampEntity): comment="Foreign key to media table", ) duration = Column(Float, comment="Media duration in seconds") - media_type = Column(String, comment="Media type") orig_filename = Column(String, comment="Original filename") orig_url = Column(String, comment="Original URL") diff --git a/aana/repository/datastore/base.py b/aana/repository/datastore/base.py index a5b2da8f..54188ccc 100644 --- a/aana/repository/datastore/base.py +++ b/aana/repository/datastore/base.py @@ -6,9 +6,9 @@ from aana.configs.db import media_id_type from aana.exceptions.database import NotFoundException -from aana.models.db import BaseModel +from aana.models.db import BaseEntity -T = TypeVar("T", bound=BaseModel) +T = TypeVar("T", bound=BaseEntity) # Does not yet have an update method because I'm not sure if we'll need one. diff --git a/aana/utils/db.py b/aana/utils/db.py index 7deb9106..b93ff2cf 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -86,7 +86,6 @@ def save_video_single( media_entity = MediaEntity(id=video.media_id, media_type=MediaType.VIDEO) video_entity = VideoEntity( media=media_entity, - media_type=MediaType.VIDEO, orig_filename=orig_filename, orig_url=orig_url, ) From 334c3a3f9f75181526d527cfe349d3e19ea5a8bb Mon Sep 17 00:00:00 2001 From: evanderiel Date: Thu, 14 Dec 2023 13:07:38 +0000 Subject: [PATCH 30/37] Add __init__.py file to remove --import-mode=importlib --- .vscode/settings.json | 2 +- aana/models/__init__.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 aana/models/__init__.py diff --git a/.vscode/settings.json b/.vscode/settings.json index 4ca15346..b95e6a00 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,7 +5,7 @@ "editor.formatOnSave": true, }, "python.testing.pytestArgs": [ - "--import-mode=importlib", + // "--import-mode=importlib", "aana" ], "python.testing.unittestEnabled": false, diff --git a/aana/models/__init__.py b/aana/models/__init__.py new file mode 100644 index 00000000..e69de29b From e355d20fa560231faace957b550764030eb6f2da Mon Sep 17 00:00:00 2001 From: evanderiel Date: Thu, 14 Dec 2023 13:11:40 +0000 Subject: [PATCH 31/37] Ruff fixes --- aana/api/app.py | 3 +++ aana/configs/db.py | 2 +- aana/models/db/caption.py | 6 ++++-- aana/models/pydantic/asr_output.py | 2 +- aana/models/pydantic/captions.py | 3 ++- aana/models/pydantic/image_input.py | 4 ++-- aana/models/pydantic/video_input.py | 5 +++-- aana/tests/db/datastore/test_repo.py | 2 +- aana/tests/db/datastore/test_utils.py | 1 - 9 files changed, 17 insertions(+), 11 deletions(-) diff --git a/aana/api/app.py b/aana/api/app.py index e341c1ac..765aab75 100644 --- a/aana/api/app.py +++ b/aana/api/app.py @@ -22,6 +22,9 @@ async def validation_exception_handler(request: Request, exc: ValidationError): Returns: JSONResponse: JSON response with the error details """ + import traceback + + traceback.print_exception(exc) return AanaJSONResponse( status_code=422, content=ExceptionResponseModel( diff --git a/aana/configs/db.py b/aana/configs/db.py index 06d964cb..b24313b0 100644 --- a/aana/configs/db.py +++ b/aana/configs/db.py @@ -106,7 +106,7 @@ def run_alembic_migrations(settings): current_path = Path(__file__) aana_root = current_path.parent.parent # go up two directories if aana_root.name != "aana": # we are not in the right place - raise RuntimeError("Not in right directory, exiting.") + raise RuntimeError("Not in right directory, exiting.") # noqa: TRY003 ini_file_path = aana_root / "alembic.ini" alembic_data_path = aana_root / "alembic" diff --git a/aana/models/db/caption.py b/aana/models/db/caption.py index f3a286fe..97e04ffb 100644 --- a/aana/models/db/caption.py +++ b/aana/models/db/caption.py @@ -1,13 +1,15 @@ from __future__ import annotations # Let classes use themselves in type annotations -import uuid +import typing from sqlalchemy import CheckConstraint, Column, Float, ForeignKey, Integer, String from sqlalchemy.orm import relationship from aana.configs.db import MediaIdSqlType, media_id_type from aana.models.db.base import BaseEntity, TimeStampEntity -from aana.models.pydantic.captions import Caption + +if typing.TYPE_CHECKING: + from aana.models.pydantic.captions import Caption class CaptionEntity(BaseEntity, TimeStampEntity): diff --git a/aana/models/pydantic/asr_output.py b/aana/models/pydantic/asr_output.py index 7fc52bb2..ff86aef9 100644 --- a/aana/models/pydantic/asr_output.py +++ b/aana/models/pydantic/asr_output.py @@ -10,10 +10,10 @@ from faster_whisper.transcribe import ( Word as WhisperWord, ) +from pydantic import BaseModel, Field from aana.models.pydantic.base import BaseListModel from aana.models.pydantic.time_interval import TimeInterval -from pydantic import BaseModel, Field class AsrWord(BaseModel): diff --git a/aana/models/pydantic/captions.py b/aana/models/pydantic/captions.py index 020764eb..96ed2d13 100644 --- a/aana/models/pydantic/captions.py +++ b/aana/models/pydantic/captions.py @@ -1,8 +1,9 @@ from types import MappingProxyType -from aana.models.pydantic.base import BaseListModel from pydantic import BaseModel +from aana.models.pydantic.base import BaseListModel + class Caption(BaseModel): """A model for a caption.""" diff --git a/aana/models/pydantic/image_input.py b/aana/models/pydantic/image_input.py index f4a34b3d..e8f22211 100644 --- a/aana/models/pydantic/image_input.py +++ b/aana/models/pydantic/image_input.py @@ -4,11 +4,11 @@ from types import MappingProxyType import numpy as np +from pydantic import BaseModel, Field, ValidationError, root_validator, validator +from pydantic.error_wrappers import ErrorWrapper from aana.models.core.image import Image from aana.models.pydantic.base import BaseListModel -from pydantic import BaseModel, Field, ValidationError, root_validator, validator -from pydantic.error_wrappers import ErrorWrapper class ImageInput(BaseModel): diff --git a/aana/models/pydantic/video_input.py b/aana/models/pydantic/video_input.py index c399cff8..cc7e96f0 100644 --- a/aana/models/pydantic/video_input.py +++ b/aana/models/pydantic/video_input.py @@ -2,11 +2,12 @@ from pathlib import Path from types import MappingProxyType -from aana.models.core.video import Video -from aana.models.pydantic.base import BaseListModel from pydantic import BaseModel, Field, ValidationError, root_validator, validator from pydantic.error_wrappers import ErrorWrapper +from aana.models.core.video import Video +from aana.models.pydantic.base import BaseListModel + class VideoInput(BaseModel): """A video input. diff --git a/aana/tests/db/datastore/test_repo.py b/aana/tests/db/datastore/test_repo.py index a1c3e1dc..935df4be 100644 --- a/aana/tests/db/datastore/test_repo.py +++ b/aana/tests/db/datastore/test_repo.py @@ -42,7 +42,7 @@ def test_create_caption(mocked_session): caption_text = "This is the right caption text." frame_id = 32767 timestamp = 327.6 - media = MediaEntity(id=media_id, media_type=media_type) + _ = MediaEntity(id=media_id, media_type=media_type) video = VideoEntity(media_id=media_id, duration=video_duration) caption = CaptionEntity( media_id=media_id, diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index ff559203..fd991637 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -1,6 +1,5 @@ # ruff: noqa: S101 from importlib import resources -from pathlib import Path import pytest from sqlalchemy.orm import Session From afe6076052004dbb4ea775ffd6e80cbf26e22c86 Mon Sep 17 00:00:00 2001 From: evanderiel Date: Thu, 14 Dec 2023 13:19:54 +0000 Subject: [PATCH 32/37] Update README & precommit hook --- .githooks/pre-commit | 4 ++-- README.md | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 08ae6de9..55bbb9ab 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -2,6 +2,6 @@ set -e # exit on error -ruff check aana -ruff format aana +poetry run ruff check aana +poetry run ruff format aana diff --git a/README.md b/README.md index e7354ea5..845d0671 100644 --- a/README.md +++ b/README.md @@ -102,10 +102,10 @@ to look for `/nas` and `/nas2`). You can read more about environment variables f ## Code Standards This project uses Ruff for linting and formatting. If you want to -manually run Ruff on the codebase, it's +manually run Ruff on the codebase, using poetry it's ```sh -ruff check aana +poetry run ruff check aana ``` You can automatically fix some issues with the `--fix` @@ -115,9 +115,10 @@ You can automatically fix some issues with the `--fix` To run the auto-formatter, it's ```sh -ruff format aana +poetry run ruff format aana ``` +(If you are running code in a non-poetry environment, just leave off `poetry run`.) If you want to enable this as a local pre-commit hook, additionally run the following: @@ -142,17 +143,17 @@ referred to internally as vectorstore and datastore, respectively. TBD ### Datastore -The datastore uses SQLAlchemy as an ORM layer and Alembic for migrations. Before running the project, -it is necessary to run `alembic upgrade head` to ensure the database exists and has the correct tables -and columns. If changes are made to the SQLAlchemy models, it is necessary to also create an alembic -migration that can be run to upgrade the database. The easiest way to do so is as follows: +The datastore uses SQLAlchemy as an ORM layer and Alembic for migrations. The migrations are run +automatically at startup. If changes are made to the SQLAlchemy models, it is necessary to also +create an alembic migration that can be run to upgrade the database. +The easiest way to do so is as follows: ```bash -alembic revision --autogenerate -m "" +poetry run alembic revision --autogenerate -m "" ``` ORM models referenced in the rest of the code should be imported from `aana.models.db` directly, not from that model's file for reasons explained in `aana/models/db/__init__.py`. This also means that -if you add a new model class, it should be added to `__init__.py` in addition to creating a migration. +if you add a new model class, it should be imported by `__init__.py` in addition to creating a migration. Higher level code for interacting with the ORM is available in `aana.repository.data`. \ No newline at end of file From 763f6ee9a50ae09668ee99d6ab027fca912267c9 Mon Sep 17 00:00:00 2001 From: evanderiel Date: Thu, 14 Dec 2023 13:27:38 +0000 Subject: [PATCH 33/37] Ruff format for db init --- .../versions/b5a993b53e6c_initialize.py | 236 ++++++++++++++---- 1 file changed, 186 insertions(+), 50 deletions(-) diff --git a/aana/alembic/versions/b5a993b53e6c_initialize.py b/aana/alembic/versions/b5a993b53e6c_initialize.py index 15affc4a..a0d25a92 100644 --- a/aana/alembic/versions/b5a993b53e6c_initialize.py +++ b/aana/alembic/versions/b5a993b53e6c_initialize.py @@ -11,7 +11,7 @@ from alembic import op # revision identifiers, used by Alembic. -revision: str = 'b5a993b53e6c' +revision: str = "b5a993b53e6c" down_revision: str | None = None branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None @@ -20,54 +20,190 @@ def upgrade() -> None: """Upgrade database to this revision from previous.""" # ### commands auto generated by Alembic - please adjust! ### - op.create_table('media', - sa.Column('id', sa.String(), nullable=False), - sa.Column('media_type', sa.String(), nullable=True, comment='The type of media'), - sa.Column('video_id', sa.Integer(), nullable=True, comment='If media_type is `video`, the id of the video this entry represents.'), - sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), - sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), - sa.ForeignKeyConstraint(['video_id'], ['video.id'], ), - sa.PrimaryKeyConstraint('id') + op.create_table( + "media", + sa.Column("id", sa.String(), nullable=False), + sa.Column( + "media_type", sa.String(), nullable=True, comment="The type of media" + ), + sa.Column( + "video_id", + sa.Integer(), + nullable=True, + comment="If media_type is `video`, the id of the video this entry represents.", + ), + sa.Column( + "create_ts", + sa.DateTime(timezone=True), + server_default=sa.text("(CURRENT_TIMESTAMP)"), + nullable=True, + comment="Timestamp when row is inserted", + ), + sa.Column( + "update_ts", + sa.DateTime(timezone=True), + nullable=True, + comment="Timestamp when row is updated", + ), + sa.ForeignKeyConstraint( + ["video_id"], + ["video.id"], + ), + sa.PrimaryKeyConstraint("id"), ) - op.create_table('video', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), - sa.Column('duration', sa.Float(), nullable=True, comment='Media duration in seconds'), - sa.Column('orig_filename', sa.String(), nullable=True, comment='Original filename'), - sa.Column('orig_url', sa.String(), nullable=True, comment='Original URL'), - sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), - sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), - sa.ForeignKeyConstraint(['media_id'], ['media.id'], ), - sa.PrimaryKeyConstraint('id') + op.create_table( + "video", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column( + "media_id", + sa.String(), + nullable=False, + comment="Foreign key to media table", + ), + sa.Column( + "duration", sa.Float(), nullable=True, comment="Media duration in seconds" + ), + sa.Column( + "orig_filename", sa.String(), nullable=True, comment="Original filename" + ), + sa.Column("orig_url", sa.String(), nullable=True, comment="Original URL"), + sa.Column( + "create_ts", + sa.DateTime(timezone=True), + server_default=sa.text("(CURRENT_TIMESTAMP)"), + nullable=True, + comment="Timestamp when row is inserted", + ), + sa.Column( + "update_ts", + sa.DateTime(timezone=True), + nullable=True, + comment="Timestamp when row is updated", + ), + sa.ForeignKeyConstraint( + ["media_id"], + ["media.id"], + ), + sa.PrimaryKeyConstraint("id"), ) - op.create_table('captions', - sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), - sa.Column('model', sa.String(), nullable=False, comment='Name of model used to generate the caption'), - sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), - sa.Column('video_id', sa.Integer(), nullable=False, comment='Foreign key to video table'), - sa.Column('frame_id', sa.Integer(), nullable=True, comment='The 0-based frame id of video for caption'), - sa.Column('caption', sa.String(), nullable=True, comment='Frame caption'), - sa.Column('timestamp', sa.Float(), nullable=True, comment='Frame timestamp in seconds'), - sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), - sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), - sa.ForeignKeyConstraint(['media_id'], ['media.id'], ), - sa.ForeignKeyConstraint(['video_id'], ['video.id'], ), - sa.PrimaryKeyConstraint('id') + op.create_table( + "captions", + sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), + sa.Column( + "model", + sa.String(), + nullable=False, + comment="Name of model used to generate the caption", + ), + sa.Column( + "media_id", + sa.String(), + nullable=False, + comment="Foreign key to media table", + ), + sa.Column( + "video_id", + sa.Integer(), + nullable=False, + comment="Foreign key to video table", + ), + sa.Column( + "frame_id", + sa.Integer(), + nullable=True, + comment="The 0-based frame id of video for caption", + ), + sa.Column("caption", sa.String(), nullable=True, comment="Frame caption"), + sa.Column( + "timestamp", sa.Float(), nullable=True, comment="Frame timestamp in seconds" + ), + sa.Column( + "create_ts", + sa.DateTime(timezone=True), + server_default=sa.text("(CURRENT_TIMESTAMP)"), + nullable=True, + comment="Timestamp when row is inserted", + ), + sa.Column( + "update_ts", + sa.DateTime(timezone=True), + nullable=True, + comment="Timestamp when row is updated", + ), + sa.ForeignKeyConstraint( + ["media_id"], + ["media.id"], + ), + sa.ForeignKeyConstraint( + ["video_id"], + ["video.id"], + ), + sa.PrimaryKeyConstraint("id"), ) - op.create_table('transcripts', - sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), - sa.Column('model', sa.String(), nullable=False, comment='Name of model used to generate transcript'), - sa.Column('media_id', sa.String(), nullable=False, comment='Foreign key to media table'), - sa.Column('video_id', sa.Integer(), nullable=False, comment='Foreign key to video table'), - sa.Column('transcript', sa.String(), nullable=True, comment='Full text transcript of media'), - sa.Column('segments', sa.JSON(), nullable=True, comment='Segments of the transcript'), - sa.Column('language', sa.String(), nullable=True, comment='Language of the transcript as predicted by model'), - sa.Column('language_confidence', sa.Float(), nullable=True, comment='Confidence score of language prediction'), - sa.Column('create_ts', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True, comment='Timestamp when row is inserted'), - sa.Column('update_ts', sa.DateTime(timezone=True), nullable=True, comment='Timestamp when row is updated'), - sa.ForeignKeyConstraint(['media_id'], ['media.id'], ), - sa.ForeignKeyConstraint(['video_id'], ['video.id'], ), - sa.PrimaryKeyConstraint('id') + op.create_table( + "transcripts", + sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), + sa.Column( + "model", + sa.String(), + nullable=False, + comment="Name of model used to generate transcript", + ), + sa.Column( + "media_id", + sa.String(), + nullable=False, + comment="Foreign key to media table", + ), + sa.Column( + "video_id", + sa.Integer(), + nullable=False, + comment="Foreign key to video table", + ), + sa.Column( + "transcript", + sa.String(), + nullable=True, + comment="Full text transcript of media", + ), + sa.Column( + "segments", sa.JSON(), nullable=True, comment="Segments of the transcript" + ), + sa.Column( + "language", + sa.String(), + nullable=True, + comment="Language of the transcript as predicted by model", + ), + sa.Column( + "language_confidence", + sa.Float(), + nullable=True, + comment="Confidence score of language prediction", + ), + sa.Column( + "create_ts", + sa.DateTime(timezone=True), + server_default=sa.text("(CURRENT_TIMESTAMP)"), + nullable=True, + comment="Timestamp when row is inserted", + ), + sa.Column( + "update_ts", + sa.DateTime(timezone=True), + nullable=True, + comment="Timestamp when row is updated", + ), + sa.ForeignKeyConstraint( + ["media_id"], + ["media.id"], + ), + sa.ForeignKeyConstraint( + ["video_id"], + ["video.id"], + ), + sa.PrimaryKeyConstraint("id"), ) # ### end Alembic commands ### @@ -75,8 +211,8 @@ def upgrade() -> None: def downgrade() -> None: """Downgrade database from this revision to previous.""" # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('transcripts') - op.drop_table('captions') - op.drop_table('video') - op.drop_table('media') + op.drop_table("transcripts") + op.drop_table("captions") + op.drop_table("video") + op.drop_table("media") # ### end Alembic commands ### From 271661e5bc01a3ee5253c7b01026d12c4fb2a04e Mon Sep 17 00:00:00 2001 From: evanderiel Date: Thu, 14 Dec 2023 20:34:26 +0000 Subject: [PATCH 34/37] PR feedback: remove need for video_id in nodes --- aana/api/app.py | 3 -- aana/configs/endpoints.py | 2 +- aana/configs/pipeline.py | 15 --------- aana/models/db/transcript.py | 3 +- aana/repository/datastore/video_repo.py | 23 ++++++++++++++ aana/tests/db/datastore/test_utils.py | 9 ++---- aana/utils/db.py | 42 ++++++++++++------------- 7 files changed, 50 insertions(+), 47 deletions(-) diff --git a/aana/api/app.py b/aana/api/app.py index 765aab75..e341c1ac 100644 --- a/aana/api/app.py +++ b/aana/api/app.py @@ -22,9 +22,6 @@ async def validation_exception_handler(request: Request, exc: ValidationError): Returns: JSONResponse: JSON response with the error details """ - import traceback - - traceback.print_exception(exc) return AanaJSONResponse( status_code=422, content=ExceptionResponseModel( diff --git a/aana/configs/endpoints.py b/aana/configs/endpoints.py index f032b67f..7266cbd8 100644 --- a/aana/configs/endpoints.py +++ b/aana/configs/endpoints.py @@ -83,7 +83,7 @@ ), EndpointOutput( name="transcription_ids", output="videos_transcription_ids" - ) + ), ], ) ], diff --git a/aana/configs/pipeline.py b/aana/configs/pipeline.py index 260a24a1..7f5f8736 100644 --- a/aana/configs/pipeline.py +++ b/aana/configs/pipeline.py @@ -553,11 +553,6 @@ "key": "media_id", "path": "video.media_id", }, - { - "name": "video_id", - "key": "video_id", - "path": "video.id", - }, { "name": "video_transcriptions_info_whisper_medium", "key": "transcription_info", @@ -596,11 +591,6 @@ "key": "media_ids", "path": "video_batch.[*].media_id", }, - { - "name": "video_ids", - "key": "video_ids", - "path": "video_batch.[*].video_ids", - }, { "name": "videos_transcriptions_info_whisper_medium", "key": "transcription_info_list", @@ -639,11 +629,6 @@ "key": "media_id", "path": "video.media_id", }, - { - "name": "video_id", - "key": "video_id", - "path": "video.id", - }, { "name": "video_captions_hf_blip2_opt_2_7b", "key": "captions", diff --git a/aana/models/db/transcript.py b/aana/models/db/transcript.py index ecce16cb..7d6a5f31 100644 --- a/aana/models/db/transcript.py +++ b/aana/models/db/transcript.py @@ -1,5 +1,6 @@ from __future__ import annotations # Let classes use themselves in type annotations +import json from typing import TYPE_CHECKING from sqlalchemy import JSON, CheckConstraint, Column, Float, ForeignKey, Integer, String @@ -68,5 +69,5 @@ def from_asr_output( language=info.language, language_confidence=info.language_confidence, transcript=transcription.text, - segments=segments.json(), + segments=json.dumps([s.json() for s in segments]), ) diff --git a/aana/repository/datastore/video_repo.py b/aana/repository/datastore/video_repo.py index 95136125..0e7b78d7 100644 --- a/aana/repository/datastore/video_repo.py +++ b/aana/repository/datastore/video_repo.py @@ -1,5 +1,8 @@ +from sqlalchemy import select from sqlalchemy.orm import Session +from aana.configs.db import media_id_type +from aana.exceptions.database import NotFoundException from aana.models.db import VideoEntity from aana.repository.datastore.base import BaseRepository @@ -10,3 +13,23 @@ class VideoRepository(BaseRepository[VideoEntity]): def __init__(self, session: Session): """Constructor.""" super().__init__(session, VideoEntity) + + def get_by_media_id(self, media_id: media_id_type) -> VideoEntity: + """Fetches a video by media_id. + + Args: + media_id (media_id_type): Media ID to query. + + Raises: + NotFoundException: if no entry in the VideoEntity table matching that media_id is found. + + Returns: + VideoEntity: the video. + """ + statement = select(self.model_class).where( + self.model_class.media_id == media_id + ) + entity = self.session.scalars(statement).first() + if not entity: + raise NotFoundException(self.table_name, media_id) + return entity diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index fd991637..e8b8e969 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -87,9 +87,8 @@ def test_save_transcripts_batch(mock_session): ) ] * 2 segments = [AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3)] * 2 - video_ids = [0, 1] result = save_transcripts_batch( - model, media_ids, video_ids, transcription_infos, transcripts, segments + model, media_ids, transcription_infos, transcripts, segments ) result_ids = result["transcript_ids"] @@ -106,7 +105,6 @@ def test_save_transcripts_batch(mock_session): def test_save_transcripts_single(mock_session): """Tests save transcripts function.""" media_id = "0" - video_id = 0 model = "test_model" texts = ("A transcript", "Another transcript", "A third transcript") infos = [("en", 0.5), ("de", 0.36), ("fr", 0.99)] @@ -121,7 +119,7 @@ def test_save_transcripts_single(mock_session): ) segments = AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3) result = save_video_transcripts( - model, media_id, video_id, transcription_infos, transcripts, segments + model, media_id, transcription_infos, transcripts, segments ) result_ids = result["transcript_ids"] @@ -160,7 +158,6 @@ def test_save_captions_batch(mock_session): def test_save_captions_single(mock_session): """Tests save captions function.""" media_id = "0" - video_id = 0 model_name = "test_model" captions = ["A caption", "Another caption", "A third caption"] captions_list = CaptionsList( @@ -170,7 +167,7 @@ def test_save_captions_single(mock_session): frame_ids = [0, 1, 2] result = save_video_captions( - model_name, media_id, video_id, captions_list, timestamps, frame_ids + model_name, media_id, captions_list, timestamps, frame_ids ) assert ( diff --git a/aana/utils/db.py b/aana/utils/db.py index b93ff2cf..0cdf6336 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -133,16 +133,16 @@ def save_captions_batch( def save_video_captions( model_name: str, media_id: media_id_type, - video_id: int, captions: CaptionsList, timestamps: list[float], frame_ids: list[int], ) -> dict: """Save captions.""" with Session(engine) as session: + video_entity = VideoRepository(session).get_by_media_id(media_id) entities = [ CaptionEntity.from_caption_output( - model_name, media_id, video_id, frame_id, timestamp, caption + model_name, media_id, video_entity.id, frame_id, timestamp, caption ) for caption, timestamp, frame_id in zip( captions, timestamps, frame_ids, strict=True @@ -159,53 +159,53 @@ def save_video_captions( def save_transcripts_batch( model_name: str, media_ids: list[media_id_type], - video_ids: list[int], - transcript_info_list: list[AsrTranscriptionInfoList], - transcripts_list: list[AsrTranscriptionList], + transcription_info_list: list[AsrTranscriptionInfoList], + transcription_list: list[AsrTranscriptionList], segments_list: list[AsrSegments], ) -> dict: """Save transcripts batch.""" with Session(engine) as session: + video_repo = VideoRepository(session) entities = [ TranscriptEntity.from_asr_output( - model_name, media_id, video_id, info, txn, seg + model_name, + media_id, + video_repo.get_by_media_id(media_id).id, + transcript_info, + transcript, + segments, ) - for media_id, video_id, transcript_infos, transcripts, segments in zip( + for media_id, transcript_info, transcript, segments in zip( media_ids, - video_ids, - transcript_info_list, - transcripts_list, + transcription_info_list, + transcription_list, segments_list, strict=True, ) - for info, txn, seg in zip( - transcript_infos, transcripts, segments, strict=True - ) ] - repo = TranscriptRepository(session) entities = repo.create_multiple(entities) return { - "transcript_ids": [c.id for c in entities] # type: ignore + "transcription_ids": [c.id for c in entities] # type: ignore } def save_video_transcripts( model_name: str, media_id: media_id_type, - video_id: int, - transcript_infos: AsrTranscriptionInfoList, - transcripts: AsrTranscriptionList, + transcription_info: AsrTranscriptionInfoList, + transcription: AsrTranscriptionList, segments: AsrSegments, ) -> dict: """Save transcripts.""" with Session(engine) as session: + video_entity = VideoRepository(session).get_by_media_id(media_id) entities = [ TranscriptEntity.from_asr_output( - model_name, media_id, video_id, info, txn, seg + model_name, media_id, video_entity.id, info, txn, seg ) for info, txn, seg in zip( - transcript_infos, transcripts, segments, strict=True + transcription_info, transcription, segments, strict=True ) ] @@ -213,5 +213,5 @@ def save_video_transcripts( entities = repo.create_multiple(entities) print(len(entities)) return { - "transcript_ids": [c.id for c in entities] # type: ignore + "transcription_ids": [c.id for c in entities] # type: ignore } From 5144b9145be4be7264bd2ee71c7d7dc0deb7cfea Mon Sep 17 00:00:00 2001 From: evanderiel Date: Thu, 14 Dec 2023 21:18:06 +0000 Subject: [PATCH 35/37] Pr feedback: disable importlib mode in CI tests --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index e8809a07..5c4e0948 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -38,4 +38,4 @@ jobs: sudo apt-get update sudo apt-get install ffmpeg - name: Test with pytest - run: poetry run pytest --import-mode=importlib + run: poetry run pytest From 129f72d45c039ebded264c5d878d5f4cd24a5616 Mon Sep 17 00:00:00 2001 From: evanderiel Date: Fri, 15 Dec 2023 10:31:02 +0000 Subject: [PATCH 36/37] Fix db tests and type annotations --- aana/tests/db/datastore/test_utils.py | 40 +++++++++++++++------------ aana/utils/db.py | 9 ++++-- 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/aana/tests/db/datastore/test_utils.py b/aana/tests/db/datastore/test_utils.py index e8b8e969..64a7a9ee 100644 --- a/aana/tests/db/datastore/test_utils.py +++ b/aana/tests/db/datastore/test_utils.py @@ -6,6 +6,7 @@ from aana.models.core.video import Video from aana.models.pydantic.asr_output import ( + AsrSegment, AsrSegments, AsrSegmentsList, AsrTranscription, @@ -14,6 +15,7 @@ AsrTranscriptionList, ) from aana.models.pydantic.captions import Caption, CaptionsList +from aana.models.pydantic.time_interval import TimeInterval from aana.utils.db import ( save_captions_batch, save_transcripts_batch, @@ -71,32 +73,34 @@ def test_save_videos_batch(mock_session): def test_save_transcripts_batch(mock_session): """Tests save transcripts function.""" - media_ids = ["0", "1"] + media_ids = ["0", "1", "2"] model = "test_model" texts = ("A transcript", "Another transcript", "A third transcript") infos = [("en", 0.5), ("de", 0.36), ("fr", 0.99)] - transcripts = [ - AsrTranscriptionList(__root__=[AsrTranscription(text=text) for text in texts]) - ] * 2 + transcripts = [AsrTranscription(text=text) for text in texts] transcription_infos = [ - AsrTranscriptionInfoList( - __root__=[ - AsrTranscriptionInfo(language=lang, language_confidence=conf) - for lang, conf in infos - ] - ) - ] * 2 - segments = [AsrSegmentsList(__root__=[AsrSegments(__root__=[])] * 3)] * 2 + AsrTranscriptionInfo(language=lang, language_confidence=conf) + for lang, conf in infos + ] + segments = [ + [ + AsrSegment( + text="", + time_interval=TimeInterval(start=0, end=1), + confidence=0.99, + no_speech_confidence=0.1, + ) + ] + * 5 + ] * 3 result = save_transcripts_batch( model, media_ids, transcription_infos, transcripts, segments ) - result_ids = result["transcript_ids"] + print(result) + result_ids = result["transcription_ids"] assert ( - len(result_ids) - == len(transcripts[0]) + len(transcripts[1]) - == len(transcription_infos[0]) + len(transcription_infos[1]) - == len(segments[0]) + len(segments[1]) + len(result_ids) == len(transcripts) == len(transcription_infos) == len(segments) ) mock_session.context_var.add_all.assert_called_once() mock_session.context_var.commit.assert_called_once() @@ -121,7 +125,7 @@ def test_save_transcripts_single(mock_session): result = save_video_transcripts( model, media_id, transcription_infos, transcripts, segments ) - result_ids = result["transcript_ids"] + result_ids = result["transcription_ids"] assert ( len(result_ids) == len(transcripts) == len(transcription_infos) == len(segments) diff --git a/aana/utils/db.py b/aana/utils/db.py index 0cdf6336..21c601ed 100644 --- a/aana/utils/db.py +++ b/aana/utils/db.py @@ -14,7 +14,10 @@ VideoEntity, ) from aana.models.pydantic.asr_output import ( + AsrSegment, AsrSegments, + AsrTranscription, + AsrTranscriptionInfo, AsrTranscriptionInfoList, AsrTranscriptionList, ) @@ -159,9 +162,9 @@ def save_video_captions( def save_transcripts_batch( model_name: str, media_ids: list[media_id_type], - transcription_info_list: list[AsrTranscriptionInfoList], - transcription_list: list[AsrTranscriptionList], - segments_list: list[AsrSegments], + transcription_info_list: list[AsrTranscriptionInfo], + transcription_list: list[AsrTranscription], + segments_list: list[list[AsrSegment]], ) -> dict: """Save transcripts batch.""" with Session(engine) as session: From 28eb1a93ea3c6a5543b174719eeb616b0d1f39de Mon Sep 17 00:00:00 2001 From: evanderiel Date: Fri, 15 Dec 2023 10:41:46 +0000 Subject: [PATCH 37/37] Ruff fix --- aana/tests/test_chat_template.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/aana/tests/test_chat_template.py b/aana/tests/test_chat_template.py index 814f7569..a9dd7eb8 100644 --- a/aana/tests/test_chat_template.py +++ b/aana/tests/test_chat_template.py @@ -39,13 +39,10 @@ def test_chat_template_custom(): prompt = apply_chat_template( tokenizer, dialog, "llama2" ) # Apply custom chat template "llama2" - assert ( # noqa: S101 - prompt - == ( - "[INST] <>\\nYou are a friendly chatbot who always responds in the style " - "of a pirate\\n<>\\n\\nHow many helicopters can a human eat in one sitting? " - "[/INST] I don't know, how many? [INST] One, but only if they're really hungry! [/INST]" - ) + assert prompt == ( + "[INST] <>\\nYou are a friendly chatbot who always responds in the style " + "of a pirate\\n<>\\n\\nHow many helicopters can a human eat in one sitting? " + "[/INST] I don't know, how many? [INST] One, but only if they're really hungry! [/INST]" )