Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
news
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Sartika Aritonang
news
Commits
88c9adf2
Commit
88c9adf2
authored
May 29, 2020
by
Sartika Aritonang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upload New File
parent
13802d72
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
163 additions
and
0 deletions
+163
-0
check.py
stbi/Lib/site-packages/pip/_internal/operations/check.py
+163
-0
No files found.
stbi/Lib/site-packages/pip/_internal/operations/check.py
0 → 100644
View file @
88c9adf2
"""Validation of dependencies of packages
"""
# The following comment should be removed at some point in the future.
# mypy: strict-optional=False
# mypy: disallow-untyped-defs=False
import
logging
from
collections
import
namedtuple
from
pip._vendor.packaging.utils
import
canonicalize_name
from
pip._vendor.pkg_resources
import
RequirementParseError
from
pip._internal.distributions
import
(
make_distribution_for_install_requirement
,
)
from
pip._internal.utils.misc
import
get_installed_distributions
from
pip._internal.utils.typing
import
MYPY_CHECK_RUNNING
logger
=
logging
.
getLogger
(
__name__
)
if
MYPY_CHECK_RUNNING
:
from
pip._internal.req.req_install
import
InstallRequirement
from
typing
import
(
Any
,
Callable
,
Dict
,
Optional
,
Set
,
Tuple
,
List
)
# Shorthands
PackageSet
=
Dict
[
str
,
'PackageDetails'
]
Missing
=
Tuple
[
str
,
Any
]
Conflicting
=
Tuple
[
str
,
str
,
Any
]
MissingDict
=
Dict
[
str
,
List
[
Missing
]]
ConflictingDict
=
Dict
[
str
,
List
[
Conflicting
]]
CheckResult
=
Tuple
[
MissingDict
,
ConflictingDict
]
PackageDetails
=
namedtuple
(
'PackageDetails'
,
[
'version'
,
'requires'
])
def
create_package_set_from_installed
(
**
kwargs
):
# type: (**Any) -> Tuple[PackageSet, bool]
"""Converts a list of distributions into a PackageSet.
"""
# Default to using all packages installed on the system
if
kwargs
==
{}:
kwargs
=
{
"local_only"
:
False
,
"skip"
:
()}
package_set
=
{}
problems
=
False
for
dist
in
get_installed_distributions
(
**
kwargs
):
name
=
canonicalize_name
(
dist
.
project_name
)
try
:
package_set
[
name
]
=
PackageDetails
(
dist
.
version
,
dist
.
requires
())
except
RequirementParseError
as
e
:
# Don't crash on broken metadata
logger
.
warning
(
"Error parsing requirements for
%
s:
%
s"
,
name
,
e
)
problems
=
True
return
package_set
,
problems
def
check_package_set
(
package_set
,
should_ignore
=
None
):
# type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult
"""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.
"""
if
should_ignore
is
None
:
def
should_ignore
(
name
):
return
False
missing
=
{}
conflicting
=
{}
for
package_name
in
package_set
:
# Info about dependencies of package_name
missing_deps
=
set
()
# type: Set[Missing]
conflicting_deps
=
set
()
# type: Set[Conflicting]
if
should_ignore
(
package_name
):
continue
for
req
in
package_set
[
package_name
]
.
requires
:
name
=
canonicalize_name
(
req
.
project_name
)
# type: str
# Check if it's missing
if
name
not
in
package_set
:
missed
=
True
if
req
.
marker
is
not
None
:
missed
=
req
.
marker
.
evaluate
()
if
missed
:
missing_deps
.
add
((
name
,
req
))
continue
# Check if there's a conflict
version
=
package_set
[
name
]
.
version
# type: str
if
not
req
.
specifier
.
contains
(
version
,
prereleases
=
True
):
conflicting_deps
.
add
((
name
,
version
,
req
))
if
missing_deps
:
missing
[
package_name
]
=
sorted
(
missing_deps
,
key
=
str
)
if
conflicting_deps
:
conflicting
[
package_name
]
=
sorted
(
conflicting_deps
,
key
=
str
)
return
missing
,
conflicting
def
check_install_conflicts
(
to_install
):
# type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult]
"""For checking if the dependency graph would be consistent after
\
installing given requirements
"""
# Start from the current state
package_set
,
_
=
create_package_set_from_installed
()
# Install packages
would_be_installed
=
_simulate_installation_of
(
to_install
,
package_set
)
# Only warn about directly-dependent packages; create a whitelist of them
whitelist
=
_create_whitelist
(
would_be_installed
,
package_set
)
return
(
package_set
,
check_package_set
(
package_set
,
should_ignore
=
lambda
name
:
name
not
in
whitelist
)
)
def
_simulate_installation_of
(
to_install
,
package_set
):
# type: (List[InstallRequirement], PackageSet) -> Set[str]
"""Computes the version of packages after installing to_install.
"""
# Keep track of packages that were installed
installed
=
set
()
# Modify it as installing requirement_set would (assuming no errors)
for
inst_req
in
to_install
:
abstract_dist
=
make_distribution_for_install_requirement
(
inst_req
)
dist
=
abstract_dist
.
get_pkg_resources_distribution
()
name
=
canonicalize_name
(
dist
.
key
)
package_set
[
name
]
=
PackageDetails
(
dist
.
version
,
dist
.
requires
())
installed
.
add
(
name
)
return
installed
def
_create_whitelist
(
would_be_installed
,
package_set
):
# type: (Set[str], PackageSet) -> Set[str]
packages_affected
=
set
(
would_be_installed
)
for
package_name
in
package_set
:
if
package_name
in
packages_affected
:
continue
for
req
in
package_set
[
package_name
]
.
requires
:
if
canonicalize_name
(
req
.
name
)
in
packages_affected
:
packages_affected
.
add
(
package_name
)
break
return
packages_affected
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment