Skip to content

Commit 0e40d38

Browse files
committed
engine(api): Standardize hook signatures using stored context
Remove server_args parameter from all engine hooks: - probe_server_alive() now uses self._server_context - can_switch_client() now uses self._server_context - Rename exclude_internal_sessions() to filter_sessions() This eliminates the fragile try/except fallback pattern in server.py where we had to handle different engine signatures. All engines now use the bound ServerContext set during Server.__init__. Net reduction: 16 lines of code removed.
1 parent 9bb796c commit 0e40d38

File tree

3 files changed

+36
-52
lines changed

3 files changed

+36
-52
lines changed

src/libtmux/_internal/engines/base.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -201,12 +201,11 @@ def iter_notifications(
201201
return
202202

203203
# Optional hooks ---------------------------------------------------
204-
def probe_server_alive(
205-
self,
206-
server_args: tuple[str | int, ...],
207-
) -> bool | None:
204+
def probe_server_alive(self) -> bool | None:
208205
"""Probe if tmux server is alive without starting the engine.
209206
207+
Uses the bound :attr:`_server_context` for connection details.
208+
210209
Returns
211210
-------
212211
bool | None
@@ -219,13 +218,11 @@ def probe_server_alive(
219218
"""
220219
return None
221220

222-
def can_switch_client(
223-
self,
224-
*,
225-
server_args: tuple[str | int, ...] | None = None,
226-
) -> bool:
221+
def can_switch_client(self) -> bool:
227222
"""Check if switch-client is meaningful for this engine.
228223
224+
Uses the bound :attr:`_server_context` for connection details.
225+
229226
Returns
230227
-------
231228
bool
@@ -239,13 +236,24 @@ def internal_session_names(self) -> set[str]:
239236
"""Names of sessions reserved for engine internals."""
240237
return set()
241238

242-
def exclude_internal_sessions(
239+
def filter_sessions(
243240
self,
244241
sessions: list[Session],
245-
*,
246-
server_args: tuple[str | int, ...] | None = None,
247-
) -> list[Session]: # pragma: no cover - overridden by control mode
248-
"""Allow engines to hide internal/management sessions from user lists."""
242+
) -> list[Session]:
243+
"""Filter sessions, hiding any internal/management sessions.
244+
245+
Uses the bound :attr:`_server_context` for connection details.
246+
247+
Parameters
248+
----------
249+
sessions : list[Session]
250+
All sessions from the server.
251+
252+
Returns
253+
-------
254+
list[Session]
255+
Sessions after filtering out any engine-internal ones.
256+
"""
249257
return sessions
250258

251259
def get_stats(self) -> EngineStats: # pragma: no cover - default noop

src/libtmux/_internal/engines/control_mode.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -322,10 +322,7 @@ def internal_session_names(self) -> set[str]:
322322
return set()
323323
return {self._internal_session_name}
324324

325-
def probe_server_alive(
326-
self,
327-
server_args: tuple[str | int, ...],
328-
) -> bool | None:
325+
def probe_server_alive(self) -> bool | None:
329326
"""Check if tmux server is alive without starting control mode.
330327
331328
Performs a direct subprocess check to avoid bootstrapping the control
@@ -340,33 +337,32 @@ def probe_server_alive(
340337
if tmux_bin is None:
341338
return False
342339

340+
server_args = self._server_context.to_args() if self._server_context else ()
343341
result = subprocess.run(
344-
[tmux_bin, *[str(a) for a in server_args], "list-sessions"],
342+
[tmux_bin, *server_args, "list-sessions"],
345343
check=False,
346344
capture_output=True,
347345
)
348346
return result.returncode == 0
349347

350-
def exclude_internal_sessions(
348+
def filter_sessions(
351349
self,
352350
sessions: list[Session],
353-
*,
354-
server_args: tuple[str | int, ...] | None = None,
355351
) -> list[Session]:
356352
"""Hide sessions that are only attached via the control-mode client."""
357353
if self.process is None or self.process.pid is None:
358354
return sessions
359355

360356
ctrl_pid = str(self.process.pid)
361-
effective_server_args = server_args or self._server_args or ()
357+
server_args = self._server_context.to_args() if self._server_context else ()
362358

363359
proc = self.run(
364360
"list-clients",
365361
cmd_args=(
366362
"-F",
367363
"#{client_pid} #{client_flags} #{session_name}",
368364
),
369-
server_args=effective_server_args,
365+
server_args=server_args,
370366
)
371367
pid_map: dict[str, list[tuple[str, str]]] = {}
372368
for line in proc.stdout:
@@ -396,22 +392,18 @@ def exclude_internal_sessions(
396392

397393
return filtered
398394

399-
def can_switch_client(
400-
self,
401-
*,
402-
server_args: tuple[str | int, ...] | None = None,
403-
) -> bool:
395+
def can_switch_client(self) -> bool:
404396
"""Return True if there is at least one non-control client attached."""
405397
if self.process is None or self.process.pid is None:
406398
return False
407399

408400
ctrl_pid = str(self.process.pid)
409-
effective_server_args = server_args or self._server_args or ()
401+
server_args = self._server_context.to_args() if self._server_context else ()
410402

411403
proc = self.run(
412404
"list-clients",
413405
cmd_args=("-F", "#{client_pid} #{client_flags}"),
414-
server_args=effective_server_args,
406+
server_args=server_args,
415407
)
416408
for line in proc.stdout:
417409
parts = line.split()

src/libtmux/server.py

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -222,10 +222,8 @@ def is_alive(self) -> bool:
222222
>>> tmux = Server(socket_name="no_exist")
223223
>>> assert not tmux.is_alive()
224224
"""
225-
server_args = tuple(self._build_server_args())
226-
227225
# Use engine hook to allow engines to probe without bootstrapping.
228-
probe_result = self.engine.probe_server_alive(server_args)
226+
probe_result = self.engine.probe_server_alive()
229227
if probe_result is not None:
230228
return probe_result
231229

@@ -249,7 +247,7 @@ def raise_if_dead(self) -> None:
249247
server_args = tuple(self._build_server_args())
250248

251249
# Use engine hook to allow engines to probe without bootstrapping.
252-
probe_result = self.engine.probe_server_alive(server_args)
250+
probe_result = self.engine.probe_server_alive()
253251
if probe_result is not None:
254252
if not probe_result:
255253
tmux_bin_probe = shutil.which("tmux") or "tmux"
@@ -264,7 +262,7 @@ def raise_if_dead(self) -> None:
264262
if tmux_bin is None:
265263
raise exc.TmuxCommandNotFound
266264

267-
proc = self.engine.run("list-sessions", server_args=server_args)
265+
proc = self.cmd("list-sessions")
268266
if proc.returncode is not None and proc.returncode != 0:
269267
raise subprocess.CalledProcessError(
270268
returncode=proc.returncode,
@@ -386,19 +384,7 @@ def attached_sessions(self) -> list[Session]:
386384
sessions = list(self.sessions.filter(session_attached__noeq="1"))
387385

388386
# Let the engine hide its own internal client if it wants to.
389-
filter_fn = getattr(self.engine, "exclude_internal_sessions", None)
390-
if callable(filter_fn):
391-
server_args = tuple(self._build_server_args())
392-
try:
393-
sessions = filter_fn(
394-
sessions,
395-
server_args=server_args,
396-
)
397-
except TypeError:
398-
# Subprocess engine does not accept server_args; ignore.
399-
sessions = filter_fn(sessions)
400-
401-
return sessions
387+
return self.engine.filter_sessions(sessions)
402388

403389
def has_session(self, target_session: str, exact: bool = True) -> bool:
404390
"""Return True if session exists (excluding internal engine sessions).
@@ -494,11 +480,9 @@ def switch_client(self, target_session: str) -> None:
494480
"""
495481
session_check_name(target_session)
496482

497-
server_args = tuple(self._build_server_args())
498-
499483
# Use engine hook to check if switch-client is meaningful.
500484
# For control mode, this ensures there is at least one non-control client.
501-
if not self.engine.can_switch_client(server_args=server_args):
485+
if not self.engine.can_switch_client():
502486
msg = "no current client"
503487
raise exc.LibTmuxException(msg)
504488

0 commit comments

Comments
 (0)