Skip to content

Commit bbb42eb

Browse files
committed
!squash wip TestServer
1 parent f2fb144 commit bbb42eb

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/libtmux/test.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import random
1010
import time
1111
import typing as t
12+
from functools import partial
1213

1314
from .exc import WaitTimeout
1415

@@ -349,3 +350,44 @@ def __exit__(
349350
self._environ[envvar] = value
350351
for unset in self._unset:
351352
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

Comments
 (0)