def match(command): if 'command not found' in command.output: command_name = _get_command_name(command) return which(command_name)
from therandy.utils import which apt_available = bool(which('apt-get'))
@for_app('gem') def match(command): return ('ERROR: While executing gem ... (Gem::CommandLineError)' in command.output and 'Unknown command' in command.output) def _get_unknown_command(command): return re.findall(r'Unknown command (.*)$', command.output)[0] @eager def _get_all_commands(): proc = subprocess.Popen(['gem', 'help', 'commands'], stdout=subprocess.PIPE) for line in proc.stdout.readlines(): line = line.decode() if line.startswith(' '): yield line.strip().split(' ')[0] if which('gem'): _get_all_commands = cache(which('gem'))(_get_all_commands) def get_new_command(command): unknown_command = _get_unknown_command(command) all_commands = _get_all_commands() return replace_command(command, unknown_command, all_commands)
def match(command): if 'not found' in command.output or 'not installed' in command.output: executable = _get_executable(command) return not which(executable) and get_package(executable) else: return False
from therandy.utils import which nix_available = bool(which('nix'))
def match(command): return (not which(command.script_parts[0]) and 'not found' in command.output and os.path.isfile('gradlew'))
import re from subprocess import Popen, PIPE from therandy.utils import memoize, which from therandy.shells import shell enabled_by_default = bool(which('lsof')) patterns = [r"bind on address \('.*', (?P<port>\d+)\)", r'Unable to bind [^ ]*:(?P<port>\d+)', r"can't listen on port (?P<port>\d+)", r'listen EADDRINUSE [^ ]*:(?P<port>\d+)'] @memoize def _get_pid_by_port(port): proc = Popen(['lsof', '-i', ':{}'.format(port)], stdout=PIPE) lines = proc.stdout.read().decode().split('\n') if len(lines) > 1: return lines[1].split()[1] else: return None @memoize def _get_used_port(command): for pattern in patterns: matched = re.search(pattern, command.output) if matched: return matched.group('port')
import re import subprocess from therandy.utils import replace_command, for_app, which, cache from therandy.specific.sudo import sudo_support @sudo_support @for_app('docker') def match(command): return 'is not a docker command' in command.output def get_docker_commands(): proc = subprocess.Popen('docker', stdout=subprocess.PIPE) lines = [line.decode('utf-8') for line in proc.stdout.readlines()] lines = dropwhile(lambda line: not line.startswith('Commands:'), lines) lines = islice(lines, 1, None) lines = list(takewhile(lambda line: line != '\n', lines)) return [line.strip().split(' ')[0] for line in lines] if which('docker'): get_docker_commands = cache(which('docker'))(get_docker_commands) @sudo_support def get_new_command(command): wrong_command = re.findall( r"docker: '(\w+)' is not a docker command.", command.output)[0] return replace_command(command, wrong_command, get_docker_commands())
def match(command): return (not which(command.script_parts[0]) and ('not found' in command.output or 'is not recognized as' in command.output) and bool(get_close_matches(command.script_parts[0], get_all_executables())))
import re from subprocess import Popen, PIPE from therandy.utils import memoize, eager, which npm_available = bool(which('npm')) @memoize @eager def get_scripts(): """Get custom npm scripts.""" proc = Popen(['npm', 'run-script'], stdout=PIPE) should_yeild = False for line in proc.stdout.readlines(): line = line.decode() if 'available via `npm run-script`:' in line: should_yeild = True continue if should_yeild and re.match(r'^ [^ ]+', line): yield line.strip().split(' ')[0]
from therandy.utils import which dnf_available = bool(which('dnf'))
from therandy.utils import (cache, for_app, replace_argument, replace_command, which) COMMON_TYPOS = { 'list': ['versions', 'install --list'], 'remove': ['uninstall'], } @for_app('pyenv') def match(command): return 'pyenv: no such command' in command.output def get_pyenv_commands(): proc = Popen(['pyenv', 'commands'], stdout=PIPE) return [line.decode('utf-8').strip() for line in proc.stdout.readlines()] if which('pyenv'): get_pyenv_commands = cache(which('pyenv'))(get_pyenv_commands) @for_app('pyenv') def get_new_command(command): broken = re.findall(r"pyenv: no such command `([^']*)'", command.output)[0] matched = [replace_argument(command.script, broken, common_typo) for common_typo in COMMON_TYPOS.get(broken, [])] matched.extend(replace_command(command, broken, get_pyenv_commands())) return matched