def test_installed_files_tracking(self): """ Verify that tracking of installed files works correctly. This tests the :py:func:`~pip_accel.bdist.BinaryDistributionManager.update_installed_files()` method. When pip installs a Python package it also creates a file called ``installed-files.txt`` that contains the pathnames of the files that were installed. This file enables pip to uninstall Python packages later on. Because pip-accel implements its own package installation it also creates the ``installed-files.txt`` file, in order to enable the user to uninstall a package with pip even if the package was installed using pip-accel. """ # Prevent unsuspecting users from accidentally running the find_files() # tests below on their complete `/usr' or `/usr/local' tree :-). if not hasattr(sys, 'real_prefix'): logger.warning("Skipping installed files tracking test (not running in a recognized virtual environment).") return # Install the iPython 1.0 source distribution using pip. command = InstallCommand() opts, args = command.parse_args([ '--ignore-installed', '--no-use-wheel', 'ipython==1.0' ]) command.run(opts, args) # Make sure the iPython program works after installation using pip. try_program('ipython3' if sys.version_info[0] == 3 else 'ipython') # Find the iPython related files installed by pip. files_installed_using_pip = set(find_files(sys.prefix, 'ipython')) assert len(files_installed_using_pip) > 0, \ "It looks like pip didn't install iPython where we expected it to do so?!" logger.debug("Found %i files installed using pip: %s", len(files_installed_using_pip), files_installed_using_pip) # Remove the iPython installation. uninstall('ipython') # Install the iPython 1.0 source distribution using pip-accel. accelerator = self.initialize_pip_accel() num_installed = accelerator.install_from_arguments([ '--ignore-installed', '--no-use-wheel', 'ipython==1.0' ]) assert num_installed == 1, "Expected pip-accel to install exactly one package!" # Make sure the iPython program works after installation using pip-accel. try_program('ipython3' if sys.version_info[0] == 3 else 'ipython') # Find the iPython related files installed by pip-accel. files_installed_using_pip_accel = set(find_files(sys.prefix, 'ipython')) assert len(files_installed_using_pip_accel) > 0, \ "It looks like pip-accel didn't install iPython where we expected it to do so?!" logger.debug("Found %i files installed using pip-accel: %s", len(files_installed_using_pip_accel), files_installed_using_pip_accel) # Test that pip and pip-accel installed exactly the same files. assert files_installed_using_pip == files_installed_using_pip_accel, \ "It looks like pip and pip-accel installed different files for iPython!" # Test that pip knows how to uninstall iPython installed by pip-accel # due to the installed-files.txt file generated by pip-accel. uninstall('ipython') # Make sure all files related to iPython were uninstalled by pip. assert len(list(find_files(sys.prefix, 'ipython'))) == 0, \ "It looks like pip didn't properly uninstall iPython after installation using pip-accel!"
def install_requirements(self, requirements, **kw): """ Manually install a requirement set from binary and/or wheel distributions. :param requirements: A list of :class:`pip_accel.req.Requirement` objects. :param kw: Any keyword arguments are passed on to :func:`~pip_accel.bdist.BinaryDistributionManager.install_binary_dist()`. :returns: The number of packages that were just installed (an integer). """ install_timer = Timer() install_types = [] if any(not req.is_wheel for req in requirements): install_types.append('binary') if any(req.is_wheel for req in requirements): install_types.append('wheel') logger.info("Installing from %s distributions ..", concatenate(install_types)) # Track installed files by default (unless the caller specifically opted out). kw.setdefault('track_installed_files', True) num_installed = 0 for requirement in requirements: # If we're upgrading over an older version, first remove the # old version to make sure we don't leave files from old # versions around. if is_installed(requirement.name): uninstall(requirement.name) # When installing setuptools we need to uninstall distribute, # otherwise distribute will shadow setuptools and all sorts of # strange issues can occur (e.g. upgrading to the latest # setuptools to gain wheel support and then having everything # blow up because distribute doesn't know about wheels). if requirement.name == 'setuptools' and is_installed('distribute'): uninstall('distribute') if requirement.is_editable: logger.debug("Installing %s in editable form using pip.", requirement) command = InstallCommand() opts, args = command.parse_args( ['--no-deps', '--editable', requirement.source_directory]) command.run(opts, args) elif requirement.is_wheel: logger.info("Installing %s wheel distribution using pip ..", requirement) wheel_version = pip_wheel_module.wheel_version( requirement.source_directory) pip_wheel_module.check_compatibility(wheel_version, requirement.name) requirement.pip_requirement.move_wheel_files( requirement.source_directory) else: binary_distribution = self.bdists.get_binary_dist(requirement) self.bdists.install_binary_dist(binary_distribution, **kw) num_installed += 1 logger.info("Finished installing %s in %s.", pluralize(num_installed, "requirement"), install_timer) return num_installed
def install_requirements(self, requirements, **kw): """ Manually install a requirement set from binary and/or wheel distributions. :param requirements: A list of :class:`pip_accel.req.Requirement` objects. :param kw: Any keyword arguments are passed on to :func:`~pip_accel.bdist.BinaryDistributionManager.install_binary_dist()`. :returns: The number of packages that were just installed (an integer). """ install_timer = Timer() install_types = [] if any(not req.is_wheel for req in requirements): install_types.append('binary') if any(req.is_wheel for req in requirements): install_types.append('wheel') logger.info("Installing from %s distributions ..", concatenate(install_types)) # Track installed files by default (unless the caller specifically opted out). kw.setdefault('track_installed_files', True) num_installed = 0 for requirement in requirements: # If we're upgrading over an older version, first remove the # old version to make sure we don't leave files from old # versions around. if is_installed(requirement.name): uninstall(requirement.name) # When installing setuptools we need to uninstall distribute, # otherwise distribute will shadow setuptools and all sorts of # strange issues can occur (e.g. upgrading to the latest # setuptools to gain wheel support and then having everything # blow up because distribute doesn't know about wheels). if requirement.name == 'setuptools' and is_installed('distribute'): uninstall('distribute') if requirement.is_editable: logger.debug("Installing %s in editable form using pip.", requirement) command = InstallCommand() opts, args = command.parse_args(['--no-deps', '--editable', requirement.source_directory]) command.run(opts, args) elif requirement.is_wheel: logger.info("Installing %s wheel distribution using pip ..", requirement) wheel_version = pip_wheel_module.wheel_version(requirement.source_directory) pip_wheel_module.check_compatibility(wheel_version, requirement.name) requirement.pip_requirement.move_wheel_files(requirement.source_directory) else: binary_distribution = self.bdists.get_binary_dist(requirement) self.bdists.install_binary_dist(binary_distribution, **kw) num_installed += 1 logger.info("Finished installing %s in %s.", pluralize(num_installed, "requirement"), install_timer) return num_installed