Пример #1
0
    def work(self):

        env = VirtualEnvironment(path=self.args['dir'], python="python2.7")

        env.open_or_create()

        return 0, ""
Пример #2
0
def copy_deps_to_build(deps, build_dir, dest_dir):
    venv_dir = os.path.join(build_dir, 'venv')
    env = VirtualEnvironment(venv_dir)
    env.open_or_create()

    venv_site_packages = os.path.join(venv_dir, 'lib', 'python2.7',
                                      'site-packages')

    ignore_paths = []
    for path in os.listdir(venv_site_packages):
        ignore_paths.append(path)

    print("venv ignore paths = %r" % ignore_paths)

    for dep in deps:
        env.install(dep)

    for path in os.listdir(venv_site_packages):
        if not path in ignore_paths:
            fullpath = os.path.join(venv_site_packages, path)
            outpath = os.path.join(dest_dir, path)
            logging.info("Copying dependency: %s" % path)
            if os.path.isfile(fullpath):
                shutil.copy2(fullpath, outpath)
            else:
                shutil.copytree(fullpath, outpath)
        else:
            logging.info("Ignoring %s" % path)
Пример #3
0
class VirtualEnv(object):

    modul_pattern = re.compile(r'\.py.?$')

    def __init__(self, name, temp_dir, name_convertor, base_python_version):
        self.name = name
        self.temp_dir = temp_dir
        self.name_convertor = name_convertor
        if not base_python_version:
            base_python_version = DEFAULT_PYTHON_VERSION
        python_version = 'python' + base_python_version
        self.env = VirtualEnvironment(temp_dir + '/venv', python=python_version)
        try:
            self.env.open_or_create()
        except (ve.VirtualenvCreationException, ve.VirtualenvReadonlyException):
            raise VirtualenvFailException('Failed to create virtualenv')
        self.dirs_before_install = DirsContent()
        self.dirs_after_install = DirsContent()
        self.dirs_before_install.fill(temp_dir + '/venv/')
        self.data = {}

    def install_package_to_venv(self):
        '''
        Installs package given as first argument to virtualenv without
        dependencies
        '''
        try:
            self.env.install(self.name, options=["--no-deps"])
        except (ve.PackageInstallationException, ve.VirtualenvReadonlyException):
            raise VirtualenvFailException('Failed to install package to virtualenv')
        self.dirs_after_install.fill(self.temp_dir + '/venv/')

    @property
    def get_dirs_differance(self):
        '''
        Makes final versions of site_packages and scripts using DirsContent
        sub method and filters
        '''
        try:
            diff = self.dirs_after_install - self.dirs_before_install
        except ValueError:
            raise VirtualenvFailException("Some of the DirsContent attributes is uninicialized")
        site_packages = site_packages_filter(diff.lib_sitepackages)
        packages = set([p for p in site_packages if not self.modul_pattern.search(p)])
        py_modules = set([os.path.splitext(m)[0] for m in site_packages - packages])
        scripts = scripts_filter(list(diff.bindir))
        logger.debug('Packages from files differance in virtualenv: {0}.'.format(
            packages))
        logger.debug('py_modules from files differance in virtualenv: {0}.'.format(
            py_modules))
        logger.debug('Scripts from files differance in virtualenv: {0}.'.format(scripts))
        return (packages, py_modules, scripts)

    @property
    def get_venv_data(self):
        self.install_package_to_venv()
        (self.data['packages'], self.data['py_modules'],
         self.data['scripts']) = self.get_dirs_differance
        return self.data
Пример #4
0
class VirtualEnv(object):
    def __init__(self, name, temp_dir, name_convertor, base_python_version):
        self.name = name
        self.temp_dir = temp_dir
        self.name_convertor = name_convertor
        if not base_python_version:
            base_python_version = DEFAULT_PYTHON_VERSION
        python_version = 'python' + base_python_version
        self.env = VirtualEnvironment(temp_dir + '/venv',
                                      python=python_version)
        try:
            self.env.open_or_create()
        except (ve.VirtualenvCreationException,
                ve.VirtualenvReadonlyException):
            raise VirtualenvFailException('Failed to create virtualenv')
        self.dirs_before_install = DirsContent()
        self.dirs_after_install = DirsContent()
        self.dirs_before_install.fill(temp_dir + '/venv/')
        self.data = {}

    def install_package_to_venv(self):
        '''
        Installs package given as first argument to virtualenv without
        dependencies
        '''
        try:
            self.env.install(self.name, options=["--no-deps"])
        except (ve.PackageInstallationException,
                ve.VirtualenvReadonlyException):
            raise VirtualenvFailException(
                'Failed to install package to virtualenv')
        self.dirs_after_install.fill(self.temp_dir + '/venv/')

    @property
    def get_dirs_differance(self):
        '''
        Makes final versions of site_packages and scripts using DirsContent
        sub method and filters
        '''
        try:
            diff = self.dirs_after_install - self.dirs_before_install
        except ValueError:
            raise VirtualenvFailException(
                "Some of the DirsContent attributes is uninicialized")
        site_packages = site_packages_filter(diff.lib_sitepackages)
        logger.debug(
            'Site_packages from files differance in virtualenv: {0}.'.format(
                site_packages))
        scripts = scripts_filter(list(diff.bindir))
        logger.debug(
            'Scripts from files differance in virtualenv: {0}.'.format(
                scripts))
        return (site_packages, scripts)

    @property
    def get_venv_data(self):
        self.install_package_to_venv()
        self.data['packages'], self.data['scripts'] = self.get_dirs_differance
        return self.data
Пример #5
0
def install_venv(name, path, requirements, python_path):
    print('[*] Setting up %s virtualenv...' % log.color('1;34', name))

    try:
        # Convert target path to absolute path.
        path = os.path.abspath(path)

        # Make sure that base path exists.
        if not os.path.exists(os.path.dirname(path)):
            os.makedirs(os.path.dirname(path))

        # Create new virtualenv if it doesn't exist.
        if not os.path.exists(path):
            env = VirtualEnvironment(path, python=python_path)
            env.open_or_create()

        # Reopen virtualenv to use the correct Python path
        env = VirtualEnvironment(path)
        assert env.path == os.path.abspath(path)

        # Install requirements for the virtualenv.
        # TODO: Shebang lines in binaries installed this way
        #       use the path in python_path instead of this virtualenv's,
        #       which I haven't been able to solve yet. A workaround
        #       is just to pip uninstall and then install it back.
        requirements = get_requirements(requirements)
        for requirement in requirements:
            requirement = requirement.split(' ')
            package, options = requirement[0], requirement[1:]

            if not env.is_installed(package):
                print('    Installing %s...' % log.color('1;33', package))
                env.install(package, options=options)
    except AssertionError as e:
        raise e
    except VirtualenvCreationException as e:
        # Could not create virtualenv, which executes `virtualenv` as a subprocess under the hood.
        log.error('Exception occurred while creating virtualenv: %s' % e)

        # Check if we can find the virtualenv bin.
        which = shutil.which('virtualenv')
        if which is None:
            log.error(
                'Most probable error: Could not locate `virtualenv` in $PATH.')
            return False

        log.error('Possible errors:\n' + \
                  '1. Check the shebang of %s' % which)

        return False
    except Exception as e:
        log.error('Exception (%s) occurred while setting up %s: %s' %
                  (e.__class__, name, e))
        traceback.print_exc()
        return False

    return True
Пример #6
0
    def create(self, **kwargs):
        """
        build the virtualenv
        """
        clean = kwargs.get('clean', False)
        if clean:
            self.clean(**kwargs)

        site_packages = kwargs.get('system-site-packages',
                                   self.use_sitepackages)
        upgrade = kwargs.get('upgrade', False)
        nosetupdevelop = kwargs.get('nosetupdevelop', False)
        venv = VirtualEnvironment(self.venv_path,
                                  python=self.python_bin,
                                  system_site_packages=site_packages)
        LOGGER.info("Bootstrapping virtualenv: {}".format(self.venv_path))

        venv.open_or_create()
        cmd = build_pip_command(self.config,
                                self.venv_path,
                                self.reqs_name,
                                upgrade=upgrade)

        try:
            local(cmd)
        except OSError as ex:
            msg = ("Error running pip install command during build\n"
                   "Error was {0}\n"
                   "Running command: {1}\n"
                   "Working Dir: {2}\n"
                   "Virtualenv: {3}\n"
                   "Requirements: {4}\n").format(ex, cmd, self.working_dir,
                                                 self.venv_path,
                                                 self.reqs_name)
            LOGGER.error(msg)
            raise

        for req in self.extra_reqs:
            cmd = build_pip_command(self.config,
                                    self.venv_path,
                                    req,
                                    upgrade=upgrade)
            LOGGER.info("Installing extra requirements... {}".format(cmd))
            try:
                local(cmd)
            except OSError as ex:
                msg = ("Error running pip install command extra "
                       "requirements install: {}\n{}").format(req, ex)
                LOGGER.error(msg)
                raise
        # setup for development
        if nosetupdevelop:
            msg = "skipping python setup.py develop..."
            LOGGER.info(msg)
        else:
            self.run_setup_develop()
Пример #7
0
class VirtualEnv(object):

    def __init__(self, name, temp_dir, name_convertor, base_python_version):
        self.name = name
        self.temp_dir = temp_dir
        self.name_convertor = name_convertor
        if not base_python_version:
            base_python_version = DEFAULT_PYTHON_VERSION
        python_version = 'python' + base_python_version
        self.env = VirtualEnvironment(temp_dir + '/venv', python=python_version)
        try:
            self.env.open_or_create()
        except (ve.VirtualenvCreationException, ve.VirtualenvReadonlyException):
            raise VirtualenvFailException('Failed to create virtualenv')
        self.dirs_before_install = DirsContent()
        self.dirs_after_install = DirsContent()
        self.dirs_before_install.fill(temp_dir + '/venv/')
        self.data = {}

    def install_package_to_venv(self):
        '''
        Installs package given as first argument to virtualenv without
        dependencies
        '''
        try:
            self.env.install(self.name, options=["--no-deps"])
        except (ve.PackageInstallationException, ve.VirtualenvReadonlyException):
            raise VirtualenvFailException('Failed to install package to virtualenv')
        self.dirs_after_install.fill(self.temp_dir + '/venv/')

    def get_dirs_differance(self):
        '''
        Makes final versions of site_packages and scripts using DirsContent
        sub method and filters
        '''
        try:
            diff = self.dirs_after_install - self.dirs_before_install
        except ValueError:
            raise VirtualenvFailException("Some of the DirsContent attributes is uninicialized")
        self.data['has_pth'] = any([x for x in diff.lib_sitepackages if x.endswith('.pth')])
        site_packages = site_packages_filter(diff.lib_sitepackages)
        self.data['packages'] = set([p for p in site_packages if not p.endswith(MODULE_SUFFIXES)])
        self.data['py_modules'] = set([os.path.splitext(m)[0]
                                       for m in site_packages - self.data['packages']])
        self.data['scripts'] = scripts_filter(list(diff.bindir))
        logger.debug('Data from files differance in virtualenv:')
        logger.debug(pprint.pformat(self.data))

    @property
    def get_venv_data(self):
        self.install_package_to_venv()
        self.get_dirs_differance()
        return self.data
Пример #8
0
class VirtualEnv(object):
    def __init__(self, name, temp_dir, name_convertor, base_python_version):
        self.name = name
        self.temp_dir = temp_dir
        self.name_convertor = name_convertor
        if not base_python_version:
            base_python_version = DEFAULT_PYTHON_VERSION
        python_version = "python" + base_python_version
        self.env = VirtualEnvironment(temp_dir + "/venv", python=python_version)
        try:
            self.env.open_or_create()
        except (ve.VirtualenvCreationException, ve.VirtualenvReadonlyException):
            raise VirtualenvFailException("Failed to create virtualenv")
        self.dirs_before_install = DirsContent()
        self.dirs_after_install = DirsContent()
        self.dirs_before_install.fill(temp_dir + "/venv/")
        self.data = {}

    def install_package_to_venv(self):
        """
        Installs package given as first argument to virtualenv without
        dependencies
        """
        try:
            self.env.install(self.name, options=["--no-deps"])
        except (ve.PackageInstallationException, ve.VirtualenvReadonlyException):
            raise VirtualenvFailException("Failed to install package to virtualenv")
        self.dirs_after_install.fill(self.temp_dir + "/venv/")

    @property
    def get_dirs_differance(self):
        """
        Makes final versions of site_packages and scripts using DirsContent
        sub method and filters
        """
        try:
            diff = self.dirs_after_install - self.dirs_before_install
        except ValueError:
            raise VirtualenvFailException("Some of the DirsContent attributes is uninicialized")
        site_packages = site_packages_filter(diff.lib_sitepackages)
        logger.debug("Site_packages from files differance in virtualenv: {0}.".format(site_packages))
        scripts = scripts_filter(list(diff.bindir))
        logger.debug("Scripts from files differance in virtualenv: {0}.".format(scripts))
        return (site_packages, scripts)

    @property
    def get_venv_data(self):
        self.install_package_to_venv()
        self.data["packages"], self.data["scripts"] = self.get_dirs_differance
        return self.data
Пример #9
0
class VirtualEnv(object):
    def __init__(self, name, version, temp_dir, name_convertor,
                 base_python_version):
        self.name = name
        self.version = version
        self.temp_dir = temp_dir
        self.name_convertor = name_convertor
        if not base_python_version:
            base_python_version = DEFAULT_PYTHON_VERSION
        python_version = 'python' + base_python_version
        self.env = VirtualEnvironment(temp_dir + '/venv',
                                      python=python_version)
        try:
            self.env.open_or_create()
        except (ve.VirtualenvCreationException,
                ve.VirtualenvReadonlyException):
            raise VirtualenvFailException('Failed to create virtualenv')
        self.dirs_before_install = DirsContent()
        self.dirs_after_install = DirsContent()
        self.dirs_before_install.fill(temp_dir + '/venv/')
        self.data = {}

    def install_package_to_venv(self):
        '''
        Installs package given as first argument to virtualenv without
        dependencies
        '''
        try:
            self.env.install((self.name, self.version),
                             force=True,
                             options=["--no-deps"])
        except (ve.PackageInstallationException,
                ve.VirtualenvReadonlyException):
            raise VirtualenvFailException(
                'Failed to install package to virtualenv')
        self.dirs_after_install.fill(self.temp_dir + '/venv/')

    def get_dirs_differance(self):
        '''
        Makes final versions of site_packages and scripts using DirsContent
        sub method and filters
        '''
        try:
            diff = self.dirs_after_install - self.dirs_before_install
        except ValueError:
            raise VirtualenvFailException(
                "Some of the DirsContent attributes is uninicialized")
        self.data['has_pth'] = \
            any([x for x in diff.lib_sitepackages if x.endswith('.pth')])

        site_packages = site_packages_filter(diff.lib_sitepackages)
        self.data['packages'] = sorted(
            [p for p in site_packages if not p.endswith(MODULE_SUFFIXES)])
        self.data['py_modules'] = sorted(
            set([
                os.path.splitext(m)[0]
                for m in site_packages - set(self.data['packages'])
            ]))
        self.data['scripts'] = scripts_filter(sorted(diff.bindir))
        logger.debug('Data from files differance in virtualenv:')
        logger.debug(pprint.pformat(self.data))

    @property
    def get_venv_data(self):
        self.install_package_to_venv()
        self.get_dirs_differance()
        return self.data
Пример #10
0
    def create(self, **kwargs):
        """
        build the virtualenv
        """
        clean = kwargs.get('clean', False)
        if clean:
            self.clean(**kwargs)

        site_packages = kwargs.get(
            'system-site-packages',
            self.use_sitepackages
        )
        upgrade = kwargs.get('upgrade', False)
        extras_require = kwargs.get('extras_require', [])
        all_extras = kwargs.get('all_extras', False)
        if all_extras:
            extras_require = self.config.extras_require().keys()
        nosetupdevelop = kwargs.get('nosetupdevelop', False)
        venv = VirtualEnvironment(
            self.venv_path,
            python=self.python_bin_for_venv,
            system_site_packages=site_packages
        )
        LOGGER.info("Bootstrapping virtualenv: {}".format(self.venv_path))

        venv.open_or_create()
        cmd = build_pip_command(
            self.config,
            self.venv_path,
            self.reqs_name,
            upgrade=upgrade
        )

        try:
            local(cmd)
        except OSError as ex:
            msg = (
                "Error running pip install command during build\n"
                "Error was {0}\n"
                "Running command: {1}\n"
                "Working Dir: {2}\n"
                "Virtualenv: {3}\n"
                "Requirements: {4}\n"
            ).format(ex, cmd, self.working_dir, self.venv_path, self.reqs_name)
            LOGGER.error(msg)
            raise

        for req in self.extra_reqs:
            cmd = build_pip_command(
                self.config,
                self.venv_path,
                req,
                upgrade=upgrade
            )
            LOGGER.info("Installing extra requirements... {}".format(cmd))
            try:
                local(cmd)
            except OSError as ex:
                msg = (
                    "Error running pip install command extra "
                    "requirements install: {}\n{}"
                ).format(req, ex)
                LOGGER.error(msg)
                raise
        # setup for development
        if nosetupdevelop:
            msg = "skipping python setup.py develop..."
            LOGGER.info(msg)
        else:
            self.run_setup_develop()
            if extras_require:
                for extra in extras_require:
                    self._install_extras(extra)