diff --git a/datashare-python/datashare_python/config.py b/datashare-python/datashare_python/config.py index 15cc2224..962bddb8 100644 --- a/datashare-python/datashare_python/config.py +++ b/datashare-python/datashare_python/config.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import ClassVar +from typing import Annotated, Literal from icij_common.es import ESClient from icij_common.pydantic_utils import ICIJSettings @@ -18,7 +18,6 @@ from .objects import BaseModel from .task_client import DatashareTaskClient from .types_ import TemporalClient -from .utils import LogWithWorkerIDMixin _ALL_LOGGERS = [datashare_python.__name__] @@ -76,11 +75,20 @@ async def to_client(self) -> TemporalClient: return self._client -class WorkerConfig(ICIJSettings, LogWithWorkerIDMixin, BaseModel): +LogLevel = Literal["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"] + + +class LoggingConfig(BaseModel): + log_in_json: bool = False + loggers: dict[str, LogLevel] + + +class WorkerConfig(ICIJSettings, BaseModel): model_config = DS_WORKER_SETTINGS_CONFIG - loggers: ClassVar[list[str]] = Field(_ALL_LOGGERS, frozen=True) - log_level: str = Field(default="INFO") + logging: Annotated[LoggingConfig, Field(frozen=True)] = { + datashare_python.__name__: "INFO" + } datashare: DatashareClientConfig = DatashareClientConfig() elasticsearch: ESClientConfig = ESClientConfig() diff --git a/datashare-python/datashare_python/conftest.py b/datashare-python/datashare_python/conftest.py index 6aabfbeb..4692ca55 100644 --- a/datashare-python/datashare_python/conftest.py +++ b/datashare-python/datashare_python/conftest.py @@ -12,6 +12,7 @@ from datashare_python.config import ( DatashareClientConfig, + LoggingConfig, TemporalClientConfig, WorkerConfig, ) @@ -19,10 +20,7 @@ lifespan_es_client, lifespan_task_client, set_es_client, - set_event_loop, - set_loggers, set_task_client, - set_temporal_client, with_dependencies, ) from datashare_python.objects import Document, TaskState @@ -78,13 +76,7 @@ async def run(self) -> None: @pytest.fixture(scope="session") def test_deps() -> list[ContextManagerFactory]: - return [ - set_loggers, - set_event_loop, - set_es_client, - set_temporal_client, - set_task_client, - ] + return [set_es_client, set_task_client] @pytest.fixture(scope="session") @@ -99,8 +91,16 @@ def event_loop( @pytest.fixture(scope="session") def test_worker_config() -> WorkerConfig: + logging_config = LoggingConfig( + log_in_json=False, + loggers={ + "datashare_python": "DEBUG", + "icij_common": "DEBUG", + "worker_template": "DEBUG", + }, + ) return WorkerConfig( - log_level="DEBUG", + logging=logging_config, datashare=DatashareClientConfig(url="http://localhost:8080"), temporal=TemporalClientConfig(host="localhost:7233"), ) diff --git a/datashare-python/datashare_python/dependencies.py b/datashare-python/datashare_python/dependencies.py index 49360776..5a9201d6 100644 --- a/datashare-python/datashare_python/dependencies.py +++ b/datashare-python/datashare_python/dependencies.py @@ -9,8 +9,9 @@ from icij_common.es import ESClient -from .config import WorkerConfig +from .config import LogLevel, WorkerConfig from .exceptions import DependencyInjectionError +from .logging_ import setup_worker_loggers from .task_client import DatashareTaskClient from .types_ import ContextManagerFactory, TemporalClient @@ -35,10 +36,13 @@ def lifespan_event_loop() -> AbstractEventLoop: raise DependencyInjectionError("event loop") from e -def set_loggers(worker_config: WorkerConfig, worker_id: str) -> None: - worker_config.setup_loggers(worker_id=worker_id) +def set_loggers( + worker_config: WorkerConfig, worker_id: str, loggers: dict[str, LogLevel] +) -> None: + setup_worker_loggers( + loggers=loggers, worker_id=worker_id, in_json=worker_config.logging.log_in_json + ) logger.info("worker loggers ready to log 💬") - logger.info("app config: %s", worker_config.model_dump_json(indent=2)) def set_worker_config(worker_config: WorkerConfig) -> None: diff --git a/datashare-python/datashare_python/discovery.py b/datashare-python/datashare_python/discovery.py index 14288a2d..0acf9ee5 100644 --- a/datashare-python/datashare_python/discovery.py +++ b/datashare-python/datashare_python/discovery.py @@ -4,7 +4,7 @@ from importlib.metadata import entry_points from .config import WorkerConfig -from .dependencies import set_worker_config +from .dependencies import set_loggers, set_worker_config from .types_ import ContextManagerFactory from .utils import ActivityWithProgress @@ -29,6 +29,8 @@ type[WorkerConfig], ] +_MANDATORY_DEPS = [set_worker_config, set_loggers] + def discover( wf_names: list[str] | None, *, act_names: list[str] | None, deps_name: str | None @@ -68,8 +70,9 @@ def discover( deps = [] if deps_name is not None: deps = discover_dependencies(deps_name) - if set_worker_config not in deps: - deps.append(set_worker_config) + for mandatory in _MANDATORY_DEPS: + if mandatory not in deps: + deps.append(mandatory) if deps: n_deps = len(deps) discovered += "\n" diff --git a/datashare-python/datashare_python/logging_.py b/datashare-python/datashare_python/logging_.py new file mode 100644 index 00000000..944a7ad2 --- /dev/null +++ b/datashare-python/datashare_python/logging_.py @@ -0,0 +1,87 @@ +import logging +import sys +from copy import copy + +from icij_common.logging_utils import ( + DATE_FMT, + STREAM_HANDLER_FMT, + STREAM_HANDLER_FMT_WITH_WORKER_ID, +) +from pythonjsonlogger.core import RESERVED_ATTRS, BaseJsonFormatter +from pythonjsonlogger.orjson import OrjsonFormatter +from temporalio import activity, workflow + +from .config import LogLevel + +_ACT_LOGGER_ATTRS = [ + "activity_type", + "activity_id", + "activity_run_id", +] + +_WF_LOGGED_ATTRS = [ + "workflow_type", + "workflow_id", + "workflow_run_id", +] +_LOGGED_ATTRIBUTES = ( + copy(RESERVED_ATTRS) + _WF_LOGGED_ATTRS + _ACT_LOGGER_ATTRS + ["worker_id"] +) + + +def setup_worker_loggers( + loggers: dict[str, LogLevel], *, worker_id: str | None, in_json: bool +) -> None: + worker_filter = WorkerFilter(worker_id) + for logger_name, level_str in loggers.items(): + level = getattr(logging, level_str) + logger = logging.getLogger(logger_name) + logger.setLevel(level) + logger.handlers = [] + for handler in _get_worker_handlers(level, worker_id, in_json=in_json): + logger.addHandler(handler) + logger.addFilter(worker_filter) + + +def _get_worker_handlers( + level: int, worker_id: str | None, *, in_json: bool +) -> list[logging.Handler]: + stream_handler = logging.StreamHandler(sys.stderr) + if in_json: + fmt = _json_formatter(datefmt=DATE_FMT, worker_id=worker_id) + else: + if worker_id is not None: + fmt = STREAM_HANDLER_FMT_WITH_WORKER_ID + else: + fmt = STREAM_HANDLER_FMT + fmt = logging.Formatter(fmt, DATE_FMT) + stream_handler.setFormatter(fmt) + stream_handler.setLevel(level) + return [stream_handler] + + +class WorkerFilter(logging.Filter): + def __init__(self, worker_id: str) -> None: + super().__init__() + self._worker_id = worker_id + + def filter(self, record: logging.LogRecord) -> bool: + record.worker_id = self._worker_id + if workflow.in_workflow(): + wf_info = workflow.info() + for attr in _WF_LOGGED_ATTRS: + setattr(record, attr, getattr(wf_info, attr)) + if activity.in_activity(): + act_info = activity.info() + for attr in _ACT_LOGGER_ATTRS: + setattr(record, attr, getattr(act_info, attr)) + return True + + +def _json_formatter(datefmt: str, worker_id: str) -> BaseJsonFormatter: + fmt = OrjsonFormatter( # let's keep logging as fast as possible + _LOGGED_ATTRIBUTES, + extra={"worker_id": worker_id}, + datefmt=datefmt, + ) + return fmt diff --git a/datashare-python/datashare_python/worker.py b/datashare-python/datashare_python/worker.py index 84ea147f..ee4452be 100644 --- a/datashare-python/datashare_python/worker.py +++ b/datashare-python/datashare_python/worker.py @@ -8,6 +8,7 @@ from collections.abc import AsyncGenerator, Callable from concurrent.futures import ThreadPoolExecutor from contextlib import asynccontextmanager +from copy import copy from typing import Any from temporalio.worker import PollerBehaviorSimpleMaximum, Worker @@ -142,12 +143,27 @@ async def worker_context( task_queue: str, dependencies: list[ContextManagerFactory] | None = None, ) -> AsyncGenerator[DatashareWorker, None]: + discovered = [] + if activities is not None: + discovered.extend(activities) + if workflows is not None: + discovered.extend(workflows) + if dependencies is not None: + discovered.extend(dependencies) + discovered.append(worker_config) + loggers = copy(worker_config.logging.loggers) + discovered_loggers = {_get_object_package(o).__name__ for o in discovered} + for logger in discovered_loggers: + if logger not in loggers: + # Log in info by default + loggers[logger] = "INFO" deps_cm = ( with_dependencies( dependencies, worker_config=worker_config, worker_id=worker_id, event_loop=event_loop, + loggers=loggers, ) if dependencies else _do_nothing_cm() @@ -181,3 +197,9 @@ def _get_class_from_method(method: Callable) -> type: class_name = method.__qualname__.rsplit(".", 1)[0] module = sys.modules[method.__module__] return getattr(module, class_name) + + +def _get_object_package(obj: Any) -> Any: + mod = inspect.getmodule(obj) + base, _, _ = mod.__name__.partition(".") + return sys.modules[base] diff --git a/datashare-python/pyproject.toml b/datashare-python/pyproject.toml index 8dae9c49..d3ff2030 100644 --- a/datashare-python/pyproject.toml +++ b/datashare-python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "datashare-python" -version = "0.6.3" +version = "0.7.0" description = "Manage Pythoœn tasks and local resources in Datashare" authors = [ { name = "Clément Doumouro", email = "cdoumouro@icij.org" }, @@ -10,16 +10,17 @@ authors = [ readme = "README.md" requires-python = ">=3.11,<4" dependencies = [ - "alive-progress~=3.2.0", - "aiohttp~=3.11.9", + "alive-progress~=3.2", + "aiohttp~=3.11", "icij-common[elasticsearch]~=0.8.2", - "python-json-logger~=4.0.0", - "nest-asyncio~=1.6.0", - "temporalio~=1.23.0", + "python-json-logger~=4.0", + "nest-asyncio~=1.6", + "temporalio~=1.23", "typer~=0.15.4", "tomlkit~=0.14.0", - "hatchling~=1.27.0", + "hatchling~=1.27", "pyyaml~=6.0", + "orjson~=3.11", ] [project.urls] diff --git a/datashare-python/uv.lock b/datashare-python/uv.lock index 7673088e..5c9f324f 100644 --- a/datashare-python/uv.lock +++ b/datashare-python/uv.lock @@ -401,6 +401,7 @@ dependencies = [ { name = "hatchling" }, { name = "icij-common", extra = ["elasticsearch"] }, { name = "nest-asyncio" }, + { name = "orjson" }, { name = "python-json-logger" }, { name = "pyyaml" }, { name = "temporalio" }, @@ -425,14 +426,15 @@ dev = [ [package.metadata] requires-dist = [ - { name = "aiohttp", specifier = "~=3.11.9" }, - { name = "alive-progress", specifier = "~=3.2.0" }, - { name = "hatchling", specifier = "~=1.27.0" }, + { name = "aiohttp", specifier = "~=3.11" }, + { name = "alive-progress", specifier = "~=3.2" }, + { name = "hatchling", specifier = "~=1.27" }, { name = "icij-common", extras = ["elasticsearch"], specifier = "~=0.8.2" }, - { name = "nest-asyncio", specifier = "~=1.6.0" }, - { name = "python-json-logger", specifier = "~=4.0.0" }, + { name = "nest-asyncio", specifier = "~=1.6" }, + { name = "orjson", specifier = "~=3.11" }, + { name = "python-json-logger", specifier = "~=4.0" }, { name = "pyyaml", specifier = "~=6.0" }, - { name = "temporalio", specifier = "~=1.23.0" }, + { name = "temporalio", specifier = "~=1.23" }, { name = "tomlkit", specifier = "~=0.14.0" }, { name = "typer", specifier = "~=0.15.4" }, ] diff --git a/worker-template/pyproject.toml b/worker-template/pyproject.toml index ef237e52..e30182dd 100644 --- a/worker-template/pyproject.toml +++ b/worker-template/pyproject.toml @@ -9,7 +9,7 @@ authors = [ readme = "README.md" requires-python = ">=3.11,<4" dependencies = [ - "datashare-python~=0.6.2", + "datashare-python~=0.7.0", "pycountry~=26.2.16", "temporalio~=1.23.0", ] diff --git a/worker-template/tests/conftest.py b/worker-template/tests/conftest.py index 40c29df1..f51da8a0 100644 --- a/worker-template/tests/conftest.py +++ b/worker-template/tests/conftest.py @@ -4,9 +4,11 @@ from collections.abc import AsyncGenerator from typing import Any +import datashare_python import pytest from datashare_python.config import ( DatashareClientConfig, + LoggingConfig, TemporalClientConfig, WorkerConfig, ) @@ -49,8 +51,11 @@ @pytest.fixture(scope="session") def test_worker_config() -> TranslateAndClassifyWorkerConfig: + logging_config = LoggingConfig( + loggers={datashare_python.__name__: "INFO", __name__: "INFO"}, log_in_json=False + ) return TranslateAndClassifyWorkerConfig( - log_level="DEBUG", + logging=logging_config, datashare=DatashareClientConfig(url="http://localhost:8080"), temporal=TemporalClientConfig(host="localhost:7233"), ) diff --git a/worker-template/uv.dist.lock b/worker-template/uv.dist.lock index ae67aacf..28120314 100644 --- a/worker-template/uv.dist.lock +++ b/worker-template/uv.dist.lock @@ -316,7 +316,7 @@ wheels = [ [[package]] name = "datashare-python" -version = "0.6.2" +version = "0.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -330,9 +330,9 @@ dependencies = [ { name = "tomlkit" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a0/20/095049cb543235e81c3d0fe9bce31666a3b799782df9fb88198abbea9757/datashare_python-0.6.2.tar.gz", hash = "sha256:2630969c77602a427cb0a784d0896c83e2a071729f440cee25b3945f7f9caba6", size = 299884, upload-time = "2026-04-21T11:58:44.616Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/88/9d2e2431cf332ed6c272fae5a2f00d298d26722af5d1a7204df90585fe51/datashare_python-0.6.3.tar.gz", hash = "sha256:97308d087c094cbe737127dde6abf0324a39715a91a77e75182c368f09182dbf", size = 300154, upload-time = "2026-04-21T14:25:57.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/fd/00cdbcdb2325b62aec3ec78199864531ff08b77ff1f3b33942a79f142908/datashare_python-0.6.2-py3-none-any.whl", hash = "sha256:5578c92b12c321ef1f0dc42473c106cbbe6068d134f866896a4236105a342d66", size = 304735, upload-time = "2026-04-21T11:58:43.504Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ea/ba0f73cfaa3394b3e70e6bf2c67cdcef21e4829cba95b1cee7740482f1a9/datashare_python-0.6.3-py3-none-any.whl", hash = "sha256:d8ed28175fa8530b94f90f586faf9d84cf60e4701d966ba4f5bbe46fcd06d6f2", size = 304978, upload-time = "2026-04-21T14:25:55.929Z" }, ] [[package]] diff --git a/worker-template/uv.lock b/worker-template/uv.lock index 9918d2c3..d704c6c4 100644 --- a/worker-template/uv.lock +++ b/worker-template/uv.lock @@ -316,7 +316,7 @@ wheels = [ [[package]] name = "datashare-python" -version = "0.6.3" +version = "0.7.0" source = { editable = "../datashare-python" } dependencies = [ { name = "aiohttp" }, @@ -324,6 +324,7 @@ dependencies = [ { name = "hatchling" }, { name = "icij-common", extra = ["elasticsearch"] }, { name = "nest-asyncio" }, + { name = "orjson" }, { name = "python-json-logger" }, { name = "pyyaml" }, { name = "temporalio" }, @@ -333,14 +334,15 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "aiohttp", specifier = "~=3.11.9" }, - { name = "alive-progress", specifier = "~=3.2.0" }, - { name = "hatchling", specifier = "~=1.27.0" }, + { name = "aiohttp", specifier = "~=3.11" }, + { name = "alive-progress", specifier = "~=3.2" }, + { name = "hatchling", specifier = "~=1.27" }, { name = "icij-common", extras = ["elasticsearch"], specifier = "~=0.8.2" }, - { name = "nest-asyncio", specifier = "~=1.6.0" }, - { name = "python-json-logger", specifier = "~=4.0.0" }, + { name = "nest-asyncio", specifier = "~=1.6" }, + { name = "orjson", specifier = "~=3.11" }, + { name = "python-json-logger", specifier = "~=4.0" }, { name = "pyyaml", specifier = "~=6.0" }, - { name = "temporalio", specifier = "~=1.23.0" }, + { name = "temporalio", specifier = "~=1.23" }, { name = "tomlkit", specifier = "~=0.14.0" }, { name = "typer", specifier = "~=0.15.4" }, ] @@ -1145,6 +1147,74 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" }, ] +[[package]] +name = "orjson" +version = "3.11.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/1b/2024d06792d0779f9dbc51531b61c24f76c75b9f4ce05e6f3377a1814cea/orjson-3.11.8.tar.gz", hash = "sha256:96163d9cdc5a202703e9ad1b9ae757d5f0ca62f4fa0cc93d1f27b0e180cc404e", size = 5603832, upload-time = "2026-03-31T16:16:27.878Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/41/5aa7fa3b0f4dc6b47dcafc3cea909299c37e40e9972feabc8b6a74e2730d/orjson-3.11.8-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:003646067cc48b7fcab2ae0c562491c9b5d2cbd43f1e5f16d98fd118c5522d34", size = 229229, upload-time = "2026-03-31T16:14:50.424Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d7/57e7f2458e0a2c41694f39fc830030a13053a84f837a5b73423dca1f0938/orjson-3.11.8-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ed193ce51d77a3830cad399a529cd4ef029968761f43ddc549e1bc62b40d88f8", size = 128871, upload-time = "2026-03-31T16:14:51.888Z" }, + { url = "https://files.pythonhosted.org/packages/53/4a/e0fdb9430983e6c46e0299559275025075568aad5d21dd606faee3703924/orjson-3.11.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30491bc4f862aa15744b9738517454f1e46e56c972a2be87d70d727d5b2a8f8", size = 132104, upload-time = "2026-03-31T16:14:53.142Z" }, + { url = "https://files.pythonhosted.org/packages/08/4a/2025a60ff3f5c8522060cda46612d9b1efa653de66ed2908591d8d82f22d/orjson-3.11.8-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eda5b8b6be91d3f26efb7dc6e5e68ee805bc5617f65a328587b35255f138bf4", size = 130483, upload-time = "2026-03-31T16:14:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/2d/3c/b9cde05bdc7b2385c66014e0620627da638d3d04e4954416ab48c31196c5/orjson-3.11.8-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee8db7bfb6fe03581bbab54d7c4124a6dd6a7f4273a38f7267197890f094675f", size = 135481, upload-time = "2026-03-31T16:14:55.901Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f2/a8238e7734de7cb589fed319857a8025d509c89dc52fdcc88f39c6d03d5a/orjson-3.11.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8b5231de76c528a46b57010bbd83fb51e056aa0220a372fd5065e978406f1c", size = 146819, upload-time = "2026-03-31T16:14:57.548Z" }, + { url = "https://files.pythonhosted.org/packages/db/10/dbf1e2a3cafea673b1b4350e371877b759060d6018a998643b7040e5de48/orjson-3.11.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58a4a208a6fbfdb7a7327b8f201c6014f189f721fd55d047cafc4157af1bc62a", size = 132846, upload-time = "2026-03-31T16:14:58.91Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fc/55e667ec9c85694038fcff00573d221b085d50777368ee3d77f38668bf3c/orjson-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f8952d6d2505c003e8f0224ff7858d341fa4e33fef82b91c4ff0ef070f2393c", size = 133580, upload-time = "2026-03-31T16:15:00.519Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a6/c08c589a9aad0cb46c4831d17de212a2b6901f9d976814321ff8e69e8785/orjson-3.11.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0022bb50f90da04b009ce32c512dc1885910daa7cb10b7b0cba4505b16db82a8", size = 142042, upload-time = "2026-03-31T16:15:01.906Z" }, + { url = "https://files.pythonhosted.org/packages/5c/cc/2f78ea241d52b717d2efc38878615fe80425bf2beb6e68c984dde257a766/orjson-3.11.8-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ff51f9d657d1afb6f410cb435792ce4e1fe427aab23d2fcd727a2876e21d4cb6", size = 423845, upload-time = "2026-03-31T16:15:03.703Z" }, + { url = "https://files.pythonhosted.org/packages/70/07/c17dcf05dd8045457538428a983bf1f1127928df5bf328cb24d2b7cddacb/orjson-3.11.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6dbe9a97bdb4d8d9d5367b52a7c32549bba70b2739c58ef74a6964a6d05ae054", size = 147729, upload-time = "2026-03-31T16:15:05.203Z" }, + { url = "https://files.pythonhosted.org/packages/90/6c/0fb6e8a24e682e0958d71711ae6f39110e4b9cd8cab1357e2a89cb8e1951/orjson-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5c370674ebabe16c6ccac33ff80c62bf8a6e59439f5e9d40c1f5ab8fd2215b7", size = 136425, upload-time = "2026-03-31T16:15:07.052Z" }, + { url = "https://files.pythonhosted.org/packages/b2/35/4d3cc3a3d616035beb51b24a09bb872942dc452cf2df0c1d11ab35046d9f/orjson-3.11.8-cp311-cp311-win32.whl", hash = "sha256:0e32f7154299f42ae66f13488963269e5eccb8d588a65bc839ed986919fc9fac", size = 131870, upload-time = "2026-03-31T16:15:08.678Z" }, + { url = "https://files.pythonhosted.org/packages/13/26/9fe70f81d16b702f8c3a775e8731b50ad91d22dacd14c7599b60a0941cd1/orjson-3.11.8-cp311-cp311-win_amd64.whl", hash = "sha256:25e0c672a2e32348d2eb33057b41e754091f2835f87222e4675b796b92264f06", size = 127440, upload-time = "2026-03-31T16:15:09.994Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c6/b038339f4145efd2859c1ca53097a52c0bb9cbdd24f947ebe146da1ad067/orjson-3.11.8-cp311-cp311-win_arm64.whl", hash = "sha256:9185589c1f2a944c17e26c9925dcdbc2df061cc4a145395c57f0c51f9b5dbfcd", size = 127399, upload-time = "2026-03-31T16:15:11.412Z" }, + { url = "https://files.pythonhosted.org/packages/01/f6/8d58b32ab32d9215973a1688aebd098252ee8af1766c0e4e36e7831f0295/orjson-3.11.8-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1cd0b77e77c95758f8e1100139844e99f3ccc87e71e6fc8e1c027e55807c549f", size = 229233, upload-time = "2026-03-31T16:15:12.762Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8b/2ffe35e71f6b92622e8ea4607bf33ecf7dfb51b3619dcfabfd36cbe2d0a5/orjson-3.11.8-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:6a3d159d5ffa0e3961f353c4b036540996bf8b9697ccc38261c0eac1fd3347a6", size = 128772, upload-time = "2026-03-31T16:15:14.237Z" }, + { url = "https://files.pythonhosted.org/packages/27/d2/1f8682ae50d5c6897a563cb96bc106da8c9cb5b7b6e81a52e4cc086679b9/orjson-3.11.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76070a76e9c5ae661e2d9848f216980d8d533e0f8143e6ed462807b242e3c5e8", size = 131946, upload-time = "2026-03-31T16:15:15.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/4b/5500f76f0eece84226e0689cb48dcde081104c2fa6e2483d17ca13685ffb/orjson-3.11.8-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54153d21520a71a4c82a0dbb4523e468941d549d221dc173de0f019678cf3813", size = 130368, upload-time = "2026-03-31T16:15:17.066Z" }, + { url = "https://files.pythonhosted.org/packages/da/4e/58b927e08fbe9840e6c920d9e299b051ea667463b1f39a56e668669f8508/orjson-3.11.8-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:469ac2125611b7c5741a0b3798cd9e5786cbad6345f9f400c77212be89563bec", size = 135540, upload-time = "2026-03-31T16:15:18.404Z" }, + { url = "https://files.pythonhosted.org/packages/56/7c/ba7cb871cba1bcd5cd02ee34f98d894c6cea96353ad87466e5aef2429c60/orjson-3.11.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14778ffd0f6896aa613951a7fbf4690229aa7a543cb2bfbe9f358e08aafa9546", size = 146877, upload-time = "2026-03-31T16:15:19.833Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/eb9c25fc1386696c6a342cd361c306452c75e0b55e86ad602dd4827a7fd7/orjson-3.11.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea56a955056a6d6c550cf18b3348656a9d9a4f02e2d0c02cabf3c73f1055d506", size = 132837, upload-time = "2026-03-31T16:15:21.282Z" }, + { url = "https://files.pythonhosted.org/packages/37/87/5ddeb7fc1fbd9004aeccab08426f34c81a5b4c25c7061281862b015fce2b/orjson-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a0f57e59a530d18a142f4d4ba6dfc708dc5fdedce45e98ff06b44930a2a48f", size = 133624, upload-time = "2026-03-31T16:15:22.641Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/90048793db94ee4b2fcec4ac8e5ddb077367637d6650be896b3494b79bb7/orjson-3.11.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b48e274f8824567d74e2158199e269597edf00823a1b12b63d48462bbf5123e", size = 141904, upload-time = "2026-03-31T16:15:24.435Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cf/eb284847487821a5d415e54149a6449ba9bfc5872ce63ab7be41b8ec401c/orjson-3.11.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3f262401086a3960586af06c054609365e98407151f5ea24a62893a40d80dbbb", size = 423742, upload-time = "2026-03-31T16:15:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/09/e12423d327071c851c13e76936f144a96adacfc037394dec35ac3fc8d1e8/orjson-3.11.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8e8c6218b614badf8e229b697865df4301afa74b791b6c9ade01d19a9953a942", size = 147806, upload-time = "2026-03-31T16:15:27.909Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6d/37c2589ba864e582ffe7611643314785c6afb1f83c701654ef05daa8fcc7/orjson-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:093d489fa039ddade2db541097dbb484999fcc65fc2b0ff9819141e2ab364f25", size = 136485, upload-time = "2026-03-31T16:15:29.749Z" }, + { url = "https://files.pythonhosted.org/packages/be/c9/135194a02ab76b04ed9a10f68624b7ebd238bbe55548878b11ff15a0f352/orjson-3.11.8-cp312-cp312-win32.whl", hash = "sha256:e0950ed1bcb9893f4293fd5c5a7ee10934fbf82c4101c70be360db23ce24b7d2", size = 131966, upload-time = "2026-03-31T16:15:31.687Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9a/9796f8fbe3cf30ce9cb696748dbb535e5c87be4bf4fe2e9ca498ef1fa8cf/orjson-3.11.8-cp312-cp312-win_amd64.whl", hash = "sha256:3cf17c141617b88ced4536b2135c552490f07799f6ad565948ea07bef0dcb9a6", size = 127441, upload-time = "2026-03-31T16:15:33.333Z" }, + { url = "https://files.pythonhosted.org/packages/cc/47/5aaf54524a7a4a0dd09dd778f3fa65dd2108290615b652e23d944152bc8e/orjson-3.11.8-cp312-cp312-win_arm64.whl", hash = "sha256:48854463b0572cc87dac7d981aa72ed8bf6deedc0511853dc76b8bbd5482d36d", size = 127364, upload-time = "2026-03-31T16:15:34.748Z" }, + { url = "https://files.pythonhosted.org/packages/66/7f/95fba509bb2305fab0073558f1e8c3a2ec4b2afe58ed9fcb7d3b8beafe94/orjson-3.11.8-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3f23426851d98478c8970da5991f84784a76682213cd50eb73a1da56b95239dc", size = 229180, upload-time = "2026-03-31T16:15:36.426Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9d/b237215c743ca073697d759b5503abd2cb8a0d7b9c9e21f524bcf176ab66/orjson-3.11.8-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:ebaed4cef74a045b83e23537b52ef19a367c7e3f536751e355a2a394f8648559", size = 128754, upload-time = "2026-03-31T16:15:38.049Z" }, + { url = "https://files.pythonhosted.org/packages/42/3d/27d65b6d11e63f133781425f132807aef793ed25075fec686fc8e46dd528/orjson-3.11.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97c8f5d3b62380b70c36ffacb2a356b7c6becec86099b177f73851ba095ef623", size = 131877, upload-time = "2026-03-31T16:15:39.484Z" }, + { url = "https://files.pythonhosted.org/packages/dd/cc/faee30cd8f00421999e40ef0eba7332e3a625ce91a58200a2f52c7fef235/orjson-3.11.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:436c4922968a619fb7fef1ccd4b8b3a76c13b67d607073914d675026e911a65c", size = 130361, upload-time = "2026-03-31T16:15:41.274Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bb/a6c55896197f97b6d4b4e7c7fd77e7235517c34f5d6ad5aadd43c54c6d7c/orjson-3.11.8-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ab359aff0436d80bfe8a23b46b5fea69f1e18aaf1760a709b4787f1318b317f", size = 135521, upload-time = "2026-03-31T16:15:42.758Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7c/ca3a3525aa32ff636ebb1778e77e3587b016ab2edb1b618b36ba96f8f2c0/orjson-3.11.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f89b6d0b3a8d81e1929d3ab3d92bbc225688bd80a770c49432543928fe09ac55", size = 146862, upload-time = "2026-03-31T16:15:44.341Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0c/18a9d7f18b5edd37344d1fd5be17e94dc652c67826ab749c6e5948a78112/orjson-3.11.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c009e7a2ca9ad0ed1376ce20dd692146a5d9fe4310848904b6b4fee5c5c137", size = 132847, upload-time = "2026-03-31T16:15:46.368Z" }, + { url = "https://files.pythonhosted.org/packages/23/91/7e722f352ad67ca573cee44de2a58fb810d0f4eb4e33276c6a557979fd8a/orjson-3.11.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b895b781b3e395c067129d8551655642dfe9437273211d5404e87ac752b53", size = 133637, upload-time = "2026-03-31T16:15:48.123Z" }, + { url = "https://files.pythonhosted.org/packages/af/04/32845ce13ac5bd1046ddb02ac9432ba856cc35f6d74dde95864fe0ad5523/orjson-3.11.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:88006eda83858a9fdf73985ce3804e885c2befb2f506c9a3723cdeb5a2880e3e", size = 141906, upload-time = "2026-03-31T16:15:49.626Z" }, + { url = "https://files.pythonhosted.org/packages/02/5e/c551387ddf2d7106d9039369862245c85738b828844d13b99ccb8d61fd06/orjson-3.11.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:55120759e61309af7fcf9e961c6f6af3dde5921cdb3ee863ef63fd9db126cae6", size = 423722, upload-time = "2026-03-31T16:15:51.176Z" }, + { url = "https://files.pythonhosted.org/packages/00/a3/ecfe62434096f8a794d4976728cb59bcfc4a643977f21c2040545d37eb4c/orjson-3.11.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:98bdc6cb889d19bed01de46e67574a2eab61f5cc6b768ed50e8ac68e9d6ffab6", size = 147801, upload-time = "2026-03-31T16:15:52.939Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/0dce10b9f6643fdc59d99333871a38fa5a769d8e2fc34a18e5d2bfdee900/orjson-3.11.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:708c95f925a43ab9f34625e45dcdadf09ec8a6e7b664a938f2f8d5650f6c090b", size = 136460, upload-time = "2026-03-31T16:15:54.431Z" }, + { url = "https://files.pythonhosted.org/packages/01/d6/6dde4f31842d87099238f1f07b459d24edc1a774d20687187443ab044191/orjson-3.11.8-cp313-cp313-win32.whl", hash = "sha256:01c4e5a6695dc09098f2e6468a251bc4671c50922d4d745aff1a0a33a0cf5b8d", size = 131956, upload-time = "2026-03-31T16:15:56.081Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f9/4e494a56e013db957fb77186b818b916d4695b8fa2aa612364974160e91b/orjson-3.11.8-cp313-cp313-win_amd64.whl", hash = "sha256:c154a35dd1330707450bb4d4e7dd1f17fa6f42267a40c1e8a1daa5e13719b4b8", size = 127410, upload-time = "2026-03-31T16:15:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/803203d00d6edb6e9e7eef421d4e1adbb5ea973e40b3533f3cfd9aeb374e/orjson-3.11.8-cp313-cp313-win_arm64.whl", hash = "sha256:4861bde57f4d253ab041e374f44023460e60e71efaa121f3c5f0ed457c3a701e", size = 127338, upload-time = "2026-03-31T16:15:59.106Z" }, + { url = "https://files.pythonhosted.org/packages/6d/35/b01910c3d6b85dc882442afe5060cbf719c7d1fc85749294beda23d17873/orjson-3.11.8-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:ec795530a73c269a55130498842aaa762e4a939f6ce481a7e986eeaa790e9da4", size = 229171, upload-time = "2026-03-31T16:16:00.651Z" }, + { url = "https://files.pythonhosted.org/packages/c2/56/c9ec97bd11240abef39b9e5d99a15462809c45f677420fd148a6c5e6295e/orjson-3.11.8-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:c492a0e011c0f9066e9ceaa896fbc5b068c54d365fea5f3444b697ee01bc8625", size = 128746, upload-time = "2026-03-31T16:16:02.673Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e4/66d4f30a90de45e2f0cbd9623588e8ae71eef7679dbe2ae954ed6d66a41f/orjson-3.11.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:883206d55b1bd5f5679ad5e6ddd3d1a5e3cac5190482927fdb8c78fb699193b5", size = 131867, upload-time = "2026-03-31T16:16:04.342Z" }, + { url = "https://files.pythonhosted.org/packages/19/30/2a645fc9286b928675e43fa2a3a16fb7b6764aa78cc719dc82141e00f30b/orjson-3.11.8-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5774c1fdcc98b2259800b683b19599c133baeb11d60033e2095fd9d4667b82db", size = 124664, upload-time = "2026-03-31T16:16:05.837Z" }, + { url = "https://files.pythonhosted.org/packages/db/44/77b9a86d84a28d52ba3316d77737f6514e17118119ade3f91b639e859029/orjson-3.11.8-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7381c83dd3d4a6347e6635950aa448f54e7b8406a27c7ecb4a37e9f1ae08b", size = 129701, upload-time = "2026-03-31T16:16:07.407Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ea/eff3d9bfe47e9bc6969c9181c58d9f71237f923f9c86a2d2f490cd898c82/orjson-3.11.8-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14439063aebcb92401c11afc68ee4e407258d2752e62d748b6942dad20d2a70d", size = 141202, upload-time = "2026-03-31T16:16:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/52/c8/90d4b4c60c84d62068d0cf9e4d8f0a4e05e76971d133ac0c60d818d4db20/orjson-3.11.8-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa72e71977bff96567b0f500fc5bfd2fdf915f34052c782a4c6ebbdaa97aa858", size = 127194, upload-time = "2026-03-31T16:16:11.02Z" }, + { url = "https://files.pythonhosted.org/packages/8d/c7/ea9e08d1f0ba981adffb629811148b44774d935171e7b3d780ae43c4c254/orjson-3.11.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7679bc2f01bb0d219758f1a5f87bb7c8a81c0a186824a393b366876b4948e14f", size = 133639, upload-time = "2026-03-31T16:16:13.434Z" }, + { url = "https://files.pythonhosted.org/packages/6c/8c/ddbbfd6ba59453c8fc7fe1d0e5983895864e264c37481b2a791db635f046/orjson-3.11.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:14f7b8fcb35ef403b42fa5ecfa4ed032332a91f3dc7368fbce4184d59e1eae0d", size = 141914, upload-time = "2026-03-31T16:16:14.955Z" }, + { url = "https://files.pythonhosted.org/packages/4e/31/dbfbefec9df060d34ef4962cd0afcb6fa7a9ec65884cb78f04a7859526c3/orjson-3.11.8-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c2bdf7b2facc80b5e34f48a2d557727d5c5c57a8a450de122ae81fa26a81c1bc", size = 423800, upload-time = "2026-03-31T16:16:16.594Z" }, + { url = "https://files.pythonhosted.org/packages/87/cf/f74e9ae9803d4ab46b163494adba636c6d7ea955af5cc23b8aaa94cfd528/orjson-3.11.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ccd7ba1b0605813a0715171d39ec4c314cb97a9c85893c2c5c0c3a3729df38bf", size = 147837, upload-time = "2026-03-31T16:16:18.585Z" }, + { url = "https://files.pythonhosted.org/packages/64/e6/9214f017b5db85e84e68602792f742e5dc5249e963503d1b356bee611e01/orjson-3.11.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cdbc8c9c02463fef4d3c53a9ba3336d05496ec8e1f1c53326a1e4acc11f5c600", size = 136441, upload-time = "2026-03-31T16:16:20.151Z" }, + { url = "https://files.pythonhosted.org/packages/24/dd/3590348818f58f837a75fb969b04cdf187ae197e14d60b5e5a794a38b79d/orjson-3.11.8-cp314-cp314-win32.whl", hash = "sha256:0b57f67710a8cd459e4e54eb96d5f77f3624eba0c661ba19a525807e42eccade", size = 131983, upload-time = "2026-03-31T16:16:21.823Z" }, + { url = "https://files.pythonhosted.org/packages/3f/0f/b6cb692116e05d058f31ceee819c70f097fa9167c82f67fabe7516289abc/orjson-3.11.8-cp314-cp314-win_amd64.whl", hash = "sha256:735e2262363dcbe05c35e3a8869898022af78f89dde9e256924dc02e99fe69ca", size = 127396, upload-time = "2026-03-31T16:16:23.685Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d1/facb5b5051fabb0ef9d26c6544d87ef19a939a9a001198655d0d891062dd/orjson-3.11.8-cp314-cp314-win_arm64.whl", hash = "sha256:6ccdea2c213cf9f3d9490cbd5d427693c870753df41e6cb375bd79bcbafc8817", size = 127330, upload-time = "2026-03-31T16:16:25.496Z" }, +] + [[package]] name = "packaging" version = "26.0" diff --git a/worker-template/worker_template/config_.py b/worker-template/worker_template/config_.py index 4cd7f7f1..ea775bbd 100644 --- a/worker-template/worker_template/config_.py +++ b/worker-template/worker_template/config_.py @@ -1,14 +1,14 @@ -from typing import ClassVar +from typing import Annotated import datashare_python -from datashare_python.config import WorkerConfig +from datashare_python.config import LoggingConfig, WorkerConfig from pydantic import Field -_ALL_LOGGERS = [datashare_python.__name__, __name__, "__main__"] +_LOGGERS = {datashare_python.__name__: "INFO", __name__: "INFO"} class TranslateAndClassifyWorkerConfig(WorkerConfig): - loggers: ClassVar[list[str]] = Field(_ALL_LOGGERS, frozen=True) + logging: Annotated[LoggingConfig, Field(frozen=True)] = _LOGGERS WORKER_CONFIG_CLS = TranslateAndClassifyWorkerConfig diff --git a/workers/asr-worker/asr_worker/activities.py b/workers/asr-worker/asr_worker/activities.py index 8b316936..dd6d4401 100644 --- a/workers/asr-worker/asr_worker/activities.py +++ b/workers/asr-worker/asr_worker/activities.py @@ -1,4 +1,5 @@ import contextlib +import logging import os from asyncio import AbstractEventLoop from collections.abc import AsyncGenerator, AsyncIterable, Iterable @@ -47,7 +48,6 @@ from icij_common.iter_utils import async_batches from icij_common.pydantic_utils import safe_copy from pydantic import TypeAdapter -from temporalio import activity from asr_worker.utils import read_jsonl @@ -64,6 +64,8 @@ from .dependencies import lifespan_es_client from .objects import InferenceRunnerConfig, Transcription +logger = logging.getLogger(__name__) + _BASE_WEIGHT = 1.0 _SEARCH_AUDIOS_WEIGHT = _BASE_WEIGHT * 2 _PREPROCESS_WEIGHT = 5 * _BASE_WEIGHT @@ -261,6 +263,9 @@ def infer_act( filename = f"{debuggable_name(path.name)}-transcript.json" transcript_path = output_dir / safe_dir(filename) / filename transcript_path.parent.mkdir(parents=True, exist_ok=True) + logger.debug( + "run inference for %s, writing result to %s", path, transcript_path + ) transcript_path.write_text(asr_res.model_dump_json()) paths.append(transcript_path) if progress is not None and event_loop is not None: @@ -286,7 +291,7 @@ def postprocess_act( t_path = write_transcription( doc_id, asr_result, artifacts_root=artifacts_root, project=project ) - activity.logger.debug("wrote transcription for %s", t_path) + logger.debug("wrote transcription for %s", t_path) if progress is not None and event_loop is not None: event_loop.run_until_complete(progress(i)) return n_docs @@ -301,6 +306,7 @@ def _preprocess( # TODO: we might to create safe subdirs to avoid creating too many # files in the same dir batch_file = output_dir / f"{batch_i}.jsonl" + logger.debug("writing batch to %s", batch_file) with batch_file.open("w") as f: for processed in batch: f.write(processed.model_dump_json() + "\n") diff --git a/workers/asr-worker/asr_worker/config.py b/workers/asr-worker/asr_worker/config.py index 0562d934..90f6a8b4 100644 --- a/workers/asr-worker/asr_worker/config.py +++ b/workers/asr-worker/asr_worker/config.py @@ -1,15 +1,15 @@ from pathlib import Path -from typing import ClassVar +from typing import Annotated import datashare_python -from datashare_python.config import WorkerConfig +from datashare_python.config import LoggingConfig, WorkerConfig from pydantic import Field -_ALL_LOGGERS = [datashare_python.__name__, __name__, "__main__"] +_LOGGERS = {datashare_python.__name__: "INFO", __name__: "INFO"} class ASRWorkerConfig(WorkerConfig): - loggers: ClassVar[list[str]] = Field(_ALL_LOGGERS, frozen=True) + logging: Annotated[LoggingConfig, Field(frozen=True)] = _LOGGERS docs_root: Path = Field(alias="audios_root") artifacts_root: Path diff --git a/workers/asr-worker/asr_worker/workflows.py b/workers/asr-worker/asr_worker/workflows.py index 6963591d..43449ae4 100644 --- a/workers/asr-worker/asr_worker/workflows.py +++ b/workers/asr-worker/asr_worker/workflows.py @@ -1,3 +1,4 @@ +import logging from asyncio import gather from datetime import timedelta from enum import StrEnum @@ -16,6 +17,8 @@ _ASR_INPUTS_TYPE_ADAPTER = TypeAdapter(ASRArgs) +logger = logging.getLogger(__name__) + class TaskQueues(StrEnum): IO = "asr.io" @@ -28,11 +31,11 @@ class TaskQueues(StrEnum): class ASRWorkflow(WorkflowWithProgress): @workflow.run async def run(self, args: ASRArgs) -> ASRResponse: - logger = workflow.logger config = args.config batch_size = args.batch_size doc_query = has_id(args.docs) if isinstance(args.docs, list) else args.docs search_args = [args.project, doc_query, batch_size] + logger.info("searching files to process...") batch_paths = await workflow.execute_activity( ASRActivities.search_audio_paths, args=search_args, diff --git a/workers/asr-worker/pyproject.toml b/workers/asr-worker/pyproject.toml index 7589e8fc..11908c44 100644 --- a/workers/asr-worker/pyproject.toml +++ b/workers/asr-worker/pyproject.toml @@ -13,7 +13,7 @@ authors = [ readme = "README.md" requires-python = ">=3.11.0, <3.13" dependencies = [ - "datashare-python~=0.6.3", + "datashare-python~=0.7.0", ] [project.scripts] diff --git a/workers/asr-worker/tests/conftest.py b/workers/asr-worker/tests/conftest.py index 920b834c..fc24f46a 100644 --- a/workers/asr-worker/tests/conftest.py +++ b/workers/asr-worker/tests/conftest.py @@ -1,12 +1,18 @@ import shutil from pathlib import Path +import asr_worker +import datashare_python import pytest from _pytest.tmpdir import TempPathFactory from asr_worker.config import ASRWorkerConfig from asr_worker.constants import SUPPORTED_CONTENT_TYPES from asr_worker.dependencies import set_multiprocessing_start_method -from datashare_python.config import DatashareClientConfig, TemporalClientConfig +from datashare_python.config import ( + DatashareClientConfig, + LoggingConfig, + TemporalClientConfig, +) from datashare_python.conftest import ( # noqa: F401 TEST_PROJECT, doc_3, @@ -43,8 +49,12 @@ def test_worker_config(tmp_path_factory: TempPathFactory) -> ASRWorkerConfig: # artifacts_root.mkdir() workdir = tmp_path / "workdir" workdir.mkdir() + logging_config = LoggingConfig( + loggers={datashare_python.__name__: "INFO", asr_worker.__name__: "INFO"}, + log_in_json=False, + ) return ASRWorkerConfig( - log_level="DEBUG", + logging=logging_config, datashare=DatashareClientConfig(url="http://localhost:8080"), temporal=TemporalClientConfig(host="localhost:7233"), audios_root=audios_root, diff --git a/workers/asr-worker/uv.lock b/workers/asr-worker/uv.lock index a6373920..f847c17f 100644 --- a/workers/asr-worker/uv.lock +++ b/workers/asr-worker/uv.lock @@ -613,7 +613,7 @@ wheels = [ [[package]] name = "datashare-python" -version = "0.6.3" +version = "0.7.0" source = { editable = "../../datashare-python" } dependencies = [ { name = "aiohttp", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu')" }, @@ -621,6 +621,7 @@ dependencies = [ { name = "hatchling", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu')" }, { name = "icij-common", extra = ["elasticsearch"], marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu')" }, { name = "nest-asyncio", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu')" }, + { name = "orjson", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu')" }, { name = "python-json-logger", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu')" }, { name = "pyyaml", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu')" }, { name = "temporalio", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu') or sys_platform == 'darwin' or (sys_platform != 'linux' and extra == 'extra-10-asr-worker-cpu' and extra == 'extra-10-asr-worker-gpu')" }, @@ -630,14 +631,15 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "aiohttp", specifier = "~=3.11.9" }, - { name = "alive-progress", specifier = "~=3.2.0" }, - { name = "hatchling", specifier = "~=1.27.0" }, + { name = "aiohttp", specifier = "~=3.11" }, + { name = "alive-progress", specifier = "~=3.2" }, + { name = "hatchling", specifier = "~=1.27" }, { name = "icij-common", extras = ["elasticsearch"], specifier = "~=0.8.2" }, - { name = "nest-asyncio", specifier = "~=1.6.0" }, - { name = "python-json-logger", specifier = "~=4.0.0" }, + { name = "nest-asyncio", specifier = "~=1.6" }, + { name = "orjson", specifier = "~=3.11" }, + { name = "python-json-logger", specifier = "~=4.0" }, { name = "pyyaml", specifier = "~=6.0" }, - { name = "temporalio", specifier = "~=1.23.0" }, + { name = "temporalio", specifier = "~=1.23" }, { name = "tomlkit", specifier = "~=0.14.0" }, { name = "typer", specifier = "~=0.15.4" }, ] @@ -2155,6 +2157,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ac/24/7c731839566d30dc70556d9824ef17692d896c15e3df627bce8c16f753e1/optuna-4.8.0-py3-none-any.whl", hash = "sha256:c57a7682679c36bfc9bca0da430698179e513874074b71bebedb0334964ab930", size = 419456, upload-time = "2026-03-16T04:59:56.977Z" }, ] +[[package]] +name = "orjson" +version = "3.11.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/1b/2024d06792d0779f9dbc51531b61c24f76c75b9f4ce05e6f3377a1814cea/orjson-3.11.8.tar.gz", hash = "sha256:96163d9cdc5a202703e9ad1b9ae757d5f0ca62f4fa0cc93d1f27b0e180cc404e", size = 5603832, upload-time = "2026-03-31T16:16:27.878Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/41/5aa7fa3b0f4dc6b47dcafc3cea909299c37e40e9972feabc8b6a74e2730d/orjson-3.11.8-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:003646067cc48b7fcab2ae0c562491c9b5d2cbd43f1e5f16d98fd118c5522d34", size = 229229, upload-time = "2026-03-31T16:14:50.424Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d7/57e7f2458e0a2c41694f39fc830030a13053a84f837a5b73423dca1f0938/orjson-3.11.8-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ed193ce51d77a3830cad399a529cd4ef029968761f43ddc549e1bc62b40d88f8", size = 128871, upload-time = "2026-03-31T16:14:51.888Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fc/55e667ec9c85694038fcff00573d221b085d50777368ee3d77f38668bf3c/orjson-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f8952d6d2505c003e8f0224ff7858d341fa4e33fef82b91c4ff0ef070f2393c", size = 133580, upload-time = "2026-03-31T16:15:00.519Z" }, + { url = "https://files.pythonhosted.org/packages/90/6c/0fb6e8a24e682e0958d71711ae6f39110e4b9cd8cab1357e2a89cb8e1951/orjson-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5c370674ebabe16c6ccac33ff80c62bf8a6e59439f5e9d40c1f5ab8fd2215b7", size = 136425, upload-time = "2026-03-31T16:15:07.052Z" }, + { url = "https://files.pythonhosted.org/packages/01/f6/8d58b32ab32d9215973a1688aebd098252ee8af1766c0e4e36e7831f0295/orjson-3.11.8-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1cd0b77e77c95758f8e1100139844e99f3ccc87e71e6fc8e1c027e55807c549f", size = 229233, upload-time = "2026-03-31T16:15:12.762Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8b/2ffe35e71f6b92622e8ea4607bf33ecf7dfb51b3619dcfabfd36cbe2d0a5/orjson-3.11.8-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:6a3d159d5ffa0e3961f353c4b036540996bf8b9697ccc38261c0eac1fd3347a6", size = 128772, upload-time = "2026-03-31T16:15:14.237Z" }, + { url = "https://files.pythonhosted.org/packages/37/87/5ddeb7fc1fbd9004aeccab08426f34c81a5b4c25c7061281862b015fce2b/orjson-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a0f57e59a530d18a142f4d4ba6dfc708dc5fdedce45e98ff06b44930a2a48f", size = 133624, upload-time = "2026-03-31T16:15:22.641Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6d/37c2589ba864e582ffe7611643314785c6afb1f83c701654ef05daa8fcc7/orjson-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:093d489fa039ddade2db541097dbb484999fcc65fc2b0ff9819141e2ab364f25", size = 136485, upload-time = "2026-03-31T16:15:29.749Z" }, +] + [[package]] name = "overrides" version = "7.7.0" diff --git a/workers/translation-worker/pyproject.toml b/workers/translation-worker/pyproject.toml index 1cb82437..5803d4e9 100644 --- a/workers/translation-worker/pyproject.toml +++ b/workers/translation-worker/pyproject.toml @@ -28,7 +28,7 @@ authors = [ readme = "README.md" requires-python = ">=3.11.0, <3.14" dependencies = [ - "datashare-python~=0.6.2", + "datashare-python~=0.7.0", "argostranslate>=1.11.0", "temporalio>=1.22.0", "pycountry~=26.2.16", diff --git a/workers/translation-worker/uv.dist.lock b/workers/translation-worker/uv.dist.lock index bfc1a7fd..e0e39302 100644 --- a/workers/translation-worker/uv.dist.lock +++ b/workers/translation-worker/uv.dist.lock @@ -411,7 +411,7 @@ wheels = [ [[package]] name = "datashare-python" -version = "0.6.2" +version = "0.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -425,9 +425,9 @@ dependencies = [ { name = "tomlkit" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a0/20/095049cb543235e81c3d0fe9bce31666a3b799782df9fb88198abbea9757/datashare_python-0.6.2.tar.gz", hash = "sha256:2630969c77602a427cb0a784d0896c83e2a071729f440cee25b3945f7f9caba6", size = 299884, upload-time = "2026-04-21T11:58:44.616Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/88/9d2e2431cf332ed6c272fae5a2f00d298d26722af5d1a7204df90585fe51/datashare_python-0.6.3.tar.gz", hash = "sha256:97308d087c094cbe737127dde6abf0324a39715a91a77e75182c368f09182dbf", size = 300154, upload-time = "2026-04-21T14:25:57.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/fd/00cdbcdb2325b62aec3ec78199864531ff08b77ff1f3b33942a79f142908/datashare_python-0.6.2-py3-none-any.whl", hash = "sha256:5578c92b12c321ef1f0dc42473c106cbbe6068d134f866896a4236105a342d66", size = 304735, upload-time = "2026-04-21T11:58:43.504Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ea/ba0f73cfaa3394b3e70e6bf2c67cdcef21e4829cba95b1cee7740482f1a9/datashare_python-0.6.3-py3-none-any.whl", hash = "sha256:d8ed28175fa8530b94f90f586faf9d84cf60e4701d966ba4f5bbe46fcd06d6f2", size = 304978, upload-time = "2026-04-21T14:25:55.929Z" }, ] [[package]] diff --git a/workers/translation-worker/uv.lock b/workers/translation-worker/uv.lock index 397aa72c..e71ed03c 100644 --- a/workers/translation-worker/uv.lock +++ b/workers/translation-worker/uv.lock @@ -411,7 +411,7 @@ wheels = [ [[package]] name = "datashare-python" -version = "0.6.3" +version = "0.7.0" source = { editable = "../../datashare-python" } dependencies = [ { name = "aiohttp" }, @@ -419,6 +419,7 @@ dependencies = [ { name = "hatchling" }, { name = "icij-common", extra = ["elasticsearch"] }, { name = "nest-asyncio" }, + { name = "orjson" }, { name = "python-json-logger" }, { name = "pyyaml" }, { name = "temporalio" }, @@ -428,14 +429,15 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "aiohttp", specifier = "~=3.11.9" }, - { name = "alive-progress", specifier = "~=3.2.0" }, - { name = "hatchling", specifier = "~=1.27.0" }, + { name = "aiohttp", specifier = "~=3.11" }, + { name = "alive-progress", specifier = "~=3.2" }, + { name = "hatchling", specifier = "~=1.27" }, { name = "icij-common", extras = ["elasticsearch"], specifier = "~=0.8.2" }, - { name = "nest-asyncio", specifier = "~=1.6.0" }, - { name = "python-json-logger", specifier = "~=4.0.0" }, + { name = "nest-asyncio", specifier = "~=1.6" }, + { name = "orjson", specifier = "~=3.11" }, + { name = "python-json-logger", specifier = "~=4.0" }, { name = "pyyaml", specifier = "~=6.0" }, - { name = "temporalio", specifier = "~=1.23.0" }, + { name = "temporalio", specifier = "~=1.23" }, { name = "tomlkit", specifier = "~=0.14.0" }, { name = "typer", specifier = "~=0.15.4" }, ] @@ -1205,6 +1207,59 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/90/45/9d52397e30b0d8c1692afcec5184ca9372ff4d6b0f6039bba9ad479a2563/onnxruntime-1.24.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2956f5220e7be8b09482ae5726caabf78eb549142cdb28523191a38e57fb6119", size = 17117779, upload-time = "2026-02-19T17:14:13.862Z" }, ] +[[package]] +name = "orjson" +version = "3.11.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/1b/2024d06792d0779f9dbc51531b61c24f76c75b9f4ce05e6f3377a1814cea/orjson-3.11.8.tar.gz", hash = "sha256:96163d9cdc5a202703e9ad1b9ae757d5f0ca62f4fa0cc93d1f27b0e180cc404e", size = 5603832, upload-time = "2026-03-31T16:16:27.878Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/41/5aa7fa3b0f4dc6b47dcafc3cea909299c37e40e9972feabc8b6a74e2730d/orjson-3.11.8-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:003646067cc48b7fcab2ae0c562491c9b5d2cbd43f1e5f16d98fd118c5522d34", size = 229229, upload-time = "2026-03-31T16:14:50.424Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d7/57e7f2458e0a2c41694f39fc830030a13053a84f837a5b73423dca1f0938/orjson-3.11.8-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:ed193ce51d77a3830cad399a529cd4ef029968761f43ddc549e1bc62b40d88f8", size = 128871, upload-time = "2026-03-31T16:14:51.888Z" }, + { url = "https://files.pythonhosted.org/packages/53/4a/e0fdb9430983e6c46e0299559275025075568aad5d21dd606faee3703924/orjson-3.11.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30491bc4f862aa15744b9738517454f1e46e56c972a2be87d70d727d5b2a8f8", size = 132104, upload-time = "2026-03-31T16:14:53.142Z" }, + { url = "https://files.pythonhosted.org/packages/08/4a/2025a60ff3f5c8522060cda46612d9b1efa653de66ed2908591d8d82f22d/orjson-3.11.8-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eda5b8b6be91d3f26efb7dc6e5e68ee805bc5617f65a328587b35255f138bf4", size = 130483, upload-time = "2026-03-31T16:14:54.605Z" }, + { url = "https://files.pythonhosted.org/packages/2d/3c/b9cde05bdc7b2385c66014e0620627da638d3d04e4954416ab48c31196c5/orjson-3.11.8-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee8db7bfb6fe03581bbab54d7c4124a6dd6a7f4273a38f7267197890f094675f", size = 135481, upload-time = "2026-03-31T16:14:55.901Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f2/a8238e7734de7cb589fed319857a8025d509c89dc52fdcc88f39c6d03d5a/orjson-3.11.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d8b5231de76c528a46b57010bbd83fb51e056aa0220a372fd5065e978406f1c", size = 146819, upload-time = "2026-03-31T16:14:57.548Z" }, + { url = "https://files.pythonhosted.org/packages/db/10/dbf1e2a3cafea673b1b4350e371877b759060d6018a998643b7040e5de48/orjson-3.11.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58a4a208a6fbfdb7a7327b8f201c6014f189f721fd55d047cafc4157af1bc62a", size = 132846, upload-time = "2026-03-31T16:14:58.91Z" }, + { url = "https://files.pythonhosted.org/packages/f8/fc/55e667ec9c85694038fcff00573d221b085d50777368ee3d77f38668bf3c/orjson-3.11.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f8952d6d2505c003e8f0224ff7858d341fa4e33fef82b91c4ff0ef070f2393c", size = 133580, upload-time = "2026-03-31T16:15:00.519Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a6/c08c589a9aad0cb46c4831d17de212a2b6901f9d976814321ff8e69e8785/orjson-3.11.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0022bb50f90da04b009ce32c512dc1885910daa7cb10b7b0cba4505b16db82a8", size = 142042, upload-time = "2026-03-31T16:15:01.906Z" }, + { url = "https://files.pythonhosted.org/packages/5c/cc/2f78ea241d52b717d2efc38878615fe80425bf2beb6e68c984dde257a766/orjson-3.11.8-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:ff51f9d657d1afb6f410cb435792ce4e1fe427aab23d2fcd727a2876e21d4cb6", size = 423845, upload-time = "2026-03-31T16:15:03.703Z" }, + { url = "https://files.pythonhosted.org/packages/70/07/c17dcf05dd8045457538428a983bf1f1127928df5bf328cb24d2b7cddacb/orjson-3.11.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6dbe9a97bdb4d8d9d5367b52a7c32549bba70b2739c58ef74a6964a6d05ae054", size = 147729, upload-time = "2026-03-31T16:15:05.203Z" }, + { url = "https://files.pythonhosted.org/packages/90/6c/0fb6e8a24e682e0958d71711ae6f39110e4b9cd8cab1357e2a89cb8e1951/orjson-3.11.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5c370674ebabe16c6ccac33ff80c62bf8a6e59439f5e9d40c1f5ab8fd2215b7", size = 136425, upload-time = "2026-03-31T16:15:07.052Z" }, + { url = "https://files.pythonhosted.org/packages/b2/35/4d3cc3a3d616035beb51b24a09bb872942dc452cf2df0c1d11ab35046d9f/orjson-3.11.8-cp311-cp311-win32.whl", hash = "sha256:0e32f7154299f42ae66f13488963269e5eccb8d588a65bc839ed986919fc9fac", size = 131870, upload-time = "2026-03-31T16:15:08.678Z" }, + { url = "https://files.pythonhosted.org/packages/13/26/9fe70f81d16b702f8c3a775e8731b50ad91d22dacd14c7599b60a0941cd1/orjson-3.11.8-cp311-cp311-win_amd64.whl", hash = "sha256:25e0c672a2e32348d2eb33057b41e754091f2835f87222e4675b796b92264f06", size = 127440, upload-time = "2026-03-31T16:15:09.994Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c6/b038339f4145efd2859c1ca53097a52c0bb9cbdd24f947ebe146da1ad067/orjson-3.11.8-cp311-cp311-win_arm64.whl", hash = "sha256:9185589c1f2a944c17e26c9925dcdbc2df061cc4a145395c57f0c51f9b5dbfcd", size = 127399, upload-time = "2026-03-31T16:15:11.412Z" }, + { url = "https://files.pythonhosted.org/packages/01/f6/8d58b32ab32d9215973a1688aebd098252ee8af1766c0e4e36e7831f0295/orjson-3.11.8-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1cd0b77e77c95758f8e1100139844e99f3ccc87e71e6fc8e1c027e55807c549f", size = 229233, upload-time = "2026-03-31T16:15:12.762Z" }, + { url = "https://files.pythonhosted.org/packages/a9/8b/2ffe35e71f6b92622e8ea4607bf33ecf7dfb51b3619dcfabfd36cbe2d0a5/orjson-3.11.8-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:6a3d159d5ffa0e3961f353c4b036540996bf8b9697ccc38261c0eac1fd3347a6", size = 128772, upload-time = "2026-03-31T16:15:14.237Z" }, + { url = "https://files.pythonhosted.org/packages/27/d2/1f8682ae50d5c6897a563cb96bc106da8c9cb5b7b6e81a52e4cc086679b9/orjson-3.11.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76070a76e9c5ae661e2d9848f216980d8d533e0f8143e6ed462807b242e3c5e8", size = 131946, upload-time = "2026-03-31T16:15:15.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/4b/5500f76f0eece84226e0689cb48dcde081104c2fa6e2483d17ca13685ffb/orjson-3.11.8-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54153d21520a71a4c82a0dbb4523e468941d549d221dc173de0f019678cf3813", size = 130368, upload-time = "2026-03-31T16:15:17.066Z" }, + { url = "https://files.pythonhosted.org/packages/da/4e/58b927e08fbe9840e6c920d9e299b051ea667463b1f39a56e668669f8508/orjson-3.11.8-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:469ac2125611b7c5741a0b3798cd9e5786cbad6345f9f400c77212be89563bec", size = 135540, upload-time = "2026-03-31T16:15:18.404Z" }, + { url = "https://files.pythonhosted.org/packages/56/7c/ba7cb871cba1bcd5cd02ee34f98d894c6cea96353ad87466e5aef2429c60/orjson-3.11.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14778ffd0f6896aa613951a7fbf4690229aa7a543cb2bfbe9f358e08aafa9546", size = 146877, upload-time = "2026-03-31T16:15:19.833Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/eb9c25fc1386696c6a342cd361c306452c75e0b55e86ad602dd4827a7fd7/orjson-3.11.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea56a955056a6d6c550cf18b3348656a9d9a4f02e2d0c02cabf3c73f1055d506", size = 132837, upload-time = "2026-03-31T16:15:21.282Z" }, + { url = "https://files.pythonhosted.org/packages/37/87/5ddeb7fc1fbd9004aeccab08426f34c81a5b4c25c7061281862b015fce2b/orjson-3.11.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53a0f57e59a530d18a142f4d4ba6dfc708dc5fdedce45e98ff06b44930a2a48f", size = 133624, upload-time = "2026-03-31T16:15:22.641Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/90048793db94ee4b2fcec4ac8e5ddb077367637d6650be896b3494b79bb7/orjson-3.11.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b48e274f8824567d74e2158199e269597edf00823a1b12b63d48462bbf5123e", size = 141904, upload-time = "2026-03-31T16:15:24.435Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cf/eb284847487821a5d415e54149a6449ba9bfc5872ce63ab7be41b8ec401c/orjson-3.11.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3f262401086a3960586af06c054609365e98407151f5ea24a62893a40d80dbbb", size = 423742, upload-time = "2026-03-31T16:15:26.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/09/e12423d327071c851c13e76936f144a96adacfc037394dec35ac3fc8d1e8/orjson-3.11.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8e8c6218b614badf8e229b697865df4301afa74b791b6c9ade01d19a9953a942", size = 147806, upload-time = "2026-03-31T16:15:27.909Z" }, + { url = "https://files.pythonhosted.org/packages/b3/6d/37c2589ba864e582ffe7611643314785c6afb1f83c701654ef05daa8fcc7/orjson-3.11.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:093d489fa039ddade2db541097dbb484999fcc65fc2b0ff9819141e2ab364f25", size = 136485, upload-time = "2026-03-31T16:15:29.749Z" }, + { url = "https://files.pythonhosted.org/packages/be/c9/135194a02ab76b04ed9a10f68624b7ebd238bbe55548878b11ff15a0f352/orjson-3.11.8-cp312-cp312-win32.whl", hash = "sha256:e0950ed1bcb9893f4293fd5c5a7ee10934fbf82c4101c70be360db23ce24b7d2", size = 131966, upload-time = "2026-03-31T16:15:31.687Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9a/9796f8fbe3cf30ce9cb696748dbb535e5c87be4bf4fe2e9ca498ef1fa8cf/orjson-3.11.8-cp312-cp312-win_amd64.whl", hash = "sha256:3cf17c141617b88ced4536b2135c552490f07799f6ad565948ea07bef0dcb9a6", size = 127441, upload-time = "2026-03-31T16:15:33.333Z" }, + { url = "https://files.pythonhosted.org/packages/cc/47/5aaf54524a7a4a0dd09dd778f3fa65dd2108290615b652e23d944152bc8e/orjson-3.11.8-cp312-cp312-win_arm64.whl", hash = "sha256:48854463b0572cc87dac7d981aa72ed8bf6deedc0511853dc76b8bbd5482d36d", size = 127364, upload-time = "2026-03-31T16:15:34.748Z" }, + { url = "https://files.pythonhosted.org/packages/66/7f/95fba509bb2305fab0073558f1e8c3a2ec4b2afe58ed9fcb7d3b8beafe94/orjson-3.11.8-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:3f23426851d98478c8970da5991f84784a76682213cd50eb73a1da56b95239dc", size = 229180, upload-time = "2026-03-31T16:15:36.426Z" }, + { url = "https://files.pythonhosted.org/packages/f6/9d/b237215c743ca073697d759b5503abd2cb8a0d7b9c9e21f524bcf176ab66/orjson-3.11.8-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:ebaed4cef74a045b83e23537b52ef19a367c7e3f536751e355a2a394f8648559", size = 128754, upload-time = "2026-03-31T16:15:38.049Z" }, + { url = "https://files.pythonhosted.org/packages/42/3d/27d65b6d11e63f133781425f132807aef793ed25075fec686fc8e46dd528/orjson-3.11.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97c8f5d3b62380b70c36ffacb2a356b7c6becec86099b177f73851ba095ef623", size = 131877, upload-time = "2026-03-31T16:15:39.484Z" }, + { url = "https://files.pythonhosted.org/packages/dd/cc/faee30cd8f00421999e40ef0eba7332e3a625ce91a58200a2f52c7fef235/orjson-3.11.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:436c4922968a619fb7fef1ccd4b8b3a76c13b67d607073914d675026e911a65c", size = 130361, upload-time = "2026-03-31T16:15:41.274Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bb/a6c55896197f97b6d4b4e7c7fd77e7235517c34f5d6ad5aadd43c54c6d7c/orjson-3.11.8-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ab359aff0436d80bfe8a23b46b5fea69f1e18aaf1760a709b4787f1318b317f", size = 135521, upload-time = "2026-03-31T16:15:42.758Z" }, + { url = "https://files.pythonhosted.org/packages/9c/7c/ca3a3525aa32ff636ebb1778e77e3587b016ab2edb1b618b36ba96f8f2c0/orjson-3.11.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f89b6d0b3a8d81e1929d3ab3d92bbc225688bd80a770c49432543928fe09ac55", size = 146862, upload-time = "2026-03-31T16:15:44.341Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0c/18a9d7f18b5edd37344d1fd5be17e94dc652c67826ab749c6e5948a78112/orjson-3.11.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29c009e7a2ca9ad0ed1376ce20dd692146a5d9fe4310848904b6b4fee5c5c137", size = 132847, upload-time = "2026-03-31T16:15:46.368Z" }, + { url = "https://files.pythonhosted.org/packages/23/91/7e722f352ad67ca573cee44de2a58fb810d0f4eb4e33276c6a557979fd8a/orjson-3.11.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b895b781b3e395c067129d8551655642dfe9437273211d5404e87ac752b53", size = 133637, upload-time = "2026-03-31T16:15:48.123Z" }, + { url = "https://files.pythonhosted.org/packages/af/04/32845ce13ac5bd1046ddb02ac9432ba856cc35f6d74dde95864fe0ad5523/orjson-3.11.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:88006eda83858a9fdf73985ce3804e885c2befb2f506c9a3723cdeb5a2880e3e", size = 141906, upload-time = "2026-03-31T16:15:49.626Z" }, + { url = "https://files.pythonhosted.org/packages/02/5e/c551387ddf2d7106d9039369862245c85738b828844d13b99ccb8d61fd06/orjson-3.11.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:55120759e61309af7fcf9e961c6f6af3dde5921cdb3ee863ef63fd9db126cae6", size = 423722, upload-time = "2026-03-31T16:15:51.176Z" }, + { url = "https://files.pythonhosted.org/packages/00/a3/ecfe62434096f8a794d4976728cb59bcfc4a643977f21c2040545d37eb4c/orjson-3.11.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:98bdc6cb889d19bed01de46e67574a2eab61f5cc6b768ed50e8ac68e9d6ffab6", size = 147801, upload-time = "2026-03-31T16:15:52.939Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/0dce10b9f6643fdc59d99333871a38fa5a769d8e2fc34a18e5d2bfdee900/orjson-3.11.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:708c95f925a43ab9f34625e45dcdadf09ec8a6e7b664a938f2f8d5650f6c090b", size = 136460, upload-time = "2026-03-31T16:15:54.431Z" }, + { url = "https://files.pythonhosted.org/packages/01/d6/6dde4f31842d87099238f1f07b459d24edc1a774d20687187443ab044191/orjson-3.11.8-cp313-cp313-win32.whl", hash = "sha256:01c4e5a6695dc09098f2e6468a251bc4671c50922d4d745aff1a0a33a0cf5b8d", size = 131956, upload-time = "2026-03-31T16:15:56.081Z" }, + { url = "https://files.pythonhosted.org/packages/c1/f9/4e494a56e013db957fb77186b818b916d4695b8fa2aa612364974160e91b/orjson-3.11.8-cp313-cp313-win_amd64.whl", hash = "sha256:c154a35dd1330707450bb4d4e7dd1f17fa6f42267a40c1e8a1daa5e13719b4b8", size = 127410, upload-time = "2026-03-31T16:15:57.54Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/803203d00d6edb6e9e7eef421d4e1adbb5ea973e40b3533f3cfd9aeb374e/orjson-3.11.8-cp313-cp313-win_arm64.whl", hash = "sha256:4861bde57f4d253ab041e374f44023460e60e71efaa121f3c5f0ed457c3a701e", size = 127338, upload-time = "2026-03-31T16:15:59.106Z" }, +] + [[package]] name = "packaging" version = "26.0"