Skip to content

Commit ff5d4eb

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 486b124 commit ff5d4eb

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
@@ -211,10 +211,8 @@ def is_alive(self) -> bool:
211211
>>> tmux = Server(socket_name="no_exist")
212212
>>> assert not tmux.is_alive()
213213
"""
214-
server_args = tuple(self._build_server_args())
215-
216214
# Use engine hook to allow engines to probe without bootstrapping.
217-
probe_result = self.engine.probe_server_alive(server_args)
215+
probe_result = self.engine.probe_server_alive()
218216
if probe_result is not None:
219217
return probe_result
220218

@@ -238,7 +236,7 @@ def raise_if_dead(self) -> None:
238236
server_args = tuple(self._build_server_args())
239237

240238
# Use engine hook to allow engines to probe without bootstrapping.
241-
probe_result = self.engine.probe_server_alive(server_args)
239+
probe_result = self.engine.probe_server_alive()
242240
if probe_result is not None:
243241
if not probe_result:
244242
tmux_bin_probe = shutil.which("tmux") or "tmux"
@@ -253,7 +251,7 @@ def raise_if_dead(self) -> None:
253251
if tmux_bin is None:
254252
raise exc.TmuxCommandNotFound
255253

256-
proc = self.engine.run("list-sessions", server_args=server_args)
254+
proc = self.cmd("list-sessions")
257255
if proc.returncode is not None and proc.returncode != 0:
258256
raise subprocess.CalledProcessError(
259257
returncode=proc.returncode,
@@ -375,19 +373,7 @@ def attached_sessions(self) -> list[Session]:
375373
sessions = list(self.sessions.filter(session_attached__noeq="1"))
376374

377375
# Let the engine hide its own internal client if it wants to.
378-
filter_fn = getattr(self.engine, "exclude_internal_sessions", None)
379-
if callable(filter_fn):
380-
server_args = tuple(self._build_server_args())
381-
try:
382-
sessions = filter_fn(
383-
sessions,
384-
server_args=server_args,
385-
)
386-
except TypeError:
387-
# Subprocess engine does not accept server_args; ignore.
388-
sessions = filter_fn(sessions)
389-
390-
return sessions
376+
return self.engine.filter_sessions(sessions)
391377

392378
def has_session(self, target_session: str, exact: bool = True) -> bool:
393379
"""Return True if session exists (excluding internal engine sessions).
@@ -484,11 +470,9 @@ def switch_client(self, target_session: str) -> None:
484470
"""
485471
session_check_name(target_session)
486472

487-
server_args = tuple(self._build_server_args())
488-
489473
# Use engine hook to check if switch-client is meaningful.
490474
# For control mode, this ensures there is at least one non-control client.
491-
if not self.engine.can_switch_client(server_args=server_args):
475+
if not self.engine.can_switch_client():
492476
msg = "no current client"
493477
raise exc.LibTmuxException(msg)
494478

0 commit comments

Comments
 (0)