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

1from contextlib import asynccontextmanager, contextmanager, nullcontext 

2from os import PathLike 

3from pathlib import Path 

4from socket import AddressFamily 

5from tempfile import TemporaryDirectory 

6 

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 

10 

11 

12@contextmanager 

13def TemporarySocket(): 

14 with TemporaryDirectory(dir=xdg_runtime_dir(), prefix="jumpstarter-") as tempdir: 

15 yield Path(tempdir) / "socket" 

16 

17 

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() 

24 

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() 

33 

34 

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()