Skip to content

Argcomplete #836

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ python = "^3.7"
libtmux = "~0.15.8"
colorama = ">=0.3.9"
PyYAML = "^6.0"
argcomplete = { version = "^2.0.0", optional = true }

[tool.poetry.dev-dependencies]
### Docs ###
Expand Down Expand Up @@ -98,6 +99,7 @@ types-PyYAML = "*"
importlib-metadata = "<5" # https://github.com/PyCQA/flake8/issues/1701

[tool.poetry.extras]
completion = ["argcomplete"]
docs = [
"docutils",
"sphinx",
Expand Down Expand Up @@ -158,6 +160,7 @@ files = [
[[tool.mypy.overrides]]
module = [
"shtab",
"argcomplete.*",
"aafigure",
"IPython.*",
"ptpython.*",
Expand Down
14 changes: 14 additions & 0 deletions src/tmuxp/cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,13 @@ def create_parser() -> argparse.ArgumentParser:
)
create_freeze_subparser(freeze_parser)

try:
import argcomplete

argcomplete.autocomplete(parser)
except ImportError:
pass

return parser


Expand Down Expand Up @@ -123,6 +130,13 @@ def cli(_args: t.Optional[t.List[str]] = None) -> None:
sys.exit()

parser = create_parser()

try:
import argcomplete

argcomplete.autocomplete(parser)
except ImportError:
pass
args = parser.parse_args(_args, namespace=ns)

setup_logger(logger=logger, level=args.log_level.upper())
Expand Down
101 changes: 101 additions & 0 deletions src/tmuxp/cli/completions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
import os
import pathlib
import typing as t

from libtmux.server import Server
from tmuxp import config
from tmuxp.cli.utils import get_config_dir

config_dir = get_config_dir()

try:
import argcomplete
import argcomplete.completers
except ImportError:

class ArgComplete:
class Completers:
class Completer:
def __call__(self, *args: object, **kwargs: object) -> object:
...

FilesCompleter = Completer

completers = Completers()

argcomplete = ArgComplete() # type:ignore


class ConfigFileCompleter(argcomplete.completers.FilesCompleter):
"""argcomplete completer for tmuxp files."""

def __init__(
self,
allowednames: t.Sequence[str] = ("yml", "yaml", "json"),
directories: bool = False,
**kwargs: object
):
super().__init__(allowednames=allowednames, directories=directories, **kwargs)

def __call__(self, prefix: str, **kwargs):
completion: t.List[str] = super().__call__(prefix, **kwargs)
completion.extend([pathlib.Path(c).stem for c in config.in_dir(config_dir)])

return completion


class TmuxinatorCompleter(argcomplete.completers.FilesCompleter):
"""argcomplete completer for Tmuxinator files."""

def __call__(self, prefix, **kwargs):
from tmuxp.cli.import_config import get_tmuxinator_dir

tmuxinator_config_dir = get_tmuxinator_dir()
completion = argcomplete.completers.FilesCompleter.__call__(
self, prefix, **kwargs
)
tmuxinator_configs = config.in_dir(tmuxinator_config_dir, extensions="yml")
completion += [
os.path.join(tmuxinator_config_dir, f) for f in tmuxinator_configs
]

return completion


class TeamocilCompleter(argcomplete.completers.FilesCompleter):

"""argcomplete completer for Teamocil files."""

def __call__(self, prefix, **kwargs):
from tmuxp.cli.import_config import get_teamocil_dir

teamocil_config_dir = get_teamocil_dir()

completion = argcomplete.completers.FilesCompleter.__call__(
self, prefix, **kwargs
)
teamocil_configs = config.in_dir(teamocil_config_dir, extensions="yml")
completion += [os.path.join(teamocil_config_dir, f) for f in teamocil_configs]

return completion


def SessionCompleter(prefix, parsed_args, **kwargs):
"""Return list of session names for argcomplete completer."""

t = Server(socket_name=parsed_args.socket_name, socket_path=parsed_args.socket_path)

sessions_available = [
s.get("session_name")
for s in t._sessions
if s.get("session_name").startswith(" ".join(prefix))
]

if parsed_args.session_name and sessions_available:
return []

return [
s.get("session_name")
for s in t._sessions
if s.get("session_name").startswith(prefix)
]
4 changes: 2 additions & 2 deletions src/tmuxp/cli/convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ def create_convert_subparser(
help="checks tmuxp and current directory for config files.",
)
try:
import shtab
from tmuxp.cli.completions import ConfigFileCompleter

config_file.complete = shtab.FILE # type: ignore
config_file.completer = ConfigFileCompleter() # type:ignore
except ImportError:
pass

Expand Down
11 changes: 8 additions & 3 deletions src/tmuxp/cli/import_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,15 @@ def create_import_subparser(
)

try:
import shtab
import argcomplete
import argcomplete.completers

teamocil_config_file.complete = shtab.FILE # type: ignore
tmuxinator_config_file.complete = shtab.FILE # type: ignore
teamocil_config_file.completer = ( # type: ignore
argcomplete.completers.FilesCompleter()
)
tmuxinator_config_file.completer = ( # type:ignore
argcomplete.completers.FilesCompleter()
)
except ImportError:
pass

Expand Down
13 changes: 9 additions & 4 deletions src/tmuxp/cli/load.py
Original file line number Diff line number Diff line change
Expand Up @@ -566,11 +566,16 @@ def create_load_subparser(parser: argparse.ArgumentParser) -> argparse.ArgumentP
)

try:
import shtab
import argcomplete
import argcomplete.completers

config_file.complete = shtab.FILE # type: ignore
tmux_config_file.complete = shtab.FILE # type: ignore
log_file.complete = shtab.FILE # type: ignore
from tmuxp.cli.completions import ConfigFileCompleter

config_file.completer = ConfigFileCompleter() # type: ignore
tmux_config_file.completer = ( # type: ignore
argcomplete.completers.FilesCompleter()
)
log_file.completer = argcomplete.completers.FilesCompleter() # type: ignore
except ImportError:
pass

Expand Down