Let us walk on the 3-isogeny graph
Loading...
Searching...
No Matches
pip._internal.operations.check Namespace Reference

Data Structures

class  PackageDetails
 

Functions

Tuple[PackageSet, bool] create_package_set_from_installed ()
 
CheckResult check_package_set (PackageSet package_set, Optional[Callable[[str], bool]] should_ignore=None)
 
ConflictDetails check_install_conflicts (List[InstallRequirement] to_install)
 
Set[NormalizedName] _simulate_installation_of (List[InstallRequirement] to_install, PackageSet package_set)
 
Set[NormalizedName] _create_whitelist (Set[NormalizedName] would_be_installed, PackageSet package_set)
 
None warn_legacy_versions_and_specifiers (PackageSet package_set)
 

Variables

 logger = logging.getLogger(__name__)
 
 PackageSet = Dict[NormalizedName, PackageDetails]
 
 Missing = Tuple[NormalizedName, Requirement]
 
 Conflicting = Tuple[NormalizedName, DistributionVersion, Requirement]
 
 MissingDict = Dict[NormalizedName, List[Missing]]
 
 ConflictingDict = Dict[NormalizedName, List[Conflicting]]
 
 CheckResult = Tuple[MissingDict, ConflictingDict]
 
 ConflictDetails = Tuple[PackageSet, CheckResult]
 

Detailed Description

Validation of dependencies of packages

Function Documentation

◆ _create_whitelist()

Set[NormalizedName] _create_whitelist ( Set[NormalizedName]  would_be_installed,
PackageSet   package_set 
)
protected

Definition at line 140 of file check.py.

142) -> Set[NormalizedName]:
143 packages_affected = set(would_be_installed)
144
145 for package_name in package_set:
146 if package_name in packages_affected:
147 continue
148
149 for req in package_set[package_name].dependencies:
150 if canonicalize_name(req.name) in packages_affected:
151 packages_affected.add(package_name)
152 break
153
154 return packages_affected
155
156
for i

References i.

Referenced by pip._internal.operations.check.check_install_conflicts().

Here is the caller graph for this function:

◆ _simulate_installation_of()

Set[NormalizedName] _simulate_installation_of ( List[InstallRequirement to_install,
PackageSet   package_set 
)
protected
Computes the version of packages after installing to_install.

Definition at line 121 of file check.py.

123) -> Set[NormalizedName]:
124 """Computes the version of packages after installing to_install."""
125 # Keep track of packages that were installed
126 installed = set()
127
128 # Modify it as installing requirement_set would (assuming no errors)
129 for inst_req in to_install:
130 abstract_dist = make_distribution_for_install_requirement(inst_req)
133 package_set[name] = PackageDetails(dist.version, list(dist.iter_dependencies()))
134
135 installed.add(name)
136
137 return installed
138
139

References i.

Referenced by pip._internal.operations.check.check_install_conflicts().

Here is the caller graph for this function:

◆ check_install_conflicts()

ConflictDetails check_install_conflicts ( List[InstallRequirement to_install)
For checking if the dependency graph would be consistent after \
installing given requirements

Definition at line 101 of file check.py.

101def check_install_conflicts(to_install: List[InstallRequirement]) -> ConflictDetails:
102 """For checking if the dependency graph would be consistent after \
103 installing given requirements
104 """
105 # Start from the current state
106 package_set, _ = create_package_set_from_installed()
107 # Install packages
108 would_be_installed = _simulate_installation_of(to_install, package_set)
109
110 # Only warn about directly-dependent packages; create a whitelist of them
111 whitelist = _create_whitelist(would_be_installed, package_set)
112
113 return (
114 package_set,
115 check_package_set(
116 package_set, should_ignore=lambda name: name not in whitelist
117 ),
118 )
119
120

References pip._internal.operations.check._create_whitelist(), pip._internal.operations.check._simulate_installation_of(), and pip._internal.operations.check.create_package_set_from_installed().

Here is the call graph for this function:

◆ check_package_set()

CheckResult check_package_set ( PackageSet  package_set,
Optional[Callable[[str], bool]]   should_ignore = None 
)
Check if a package set is consistent

If should_ignore is passed, it should be a callable that takes a
package name and returns a boolean.

Definition at line 54 of file check.py.

56) -> CheckResult:
57 """Check if a package set is consistent
58
59 If should_ignore is passed, it should be a callable that takes a
60 package name and returns a boolean.
61 """
62
63 warn_legacy_versions_and_specifiers(package_set)
64
65 missing = {}
66 conflicting = {}
67
68 for package_name, package_detail in package_set.items():
69 # Info about dependencies of package_name
70 missing_deps: Set[Missing] = set()
71 conflicting_deps: Set[Conflicting] = set()
72
73 if should_ignore and should_ignore(package_name):
74 continue
75
77 name = canonicalize_name(req.name)
78
79 # Check if it's missing
80 if name not in package_set:
81 missed = True
82 if req.marker is not None:
83 missed = req.marker.evaluate({"extra": ""})
84 if missed:
85 missing_deps.add((name, req))
86 continue
87
88 # Check if there's a conflict
89 version = package_set[name].version
90 if not req.specifier.contains(version, prereleases=True):
91 conflicting_deps.add((name, version, req))
92
93 if missing_deps:
94 missing[package_name] = sorted(missing_deps, key=str)
95 if conflicting_deps:
96 conflicting[package_name] = sorted(conflicting_deps, key=str)
97
98 return missing, conflicting
99
100

References i.

◆ create_package_set_from_installed()

Tuple[PackageSet, bool] create_package_set_from_installed ( )
Converts a list of distributions into a PackageSet.

Definition at line 37 of file check.py.

37def create_package_set_from_installed() -> Tuple[PackageSet, bool]:
38 """Converts a list of distributions into a PackageSet."""
39 package_set = {}
40 problems = False
41 env = get_default_environment()
42 for dist in env.iter_installed_distributions(local_only=False, skip=()):
44 try:
45 dependencies = list(dist.iter_dependencies())
46 package_set[name] = PackageDetails(dist.version, dependencies)
47 except (OSError, ValueError) as e:
48 # Don't crash on unreadable or broken metadata.
49 logger.warning("Error parsing requirements for %s: %s", name, e)
50 problems = True
51 return package_set, problems
52
53

References i.

Referenced by pip._internal.operations.check.check_install_conflicts().

Here is the caller graph for this function:

◆ warn_legacy_versions_and_specifiers()

None warn_legacy_versions_and_specifiers ( PackageSet  package_set)

Definition at line 157 of file check.py.

157def warn_legacy_versions_and_specifiers(package_set: PackageSet) -> None:
158 for project_name, package_details in package_set.items():
159 if isinstance(package_details.version, LegacyVersion):
160 deprecated(
161 reason=(
162 f"{project_name} {package_details.version} "
163 f"has a non-standard version number."
164 ),
165 replacement=(
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"
169 ),
170 issue=12063,
171 gone_in="23.3",
172 )
174 if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier):
175 deprecated(
176 reason=(
177 f"{project_name} {package_details.version} "
178 f"has a non-standard dependency specifier {dep}."
179 ),
180 replacement=(
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"
184 ),
185 issue=12063,
186 gone_in="23.3",
187 )

References i.

Variable Documentation

◆ CheckResult

CheckResult = Tuple[MissingDict, ConflictingDict]

Definition at line 33 of file check.py.

◆ ConflictDetails

ConflictDetails = Tuple[PackageSet, CheckResult]

Definition at line 34 of file check.py.

◆ Conflicting

Conflicting = Tuple[NormalizedName, DistributionVersion, Requirement]

Definition at line 29 of file check.py.

◆ ConflictingDict

ConflictingDict = Dict[NormalizedName, List[Conflicting]]

Definition at line 32 of file check.py.

◆ logger

logger = logging.getLogger(__name__)

Definition at line 18 of file check.py.

◆ Missing

Missing = Tuple[NormalizedName, Requirement]

Definition at line 28 of file check.py.

◆ MissingDict

MissingDict = Dict[NormalizedName, List[Missing]]

Definition at line 31 of file check.py.

◆ PackageSet

PackageSet = Dict[NormalizedName, PackageDetails]

Definition at line 27 of file check.py.