1"""Validation of dependencies of packages
5from typing
import Callable, Dict, List, NamedTuple, Optional, Set, Tuple
22 version: DistributionVersion
23 dependencies: List[Requirement]
27PackageSet = Dict[NormalizedName, PackageDetails]
28Missing = Tuple[NormalizedName, Requirement]
29Conflicting = Tuple[NormalizedName, DistributionVersion, Requirement]
31MissingDict = Dict[NormalizedName, List[Missing]]
32ConflictingDict = Dict[NormalizedName, List[Conflicting]]
33CheckResult = Tuple[MissingDict, ConflictingDict]
34ConflictDetails = Tuple[PackageSet, CheckResult]
38 """Converts a list of distributions into a PackageSet."""
41 env = get_default_environment()
47 except (OSError, ValueError)
as e:
51 return package_set, problems
55 package_set: PackageSet, should_ignore: Optional[Callable[[str], bool]] =
None
57 """Check if a package set is consistent
59 If should_ignore is passed, it should be a callable that takes a
60 package name and returns a boolean.
63 warn_legacy_versions_and_specifiers(package_set)
70 missing_deps: Set[Missing] = set()
71 conflicting_deps: Set[Conflicting] = set()
80 if name
not in package_set:
89 version = package_set[name].version
94 missing[package_name] = sorted(missing_deps, key=str)
96 conflicting[package_name] = sorted(conflicting_deps, key=str)
98 return missing, conflicting
101def check_install_conflicts(to_install: List[InstallRequirement]) -> ConflictDetails:
102 """For checking if the dependency graph would be consistent after \
103 installing given requirements
116 package_set, should_ignore=
lambda name: name
not in whitelist
122 to_install: List[InstallRequirement], package_set: PackageSet
123) -> Set[NormalizedName]:
124 """Computes the version of packages after installing to_install."""
129 for inst_req
in to_install:
130 abstract_dist = make_distribution_for_install_requirement(inst_req)
141 would_be_installed: Set[NormalizedName], package_set: PackageSet
142) -> Set[NormalizedName]:
143 packages_affected = set(would_be_installed)
145 for package_name
in package_set:
146 if package_name
in packages_affected:
149 for req
in package_set[package_name].dependencies:
150 if canonicalize_name(
req.name)
in packages_affected:
154 return packages_affected
157def warn_legacy_versions_and_specifiers(package_set: PackageSet) ->
None:
162 f
"{project_name} {package_details.version} "
163 f
"has a non-standard version number."
166 f
"to upgrade to a newer version of {project_name} "
167 f
"or contact the author to suggest that they "
168 f
"release a version with a conforming version number"
177 f
"{project_name} {package_details.version} "
178 f
"has a non-standard dependency specifier {dep}."
181 f
"to upgrade to a newer version of {project_name} "
182 f
"or contact the author to suggest that they "
183 f
"release a version with a conforming dependency specifiers"
Set[NormalizedName] _simulate_installation_of(List[InstallRequirement] to_install, PackageSet package_set)
Set[NormalizedName] _create_whitelist(Set[NormalizedName] would_be_installed, PackageSet package_set)
Tuple[PackageSet, bool] create_package_set_from_installed()