Source code for provy.more.debian.package.gem
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Roles in this namespace are meant to provision packages installed via the `gem <http://docs.rubygems.org/>`_ package manager for Debian distributions.
'''
from fabric.api import settings
from provy.core import Role
UPDATE_ALTERNATIVES_COMMAND = """
update-alternatives --force --install /usr/bin/gem gem /usr/bin/gem{version} {priority} \
--slave /usr/share/man/man1/gem.1.gz gem.1.gz /usr/share/man/man1/gem{version}.1.gz
"""
[docs]class GemRole(Role):
'''
This role provides package management operations with `gem <http://docs.rubygems.org/>`_ within Debian distributions.
If you wish to use a different Ruby version other than the default in provy, remember to set `version` and `priority` in the
:class:`RubyRole <provy.more.debian.programming.ruby.RubyRole>` class.
Example:
::
from provy.core import Role
from provy.more.debian import GemRole
class MySampleRole(Role):
def provision(self):
with self.using(GemRole) as role:
role.ensure_package_installed('activerecord', version='3.1.1')
'''
use_sudo = True
[docs] def provision(self):
'''
Installs gem dependencies. This method should be called upon if overriden in base classes, or gem won't work properly in the remote server.
Example:
::
from provy.core import Role
from provy.more.debian import PipRole
class MySampleRole(Role):
def provision(self):
self.provision_role(PipRole) # does not need to be called if using with block.
'''
from provy.more.debian.programming.ruby import RubyRole
self.provision_role(RubyRole)
update_alternatives_command = UPDATE_ALTERNATIVES_COMMAND.format(
version=RubyRole.version,
priority=RubyRole.priority,
)
completion_command = 'ln - sf /etc/bash_completion.d/gem{version} /etc/alternatives/bash_completion_gem'.format(version=RubyRole.version)
self.execute(update_alternatives_command, sudo=True)
self.execute(completion_command, sudo=True)
[docs] def is_package_installed(self, package_name, version=None):
'''
Returns :data:`True` if the given package is installed via gem in the remote server, :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: Wheter the package is installed or not.
:rtype: :class:`bool`
Example:
::
from provy.core import Role
from provy.more.debian import GemRole
class MySampleRole(Role):
def provision(self):
with self.using(GemRole) as role:
if role.is_package_installed('activerecord', version='3.1.1'):
pass
'''
with settings(warn_only=True):
package_string = self.execute("gem list --local | tr '[A-Z]' '[a-z]' | grep %s%s" %
(package_name, version and '(%s)' % version or ''),
stdout=False, sudo=self.use_sudo)
return package_name in package_string
[docs] def ensure_package_installed(self, package_name, version=None):
'''
Makes sure the package is installed with the specified version (latest if :data:`None` specified).
This method does not verify and upgrade the package on subsequent provisions, though.
: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`
Example::
::
from provy.core import Role
from provy.more.debian import GemRole
class MySampleRole(Role):
def provision(self):
with self.using(GemRole) as role:
role.ensure_package_installed('activerecord', version='3.1.1')
'''
if not self.is_package_installed(package_name):
version_str = version and '(%s)' % version or ''
self.log('%s is not installed (via gem)! Installing...' % package_name)
self.execute('gem install %s%s' % (package_name, version_str), stdout=False, sudo=self.use_sudo)
self.log('%s installed!' % package_name)
return True
return False