diff --git a/ingestor/adapters/grpc_server.py b/ingestor/adapters/grpc_server.py index 05cf6e8..ca2d5c2 100644 --- a/ingestor/adapters/grpc_server.py +++ b/ingestor/adapters/grpc_server.py @@ -51,7 +51,7 @@ class GrpcServer: self.logger = logger self.port = port self.slot_lookup = slot_lookup - self.server = None + self.server: grpc.aio.Server | None = None async def start(self) -> None: self.server = grpc.aio.server() diff --git a/ingestor/adapters/nats_consumer.py b/ingestor/adapters/nats_consumer.py index 189220d..97ed2fe 100644 --- a/ingestor/adapters/nats_consumer.py +++ b/ingestor/adapters/nats_consumer.py @@ -9,6 +9,8 @@ here. No reconnect logic — nats-py handles reconnection internally. import json import nats +from nats.aio.client import Client +from nats.aio.subscription import Subscription from sientia_do.observability.logger import Logger from ingestor.engines.write import WriteEngine @@ -28,8 +30,8 @@ class NatsWriteConsumer: self.logger = logger self.subject = subject self.queue = queue - self.nc = None - self.sub = None + self.nc: Client | None = None + self.sub: Subscription | None = None async def start(self) -> None: self.nc = await nats.connect(servers=self.nats_url) diff --git a/ingestor/engines/active_read.py b/ingestor/engines/active_read.py index f42b4f7..6aedf7e 100644 --- a/ingestor/engines/active_read.py +++ b/ingestor/engines/active_read.py @@ -75,7 +75,7 @@ class ActiveReadEngine(SientiaMonitoring): await self._record_read_lag(source_ts, tags) source_str = self._format_ts(source_ts) persisted = bool(names) - if persisted: + if names: await self.sink.publish_reading( tag=addr, value=value, timestamp=source_str, names=names ) diff --git a/pyproject.toml b/pyproject.toml index 9b58646..fd3e168 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -81,6 +81,9 @@ warn_unused_ignores = false warn_no_return = true strict_equality = true ignore_missing_imports = true +# Generated protoc/grpcio-tools output - not a checking target, dynamic attrs +# mypy can't see (message classes built at runtime from DESCRIPTOR). +exclude = ["^ingestor/proto/"] # Ignore missing imports for external packages [[tool.mypy.overrides]] @@ -107,6 +110,14 @@ ignore_missing_imports = true module = "pandas.*" ignore_missing_imports = true +# Generated protoc/grpcio-tools output - not hand-maintained, dynamic attrs +# mypy can't see (message classes built at runtime from DESCRIPTOR). Skip +# following it entirely so importers see Any instead of false attr-defined errors. +[[tool.mypy.overrides]] +module = "ingestor.proto.*" +ignore_errors = true +follow_imports = "skip" + [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"]