Skip to content

Commit 36d8a0e

Browse files
committed
refactor!(click -> argparse)
1 parent 843b4cb commit 36d8a0e

File tree

11 files changed

+1151
-483
lines changed

11 files changed

+1151
-483
lines changed

src/tmuxp/cli/__init__.py

Lines changed: 143 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,92 @@
44
~~~~~~~~~
55
66
"""
7+
import argparse
78
import logging
89
import os
910
import sys
1011

11-
import click
12-
1312
from libtmux.__about__ import __version__ as libtmux_version
1413
from libtmux.common import has_minimum_version
1514
from libtmux.exc import TmuxCommandNotFound
16-
from tmuxp.cli.ls import command_ls
1715

1816
from .. import exc
1917
from ..__about__ import __version__
2018
from ..log import setup_logger
21-
from .convert import command_convert
22-
from .debug_info import command_debug_info
23-
from .edit import command_edit
24-
from .freeze import command_freeze
25-
from .import_config import command_import
26-
from .load import command_load
27-
from .shell import command_shell
19+
from .convert import command_convert, create_convert_subparser
20+
from .debug_info import command_debug_info, create_debug_info_subparser
21+
from .edit import command_edit, create_edit_subparser
22+
from .freeze import command_freeze, create_freeze_subparser
23+
from .import_config import (
24+
command_import_teamocil,
25+
command_import_tmuxinator,
26+
create_import_subparser,
27+
)
28+
from .load import command_load, create_load_subparser
29+
from .ls import command_ls, create_ls_subparser
30+
from .shell import command_shell, create_shell_subparser
2831
from .utils import tmuxp_echo
2932

3033
logger = logging.getLogger(__name__)
3134

3235

33-
@click.group(context_settings={"obj": {}, "help_option_names": ["-h", "--help"]})
34-
@click.version_option(
35-
__version__,
36-
"-V",
37-
"--version",
38-
message=f"%(prog)s %(version)s, libtmux {libtmux_version}",
39-
)
40-
@click.option(
41-
"--log-level",
42-
default="INFO",
43-
help="Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)",
44-
)
45-
def cli(log_level):
36+
def create_parser() -> argparse.ArgumentParser:
37+
parser = argparse.ArgumentParser(prog="tmuxp")
38+
parser.add_argument(
39+
"--version",
40+
"-V",
41+
action="version",
42+
version=f"%(prog)s {__version__}, libtmux {libtmux_version}",
43+
)
44+
parser.add_argument(
45+
"--log-level",
46+
action="store",
47+
default="INFO",
48+
help="log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)",
49+
)
50+
subparsers = parser.add_subparsers(dest="subparser_name")
51+
load_parser = subparsers.add_parser("load", help="load tmuxp workspaces")
52+
create_load_subparser(load_parser)
53+
shell_parser = subparsers.add_parser(
54+
"shell", help="launch python shell for tmux server, session, window and pane"
55+
)
56+
create_shell_subparser(shell_parser)
57+
import_parser = subparsers.add_parser(
58+
"import", help="import configurations from teamocil and tmuxinator."
59+
)
60+
create_import_subparser(import_parser)
61+
62+
convert_parser = subparsers.add_parser(
63+
"convert", help="convert configs between yaml and json."
64+
)
65+
create_convert_subparser(convert_parser)
66+
67+
debug_info_parser = subparsers.add_parser(
68+
"debug-info", help="print out all diagnostic info"
69+
)
70+
create_debug_info_subparser(debug_info_parser)
71+
72+
ls_parser = subparsers.add_parser("ls", help="list sessions in config directory")
73+
create_ls_subparser(ls_parser)
74+
75+
edit_parser = subparsers.add_parser("edit", help="run $EDITOR on config")
76+
create_edit_subparser(edit_parser)
77+
78+
freeze_parser = subparsers.add_parser(
79+
"freeze", help="freeze a live tmux session to a tmuxp config"
80+
)
81+
create_freeze_subparser(freeze_parser)
82+
83+
return parser
84+
85+
86+
def cli(args=None):
4687
"""Manage tmux sessions.
4788
4889
Pass the "--help" argument to any command to see detailed help.
4990
See detailed documentation and examples at:
5091
http://tmuxp.git-pull.com/"""
92+
5193
try:
5294
has_minimum_version()
5395
except TmuxCommandNotFound:
@@ -56,7 +98,84 @@ def cli(log_level):
5698
except exc.TmuxpException as e:
5799
tmuxp_echo(e, err=True)
58100
sys.exit()
59-
setup_logger(logger=logger, level=log_level.upper())
101+
102+
parser = create_parser()
103+
args = parser.parse_args(args)
104+
105+
setup_logger(logger=logger, level=args.log_level.upper())
106+
107+
if args.subparser_name is None:
108+
parser.print_help()
109+
return
110+
elif args.subparser_name == "load":
111+
command_load(
112+
config_file=args.config_file,
113+
socket_name=args.socket_name,
114+
socket_path=args.socket_path,
115+
tmux_config_file=args.tmux_config_file,
116+
new_session_name=args.new_session_name,
117+
answer_yes=args.answer_yes,
118+
detached=args.detached,
119+
append=args.append,
120+
colors=args.colors,
121+
log_file=args.log_file,
122+
parser=parser,
123+
)
124+
elif args.subparser_name == "shell":
125+
command_shell(
126+
session_name=args.session_name,
127+
window_name=args.window_name,
128+
socket_name=args.socket_name,
129+
socket_path=args.socket_path,
130+
command=args.command,
131+
shell=args.shell,
132+
use_pythonrc=args.use_pythonrc,
133+
use_vi_mode=args.use_vi_mode,
134+
parser=parser,
135+
)
136+
elif args.subparser_name == "import":
137+
import_subparser_name = getattr(args, "import_subparser_name", None)
138+
if import_subparser_name is None:
139+
parser.print_help()
140+
return
141+
elif import_subparser_name == "teamocil":
142+
command_import_teamocil(
143+
config_file=args.config_file,
144+
parser=parser,
145+
)
146+
elif import_subparser_name == "tmuxinator":
147+
command_import_tmuxinator(
148+
config_file=args.config_file,
149+
parser=parser,
150+
)
151+
elif args.subparser_name == "convert":
152+
command_convert(
153+
config_file=args.config_file,
154+
answer_yes=args.answer_yes,
155+
parser=parser,
156+
)
157+
elif args.subparser_name == "debug-info":
158+
command_debug_info(parser=parser)
159+
160+
elif args.subparser_name == "edit":
161+
command_edit(
162+
config_file=args.config_file,
163+
parser=parser,
164+
)
165+
elif args.subparser_name == "freeze":
166+
command_freeze(
167+
session_name=args.session_name,
168+
socket_name=args.socket_name,
169+
socket_path=args.socket_path,
170+
config_format=args.config_format,
171+
save_to=args.save_to,
172+
answer_yes=args.answer_yes,
173+
quiet=args.quiet,
174+
force=args.force,
175+
parser=parser,
176+
)
177+
elif args.subparser_name == "ls":
178+
command_ls(parser=parser)
60179

61180

62181
def startup(config_dir):
@@ -70,14 +189,3 @@ def startup(config_dir):
70189

71190
if not os.path.exists(config_dir):
72191
os.makedirs(config_dir)
73-
74-
75-
# Register sub-commands here
76-
cli.add_command(command_convert)
77-
cli.add_command(command_edit)
78-
cli.add_command(command_debug_info)
79-
cli.add_command(command_load)
80-
cli.add_command(command_ls)
81-
cli.add_command(command_freeze)
82-
cli.add_command(command_shell)
83-
cli.add_command(command_import)

src/tmuxp/cli/convert.py

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,64 @@
1+
import argparse
12
import os
23
import pathlib
3-
4-
import click
4+
import typing as t
55

66
from tmuxp.config_reader import ConfigReader
77

8-
from .utils import ConfigPath
8+
from .utils import get_config_dir, prompt_yes_no, scan_config
9+
910

11+
def create_convert_subparser(
12+
parser: argparse.ArgumentParser,
13+
) -> argparse.ArgumentParser:
14+
parser.add_argument(
15+
dest="config_file",
16+
type=str,
17+
metavar="config-file",
18+
help="checks tmuxp and current directory for config files.",
19+
)
20+
parser.add_argument(
21+
"--yes",
22+
"-y",
23+
dest="answer_yes",
24+
action="store_true",
25+
help="always answer yes",
26+
)
27+
return parser
1028

11-
@click.command(name="convert")
12-
@click.option(
13-
"--yes", "-y", "confirmed", help='Auto confirms with "yes".', is_flag=True
14-
)
15-
@click.argument("config", type=ConfigPath(exists=True), nargs=1)
16-
def command_convert(confirmed, config):
29+
30+
def command_convert(
31+
config_file: t.Union[str, pathlib.Path],
32+
answer_yes: bool,
33+
parser: t.Optional[argparse.ArgumentParser] = None,
34+
):
1735
"""Convert a tmuxp config between JSON and YAML."""
36+
config_file = scan_config(config_file, config_dir=get_config_dir())
37+
38+
if isinstance(config_file, str):
39+
config_file = pathlib.Path(config_file)
1840

19-
_, ext = os.path.splitext(config)
41+
_, ext = os.path.splitext(config_file)
2042
ext = ext.lower()
2143
if ext == ".json":
2244
to_filetype = "yaml"
2345
elif ext in [".yaml", ".yml"]:
2446
to_filetype = "json"
2547
else:
26-
raise click.BadParameter(
27-
f"Unknown filetype: {ext} (valid: [.json, .yaml, .yml])"
28-
)
48+
raise Exception(f"Unknown filetype: {ext} (valid: [.json, .yaml, .yml])")
2949

30-
configparser = ConfigReader.from_file(pathlib.Path(config))
31-
newfile = config.replace(ext, f".{to_filetype}")
50+
configparser = ConfigReader.from_file(config_file)
51+
newfile = config_file.parent / (str(config_file.stem) + f".{to_filetype}")
3252

33-
new_config = configparser.dump(format=to_filetype)
53+
export_kwargs = {"default_flow_style": False} if to_filetype == "yaml" else {}
54+
new_config = configparser.dump(format=to_filetype, indent=2, **export_kwargs)
3455

35-
if not confirmed:
36-
if click.confirm(f"convert to <{config}> to {to_filetype}?"):
37-
if click.confirm(f"Save config to {newfile}?"):
38-
confirmed = True
56+
if not answer_yes:
57+
if prompt_yes_no(f"Convert to <{config_file}> to {to_filetype}?"):
58+
if prompt_yes_no("Save config to %s?" % newfile):
59+
answer_yes = True
3960

40-
if confirmed:
61+
if answer_yes:
4162
buf = open(newfile, "w")
4263
buf.write(new_config)
4364
buf.close()

src/tmuxp/cli/debug_info.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1+
import argparse
12
import os
23
import pathlib
34
import platform
45
import shutil
56
import sys
7+
import typing as t
68

7-
import click
9+
from colorama import Fore
810

9-
from libtmux import __version__ as libtmux_version
11+
from libtmux.__about__ import __version__ as libtmux_version
1012
from libtmux.common import get_version, tmux_cmd
1113

1214
from ..__about__ import __version__
@@ -15,8 +17,15 @@
1517
tmuxp_path = pathlib.Path(__file__).parent.parent
1618

1719

18-
@click.command(name="debug-info", short_help="Print out all diagnostic info")
19-
def command_debug_info():
20+
def create_debug_info_subparser(
21+
parser: argparse.ArgumentParser,
22+
) -> argparse.ArgumentParser:
23+
return parser
24+
25+
26+
def command_debug_info(
27+
parser: t.Optional[argparse.ArgumentParser] = None,
28+
):
2029
"""
2130
Print debug info to submit with Issues.
2231
"""
@@ -40,7 +49,9 @@ def format_tmux_resp(std_resp):
4049
return "\n".join(
4150
[
4251
"\n".join(prepend_tab(std_resp.stdout)),
43-
click.style("\n".join(prepend_tab(std_resp.stderr)), fg="red"),
52+
Fore.RED,
53+
"\n".join(prepend_tab(std_resp.stderr)),
54+
Fore.RESET,
4455
]
4556
)
4657

src/tmuxp/cli/edit.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,28 @@
1+
import argparse
12
import os
3+
import pathlib
24
import subprocess
5+
import typing as t
36

4-
import click
7+
from .utils import scan_config
58

6-
from .utils import ConfigPath, scan_config
79

10+
def create_edit_subparser(
11+
parser: argparse.ArgumentParser,
12+
) -> argparse.ArgumentParser:
13+
parser.add_argument(
14+
dest="config_file",
15+
type=str,
16+
help="checks current tmuxp and current directory for yaml files.",
17+
)
18+
return parser
819

9-
@click.command(name="edit", short_help="Run $EDITOR on config.")
10-
@click.argument("config", type=ConfigPath(exists=True), nargs=1)
11-
def command_edit(config):
12-
config = scan_config(config)
20+
21+
def command_edit(
22+
config_file: t.Union[str, pathlib.Path],
23+
parser: t.Optional[argparse.ArgumentParser] = None,
24+
):
25+
config_file = scan_config(config_file)
1326

1427
sys_editor = os.environ.get("EDITOR", "vim")
15-
subprocess.call([sys_editor, config])
28+
subprocess.call([sys_editor, config_file])

0 commit comments

Comments
 (0)