|
9 | 9 | import random
|
10 | 10 | import time
|
11 | 11 | import typing as t
|
| 12 | +from functools import partial |
12 | 13 |
|
13 | 14 | from .exc import WaitTimeout
|
14 | 15 |
|
@@ -349,3 +350,44 @@ def __exit__(
|
349 | 350 | self._environ[envvar] = value
|
350 | 351 | for unset in self._unset:
|
351 | 352 | del self._environ[unset]
|
| 353 | + |
| 354 | + |
| 355 | +def _temp_server_finalizer(server: Server) -> None: |
| 356 | + """Finalizer function for TempTmuxServer that kills the server if it exists.""" |
| 357 | + if server.is_alive(): |
| 358 | + server.kill() |
| 359 | + |
| 360 | + |
| 361 | +def TempTmuxServer(socket_name: str | None = None, **kwargs: t.Any) -> Server: |
| 362 | + """Create a temporary tmux server that cleans up after itself. |
| 363 | +
|
| 364 | + This is similar to the server pytest fixture, but can be used outside of pytest. |
| 365 | + The server will be killed when the object is garbage collected. |
| 366 | +
|
| 367 | + Parameters |
| 368 | + ---------- |
| 369 | + socket_name : str, optional |
| 370 | + Name for the tmux socket. If not provided, a random one will be generated. |
| 371 | + **kwargs : dict |
| 372 | + Additional arguments to pass to Server constructor |
| 373 | +
|
| 374 | + Returns |
| 375 | + ------- |
| 376 | + Server |
| 377 | + A Server instance that will clean up after itself |
| 378 | +
|
| 379 | + Examples |
| 380 | + -------- |
| 381 | + >>> server = TempTmuxServer() |
| 382 | + >>> server.new_session() |
| 383 | + Session($... ...) |
| 384 | + >>> server.is_alive() |
| 385 | + True |
| 386 | + >>> del server # Server is automatically killed |
| 387 | + """ |
| 388 | + if socket_name is None: |
| 389 | + socket_name = f"libtmux_test{next(namer)}" |
| 390 | + |
| 391 | + server = Server(socket_name=socket_name, **kwargs) |
| 392 | + server.__del__ = partial(_temp_server_finalizer, server) # type: ignore |
| 393 | + return server |
0 commit comments