Source code for xonsh.vox

import os
from os.path import join, basename, exists, expanduser
import venv
import builtins
from shutil import rmtree

import xonsh.tools
from xonsh.platform import ON_POSIX, ON_WINDOWS, scandir


[docs]class Vox: """Vox is a virtual environment manager for xonsh.""" def __init__(self): """Ensure that $VIRTUALENV_HOME is defined and declare the available vox commands""" if not builtins.__xonsh_env__.get('VIRTUALENV_HOME'): home_path = expanduser('~') builtins.__xonsh_env__['VIRTUALENV_HOME'] = join(home_path, '.virtualenvs') self.commands = { ('new',): self.create_env, ('activate', 'workon', 'enter'): self.activate_env, ('deactivate', 'exit'): self.deactivate_env, ('list', 'ls'): self.list_envs, ('remove', 'rm', 'delete', 'del'): self.remove_env, ('help', '-h', '--help'): self.show_help } def __call__(self, args, stdin=None): """Call the right handler method for a given command.""" if not args: self.show_help() return None command_name, params = args[0], args[1:] try: command = [ self.commands[aliases] for aliases in self.commands if command_name in aliases ][0] command(*params) except IndexError: print('Command "%s" doesn\'t exist.\n' % command_name) self.print_commands() @staticmethod
[docs] def create_env(name): """Create a virtual environment in $VIRTUALENV_HOME with python3's ``venv``. Parameters ---------- name : str Virtual environment name """ env_path = join(builtins.__xonsh_env__['VIRTUALENV_HOME'], name) print('Creating environment...') venv.create(env_path, with_pip=True) print('Environment "%s" created. Activate it with "vox activate %s".\n' % (name, name))
[docs] def activate_env(self, name): """Activate a virtual environment. Parameters ---------- name : str Virtual environment name """ env_path = join(builtins.__xonsh_env__['VIRTUALENV_HOME'], name) if not exists(env_path): print('This environment doesn\'t exist. Create it with "vox new %s".\n' % name) return None if ON_WINDOWS: bin_dir = 'Scripts' elif ON_POSIX: bin_dir = 'bin' else: print('This OS is not supported.') return None bin_path = join(env_path, bin_dir) if 'VIRTUAL_ENV' in __xonsh_env__: self.deactivate_env() __xonsh_env__['PATH'].insert(0, bin_path) __xonsh_env__['VIRTUAL_ENV'] = env_path print('Activated "%s".\n' % name)
@staticmethod
[docs] def deactivate_env(): """Deactive the active virtual environment.""" if 'VIRTUAL_ENV' not in __xonsh_env__: print('No environment currently active. Activate one with "vox activate".\n') return None env_path = __xonsh_env__['VIRTUAL_ENV'] env_name = basename(env_path) if xonsh.tools.ON_WINDOWS: bin_dir = 'Scripts' elif ON_POSIX: bin_dir = 'bin' else: print('This OS is not supported.') return None bin_path = join(env_path, bin_dir) while bin_path in __xonsh_env__['PATH']: __xonsh_env__['PATH'].remove(bin_path) __xonsh_env__.pop('VIRTUAL_ENV') print('Deactivated "%s".\n' % env_name)
@staticmethod
[docs] def list_envs(): """List available virtual environments.""" venv_home = builtins.__xonsh_env__['VIRTUALENV_HOME'] try: env_dirs = list(x.name for x in scandir(venv_home) if x.is_dir()) except PermissionError: print('No permissions on {}'.format(venv_home)) return None if not env_dirs: print('No environments available. Create one with "vox new".\n') return None print('Available environments:') print('\n'.join(env_dirs))
@staticmethod
[docs] def remove_env(name): """Remove virtual environment. Parameters ---------- name : str virtual environment name """ if 'VIRTUAL_ENV' in __xonsh_env__: print('This environment is currently active. If you really want to remove it, deactivate it first with "vox deactivate %s".\n' % name) return None env_path = join(builtins.__xonsh_env__['VIRTUALENV_HOME'], name) rmtree(env_path) print('Environment "%s" removed.\n' % name)
[docs] def show_help(self): """Show help.""" print(self.__doc__, '\n') self.print_commands()
@staticmethod
[docs] def print_commands(): """Print available vox commands.""" print("""Available commands: vox new <env> Create new virtual environment in $VIRTUALENV_HOME vox activate (workon, enter) <env> Activate virtual environment vox deactivate (exit) Deactivate current virtual environment vox list (ls) List all available environments vox remove (rm, delete, del) <env> Remove virtual environment vox help (-h, --help) Show help """)