Skip to content

Commit 83dbf86

Browse files
committed
Decouple shell helpers
1 parent be35db2 commit 83dbf86

File tree

3 files changed

+107
-113
lines changed

3 files changed

+107
-113
lines changed

tests/test_cli.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import libtmux
1414
from libtmux.common import has_lt_version
1515
from libtmux.exc import LibTmuxException
16-
from tmuxp import cli, config
16+
from tmuxp import cli, config, exc
1717
from tmuxp.cli import (
1818
command_ls,
1919
get_config_dir,
@@ -537,7 +537,7 @@ def test_shell(
537537
[],
538538
{},
539539
{'session_name': 'nonexistant_session'},
540-
None,
540+
exc.TmuxpException,
541541
'Session not found: nonexistant_session',
542542
),
543543
(
@@ -551,7 +551,7 @@ def test_shell(
551551
[],
552552
{},
553553
{'window_name': 'nonexistant_window'},
554-
None,
554+
exc.TmuxpException,
555555
'Window not found: {WINDOW_NAME}',
556556
),
557557
],

tmuxp/cli.py

+20-110
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
from click.exceptions import FileError
1717

1818
from libtmux.common import has_gte_version, has_minimum_version, which
19-
from libtmux.exc import LibTmuxException, TmuxCommandNotFound
19+
from libtmux.exc import TmuxCommandNotFound
2020
from libtmux.server import Server
2121

22-
from . import config, exc, log, util
22+
from . import config, exc, log, shell, util
2323
from .__about__ import __version__
2424
from ._compat import string_types
2525
from .workspacebuilder import WorkspaceBuilder, freeze
@@ -682,64 +682,19 @@ def command_shell(session_name, window_name, socket_name, socket_path, command):
682682
"""
683683
server = Server(socket_name=socket_name, socket_path=socket_path)
684684

685-
try:
686-
server.sessions
687-
except LibTmuxException as e:
688-
if 'No such file or directory' in str(e):
689-
raise LibTmuxException(
690-
'no tmux session found. Start a tmux session and try again. \n'
691-
'Original error: ' + str(e)
692-
)
693-
else:
694-
raise e
685+
shell.raise_if_tmux_not_running(server=server)
695686

696-
current_pane = None
697-
if os.getenv('TMUX_PANE') is not None:
698-
try:
699-
current_pane = [
700-
p
701-
for p in server._list_panes()
702-
if p.get('pane_id') == os.getenv('TMUX_PANE')
703-
][0]
704-
except IndexError:
705-
pass
706-
707-
try:
708-
if session_name:
709-
session = server.find_where({'session_name': session_name})
710-
elif current_pane is not None:
711-
session = server.find_where({'session_id': current_pane['session_id']})
712-
else:
713-
session = server.list_sessions()[0]
714-
715-
if not session:
716-
raise exc.TmuxpException('Session not found: %s' % session_name)
717-
except exc.TmuxpException as e:
718-
print(e)
719-
return
687+
current_pane = shell.get_current_pane(server=server)
720688

721-
try:
722-
if window_name:
723-
window = session.find_where({'window_name': window_name})
724-
if not window:
725-
raise exc.TmuxpException('Window not found: %s' % window_name)
726-
elif current_pane is not None:
727-
window = session.find_where({'window_id': current_pane['window_id']})
728-
else:
729-
window = session.list_windows()[0]
689+
session = shell.get_session(
690+
server=server, session_name=session_name, current_pane=current_pane
691+
)
730692

731-
except exc.TmuxpException as e:
732-
print(e)
733-
return
693+
window = shell.get_window(
694+
session=session, window_name=window_name, current_pane=current_pane
695+
)
734696

735-
try:
736-
if current_pane is not None:
737-
pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841
738-
else:
739-
pane = window.attached_pane # NOQA: F841
740-
except exc.TmuxpException as e:
741-
print(e)
742-
return
697+
pane = shell.get_pane(window=window, current_pane=current_pane) # NOQA: F841
743698

744699
if command is not None:
745700
exec(command)
@@ -779,64 +734,19 @@ def command_shell_plus(
779734
"""
780735
server = Server(socket_name=socket_name, socket_path=socket_path)
781736

782-
try:
783-
server.sessions
784-
except LibTmuxException as e:
785-
if 'No such file or directory' in str(e):
786-
raise LibTmuxException(
787-
'no tmux session found. Start a tmux session and try again. \n'
788-
'Original error: ' + str(e)
789-
)
790-
else:
791-
raise e
737+
shell.raise_if_tmux_not_running(server=server)
792738

793-
current_pane = None
794-
if os.getenv('TMUX_PANE') is not None:
795-
try:
796-
current_pane = [
797-
p
798-
for p in server._list_panes()
799-
if p.get('pane_id') == os.getenv('TMUX_PANE')
800-
][0]
801-
except IndexError:
802-
pass
803-
804-
try:
805-
if session_name:
806-
session = server.find_where({'session_name': session_name})
807-
elif current_pane is not None:
808-
session = server.find_where({'session_id': current_pane['session_id']})
809-
else:
810-
session = server.list_sessions()[0]
811-
812-
if not session:
813-
raise exc.TmuxpException('Session not found: %s' % session_name)
814-
except exc.TmuxpException as e:
815-
print(e)
816-
return
739+
current_pane = shell.get_current_pane(server=server)
817740

818-
try:
819-
if window_name:
820-
window = session.find_where({'window_name': window_name})
821-
if not window:
822-
raise exc.TmuxpException('Window not found: %s' % window_name)
823-
elif current_pane is not None:
824-
window = session.find_where({'window_id': current_pane['window_id']})
825-
else:
826-
window = session.list_windows()[0]
741+
session = shell.get_session(
742+
server=server, session_name=session_name, current_pane=current_pane
743+
)
827744

828-
except exc.TmuxpException as e:
829-
print(e)
830-
return
745+
window = shell.get_window(
746+
session=session, window_name=window_name, current_pane=current_pane
747+
)
831748

832-
try:
833-
if current_pane is not None:
834-
pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841
835-
else:
836-
pane = window.attached_pane # NOQA: F841
837-
except exc.TmuxpException as e:
838-
print(e)
839-
return
749+
pane = shell.get_pane(window=window, current_pane=current_pane) # NOQA: F841
840750

841751
if command is not None:
842752
exec(command)

tmuxp/shell.py

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# -*- coding: utf-8 -*-
2+
"""Command line tool for managing tmux workspaces and tmuxp configurations.
3+
4+
tmuxp.cli
5+
~~~~~~~~~
6+
7+
"""
8+
from __future__ import absolute_import
9+
10+
import logging
11+
import os
12+
13+
from libtmux.exc import LibTmuxException
14+
15+
from . import exc
16+
17+
logger = logging.getLogger(__name__)
18+
19+
20+
def raise_if_tmux_not_running(server):
21+
"""Raise exception if not running. More descriptive error if no server found."""
22+
try:
23+
server.sessions
24+
except LibTmuxException as e:
25+
if 'No such file or directory' in str(e):
26+
raise LibTmuxException(
27+
'no tmux session found. Start a tmux session and try again. \n'
28+
'Original error: ' + str(e)
29+
)
30+
else:
31+
raise e
32+
33+
34+
def get_current_pane(server):
35+
"""Return Pane if one found in env"""
36+
if os.getenv('TMUX_PANE') is not None:
37+
try:
38+
return [
39+
p
40+
for p in server._list_panes()
41+
if p.get('pane_id') == os.getenv('TMUX_PANE')
42+
][0]
43+
except IndexError:
44+
pass
45+
46+
47+
def get_session(server, session_name=None, current_pane=None):
48+
if session_name:
49+
session = server.find_where({'session_name': session_name})
50+
elif current_pane is not None:
51+
session = server.find_where({'session_id': current_pane['session_id']})
52+
else:
53+
session = server.list_sessions()[0]
54+
55+
if not session:
56+
raise exc.TmuxpException('Session not found: %s' % session_name)
57+
58+
return session
59+
60+
61+
def get_window(session, window_name=None, current_pane=None):
62+
if window_name:
63+
window = session.find_where({'window_name': window_name})
64+
if not window:
65+
raise exc.TmuxpException('Window not found: %s' % window_name)
66+
elif current_pane is not None:
67+
window = session.find_where({'window_id': current_pane['window_id']})
68+
else:
69+
window = session.list_windows()[0]
70+
71+
return window
72+
73+
74+
def get_pane(window, current_pane=None):
75+
try:
76+
if current_pane is not None:
77+
pane = window.find_where({'pane_id': current_pane['pane_id']}) # NOQA: F841
78+
else:
79+
pane = window.attached_pane # NOQA: F841
80+
except exc.TmuxpException as e:
81+
print(e)
82+
return
83+
84+
return pane

0 commit comments

Comments
 (0)