Skip to content

Commit 7254f1a

Browse files
committed
docs/tests: Add server doctest examples
1 parent 5811e7a commit 7254f1a

File tree

1 file changed

+195
-77
lines changed

1 file changed

+195
-77
lines changed

src/libtmux/server.py

+195-77
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@
77
88
libtmux.server
99
~~~~~~~~~~~~~~
10+
11+
Examples
12+
--------
13+
>>> server.is_alive() # Check if tmux server is running
14+
True
15+
>>> # Clean up any existing test session first
16+
>>> if server.has_session("test_session"):
17+
... server.kill_session("test_session")
18+
>>> new_session = server.new_session(session_name="test_session")
19+
>>> new_session.name
20+
'test_session'
21+
>>> server.has_session("test_session")
22+
True
23+
>>> server.kill_session("test_session") # Clean up
24+
Server(socket_name=libtmux_test...)
1025
"""
1126

1227
from __future__ import annotations
@@ -361,25 +376,33 @@ def attached_sessions(self) -> list[Session]:
361376
return self.sessions.filter(session_attached__noeq="1")
362377

363378
def has_session(self, target_session: str, exact: bool = True) -> bool:
364-
"""Check if a session with the given name (or pattern) exists.
379+
"""Return True if session exists.
365380
366381
Parameters
367382
----------
368-
target_session
369-
The session name or pattern to check.
370-
exact
371-
Whether to require an exact match (tmux 2.1+). If True, prepends
372-
``=`` to the session name for an exact match.
373-
374-
Raises
375-
------
376-
exc.BadSessionName
377-
If the `target_session` is invalid.
383+
target_session : str
384+
Target session name to check
385+
exact : bool, optional
386+
If True, match the name exactly. Otherwise, match as a pattern.
378387
379-
Returns
380-
-------
381-
bool
382-
True if the session exists, False otherwise.
388+
Examples
389+
--------
390+
>>> # Clean up any existing test session
391+
>>> if server.has_session("test_session"):
392+
... server.kill_session("test_session")
393+
>>> server.new_session(session_name="test_session")
394+
Session($... test_session)
395+
>>> server.has_session("test_session")
396+
True
397+
>>> server.has_session("nonexistent")
398+
False
399+
>>> server.has_session("test_session", exact=True) # Exact match
400+
True
401+
>>> # Pattern matching (using tmux's pattern matching)
402+
>>> server.has_session("test_sess*", exact=False) # Pattern match
403+
True
404+
>>> server.kill_session("test_session") # Clean up
405+
Server(socket_name=libtmux_test...)
383406
"""
384407
session_check_name(target_session)
385408

@@ -396,38 +419,38 @@ def kill(self) -> None:
396419
397420
Examples
398421
--------
399-
>>> svr = Server(socket_name="testing")
400-
>>> svr.new_session()
422+
>>> # Create a new server for testing kill()
423+
>>> test_server = Server(socket_name="testing")
424+
>>> test_server.new_session()
401425
Session(...)
402-
403-
>>> svr.is_alive()
426+
>>> test_server.is_alive()
404427
True
405-
406-
>>> svr.kill()
407-
408-
>>> svr.is_alive()
428+
>>> test_server.kill()
429+
>>> test_server.is_alive()
409430
False
410431
"""
411432
self.cmd("kill-server")
412433

413434
def kill_session(self, target_session: str | int) -> Server:
414-
"""Kill a specific session on this server.
435+
"""Kill a session by name.
415436
416437
Parameters
417438
----------
418-
target_session
419-
The session name or ID to kill. Note that tmux uses fnmatch(3),
420-
so 'asdf' might also match 'asdfasd'.
421-
422-
Returns
423-
-------
424-
Server
425-
This server object (for chaining).
439+
target_session : str or int
440+
Name of the session or session ID to kill
426441
427-
Raises
428-
------
429-
exc.LibTmuxException
430-
If tmux reports an error (stderr output).
442+
Examples
443+
--------
444+
>>> # Clean up any existing session first
445+
>>> if server.has_session("temp"):
446+
... server.kill_session("temp")
447+
>>> session = server.new_session(session_name="temp")
448+
>>> server.has_session("temp")
449+
True
450+
>>> server.kill_session("temp")
451+
Server(socket_name=libtmux_test...)
452+
>>> server.has_session("temp")
453+
False
431454
"""
432455
proc = self.cmd("kill-session", target=target_session)
433456
if proc.stderr:
@@ -442,6 +465,22 @@ def switch_client(self, target_session: str) -> None:
442465
target_session
443466
The name or pattern of the target session.
444467
468+
Examples
469+
--------
470+
>>> # Create two test sessions
471+
>>> for name in ["session1", "session2"]:
472+
... if server.has_session(name):
473+
... server.kill_session(name)
474+
>>> session1 = server.new_session(session_name="session1")
475+
>>> session2 = server.new_session(session_name="session2")
476+
>>> # Note: switch_client() requires an interactive terminal
477+
>>> # so we can't demonstrate it in doctests
478+
>>> # Clean up
479+
>>> server.kill_session("session1")
480+
Server(socket_name=libtmux_test...)
481+
>>> server.kill_session("session2")
482+
Server(socket_name=libtmux_test...)
483+
445484
Raises
446485
------
447486
exc.BadSessionName
@@ -463,6 +502,18 @@ def attach_session(self, target_session: str | None = None) -> None:
463502
The name or pattern of the target session. If None, attaches to
464503
the most recently used session.
465504
505+
Examples
506+
--------
507+
>>> # Create a test session
508+
>>> if server.has_session("test_attach"):
509+
... server.kill_session("test_attach")
510+
>>> session = server.new_session(session_name="test_attach")
511+
>>> # Note: attach_session() requires an interactive terminal
512+
>>> # so we can't demonstrate it in doctests
513+
>>> # Clean up
514+
>>> server.kill_session("test_attach")
515+
Server(socket_name=libtmux_test...)
516+
466517
Raises
467518
------
468519
exc.BadSessionName
@@ -489,58 +540,62 @@ def new_session(
489540
*args: t.Any,
490541
**kwargs: t.Any,
491542
) -> Session:
492-
"""Create a new tmux session and return the associated :class:`Session`.
493-
494-
Uses ``-P -F#{session_id}`` to capture the session ID in the output.
543+
"""Create a new session.
495544
496545
Parameters
497546
----------
498547
session_name : str, optional
499-
The name to assign to the new session (``-s`` flag).
548+
Name of the session
500549
kill_session : bool, optional
501-
If True, kills any existing session with the same name.
550+
Kill session if it exists
502551
attach : bool, optional
503-
If True, creates the new session in the foreground (no ``-d`` flag).
552+
Attach to session after creating it
504553
start_directory : str, optional
505-
Working directory for the new session (``-c`` flag).
554+
Working directory for the session
506555
window_name : str, optional
507-
If given, creates the session's first window with this name (``-n``).
556+
Name of the initial window
508557
window_command : str, optional
509-
A shell command to run immediately in the new window; the window
510-
closes when the command exits.
558+
Command to run in the initial window
511559
x : int or "-", optional
512-
Forces the specified width for the new session if detached (``-x``).
560+
Width of new window
513561
y : int or "-", optional
514-
Forces the specified height for the new session if detached (``-y``).
515-
environment : dict of str to str, optional
516-
Environment variables to set for the session (tmux 3.2+).
517-
518-
Returns
519-
-------
520-
Session
521-
The newly created :class:`Session`.
522-
523-
Raises
524-
------
525-
exc.TmuxSessionExists
526-
If a session with the given `session_name` already exists and
527-
`kill_session` is False.
528-
exc.BadSessionName
529-
If `session_name` is invalid.
530-
exc.LibTmuxException
531-
If tmux reports an error (stderr output).
562+
Height of new window
563+
environment : dict, optional
564+
Dictionary of environment variables to set
532565
533566
Examples
534567
--------
535-
Sessions can be created without a session name:
536-
537-
>>> server.new_session()
538-
Session($2 2)
539-
540-
With a session name:
568+
>>> # Clean up any existing sessions first
569+
>>> for name in ["basic", "custom", "env_test"]:
570+
... if server.has_session(name):
571+
... server.kill_session(name)
572+
>>> # Create a basic session
573+
>>> session1 = server.new_session(session_name="basic")
574+
>>> session1.name
575+
'basic'
576+
577+
>>> # Create session with custom window name
578+
>>> session2 = server.new_session(
579+
... session_name="custom",
580+
... window_name="editor"
581+
... )
582+
>>> session2.windows[0].name
583+
'editor'
541584
542-
>>> server.new_session(session_name='my session')
543-
Session($3 my session)
585+
>>> # Create session with environment variables
586+
>>> session3 = server.new_session(
587+
... session_name="env_test",
588+
... environment={"TEST_VAR": "test_value"}
589+
... )
590+
>>> session3.name
591+
'env_test'
592+
593+
>>> # Clean up
594+
>>> for name in ["basic", "custom", "env_test"]:
595+
... server.kill_session(name)
596+
Server(socket_name=libtmux_test...)
597+
Server(socket_name=libtmux_test...)
598+
Server(socket_name=libtmux_test...)
544599
"""
545600
if session_name is not None:
546601
session_check_name(session_name)
@@ -600,11 +655,26 @@ def new_session(
600655

601656
@property
602657
def sessions(self) -> QueryList[Session]:
603-
"""Return a :class:`QueryList` of all :class:`Session` objects in this server.
658+
"""Return list of sessions.
604659
605-
Access advanced filtering and retrieval with:
606-
:meth:`.sessions.get() <libtmux._internal.query_list.QueryList.get()>` and
607-
:meth:`.sessions.filter() <libtmux._internal.query_list.QueryList.filter()>`
660+
Examples
661+
--------
662+
>>> # Clean up any existing test sessions first
663+
>>> for name in ["test1", "test2"]:
664+
... if server.has_session(name):
665+
... server.kill_session(name)
666+
>>> # Create some test sessions
667+
>>> session1 = server.new_session(session_name="test1")
668+
>>> session2 = server.new_session(session_name="test2")
669+
>>> len(server.sessions) >= 2 # May have other sessions
670+
True
671+
>>> sorted([s.name for s in server.sessions if s.name in ["test1", "test2"]])
672+
['test1', 'test2']
673+
>>> # Clean up
674+
>>> server.kill_session("test1")
675+
Server(socket_name=libtmux_test...)
676+
>>> server.kill_session("test2")
677+
Server(socket_name=libtmux_test...)
608678
"""
609679
sessions: list[Session] = []
610680
with contextlib.suppress(Exception):
@@ -623,6 +693,36 @@ def windows(self) -> QueryList[Window]:
623693
624694
This includes windows in all sessions.
625695
696+
Examples
697+
--------
698+
>>> # Clean up any existing test sessions
699+
>>> for name in ["test_windows1", "test_windows2"]:
700+
... if server.has_session(name):
701+
... server.kill_session(name)
702+
>>> # Create sessions with windows
703+
>>> session1 = server.new_session(session_name="test_windows1")
704+
>>> session2 = server.new_session(session_name="test_windows2")
705+
>>> # Create additional windows
706+
>>> _ = session1.new_window(window_name="win1") # Create window
707+
>>> _ = session2.new_window(window_name="win2") # Create window
708+
>>> # Each session should have 2 windows (default + new)
709+
>>> len([w for w in server.windows if w.session.name == "test_windows1"])
710+
2
711+
>>> len([w for w in server.windows if w.session.name == "test_windows2"])
712+
2
713+
>>> # Verify window names
714+
>>> wins1 = [w for w in server.windows if w.session.name == "test_windows1"]
715+
>>> wins2 = [w for w in server.windows if w.session.name == "test_windows2"]
716+
>>> sorted(w.name for w in wins1)
717+
['win1', ...]
718+
>>> sorted(w.name for w in wins2)
719+
['win2', ...]
720+
>>> # Clean up
721+
>>> server.kill_session("test_windows1")
722+
Server(socket_name=libtmux_test...)
723+
>>> server.kill_session("test_windows2")
724+
Server(socket_name=libtmux_test...)
725+
626726
Access advanced filtering and retrieval with:
627727
:meth:`.windows.get() <libtmux._internal.query_list.QueryList.get()>` and
628728
:meth:`.windows.filter() <libtmux._internal.query_list.QueryList.filter()>`
@@ -643,6 +743,24 @@ def panes(self) -> QueryList[Pane]:
643743
644744
This includes panes from all windows in all sessions.
645745
746+
Examples
747+
--------
748+
>>> # Clean up any existing test session
749+
>>> if server.has_session("test_panes"):
750+
... server.kill_session("test_panes")
751+
>>> # Create a session and split some panes
752+
>>> session = server.new_session(session_name="test_panes")
753+
>>> window = session.attached_window
754+
>>> # Split into two panes
755+
>>> window.split_window()
756+
Pane(%... Window(@... 1:..., Session($... test_panes)))
757+
>>> # Each window starts with 1 pane, split creates another
758+
>>> len([p for p in server.panes if p.window.session.name == "test_panes"])
759+
2
760+
>>> # Clean up
761+
>>> server.kill_session("test_panes")
762+
Server(socket_name=libtmux_test...)
763+
646764
Access advanced filtering and retrieval with:
647765
:meth:`.panes.get() <libtmux._internal.query_list.QueryList.get()>` and
648766
:meth:`.panes.filter() <libtmux._internal.query_list.QueryList.filter()>`

0 commit comments

Comments
 (0)