Source code for provy.more.debian.package.npm

#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
Roles in this namespace are meant to provision packages installed via the `NPM <https://npmjs.org/>`_ package manager for Debian distributions.
'''

from fabric.api import settings
from provy.core import Role

from provy.more.debian.programming.nodejs import NodeJsRole


[docs]class NPMRole(Role): ''' This role provides package management operations with `NPM <https://npmjs.org/>`_ within Debian distributions. Example: :: from provy.core import Role from provy.more.debian import NPMRole class MySampleRole(Role): def provision(self): with self.using(NPMRole) as role: role.ensure_package_installed('socket.io', '0.6.17') ''' time_format = "%d-%m-%y %H:%M:%S" key = 'npm-up-to-date'
[docs] def provision(self): ''' Installs NPM. This method should be called upon if overriden in base classes, or NPM won't work properly in the remote server. Example: :: from provy.core import Role from provy.more.debian import NPMRole class MySampleRole(Role): def provision(self): self.provision_role(NPMRole) # no need to call this if using with block. ''' self.provision_role(NodeJsRole)
[docs] def is_package_installed(self, package_name, version=None): ''' Returns :data:`True` if the given package is installed via NPM, :data:`False` otherwise. :param package_name: Name of the package to verify :type package_name: :class:`str` :param version: Version to check for. Defaults to :data:`None`, which makes it check for any version. :type version: :class:`str` :return: Whether the package is installed or not. :rtype: :class:`bool` Example: :: from provy.core import Role from provy.more.debian import NPMRole class MySampleRole(Role): def provision(self): with self.using(NPMRole) as role: if role.is_package_installed('socket.io', '0.6.17'): pass ''' with settings(warn_only=True): if version: package_name = "%s@%s" % (package_name, version) return package_name in self.execute("npm --global list | egrep '%s'" % package_name, stdout=False, sudo=True)
[docs] def ensure_package_installed(self, package_name, version=None, stdout=False, sudo=True): ''' Ensures that the given package in the given version is installed via NPM. :param package_name: Name of the package to install. :type package_name: :class:`str` :param version: If specified, installs this version of the package. Installs latest version otherwise. :type version: :class:`str` :param stdout: Indicates whether install progress should be shown to stdout. Defaults to :data:`False`. :type stdout: :class:`bool` :param sudo: Indicates whether the package should be installed with the super user. Defaults to :data:`True`. :type sudo: :class:`bool` :return: Whether the package had to be installed or not. :rtype: :class:`bool` Example: :: from provy.core import Role from provy.more.debian import NPMRole class MySampleRole(Role): def provision(self): with self.using(NPMRole) as role: role.ensure_package_installed('socket.io', '0.6.17') ''' if not self.is_package_installed(package_name, version): if version: package_name = "%s@%s" % (package_name, version) self.log('%s is not installed (via NPM)! Installing...' % package_name) self.execute('npm install --global %s' % package_name, stdout=stdout, sudo=sudo) self.log('%s is installed (via NPM).' % package_name) return True return False