Coverage for /Users/ajo/work/jumpstarter/jumpstarter/packages/jumpstarter/jumpstarter/common/tempfile.py: 50%
32 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-06 10:21 +0200
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-06 10:21 +0200
1from contextlib import asynccontextmanager, contextmanager, nullcontext
2from os import PathLike
3from pathlib import Path
4from socket import AddressFamily
5from tempfile import TemporaryDirectory
7from anyio import create_task_group, create_tcp_listener, create_unix_listener
8from anyio.abc import SocketAttribute
9from xdg_base_dirs import xdg_runtime_dir
12@contextmanager
13def TemporarySocket():
14 with TemporaryDirectory(dir=xdg_runtime_dir(), prefix="jumpstarter-") as tempdir:
15 yield Path(tempdir) / "socket"
18@asynccontextmanager
19async def TemporaryUnixListener(handler, path: PathLike | None = None):
20 if path is not None:
21 cm = nullcontext(path)
22 else:
23 cm = TemporarySocket()
25 with cm as path:
26 async with await create_unix_listener(path) as listener:
27 async with create_task_group() as tg:
28 tg.start_soon(listener.serve, handler, tg)
29 try:
30 yield path
31 finally:
32 tg.cancel_scope.cancel()
35@asynccontextmanager
36async def TemporaryTcpListener(
37 handler, local_host="127.0.0.1", local_port=0, family=AddressFamily.AF_UNSPEC, backlog=65536, reuse_port=True
38):
39 async with await create_tcp_listener(
40 local_host=local_host,
41 local_port=local_port,
42 family=family,
43 backlog=backlog,
44 reuse_port=reuse_port,
45 ) as listener:
46 async with create_task_group() as tg:
47 tg.start_soon(listener.serve, handler, tg)
48 try:
49 yield listener.extra(SocketAttribute.local_address)
50 finally:
51 tg.cancel_scope.cancel()