def prepare(project, logger): target_directory = project.expand_path("$dir_target") if not os.path.exists(target_directory): logger.debug("Creating target directory %s", target_directory) os.mkdir(target_directory) reports_directory = project.expand_path("$dir_reports") if not os.path.exists(reports_directory): logger.debug("Creating reports directory %s", reports_directory) os.mkdir(reports_directory) plugin_dependency_versions = get_package_version(project.plugin_dependencies, logger) for plugin_dependency in project.plugin_dependencies: logger.debug("Processing plugin dependency %s" % plugin_dependency) if plugin_dependency.name.lower() not in plugin_dependency_versions or not \ version_satisfies_spec(plugin_dependency.version, plugin_dependency_versions[plugin_dependency.name.lower()]): logger.info("Installing plugin dependency %s" % plugin_dependency) log_file = project.expand_path("$dir_reports", safe_log_file_name("dependency_%s_install.log" % plugin_dependency)) pip_install(as_pip_install_target(plugin_dependency), index_url=project.get_property("install_dependencies_index_url"), extra_index_url=project.get_property("install_dependencies_extra_index_url"), verbose=project.get_property("verbose"), logger=logger, force_reinstall=plugin_dependency.url is not None, outfile_name=log_file, error_file_name=log_file)
def prepare(project, logger): target_directory = project.expand_path("$dir_target") if not os.path.exists(target_directory): logger.debug("Creating target directory %s", target_directory) os.mkdir(target_directory) reports_directory = project.expand_path("$dir_reports") if not os.path.exists(reports_directory): logger.debug("Creating reports directory %s", reports_directory) os.mkdir(reports_directory) plugin_dependency_versions = get_package_version( project.plugin_dependencies, logger) for plugin_dependency in project.plugin_dependencies: logger.debug("Processing plugin dependency %s" % plugin_dependency) if plugin_dependency.name.lower() not in plugin_dependency_versions or not \ version_satisfies_spec(plugin_dependency.version, plugin_dependency_versions[plugin_dependency.name.lower()]): logger.info("Installing plugin dependency %s" % plugin_dependency) log_file = project.expand_path( "$dir_reports", safe_log_file_name("dependency_%s_install.log" % plugin_dependency)) pip_install(as_pip_install_target(plugin_dependency), index_url=project.get_property( "install_dependencies_index_url"), extra_index_url=project.get_property( "install_dependencies_extra_index_url"), verbose=project.get_property("verbose"), logger=logger, force_reinstall=plugin_dependency.url is not None, outfile_name=log_file, error_file_name=log_file)
def test_get_package_version(self): # Single item self.assertTrue(pip_utils.version_satisfies_spec(">=7.0", pip_utils.get_package_version("pip")["pip"])) self.assertTrue( "this package does not exist" not in pip_utils.get_package_version("this package does not exist")) self.assertTrue("blah" not in pip_utils.get_package_version(core.RequirementsFile("blah"))) self.assertTrue("blah" not in pip_utils.get_package_version(core.Dependency("blah", url="fake url"))) # Multiple different items multiple_different_items = pip_utils.get_package_version( ["pip", core.Dependency("wheel"), core.RequirementsFile("blah")]) self.assertTrue("pip" in multiple_different_items) self.assertTrue("wheel" in multiple_different_items) self.assertTrue("blah" not in multiple_different_items) # Multiple identical items multiple_identical_items = pip_utils.get_package_version( ["pip", core.Dependency("pip")]) self.assertTrue("pip" in multiple_identical_items) self.assertEqual(len(multiple_identical_items), 1) # Validate case lower_case_packages = pip_utils.get_package_version("PiP") self.assertTrue("pip" in lower_case_packages) self.assertTrue("pIp" not in lower_case_packages) self.assertTrue("PiP" not in lower_case_packages)
def test_get_package_version(self): # Single item self.assertTrue(pip_utils.version_satisfies_spec(">=7.0", pip_utils.get_package_version("pip")["pip"])) self.assertTrue( "this package does not exist" not in pip_utils.get_package_version("this package does not exist")) self.assertTrue("blah" not in pip_utils.get_package_version(core.RequirementsFile("blah"))) self.assertTrue("blah" not in pip_utils.get_package_version(core.Dependency("blah", url="fake url"))) # Multiple different items multiple_different_items = pip_utils.get_package_version( ["pip", core.Dependency("wheel"), core.RequirementsFile("blah")]) self.assertTrue("pip" in multiple_different_items) self.assertTrue("wheel" in multiple_different_items) self.assertTrue("blah" not in multiple_different_items) # Multiple identical items multiple_identical_items = pip_utils.get_package_version( ["pip", core.Dependency("pip")]) self.assertTrue("pip" in multiple_identical_items) self.assertEquals(len(multiple_identical_items), 1) # Validate case lower_case_packages = pip_utils.get_package_version("PiP") self.assertTrue("pip" in lower_case_packages) self.assertTrue("pIp" not in lower_case_packages) self.assertTrue("PiP" not in lower_case_packages)
def _filter_dependencies(logger, project, dependencies): dependencies = as_list(dependencies) installed_packages = get_package_version(dependencies) dependencies_to_install = [] for dependency in dependencies: logger.debug("Inspecting dependency '%s'" % dependency) if isinstance(dependency, RequirementsFile): # Always add requirement file-based dependencies logger.debug( "Dependency '%s' is a requirement file and will be included" % dependency) dependencies_to_install.append(dependency) continue elif isinstance(dependency, Dependency): if dependency.url: # Always add dependency that is url-based logger.debug( "Dependency '%s' is URL-based and will be included" % dependency) dependencies_to_install.append(dependency) continue if should_update_package(dependency.version) and not getattr( dependency, "version_not_a_spec", False): # Always add dependency that has a version specifier indicating desire to always update logger.debug( "Dependency '%s' has a non-exact version specifier and will be included" % dependency) dependencies_to_install.append(dependency) continue dependency_name = dependency.name.lower() if dependency_name not in installed_packages: # If dependency not installed at all then install it logger.debug( "Dependency '%s' is not installed and will be included" % dependency) dependencies_to_install.append(dependency) continue if dependency.version and not version_satisfies_spec( dependency.version, installed_packages[dependency_name]): # If version is specified and version constraint is not satisfied logger.debug( "Dependency '%s' is not satisfied by installed dependency version '%s' and will be included" % (dependency, installed_packages[dependency_name])) dependencies_to_install.append(dependency) continue logger.debug( "Dependency '%s' is already up-to-date and will be skipped" % dependency) return dependencies_to_install, installed_packages
def prepare(project, logger): target_directory = project.expand_path("$dir_target") if not os.path.exists(target_directory): logger.debug("Creating target directory %s", target_directory) os.mkdir(target_directory) reports_directory = project.expand_path("$dir_reports") if not os.path.exists(reports_directory): logger.debug("Creating reports directory %s", reports_directory) os.mkdir(reports_directory) plugin_dependency_versions = pip_utils.get_package_version( project.plugin_dependencies, logger) for plugin_dependency in project.plugin_dependencies: logger.debug("Processing plugin dependency %s" % plugin_dependency) dependency_name = plugin_dependency.name.lower() no_version_installed = dependency_name not in plugin_dependency_versions if not no_version_installed: version_satisfies = pip_utils.version_satisfies_spec( plugin_dependency.version, plugin_dependency_versions[dependency_name]) if no_version_installed or not version_satisfies: logger.info("Installing plugin dependency %s" % plugin_dependency) log_file = project.expand_path( "$dir_reports", safe_log_file_name("dependency_%s_install.log" % plugin_dependency)) install_targets = pip_utils.as_pip_install_target( plugin_dependency) result = pip_utils.pip_install( install_targets=install_targets, index_url=project.get_property( "install_dependencies_index_url"), extra_index_url=project.get_property( "install_dependencies_extra_index_url"), verbose=project.get_property("verbose"), logger=logger, force_reinstall=plugin_dependency.url is not None, outfile_name=log_file, error_file_name=log_file) if result: log_lines = list(tail(log_file)) log = log_lines[-1] if not project.get_property( "debug") else "\n".join(log_lines) if no_version_installed: raise MissingPluginDependencyException( ",".join(install_targets), log) else: logger.error("Failed to install '%s':\n%s", plugin_dependency, log)
def _filter_dependencies(logger, project, dependencies): dependencies = as_list(dependencies) installed_packages = pip_utils.get_package_version(dependencies) dependencies_to_install = [] dependency_constraints = [] for dependency in dependencies: logger.debug("Inspecting dependency '%s'" % dependency) if isinstance(dependency, RequirementsFile): # Always add requirement file-based dependencies logger.debug("Dependency '%s' is a requirement file and will be included" % dependency) dependencies_to_install.append(dependency) continue elif isinstance(dependency, Dependency): if dependency.version: dependency_constraints.append(dependency) logger.debug( "Dependency '%s' is added to the list of installation constraints" % dependency) if dependency.url: # Always add dependency that is url-based logger.debug("Dependency '%s' is URL-based and will be included" % dependency) dependencies_to_install.append(dependency) continue if pip_utils.should_update_package(dependency.version) \ and not getattr(dependency, "version_not_a_spec", False): # Always add dependency that has a version specifier indicating desire to always update logger.debug("Dependency '%s' has a non-exact version specifier and will be included" % dependency) dependencies_to_install.append(dependency) continue dependency_name = dependency.name.lower() if dependency_name not in installed_packages: # If dependency not installed at all then install it logger.debug("Dependency '%s' is not installed and will be included" % dependency) dependencies_to_install.append(dependency) continue if dependency.version \ and not pip_utils.version_satisfies_spec(dependency.version, installed_packages[dependency_name]): # If version is specified and version constraint is not satisfied logger.debug("Dependency '%s' is not satisfied by installed dependency version '%s' and will be included" % (dependency, installed_packages[dependency_name])) dependencies_to_install.append(dependency) continue logger.debug("Dependency '%s' is already up-to-date and will be skipped" % dependency) return dependencies_to_install, installed_packages, dependency_constraints