From 85b47465167c1e44c840b606aee90b14a5ec02c1 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 1 Dec 2022 16:36:36 +0000 Subject: [PATCH] Turn start_rpc_server into a context manager --- deltachat-rpc-client/examples/echobot.py | 70 +++++++++---------- .../src/deltachat_rpc_client/rpc.py | 7 +- deltachat-rpc-client/tests/test_something.py | 5 +- 3 files changed, 44 insertions(+), 38 deletions(-) diff --git a/deltachat-rpc-client/examples/echobot.py b/deltachat-rpc-client/examples/echobot.py index d5b95f3a2..18ec47d8a 100755 --- a/deltachat-rpc-client/examples/echobot.py +++ b/deltachat-rpc-client/examples/echobot.py @@ -7,46 +7,46 @@ import deltachat_rpc_client as dc async def main(): - rpc = await dc.start_rpc_server() - deltachat = dc.Deltachat(rpc) - system_info = await deltachat.get_system_info() - logging.info("Running deltachat core %s", system_info["deltachat_core_version"]) + async with dc.start_rpc_server() as rpc: + deltachat = dc.Deltachat(rpc) + system_info = await deltachat.get_system_info() + logging.info("Running deltachat core %s", system_info["deltachat_core_version"]) - accounts = await deltachat.get_all_accounts() - account = accounts[0] if accounts else await deltachat.add_account() + accounts = await deltachat.get_all_accounts() + account = accounts[0] if accounts else await deltachat.add_account() - await account.set_config("bot", "1") - if not await account.is_configured(): - logging.info("Account is not configured, configuring") - await account.set_config("addr", sys.argv[1]) - await account.set_config("mail_pw", sys.argv[2]) - await account.configure() - logging.info("Configured") - else: - logging.info("Account is already configured") - await deltachat.start_io() + await account.set_config("bot", "1") + if not await account.is_configured(): + logging.info("Account is not configured, configuring") + await account.set_config("addr", sys.argv[1]) + await account.set_config("mail_pw", sys.argv[2]) + await account.configure() + logging.info("Configured") + else: + logging.info("Account is already configured") + await deltachat.start_io() - async def process_messages(): - for message in await account.get_fresh_messages_in_arrival_order(): - snapshot = await message.get_snapshot() - if not snapshot.is_info: - await snapshot.chat.send_text(snapshot.text) - await snapshot.message.mark_seen() + async def process_messages(): + for message in await account.get_fresh_messages_in_arrival_order(): + snapshot = await message.get_snapshot() + if not snapshot.is_info: + await snapshot.chat.send_text(snapshot.text) + await snapshot.message.mark_seen() - # Process old messages. - await process_messages() + # Process old messages. + await process_messages() - while True: - event = await account.wait_for_event() - if event["type"] == "Info": - logging.info("%s", event["msg"]) - elif event["type"] == "Warning": - logging.warning("%s", event["msg"]) - elif event["type"] == "Error": - logging.error("%s", event["msg"]) - elif event["type"] == "IncomingMsg": - logging.info("Got an incoming message") - await process_messages() + while True: + event = await account.wait_for_event() + if event["type"] == "Info": + logging.info("%s", event["msg"]) + elif event["type"] == "Warning": + logging.warning("%s", event["msg"]) + elif event["type"] == "Error": + logging.error("%s", event["msg"]) + elif event["type"] == "IncomingMsg": + logging.info("Got an incoming message") + await process_messages() if __name__ == "__main__": diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py index efbaa0b80..17d508e2a 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/rpc.py @@ -2,6 +2,7 @@ import asyncio import json import logging import os +from contextlib import asynccontextmanager import aiohttp @@ -73,6 +74,7 @@ class Rpc: return method +@asynccontextmanager async def start_rpc_server(*args, **kwargs): proc = await asyncio.create_subprocess_exec( "deltachat-rpc-server", @@ -82,7 +84,10 @@ async def start_rpc_server(*args, **kwargs): **kwargs ) rpc = Rpc(proc) - return rpc + try: + yield rpc + finally: + proc.terminate() async def new_online_account(): diff --git a/deltachat-rpc-client/tests/test_something.py b/deltachat-rpc-client/tests/test_something.py index 1744f3de9..902c3409e 100644 --- a/deltachat-rpc-client/tests/test_something.py +++ b/deltachat-rpc-client/tests/test_something.py @@ -10,9 +10,10 @@ from deltachat_rpc_client import Deltachat @pytest_asyncio.fixture async def rpc(tmp_path): - return await deltachat_rpc_client.start_rpc_server( + async with deltachat_rpc_client.start_rpc_server( env={**os.environ, "DC_ACCOUNTS_PATH": str(tmp_path / "accounts")} - ) + ) as rpc: + yield rpc @pytest.mark.asyncio