Source code for xonsh.completers.pip
"""Completers for pip."""
import re
import shlex
import subprocess
import xonsh.lazyasd as xl
from xonsh.built_ins import XSH
from xonsh.completers.tools import (
contextual_command_completer,
get_filter_function,
RichCompletion,
)
from xonsh.parsers.completion_context import CommandContext
@xl.lazyobject
def PIP_RE():
return re.compile(r"\bx?pip(?:\d|\.)*(exe)?$")
[docs]@contextual_command_completer
def complete_pip(context: CommandContext):
"""Completes python's package manager pip."""
prefix = context.prefix
if context.arg_index == 0 or (not PIP_RE.search(context.args[0].value.lower())):
return None
filter_func = get_filter_function()
args = [arg.raw_value for arg in context.args]
env = XSH.env.detype()
env.update(
{
"PIP_AUTO_COMPLETE": "1",
"COMP_WORDS": " ".join(args),
"COMP_CWORD": str(len(context.args)),
}
)
try:
proc = subprocess.run(
[args[0]],
stderr=subprocess.DEVNULL,
stdout=subprocess.PIPE,
env=env,
)
except FileNotFoundError:
return None
if proc.stdout:
out = shlex.split(proc.stdout.decode())
for cmp in out:
if filter_func(cmp, prefix):
yield RichCompletion(cmp, append_space=True)
return None