From 525675aba776b7f9e410612700cdc04f2cccd366 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 10:47:42 +0530 Subject: [PATCH 01/15] Remove black, use ruff for formatting and linting Signed-off-by: Sreekanth --- packages/pynumaflow-lite/Makefile | 5 +- .../accumulator/accumulator_stream_sorter.py | 6 +- .../manifests/sideinput/sideinput_example.py | 4 +- .../manifests/source/simple_source.py | 4 +- .../pynumaflow_lite/__init__.py | 12 +- .../pynumaflow_lite/__init__.pyi | 6 +- .../pynumaflow_lite/_batchmapper_dtypes.py | 3 +- .../pynumaflow_lite/_map_dtypes.py | 1 + .../pynumaflow_lite/_mapstream_dtypes.py | 3 +- .../pynumaflow_lite/_reduce_dtypes.py | 3 +- .../pynumaflow_lite/_reducestreamer_dtypes.py | 3 +- .../pynumaflow_lite/_sideinput_dtypes.py | 1 + .../pynumaflow_lite/_sink_dtypes.py | 3 +- .../pynumaflow_lite/_source_dtypes.py | 7 +- .../_sourcetransformer_dtypes.py | 1 + .../pynumaflow_lite/accumulator.pyi | 4 +- .../pynumaflow_lite/batchmapper.pyi | 2 +- .../pynumaflow_lite/mapper.pyi | 2 +- .../pynumaflow_lite/mapstreamer.pyi | 2 +- .../pynumaflow_lite/reducer.pyi | 2 +- .../pynumaflow_lite/reducestreamer.pyi | 2 +- .../pynumaflow_lite/session_reducer.pyi | 2 +- .../pynumaflow_lite/sinker.pyi | 2 +- .../pynumaflow_lite/sourcer.pyi | 2 +- .../pynumaflow_lite/sourcetransformer.pyi | 2 +- packages/pynumaflow-lite/pyproject.toml | 12 +- packages/pynumaflow-lite/tests/_test_utils.py | 6 +- .../examples/accumulator_stream_sorter.py | 6 +- .../tests/examples/sideinput_example.py | 3 +- .../tests/examples/sink_log_class.py | 2 +- .../tests/examples/source_simple.py | 4 +- packages/pynumaflow-lite/uv.lock | 288 ------------------ 32 files changed, 70 insertions(+), 335 deletions(-) diff --git a/packages/pynumaflow-lite/Makefile b/packages/pynumaflow-lite/Makefile index 452300bf..f02e89de 100644 --- a/packages/pynumaflow-lite/Makefile +++ b/packages/pynumaflow-lite/Makefile @@ -44,10 +44,11 @@ clean: cargo clean py-fmt: - uv run black pynumaflow_lite/ tests/ manifests/ + uv run ruff format pynumaflow_lite/ tests/ manifests/ -py-lint: py-fmt +py-lint: uv run ruff check --fix . + uv run ruff format pynumaflow_lite/ tests/ manifests/ fmt: cargo fmt --all diff --git a/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py b/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py index 3fc8c573..e9feacce 100644 --- a/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py +++ b/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py @@ -5,16 +5,16 @@ flushing sorted data when the watermark advances. """ -import signal import asyncio +import signal from datetime import datetime from typing import AsyncIterator from pynumaflow_lite.accumulator import ( + Accumulator, + AccumulatorAsyncServer, Datum, Message, - AccumulatorAsyncServer, - Accumulator, ) diff --git a/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py b/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py index b1aaddec..149983cf 100644 --- a/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py +++ b/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py @@ -8,13 +8,13 @@ """ import asyncio +import datetime import os import signal import threading from threading import Thread -import datetime -from pynumaflow_lite import sideinputer, mapper +from pynumaflow_lite import mapper, sideinputer from watchfiles import watch diff --git a/packages/pynumaflow-lite/manifests/source/simple_source.py b/packages/pynumaflow-lite/manifests/source/simple_source.py index 06bf545b..db590607 100644 --- a/packages/pynumaflow-lite/manifests/source/simple_source.py +++ b/packages/pynumaflow-lite/manifests/source/simple_source.py @@ -1,8 +1,8 @@ import asyncio import logging import signal -from datetime import datetime, timezone from collections.abc import AsyncIterator +from datetime import datetime, timezone from pynumaflow_lite import sourcer from pynumaflow_lite._source_dtypes import Sourcer @@ -35,7 +35,7 @@ async def read_handler( # Generate the requested number of messages for i in range(datum.num_records): # Create message payload - payload = f"message-{self.counter}".encode("utf-8") + payload = f"message-{self.counter}".encode() # Create offset offset = sourcer.Offset( diff --git a/packages/pynumaflow-lite/pynumaflow_lite/__init__.py b/packages/pynumaflow-lite/pynumaflow_lite/__init__.py index 7b468e6d..4fee2764 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/__init__.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/__init__.py @@ -1,4 +1,6 @@ -from . import pynumaflow_lite # type: ignore[attr-defined] # Rust extension, resolved at runtime +from . import ( + pynumaflow_lite, # type: ignore[attr-defined] # Rust extension, resolved at runtime +) from .pynumaflow_lite import * # noqa: F403 # Rust extension; exports resolved at runtime # Ensure the `mapper`, `batchmapper`, and `mapstreamer` submodules are importable as attributes of the package @@ -61,17 +63,17 @@ # Surface the Python Mapper, BatchMapper, MapStreamer, Reducer, SessionReducer, ReduceStreamer, Accumulator, Sinker, # Sourcer, SourceTransformer, and SideInput classes under the extension submodules for convenient access -from ._map_dtypes import Mapper +from ._accumulator_dtypes import Accumulator from ._batchmapper_dtypes import BatchMapper +from ._map_dtypes import Mapper from ._mapstream_dtypes import MapStreamer from ._reduce_dtypes import Reducer -from ._session_reduce_dtypes import SessionReducer from ._reducestreamer_dtypes import ReduceStreamer -from ._accumulator_dtypes import Accumulator +from ._session_reduce_dtypes import SessionReducer +from ._sideinput_dtypes import SideInput from ._sink_dtypes import Sinker from ._source_dtypes import Sourcer from ._sourcetransformer_dtypes import SourceTransformer -from ._sideinput_dtypes import SideInput if mapper is not None: try: diff --git a/packages/pynumaflow-lite/pynumaflow_lite/__init__.pyi b/packages/pynumaflow-lite/pynumaflow_lite/__init__.pyi index bfe3c0dc..c125c12e 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/__init__.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/__init__.pyi @@ -1,15 +1,15 @@ import _typeshed -from . import mapper as mapper +from . import accumulator as accumulator from . import batchmapper as batchmapper +from . import mapper as mapper from . import mapstreamer as mapstreamer from . import reducer as reducer from . import session_reducer as session_reducer -from . import accumulator as accumulator +from . import sideinputer as sideinputer from . import sinker as sinker from . import sourcer as sourcer from . import sourcetransformer as sourcetransformer -from . import sideinputer as sideinputer def __getattr__(name: str) -> _typeshed.Incomplete: ... diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_batchmapper_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_batchmapper_dtypes.py index 6fe8d1da..557c8afe 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_batchmapper_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_batchmapper_dtypes.py @@ -1,7 +1,8 @@ from abc import ABCMeta, abstractmethod -from pynumaflow_lite.batchmapper import Datum, BatchResponse from collections.abc import AsyncIterable +from pynumaflow_lite.batchmapper import BatchResponse, Datum + class BatchMapper(metaclass=ABCMeta): """ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_map_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_map_dtypes.py index 6c7207c5..13733ed7 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_map_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_map_dtypes.py @@ -1,4 +1,5 @@ from abc import ABCMeta, abstractmethod + from pynumaflow_lite.mapper import Datum, Messages diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_mapstream_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_mapstream_dtypes.py index 1b18ef22..32c2b9cb 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_mapstream_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_mapstream_dtypes.py @@ -1,7 +1,8 @@ from abc import ABCMeta, abstractmethod -from pynumaflow_lite.mapstreamer import Datum, Message from collections.abc import AsyncIterator +from pynumaflow_lite.mapstreamer import Datum, Message + class MapStreamer(metaclass=ABCMeta): """ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_reduce_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_reduce_dtypes.py index b63f337d..eb5b6140 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_reduce_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_reduce_dtypes.py @@ -1,7 +1,8 @@ from abc import ABCMeta, abstractmethod -from pynumaflow_lite.reducer import Datum, Messages, Metadata from collections.abc import AsyncIterable +from pynumaflow_lite.reducer import Datum, Messages, Metadata + class Reducer(metaclass=ABCMeta): """ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_reducestreamer_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_reducestreamer_dtypes.py index e2d12b97..f024a0ad 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_reducestreamer_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_reducestreamer_dtypes.py @@ -1,7 +1,8 @@ from abc import ABCMeta, abstractmethod -from pynumaflow_lite.reducestreamer import Datum, Message, Metadata from collections.abc import AsyncIterable, AsyncIterator +from pynumaflow_lite.reducestreamer import Datum, Message, Metadata + class ReduceStreamer(metaclass=ABCMeta): """ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_sideinput_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_sideinput_dtypes.py index 09a72ebd..fff58cfc 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_sideinput_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_sideinput_dtypes.py @@ -1,4 +1,5 @@ from abc import ABCMeta, abstractmethod + from pynumaflow_lite.sideinputer import Response diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_sink_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_sink_dtypes.py index a9b298a5..95ec02b1 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_sink_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_sink_dtypes.py @@ -1,7 +1,8 @@ from abc import ABCMeta, abstractmethod -from pynumaflow_lite.sinker import Datum, Responses from collections.abc import AsyncIterable +from pynumaflow_lite.sinker import Datum, Responses + class Sinker(metaclass=ABCMeta): """ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_source_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_source_dtypes.py index 00ddf00a..2b418b87 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_source_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_source_dtypes.py @@ -1,12 +1,13 @@ from abc import ABCMeta, abstractmethod from collections.abc import AsyncIterator + from pynumaflow_lite.sourcer import ( - Message, - ReadRequest, AckRequest, + Message, NackRequest, - PendingResponse, PartitionsResponse, + PendingResponse, + ReadRequest, ) diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_sourcetransformer_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_sourcetransformer_dtypes.py index 971d3e67..000110dd 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_sourcetransformer_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_sourcetransformer_dtypes.py @@ -1,4 +1,5 @@ from abc import ABCMeta, abstractmethod + from pynumaflow_lite.sourcetransformer import Datum, Messages diff --git a/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi b/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi index 2e818ca1..92a68820 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi @@ -1,6 +1,6 @@ -from datetime import datetime -from typing import AsyncIterator, Optional, Callable from collections.abc import AsyncIterable +from datetime import datetime +from typing import AsyncIterator, Callable, Optional class Message: """ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi b/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi index d1e0903e..536ffc95 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi @@ -1,7 +1,7 @@ from __future__ import annotations -from typing import Optional, List, Dict, Callable, Awaitable, AsyncIterator import datetime as _dt +from typing import AsyncIterator, Awaitable, Callable, Dict, List, Optional class Message: keys: Optional[List[str]] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi b/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi index 865d9e09..cc22818e 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi @@ -1,7 +1,7 @@ from __future__ import annotations -from typing import Optional, List, Dict, Callable, Awaitable import datetime as _dt +from typing import Awaitable, Callable, Dict, List, Optional # Re-export the Python ABC for user convenience and typing from ._map_dtypes import Mapper as Mapper diff --git a/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi index 00e50c90..13aaa4bf 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi @@ -1,7 +1,7 @@ from __future__ import annotations -from typing import Optional, List, Dict, Callable, Awaitable, AsyncIterator import datetime as _dt +from typing import AsyncIterator, Awaitable, Callable, Dict, List, Optional class Message: keys: Optional[List[str]] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi index 6f31c43b..ea9e9001 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi @@ -1,8 +1,8 @@ from __future__ import annotations import datetime as _dt -from typing import Optional, List, Dict, Awaitable, Callable from collections.abc import AsyncIterable +from typing import Awaitable, Callable, Dict, List, Optional # Re-export the Python ABC for user convenience and typing from ._reduce_dtypes import Reducer as Reducer diff --git a/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi index 782716d2..66809fc8 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi @@ -1,8 +1,8 @@ from __future__ import annotations import datetime as _dt -from typing import Optional, List, Dict, Awaitable, AsyncIterator, Callable from collections.abc import AsyncIterable +from typing import AsyncIterator, Awaitable, Callable, Dict, List, Optional # Re-export the Python ABC for user convenience and typing from ._reducestreamer_dtypes import ReduceStreamer as ReduceStreamer diff --git a/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi index 198dfd7e..edcacc37 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi @@ -1,7 +1,7 @@ from __future__ import annotations import datetime as _dt -from typing import Optional, List, Dict, Awaitable +from typing import Awaitable, Dict, List, Optional # Re-export the Python ABC for user convenience and typing from ._session_reduce_dtypes import SessionReducer as SessionReducer diff --git a/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi b/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi index 4b432f1b..3d7ec5a0 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi @@ -1,7 +1,7 @@ from __future__ import annotations -from typing import Optional, List, Dict, Callable, Awaitable, AsyncIterator import datetime as _dt +from typing import AsyncIterator, Awaitable, Callable, Dict, List, Optional class SystemMetadata: """System-generated metadata groups per message (read-only for sink).""" diff --git a/packages/pynumaflow-lite/pynumaflow_lite/sourcer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/sourcer.pyi index dc2d9614..425076bc 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/sourcer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/sourcer.pyi @@ -1,7 +1,7 @@ from __future__ import annotations -from typing import Optional, List, Dict, Awaitable import datetime as _dt +from typing import Awaitable, Dict, List, Optional # Re-export the Python ABC for user convenience and typing from ._source_dtypes import Sourcer as Sourcer diff --git a/packages/pynumaflow-lite/pynumaflow_lite/sourcetransformer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/sourcetransformer.pyi index 63a828b1..181615d9 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/sourcetransformer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/sourcetransformer.pyi @@ -1,7 +1,7 @@ from __future__ import annotations -from typing import Optional, List, Dict, Awaitable import datetime as _dt +from typing import Awaitable, Dict, List, Optional # Re-export the Python ABC for user convenience and typing from ._sourcetransformer_dtypes import SourceTransformer as SourceTransformer diff --git a/packages/pynumaflow-lite/pyproject.toml b/packages/pynumaflow-lite/pyproject.toml index bb198180..fd80a99e 100644 --- a/packages/pynumaflow-lite/pyproject.toml +++ b/packages/pynumaflow-lite/pyproject.toml @@ -14,9 +14,19 @@ dynamic = ["version"] [tool.maturin] features = ["pyo3/extension-module"] +[tool.ruff] +src = ["pynumaflow_lite", "tests", "manifests"] +target-version = "py38" + +[tool.ruff.lint] +select = ["E", "F", "I", "UP"] +ignore = ["E501"] + +[tool.ruff.lint.per-file-ignores] +"**/*.pyi" = ["UP006", "UP045"] + [dependency-groups] dev = [ - "black>=24.8.0", "pytest>=8.3.5", "ruff>=0.15.8", ] diff --git a/packages/pynumaflow-lite/tests/_test_utils.py b/packages/pynumaflow-lite/tests/_test_utils.py index 0780dba2..839e1fa8 100644 --- a/packages/pynumaflow-lite/tests/_test_utils.py +++ b/packages/pynumaflow-lite/tests/_test_utils.py @@ -123,6 +123,6 @@ def run_python_server_with_rust_client( except Exception: pass - assert ( - server.returncode == 0 - ), f"Server did not exit cleanly, code={server.returncode}" + assert server.returncode == 0, ( + f"Server did not exit cleanly, code={server.returncode}" + ) diff --git a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py index c76b9237..b79a2eea 100644 --- a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py +++ b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py @@ -5,16 +5,16 @@ flushing sorted data when the watermark advances. """ -import signal import asyncio +import signal from datetime import datetime from typing import AsyncIterator from pynumaflow_lite.accumulator import ( + Accumulator, + AccumulatorAsyncServer, Datum, Message, - AccumulatorAsyncServer, - Accumulator, ) diff --git a/packages/pynumaflow-lite/tests/examples/sideinput_example.py b/packages/pynumaflow-lite/tests/examples/sideinput_example.py index 59f54d06..d35c6e1d 100644 --- a/packages/pynumaflow-lite/tests/examples/sideinput_example.py +++ b/packages/pynumaflow-lite/tests/examples/sideinput_example.py @@ -1,6 +1,7 @@ import asyncio -import signal import datetime +import signal + from pynumaflow_lite import sideinputer diff --git a/packages/pynumaflow-lite/tests/examples/sink_log_class.py b/packages/pynumaflow-lite/tests/examples/sink_log_class.py index de4b2976..ba22d1dd 100644 --- a/packages/pynumaflow-lite/tests/examples/sink_log_class.py +++ b/packages/pynumaflow-lite/tests/examples/sink_log_class.py @@ -1,10 +1,10 @@ import asyncio import logging import signal +from collections.abc import AsyncIterable from pynumaflow_lite import sinker from pynumaflow_lite._sink_dtypes import Sinker -from collections.abc import AsyncIterable # Configure logging logging.basicConfig(level=logging.INFO) diff --git a/packages/pynumaflow-lite/tests/examples/source_simple.py b/packages/pynumaflow-lite/tests/examples/source_simple.py index 924118ba..691575cb 100644 --- a/packages/pynumaflow-lite/tests/examples/source_simple.py +++ b/packages/pynumaflow-lite/tests/examples/source_simple.py @@ -1,8 +1,8 @@ import asyncio import logging import signal -from datetime import datetime, timezone from collections.abc import AsyncIterator +from datetime import datetime, timezone from pynumaflow_lite import sourcer from pynumaflow_lite._source_dtypes import Sourcer @@ -36,7 +36,7 @@ async def read_handler( # Generate the requested number of messages for i in range(datum.num_records): # Create message payload - payload = f"message-{self.counter}".encode("utf-8") + payload = f"message-{self.counter}".encode() # Create offset offset = sourcer.Offset( diff --git a/packages/pynumaflow-lite/uv.lock b/packages/pynumaflow-lite/uv.lock index 11fb20ec..75663730 100644 --- a/packages/pynumaflow-lite/uv.lock +++ b/packages/pynumaflow-lite/uv.lock @@ -7,171 +7,6 @@ resolution-markers = [ "python_full_version < '3.9'", ] -[[package]] -name = "black" -version = "24.8.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.9'", -] -dependencies = [ - { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "mypy-extensions", marker = "python_full_version < '3.9'" }, - { name = "packaging", marker = "python_full_version < '3.9'" }, - { name = "pathspec", version = "0.12.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "platformdirs", version = "4.3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "tomli", marker = "python_full_version < '3.9'" }, - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/b0/46fb0d4e00372f4a86a6f8efa3cb193c9f64863615e39010b1477e010578/black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f", size = 644810, upload-time = "2024-08-02T17:43:18.405Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/6e/74e29edf1fba3887ed7066930a87f698ffdcd52c5dbc263eabb06061672d/black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6", size = 1632092, upload-time = "2024-08-02T17:47:26.911Z" }, - { url = "https://files.pythonhosted.org/packages/ab/49/575cb6c3faee690b05c9d11ee2e8dba8fbd6d6c134496e644c1feb1b47da/black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb", size = 1457529, upload-time = "2024-08-02T17:47:29.109Z" }, - { url = "https://files.pythonhosted.org/packages/7a/b4/d34099e95c437b53d01c4aa37cf93944b233066eb034ccf7897fa4e5f286/black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42", size = 1757443, upload-time = "2024-08-02T17:46:20.306Z" }, - { url = "https://files.pythonhosted.org/packages/87/a0/6d2e4175ef364b8c4b64f8441ba041ed65c63ea1db2720d61494ac711c15/black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a", size = 1418012, upload-time = "2024-08-02T17:47:20.33Z" }, - { url = "https://files.pythonhosted.org/packages/08/a6/0a3aa89de9c283556146dc6dbda20cd63a9c94160a6fbdebaf0918e4a3e1/black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1", size = 1615080, upload-time = "2024-08-02T17:48:05.467Z" }, - { url = "https://files.pythonhosted.org/packages/db/94/b803d810e14588bb297e565821a947c108390a079e21dbdcb9ab6956cd7a/black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af", size = 1438143, upload-time = "2024-08-02T17:47:30.247Z" }, - { url = "https://files.pythonhosted.org/packages/a5/b5/f485e1bbe31f768e2e5210f52ea3f432256201289fd1a3c0afda693776b0/black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4", size = 1738774, upload-time = "2024-08-02T17:46:17.837Z" }, - { url = "https://files.pythonhosted.org/packages/a8/69/a000fc3736f89d1bdc7f4a879f8aaf516fb03613bb51a0154070383d95d9/black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af", size = 1427503, upload-time = "2024-08-02T17:46:22.654Z" }, - { url = "https://files.pythonhosted.org/packages/a2/a8/05fb14195cfef32b7c8d4585a44b7499c2a4b205e1662c427b941ed87054/black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368", size = 1646132, upload-time = "2024-08-02T17:49:52.843Z" }, - { url = "https://files.pythonhosted.org/packages/41/77/8d9ce42673e5cb9988f6df73c1c5c1d4e9e788053cccd7f5fb14ef100982/black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed", size = 1448665, upload-time = "2024-08-02T17:47:54.479Z" }, - { url = "https://files.pythonhosted.org/packages/cc/94/eff1ddad2ce1d3cc26c162b3693043c6b6b575f538f602f26fe846dfdc75/black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018", size = 1762458, upload-time = "2024-08-02T17:46:19.384Z" }, - { url = "https://files.pythonhosted.org/packages/28/ea/18b8d86a9ca19a6942e4e16759b2fa5fc02bbc0eb33c1b866fcd387640ab/black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2", size = 1436109, upload-time = "2024-08-02T17:46:52.97Z" }, - { url = "https://files.pythonhosted.org/packages/9f/d4/ae03761ddecc1a37d7e743b89cccbcf3317479ff4b88cfd8818079f890d0/black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd", size = 1617322, upload-time = "2024-08-02T17:51:20.203Z" }, - { url = "https://files.pythonhosted.org/packages/14/4b/4dfe67eed7f9b1ddca2ec8e4418ea74f0d1dc84d36ea874d618ffa1af7d4/black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2", size = 1442108, upload-time = "2024-08-02T17:50:40.824Z" }, - { url = "https://files.pythonhosted.org/packages/97/14/95b3f91f857034686cae0e73006b8391d76a8142d339b42970eaaf0416ea/black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e", size = 1745786, upload-time = "2024-08-02T17:46:02.939Z" }, - { url = "https://files.pythonhosted.org/packages/95/54/68b8883c8aa258a6dde958cd5bdfada8382bec47c5162f4a01e66d839af1/black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920", size = 1426754, upload-time = "2024-08-02T17:46:38.603Z" }, - { url = "https://files.pythonhosted.org/packages/13/b2/b3f24fdbb46f0e7ef6238e131f13572ee8279b70f237f221dd168a9dba1a/black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c", size = 1631706, upload-time = "2024-08-02T17:49:57.606Z" }, - { url = "https://files.pythonhosted.org/packages/d9/35/31010981e4a05202a84a3116423970fd1a59d2eda4ac0b3570fbb7029ddc/black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e", size = 1457429, upload-time = "2024-08-02T17:49:12.764Z" }, - { url = "https://files.pythonhosted.org/packages/27/25/3f706b4f044dd569a20a4835c3b733dedea38d83d2ee0beb8178a6d44945/black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47", size = 1756488, upload-time = "2024-08-02T17:46:08.067Z" }, - { url = "https://files.pythonhosted.org/packages/63/72/79375cd8277cbf1c5670914e6bd4c1b15dea2c8f8e906dc21c448d0535f0/black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb", size = 1417721, upload-time = "2024-08-02T17:46:42.637Z" }, - { url = "https://files.pythonhosted.org/packages/27/1e/83fa8a787180e1632c3d831f7e58994d7aaf23a0961320d21e84f922f919/black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed", size = 206504, upload-time = "2024-08-02T17:43:15.747Z" }, -] - -[[package]] -name = "black" -version = "25.11.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.9.*'", -] -dependencies = [ - { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "mypy-extensions", marker = "python_full_version == '3.9.*'" }, - { name = "packaging", marker = "python_full_version == '3.9.*'" }, - { name = "pathspec", version = "1.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "pytokens", marker = "python_full_version == '3.9.*'" }, - { name = "tomli", marker = "python_full_version == '3.9.*'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/d2/6caccbc96f9311e8ec3378c296d4f4809429c43a6cd2394e3c390e86816d/black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", size = 1743501, upload-time = "2025-11-10T01:59:06.202Z" }, - { url = "https://files.pythonhosted.org/packages/69/35/b986d57828b3f3dccbf922e2864223197ba32e74c5004264b1c62bc9f04d/black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", size = 1597308, upload-time = "2025-11-10T01:57:58.633Z" }, - { url = "https://files.pythonhosted.org/packages/39/8e/8b58ef4b37073f52b64a7b2dd8c9a96c84f45d6f47d878d0aa557e9a2d35/black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", size = 1656194, upload-time = "2025-11-10T01:57:10.909Z" }, - { url = "https://files.pythonhosted.org/packages/8d/30/9c2267a7955ecc545306534ab88923769a979ac20a27cf618d370091e5dd/black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03", size = 1347996, upload-time = "2025-11-10T01:57:22.391Z" }, - { url = "https://files.pythonhosted.org/packages/c4/62/d304786b75ab0c530b833a89ce7d997924579fb7484ecd9266394903e394/black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", size = 1727891, upload-time = "2025-11-10T02:01:40.507Z" }, - { url = "https://files.pythonhosted.org/packages/82/5d/ffe8a006aa522c9e3f430e7b93568a7b2163f4b3f16e8feb6d8c3552761a/black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", size = 1581875, upload-time = "2025-11-10T01:57:51.192Z" }, - { url = "https://files.pythonhosted.org/packages/cb/c8/7c8bda3108d0bb57387ac41b4abb5c08782b26da9f9c4421ef6694dac01a/black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", size = 1642716, upload-time = "2025-11-10T01:56:51.589Z" }, - { url = "https://files.pythonhosted.org/packages/34/b9/f17dea34eecb7cc2609a89627d480fb6caea7b86190708eaa7eb15ed25e7/black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", size = 1352904, upload-time = "2025-11-10T01:59:26.252Z" }, - { url = "https://files.pythonhosted.org/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", size = 1772831, upload-time = "2025-11-10T02:03:47Z" }, - { url = "https://files.pythonhosted.org/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", size = 1608520, upload-time = "2025-11-10T01:58:46.895Z" }, - { url = "https://files.pythonhosted.org/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", size = 1682719, upload-time = "2025-11-10T01:56:55.24Z" }, - { url = "https://files.pythonhosted.org/packages/96/fb/f7dc2793a22cdf74a72114b5ed77fe3349a2e09ef34565857a2f917abdf2/black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", size = 1362684, upload-time = "2025-11-10T01:57:07.639Z" }, - { url = "https://files.pythonhosted.org/packages/ad/47/3378d6a2ddefe18553d1115e36aea98f4a90de53b6a3017ed861ba1bd3bc/black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", size = 1772446, upload-time = "2025-11-10T02:02:16.181Z" }, - { url = "https://files.pythonhosted.org/packages/ba/4b/0f00bfb3d1f7e05e25bfc7c363f54dc523bb6ba502f98f4ad3acf01ab2e4/black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", size = 1607983, upload-time = "2025-11-10T02:02:52.502Z" }, - { url = "https://files.pythonhosted.org/packages/99/fe/49b0768f8c9ae57eb74cc10a1f87b4c70453551d8ad498959721cc345cb7/black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", size = 1682481, upload-time = "2025-11-10T01:57:12.35Z" }, - { url = "https://files.pythonhosted.org/packages/55/17/7e10ff1267bfa950cc16f0a411d457cdff79678fbb77a6c73b73a5317904/black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", size = 1363869, upload-time = "2025-11-10T01:58:24.608Z" }, - { url = "https://files.pythonhosted.org/packages/67/c0/cc865ce594d09e4cd4dfca5e11994ebb51604328489f3ca3ae7bb38a7db5/black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", size = 1771358, upload-time = "2025-11-10T02:03:33.331Z" }, - { url = "https://files.pythonhosted.org/packages/37/77/4297114d9e2fd2fc8ab0ab87192643cd49409eb059e2940391e7d2340e57/black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", size = 1612902, upload-time = "2025-11-10T01:59:33.382Z" }, - { url = "https://files.pythonhosted.org/packages/de/63/d45ef97ada84111e330b2b2d45e1dd163e90bd116f00ac55927fb6bf8adb/black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", size = 1680571, upload-time = "2025-11-10T01:57:04.239Z" }, - { url = "https://files.pythonhosted.org/packages/ff/4b/5604710d61cdff613584028b4cb4607e56e148801ed9b38ee7970799dab6/black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", size = 1382599, upload-time = "2025-11-10T01:57:57.427Z" }, - { url = "https://files.pythonhosted.org/packages/d5/9a/5b2c0e3215fe748fcf515c2dd34658973a1210bf610e24de5ba887e4f1c8/black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06", size = 1743063, upload-time = "2025-11-10T02:02:43.175Z" }, - { url = "https://files.pythonhosted.org/packages/a1/20/245164c6efc27333409c62ba54dcbfbe866c6d1957c9a6c0647786e950da/black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2", size = 1596867, upload-time = "2025-11-10T02:00:17.157Z" }, - { url = "https://files.pythonhosted.org/packages/ca/6f/1a3859a7da205f3d50cf3a8bec6bdc551a91c33ae77a045bb24c1f46ab54/black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc", size = 1655678, upload-time = "2025-11-10T01:57:09.028Z" }, - { url = "https://files.pythonhosted.org/packages/56/1a/6dec1aeb7be90753d4fcc273e69bc18bfd34b353223ed191da33f7519410/black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc", size = 1347452, upload-time = "2025-11-10T01:57:01.871Z" }, - { url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" }, -] - -[[package]] -name = "black" -version = "26.3.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "mypy-extensions", marker = "python_full_version >= '3.10'" }, - { name = "packaging", marker = "python_full_version >= '3.10'" }, - { name = "pathspec", version = "1.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", version = "4.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pytokens", marker = "python_full_version >= '3.10'" }, - { name = "tomli", marker = "python_full_version == '3.10.*'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e1/c5/61175d618685d42b005847464b8fb4743a67b1b8fdb75e50e5a96c31a27a/black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07", size = 666155, upload-time = "2026-03-12T03:36:03.593Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/a8/11170031095655d36ebc6664fe0897866f6023892396900eec0e8fdc4299/black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2", size = 1866562, upload-time = "2026-03-12T03:39:58.639Z" }, - { url = "https://files.pythonhosted.org/packages/69/ce/9e7548d719c3248c6c2abfd555d11169457cbd584d98d179111338423790/black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b", size = 1703623, upload-time = "2026-03-12T03:40:00.347Z" }, - { url = "https://files.pythonhosted.org/packages/7f/0a/8d17d1a9c06f88d3d030d0b1d4373c1551146e252afe4547ed601c0e697f/black-26.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac", size = 1768388, upload-time = "2026-03-12T03:40:01.765Z" }, - { url = "https://files.pythonhosted.org/packages/52/79/c1ee726e221c863cde5164f925bacf183dfdf0397d4e3f94889439b947b4/black-26.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a", size = 1412969, upload-time = "2026-03-12T03:40:03.252Z" }, - { url = "https://files.pythonhosted.org/packages/73/a5/15c01d613f5756f68ed8f6d4ec0a1e24b82b18889fa71affd3d1f7fad058/black-26.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a", size = 1220345, upload-time = "2026-03-12T03:40:04.892Z" }, - { url = "https://files.pythonhosted.org/packages/17/57/5f11c92861f9c92eb9dddf515530bc2d06db843e44bdcf1c83c1427824bc/black-26.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff", size = 1851987, upload-time = "2026-03-12T03:40:06.248Z" }, - { url = "https://files.pythonhosted.org/packages/54/aa/340a1463660bf6831f9e39646bf774086dbd8ca7fc3cded9d59bbdf4ad0a/black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c", size = 1689499, upload-time = "2026-03-12T03:40:07.642Z" }, - { url = "https://files.pythonhosted.org/packages/f3/01/b726c93d717d72733da031d2de10b92c9fa4c8d0c67e8a8a372076579279/black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5", size = 1754369, upload-time = "2026-03-12T03:40:09.279Z" }, - { url = "https://files.pythonhosted.org/packages/e3/09/61e91881ca291f150cfc9eb7ba19473c2e59df28859a11a88248b5cbbc4d/black-26.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e", size = 1413613, upload-time = "2026-03-12T03:40:10.943Z" }, - { url = "https://files.pythonhosted.org/packages/16/73/544f23891b22e7efe4d8f812371ab85b57f6a01b2fc45e3ba2e52ba985b8/black-26.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5", size = 1219719, upload-time = "2026-03-12T03:40:12.597Z" }, - { url = "https://files.pythonhosted.org/packages/dc/f8/da5eae4fc75e78e6dceb60624e1b9662ab00d6b452996046dfa9b8a6025b/black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1", size = 1895920, upload-time = "2026-03-12T03:40:13.921Z" }, - { url = "https://files.pythonhosted.org/packages/2c/9f/04e6f26534da2e1629b2b48255c264cabf5eedc5141d04516d9d68a24111/black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f", size = 1718499, upload-time = "2026-03-12T03:40:15.239Z" }, - { url = "https://files.pythonhosted.org/packages/04/91/a5935b2a63e31b331060c4a9fdb5a6c725840858c599032a6f3aac94055f/black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7", size = 1794994, upload-time = "2026-03-12T03:40:17.124Z" }, - { url = "https://files.pythonhosted.org/packages/e7/0a/86e462cdd311a3c2a8ece708d22aba17d0b2a0d5348ca34b40cdcbea512e/black-26.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983", size = 1420867, upload-time = "2026-03-12T03:40:18.83Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e5/22515a19cb7eaee3440325a6b0d95d2c0e88dd180cb011b12ae488e031d1/black-26.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb", size = 1230124, upload-time = "2026-03-12T03:40:20.425Z" }, - { url = "https://files.pythonhosted.org/packages/f5/77/5728052a3c0450c53d9bb3945c4c46b91baa62b2cafab6801411b6271e45/black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54", size = 1895034, upload-time = "2026-03-12T03:40:21.813Z" }, - { url = "https://files.pythonhosted.org/packages/52/73/7cae55fdfdfbe9d19e9a8d25d145018965fe2079fa908101c3733b0c55a0/black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f", size = 1718503, upload-time = "2026-03-12T03:40:23.666Z" }, - { url = "https://files.pythonhosted.org/packages/e1/87/af89ad449e8254fdbc74654e6467e3c9381b61472cc532ee350d28cfdafb/black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56", size = 1793557, upload-time = "2026-03-12T03:40:25.497Z" }, - { url = "https://files.pythonhosted.org/packages/43/10/d6c06a791d8124b843bf325ab4ac7d2f5b98731dff84d6064eafd687ded1/black-26.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839", size = 1422766, upload-time = "2026-03-12T03:40:27.14Z" }, - { url = "https://files.pythonhosted.org/packages/59/4f/40a582c015f2d841ac24fed6390bd68f0fc896069ff3a886317959c9daf8/black-26.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2", size = 1232140, upload-time = "2026-03-12T03:40:28.882Z" }, - { url = "https://files.pythonhosted.org/packages/d5/da/e36e27c9cebc1311b7579210df6f1c86e50f2d7143ae4fcf8a5017dc8809/black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78", size = 1889234, upload-time = "2026-03-12T03:40:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/0e/7b/9871acf393f64a5fa33668c19350ca87177b181f44bb3d0c33b2d534f22c/black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568", size = 1720522, upload-time = "2026-03-12T03:40:32.346Z" }, - { url = "https://files.pythonhosted.org/packages/03/87/e766c7f2e90c07fb7586cc787c9ae6462b1eedab390191f2b7fc7f6170a9/black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f", size = 1787824, upload-time = "2026-03-12T03:40:33.636Z" }, - { url = "https://files.pythonhosted.org/packages/ac/94/2424338fb2d1875e9e83eed4c8e9c67f6905ec25afd826a911aea2b02535/black-26.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c", size = 1445855, upload-time = "2026-03-12T03:40:35.442Z" }, - { url = "https://files.pythonhosted.org/packages/86/43/0c3338bd928afb8ee7471f1a4eec3bdbe2245ccb4a646092a222e8669840/black-26.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1", size = 1258109, upload-time = "2026-03-12T03:40:36.832Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0d/52d98722666d6fc6c3dd4c76df339501d6efd40e0ff95e6186a7b7f0befd/black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b", size = 207542, upload-time = "2026-03-12T03:36:01.668Z" }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.9.*'", - "python_full_version < '3.9'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, -] - -[[package]] -name = "click" -version = "8.3.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -203,15 +38,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] -[[package]] -name = "mypy-extensions" -version = "1.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, -] - [[package]] name = "packaging" version = "25.0" @@ -221,67 +47,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] -[[package]] -name = "pathspec" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.9'", -] -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, -] - -[[package]] -name = "pathspec" -version = "1.0.4" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.3.6" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.9'", -] -sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302, upload-time = "2024-09-17T19:06:50.688Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439, upload-time = "2024-09-17T19:06:49.212Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.4.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version == '3.9.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.9.4" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, -] - [[package]] name = "pluggy" version = "1.5.0" @@ -322,9 +87,6 @@ source = { editable = "." } [package.dev-dependencies] dev = [ - { name = "black", version = "24.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "black", version = "25.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, - { name = "black", version = "26.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, { name = "ruff" }, @@ -334,7 +96,6 @@ dev = [ [package.metadata.requires-dev] dev = [ - { name = "black", specifier = ">=24.8.0" }, { name = "pytest", specifier = ">=8.3.5" }, { name = "ruff", specifier = ">=0.15.8" }, ] @@ -381,55 +142,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, ] -[[package]] -name = "pytokens" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", size = 161522, upload-time = "2026-01-30T01:02:50.393Z" }, - { url = "https://files.pythonhosted.org/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", size = 246945, upload-time = "2026-01-30T01:02:52.399Z" }, - { url = "https://files.pythonhosted.org/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", size = 259525, upload-time = "2026-01-30T01:02:53.737Z" }, - { url = "https://files.pythonhosted.org/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", size = 262693, upload-time = "2026-01-30T01:02:54.871Z" }, - { url = "https://files.pythonhosted.org/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", size = 103567, upload-time = "2026-01-30T01:02:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", size = 160864, upload-time = "2026-01-30T01:02:57.882Z" }, - { url = "https://files.pythonhosted.org/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", size = 248565, upload-time = "2026-01-30T01:02:59.912Z" }, - { url = "https://files.pythonhosted.org/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", size = 260824, upload-time = "2026-01-30T01:03:01.471Z" }, - { url = "https://files.pythonhosted.org/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", size = 264075, upload-time = "2026-01-30T01:03:04.143Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", size = 103323, upload-time = "2026-01-30T01:03:05.412Z" }, - { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" }, - { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" }, - { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" }, - { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, - { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, - { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, - { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, - { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, - { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, - { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, - { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, - { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, - { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, - { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, - { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, - { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, - { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, - { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, - { url = "https://files.pythonhosted.org/packages/4a/08/968c22e06ab6570788964e2d5a702db9a3816e20ffde380b2b1385541d64/pytokens-0.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:da5baeaf7116dced9c6bb76dc31ba04a2dc3695f3d9f74741d7910122b456edc", size = 154847, upload-time = "2026-01-30T01:03:32.268Z" }, - { url = "https://files.pythonhosted.org/packages/09/2b/2061bb4b300e6921f7968724b185237627a8a3dc4f311e34079dfadf9b65/pytokens-0.4.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11edda0942da80ff58c4408407616a310adecae1ddd22eef8c692fe266fa5009", size = 238610, upload-time = "2026-01-30T01:03:33.809Z" }, - { url = "https://files.pythonhosted.org/packages/1e/64/abf6e43523ea9b4aea69bfe22788a518806741107238674e5c0fb6fc8dc1/pytokens-0.4.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0fc71786e629cef478cbf29d7ea1923299181d0699dbe7c3c0f4a583811d9fc1", size = 252493, upload-time = "2026-01-30T01:03:35.715Z" }, - { url = "https://files.pythonhosted.org/packages/dc/fb/bcb6784c87d1de182afb284f37b07bc172eebec91ddc20e83aec767e4963/pytokens-0.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dcafc12c30dbaf1e2af0490978352e0c4041a7cde31f4f81435c2a5e8b9cabb6", size = 255651, upload-time = "2026-01-30T01:03:36.961Z" }, - { url = "https://files.pythonhosted.org/packages/1a/0c/0c33752be2209498661903f6f240779aea5c9adbd85d22336ce3f7718e81/pytokens-0.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:42f144f3aafa5d92bad964d471a581651e28b24434d184871bd02e3a0d956037", size = 104346, upload-time = "2026-01-30T01:03:38.069Z" }, - { url = "https://files.pythonhosted.org/packages/51/2a/f125667ce48105bf1f4e50e03cfa7b24b8c4f47684d7f1cf4dcb6f6b1c15/pytokens-0.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:34bcc734bd2f2d5fe3b34e7b3c0116bfb2397f2d9666139988e7a3eb5f7400e3", size = 161464, upload-time = "2026-01-30T01:03:39.11Z" }, - { url = "https://files.pythonhosted.org/packages/40/df/065a30790a7ca6bb48ad9018dd44668ed9135610ebf56a2a4cb8e513fd5c/pytokens-0.4.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941d4343bf27b605e9213b26bfa1c4bf197c9c599a9627eb7305b0defcfe40c1", size = 246159, upload-time = "2026-01-30T01:03:40.131Z" }, - { url = "https://files.pythonhosted.org/packages/a5/1c/fd09976a7e04960dabc07ab0e0072c7813d566ec67d5490a4c600683c158/pytokens-0.4.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3ad72b851e781478366288743198101e5eb34a414f1d5627cdd585ca3b25f1db", size = 259120, upload-time = "2026-01-30T01:03:41.233Z" }, - { url = "https://files.pythonhosted.org/packages/52/49/59fdc6fc5a390ae9f308eadeb97dfc70fc2d804ffc49dd39fc97604622ec/pytokens-0.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:682fa37ff4d8e95f7df6fe6fe6a431e8ed8e788023c6bcc0f0880a12eab80ad1", size = 262196, upload-time = "2026-01-30T01:03:42.696Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e7/d6734dccf0080e3dc00a55b0827ab5af30c886f8bc127bbc04bc3445daec/pytokens-0.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:30f51edd9bb7f85c748979384165601d028b84f7bd13fe14d3e065304093916a", size = 103510, upload-time = "2026-01-30T01:03:43.915Z" }, - { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, -] - [[package]] name = "ruff" version = "0.15.8" From 430016408c3e1433b13b4e457fd70d2124c5c183 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 11:58:11 +0530 Subject: [PATCH 02/15] Upgrade dependencies Signed-off-by: Sreekanth --- packages/pynumaflow-lite/Cargo.toml | 24 ++-- packages/pynumaflow-lite/pyproject.toml | 10 +- .../pynumaflow-lite/src/accumulate/mod.rs | 2 +- packages/pynumaflow-lite/src/batchmap/mod.rs | 6 +- packages/pynumaflow-lite/src/map/mod.rs | 8 +- packages/pynumaflow-lite/src/mapstream/mod.rs | 4 +- packages/pynumaflow-lite/src/pyiterables.rs | 2 +- packages/pynumaflow-lite/src/reduce/mod.rs | 8 +- .../pynumaflow-lite/src/session_reduce/mod.rs | 2 +- packages/pynumaflow-lite/src/sideinput/mod.rs | 2 +- packages/pynumaflow-lite/src/sink/mod.rs | 12 +- packages/pynumaflow-lite/src/source/mod.rs | 16 +-- .../src/sourcetransform/mod.rs | 8 +- packages/pynumaflow-lite/uv.lock | 133 +++++------------- 14 files changed, 87 insertions(+), 150 deletions(-) diff --git a/packages/pynumaflow-lite/Cargo.toml b/packages/pynumaflow-lite/Cargo.toml index c19a0fa7..958cf39f 100644 --- a/packages/pynumaflow-lite/Cargo.toml +++ b/packages/pynumaflow-lite/Cargo.toml @@ -9,18 +9,18 @@ name = "pynumaflow_lite" crate-type = ["cdylib", "rlib"] [dependencies] -numaflow = { git = "https://github.com/numaproj/numaflow-rs.git", rev = "44ee3068fcf7088ff265df7ae7ce1881a40694ff" } -pyo3 = { version = "0.27.1", features = ["chrono", "experimental-inspect"] } -tokio = "1.47.1" -tonic = "0.14.2" -tokio-stream = "0.1.17" -tower = "0.5.2" -hyper-util = "0.1.16" -prost-types = "0.14.1" -chrono = "0.4.42" -pyo3-async-runtimes = { version = "0.27.0", features = ["tokio-runtime"] } -futures-core = "0.3.31" -pin-project = "1.1.10" +numaflow = { git = "https://github.com/numaproj/numaflow-rs.git", rev = "de2fdc16da2f2bfb12ee04050e6e60c809692c2c" } +pyo3 = { version = "0.29.0", features = ["chrono", "experimental-inspect"] } +tokio = "1.52.3" +tonic = "0.14.6" +tokio-stream = "0.1.18" +tower = "0.5.3" +hyper-util = "0.1.20" +prost-types = "0.14.4" +chrono = "0.4.45" +pyo3-async-runtimes = { version = "0.29.0", features = ["tokio-runtime"] } +futures-core = "0.3.32" +pin-project = "1.1.13" ## Binaries for testing diff --git a/packages/pynumaflow-lite/pyproject.toml b/packages/pynumaflow-lite/pyproject.toml index fd80a99e..33d39672 100644 --- a/packages/pynumaflow-lite/pyproject.toml +++ b/packages/pynumaflow-lite/pyproject.toml @@ -1,10 +1,10 @@ [build-system] -requires = ["maturin>=1.8,<2.0"] +requires = ["maturin>=1.14,<2.0"] build-backend = "maturin" [project] name = "pynumaflow-lite" -requires-python = ">=3.8" +requires-python = ">=3.10" classifiers = [ "Programming Language :: Rust", "Programming Language :: Python :: Implementation :: CPython", @@ -16,7 +16,7 @@ features = ["pyo3/extension-module"] [tool.ruff] src = ["pynumaflow_lite", "tests", "manifests"] -target-version = "py38" +target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "UP"] @@ -27,6 +27,6 @@ ignore = ["E501"] [dependency-groups] dev = [ - "pytest>=8.3.5", - "ruff>=0.15.8", + "pytest>=9.1.1", + "ruff>=0.15.20", ] diff --git a/packages/pynumaflow-lite/src/accumulate/mod.rs b/packages/pynumaflow-lite/src/accumulate/mod.rs index 18b28db6..3cba3ffc 100644 --- a/packages/pynumaflow-lite/src/accumulate/mod.rs +++ b/packages/pynumaflow-lite/src/accumulate/mod.rs @@ -9,7 +9,7 @@ use pyo3::prelude::*; use tokio::sync::mpsc; /// A message to be sent to the next vertex from an accumulator handler. -#[pyclass(module = "pynumaflow_lite.accumulator")] +#[pyclass(module = "pynumaflow_lite.accumulator", from_py_object)] #[derive(Clone, Debug)] pub struct Message { #[pyo3(get)] diff --git a/packages/pynumaflow-lite/src/batchmap/mod.rs b/packages/pynumaflow-lite/src/batchmap/mod.rs index bab1a3f4..fc43433b 100644 --- a/packages/pynumaflow-lite/src/batchmap/mod.rs +++ b/packages/pynumaflow-lite/src/batchmap/mod.rs @@ -14,7 +14,7 @@ use pyo3::prelude::*; use std::sync::Mutex; /// A message to be sent for a single datum in batch response. -#[pyclass(module = "pynumaflow_lite.batchmapper")] +#[pyclass(module = "pynumaflow_lite.batchmapper", from_py_object)] #[derive(Clone, Default, Debug)] pub struct Message { /// Keys are a collection of strings which will be passed on to the next vertex as is. It can @@ -134,7 +134,7 @@ impl From for Datum { } /// BatchResponse mirrors numaflow::batchmap::BatchResponse for Python -#[pyclass(module = "pynumaflow_lite.batchmapper")] +#[pyclass(module = "pynumaflow_lite.batchmapper", from_py_object)] #[derive(Clone, Debug)] pub struct BatchResponse { #[pyo3(get)] @@ -169,7 +169,7 @@ impl BatchResponse { } /// A collection of BatchResponse objects for a batch. -#[pyclass(module = "pynumaflow_lite.batchmapper")] +#[pyclass(module = "pynumaflow_lite.batchmapper", from_py_object)] #[derive(Clone, Debug)] pub struct BatchResponses { pub(crate) responses: Vec, diff --git a/packages/pynumaflow-lite/src/map/mod.rs b/packages/pynumaflow-lite/src/map/mod.rs index 4609d1d4..85c3843c 100644 --- a/packages/pynumaflow-lite/src/map/mod.rs +++ b/packages/pynumaflow-lite/src/map/mod.rs @@ -13,7 +13,7 @@ use std::sync::Mutex; /// SystemMetadata wraps system-generated metadata groups per message. /// It is read-only to UDFs. -#[pyclass(module = "pynumaflow_lite.mapper")] +#[pyclass(module = "pynumaflow_lite.mapper", from_py_object)] #[derive(Clone, Default, Debug)] pub struct SystemMetadata { data: HashMap>>, @@ -76,7 +76,7 @@ impl From for SystemMetadata { /// UserMetadata wraps user-defined metadata groups per message. /// Users can read and write to this metadata. -#[pyclass(module = "pynumaflow_lite.mapper")] +#[pyclass(module = "pynumaflow_lite.mapper", from_py_object)] #[derive(Clone, Default, Debug)] pub struct UserMetadata { data: HashMap>>, @@ -180,7 +180,7 @@ impl From for map::UserMetadata { } /// A collection of [Message]s. -#[pyclass(module = "pynumaflow_lite.mapper")] +#[pyclass(module = "pynumaflow_lite.mapper", from_py_object)] #[derive(Clone, Debug)] pub struct Messages { pub(crate) messages: Vec, @@ -210,7 +210,7 @@ impl Messages { } /// A message to be sent to the next vertex. -#[pyclass(module = "pynumaflow_lite.mapper")] +#[pyclass(module = "pynumaflow_lite.mapper", from_py_object)] #[derive(Clone, Default, Debug)] pub struct Message { /// Keys are a collection of strings which will be passed on to the next vertex as is. It can diff --git a/packages/pynumaflow-lite/src/mapstream/mod.rs b/packages/pynumaflow-lite/src/mapstream/mod.rs index 35566f9a..24e126f0 100644 --- a/packages/pynumaflow-lite/src/mapstream/mod.rs +++ b/packages/pynumaflow-lite/src/mapstream/mod.rs @@ -9,7 +9,7 @@ pub mod server; use pyo3::prelude::*; /// Streaming Datum mirrors MapStreamRequest for Python -#[pyclass(module = "pynumaflow_lite.mapstreamer")] +#[pyclass(module = "pynumaflow_lite.mapstreamer", from_py_object)] #[derive(Clone)] pub struct Datum { /// Set of keys in the (key, value) terminology of the map/reduce paradigm. @@ -61,7 +61,7 @@ impl From for Datum { } /// A message to be sent downstream from a streaming handler. -#[pyclass(module = "pynumaflow_lite.mapstreamer")] +#[pyclass(module = "pynumaflow_lite.mapstreamer", from_py_object)] #[derive(Clone, Default, Debug)] pub struct Message { /// Keys are a collection of strings which will be passed on to the next vertex as is. diff --git a/packages/pynumaflow-lite/src/pyiterables.rs b/packages/pynumaflow-lite/src/pyiterables.rs index d85721d0..dc361320 100644 --- a/packages/pynumaflow-lite/src/pyiterables.rs +++ b/packages/pynumaflow-lite/src/pyiterables.rs @@ -318,7 +318,7 @@ result = agen_fail() } // Test data structure for AsyncChannelStream tests - #[pyclass] + #[pyclass(from_py_object)] #[derive(Clone)] struct TestDatum { #[pyo3(get)] diff --git a/packages/pynumaflow-lite/src/reduce/mod.rs b/packages/pynumaflow-lite/src/reduce/mod.rs index f65d7899..8bff323e 100644 --- a/packages/pynumaflow-lite/src/reduce/mod.rs +++ b/packages/pynumaflow-lite/src/reduce/mod.rs @@ -9,7 +9,7 @@ use pyo3::prelude::*; use tokio::sync::mpsc; /// A message to be sent to the next vertex from a reduce handler. -#[pyclass(module = "pynumaflow_lite.reducer")] +#[pyclass(module = "pynumaflow_lite.reducer", from_py_object)] #[derive(Clone, Default, Debug)] pub struct Message { pub keys: Option>, // optional keys @@ -48,7 +48,7 @@ impl From for reduce::Message { } /// A collection of Messages returned by reducer. -#[pyclass(module = "pynumaflow_lite.reducer")] +#[pyclass(module = "pynumaflow_lite.reducer", from_py_object)] #[derive(Clone, Debug)] pub struct Messages { pub(crate) messages: Vec, @@ -141,7 +141,7 @@ impl From for Datum { } /// IntervalWindow exposed to Python metadata -#[pyclass(module = "pynumaflow_lite.reducer")] +#[pyclass(module = "pynumaflow_lite.reducer", from_py_object)] #[derive(Clone)] pub struct IntervalWindow { #[pyo3(get)] @@ -157,7 +157,7 @@ impl IntervalWindow { } /// Metadata passed to reducer handler in Python. -#[pyclass(module = "pynumaflow_lite.reducer")] +#[pyclass(module = "pynumaflow_lite.reducer", from_py_object)] #[derive(Clone)] pub struct Metadata { #[pyo3(get)] diff --git a/packages/pynumaflow-lite/src/session_reduce/mod.rs b/packages/pynumaflow-lite/src/session_reduce/mod.rs index 36fcbbe3..b182e71f 100644 --- a/packages/pynumaflow-lite/src/session_reduce/mod.rs +++ b/packages/pynumaflow-lite/src/session_reduce/mod.rs @@ -9,7 +9,7 @@ use pyo3::prelude::*; use tokio::sync::mpsc; /// A message to be sent to the next vertex from a session reduce handler. -#[pyclass(module = "pynumaflow_lite.session_reducer")] +#[pyclass(module = "pynumaflow_lite.session_reducer", from_py_object)] #[derive(Clone, Default, Debug)] pub struct Message { #[pyo3(get)] diff --git a/packages/pynumaflow-lite/src/sideinput/mod.rs b/packages/pynumaflow-lite/src/sideinput/mod.rs index 9ef24155..8989dfd2 100644 --- a/packages/pynumaflow-lite/src/sideinput/mod.rs +++ b/packages/pynumaflow-lite/src/sideinput/mod.rs @@ -7,7 +7,7 @@ use std::sync::Mutex; /// Response from the side input retrieve handler. /// Indicates whether to broadcast a value or not. -#[pyclass(module = "pynumaflow_lite.sideinputer")] +#[pyclass(module = "pynumaflow_lite.sideinputer", from_py_object)] #[derive(Clone, Debug)] pub struct Response { /// The value to broadcast (if any). diff --git a/packages/pynumaflow-lite/src/sink/mod.rs b/packages/pynumaflow-lite/src/sink/mod.rs index 5ee344cb..d78c4160 100644 --- a/packages/pynumaflow-lite/src/sink/mod.rs +++ b/packages/pynumaflow-lite/src/sink/mod.rs @@ -15,7 +15,7 @@ use std::sync::Mutex; /// SystemMetadata wraps system-generated metadata groups per message. /// Since sink is the last vertex in the pipeline, only GET methods are available. -#[pyclass(module = "pynumaflow_lite.sinker")] +#[pyclass(module = "pynumaflow_lite.sinker", from_py_object)] #[derive(Clone, Default, Debug)] pub struct SystemMetadata { data: HashMap>>, @@ -78,7 +78,7 @@ impl From for SystemMetadata { /// UserMetadata wraps user-defined metadata groups per message. /// Since sink is the last vertex in the pipeline, only GET methods are available. -#[pyclass(module = "pynumaflow_lite.sinker")] +#[pyclass(module = "pynumaflow_lite.sinker", from_py_object)] #[derive(Clone, Default, Debug)] pub struct UserMetadata { data: HashMap>>, @@ -140,7 +140,7 @@ impl From for UserMetadata { } /// KeyValueGroup represents a group of key-value pairs for user metadata. -#[pyclass(module = "pynumaflow_lite.sinker")] +#[pyclass(module = "pynumaflow_lite.sinker", from_py_object)] #[derive(Clone, Default, Debug)] pub struct KeyValueGroup { pub key_value: HashMap>, @@ -174,7 +174,7 @@ impl From for sink::KeyValueGroup { /// Message for OnSuccess sink response. /// Contains information that needs to be sent to the OnSuccess sink. -#[pyclass(module = "pynumaflow_lite.sinker")] +#[pyclass(module = "pynumaflow_lite.sinker", from_py_object)] #[derive(Clone, Default, Debug)] pub struct Message { pub keys: Option>, @@ -214,7 +214,7 @@ impl From for sink::Message { } /// Response for a single datum in the sink. -#[pyclass(module = "pynumaflow_lite.sinker")] +#[pyclass(module = "pynumaflow_lite.sinker", from_py_object)] #[derive(Clone, Debug)] pub struct Response { pub id: String, @@ -324,7 +324,7 @@ impl From for sink::Response { } /// A collection of Response objects. -#[pyclass(module = "pynumaflow_lite.sinker")] +#[pyclass(module = "pynumaflow_lite.sinker", from_py_object)] #[derive(Clone, Debug)] pub struct Responses { pub(crate) responses: Vec, diff --git a/packages/pynumaflow-lite/src/source/mod.rs b/packages/pynumaflow-lite/src/source/mod.rs index 38188ac0..3510b01f 100644 --- a/packages/pynumaflow-lite/src/source/mod.rs +++ b/packages/pynumaflow-lite/src/source/mod.rs @@ -12,7 +12,7 @@ use std::sync::Mutex; /// UserMetadata wraps user-defined metadata groups per message. /// Source is the origin or the first vertex in the pipeline. /// Here, for the first time, the user metadata can be set by the user. -#[pyclass(module = "pynumaflow_lite.sourcer")] +#[pyclass(module = "pynumaflow_lite.sourcer", from_py_object)] #[derive(Clone, Default, Debug)] pub struct UserMetadata { data: HashMap>>, @@ -102,7 +102,7 @@ impl From for numaflow::source::UserMetadata { } /// A message to be sent from the source. -#[pyclass(module = "pynumaflow_lite.sourcer")] +#[pyclass(module = "pynumaflow_lite.sourcer", from_py_object)] #[derive(Clone, Debug)] pub struct Message { /// The payload of the message. @@ -187,7 +187,7 @@ impl From for numaflow::source::Message { } /// The offset of a message. -#[pyclass(module = "pynumaflow_lite.sourcer", name = "Offset")] // this to avoid conflict with the Offset in the source module +#[pyclass(module = "pynumaflow_lite.sourcer", name = "Offset", from_py_object)] // this to avoid conflict with the Offset in the source module #[derive(Clone, Debug)] pub struct PyOffset { /// Offset value in bytes. @@ -245,7 +245,7 @@ impl From for PyOffset { } /// A request to read messages from the source. -#[pyclass(module = "pynumaflow_lite.sourcer")] +#[pyclass(module = "pynumaflow_lite.sourcer", from_py_object)] #[derive(Clone, Debug)] pub struct ReadRequest { /// The number of messages to read. @@ -286,7 +286,7 @@ impl From for ReadRequest { } /// A request to acknowledge messages. -#[pyclass(module = "pynumaflow_lite.sourcer")] +#[pyclass(module = "pynumaflow_lite.sourcer", from_py_object)] #[derive(Clone, Debug)] pub struct AckRequest { /// The offsets to acknowledge. @@ -309,7 +309,7 @@ impl AckRequest { } /// A request to negatively acknowledge messages. -#[pyclass(module = "pynumaflow_lite.sourcer")] +#[pyclass(module = "pynumaflow_lite.sourcer", from_py_object)] #[derive(Clone, Debug)] pub struct NackRequest { /// The offsets to negatively acknowledge. @@ -332,7 +332,7 @@ impl NackRequest { } /// Response for pending messages count. -#[pyclass(module = "pynumaflow_lite.sourcer")] +#[pyclass(module = "pynumaflow_lite.sourcer", from_py_object)] #[derive(Clone, Debug)] pub struct PendingResponse { /// The number of pending messages. -1 if the source doesn't support detecting backlog. @@ -355,7 +355,7 @@ impl PendingResponse { } /// Response for partitions. -#[pyclass(module = "pynumaflow_lite.sourcer")] +#[pyclass(module = "pynumaflow_lite.sourcer", from_py_object)] #[derive(Clone, Debug)] pub struct PartitionsResponse { /// The list of partition IDs. diff --git a/packages/pynumaflow-lite/src/sourcetransform/mod.rs b/packages/pynumaflow-lite/src/sourcetransform/mod.rs index d1154578..e1289ff7 100644 --- a/packages/pynumaflow-lite/src/sourcetransform/mod.rs +++ b/packages/pynumaflow-lite/src/sourcetransform/mod.rs @@ -13,7 +13,7 @@ use std::sync::Mutex; /// SystemMetadata wraps system-generated metadata groups per message. /// It is read-only to UDFs. -#[pyclass(module = "pynumaflow_lite.sourcetransformer")] +#[pyclass(module = "pynumaflow_lite.sourcetransformer", from_py_object)] #[derive(Clone, Default, Debug)] pub struct SystemMetadata { data: HashMap>>, @@ -76,7 +76,7 @@ impl From for SystemMetadata { /// UserMetadata wraps user-defined metadata groups per message. /// Users can read and write to this metadata. -#[pyclass(module = "pynumaflow_lite.sourcetransformer")] +#[pyclass(module = "pynumaflow_lite.sourcetransformer", from_py_object)] #[derive(Clone, Default, Debug)] pub struct UserMetadata { data: HashMap>>, @@ -180,7 +180,7 @@ impl From for sourcetransform::UserMetadata { } /// A collection of [Message]s. -#[pyclass(module = "pynumaflow_lite.sourcetransformer")] +#[pyclass(module = "pynumaflow_lite.sourcetransformer", from_py_object)] #[derive(Clone, Debug)] pub struct Messages { pub(crate) messages: Vec, @@ -210,7 +210,7 @@ impl Messages { } /// A message to be sent to the next vertex with event time transformation. -#[pyclass(module = "pynumaflow_lite.sourcetransformer")] +#[pyclass(module = "pynumaflow_lite.sourcetransformer", from_py_object)] #[derive(Clone, Default, Debug)] pub struct Message { /// Keys are a collection of strings which will be passed on to the next vertex as is. It can diff --git a/packages/pynumaflow-lite/uv.lock b/packages/pynumaflow-lite/uv.lock index 75663730..3fac4534 100644 --- a/packages/pynumaflow-lite/uv.lock +++ b/packages/pynumaflow-lite/uv.lock @@ -1,11 +1,6 @@ version = 1 revision = 3 -requires-python = ">=3.8" -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", - "python_full_version < '3.9'", -] +requires-python = ">=3.10" [[package]] name = "colorama" @@ -21,8 +16,7 @@ name = "exceptiongroup" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } wheels = [ @@ -47,26 +41,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] -[[package]] -name = "pluggy" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.9'", -] -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955, upload-time = "2024-04-20T21:34:42.531Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556, upload-time = "2024-04-20T21:34:40.434Z" }, -] - [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, @@ -87,8 +65,7 @@ source = { editable = "." } [package.dev-dependencies] dev = [ - { name = "pytest", version = "8.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pytest" }, { name = "ruff" }, ] @@ -96,75 +73,51 @@ dev = [ [package.metadata.requires-dev] dev = [ - { name = "pytest", specifier = ">=8.3.5" }, - { name = "ruff", specifier = ">=0.15.8" }, -] - -[[package]] -name = "pytest" -version = "8.3.5" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.9'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.9' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.9'" }, - { name = "iniconfig", marker = "python_full_version < '3.9'" }, - { name = "packaging", marker = "python_full_version < '3.9'" }, - { name = "pluggy", version = "1.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9'" }, - { name = "tomli", marker = "python_full_version < '3.9'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891, upload-time = "2025-03-02T12:54:54.503Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634, upload-time = "2025-03-02T12:54:52.069Z" }, + { name = "pytest", specifier = ">=9.1.1" }, + { name = "ruff", specifier = ">=0.15.20" }, ] [[package]] name = "pytest" -version = "8.4.2" +version = "9.1.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", -] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.9' and sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, - { name = "iniconfig", marker = "python_full_version >= '3.9'" }, - { name = "packaging", marker = "python_full_version >= '3.9'" }, - { name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, - { name = "pygments", marker = "python_full_version >= '3.9'" }, - { name = "tomli", marker = "python_full_version >= '3.9' and python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, ] [[package]] name = "ruff" -version = "0.15.8" +version = "0.15.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/14/b0/73cf7550861e2b4824950b8b52eebdcc5adc792a00c514406556c5b80817/ruff-0.15.8.tar.gz", hash = "sha256:995f11f63597ee362130d1d5a327a87cb6f3f5eae3094c620bcc632329a4d26e", size = 4610921, upload-time = "2026-03-26T18:39:38.675Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/dc/35b341fc554ba02f217fc10da57d1a75168cfbcf75b0ef2202176d4c4f2d/ruff-0.15.20.tar.gz", hash = "sha256:1416eb04349192646b54de98f146c4f59afe37d0decfc02c3cbbf396f3a28566", size = 4755489, upload-time = "2026-06-25T17:20:37.578Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/92/c445b0cd6da6e7ae51e954939cb69f97e008dbe750cfca89b8cedc081be7/ruff-0.15.8-py3-none-linux_armv6l.whl", hash = "sha256:cbe05adeba76d58162762d6b239c9056f1a15a55bd4b346cfd21e26cd6ad7bc7", size = 10527394, upload-time = "2026-03-26T18:39:41.566Z" }, - { url = "https://files.pythonhosted.org/packages/eb/92/f1c662784d149ad1414cae450b082cf736430c12ca78367f20f5ed569d65/ruff-0.15.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d3e3d0b6ba8dca1b7ef9ab80a28e840a20070c4b62e56d675c24f366ef330570", size = 10905693, upload-time = "2026-03-26T18:39:30.364Z" }, - { url = "https://files.pythonhosted.org/packages/ca/f2/7a631a8af6d88bcef997eb1bf87cc3da158294c57044aafd3e17030613de/ruff-0.15.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ee3ae5c65a42f273f126686353f2e08ff29927b7b7e203b711514370d500de3", size = 10323044, upload-time = "2026-03-26T18:39:33.37Z" }, - { url = "https://files.pythonhosted.org/packages/67/18/1bf38e20914a05e72ef3b9569b1d5c70a7ef26cd188d69e9ca8ef588d5bf/ruff-0.15.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdce027ada77baa448077ccc6ebb2fa9c3c62fd110d8659d601cf2f475858d94", size = 10629135, upload-time = "2026-03-26T18:39:44.142Z" }, - { url = "https://files.pythonhosted.org/packages/d2/e9/138c150ff9af60556121623d41aba18b7b57d95ac032e177b6a53789d279/ruff-0.15.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12e617fc01a95e5821648a6df341d80456bd627bfab8a829f7cfc26a14a4b4a3", size = 10348041, upload-time = "2026-03-26T18:39:52.178Z" }, - { url = "https://files.pythonhosted.org/packages/02/f1/5bfb9298d9c323f842c5ddeb85f1f10ef51516ac7a34ba446c9347d898df/ruff-0.15.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:432701303b26416d22ba696c39f2c6f12499b89093b61360abc34bcc9bf07762", size = 11121987, upload-time = "2026-03-26T18:39:55.195Z" }, - { url = "https://files.pythonhosted.org/packages/10/11/6da2e538704e753c04e8d86b1fc55712fdbdcc266af1a1ece7a51fff0d10/ruff-0.15.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d910ae974b7a06a33a057cb87d2a10792a3b2b3b35e33d2699fdf63ec8f6b17a", size = 11951057, upload-time = "2026-03-26T18:39:19.18Z" }, - { url = "https://files.pythonhosted.org/packages/83/f0/c9208c5fd5101bf87002fed774ff25a96eea313d305f1e5d5744698dc314/ruff-0.15.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2033f963c43949d51e6fdccd3946633c6b37c484f5f98c3035f49c27395a8ab8", size = 11464613, upload-time = "2026-03-26T18:40:06.301Z" }, - { url = "https://files.pythonhosted.org/packages/f8/22/d7f2fabdba4fae9f3b570e5605d5eb4500dcb7b770d3217dca4428484b17/ruff-0.15.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f29b989a55572fb885b77464cf24af05500806ab4edf9a0fd8977f9759d85b1", size = 11257557, upload-time = "2026-03-26T18:39:57.972Z" }, - { url = "https://files.pythonhosted.org/packages/71/8c/382a9620038cf6906446b23ce8632ab8c0811b8f9d3e764f58bedd0c9a6f/ruff-0.15.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:ac51d486bf457cdc985a412fb1801b2dfd1bd8838372fc55de64b1510eff4bec", size = 11169440, upload-time = "2026-03-26T18:39:22.205Z" }, - { url = "https://files.pythonhosted.org/packages/4d/0d/0994c802a7eaaf99380085e4e40c845f8e32a562e20a38ec06174b52ef24/ruff-0.15.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c9861eb959edab053c10ad62c278835ee69ca527b6dcd72b47d5c1e5648964f6", size = 10605963, upload-time = "2026-03-26T18:39:46.682Z" }, - { url = "https://files.pythonhosted.org/packages/19/aa/d624b86f5b0aad7cef6bbf9cd47a6a02dfdc4f72c92a337d724e39c9d14b/ruff-0.15.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8d9a5b8ea13f26ae90838afc33f91b547e61b794865374f114f349e9036835fb", size = 10357484, upload-time = "2026-03-26T18:39:49.176Z" }, - { url = "https://files.pythonhosted.org/packages/35/c3/e0b7835d23001f7d999f3895c6b569927c4d39912286897f625736e1fd04/ruff-0.15.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c2a33a529fb3cbc23a7124b5c6ff121e4d6228029cba374777bd7649cc8598b8", size = 10830426, upload-time = "2026-03-26T18:40:03.702Z" }, - { url = "https://files.pythonhosted.org/packages/f0/51/ab20b322f637b369383adc341d761eaaa0f0203d6b9a7421cd6e783d81b9/ruff-0.15.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:75e5cd06b1cf3f47a3996cfc999226b19aa92e7cce682dcd62f80d7035f98f49", size = 11345125, upload-time = "2026-03-26T18:39:27.799Z" }, - { url = "https://files.pythonhosted.org/packages/37/e6/90b2b33419f59d0f2c4c8a48a4b74b460709a557e8e0064cf33ad894f983/ruff-0.15.8-py3-none-win32.whl", hash = "sha256:bc1f0a51254ba21767bfa9a8b5013ca8149dcf38092e6a9eb704d876de94dc34", size = 10571959, upload-time = "2026-03-26T18:39:36.117Z" }, - { url = "https://files.pythonhosted.org/packages/1f/a2/ef467cb77099062317154c63f234b8a7baf7cb690b99af760c5b68b9ee7f/ruff-0.15.8-py3-none-win_amd64.whl", hash = "sha256:04f79eff02a72db209d47d665ba7ebcad609d8918a134f86cb13dd132159fc89", size = 11743893, upload-time = "2026-03-26T18:39:25.01Z" }, - { url = "https://files.pythonhosted.org/packages/15/e2/77be4fff062fa78d9b2a4dea85d14785dac5f1d0c1fb58ed52331f0ebe28/ruff-0.15.8-py3-none-win_arm64.whl", hash = "sha256:cf891fa8e3bb430c0e7fac93851a5978fc99c8fa2c053b57b118972866f8e5f2", size = 11048175, upload-time = "2026-03-26T18:40:01.06Z" }, + { url = "https://files.pythonhosted.org/packages/94/d9/2d5014f0253ba541d2061d9fa7193f48e941c8b21bb88a7ff9bbe0bd0596/ruff-0.15.20-py3-none-linux_armv6l.whl", hash = "sha256:00e188c53e499c3c1637f73c91dcf2fb56d576cab76ce1be50a27c4e80e37078", size = 10839665, upload-time = "2026-06-25T17:19:44.702Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d3/ac1798ba64f670698867fcfc591d50e7e421bef137db564858f619a30fcf/ruff-0.15.20-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9ebd1fd9b9c95fc0bd7b2761aebec1f030013d2e193a2901b224af68fe47251b", size = 11208649, upload-time = "2026-06-25T17:19:48.787Z" }, + { url = "https://files.pythonhosted.org/packages/47/47/d3ac899991202095dfcf3d5176be4272642be3cf981a2f1a30f72a2afb95/ruff-0.15.20-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5b16cdd67ca108185cd36dce98c576350c03b1660a751de725fb049193a0632", size = 10622638, upload-time = "2026-06-25T17:19:51.354Z" }, + { url = "https://files.pythonhosted.org/packages/33/13/4e043fe30aa94d4ff5213a9881fc296d12960f5971b234a5263fdc225312/ruff-0.15.20-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3413bb3c3d2ca6a8208f1f4809cd2dca3c6de6d0b491c0e70847672bde6e6efd", size = 10984227, upload-time = "2026-06-25T17:19:54.044Z" }, + { url = "https://files.pythonhosted.org/packages/76/e6/92e7bf40388bc5800073b96564f56264f7e48bfd1a498f5ced6ae6d5a769/ruff-0.15.20-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd7ec42b3bb3da066488db093308a69c4ac5ee6d2af333a86ba6e2eb2e7dd44b", size = 10622882, upload-time = "2026-06-25T17:19:57.037Z" }, + { url = "https://files.pythonhosted.org/packages/13/7a/43460be3f24495a3aa46d4b16873e2c4941b3b5f0b00cf88c03b7b94b339/ruff-0.15.20-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1a36ad0eb77fba9aabfb69ede54de6f376d04ac18ebea022847046d340a8267", size = 11474808, upload-time = "2026-06-25T17:20:00.357Z" }, + { url = "https://files.pythonhosted.org/packages/27/a0/f37077884873221c6b33b4ab49eb18f9f88e54a16a25a5bca59bef46dd66/ruff-0.15.20-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6df3b1e4610432f0386dba04d853b5f08cbbc903410c6fcc02f620f05aff53c", size = 12293094, upload-time = "2026-06-25T17:20:03.446Z" }, + { url = "https://files.pythonhosted.org/packages/a6/74/165545b60256a9704c21ac0ec4a0d07933b320812f9584836c9f4aca4292/ruff-0.15.20-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e89f198a1ea6ef0d727c1cf16088bc91a6cb0ab947dedc966715691647186eae", size = 11526176, upload-time = "2026-06-25T17:20:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/86/b1/a976a136d40ade83ce743578399865f57001003a409acadc0ecbb3051082/ruff-0.15.20-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309809086c2acb67624950a3c8133e80f32d0d3e27106c0cd60ff26657c9f24b", size = 11520767, upload-time = "2026-06-25T17:20:09.191Z" }, + { url = "https://files.pythonhosted.org/packages/19/0f/f032696cb01c9b54c0263fa393474d7758f1cdc021a01b04e3cbc2500999/ruff-0.15.20-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2d2374caa2f2c2f9e2b7da0a50802cfb8b79f55a9b5e49379f564544fbf56487", size = 11500132, upload-time = "2026-06-25T17:20:13.602Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f4/51b1a14bc69e8c224b15dab9cce8e99b425e0455d462caa2b3c9be2b6a8e/ruff-0.15.20-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a1ed17b65293e0c2f22fc387bc13198a5de94bf4429589b0ff6946b0feaf21a3", size = 10943828, upload-time = "2026-06-25T17:20:16.635Z" }, + { url = "https://files.pythonhosted.org/packages/71/4b/fe267640783cd02bf6c5cc290b1df1051be2ec294c678b5c15fe19e52343/ruff-0.15.20-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f701305e66b38ea6c91882490eb73459796808e4c6362a1b765255e0cdcd4053", size = 10645418, upload-time = "2026-06-25T17:20:19.4Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c0/a65aa4ec2f5e87a1df32dc3ec1fede434fe3dfd5cbcf3b503cafc676ab54/ruff-0.15.20-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b9c0c367ad8e5d0d5b5b8537864c469a0a0e55417aadfbeca41fa61333be9f4", size = 11211770, upload-time = "2026-06-25T17:20:22.033Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/0caa331d954ae2723d729d351c989cb4ca8b6077d5c6c2cb6de75e98c041/ruff-0.15.20-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:01cc00dd58f0df339d0e902219dd53990ea99996a0344e5d9cc8d45d5307e460", size = 11618698, upload-time = "2026-06-25T17:20:25.259Z" }, + { url = "https://files.pythonhosted.org/packages/10/9b/5f14927848d2fd4aa891fd88d883788c5a7baba561c7874732364045708c/ruff-0.15.20-py3-none-win32.whl", hash = "sha256:ed65ef510e43a137207e0f01cfcf998aeddb1aeeda5c9d35023e910284d7cf21", size = 10857322, upload-time = "2026-06-25T17:20:28.612Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/fe47c501f9dea92a26d788ff98bb5d92ed4cb4c88792c5c88af6b697dc8e/ruff-0.15.20-py3-none-win_amd64.whl", hash = "sha256:a525c81c70fb0380344dd1d8745d8cc1c890b7fc94a58d5a07bd8eb9557b8415", size = 11993274, upload-time = "2026-06-25T17:20:31.871Z" }, + { url = "https://files.pythonhosted.org/packages/d7/2b/9555445e1201d92b3195f45cdb153a0b68f24e0a4273f6e3d5ab46e212bb/ruff-0.15.20-py3-none-win_arm64.whl", hash = "sha256:2f5b2a6d614e8700388806a14996c40fab2c47b819ef57d790a34878858ed9ca", size = 11343498, upload-time = "2026-06-25T17:20:35.03Z" }, ] [[package]] @@ -206,26 +159,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, ] -[[package]] -name = "typing-extensions" -version = "4.13.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.9'", -] -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, -] - [[package]] name = "typing-extensions" version = "4.15.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.10'", - "python_full_version == '3.9.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, From 98241d1a7fff3f8e9addc0581c3a7b416ce8e45e Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 12:19:37 +0530 Subject: [PATCH 03/15] configure ruff Signed-off-by: Sreekanth --- packages/pynumaflow-lite/pyproject.toml | 37 +++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/packages/pynumaflow-lite/pyproject.toml b/packages/pynumaflow-lite/pyproject.toml index 33d39672..2ed18d07 100644 --- a/packages/pynumaflow-lite/pyproject.toml +++ b/packages/pynumaflow-lite/pyproject.toml @@ -15,15 +15,46 @@ dynamic = ["version"] features = ["pyo3/extension-module"] [tool.ruff] +line-length = 119 src = ["pynumaflow_lite", "tests", "manifests"] target-version = "py310" +show-fixes = true [tool.ruff.lint] -select = ["E", "F", "I", "UP"] -ignore = ["E501"] +select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes + "I", # isort + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "UP", # pyupgrade + "PT", # flake8-pytest-style + "RUF", # Ruff-specific rules + "PERF", # Perflint performance rules + "SIM", # flake8-simplify + "RET", # flake8-return + "TID", # flake8-tidy-imports + "PGH", # pygrep-hooks + "ASYNC", # flake8-async + "PIE794", # duplicate class field definitions +] +ignore = [ + "E501", # line too long +] + +[tool.ruff.lint.isort] +known-first-party = ["pynumaflow_lite"] +combine-as-imports = true [tool.ruff.lint.per-file-ignores] -"**/*.pyi" = ["UP006", "UP045"] +"**/*.pyi" = [ + "UP006", # keep typing.List-style annotations in stubs for now + "UP045", # keep typing.Optional-style annotations in stubs for now +] + +[tool.ruff.format] +docstring-code-format = true [dependency-groups] dev = [ From e16c211ca3cd9c5ca4723fa79a077be8bf1c6b76 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 13:12:56 +0530 Subject: [PATCH 04/15] Remove unnecessary exception handling Signed-off-by: Sreekanth --- .../tests/examples/accumulator_stream_sorter.py | 5 +---- packages/pynumaflow-lite/tests/examples/batchmap_cat.py | 5 +---- .../pynumaflow-lite/tests/examples/batchmap_cat_class.py | 5 +---- packages/pynumaflow-lite/tests/examples/map_cat.py | 5 +---- packages/pynumaflow-lite/tests/examples/map_cat_class.py | 5 +---- packages/pynumaflow-lite/tests/examples/mapstream_cat.py | 5 +---- .../pynumaflow-lite/tests/examples/mapstream_cat_class.py | 5 +---- .../pynumaflow-lite/tests/examples/reduce_counter_class.py | 5 +---- .../pynumaflow-lite/tests/examples/reduce_counter_func.py | 5 +---- .../pynumaflow-lite/tests/examples/reducestream_counter.py | 5 +---- .../tests/examples/session_reduce_counter_class.py | 5 +---- packages/pynumaflow-lite/tests/examples/sink_log.py | 5 +---- packages/pynumaflow-lite/tests/examples/sink_log_class.py | 5 +---- packages/pynumaflow-lite/tests/examples/source_simple.py | 5 +---- .../tests/examples/sourcetransform_event_filter.py | 5 +---- 15 files changed, 15 insertions(+), 60 deletions(-) diff --git a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py index b79a2eea..318538db 100644 --- a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py +++ b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py @@ -126,10 +126,7 @@ async def main(): await server.start(StreamSorter) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/batchmap_cat.py b/packages/pynumaflow-lite/tests/examples/batchmap_cat.py index a84ab7be..b43c09c3 100644 --- a/packages/pynumaflow-lite/tests/examples/batchmap_cat.py +++ b/packages/pynumaflow-lite/tests/examples/batchmap_cat.py @@ -43,10 +43,7 @@ async def start( await server.start(f) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py b/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py index 8bf22989..a4b1f555 100644 --- a/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py @@ -52,10 +52,7 @@ async def start( await server.start(f) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/map_cat.py b/packages/pynumaflow-lite/tests/examples/map_cat.py index 7b04ca11..c1907caa 100644 --- a/packages/pynumaflow-lite/tests/examples/map_cat.py +++ b/packages/pynumaflow-lite/tests/examples/map_cat.py @@ -57,10 +57,7 @@ async def start(f: Callable[[list[str], mapper.Datum], Awaitable[mapper.Messages await server.start(f) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/map_cat_class.py b/packages/pynumaflow-lite/tests/examples/map_cat_class.py index 8d608805..ce0feb23 100644 --- a/packages/pynumaflow-lite/tests/examples/map_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/map_cat_class.py @@ -73,10 +73,7 @@ async def start(f: Callable[[list[str], mapper.Datum], Awaitable[mapper.Messages print("Shutting down gracefully...") except asyncio.CancelledError: # Fallback in case the task was cancelled by the runner - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/mapstream_cat.py b/packages/pynumaflow-lite/tests/examples/mapstream_cat.py index 8433ba17..80ad3898 100644 --- a/packages/pynumaflow-lite/tests/examples/mapstream_cat.py +++ b/packages/pynumaflow-lite/tests/examples/mapstream_cat.py @@ -39,10 +39,7 @@ async def start(f: Callable[[list[str], mapstreamer.Datum], AsyncIterator[Messag await server.start(f) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py b/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py index 2e62bb90..7e3353d4 100644 --- a/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py @@ -44,10 +44,7 @@ async def start(f: Callable[[list[str], mapstreamer.Datum], AsyncIterator[Messag await server.start(f) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py b/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py index 0faf22a6..2cf39f07 100644 --- a/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py +++ b/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py @@ -51,10 +51,7 @@ async def start(creator: type, init_args: tuple): await server.start(creator, init_args) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py b/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py index 294c80af..088c93be 100644 --- a/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py +++ b/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py @@ -51,10 +51,7 @@ async def start( await server.start(handler) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/reducestream_counter.py b/packages/pynumaflow-lite/tests/examples/reducestream_counter.py index c535b76d..0171c065 100644 --- a/packages/pynumaflow-lite/tests/examples/reducestream_counter.py +++ b/packages/pynumaflow-lite/tests/examples/reducestream_counter.py @@ -66,10 +66,7 @@ async def start(creator: type, init_args: tuple): await server.start(creator, init_args) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py b/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py index 98d9bb9a..f419ae6d 100644 --- a/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py +++ b/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py @@ -75,10 +75,7 @@ async def main(): await server.start(SessionReduceCounter) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/sink_log.py b/packages/pynumaflow-lite/tests/examples/sink_log.py index 2d1448ba..f2d465b6 100644 --- a/packages/pynumaflow-lite/tests/examples/sink_log.py +++ b/packages/pynumaflow-lite/tests/examples/sink_log.py @@ -63,10 +63,7 @@ async def start( await server.start(f) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/sink_log_class.py b/packages/pynumaflow-lite/tests/examples/sink_log_class.py index ba22d1dd..4456441e 100644 --- a/packages/pynumaflow-lite/tests/examples/sink_log_class.py +++ b/packages/pynumaflow-lite/tests/examples/sink_log_class.py @@ -63,10 +63,7 @@ async def start(): await server.start(handler) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/source_simple.py b/packages/pynumaflow-lite/tests/examples/source_simple.py index 691575cb..dfd19ed2 100644 --- a/packages/pynumaflow-lite/tests/examples/source_simple.py +++ b/packages/pynumaflow-lite/tests/examples/source_simple.py @@ -126,10 +126,7 @@ async def start(): await server.start(handler) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py b/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py index 8c33ab2d..d1e72eb0 100644 --- a/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py +++ b/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py @@ -126,10 +126,7 @@ async def start( print("Shutting down gracefully...") except asyncio.CancelledError: # Fallback in case the task was cancelled by the runner - try: - server.stop() - except Exception: - pass + server.stop() return From 0eed8e05e774ff5f9d9c845cbf28668739b954a1 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 13:38:20 +0530 Subject: [PATCH 05/15] Remove signal handling in examples Signed-off-by: Sreekanth --- .../manifests/accumulator/accumulator_stream_sorter.py | 9 --------- .../pynumaflow-lite/manifests/batchmap/batchmap_cat.py | 9 --------- packages/pynumaflow-lite/manifests/map/map_cat.py | 9 --------- .../pynumaflow-lite/manifests/mapstream/mapstream_cat.py | 9 --------- .../manifests/reduce/reduce_counter_class.py | 9 --------- .../manifests/reducestream/reducestream_counter.py | 9 --------- .../session_reduce/session_reduce_counter_class.py | 8 -------- .../manifests/sideinput/sideinput_example.py | 9 --------- packages/pynumaflow-lite/manifests/sink/sink_log.py | 9 --------- .../pynumaflow-lite/manifests/source/simple_source.py | 9 --------- .../sourcetransform/sourcetransform_event_filter.py | 9 --------- .../tests/examples/accumulator_stream_sorter.py | 8 -------- .../pynumaflow-lite/tests/examples/batchmap_cat_class.py | 9 --------- packages/pynumaflow-lite/tests/examples/map_cat_class.py | 9 --------- .../tests/examples/mapstream_cat_class.py | 9 --------- .../tests/examples/reduce_counter_class.py | 9 --------- .../tests/examples/reduce_counter_func.py | 9 --------- .../tests/examples/reducestream_counter.py | 9 --------- .../tests/examples/session_reduce_counter_class.py | 8 -------- .../tests/examples/sourcetransform_event_filter.py | 9 --------- 20 files changed, 177 deletions(-) diff --git a/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py b/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py index e9feacce..dd132f09 100644 --- a/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py +++ b/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py @@ -130,14 +130,5 @@ async def main(): pass return - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. - -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - if __name__ == "__main__": asyncio.run(main()) diff --git a/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py b/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py index 7c0cf088..33acc356 100644 --- a/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py +++ b/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py @@ -22,15 +22,6 @@ async def handler( responses.append(resp) return responses - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start( f: Callable[ [AsyncIterable[batchmapper.Datum]], Awaitable[batchmapper.BatchResponses] diff --git a/packages/pynumaflow-lite/manifests/map/map_cat.py b/packages/pynumaflow-lite/manifests/map/map_cat.py index ff819dbb..d059e8b1 100644 --- a/packages/pynumaflow-lite/manifests/map/map_cat.py +++ b/packages/pynumaflow-lite/manifests/map/map_cat.py @@ -17,15 +17,6 @@ async def handler(self, keys: list[str], payload: mapper.Datum) -> mapper.Messag return messages - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start(f: Callable[[list[str], mapper.Datum], Awaitable[mapper.Messages]]): server = mapper.MapAsyncServer() diff --git a/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py b/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py index 2db6c3f4..12a6ba8e 100644 --- a/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py +++ b/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py @@ -18,15 +18,6 @@ async def handler( for s in parts: yield Message(s.encode(), keys) - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start(f: Callable[[list[str], mapstreamer.Datum], AsyncIterator[Message]]): # Use default socket/info file locations; no explicit sock file passed server = mapstreamer.MapStreamAsyncServer() diff --git a/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py b/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py index bac265ce..2f51b5ab 100644 --- a/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py +++ b/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py @@ -26,15 +26,6 @@ async def handler( out.append(reducer.Message(msg, keys)) return out - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start(creator: type[reducer.Reducer], init_args: tuple): sock_file = "/var/run/numaflow/reduce.sock" server_info_file = "/var/run/numaflow/reducer-server-info" diff --git a/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py b/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py index c86ab921..949c386f 100644 --- a/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py +++ b/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py @@ -70,15 +70,6 @@ async def handler( print(f"Yielding final result: counter={self.counter}") yield reducestreamer.Message(msg, keys=keys) - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start(creator: type, init_args: tuple): """Start the reduce stream server.""" sock_file = "/var/run/numaflow/reducestream.sock" diff --git a/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py b/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py index 051d8b04..7b0e00f8 100644 --- a/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py +++ b/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py @@ -78,13 +78,5 @@ async def main(): pass return - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - if __name__ == "__main__": asyncio.run(main()) diff --git a/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py b/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py index 149983cf..2a5104d0 100644 --- a/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py +++ b/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py @@ -85,15 +85,6 @@ def update_data_from_file(self, path): except Exception as e: print(f"Error reading file: {e}") - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start_sideinput(): """Start the SideInput retriever server.""" server = sideinputer.SideInputAsyncServer() diff --git a/packages/pynumaflow-lite/manifests/sink/sink_log.py b/packages/pynumaflow-lite/manifests/sink/sink_log.py index 0cf3f737..c3461015 100644 --- a/packages/pynumaflow-lite/manifests/sink/sink_log.py +++ b/packages/pynumaflow-lite/manifests/sink/sink_log.py @@ -26,15 +26,6 @@ async def handler(self, datums: AsyncIterable[sinker.Datum]) -> sinker.Responses # we can use Response.as_fallback(msg.id) to write the message to fallback sink return responses - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start( f: Callable[[AsyncIterator[sinker.Datum]], Awaitable[sinker.Responses]], ): diff --git a/packages/pynumaflow-lite/manifests/source/simple_source.py b/packages/pynumaflow-lite/manifests/source/simple_source.py index db590607..5404cf12 100644 --- a/packages/pynumaflow-lite/manifests/source/simple_source.py +++ b/packages/pynumaflow-lite/manifests/source/simple_source.py @@ -92,15 +92,6 @@ async def partitions_handler(self) -> sourcer.PartitionsResponse: """ return sourcer.PartitionsResponse(partitions=[self.partition_idx]) - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start(): server = sourcer.SourceAsyncServer() diff --git a/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py b/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py index cfe5f91b..42cbeca6 100644 --- a/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py +++ b/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py @@ -56,15 +56,6 @@ async def handler( return messages - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start( f: Callable[[list[str], sourcetransformer.Datum], sourcetransformer.Messages], ): diff --git a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py index 318538db..bac4def1 100644 --- a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py +++ b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py @@ -129,13 +129,5 @@ async def main(): server.stop() return - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - if __name__ == "__main__": asyncio.run(main()) diff --git a/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py b/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py index a4b1f555..3d40324b 100644 --- a/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py @@ -22,15 +22,6 @@ async def handler( responses.append(resp) return responses - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start( f: Callable[ [AsyncIterator[batchmapper.Datum]], Awaitable[batchmapper.BatchResponses] diff --git a/packages/pynumaflow-lite/tests/examples/map_cat_class.py b/packages/pynumaflow-lite/tests/examples/map_cat_class.py index ce0feb23..ab621a4b 100644 --- a/packages/pynumaflow-lite/tests/examples/map_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/map_cat_class.py @@ -41,15 +41,6 @@ async def handler(self, keys: list[str], payload: mapper.Datum) -> mapper.Messag return messages - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start(f: Callable[[list[str], mapper.Datum], Awaitable[mapper.Messages]]): sock_file = "/tmp/var/run/numaflow/map.sock" server_info_file = "/tmp/var/run/numaflow/mapper-server-info" diff --git a/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py b/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py index 7e3353d4..fe07f013 100644 --- a/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py @@ -18,15 +18,6 @@ async def handler( for s in parts: yield Message(s.encode(), keys) - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start(f: Callable[[list[str], mapstreamer.Datum], AsyncIterator[Message]]): sock_file = "/tmp/var/run/numaflow/mapstream.sock" server_info_file = "/tmp/var/run/numaflow/mapper-server-info" diff --git a/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py b/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py index 2cf39f07..afaa59f9 100644 --- a/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py +++ b/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py @@ -26,15 +26,6 @@ async def handler( out.append(reducer.Message(msg, keys)) return out - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start(creator: type, init_args: tuple): sock_file = "/tmp/var/run/numaflow/reduce.sock" server_info_file = "/tmp/var/run/numaflow/reducer-server-info" diff --git a/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py b/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py index 088c93be..91ea1ae6 100644 --- a/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py +++ b/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py @@ -21,15 +21,6 @@ async def reduce_handler( out.append(reducer.Message(str.encode(msg), keys=keys)) return out - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start( handler: Callable[ [list[str], AsyncIterable[reducer.Datum], reducer.Metadata], diff --git a/packages/pynumaflow-lite/tests/examples/reducestream_counter.py b/packages/pynumaflow-lite/tests/examples/reducestream_counter.py index 0171c065..4177ce60 100644 --- a/packages/pynumaflow-lite/tests/examples/reducestream_counter.py +++ b/packages/pynumaflow-lite/tests/examples/reducestream_counter.py @@ -40,15 +40,6 @@ async def handler( ).encode() yield reducestreamer.Message(msg, keys=keys) - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start(creator: type, init_args: tuple): """Start the reduce stream server.""" sock_file = "/tmp/var/run/numaflow/reducestream.sock" diff --git a/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py b/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py index f419ae6d..43af4688 100644 --- a/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py +++ b/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py @@ -78,13 +78,5 @@ async def main(): server.stop() return - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - if __name__ == "__main__": asyncio.run(main()) diff --git a/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py b/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py index d1e72eb0..eb18b8fd 100644 --- a/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py +++ b/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py @@ -92,15 +92,6 @@ async def handler( return messages - -# Optional: ensure default signal handlers are in place so asyncio.run can handle them cleanly. -signal.signal(signal.SIGINT, signal.default_int_handler) -try: - signal.signal(signal.SIGTERM, signal.SIG_DFL) -except AttributeError: - pass - - async def start( f: Callable[[list[str], sourcetransformer.Datum], sourcetransformer.Messages], ): From 8912b104270eaa08795870c627624d2160d2cd84 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 13:57:19 +0530 Subject: [PATCH 06/15] code cleanup Signed-off-by: Sreekanth --- .../pynumaflow_lite/__init__.py | 55 ++++--------------- packages/pynumaflow-lite/tests/_test_utils.py | 9 +-- 2 files changed, 14 insertions(+), 50 deletions(-) diff --git a/packages/pynumaflow-lite/pynumaflow_lite/__init__.py b/packages/pynumaflow-lite/pynumaflow_lite/__init__.py index 4fee2764..8605bba7 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/__init__.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/__init__.py @@ -76,70 +76,37 @@ from ._sourcetransformer_dtypes import SourceTransformer if mapper is not None: - try: - setattr(mapper, "Mapper", Mapper) - except Exception: - pass + mapper.Mapper = Mapper if batchmapper is not None: - try: - setattr(batchmapper, "BatchMapper", BatchMapper) - except Exception: - pass + batchmapper.BatchMapper = BatchMapper if mapstreamer is not None: - try: - setattr(mapstreamer, "MapStreamer", MapStreamer) - except Exception: - pass + mapstreamer.MapStreamer = MapStreamer if reducer is not None: - try: - setattr(reducer, "Reducer", Reducer) - except Exception: - pass + reducer.Reducer = Reducer if session_reducer is not None: - try: - setattr(session_reducer, "SessionReducer", SessionReducer) - except Exception: - pass + session_reducer.SessionReducer = SessionReducer if reducestreamer is not None: - try: - setattr(reducestreamer, "ReduceStreamer", ReduceStreamer) - except Exception: - pass + reducestreamer.ReduceStreamer = ReduceStreamer if accumulator is not None: - try: - setattr(accumulator, "Accumulator", Accumulator) - except Exception: - pass + accumulator.Accumulator = Accumulator if sinker is not None: - try: - setattr(sinker, "Sinker", Sinker) - except Exception: - pass + sinker.Sinker = Sinker if sourcer is not None: - try: - setattr(sourcer, "Sourcer", Sourcer) - except Exception: - pass + sourcer.Sourcer = Sourcer if sourcetransformer is not None: - try: - setattr(sourcetransformer, "SourceTransformer", SourceTransformer) - except Exception: - pass + sourcetransformer.SourceTransformer = SourceTransformer if sideinputer is not None: - try: - setattr(sideinputer, "SideInput", SideInput) - except Exception: - pass + sideinputer.SideInput = SideInput # Public API __all__ = [ diff --git a/packages/pynumaflow-lite/tests/_test_utils.py b/packages/pynumaflow-lite/tests/_test_utils.py index 839e1fa8..b30223eb 100644 --- a/packages/pynumaflow-lite/tests/_test_utils.py +++ b/packages/pynumaflow-lite/tests/_test_utils.py @@ -50,11 +50,8 @@ def run_python_server_with_rust_client( """ # Ensure clean socket state for p in [sock_path, server_info_path]: - try: - if p.exists(): - p.unlink() - except FileNotFoundError: - pass + if p.exists(): + p.unlink() # Start Python server tests_dir = Path(__file__).resolve().parent @@ -83,7 +80,7 @@ def run_python_server_with_rust_client( # Run Rust client bin rust_cmd = ["cargo", "run", "--quiet", "--bin", rust_bin_name] if rust_bin_args: - rust_cmd.extend(["--"] + rust_bin_args) + rust_cmd.extend(["--", *rust_bin_args]) rust = subprocess.run( rust_cmd, From 349a26f0a435a00cf4ebe4baee8c15588ee0888c Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 14:30:31 +0530 Subject: [PATCH 07/15] fix all ruff lints Signed-off-by: Sreekanth --- .../accumulator/accumulator_stream_sorter.py | 8 +--- .../manifests/batchmap/batchmap_cat.py | 8 +--- .../pynumaflow-lite/manifests/map/map_cat.py | 7 +--- .../manifests/mapstream/mapstream_cat.py | 8 +--- .../manifests/reduce/reduce_counter_class.py | 5 +-- .../reducestream/reducestream_counter.py | 5 +-- .../session_reduce_counter_class.py | 5 +-- .../manifests/sideinput/sideinput_example.py | 7 ++-- .../manifests/sink/sink_log.py | 8 +--- .../manifests/source/simple_source.py | 7 +--- .../sourcetransform_event_filter.py | 7 +--- .../pynumaflow_lite/__init__.py | 8 ++-- .../pynumaflow_lite/__init__.pyi | 28 +++++++------ .../pynumaflow_lite/_accumulator_dtypes.py | 2 +- .../pynumaflow_lite/_source_dtypes.py | 2 +- .../pynumaflow_lite/accumulator.pyi | 7 ++-- .../pynumaflow_lite/batchmapper.pyi | 22 +++++----- .../pynumaflow_lite/mapper.pyi | 34 ++++++++-------- .../pynumaflow_lite/mapstreamer.pyi | 16 ++++---- .../pynumaflow_lite/reducer.pyi | 19 +++++---- .../pynumaflow_lite/reducestreamer.pyi | 17 ++++---- .../pynumaflow_lite/session_reducer.pyi | 16 ++++---- .../pynumaflow_lite/sideinputer.pyi | 6 +-- .../pynumaflow_lite/sinker.pyi | 36 ++++++++--------- .../pynumaflow_lite/sourcer.pyi | 40 +++++++++---------- .../pynumaflow_lite/sourcetransformer.pyi | 34 ++++++++-------- packages/pynumaflow-lite/pyproject.toml | 1 - packages/pynumaflow-lite/tests/_test_utils.py | 3 +- .../examples/accumulator_stream_sorter.py | 3 +- .../tests/examples/batchmap_cat.py | 2 +- .../tests/examples/batchmap_cat_class.py | 3 +- .../pynumaflow-lite/tests/examples/map_cat.py | 2 +- .../tests/examples/map_cat_class.py | 2 +- .../tests/examples/mapstream_cat.py | 3 +- .../tests/examples/mapstream_cat_class.py | 3 +- .../tests/examples/reduce_counter_func.py | 3 +- .../tests/examples/sideinput_example.py | 2 +- .../tests/examples/sink_log.py | 2 +- .../tests/examples/source_simple.py | 2 +- .../examples/sourcetransform_event_filter.py | 2 +- 40 files changed, 177 insertions(+), 218 deletions(-) diff --git a/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py b/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py index dd132f09..7f917aff 100644 --- a/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py +++ b/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py @@ -7,8 +7,8 @@ import asyncio import signal +from collections.abc import AsyncIterator from datetime import datetime -from typing import AsyncIterator from pynumaflow_lite.accumulator import ( Accumulator, @@ -107,7 +107,6 @@ async def main(): """ Start the accumulator server. """ - import signal server = AccumulatorAsyncServer() @@ -124,10 +123,7 @@ async def main(): await server.start(StreamSorter) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return if __name__ == "__main__": diff --git a/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py b/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py index 33acc356..71aa1614 100644 --- a/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py +++ b/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py @@ -1,7 +1,6 @@ import asyncio import signal -from collections.abc import AsyncIterable -from typing import Awaitable, Callable +from collections.abc import AsyncIterable, Awaitable, Callable from pynumaflow_lite import batchmapper from pynumaflow_lite.batchmapper import Message @@ -41,10 +40,7 @@ async def start( await server.start(f) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/manifests/map/map_cat.py b/packages/pynumaflow-lite/manifests/map/map_cat.py index d059e8b1..863b9ca7 100644 --- a/packages/pynumaflow-lite/manifests/map/map_cat.py +++ b/packages/pynumaflow-lite/manifests/map/map_cat.py @@ -1,6 +1,6 @@ import asyncio import signal -from typing import Awaitable, Callable +from collections.abc import Awaitable, Callable from pynumaflow_lite import mapper @@ -38,10 +38,7 @@ async def start(f: Callable[[list[str], mapper.Datum], Awaitable[mapper.Messages print("Shutting down gracefully...") except asyncio.CancelledError: # Fallback in case the task was cancelled by the runner - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py b/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py index 12a6ba8e..3a30c1ce 100644 --- a/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py +++ b/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py @@ -1,7 +1,6 @@ import asyncio import signal -from collections.abc import AsyncIterator -from typing import Callable +from collections.abc import AsyncIterator, Callable from pynumaflow_lite import mapstreamer from pynumaflow_lite.mapstreamer import Message @@ -34,10 +33,7 @@ async def start(f: Callable[[list[str], mapstreamer.Datum], AsyncIterator[Messag await server.start(f) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py b/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py index 2f51b5ab..77bcca5f 100644 --- a/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py +++ b/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py @@ -42,10 +42,7 @@ async def start(creator: type[reducer.Reducer], init_args: tuple): await server.start(creator, init_args) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py b/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py index 949c386f..078cbe1d 100644 --- a/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py +++ b/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py @@ -88,10 +88,7 @@ async def start(creator: type, init_args: tuple): await server.start(creator, init_args) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py b/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py index 7b0e00f8..e287c157 100644 --- a/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py +++ b/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py @@ -72,10 +72,7 @@ async def main(): await server.start(SessionReduceCounter) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return if __name__ == "__main__": diff --git a/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py b/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py index 2a5104d0..203d6127 100644 --- a/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py +++ b/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py @@ -14,9 +14,10 @@ import threading from threading import Thread -from pynumaflow_lite import mapper, sideinputer from watchfiles import watch +from pynumaflow_lite import mapper, sideinputer + class ExampleSideInput(sideinputer.SideInput): """ @@ -32,7 +33,7 @@ async def retrieve_handler(self) -> sideinputer.Response: """ time_now = datetime.datetime.now() # val is the value to be broadcasted - val = f"an example: {str(time_now)}" + val = f"an example: {time_now!s}" self.counter += 1 # broadcast_message() is used to indicate that there is a broadcast return sideinputer.Response.broadcast_message(val.encode("utf-8")) @@ -65,7 +66,7 @@ def file_watcher(self): path = sideinputer.DIR_PATH for changes in watch(path): for change in changes: - change_type, file_path = change + _change_type, file_path = change if file_path.endswith(self.watched_file): with self.data_value_lock: self.update_data_from_file(file_path) diff --git a/packages/pynumaflow-lite/manifests/sink/sink_log.py b/packages/pynumaflow-lite/manifests/sink/sink_log.py index c3461015..ba3222ba 100644 --- a/packages/pynumaflow-lite/manifests/sink/sink_log.py +++ b/packages/pynumaflow-lite/manifests/sink/sink_log.py @@ -1,8 +1,7 @@ import asyncio import logging import signal -from collections.abc import AsyncIterable, AsyncIterator -from typing import Awaitable, Callable +from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable from pynumaflow_lite import sinker from pynumaflow_lite._sink_dtypes import Sinker @@ -43,10 +42,7 @@ async def start( await server.start(f) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/manifests/source/simple_source.py b/packages/pynumaflow-lite/manifests/source/simple_source.py index 5404cf12..fc9055f9 100644 --- a/packages/pynumaflow-lite/manifests/source/simple_source.py +++ b/packages/pynumaflow-lite/manifests/source/simple_source.py @@ -33,7 +33,7 @@ async def read_handler( ) # Generate the requested number of messages - for i in range(datum.num_records): + for _ in range(datum.num_records): # Create message payload payload = f"message-{self.counter}".encode() @@ -110,10 +110,7 @@ async def start(): await server.start(handler) print("Shutting down gracefully...") except asyncio.CancelledError: - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py b/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py index 42cbeca6..048f8b34 100644 --- a/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py +++ b/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py @@ -1,7 +1,7 @@ import asyncio import signal +from collections.abc import Callable from datetime import datetime, timezone -from typing import Callable from pynumaflow_lite import sourcetransformer @@ -79,10 +79,7 @@ async def start( print("Shutting down gracefully...") except asyncio.CancelledError: # Fallback in case the task was cancelled by the runner - try: - server.stop() - except Exception: - pass + server.stop() return diff --git a/packages/pynumaflow-lite/pynumaflow_lite/__init__.py b/packages/pynumaflow-lite/pynumaflow_lite/__init__.py index 8605bba7..a0062a35 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/__init__.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/__init__.py @@ -110,17 +110,17 @@ # Public API __all__ = [ - "mapper", + "accumulator", "batchmapper", + "mapper", "mapstreamer", "reducer", - "session_reducer", "reducestreamer", - "accumulator", + "session_reducer", + "sideinputer", "sinker", "sourcer", "sourcetransformer", - "sideinputer", ] __doc__ = pynumaflow_lite.__doc__ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/__init__.pyi b/packages/pynumaflow-lite/pynumaflow_lite/__init__.pyi index c125c12e..b2c866c6 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/__init__.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/__init__.pyi @@ -1,27 +1,29 @@ import _typeshed -from . import accumulator as accumulator -from . import batchmapper as batchmapper -from . import mapper as mapper -from . import mapstreamer as mapstreamer -from . import reducer as reducer -from . import session_reducer as session_reducer -from . import sideinputer as sideinputer -from . import sinker as sinker -from . import sourcer as sourcer -from . import sourcetransformer as sourcetransformer +from . import ( + accumulator as accumulator, + batchmapper as batchmapper, + mapper as mapper, + mapstreamer as mapstreamer, + reducer as reducer, + session_reducer as session_reducer, + sideinputer as sideinputer, + sinker as sinker, + sourcer as sourcer, + sourcetransformer as sourcetransformer, +) def __getattr__(name: str) -> _typeshed.Incomplete: ... __all__ = [ - "mapper", + "accumulator", "batchmapper", + "mapper", "mapstreamer", "reducer", "session_reducer", - "accumulator", + "sideinputer", "sinker", "sourcer", "sourcetransformer", - "sideinputer", ] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_accumulator_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_accumulator_dtypes.py index cdc260d4..9178e523 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_accumulator_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_accumulator_dtypes.py @@ -1,5 +1,5 @@ from abc import ABCMeta, abstractmethod -from typing import AsyncIterator +from collections.abc import AsyncIterator from pynumaflow_lite.accumulator import Datum, Message diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_source_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_source_dtypes.py index 2b418b87..97c9c370 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_source_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_source_dtypes.py @@ -121,4 +121,4 @@ async def nack_handler(self, request: NackRequest) -> None: # Add back to pending, mark for retry, etc. self.nacked_offsets.add(offset.offset) """ - pass + _ = request diff --git a/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi b/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi index 92a68820..4e5074b9 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi @@ -1,15 +1,14 @@ -from collections.abc import AsyncIterable +from collections.abc import AsyncIterable, AsyncIterator, Callable from datetime import datetime -from typing import AsyncIterator, Callable, Optional class Message: """ A message to be sent to the next vertex from an accumulator handler. """ - keys: Optional[list[str]] + keys: list[str] | None value: bytes - tags: Optional[list[str]] + tags: list[str] | None id: str headers: dict[str, str] event_time: datetime diff --git a/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi b/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi index 536ffc95..e45b819c 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi @@ -1,29 +1,29 @@ from __future__ import annotations import datetime as _dt -from typing import AsyncIterator, Awaitable, Callable, Dict, List, Optional +from collections.abc import AsyncIterator, Awaitable, Callable class Message: - keys: Optional[List[str]] + keys: list[str] | None value: bytes - tags: Optional[List[str]] + tags: list[str] | None def __init__( self, value: bytes, - keys: Optional[List[str]] = ..., - tags: Optional[List[str]] = ..., + keys: list[str] | None = ..., + tags: list[str] | None = ..., ) -> None: ... @staticmethod def message_to_drop() -> Message: ... class Datum: - keys: List[str] + keys: list[str] value: bytes watermark: _dt.datetime eventtime: _dt.datetime id: str - headers: Dict[str, str] + headers: dict[str, str] def __repr__(self) -> str: ... def __str__(self) -> str: ... @@ -55,10 +55,10 @@ class BatchMapper: async def handler(self, batch: AsyncIterator[Datum]) -> BatchResponses: ... __all__ = [ - "Message", - "Datum", - "BatchResponse", - "BatchResponses", "BatchMapAsyncServer", "BatchMapper", + "BatchResponse", + "BatchResponses", + "Datum", + "Message", ] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi b/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi index cc22818e..520b9188 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi @@ -1,7 +1,7 @@ from __future__ import annotations import datetime as _dt -from typing import Awaitable, Callable, Dict, List, Optional +from collections.abc import Awaitable, Callable # Re-export the Python ABC for user convenience and typing from ._map_dtypes import Mapper as Mapper @@ -10,11 +10,11 @@ class SystemMetadata: """System-generated metadata groups per message (read-only).""" def __init__(self) -> None: ... - def groups(self) -> List[str]: + def groups(self) -> list[str]: """Returns the groups of the system metadata.""" ... - def keys(self, group: str) -> List[str]: + def keys(self, group: str) -> list[str]: """Returns the keys of the system metadata for the given group.""" ... @@ -28,11 +28,11 @@ class UserMetadata: """User-defined metadata groups per message (read-write).""" def __init__(self) -> None: ... - def groups(self) -> List[str]: + def groups(self) -> list[str]: """Returns the groups of the user metadata.""" ... - def keys(self, group: str) -> List[str]: + def keys(self, group: str) -> list[str]: """Returns the keys of the user metadata for the given group.""" ... @@ -65,28 +65,28 @@ class Messages: def __str__(self) -> str: ... class Message: - keys: Optional[List[str]] + keys: list[str] | None value: bytes - tags: Optional[List[str]] - user_metadata: Optional[UserMetadata] + tags: list[str] | None + user_metadata: UserMetadata | None def __init__( self, value: bytes, - keys: Optional[List[str]] = ..., - tags: Optional[List[str]] = ..., - user_metadata: Optional[UserMetadata] = ..., + keys: list[str] | None = ..., + tags: list[str] | None = ..., + user_metadata: UserMetadata | None = ..., ) -> None: ... @staticmethod def message_to_drop() -> Message: ... class Datum: # Read-only attributes provided by the extension - keys: List[str] + keys: list[str] value: bytes watermark: _dt.datetime eventtime: _dt.datetime - headers: Dict[str, str] + headers: dict[str, str] user_metadata: UserMetadata system_metadata: SystemMetadata @@ -107,11 +107,11 @@ class MapAsyncServer: # Simple utility function exposed by the extension __all__ = [ - "SystemMetadata", - "UserMetadata", - "Messages", - "Message", "Datum", "MapAsyncServer", "Mapper", + "Message", + "Messages", + "SystemMetadata", + "UserMetadata", ] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi index 13aaa4bf..ad3d33b3 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi @@ -1,18 +1,18 @@ from __future__ import annotations import datetime as _dt -from typing import AsyncIterator, Awaitable, Callable, Dict, List, Optional +from collections.abc import AsyncIterator, Awaitable, Callable class Message: - keys: Optional[List[str]] + keys: list[str] | None value: bytes - tags: Optional[List[str]] + tags: list[str] | None def __init__( self, value: bytes, - keys: Optional[List[str]] = ..., - tags: Optional[List[str]] = ..., + keys: list[str] | None = ..., + tags: list[str] | None = ..., ) -> None: ... @staticmethod def message_to_drop() -> Message: ... @@ -20,11 +20,11 @@ class Message: def to_drop() -> Message: ... class Datum: - keys: List[str] + keys: list[str] value: bytes watermark: _dt.datetime eventtime: _dt.datetime - headers: Dict[str, str] + headers: dict[str, str] def __repr__(self) -> str: ... def __str__(self) -> str: ... @@ -46,8 +46,8 @@ class MapStreamer: ) -> AsyncIterator[Message]: ... __all__ = [ - "Message", "Datum", "MapStreamAsyncServer", "MapStreamer", + "Message", ] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi index ea9e9001..5b9c6cff 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi @@ -1,22 +1,21 @@ from __future__ import annotations import datetime as _dt -from collections.abc import AsyncIterable -from typing import Awaitable, Callable, Dict, List, Optional +from collections.abc import AsyncIterable, Awaitable, Callable # Re-export the Python ABC for user convenience and typing from ._reduce_dtypes import Reducer as Reducer class Message: - keys: Optional[List[str]] + keys: list[str] | None value: bytes - tags: Optional[List[str]] + tags: list[str] | None def __init__( self, value: bytes, - keys: Optional[List[str]] = ..., - tags: Optional[List[str]] = ..., + keys: list[str] | None = ..., + tags: list[str] | None = ..., ) -> None: ... @staticmethod def message_to_drop() -> Message: ... @@ -30,11 +29,11 @@ class Messages: def __str__(self) -> str: ... class Datum: - keys: List[str] + keys: list[str] value: bytes watermark: _dt.datetime eventtime: _dt.datetime - headers: Dict[str, str] + headers: dict[str, str] def __repr__(self) -> str: ... def __str__(self) -> str: ... @@ -63,10 +62,10 @@ class ReduceAsyncServer: def stop(self) -> None: ... __all__ = [ - "Message", - "Messages", "Datum", "IntervalWindow", + "Message", + "Messages", "Metadata", "ReduceAsyncServer", "Reducer", diff --git a/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi index 66809fc8..67541004 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi @@ -1,32 +1,31 @@ from __future__ import annotations import datetime as _dt -from collections.abc import AsyncIterable -from typing import AsyncIterator, Awaitable, Callable, Dict, List, Optional +from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable # Re-export the Python ABC for user convenience and typing from ._reducestreamer_dtypes import ReduceStreamer as ReduceStreamer class Message: - keys: Optional[List[str]] + keys: list[str] | None value: bytes - tags: Optional[List[str]] + tags: list[str] | None def __init__( self, value: bytes, - keys: Optional[List[str]] = ..., - tags: Optional[List[str]] = ..., + keys: list[str] | None = ..., + tags: list[str] | None = ..., ) -> None: ... @staticmethod def message_to_drop() -> Message: ... class Datum: - keys: List[str] + keys: list[str] value: bytes watermark: _dt.datetime eventtime: _dt.datetime - headers: Dict[str, str] + headers: dict[str, str] def __repr__(self) -> str: ... def __str__(self) -> str: ... @@ -66,9 +65,9 @@ class ReduceStreamAsyncServer: def stop(self) -> None: ... __all__ = [ - "Message", "Datum", "IntervalWindow", + "Message", "Metadata", "PyAsyncDatumStream", "ReduceStreamAsyncServer", diff --git a/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi index edcacc37..1fc857ff 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi @@ -1,31 +1,31 @@ from __future__ import annotations import datetime as _dt -from typing import Awaitable, Dict, List, Optional +from collections.abc import Awaitable # Re-export the Python ABC for user convenience and typing from ._session_reduce_dtypes import SessionReducer as SessionReducer class Message: - keys: Optional[List[str]] + keys: list[str] | None value: bytes - tags: Optional[List[str]] + tags: list[str] | None def __init__( self, value: bytes, - keys: Optional[List[str]] = ..., - tags: Optional[List[str]] = ..., + keys: list[str] | None = ..., + tags: list[str] | None = ..., ) -> None: ... @staticmethod def message_to_drop() -> Message: ... class Datum: - keys: List[str] + keys: list[str] value: bytes watermark: _dt.datetime eventtime: _dt.datetime - headers: Dict[str, str] + headers: dict[str, str] def __repr__(self) -> str: ... def __str__(self) -> str: ... @@ -42,8 +42,8 @@ class SessionReduceAsyncServer: def stop(self) -> None: ... __all__ = [ - "Message", "Datum", + "Message", "SessionReduceAsyncServer", "SessionReducer", ] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/sideinputer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/sideinputer.pyi index db7936fb..ca57e079 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/sideinputer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/sideinputer.pyi @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Awaitable +from collections.abc import Awaitable # Re-export the Python ABC for user convenience and typing from ._sideinput_dtypes import SideInput as SideInput @@ -39,8 +39,8 @@ DIR_PATH: str """Default directory path where side input files are stored.""" __all__ = [ + "DIR_PATH", "Response", - "SideInputAsyncServer", "SideInput", - "DIR_PATH", + "SideInputAsyncServer", ] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi b/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi index 3d7ec5a0..bdbf3d4b 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi @@ -1,17 +1,17 @@ from __future__ import annotations import datetime as _dt -from typing import AsyncIterator, Awaitable, Callable, Dict, List, Optional +from collections.abc import AsyncIterator, Awaitable, Callable class SystemMetadata: """System-generated metadata groups per message (read-only for sink).""" def __init__(self) -> None: ... - def groups(self) -> List[str]: + def groups(self) -> list[str]: """Returns the groups of the system metadata.""" ... - def keys(self, group: str) -> List[str]: + def keys(self, group: str) -> list[str]: """Returns the keys of the system metadata for the given group.""" ... @@ -25,11 +25,11 @@ class UserMetadata: """User-defined metadata groups per message (read-only for sink).""" def __init__(self) -> None: ... - def groups(self) -> List[str]: + def groups(self) -> list[str]: """Returns the groups of the user metadata.""" ... - def keys(self, group: str) -> List[str]: + def keys(self, group: str) -> list[str]: """Returns the keys of the user metadata for the given group.""" ... @@ -40,22 +40,22 @@ class UserMetadata: def __repr__(self) -> str: ... class KeyValueGroup: - key_value: Dict[str, bytes] + key_value: dict[str, bytes] - def __init__(self, key_value: Optional[Dict[str, bytes]] = ...) -> None: ... + def __init__(self, key_value: dict[str, bytes] | None = ...) -> None: ... @staticmethod - def from_dict(key_value: Dict[str, bytes]) -> KeyValueGroup: ... + def from_dict(key_value: dict[str, bytes]) -> KeyValueGroup: ... class Message: - keys: Optional[List[str]] + keys: list[str] | None value: bytes - user_metadata: Optional[Dict[str, KeyValueGroup]] + user_metadata: dict[str, KeyValueGroup] | None def __init__( self, value: bytes, - keys: Optional[List[str]] = ..., - user_metadata: Optional[Dict[str, KeyValueGroup]] = ..., + keys: list[str] | None = ..., + user_metadata: dict[str, KeyValueGroup] | None = ..., ) -> None: ... class Response: @@ -70,19 +70,19 @@ class Response: @staticmethod def as_serve(id: str, payload: bytes) -> Response: ... @staticmethod - def as_on_success(id: str, message: Optional[Message] = ...) -> Response: ... + def as_on_success(id: str, message: Message | None = ...) -> Response: ... class Responses: def __init__(self) -> None: ... def append(self, response: Response) -> None: ... class Datum: - keys: List[str] + keys: list[str] value: bytes watermark: _dt.datetime eventtime: _dt.datetime id: str - headers: Dict[str, str] + headers: dict[str, str] user_metadata: UserMetadata system_metadata: SystemMetadata @@ -104,13 +104,13 @@ class Sinker: async def handler(self, datums: AsyncIterator[Datum]) -> Responses: ... __all__ = [ - "SystemMetadata", - "UserMetadata", + "Datum", "KeyValueGroup", "Message", "Response", "Responses", - "Datum", "SinkAsyncServer", "Sinker", + "SystemMetadata", + "UserMetadata", ] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/sourcer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/sourcer.pyi index 425076bc..715a925f 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/sourcer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/sourcer.pyi @@ -1,7 +1,7 @@ from __future__ import annotations import datetime as _dt -from typing import Awaitable, Dict, List, Optional +from collections.abc import Awaitable # Re-export the Python ABC for user convenience and typing from ._source_dtypes import Sourcer as Sourcer @@ -10,11 +10,11 @@ class UserMetadata: """User-defined metadata groups per message (read-write for source).""" def __init__(self) -> None: ... - def groups(self) -> List[str]: + def groups(self) -> list[str]: """Returns the groups of the user metadata.""" ... - def keys(self, group: str) -> List[str]: + def keys(self, group: str) -> list[str]: """Returns the keys of the user metadata for the given group.""" ... @@ -46,18 +46,18 @@ class Message: payload: bytes offset: Offset event_time: _dt.datetime - keys: List[str] - headers: Dict[str, str] - user_metadata: Optional[UserMetadata] + keys: list[str] + headers: dict[str, str] + user_metadata: UserMetadata | None def __init__( self, payload: bytes, offset: Offset, event_time: _dt.datetime, - keys: Optional[List[str]] = ..., - headers: Optional[Dict[str, str]] = ..., - user_metadata: Optional[UserMetadata] = ..., + keys: list[str] | None = ..., + headers: dict[str, str] | None = ..., + user_metadata: UserMetadata | None = ..., ) -> None: ... def __repr__(self) -> str: ... def __str__(self) -> str: ... @@ -92,22 +92,22 @@ class ReadRequest: class AckRequest: """A request to acknowledge messages.""" - offsets: List[Offset] + offsets: list[Offset] def __init__( self, - offsets: List[Offset], + offsets: list[Offset], ) -> None: ... def __repr__(self) -> str: ... class NackRequest: """A request to negatively acknowledge messages.""" - offsets: List[Offset] + offsets: list[Offset] def __init__( self, - offsets: List[Offset], + offsets: list[Offset], ) -> None: ... def __repr__(self) -> str: ... @@ -125,11 +125,11 @@ class PendingResponse: class PartitionsResponse: """Response for partitions.""" - partitions: List[int] + partitions: list[int] def __init__( self, - partitions: List[int], + partitions: list[int], ) -> None: ... def __repr__(self) -> str: ... @@ -145,14 +145,14 @@ class SourceAsyncServer: def stop(self) -> None: ... __all__ = [ - "UserMetadata", - "Message", - "Offset", - "ReadRequest", "AckRequest", + "Message", "NackRequest", - "PendingResponse", + "Offset", "PartitionsResponse", + "PendingResponse", + "ReadRequest", "SourceAsyncServer", "Sourcer", + "UserMetadata", ] diff --git a/packages/pynumaflow-lite/pynumaflow_lite/sourcetransformer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/sourcetransformer.pyi index 181615d9..baca1407 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/sourcetransformer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/sourcetransformer.pyi @@ -1,7 +1,7 @@ from __future__ import annotations import datetime as _dt -from typing import Awaitable, Dict, List, Optional +from collections.abc import Awaitable # Re-export the Python ABC for user convenience and typing from ._sourcetransformer_dtypes import SourceTransformer as SourceTransformer @@ -10,11 +10,11 @@ class SystemMetadata: """System-generated metadata groups per message (read-only).""" def __init__(self) -> None: ... - def groups(self) -> List[str]: + def groups(self) -> list[str]: """Returns the groups of the system metadata.""" ... - def keys(self, group: str) -> List[str]: + def keys(self, group: str) -> list[str]: """Returns the keys of the system metadata for the given group.""" ... @@ -28,11 +28,11 @@ class UserMetadata: """User-defined metadata groups per message (read-write).""" def __init__(self) -> None: ... - def groups(self) -> List[str]: + def groups(self) -> list[str]: """Returns the groups of the user metadata.""" ... - def keys(self, group: str) -> List[str]: + def keys(self, group: str) -> list[str]: """Returns the keys of the user metadata for the given group.""" ... @@ -65,30 +65,30 @@ class Messages: def __str__(self) -> str: ... class Message: - keys: Optional[List[str]] + keys: list[str] | None value: bytes event_time: _dt.datetime - tags: Optional[List[str]] - user_metadata: Optional[UserMetadata] + tags: list[str] | None + user_metadata: UserMetadata | None def __init__( self, value: bytes, event_time: _dt.datetime, - keys: Optional[List[str]] = ..., - tags: Optional[List[str]] = ..., - user_metadata: Optional[UserMetadata] = ..., + keys: list[str] | None = ..., + tags: list[str] | None = ..., + user_metadata: UserMetadata | None = ..., ) -> None: ... @staticmethod def message_to_drop(event_time: _dt.datetime) -> Message: ... class Datum: # Read-only attributes provided by the extension - keys: List[str] + keys: list[str] value: bytes watermark: _dt.datetime event_time: _dt.datetime - headers: Dict[str, str] + headers: dict[str, str] user_metadata: UserMetadata system_metadata: SystemMetadata @@ -105,11 +105,11 @@ class SourceTransformAsyncServer: def stop(self) -> None: ... __all__ = [ - "SystemMetadata", - "UserMetadata", - "Messages", - "Message", "Datum", + "Message", + "Messages", "SourceTransformAsyncServer", "SourceTransformer", + "SystemMetadata", + "UserMetadata", ] diff --git a/packages/pynumaflow-lite/pyproject.toml b/packages/pynumaflow-lite/pyproject.toml index 2ed18d07..c83d6c55 100644 --- a/packages/pynumaflow-lite/pyproject.toml +++ b/packages/pynumaflow-lite/pyproject.toml @@ -50,7 +50,6 @@ combine-as-imports = true [tool.ruff.lint.per-file-ignores] "**/*.pyi" = [ "UP006", # keep typing.List-style annotations in stubs for now - "UP045", # keep typing.Optional-style annotations in stubs for now ] [tool.ruff.format] diff --git a/packages/pynumaflow-lite/tests/_test_utils.py b/packages/pynumaflow-lite/tests/_test_utils.py index b30223eb..a52fe718 100644 --- a/packages/pynumaflow-lite/tests/_test_utils.py +++ b/packages/pynumaflow-lite/tests/_test_utils.py @@ -5,7 +5,6 @@ import sys import time from pathlib import Path -from typing import List, Optional import pytest @@ -30,7 +29,7 @@ def run_python_server_with_rust_client( sock_path: Path, server_info_path: Path, rust_bin_name: str, - rust_bin_args: Optional[List[str]] = None, + rust_bin_args: list[str] | None = None, socket_timeout: float = 20.0, rust_timeout: float = 60.0, server_shutdown_timeout: float = 15.0, diff --git a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py index bac4def1..2501df44 100644 --- a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py +++ b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py @@ -7,8 +7,8 @@ import asyncio import signal +from collections.abc import AsyncIterator from datetime import datetime -from typing import AsyncIterator from pynumaflow_lite.accumulator import ( Accumulator, @@ -107,7 +107,6 @@ async def main(): """ Start the accumulator server. """ - import signal sock_file = "/tmp/var/run/numaflow/accumulator.sock" server_info_file = "/tmp/var/run/numaflow/accumulator-server-info" diff --git a/packages/pynumaflow-lite/tests/examples/batchmap_cat.py b/packages/pynumaflow-lite/tests/examples/batchmap_cat.py index b43c09c3..64a018e8 100644 --- a/packages/pynumaflow-lite/tests/examples/batchmap_cat.py +++ b/packages/pynumaflow-lite/tests/examples/batchmap_cat.py @@ -1,7 +1,7 @@ import asyncio import collections.abc import signal -from typing import Awaitable, Callable +from collections.abc import Awaitable, Callable from pynumaflow_lite import batchmapper diff --git a/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py b/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py index 3d40324b..85314efc 100644 --- a/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py @@ -1,7 +1,6 @@ import asyncio import signal -from collections.abc import AsyncIterator -from typing import Awaitable, Callable +from collections.abc import AsyncIterator, Awaitable, Callable from pynumaflow_lite import batchmapper from pynumaflow_lite.batchmapper import Message diff --git a/packages/pynumaflow-lite/tests/examples/map_cat.py b/packages/pynumaflow-lite/tests/examples/map_cat.py index c1907caa..1cff0c68 100644 --- a/packages/pynumaflow-lite/tests/examples/map_cat.py +++ b/packages/pynumaflow-lite/tests/examples/map_cat.py @@ -1,6 +1,6 @@ import asyncio import signal -from typing import Awaitable, Callable +from collections.abc import Awaitable, Callable from pynumaflow_lite import mapper diff --git a/packages/pynumaflow-lite/tests/examples/map_cat_class.py b/packages/pynumaflow-lite/tests/examples/map_cat_class.py index ab621a4b..1970a71c 100644 --- a/packages/pynumaflow-lite/tests/examples/map_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/map_cat_class.py @@ -1,6 +1,6 @@ import asyncio import signal -from typing import Awaitable, Callable +from collections.abc import Awaitable, Callable from pynumaflow_lite import mapper diff --git a/packages/pynumaflow-lite/tests/examples/mapstream_cat.py b/packages/pynumaflow-lite/tests/examples/mapstream_cat.py index 80ad3898..2d6bc0cf 100644 --- a/packages/pynumaflow-lite/tests/examples/mapstream_cat.py +++ b/packages/pynumaflow-lite/tests/examples/mapstream_cat.py @@ -1,7 +1,6 @@ import asyncio import signal -from collections.abc import AsyncIterator -from typing import Callable +from collections.abc import AsyncIterator, Callable from pynumaflow_lite import mapstreamer from pynumaflow_lite.mapstreamer import Message diff --git a/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py b/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py index fe07f013..def180d5 100644 --- a/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py @@ -1,7 +1,6 @@ import asyncio import signal -from collections.abc import AsyncIterator -from typing import Callable +from collections.abc import AsyncIterator, Callable from pynumaflow_lite import mapstreamer from pynumaflow_lite.mapstreamer import Message diff --git a/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py b/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py index 91ea1ae6..4391fc1f 100644 --- a/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py +++ b/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py @@ -1,7 +1,6 @@ import asyncio import signal -from collections.abc import AsyncIterable -from typing import Awaitable, Callable +from collections.abc import AsyncIterable, Awaitable, Callable from pynumaflow_lite import reducer diff --git a/packages/pynumaflow-lite/tests/examples/sideinput_example.py b/packages/pynumaflow-lite/tests/examples/sideinput_example.py index d35c6e1d..775f2ec8 100644 --- a/packages/pynumaflow-lite/tests/examples/sideinput_example.py +++ b/packages/pynumaflow-lite/tests/examples/sideinput_example.py @@ -19,7 +19,7 @@ async def retrieve_handler(self) -> sideinputer.Response: """ time_now = datetime.datetime.now() # val is the value to be broadcasted - val = f"an example: {str(time_now)}" + val = f"an example: {time_now!s}" self.counter += 1 # broadcast every other time if self.counter % 2 == 0: diff --git a/packages/pynumaflow-lite/tests/examples/sink_log.py b/packages/pynumaflow-lite/tests/examples/sink_log.py index f2d465b6..9cd645d0 100644 --- a/packages/pynumaflow-lite/tests/examples/sink_log.py +++ b/packages/pynumaflow-lite/tests/examples/sink_log.py @@ -2,7 +2,7 @@ import collections.abc import logging import signal -from typing import Awaitable, Callable +from collections.abc import Awaitable, Callable from pynumaflow_lite import sinker diff --git a/packages/pynumaflow-lite/tests/examples/source_simple.py b/packages/pynumaflow-lite/tests/examples/source_simple.py index dfd19ed2..97968b95 100644 --- a/packages/pynumaflow-lite/tests/examples/source_simple.py +++ b/packages/pynumaflow-lite/tests/examples/source_simple.py @@ -34,7 +34,7 @@ async def read_handler( ) # Generate the requested number of messages - for i in range(datum.num_records): + for _ in range(datum.num_records): # Create message payload payload = f"message-{self.counter}".encode() diff --git a/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py b/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py index eb18b8fd..8302fe33 100644 --- a/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py +++ b/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py @@ -1,7 +1,7 @@ import asyncio import signal +from collections.abc import Callable from datetime import datetime, timezone -from typing import Callable from pynumaflow_lite import sourcetransformer From 60bdf75cfac18cbb355549350d9d07071e8d5a39 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 15:01:06 +0530 Subject: [PATCH 08/15] format all files Signed-off-by: Sreekanth --- .../accumulator/accumulator_stream_sorter.py | 1 + .../manifests/batchmap/batchmap_cat.py | 9 +++---- .../pynumaflow-lite/manifests/map/map_cat.py | 1 + .../manifests/mapstream/mapstream_cat.py | 5 ++-- .../manifests/reduce/reduce_counter_class.py | 5 ++-- .../reducestream/reducestream_counter.py | 9 +++---- .../session_reduce_counter_class.py | 1 + .../manifests/sideinput/sideinput_example.py | 1 + .../manifests/sink/sink_log.py | 1 + .../manifests/source/simple_source.py | 17 ++++--------- .../sourcetransform_event_filter.py | 13 ++++------ .../pynumaflow_lite/_reduce_dtypes.py | 4 +--- .../pynumaflow_lite/_reducestreamer_dtypes.py | 4 +--- .../pynumaflow_lite/_session_reduce_dtypes.py | 4 +--- .../pynumaflow_lite/accumulator.pyi | 4 +--- .../pynumaflow_lite/batchmapper.pyi | 4 +--- .../pynumaflow_lite/mapper.pyi | 4 +--- .../pynumaflow_lite/mapstreamer.pyi | 8 ++----- .../pynumaflow_lite/reducer.pyi | 5 +--- .../pynumaflow_lite/reducestreamer.pyi | 5 +--- .../pynumaflow_lite/session_reducer.pyi | 4 +--- .../pynumaflow_lite/sinker.pyi | 4 +--- packages/pynumaflow-lite/tests/_test_utils.py | 4 +--- .../examples/accumulator_stream_sorter.py | 1 + .../tests/examples/batchmap_cat_class.py | 9 +++---- .../pynumaflow-lite/tests/examples/map_cat.py | 8 ++----- .../tests/examples/map_cat_class.py | 9 +++---- .../tests/examples/mapstream_cat.py | 4 +--- .../tests/examples/mapstream_cat_class.py | 5 ++-- .../tests/examples/reduce_counter_class.py | 5 ++-- .../tests/examples/reduce_counter_func.py | 6 ++--- .../tests/examples/reducestream_counter.py | 7 ++---- .../examples/session_reduce_counter_class.py | 1 + .../tests/examples/sink_log.py | 4 +--- .../tests/examples/source_simple.py | 24 +++++-------------- .../examples/sourcetransform_event_filter.py | 21 +++++----------- 36 files changed, 69 insertions(+), 152 deletions(-) diff --git a/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py b/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py index 7f917aff..63f2d664 100644 --- a/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py +++ b/packages/pynumaflow-lite/manifests/accumulator/accumulator_stream_sorter.py @@ -126,5 +126,6 @@ async def main(): server.stop() return + if __name__ == "__main__": asyncio.run(main()) diff --git a/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py b/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py index 71aa1614..fed9eedf 100644 --- a/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py +++ b/packages/pynumaflow-lite/manifests/batchmap/batchmap_cat.py @@ -7,9 +7,7 @@ class SimpleBatchCat(batchmapper.BatchMapper): - async def handler( - self, batch: AsyncIterable[batchmapper.Datum] - ) -> batchmapper.BatchResponses: + async def handler(self, batch: AsyncIterable[batchmapper.Datum]) -> batchmapper.BatchResponses: responses = batchmapper.BatchResponses() async for d in batch: resp = batchmapper.BatchResponse(d.id) @@ -21,10 +19,9 @@ async def handler( responses.append(resp) return responses + async def start( - f: Callable[ - [AsyncIterable[batchmapper.Datum]], Awaitable[batchmapper.BatchResponses] - ], + f: Callable[[AsyncIterable[batchmapper.Datum]], Awaitable[batchmapper.BatchResponses]], ): server = batchmapper.BatchMapAsyncServer() diff --git a/packages/pynumaflow-lite/manifests/map/map_cat.py b/packages/pynumaflow-lite/manifests/map/map_cat.py index 863b9ca7..f877f212 100644 --- a/packages/pynumaflow-lite/manifests/map/map_cat.py +++ b/packages/pynumaflow-lite/manifests/map/map_cat.py @@ -17,6 +17,7 @@ async def handler(self, keys: list[str], payload: mapper.Datum) -> mapper.Messag return messages + async def start(f: Callable[[list[str], mapper.Datum], Awaitable[mapper.Messages]]): server = mapper.MapAsyncServer() diff --git a/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py b/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py index 3a30c1ce..9cfe0beb 100644 --- a/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py +++ b/packages/pynumaflow-lite/manifests/mapstream/mapstream_cat.py @@ -7,9 +7,7 @@ class SimpleStreamCat(mapstreamer.MapStreamer): - async def handler( - self, keys: list[str], datum: mapstreamer.Datum - ) -> AsyncIterator[Message]: + async def handler(self, keys: list[str], datum: mapstreamer.Datum) -> AsyncIterator[Message]: parts = datum.value.decode("utf-8").split(",") if not parts: yield Message.to_drop() @@ -17,6 +15,7 @@ async def handler( for s in parts: yield Message(s.encode(), keys) + async def start(f: Callable[[list[str], mapstreamer.Datum], AsyncIterator[Message]]): # Use default socket/info file locations; no explicit sock file passed server = mapstreamer.MapStreamAsyncServer() diff --git a/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py b/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py index 77bcca5f..6f112b4c 100644 --- a/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py +++ b/packages/pynumaflow-lite/manifests/reduce/reduce_counter_class.py @@ -19,13 +19,12 @@ async def handler( self.counter = 0 async for _ in datums: self.counter += 1 - msg = ( - f"counter:{self.counter} interval_window_start:{iw.start} interval_window_end:{iw.end}" - ).encode() + msg = (f"counter:{self.counter} interval_window_start:{iw.start} interval_window_end:{iw.end}").encode() out = reducer.Messages() out.append(reducer.Message(msg, keys)) return out + async def start(creator: type[reducer.Reducer], init_args: tuple): sock_file = "/var/run/numaflow/reduce.sock" server_info_file = "/var/run/numaflow/reducer-server-info" diff --git a/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py b/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py index 078cbe1d..0097df6c 100644 --- a/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py +++ b/packages/pynumaflow-lite/manifests/reducestream/reducestream_counter.py @@ -53,9 +53,7 @@ async def handler( # Emit intermediate result every 10 items if self.counter % 10 == 0: msg = ( - f"counter:{self.counter} " - f"interval_window_start:{iw.start} " - f"interval_window_end:{iw.end}" + f"counter:{self.counter} interval_window_start:{iw.start} interval_window_end:{iw.end}" ).encode() print(f"Yielding intermediate result: counter={self.counter}") # Early release of data - this is the key feature of reduce streaming! @@ -63,13 +61,12 @@ async def handler( # Emit final result msg = ( - f"counter:{self.counter} (FINAL) " - f"interval_window_start:{iw.start} " - f"interval_window_end:{iw.end}" + f"counter:{self.counter} (FINAL) interval_window_start:{iw.start} interval_window_end:{iw.end}" ).encode() print(f"Yielding final result: counter={self.counter}") yield reducestreamer.Message(msg, keys=keys) + async def start(creator: type, init_args: tuple): """Start the reduce stream server.""" sock_file = "/var/run/numaflow/reducestream.sock" diff --git a/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py b/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py index e287c157..2fa8441d 100644 --- a/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py +++ b/packages/pynumaflow-lite/manifests/session_reduce/session_reduce_counter_class.py @@ -75,5 +75,6 @@ async def main(): server.stop() return + if __name__ == "__main__": asyncio.run(main()) diff --git a/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py b/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py index 203d6127..5361b57f 100644 --- a/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py +++ b/packages/pynumaflow-lite/manifests/sideinput/sideinput_example.py @@ -86,6 +86,7 @@ def update_data_from_file(self, path): except Exception as e: print(f"Error reading file: {e}") + async def start_sideinput(): """Start the SideInput retriever server.""" server = sideinputer.SideInputAsyncServer() diff --git a/packages/pynumaflow-lite/manifests/sink/sink_log.py b/packages/pynumaflow-lite/manifests/sink/sink_log.py index ba3222ba..a977817d 100644 --- a/packages/pynumaflow-lite/manifests/sink/sink_log.py +++ b/packages/pynumaflow-lite/manifests/sink/sink_log.py @@ -25,6 +25,7 @@ async def handler(self, datums: AsyncIterable[sinker.Datum]) -> sinker.Responses # we can use Response.as_fallback(msg.id) to write the message to fallback sink return responses + async def start( f: Callable[[AsyncIterator[sinker.Datum]], Awaitable[sinker.Responses]], ): diff --git a/packages/pynumaflow-lite/manifests/source/simple_source.py b/packages/pynumaflow-lite/manifests/source/simple_source.py index fc9055f9..a42cdf5a 100644 --- a/packages/pynumaflow-lite/manifests/source/simple_source.py +++ b/packages/pynumaflow-lite/manifests/source/simple_source.py @@ -22,15 +22,11 @@ def __init__(self): self.counter = 0 self.partition_idx = 0 - async def read_handler( - self, datum: sourcer.ReadRequest - ) -> AsyncIterator[sourcer.Message]: + async def read_handler(self, datum: sourcer.ReadRequest) -> AsyncIterator[sourcer.Message]: """ The simple source generates messages with incrementing numbers. """ - _LOGGER.info( - f"Read request: num_records={datum.num_records}, timeout_ms={datum.timeout_ms}" - ) + _LOGGER.info(f"Read request: num_records={datum.num_records}, timeout_ms={datum.timeout_ms}") # Generate the requested number of messages for _ in range(datum.num_records): @@ -66,9 +62,7 @@ async def ack_handler(self, request: sourcer.AckRequest) -> None: """ _LOGGER.info(f"Acknowledging {len(request.offsets)} offsets") for offset in request.offsets: - _LOGGER.debug( - f"Acked offset: {offset.offset.decode('utf-8')}, partition: {offset.partition_id}" - ) + _LOGGER.debug(f"Acked offset: {offset.offset.decode('utf-8')}, partition: {offset.partition_id}") async def nack_handler(self, request: sourcer.NackRequest) -> None: """ @@ -76,9 +70,7 @@ async def nack_handler(self, request: sourcer.NackRequest) -> None: """ _LOGGER.info(f"Negatively acknowledging {len(request.offsets)} offsets") for offset in request.offsets: - _LOGGER.warning( - f"Nacked offset: {offset.offset.decode('utf-8')}, partition: {offset.partition_id}" - ) + _LOGGER.warning(f"Nacked offset: {offset.offset.decode('utf-8')}, partition: {offset.partition_id}") async def pending_handler(self) -> sourcer.PendingResponse: """ @@ -92,6 +84,7 @@ async def partitions_handler(self) -> sourcer.PartitionsResponse: """ return sourcer.PartitionsResponse(partitions=[self.partition_idx]) + async def start(): server = sourcer.SourceAsyncServer() diff --git a/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py b/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py index 048f8b34..ea79646f 100644 --- a/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py +++ b/packages/pynumaflow-lite/manifests/sourcetransform/sourcetransform_event_filter.py @@ -19,9 +19,7 @@ class EventFilter(sourcetransformer.SourceTransformer): - Messages after 2022 are tagged with "after_year_2022" """ - async def handler( - self, keys: list[str], datum: sourcetransformer.Datum - ) -> sourcetransformer.Messages: + async def handler(self, keys: list[str], datum: sourcetransformer.Datum) -> sourcetransformer.Messages: val = datum.value event_time = datum.event_time messages = sourcetransformer.Messages() @@ -30,9 +28,7 @@ async def handler( print(f"Got event time: {event_time}, it is before 2022, so dropping") messages.append(sourcetransformer.Message.message_to_drop(event_time)) elif event_time < january_first_2023: - print( - f"Got event time: {event_time}, it is within year 2022, so forwarding to within_year_2022" - ) + print(f"Got event time: {event_time}, it is within year 2022, so forwarding to within_year_2022") messages.append( sourcetransformer.Message( value=val, @@ -42,9 +38,7 @@ async def handler( ) ) else: - print( - f"Got event time: {event_time}, it is after year 2022, so forwarding to after_year_2022" - ) + print(f"Got event time: {event_time}, it is after year 2022, so forwarding to after_year_2022") messages.append( sourcetransformer.Message( value=val, @@ -56,6 +50,7 @@ async def handler( return messages + async def start( f: Callable[[list[str], sourcetransformer.Datum], sourcetransformer.Messages], ): diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_reduce_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_reduce_dtypes.py index eb5b6140..57aeacb6 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_reduce_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_reduce_dtypes.py @@ -13,9 +13,7 @@ def __call__(self, *args, **kwargs): return self.handler(*args, **kwargs) @abstractmethod - async def handler( - self, keys: list[str], datums: AsyncIterable[Datum], md: Metadata - ) -> Messages: + async def handler(self, keys: list[str], datums: AsyncIterable[Datum], md: Metadata) -> Messages: """ Implement this handler; consume `datums` async iterable and return Messages. """ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_reducestreamer_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_reducestreamer_dtypes.py index f024a0ad..25c65f94 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_reducestreamer_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_reducestreamer_dtypes.py @@ -16,9 +16,7 @@ def __call__(self, *args, **kwargs): return self.handler(*args, **kwargs) @abstractmethod - async def handler( - self, keys: list[str], datums: AsyncIterable[Datum], md: Metadata - ) -> AsyncIterator[Message]: + async def handler(self, keys: list[str], datums: AsyncIterable[Datum], md: Metadata) -> AsyncIterator[Message]: """ Implement this handler; consume `datums` async iterable and yield Messages incrementally. diff --git a/packages/pynumaflow-lite/pynumaflow_lite/_session_reduce_dtypes.py b/packages/pynumaflow-lite/pynumaflow_lite/_session_reduce_dtypes.py index a96a072f..4e9998a2 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/_session_reduce_dtypes.py +++ b/packages/pynumaflow-lite/pynumaflow_lite/_session_reduce_dtypes.py @@ -10,9 +10,7 @@ class SessionReducer(metaclass=ABCMeta): """ @abstractmethod - async def session_reduce( - self, keys: list[str], datums: AsyncIterator[Datum] - ) -> AsyncIterator[Message]: + async def session_reduce(self, keys: list[str], datums: AsyncIterator[Datum]) -> AsyncIterator[Message]: """ Implement this handler; consume `datums` async iterable and yield Messages. This is called for each session window. diff --git a/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi b/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi index 4e5074b9..da56a1c7 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/accumulator.pyi @@ -76,9 +76,7 @@ class AccumulatorAsyncServer: ) -> None: ... async def start( self, - py_creator: ( - type[Accumulator] | Callable[[AsyncIterable[Datum]], AsyncIterator[Message]] - ), + py_creator: (type[Accumulator] | Callable[[AsyncIterable[Datum]], AsyncIterator[Message]]), init_args: tuple | None = None, ) -> None: """ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi b/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi index e45b819c..277af5e3 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/batchmapper.pyi @@ -46,9 +46,7 @@ class BatchMapAsyncServer: sock_file: str | None = ..., info_file: str | None = ..., ) -> None: ... - def start( - self, py_func: Callable[[AsyncIterator[Datum]], Awaitable[BatchResponses]] - ) -> Awaitable[None]: ... + def start(self, py_func: Callable[[AsyncIterator[Datum]], Awaitable[BatchResponses]]) -> Awaitable[None]: ... def stop(self) -> None: ... class BatchMapper: diff --git a/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi b/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi index 520b9188..8255e6d6 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/mapper.pyi @@ -99,9 +99,7 @@ class MapAsyncServer: sock_file: str | None = ..., info_file: str | None = ..., ) -> None: ... - def start( - self, py_func: Callable[[list[str], Datum], Awaitable[Messages]] - ) -> Awaitable[None]: ... + def start(self, py_func: Callable[[list[str], Datum], Awaitable[Messages]]) -> Awaitable[None]: ... def stop(self) -> None: ... # Simple utility function exposed by the extension diff --git a/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi index ad3d33b3..ec9209af 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/mapstreamer.pyi @@ -35,15 +35,11 @@ class MapStreamAsyncServer: sock_file: str | None = ..., info_file: str | None = ..., ) -> None: ... - def start( - self, py_func: Callable[[list[str], Datum], AsyncIterator[Message]] - ) -> Awaitable[None]: ... + def start(self, py_func: Callable[[list[str], Datum], AsyncIterator[Message]]) -> Awaitable[None]: ... def stop(self) -> None: ... class MapStreamer: - async def handler( - self, keys: list[str], datum: Datum - ) -> AsyncIterator[Message]: ... + async def handler(self, keys: list[str], datum: Datum) -> AsyncIterator[Message]: ... __all__ = [ "Datum", diff --git a/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi index 5b9c6cff..2095e354 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/reducer.pyi @@ -53,10 +53,7 @@ class ReduceAsyncServer: ) -> None: ... def start( self, - py_creator: ( - type[Reducer] - | Callable[[list[str], AsyncIterable[Datum], Metadata], Awaitable[Messages]] - ), + py_creator: (type[Reducer] | Callable[[list[str], AsyncIterable[Datum], Metadata], Awaitable[Messages]]), init_args: tuple | None = ..., ) -> Awaitable[None]: ... def stop(self) -> None: ... diff --git a/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi index 67541004..b3530f95 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/reducestreamer.pyi @@ -55,10 +55,7 @@ class ReduceStreamAsyncServer: def start( self, py_creator: ( - type[ReduceStreamer] - | Callable[ - [list[str], AsyncIterable[Datum], Metadata], AsyncIterator[Message] - ] + type[ReduceStreamer] | Callable[[list[str], AsyncIterable[Datum], Metadata], AsyncIterator[Message]] ), init_args: tuple | None = ..., ) -> Awaitable[None]: ... diff --git a/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi b/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi index 1fc857ff..ead7a315 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/session_reducer.pyi @@ -36,9 +36,7 @@ class SessionReduceAsyncServer: sock_file: str | None = ..., info_file: str | None = ..., ) -> None: ... - def start( - self, py_creator: type[SessionReducer], init_args: tuple | None = ... - ) -> Awaitable[None]: ... + def start(self, py_creator: type[SessionReducer], init_args: tuple | None = ...) -> Awaitable[None]: ... def stop(self) -> None: ... __all__ = [ diff --git a/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi b/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi index bdbf3d4b..14d5cb47 100644 --- a/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi +++ b/packages/pynumaflow-lite/pynumaflow_lite/sinker.pyi @@ -95,9 +95,7 @@ class SinkAsyncServer: sock_file: str | None = ..., info_file: str | None = ..., ) -> None: ... - def start( - self, py_func: Callable[[AsyncIterator[Datum]], Awaitable[Responses]] - ) -> Awaitable[None]: ... + def start(self, py_func: Callable[[AsyncIterator[Datum]], Awaitable[Responses]]) -> Awaitable[None]: ... def stop(self) -> None: ... class Sinker: diff --git a/packages/pynumaflow-lite/tests/_test_utils.py b/packages/pynumaflow-lite/tests/_test_utils.py index a52fe718..62476abe 100644 --- a/packages/pynumaflow-lite/tests/_test_utils.py +++ b/packages/pynumaflow-lite/tests/_test_utils.py @@ -119,6 +119,4 @@ def run_python_server_with_rust_client( except Exception: pass - assert server.returncode == 0, ( - f"Server did not exit cleanly, code={server.returncode}" - ) + assert server.returncode == 0, f"Server did not exit cleanly, code={server.returncode}" diff --git a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py index 2501df44..6c7abb8d 100644 --- a/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py +++ b/packages/pynumaflow-lite/tests/examples/accumulator_stream_sorter.py @@ -128,5 +128,6 @@ async def main(): server.stop() return + if __name__ == "__main__": asyncio.run(main()) diff --git a/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py b/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py index 85314efc..f78cfdfe 100644 --- a/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/batchmap_cat_class.py @@ -7,9 +7,7 @@ class SimpleBatchCat(batchmapper.BatchMapper): - async def handler( - self, batch: AsyncIterator[batchmapper.Datum] - ) -> batchmapper.BatchResponses: + async def handler(self, batch: AsyncIterator[batchmapper.Datum]) -> batchmapper.BatchResponses: responses = batchmapper.BatchResponses() async for d in batch: resp = batchmapper.BatchResponse(d.id) @@ -21,10 +19,9 @@ async def handler( responses.append(resp) return responses + async def start( - f: Callable[ - [AsyncIterator[batchmapper.Datum]], Awaitable[batchmapper.BatchResponses] - ], + f: Callable[[AsyncIterator[batchmapper.Datum]], Awaitable[batchmapper.BatchResponses]], ): sock_file = "/tmp/var/run/numaflow/batchmap.sock" server_info_file = "/tmp/var/run/numaflow/mapper-server-info" diff --git a/packages/pynumaflow-lite/tests/examples/map_cat.py b/packages/pynumaflow-lite/tests/examples/map_cat.py index 1cff0c68..9e04728b 100644 --- a/packages/pynumaflow-lite/tests/examples/map_cat.py +++ b/packages/pynumaflow-lite/tests/examples/map_cat.py @@ -29,13 +29,9 @@ async def async_handler(keys: list[str], payload: mapper.Datum) -> mapper.Messag user_metadata = mapper.UserMetadata() user_metadata.create_group("processing") user_metadata.add_kv("processing", "handler", b"map_cat") - user_metadata.add_kv( - "processing", "msg_length", str(len(payload.value)).encode() - ) + user_metadata.add_kv("processing", "msg_length", str(len(payload.value)).encode()) - messages.append( - mapper.Message(payload.value, keys, user_metadata=user_metadata) - ) + messages.append(mapper.Message(payload.value, keys, user_metadata=user_metadata)) return messages diff --git a/packages/pynumaflow-lite/tests/examples/map_cat_class.py b/packages/pynumaflow-lite/tests/examples/map_cat_class.py index 1970a71c..079beaf2 100644 --- a/packages/pynumaflow-lite/tests/examples/map_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/map_cat_class.py @@ -31,16 +31,13 @@ async def handler(self, keys: list[str], payload: mapper.Datum) -> mapper.Messag user_metadata = mapper.UserMetadata() user_metadata.create_group("processing") user_metadata.add_kv("processing", "handler", b"map_cat_class") - user_metadata.add_kv( - "processing", "msg_length", str(len(payload.value)).encode() - ) + user_metadata.add_kv("processing", "msg_length", str(len(payload.value)).encode()) - messages.append( - mapper.Message(payload.value, keys, user_metadata=user_metadata) - ) + messages.append(mapper.Message(payload.value, keys, user_metadata=user_metadata)) return messages + async def start(f: Callable[[list[str], mapper.Datum], Awaitable[mapper.Messages]]): sock_file = "/tmp/var/run/numaflow/map.sock" server_info_file = "/tmp/var/run/numaflow/mapper-server-info" diff --git a/packages/pynumaflow-lite/tests/examples/mapstream_cat.py b/packages/pynumaflow-lite/tests/examples/mapstream_cat.py index 2d6bc0cf..0fd0bcbb 100644 --- a/packages/pynumaflow-lite/tests/examples/mapstream_cat.py +++ b/packages/pynumaflow-lite/tests/examples/mapstream_cat.py @@ -6,9 +6,7 @@ from pynumaflow_lite.mapstreamer import Message -async def async_handler( - keys: list[str], datum: mapstreamer.Datum -) -> AsyncIterator[Message]: +async def async_handler(keys: list[str], datum: mapstreamer.Datum) -> AsyncIterator[Message]: """ A handler that splits the input datum value into multiple strings by `,` separator and emits them as a stream. diff --git a/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py b/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py index def180d5..c90ffc75 100644 --- a/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py +++ b/packages/pynumaflow-lite/tests/examples/mapstream_cat_class.py @@ -7,9 +7,7 @@ class SimpleStreamCat(mapstreamer.MapStreamer): - async def handler( - self, keys: list[str], datum: mapstreamer.Datum - ) -> AsyncIterator[Message]: + async def handler(self, keys: list[str], datum: mapstreamer.Datum) -> AsyncIterator[Message]: parts = datum.value.decode("utf-8").split(",") if not parts: yield Message.to_drop() @@ -17,6 +15,7 @@ async def handler( for s in parts: yield Message(s.encode(), keys) + async def start(f: Callable[[list[str], mapstreamer.Datum], AsyncIterator[Message]]): sock_file = "/tmp/var/run/numaflow/mapstream.sock" server_info_file = "/tmp/var/run/numaflow/mapper-server-info" diff --git a/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py b/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py index afaa59f9..c9783973 100644 --- a/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py +++ b/packages/pynumaflow-lite/tests/examples/reduce_counter_class.py @@ -19,13 +19,12 @@ async def handler( self.counter = 0 async for _ in datums: self.counter += 1 - msg = ( - f"counter:{self.counter} interval_window_start:{iw.start} interval_window_end:{iw.end}" - ).encode() + msg = (f"counter:{self.counter} interval_window_start:{iw.start} interval_window_end:{iw.end}").encode() out = reducer.Messages() out.append(reducer.Message(msg, keys)) return out + async def start(creator: type, init_args: tuple): sock_file = "/tmp/var/run/numaflow/reduce.sock" server_info_file = "/tmp/var/run/numaflow/reducer-server-info" diff --git a/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py b/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py index 4391fc1f..8f67680c 100644 --- a/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py +++ b/packages/pynumaflow-lite/tests/examples/reduce_counter_func.py @@ -12,14 +12,12 @@ async def reduce_handler( counter = 0 async for _ in datums: counter += 1 - msg = ( - f"counter:{counter} interval_window_start:{interval_window.start} " - f"interval_window_end:{interval_window.end}" - ) + msg = f"counter:{counter} interval_window_start:{interval_window.start} interval_window_end:{interval_window.end}" out = reducer.Messages() out.append(reducer.Message(str.encode(msg), keys=keys)) return out + async def start( handler: Callable[ [list[str], AsyncIterable[reducer.Datum], reducer.Metadata], diff --git a/packages/pynumaflow-lite/tests/examples/reducestream_counter.py b/packages/pynumaflow-lite/tests/examples/reducestream_counter.py index 4177ce60..5988bc86 100644 --- a/packages/pynumaflow-lite/tests/examples/reducestream_counter.py +++ b/packages/pynumaflow-lite/tests/examples/reducestream_counter.py @@ -33,13 +33,10 @@ async def handler( async for _ in datums: self.counter += 1 # Yield a message for each datum (streaming behavior) - msg = ( - f"counter:{self.counter} " - f"interval_window_start:{iw.start} " - f"interval_window_end:{iw.end}" - ).encode() + msg = (f"counter:{self.counter} interval_window_start:{iw.start} interval_window_end:{iw.end}").encode() yield reducestreamer.Message(msg, keys=keys) + async def start(creator: type, init_args: tuple): """Start the reduce stream server.""" sock_file = "/tmp/var/run/numaflow/reducestream.sock" diff --git a/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py b/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py index 43af4688..b0df9ac7 100644 --- a/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py +++ b/packages/pynumaflow-lite/tests/examples/session_reduce_counter_class.py @@ -78,5 +78,6 @@ async def main(): server.stop() return + if __name__ == "__main__": asyncio.run(main()) diff --git a/packages/pynumaflow-lite/tests/examples/sink_log.py b/packages/pynumaflow-lite/tests/examples/sink_log.py index 9cd645d0..723a5e30 100644 --- a/packages/pynumaflow-lite/tests/examples/sink_log.py +++ b/packages/pynumaflow-lite/tests/examples/sink_log.py @@ -43,9 +43,7 @@ async def async_handler( async def start( - f: Callable[ - [collections.abc.AsyncIterator[sinker.Datum]], Awaitable[sinker.Responses] - ], + f: Callable[[collections.abc.AsyncIterator[sinker.Datum]], Awaitable[sinker.Responses]], ): sock_file = "/tmp/var/run/numaflow/sink.sock" server_info_file = "/tmp/var/run/numaflow/sinker-server-info" diff --git a/packages/pynumaflow-lite/tests/examples/source_simple.py b/packages/pynumaflow-lite/tests/examples/source_simple.py index 97968b95..a9f290e0 100644 --- a/packages/pynumaflow-lite/tests/examples/source_simple.py +++ b/packages/pynumaflow-lite/tests/examples/source_simple.py @@ -22,16 +22,12 @@ def __init__(self): self.counter = 0 self.partition_idx = 0 - async def read_handler( - self, datum: sourcer.ReadRequest - ) -> AsyncIterator[sourcer.Message]: + async def read_handler(self, datum: sourcer.ReadRequest) -> AsyncIterator[sourcer.Message]: """ The simple source generates messages with incrementing numbers. Also demonstrates creating user metadata (source is origin, so only user metadata). """ - _LOGGER.info( - f"Read request: num_records={datum.num_records}, timeout_ms={datum.timeout_ms}" - ) + _LOGGER.info(f"Read request: num_records={datum.num_records}, timeout_ms={datum.timeout_ms}") # Generate the requested number of messages for _ in range(datum.num_records): @@ -48,12 +44,8 @@ async def read_handler( user_metadata = sourcer.UserMetadata() user_metadata.create_group("source_info") user_metadata.add_kv("source_info", "source_name", b"simple_source") - user_metadata.add_kv( - "source_info", "message_id", str(self.counter).encode() - ) - user_metadata.add_kv( - "source_info", "partition", str(self.partition_idx).encode() - ) + user_metadata.add_kv("source_info", "message_id", str(self.counter).encode()) + user_metadata.add_kv("source_info", "partition", str(self.partition_idx).encode()) # Create message message = sourcer.Message( @@ -79,9 +71,7 @@ async def ack_handler(self, request: sourcer.AckRequest) -> None: """ _LOGGER.info(f"Acknowledging {len(request.offsets)} offsets") for offset in request.offsets: - _LOGGER.debug( - f"Acked offset: {offset.offset.decode('utf-8')}, partition: {offset.partition_id}" - ) + _LOGGER.debug(f"Acked offset: {offset.offset.decode('utf-8')}, partition: {offset.partition_id}") async def nack_handler(self, request: sourcer.NackRequest) -> None: """ @@ -89,9 +79,7 @@ async def nack_handler(self, request: sourcer.NackRequest) -> None: """ _LOGGER.info(f"Negatively acknowledging {len(request.offsets)} offsets") for offset in request.offsets: - _LOGGER.warning( - f"Nacked offset: {offset.offset.decode('utf-8')}, partition: {offset.partition_id}" - ) + _LOGGER.warning(f"Nacked offset: {offset.offset.decode('utf-8')}, partition: {offset.partition_id}") async def pending_handler(self) -> sourcer.PendingResponse: """ diff --git a/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py b/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py index 8302fe33..fb238f38 100644 --- a/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py +++ b/packages/pynumaflow-lite/tests/examples/sourcetransform_event_filter.py @@ -21,9 +21,7 @@ class EventFilter(sourcetransformer.SourceTransformer): Also demonstrates reading and creating metadata. """ - async def handler( - self, keys: list[str], datum: sourcetransformer.Datum - ) -> sourcetransformer.Messages: + async def handler(self, keys: list[str], datum: sourcetransformer.Datum) -> sourcetransformer.Messages: val = datum.value event_time = datum.event_time messages = sourcetransformer.Messages() @@ -46,17 +44,13 @@ async def handler( print(f"Got event time: {event_time}, it is before 2022, so dropping") messages.append(sourcetransformer.Message.message_to_drop(event_time)) elif event_time < january_first_2023: - print( - f"Got event time: {event_time}, it is within year 2022, so forwarding to within_year_2022" - ) + print(f"Got event time: {event_time}, it is within year 2022, so forwarding to within_year_2022") # Create user metadata for the outgoing message user_metadata = sourcetransformer.UserMetadata() user_metadata.create_group("filter_info") user_metadata.add_kv("filter_info", "filter_result", b"within_year_2022") - user_metadata.add_kv( - "filter_info", "original_event_time", str(event_time).encode() - ) + user_metadata.add_kv("filter_info", "original_event_time", str(event_time).encode()) messages.append( sourcetransformer.Message( @@ -68,17 +62,13 @@ async def handler( ) ) else: - print( - f"Got event time: {event_time}, it is after year 2022, so forwarding to after_year_2022" - ) + print(f"Got event time: {event_time}, it is after year 2022, so forwarding to after_year_2022") # Create user metadata for the outgoing message user_metadata = sourcetransformer.UserMetadata() user_metadata.create_group("filter_info") user_metadata.add_kv("filter_info", "filter_result", b"after_year_2022") - user_metadata.add_kv( - "filter_info", "original_event_time", str(event_time).encode() - ) + user_metadata.add_kv("filter_info", "original_event_time", str(event_time).encode()) messages.append( sourcetransformer.Message( @@ -92,6 +82,7 @@ async def handler( return messages + async def start( f: Callable[[list[str], sourcetransformer.Datum], sourcetransformer.Messages], ): From 41a09562b2a6b295b0c933755103379e382156b0 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 17:45:24 +0530 Subject: [PATCH 09/15] CI Signed-off-by: Sreekanth --- .github/workflows/pynumaflow-lite.yml | 189 ++++++++++++++++++++++++++ packages/pynumaflow-lite/Makefile | 1 + 2 files changed, 190 insertions(+) create mode 100644 .github/workflows/pynumaflow-lite.yml diff --git a/.github/workflows/pynumaflow-lite.yml b/.github/workflows/pynumaflow-lite.yml new file mode 100644 index 00000000..1aa77b5d --- /dev/null +++ b/.github/workflows/pynumaflow-lite.yml @@ -0,0 +1,189 @@ +name: pynumaflow-lite + +on: + push: + branches: ["main", "release/*"] + paths: + - "packages/pynumaflow-lite/**" + - ".github/workflows/pynumaflow-lite.yml" + pull_request: + branches: ["main", "release/*"] + paths: + - "packages/pynumaflow-lite/**" + - ".github/workflows/pynumaflow-lite.yml" + +permissions: + contents: read + +jobs: + lint: + name: Format and lint + runs-on: ubuntu-24.04 + defaults: + run: + working-directory: packages/pynumaflow-lite + + steps: + - uses: actions/checkout@v7 + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.10" + + - name: Install uv + uses: astral-sh/setup-uv@v8 + with: + python-version: "3.10" + working-directory: packages/pynumaflow-lite + + - name: Set up Rust + run: | + rustup toolchain install stable --profile minimal --component clippy --component rustfmt + rustup default stable + + - name: Install dependencies + run: uv sync --group dev + + - name: Check Rust formatting + run: cargo fmt --all --check + + - name: Check Python formatting + run: uv run ruff format --check pynumaflow_lite/ tests/ manifests/ + + - name: Ruff lint + run: uv run ruff check . + + - name: Clippy + run: cargo clippy --workspace --all-targets --all-features -- -D warnings -A clippy::module_inception + + test: + name: Test ${{ matrix.platform.artifact }} + runs-on: ${{ matrix.platform.os }} + + strategy: + fail-fast: false + matrix: + platform: + - os: ubuntu-24.04 + artifact: linux-x86_64 + - os: ubuntu-24.04-arm + artifact: linux-aarch64 + - os: macos-15-intel + artifact: macos-x86_64 + - os: macos-15 + artifact: macos-aarch64 + - os: windows-2025 + artifact: windows-x86_64 + + defaults: + run: + working-directory: packages/pynumaflow-lite + + steps: + - uses: actions/checkout@v7 + + - name: Install uv + uses: astral-sh/setup-uv@v8 + with: + working-directory: packages/pynumaflow-lite + + - name: Set up Rust + run: | + rustup toolchain install stable --profile minimal + rustup default stable + + - name: Run tests for Python versions + if: runner.os != 'Windows' + shell: bash + run: | + set -euo pipefail + + for python_version in 3.10 3.11 3.12 3.13 3.14; do + echo "::group::Python ${python_version}" + uv python install "${python_version}" + uv sync --group dev --python "${python_version}" + uv pip install "maturin>=1.14,<2.0" + uv run maturin develop + uv run pytest -v + export PYTHONHOME="$(uv run python -c 'import sys; print(sys.base_prefix)')" + cargo test + unset PYTHONHOME + echo "::endgroup::" + done + + - name: Run tests for Python versions + if: runner.os == 'Windows' + shell: pwsh + run: | + $ErrorActionPreference = "Stop" + $versions = @("3.10", "3.11", "3.12", "3.13", "3.14") + + foreach ($pythonVersion in $versions) { + Write-Output "::group::Python $pythonVersion" + try { + uv python install $pythonVersion + uv sync --group dev --python $pythonVersion + uv pip install "maturin>=1.14,<2.0" + uv run maturin develop + uv run pytest -v + $env:PYTHONHOME = uv run python -c "import sys; print(sys.base_prefix)" + cargo test + } finally { + Remove-Item Env:PYTHONHOME -ErrorAction SilentlyContinue + Write-Output "::endgroup::" + } + } + + build-wheels: + name: Build wheel ${{ matrix.platform.artifact }} py${{ matrix.python-version }} + runs-on: ${{ matrix.platform.os }} + + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + platform: + - os: ubuntu-24.04 + target: x86_64-unknown-linux-gnu + artifact: linux-x86_64 + manylinux: "2014" + linux: true + - os: macos-15 + target: aarch64-apple-darwin + artifact: macos-aarch64 + manylinux: "off" + linux: false + - os: windows-2025 + target: x86_64-pc-windows-msvc + artifact: windows-x86_64 + manylinux: "off" + linux: false + + steps: + - uses: actions/checkout@v7 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + + - name: Build wheel + uses: PyO3/maturin-action@v1 + with: + command: build + working-directory: packages/pynumaflow-lite + target: ${{ matrix.platform.target }} + manylinux: ${{ matrix.platform.manylinux }} + args: >- + --release + --out dist + -i ${{ matrix.platform.linux && format('python{0}', matrix.python-version) || 'python' }} + + - name: Upload wheel artifact + uses: actions/upload-artifact@v7 + with: + name: pynumaflow-lite-${{ matrix.platform.artifact }}-py${{ matrix.python-version }} + path: packages/pynumaflow-lite/dist/*.whl + if-no-files-found: error + compression-level: 0 diff --git a/packages/pynumaflow-lite/Makefile b/packages/pynumaflow-lite/Makefile index f02e89de..d33d32c5 100644 --- a/packages/pynumaflow-lite/Makefile +++ b/packages/pynumaflow-lite/Makefile @@ -59,6 +59,7 @@ lint: test-fmt clippy py-lint .PHONY: test-fmt test-fmt: cargo fmt --all --check + uv run ruff format --check pynumaflow_lite/ tests/ manifests/ .PHONY: clippy clippy: From eaf308fe43fb6f3df669c955b68f8bb9bea57f97 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 20:57:13 +0530 Subject: [PATCH 10/15] Fix CI Signed-off-by: Sreekanth --- .github/workflows/pynumaflow-lite.yml | 110 +++++++++++--------------- 1 file changed, 48 insertions(+), 62 deletions(-) diff --git a/.github/workflows/pynumaflow-lite.yml b/.github/workflows/pynumaflow-lite.yml index 1aa77b5d..6a88f26b 100644 --- a/.github/workflows/pynumaflow-lite.yml +++ b/.github/workflows/pynumaflow-lite.yml @@ -17,7 +17,7 @@ permissions: jobs: lint: - name: Format and lint + name: Format, lint, and test runs-on: ubuntu-24.04 defaults: run: @@ -32,7 +32,7 @@ jobs: python-version: "3.10" - name: Install uv - uses: astral-sh/setup-uv@v8 + uses: astral-sh/setup-uv@v8.1.0 with: python-version: "3.10" working-directory: packages/pynumaflow-lite @@ -57,44 +57,7 @@ jobs: - name: Clippy run: cargo clippy --workspace --all-targets --all-features -- -D warnings -A clippy::module_inception - test: - name: Test ${{ matrix.platform.artifact }} - runs-on: ${{ matrix.platform.os }} - - strategy: - fail-fast: false - matrix: - platform: - - os: ubuntu-24.04 - artifact: linux-x86_64 - - os: ubuntu-24.04-arm - artifact: linux-aarch64 - - os: macos-15-intel - artifact: macos-x86_64 - - os: macos-15 - artifact: macos-aarch64 - - os: windows-2025 - artifact: windows-x86_64 - - defaults: - run: - working-directory: packages/pynumaflow-lite - - steps: - - uses: actions/checkout@v7 - - - name: Install uv - uses: astral-sh/setup-uv@v8 - with: - working-directory: packages/pynumaflow-lite - - - name: Set up Rust - run: | - rustup toolchain install stable --profile minimal - rustup default stable - - name: Run tests for Python versions - if: runner.os != 'Windows' shell: bash run: | set -euo pipefail @@ -112,32 +75,13 @@ jobs: echo "::endgroup::" done - - name: Run tests for Python versions - if: runner.os == 'Windows' - shell: pwsh - run: | - $ErrorActionPreference = "Stop" - $versions = @("3.10", "3.11", "3.12", "3.13", "3.14") - - foreach ($pythonVersion in $versions) { - Write-Output "::group::Python $pythonVersion" - try { - uv python install $pythonVersion - uv sync --group dev --python $pythonVersion - uv pip install "maturin>=1.14,<2.0" - uv run maturin develop - uv run pytest -v - $env:PYTHONHOME = uv run python -c "import sys; print(sys.base_prefix)" - cargo test - } finally { - Remove-Item Env:PYTHONHOME -ErrorAction SilentlyContinue - Write-Output "::endgroup::" - } - } - build-wheels: name: Build wheel ${{ matrix.platform.artifact }} py${{ matrix.python-version }} + needs: lint runs-on: ${{ matrix.platform.os }} + defaults: + run: + working-directory: packages/pynumaflow-lite strategy: fail-fast: false @@ -168,6 +112,48 @@ jobs: with: python-version: ${{ matrix.python-version }} + - name: Install uv + uses: astral-sh/setup-uv@v8.1.0 + with: + python-version: ${{ matrix.python-version }} + working-directory: packages/pynumaflow-lite + + - name: Set up Rust + run: | + rustup toolchain install stable --profile minimal + rustup default stable + + - name: Install dependencies + run: | + uv sync --group dev --python ${{ matrix.python-version }} + uv pip install "maturin>=1.14,<2.0" + + - name: Install extension + run: uv run maturin develop + + - name: Run Python tests + run: uv run pytest -v + + - name: Run Rust tests + if: runner.os != 'Windows' + shell: bash + run: | + set -euo pipefail + export PYTHONHOME="$(uv run python -c 'import sys; print(sys.base_prefix)')" + cargo test + + - name: Run Rust tests + if: runner.os == 'Windows' + shell: pwsh + run: | + $ErrorActionPreference = "Stop" + $env:PYTHONHOME = uv run python -c "import sys; print(sys.base_prefix)" + try { + cargo test + } finally { + Remove-Item Env:PYTHONHOME -ErrorAction SilentlyContinue + } + - name: Build wheel uses: PyO3/maturin-action@v1 with: From 8a6d6eeda7e45fb68b167be7c4a1d0fab65badcd Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 21:11:10 +0530 Subject: [PATCH 11/15] Fix CI Signed-off-by: Sreekanth --- .github/workflows/pynumaflow-lite.yml | 8 ++++++++ packages/pynumaflow-lite/tests/_test_utils.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/.github/workflows/pynumaflow-lite.yml b/.github/workflows/pynumaflow-lite.yml index 6a88f26b..bb86e9f5 100644 --- a/.github/workflows/pynumaflow-lite.yml +++ b/.github/workflows/pynumaflow-lite.yml @@ -132,6 +132,7 @@ jobs: run: uv run maturin develop - name: Run Python tests + if: runner.os != 'Windows' run: uv run pytest -v - name: Run Rust tests @@ -154,6 +155,13 @@ jobs: Remove-Item Env:PYTHONHOME -ErrorAction SilentlyContinue } + - name: Run Windows smoke test + if: runner.os == 'Windows' + shell: pwsh + run: | + $ErrorActionPreference = "Stop" + uv run python -c "import pynumaflow_lite; from pynumaflow_lite import mapper; print('pynumaflow-lite import ok')" + - name: Build wheel uses: PyO3/maturin-action@v1 with: diff --git a/packages/pynumaflow-lite/tests/_test_utils.py b/packages/pynumaflow-lite/tests/_test_utils.py index 62476abe..9763afbc 100644 --- a/packages/pynumaflow-lite/tests/_test_utils.py +++ b/packages/pynumaflow-lite/tests/_test_utils.py @@ -48,6 +48,8 @@ def run_python_server_with_rust_client( server_shutdown_timeout: Timeout for server graceful shutdown """ # Ensure clean socket state + sock_path.parent.mkdir(parents=True, exist_ok=True) + server_info_path.parent.mkdir(parents=True, exist_ok=True) for p in [sock_path, server_info_path]: if p.exists(): p.unlink() From c2ef072e4e248f5d6ba40e05e4b422d84f0f87c7 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Fri, 26 Jun 2026 21:26:22 +0530 Subject: [PATCH 12/15] Fix CI Signed-off-by: Sreekanth --- .github/workflows/pynumaflow-lite.yml | 30 ++++++++------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/.github/workflows/pynumaflow-lite.yml b/.github/workflows/pynumaflow-lite.yml index bb86e9f5..762ccb6e 100644 --- a/.github/workflows/pynumaflow-lite.yml +++ b/.github/workflows/pynumaflow-lite.yml @@ -66,10 +66,10 @@ jobs: echo "::group::Python ${python_version}" uv python install "${python_version}" uv sync --group dev --python "${python_version}" - uv pip install "maturin>=1.14,<2.0" - uv run maturin develop - uv run pytest -v - export PYTHONHOME="$(uv run python -c 'import sys; print(sys.base_prefix)')" + uv pip install --python "${python_version}" "maturin>=1.14,<2.0" + uv run --python "${python_version}" maturin develop + uv run --python "${python_version}" pytest -v + export PYTHONHOME="$(uv run --python "${python_version}" python -c 'import sys; print(sys.base_prefix)')" cargo test unset PYTHONHOME echo "::endgroup::" @@ -126,41 +126,29 @@ jobs: - name: Install dependencies run: | uv sync --group dev --python ${{ matrix.python-version }} - uv pip install "maturin>=1.14,<2.0" + uv pip install --python ${{ matrix.python-version }} "maturin>=1.14,<2.0" - name: Install extension - run: uv run maturin develop + run: uv run --python ${{ matrix.python-version }} maturin develop - name: Run Python tests if: runner.os != 'Windows' - run: uv run pytest -v + run: uv run --python ${{ matrix.python-version }} pytest -v - name: Run Rust tests if: runner.os != 'Windows' shell: bash run: | set -euo pipefail - export PYTHONHOME="$(uv run python -c 'import sys; print(sys.base_prefix)')" + export PYTHONHOME="$(uv run --python ${{ matrix.python-version }} python -c 'import sys; print(sys.base_prefix)')" cargo test - - name: Run Rust tests - if: runner.os == 'Windows' - shell: pwsh - run: | - $ErrorActionPreference = "Stop" - $env:PYTHONHOME = uv run python -c "import sys; print(sys.base_prefix)" - try { - cargo test - } finally { - Remove-Item Env:PYTHONHOME -ErrorAction SilentlyContinue - } - - name: Run Windows smoke test if: runner.os == 'Windows' shell: pwsh run: | $ErrorActionPreference = "Stop" - uv run python -c "import pynumaflow_lite; from pynumaflow_lite import mapper; print('pynumaflow-lite import ok')" + uv run --python ${{ matrix.python-version }} python -c "import pynumaflow_lite; from pynumaflow_lite import mapper; print('pynumaflow-lite import ok')" - name: Build wheel uses: PyO3/maturin-action@v1 From f26a6657560dbe8a7b2a2299b88d0aea706d6637 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Sat, 27 Jun 2026 06:16:48 +0530 Subject: [PATCH 13/15] Fix CI Signed-off-by: Sreekanth --- .github/workflows/pynumaflow-lite.yml | 86 +++++++++++++------------ packages/pynumaflow-lite/pyproject.toml | 1 + 2 files changed, 47 insertions(+), 40 deletions(-) diff --git a/.github/workflows/pynumaflow-lite.yml b/.github/workflows/pynumaflow-lite.yml index 762ccb6e..bdf80d52 100644 --- a/.github/workflows/pynumaflow-lite.yml +++ b/.github/workflows/pynumaflow-lite.yml @@ -17,7 +17,7 @@ permissions: jobs: lint: - name: Format, lint, and test + name: Format and lint runs-on: ubuntu-24.04 defaults: run: @@ -57,6 +57,38 @@ jobs: - name: Clippy run: cargo clippy --workspace --all-targets --all-features -- -D warnings -A clippy::module_inception + test: + name: Test ${{ matrix.platform.artifact }} + needs: lint + runs-on: ${{ matrix.platform.os }} + defaults: + run: + working-directory: packages/pynumaflow-lite + + strategy: + fail-fast: false + matrix: + platform: + - os: ubuntu-24.04 + artifact: linux-x86_64 + - os: macos-15 + artifact: macos-aarch64 + - os: windows-2025 + artifact: windows-x86_64 + + steps: + - uses: actions/checkout@v7 + + - name: Install uv + uses: astral-sh/setup-uv@v8.1.0 + with: + working-directory: packages/pynumaflow-lite + + - name: Set up Rust + run: | + rustup toolchain install stable --profile minimal + rustup default stable + - name: Run tests for Python versions shell: bash run: | @@ -65,19 +97,26 @@ jobs: for python_version in 3.10 3.11 3.12 3.13 3.14; do echo "::group::Python ${python_version}" uv python install "${python_version}" + export UV_PYTHON="${python_version}" uv sync --group dev --python "${python_version}" - uv pip install --python "${python_version}" "maturin>=1.14,<2.0" uv run --python "${python_version}" maturin develop - uv run --python "${python_version}" pytest -v - export PYTHONHOME="$(uv run --python "${python_version}" python -c 'import sys; print(sys.base_prefix)')" - cargo test - unset PYTHONHOME + + if [[ "${RUNNER_OS}" == "Windows" ]]; then + uv run --python "${python_version}" python -c "import pynumaflow_lite; from pynumaflow_lite import mapper; print('pynumaflow-lite import ok')" + else + uv run --python "${python_version}" pytest -v + export PYTHONHOME="$(uv run --python "${python_version}" python -c 'import sys; print(sys.base_prefix)')" + cargo test + unset PYTHONHOME + fi + + unset UV_PYTHON echo "::endgroup::" done build-wheels: name: Build wheel ${{ matrix.platform.artifact }} py${{ matrix.python-version }} - needs: lint + needs: test runs-on: ${{ matrix.platform.os }} defaults: run: @@ -112,44 +151,11 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install uv - uses: astral-sh/setup-uv@v8.1.0 - with: - python-version: ${{ matrix.python-version }} - working-directory: packages/pynumaflow-lite - - name: Set up Rust run: | rustup toolchain install stable --profile minimal rustup default stable - - name: Install dependencies - run: | - uv sync --group dev --python ${{ matrix.python-version }} - uv pip install --python ${{ matrix.python-version }} "maturin>=1.14,<2.0" - - - name: Install extension - run: uv run --python ${{ matrix.python-version }} maturin develop - - - name: Run Python tests - if: runner.os != 'Windows' - run: uv run --python ${{ matrix.python-version }} pytest -v - - - name: Run Rust tests - if: runner.os != 'Windows' - shell: bash - run: | - set -euo pipefail - export PYTHONHOME="$(uv run --python ${{ matrix.python-version }} python -c 'import sys; print(sys.base_prefix)')" - cargo test - - - name: Run Windows smoke test - if: runner.os == 'Windows' - shell: pwsh - run: | - $ErrorActionPreference = "Stop" - uv run --python ${{ matrix.python-version }} python -c "import pynumaflow_lite; from pynumaflow_lite import mapper; print('pynumaflow-lite import ok')" - - name: Build wheel uses: PyO3/maturin-action@v1 with: diff --git a/packages/pynumaflow-lite/pyproject.toml b/packages/pynumaflow-lite/pyproject.toml index c83d6c55..883dce5c 100644 --- a/packages/pynumaflow-lite/pyproject.toml +++ b/packages/pynumaflow-lite/pyproject.toml @@ -59,4 +59,5 @@ docstring-code-format = true dev = [ "pytest>=9.1.1", "ruff>=0.15.20", + "maturin>=1.14,<2.0", ] From 5d5b256187a1b60bffe9b744944c2b0c5fc20fe6 Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Sat, 27 Jun 2026 06:41:10 +0530 Subject: [PATCH 14/15] Fix CI Signed-off-by: Sreekanth --- .github/workflows/pynumaflow-lite.yml | 28 +++++++++++++-------------- packages/pynumaflow-lite/uv.lock | 26 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/.github/workflows/pynumaflow-lite.yml b/.github/workflows/pynumaflow-lite.yml index bdf80d52..e92fca7e 100644 --- a/.github/workflows/pynumaflow-lite.yml +++ b/.github/workflows/pynumaflow-lite.yml @@ -73,8 +73,6 @@ jobs: artifact: linux-x86_64 - os: macos-15 artifact: macos-aarch64 - - os: windows-2025 - artifact: windows-x86_64 steps: - uses: actions/checkout@v7 @@ -101,14 +99,19 @@ jobs: uv sync --group dev --python "${python_version}" uv run --python "${python_version}" maturin develop - if [[ "${RUNNER_OS}" == "Windows" ]]; then - uv run --python "${python_version}" python -c "import pynumaflow_lite; from pynumaflow_lite import mapper; print('pynumaflow-lite import ok')" - else - uv run --python "${python_version}" pytest -v - export PYTHONHOME="$(uv run --python "${python_version}" python -c 'import sys; print(sys.base_prefix)')" - cargo test - unset PYTHONHOME - fi + uv run --python "${python_version}" pytest -v + + # cargo test embeds a Python interpreter via pyo3 (Python::initialize). + # pyo3's build script must link against the same uv-managed interpreter + # (PYO3_PYTHON), and the embedded interpreter must locate its stdlib at + # runtime (PYTHONHOME = that interpreter's base_prefix). Pinning only one + # of the two leaves the linked libpython and the stdlib mismatched, which + # surfaces as "init_fs_encoding: No module named 'encodings'". + python_bin="$(uv run --python "${python_version}" python -c 'import sys; print(sys.executable)')" + export PYO3_PYTHON="${python_bin}" + export PYTHONHOME="$("${python_bin}" -c 'import sys; print(sys.base_prefix)')" + cargo test + unset PYO3_PYTHON PYTHONHOME unset UV_PYTHON echo "::endgroup::" @@ -137,11 +140,6 @@ jobs: artifact: macos-aarch64 manylinux: "off" linux: false - - os: windows-2025 - target: x86_64-pc-windows-msvc - artifact: windows-x86_64 - manylinux: "off" - linux: false steps: - uses: actions/checkout@v7 diff --git a/packages/pynumaflow-lite/uv.lock b/packages/pynumaflow-lite/uv.lock index 3fac4534..3341e7bd 100644 --- a/packages/pynumaflow-lite/uv.lock +++ b/packages/pynumaflow-lite/uv.lock @@ -32,6 +32,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] +[[package]] +name = "maturin" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/b3/addd877f871fb1860d46d3a4f206ecb10b946c85846805e6367631926fd3/maturin-1.14.1.tar.gz", hash = "sha256:9d6577a62cd08e0ceba7a0db06fb098e0c9b1b3429bad747a4f3a18215a1b3df", size = 369637, upload-time = "2026-06-19T05:19:49.774Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/f0/97c5a5bd9c71653a066c0976a484eaaae50b9369557838a4176b7b0bdaa5/maturin-1.14.1-py3-none-linux_armv6l.whl", hash = "sha256:522292398945442cdafa9daeb2271b2340fbde57027b818f923f88eab04174f8", size = 10207496, upload-time = "2026-06-19T05:19:09.321Z" }, + { url = "https://files.pythonhosted.org/packages/fe/83/294bca639b0e052f1e2f65199b3db258780c7d4e31408b934c9c974a1379/maturin-1.14.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ffe5ad71f21d1e6603c4dd75f7fee34adf5ed5ebcebb692886549888ebb329ed", size = 19680113, upload-time = "2026-06-19T05:19:13.43Z" }, + { url = "https://files.pythonhosted.org/packages/43/b6/79c881410a3b1c187f7eb3d407aecae646c6a4433d630d72200359015e83/maturin-1.14.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f3306078070c1508fd715b9116070cbcaff5959024272a9f1e6f5cb29768b86c", size = 10169205, upload-time = "2026-06-19T05:19:16.615Z" }, + { url = "https://files.pythonhosted.org/packages/93/9d/44b6f26dcb7f7a04c5501ac2dbb6ca1490150682baa525ca5860504f9eab/maturin-1.14.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.musllinux_1_1_i686.whl", hash = "sha256:cd457cd88961156e26379e1155bd287cc0ec1c8b2f1582b0660fb31b87c8842d", size = 10188098, upload-time = "2026-06-19T05:19:19.736Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bd/9c0d5d6983905ce2c9edaa073a7e89355a9cf7f396988e05d32f1c37785d/maturin-1.14.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl", hash = "sha256:dfc54ae32e6fcb18302193ab9a30b0b25eefffba994ae13238974805533ef75e", size = 10627576, upload-time = "2026-06-19T05:19:22.713Z" }, + { url = "https://files.pythonhosted.org/packages/e5/33/b096412bd6a7cb399652b260666f901adf88a687181a6dbd6a3f89f0a94e/maturin-1.14.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:a131d912b5267e640bc96d70f4914e10590aed64082ec9abacba7cea52004224", size = 10085181, upload-time = "2026-06-19T05:19:25.69Z" }, + { url = "https://files.pythonhosted.org/packages/56/8d/08c3bf469c38a23c9e6c877e338193001eb604d010fedc08341974e38528/maturin-1.14.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:be18fc568fb76884c0205456336892a75105ec398e6b667cd777c6268bd06d69", size = 10026363, upload-time = "2026-06-19T05:19:28.904Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/c4d1a92839f8745ab4aab988a7db884a79d6d710bd3b286fcf9316dece1a/maturin-1.14.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.musllinux_1_1_ppc64le.whl", hash = "sha256:994a0c8ba3ad8a92b3a9ee1b02645d200d610216b15cff5102b0fe65e8e08666", size = 13321347, upload-time = "2026-06-19T05:19:32.411Z" }, + { url = "https://files.pythonhosted.org/packages/b3/fa/170f04624d03fd07d2a8b1b67de83a127af93aef9eaa425839553347297b/maturin-1.14.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be80866363e605d137991b491a741a84cde9ae350183c4c85f49690ca9aaaa65", size = 10877609, upload-time = "2026-06-19T05:19:35.448Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/1ae2e1d0ded282bf2c55ac13f0811d87deb425e200ae64a15785675dede9/maturin-1.14.1-py3-none-manylinux_2_31_riscv64.musllinux_1_1_riscv64.whl", hash = "sha256:5282dffd4b539d2be245f4e5b1a5ab6bc1033b58f4a4872f5833f9d43c954aa4", size = 10417316, upload-time = "2026-06-19T05:19:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/fb/27/bf677183920718da49cd7982d6a3ffc440aad8919329f571d189f81b7bdf/maturin-1.14.1-py3-none-win32.whl", hash = "sha256:1a04de0a20188f95c721b5702eed18140bdcccb28c386797093eca3f62f4d4e0", size = 8931293, upload-time = "2026-06-19T05:19:41.183Z" }, + { url = "https://files.pythonhosted.org/packages/63/4b/585adeb9167b08d3cdff0032a938b0e72655c92003df4f52c3f696a1bcc2/maturin-1.14.1-py3-none-win_amd64.whl", hash = "sha256:3c9f94640ecc4895e94abaf834a0684430032c865b2748a36c12461fd9252fdd", size = 10314067, upload-time = "2026-06-19T05:19:44.389Z" }, + { url = "https://files.pythonhosted.org/packages/51/d4/dac8c0720ae246be1700afb6fbdbbea20fe35b13f6570b2f70faa005df77/maturin-1.14.1-py3-none-win_arm64.whl", hash = "sha256:15cea8fcb3ba47dd636f50092bb34baea8b04ac777392f23e6bf8a9a61efb894", size = 9718943, upload-time = "2026-06-19T05:19:47.49Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -65,6 +89,7 @@ source = { editable = "." } [package.dev-dependencies] dev = [ + { name = "maturin" }, { name = "pytest" }, { name = "ruff" }, ] @@ -73,6 +98,7 @@ dev = [ [package.metadata.requires-dev] dev = [ + { name = "maturin", specifier = ">=1.14,<2.0" }, { name = "pytest", specifier = ">=9.1.1" }, { name = "ruff", specifier = ">=0.15.20" }, ] From a39c150cdb49e7c3edea695de5e0f9d7dd5b998b Mon Sep 17 00:00:00 2001 From: Sreekanth Date: Sat, 27 Jun 2026 06:56:30 +0530 Subject: [PATCH 15/15] Fix CI Signed-off-by: Sreekanth --- .github/workflows/pynumaflow-lite.yml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pynumaflow-lite.yml b/.github/workflows/pynumaflow-lite.yml index e92fca7e..497071e4 100644 --- a/.github/workflows/pynumaflow-lite.yml +++ b/.github/workflows/pynumaflow-lite.yml @@ -101,17 +101,23 @@ jobs: uv run --python "${python_version}" pytest -v - # cargo test embeds a Python interpreter via pyo3 (Python::initialize). - # pyo3's build script must link against the same uv-managed interpreter - # (PYO3_PYTHON), and the embedded interpreter must locate its stdlib at - # runtime (PYTHONHOME = that interpreter's base_prefix). Pinning only one - # of the two leaves the linked libpython and the stdlib mismatched, which - # surfaces as "init_fs_encoding: No module named 'encodings'". + # cargo test embeds a Python interpreter via pyo3 (Python::initialize), + # which requires pinning the uv-managed interpreter at three layers: + # - PYO3_PYTHON: the interpreter pyo3's build script links against. + # - PYTHONHOME: where the embedded interpreter finds its stdlib at + # runtime; mismatch surfaces as "No module named 'encodings'". + # - LD_LIBRARY_PATH: where the dynamic loader finds libpython at load + # time. On Linux the test binary links libpython3.x.so, which lives + # under the interpreter's lib dir and is not on the default search + # path; missing it surfaces as "error while loading shared libraries: + # libpython3.x.so". (Harmless on macOS, which resolves differently.) python_bin="$(uv run --python "${python_version}" python -c 'import sys; print(sys.executable)')" export PYO3_PYTHON="${python_bin}" export PYTHONHOME="$("${python_bin}" -c 'import sys; print(sys.base_prefix)')" + python_libdir="$("${python_bin}" -c 'import sysconfig; print(sysconfig.get_config_var("LIBDIR"))')" + export LD_LIBRARY_PATH="${python_libdir}${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}" cargo test - unset PYO3_PYTHON PYTHONHOME + unset PYO3_PYTHON PYTHONHOME LD_LIBRARY_PATH unset UV_PYTHON echo "::endgroup::"