diff --git a/Dockerfile b/Dockerfile index ed87057..1083944 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ WORKDIR /app COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv COPY pyproject.toml uv.lock* ./ -RUN uv sync --no-dev +RUN uv sync --frozen --no-dev COPY src/ ./src/ diff --git a/pyproject.toml b/pyproject.toml index cdbe6e4..1e725ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,8 +16,8 @@ build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src"] -[tool.uv] -dev-dependencies = [ +[dependency-groups] +dev = [ "pytest>=8.0", "pytest-asyncio>=0.23", ] diff --git a/src/main.py b/src/main.py index c611e93..3b54588 100644 --- a/src/main.py +++ b/src/main.py @@ -34,7 +34,7 @@ logging.basicConfig( logger = logging.getLogger(__name__) -async def main() -> None: +async def setup() -> tuple: # 1. Конфиг из окружения bot_jid = os.environ["BOT_JID"] bot_password = os.environ["BOT_PASSWORD"] @@ -106,11 +106,27 @@ async def main() -> None: # 9. Scheduled адаптер checker = NewsChecker(fetch_and_publish) - # 10. Запуск + return connection, checker + + +def main() -> None: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + + connection, checker = loop.run_until_complete(setup()) + + # slixmpp — asyncio-native, process() не существует + # connect() ставит соединение в очередь, loop.run_forever() его выполняет connection.connect() - asyncio.ensure_future(checker.start()) - connection.process(forever=True) + loop.create_task(checker.start()) + + try: + loop.run_forever() + except KeyboardInterrupt: + logger.info("Завершение по Ctrl+C") + finally: + loop.close() if __name__ == "__main__": - asyncio.run(main()) + main()