"""
Python environments and packages
================================
This module includes tools for using `virtual environments`_
and installing packages using `pip`_.
.. _virtual environments: http://www.virtualenv.org/
.. _pip: http://www.pip-installer.org/
"""
import posixpath
from fabric.api import run, sudo
from fabtools.files import is_file
from fabtools.python import (
install,
install_pip,
install_requirements,
is_installed,
is_pip_installed,
)
from fabtools.python_distribute import (
install_distribute,
is_distribute_installed,
)
from fabtools.system import distrib_family
DEFAULT_PIP_VERSION = '1.3.1'
[docs]def distribute(use_python='python'):
"""
Require `distribute`_ to be installed.
.. _distribute: http://packages.python.org/distribute/
"""
from fabtools.require.deb import packages as require_deb_packages
from fabtools.require.rpm import packages as require_rpm_packages
family = distrib_family()
if family == 'debian':
require_deb_packages([
'curl',
'python-dev',
])
elif family == 'redhat':
require_rpm_packages([
'curl',
'python-devel',
])
if not is_distribute_installed(use_python=use_python):
install_distribute(use_python=use_python)
[docs]def pip(version=None, use_python='python'):
"""
Require `pip`_ to be installed.
"""
distribute(use_python=use_python)
if not is_pip_installed(version, use_python=use_python):
install_pip(use_python=use_python)
[docs]def package(pkg_name, url=None, use_python='python', **kwargs):
"""
Require a Python package.
If the package is not installed, it will be installed
using the `pip installer`_.
::
from fabtools.python import virtualenv
from fabtools import require
# Install package system-wide
require.python.package('foo', use_sudo=True)
# Install package in an existing virtual environment
with virtualenv('/path/to/venv'):
require.python.package('bar')
.. _pip installer: http://www.pip-installer.org/
"""
pip(DEFAULT_PIP_VERSION, use_python=use_python)
if not is_installed(pkg_name, use_python):
install(url or pkg_name, use_python=use_python, **kwargs)
[docs]def packages(pkg_list, use_python='python', **kwargs):
"""
Require several Python packages.
"""
pip(DEFAULT_PIP_VERSION, use_python=use_python)
pkg_list = [pkg for pkg in pkg_list if not is_installed(pkg, use_python=use_python)]
if pkg_list:
install(pkg_list, use_python=use_python, **kwargs)
[docs]def requirements(filename, use_python='python', **kwargs):
"""
Require Python packages from a pip `requirements file`_.
.. _requirements file: http://www.pip-installer.org/en/latest/requirements.html
"""
pip(DEFAULT_PIP_VERSION, use_python=use_python)
install_requirements(filename, use_python=use_python, **kwargs)
[docs]def virtualenv(directory, system_site_packages=False, python=None,
use_sudo=False, user=None, clear=False,
prompt=None, use_python='python'):
"""
Require a Python `virtual environment`_.
::
from fabtools import require
require.python.virtualenv('/path/to/venv')
.. _virtual environment: http://www.virtualenv.org/
"""
package('virtualenv', use_sudo=True, use_python=use_python)
if not is_file(posixpath.join(directory, 'bin', 'python')):
options = ['--quiet']
if system_site_packages:
options.append('--system-site-packages')
if python:
options.append('--python=%s' % python)
if clear:
options.append('--clear')
if prompt:
options.append('--prompt="%s"' % prompt)
options = ' '.join(options)
command = 'virtualenv %(options)s "%(directory)s"' % locals()
if use_sudo:
sudo(command, user=user)
else:
run(command)