Skip to content
GitLab
Explore
Sign in
Hide whitespace changes
Inline
Side-by-side
Some changes are not shown.
For a faster browsing experience, only
20 of 348+
files are shown.
server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/help.py
deleted
100644 → 0
View file @
03bf2ef9
from
optparse
import
Values
from
typing
import
List
from
pip._internal.cli.base_command
import
Command
from
pip._internal.cli.status_codes
import
SUCCESS
from
pip._internal.exceptions
import
CommandError
class
HelpCommand
(
Command
):
"""
Show help for commands
"""
usage
=
"""
%prog <command>
"""
ignore_require_venv
=
True
def
run
(
self
,
options
:
Values
,
args
:
List
[
str
])
->
int
:
from
pip._internal.commands
import
(
commands_dict
,
create_command
,
get_similar_commands
,
)
try
:
# 'pip help' with no args is handled by pip.__init__.parseopt()
cmd_name
=
args
[
0
]
# the command we need help for
except
IndexError
:
return
SUCCESS
if
cmd_name
not
in
commands_dict
:
guess
=
get_similar_commands
(
cmd_name
)
msg
=
[
f
'
unknown command
"
{
cmd_name
}
"'
]
if
guess
:
msg
.
append
(
f
'
maybe you meant
"
{
guess
}
"'
)
raise
CommandError
(
"
-
"
.
join
(
msg
))
command
=
create_command
(
cmd_name
)
command
.
parser
.
print_help
()
return
SUCCESS
server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/index.py
deleted
100644 → 0
View file @
03bf2ef9
import
logging
from
optparse
import
Values
from
typing
import
Any
,
Iterable
,
List
,
Optional
,
Union
from
pip._vendor.packaging.version
import
LegacyVersion
,
Version
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.req_command
import
IndexGroupCommand
from
pip._internal.cli.status_codes
import
ERROR
,
SUCCESS
from
pip._internal.commands.search
import
print_dist_installation_info
from
pip._internal.exceptions
import
CommandError
,
DistributionNotFound
,
PipError
from
pip._internal.index.collector
import
LinkCollector
from
pip._internal.index.package_finder
import
PackageFinder
from
pip._internal.models.selection_prefs
import
SelectionPreferences
from
pip._internal.models.target_python
import
TargetPython
from
pip._internal.network.session
import
PipSession
from
pip._internal.utils.misc
import
write_output
logger
=
logging
.
getLogger
(
__name__
)
class
IndexCommand
(
IndexGroupCommand
):
"""
Inspect information available from package indexes.
"""
ignore_require_venv
=
True
usage
=
"""
%prog versions <package>
"""
def
add_options
(
self
)
->
None
:
cmdoptions
.
add_target_python_options
(
self
.
cmd_opts
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
ignore_requires_python
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
pre
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
no_binary
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
only_binary
())
index_opts
=
cmdoptions
.
make_option_group
(
cmdoptions
.
index_group
,
self
.
parser
,
)
self
.
parser
.
insert_option_group
(
0
,
index_opts
)
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
def
run
(
self
,
options
:
Values
,
args
:
List
[
str
])
->
int
:
handlers
=
{
"
versions
"
:
self
.
get_available_package_versions
,
}
logger
.
warning
(
"
pip index is currently an experimental command.
"
"
It may be removed/changed in a future release
"
"
without prior warning.
"
)
# Determine action
if
not
args
or
args
[
0
]
not
in
handlers
:
logger
.
error
(
"
Need an action (%s) to perform.
"
,
"
,
"
.
join
(
sorted
(
handlers
)),
)
return
ERROR
action
=
args
[
0
]
# Error handling happens here, not in the action-handlers.
try
:
handlers
[
action
](
options
,
args
[
1
:])
except
PipError
as
e
:
logger
.
error
(
e
.
args
[
0
])
return
ERROR
return
SUCCESS
def
_build_package_finder
(
self
,
options
:
Values
,
session
:
PipSession
,
target_python
:
Optional
[
TargetPython
]
=
None
,
ignore_requires_python
:
Optional
[
bool
]
=
None
,
)
->
PackageFinder
:
"""
Create a package finder appropriate to the index command.
"""
link_collector
=
LinkCollector
.
create
(
session
,
options
=
options
)
# Pass allow_yanked=False to ignore yanked versions.
selection_prefs
=
SelectionPreferences
(
allow_yanked
=
False
,
allow_all_prereleases
=
options
.
pre
,
ignore_requires_python
=
ignore_requires_python
,
)
return
PackageFinder
.
create
(
link_collector
=
link_collector
,
selection_prefs
=
selection_prefs
,
target_python
=
target_python
,
)
def
get_available_package_versions
(
self
,
options
:
Values
,
args
:
List
[
Any
])
->
None
:
if
len
(
args
)
!=
1
:
raise
CommandError
(
"
You need to specify exactly one argument
"
)
target_python
=
cmdoptions
.
make_target_python
(
options
)
query
=
args
[
0
]
with
self
.
_build_session
(
options
)
as
session
:
finder
=
self
.
_build_package_finder
(
options
=
options
,
session
=
session
,
target_python
=
target_python
,
ignore_requires_python
=
options
.
ignore_requires_python
,
)
versions
:
Iterable
[
Union
[
LegacyVersion
,
Version
]]
=
(
candidate
.
version
for
candidate
in
finder
.
find_all_candidates
(
query
)
)
if
not
options
.
pre
:
# Remove prereleases
versions
=
(
version
for
version
in
versions
if
not
version
.
is_prerelease
)
versions
=
set
(
versions
)
if
not
versions
:
raise
DistributionNotFound
(
"
No matching distribution found for {}
"
.
format
(
query
)
)
formatted_versions
=
[
str
(
ver
)
for
ver
in
sorted
(
versions
,
reverse
=
True
)]
latest
=
formatted_versions
[
0
]
write_output
(
"
{} ({})
"
.
format
(
query
,
latest
))
write_output
(
"
Available versions: {}
"
.
format
(
"
,
"
.
join
(
formatted_versions
)))
print_dist_installation_info
(
query
,
latest
)
server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/inspect.py
deleted
100644 → 0
View file @
03bf2ef9
import
logging
from
optparse
import
Values
from
typing
import
Any
,
Dict
,
List
from
pip._vendor.packaging.markers
import
default_environment
from
pip._vendor.rich
import
print_json
from
pip
import
__version__
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.req_command
import
Command
from
pip._internal.cli.status_codes
import
SUCCESS
from
pip._internal.metadata
import
BaseDistribution
,
get_environment
from
pip._internal.utils.compat
import
stdlib_pkgs
from
pip._internal.utils.urls
import
path_to_url
logger
=
logging
.
getLogger
(
__name__
)
class
InspectCommand
(
Command
):
"""
Inspect the content of a Python environment and produce a report in JSON format.
"""
ignore_require_venv
=
True
usage
=
"""
%prog [options]
"""
def
add_options
(
self
)
->
None
:
self
.
cmd_opts
.
add_option
(
"
--local
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
(
"
If in a virtualenv that has global access, do not list
"
"
globally-installed packages.
"
),
)
self
.
cmd_opts
.
add_option
(
"
--user
"
,
dest
=
"
user
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
"
Only output packages installed in user-site.
"
,
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
list_path
())
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
def
run
(
self
,
options
:
Values
,
args
:
List
[
str
])
->
int
:
cmdoptions
.
check_list_path_option
(
options
)
dists
=
get_environment
(
options
.
path
).
iter_installed_distributions
(
local_only
=
options
.
local
,
user_only
=
options
.
user
,
skip
=
set
(
stdlib_pkgs
),
)
output
=
{
"
version
"
:
"
1
"
,
"
pip_version
"
:
__version__
,
"
installed
"
:
[
self
.
_dist_to_dict
(
dist
)
for
dist
in
dists
],
"
environment
"
:
default_environment
(),
# TODO tags? scheme?
}
print_json
(
data
=
output
)
return
SUCCESS
def
_dist_to_dict
(
self
,
dist
:
BaseDistribution
)
->
Dict
[
str
,
Any
]:
res
:
Dict
[
str
,
Any
]
=
{
"
metadata
"
:
dist
.
metadata_dict
,
"
metadata_location
"
:
dist
.
info_location
,
}
# direct_url. Note that we don't have download_info (as in the installation
# report) since it is not recorded in installed metadata.
direct_url
=
dist
.
direct_url
if
direct_url
is
not
None
:
res
[
"
direct_url
"
]
=
direct_url
.
to_dict
()
else
:
# Emulate direct_url for legacy editable installs.
editable_project_location
=
dist
.
editable_project_location
if
editable_project_location
is
not
None
:
res
[
"
direct_url
"
]
=
{
"
url
"
:
path_to_url
(
editable_project_location
),
"
dir_info
"
:
{
"
editable
"
:
True
,
},
}
# installer
installer
=
dist
.
installer
if
dist
.
installer
:
res
[
"
installer
"
]
=
installer
# requested
if
dist
.
installed_with_dist_info
:
res
[
"
requested
"
]
=
dist
.
requested
return
res
server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/install.py
deleted
100644 → 0
View file @
03bf2ef9
import
errno
import
json
import
operator
import
os
import
shutil
import
site
from
optparse
import
SUPPRESS_HELP
,
Values
from
typing
import
Iterable
,
List
,
Optional
from
pip._vendor.packaging.utils
import
canonicalize_name
from
pip._vendor.rich
import
print_json
from
pip._internal.cache
import
WheelCache
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.cmdoptions
import
make_target_python
from
pip._internal.cli.req_command
import
(
RequirementCommand
,
warn_if_run_as_root
,
with_cleanup
,
)
from
pip._internal.cli.status_codes
import
ERROR
,
SUCCESS
from
pip._internal.exceptions
import
CommandError
,
InstallationError
from
pip._internal.locations
import
get_scheme
from
pip._internal.metadata
import
get_environment
from
pip._internal.models.format_control
import
FormatControl
from
pip._internal.models.installation_report
import
InstallationReport
from
pip._internal.operations.build.build_tracker
import
get_build_tracker
from
pip._internal.operations.check
import
ConflictDetails
,
check_install_conflicts
from
pip._internal.req
import
install_given_reqs
from
pip._internal.req.req_install
import
(
InstallRequirement
,
LegacySetupPyOptionsCheckMode
,
check_legacy_setup_py_options
,
)
from
pip._internal.utils.compat
import
WINDOWS
from
pip._internal.utils.deprecation
import
(
LegacyInstallReasonFailedBdistWheel
,
deprecated
,
)
from
pip._internal.utils.distutils_args
import
parse_distutils_args
from
pip._internal.utils.filesystem
import
test_writable_dir
from
pip._internal.utils.logging
import
getLogger
from
pip._internal.utils.misc
import
(
check_externally_managed
,
ensure_dir
,
get_pip_version
,
protect_pip_from_modification_on_windows
,
write_output
,
)
from
pip._internal.utils.temp_dir
import
TempDirectory
from
pip._internal.utils.virtualenv
import
(
running_under_virtualenv
,
virtualenv_no_global
,
)
from
pip._internal.wheel_builder
import
(
BdistWheelAllowedPredicate
,
build
,
should_build_for_install_command
,
)
logger
=
getLogger
(
__name__
)
def
get_check_bdist_wheel_allowed
(
format_control
:
FormatControl
,
)
->
BdistWheelAllowedPredicate
:
def
check_binary_allowed
(
req
:
InstallRequirement
)
->
bool
:
canonical_name
=
canonicalize_name
(
req
.
name
or
""
)
allowed_formats
=
format_control
.
get_allowed_formats
(
canonical_name
)
return
"
binary
"
in
allowed_formats
return
check_binary_allowed
class
InstallCommand
(
RequirementCommand
):
"""
Install packages from:
- PyPI (and other indexes) using requirement specifiers.
- VCS project urls.
- Local project directories.
- Local or remote source archives.
pip also supports installing from
"
requirements files
"
, which provide
an easy way to specify a whole environment to be installed.
"""
usage
=
"""
%prog [options] <requirement specifier> [package-index-options] ...
%prog [options] -r <requirements file> [package-index-options] ...
%prog [options] [-e] <vcs project url> ...
%prog [options] [-e] <local project path> ...
%prog [options] <archive url/path> ...
"""
def
add_options
(
self
)
->
None
:
self
.
cmd_opts
.
add_option
(
cmdoptions
.
requirements
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
constraints
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
no_deps
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
pre
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
editable
())
self
.
cmd_opts
.
add_option
(
"
--dry-run
"
,
action
=
"
store_true
"
,
dest
=
"
dry_run
"
,
default
=
False
,
help
=
(
"
Don
'
t actually install anything, just print what would be.
"
"
Can be used in combination with --ignore-installed
"
"
to
'
resolve
'
the requirements.
"
),
)
self
.
cmd_opts
.
add_option
(
"
-t
"
,
"
--target
"
,
dest
=
"
target_dir
"
,
metavar
=
"
dir
"
,
default
=
None
,
help
=
(
"
Install packages into <dir>.
"
"
By default this will not replace existing files/folders in
"
"
<dir>. Use --upgrade to replace existing packages in <dir>
"
"
with new versions.
"
),
)
cmdoptions
.
add_target_python_options
(
self
.
cmd_opts
)
self
.
cmd_opts
.
add_option
(
"
--user
"
,
dest
=
"
use_user_site
"
,
action
=
"
store_true
"
,
help
=
(
"
Install to the Python user install directory for your
"
"
platform. Typically ~/.local/, or %APPDATA%
\\
Python on
"
"
Windows. (See the Python documentation for site.USER_BASE
"
"
for full details.)
"
),
)
self
.
cmd_opts
.
add_option
(
"
--no-user
"
,
dest
=
"
use_user_site
"
,
action
=
"
store_false
"
,
help
=
SUPPRESS_HELP
,
)
self
.
cmd_opts
.
add_option
(
"
--root
"
,
dest
=
"
root_path
"
,
metavar
=
"
dir
"
,
default
=
None
,
help
=
"
Install everything relative to this alternate root directory.
"
,
)
self
.
cmd_opts
.
add_option
(
"
--prefix
"
,
dest
=
"
prefix_path
"
,
metavar
=
"
dir
"
,
default
=
None
,
help
=
(
"
Installation prefix where lib, bin and other top-level
"
"
folders are placed
"
),
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
src
())
self
.
cmd_opts
.
add_option
(
"
-U
"
,
"
--upgrade
"
,
dest
=
"
upgrade
"
,
action
=
"
store_true
"
,
help
=
(
"
Upgrade all specified packages to the newest available
"
"
version. The handling of dependencies depends on the
"
"
upgrade-strategy used.
"
),
)
self
.
cmd_opts
.
add_option
(
"
--upgrade-strategy
"
,
dest
=
"
upgrade_strategy
"
,
default
=
"
only-if-needed
"
,
choices
=
[
"
only-if-needed
"
,
"
eager
"
],
help
=
(
"
Determines how dependency upgrading should be handled
"
"
[default: %default].
"
'"
eager
"
- dependencies are upgraded regardless of
'
"
whether the currently installed version satisfies the
"
"
requirements of the upgraded package(s).
"
'"
only-if-needed
"
- are upgraded only when they do not
'
"
satisfy the requirements of the upgraded package(s).
"
),
)
self
.
cmd_opts
.
add_option
(
"
--force-reinstall
"
,
dest
=
"
force_reinstall
"
,
action
=
"
store_true
"
,
help
=
"
Reinstall all packages even if they are already up-to-date.
"
,
)
self
.
cmd_opts
.
add_option
(
"
-I
"
,
"
--ignore-installed
"
,
dest
=
"
ignore_installed
"
,
action
=
"
store_true
"
,
help
=
(
"
Ignore the installed packages, overwriting them.
"
"
This can break your system if the existing package
"
"
is of a different version or was installed
"
"
with a different package manager!
"
),
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
ignore_requires_python
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
no_build_isolation
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
use_pep517
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
no_use_pep517
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
check_build_deps
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
override_externally_managed
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
config_settings
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
install_options
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
global_options
())
self
.
cmd_opts
.
add_option
(
"
--compile
"
,
action
=
"
store_true
"
,
dest
=
"
compile
"
,
default
=
True
,
help
=
"
Compile Python source files to bytecode
"
,
)
self
.
cmd_opts
.
add_option
(
"
--no-compile
"
,
action
=
"
store_false
"
,
dest
=
"
compile
"
,
help
=
"
Do not compile Python source files to bytecode
"
,
)
self
.
cmd_opts
.
add_option
(
"
--no-warn-script-location
"
,
action
=
"
store_false
"
,
dest
=
"
warn_script_location
"
,
default
=
True
,
help
=
"
Do not warn when installing scripts outside PATH
"
,
)
self
.
cmd_opts
.
add_option
(
"
--no-warn-conflicts
"
,
action
=
"
store_false
"
,
dest
=
"
warn_about_conflicts
"
,
default
=
True
,
help
=
"
Do not warn about broken dependencies
"
,
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
no_binary
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
only_binary
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
prefer_binary
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
require_hashes
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
progress_bar
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
root_user_action
())
index_opts
=
cmdoptions
.
make_option_group
(
cmdoptions
.
index_group
,
self
.
parser
,
)
self
.
parser
.
insert_option_group
(
0
,
index_opts
)
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
self
.
cmd_opts
.
add_option
(
"
--report
"
,
dest
=
"
json_report_file
"
,
metavar
=
"
file
"
,
default
=
None
,
help
=
(
"
Generate a JSON file describing what pip did to install
"
"
the provided requirements.
"
"
Can be used in combination with --dry-run and --ignore-installed
"
"
to
'
resolve
'
the requirements.
"
"
When - is used as file name it writes to stdout.
"
"
When writing to stdout, please combine with the --quiet option
"
"
to avoid mixing pip logging output with JSON output.
"
),
)
@with_cleanup
def
run
(
self
,
options
:
Values
,
args
:
List
[
str
])
->
int
:
if
options
.
use_user_site
and
options
.
target_dir
is
not
None
:
raise
CommandError
(
"
Can not combine
'
--user
'
and
'
--target
'"
)
# Check whether the environment we're installing into is externally
# managed, as specified in PEP 668. Specifying --root, --target, or
# --prefix disables the check, since there's no reliable way to locate
# the EXTERNALLY-MANAGED file for those cases. An exception is also
# made specifically for "--dry-run --report" for convenience.
installing_into_current_environment
=
(
not
(
options
.
dry_run
and
options
.
json_report_file
)
and
options
.
root_path
is
None
and
options
.
target_dir
is
None
and
options
.
prefix_path
is
None
)
if
(
installing_into_current_environment
and
not
options
.
override_externally_managed
):
check_externally_managed
()
upgrade_strategy
=
"
to-satisfy-only
"
if
options
.
upgrade
:
upgrade_strategy
=
options
.
upgrade_strategy
cmdoptions
.
check_dist_restriction
(
options
,
check_target
=
True
)
install_options
=
options
.
install_options
or
[]
logger
.
verbose
(
"
Using %s
"
,
get_pip_version
())
options
.
use_user_site
=
decide_user_install
(
options
.
use_user_site
,
prefix_path
=
options
.
prefix_path
,
target_dir
=
options
.
target_dir
,
root_path
=
options
.
root_path
,
isolated_mode
=
options
.
isolated_mode
,
)
target_temp_dir
:
Optional
[
TempDirectory
]
=
None
target_temp_dir_path
:
Optional
[
str
]
=
None
if
options
.
target_dir
:
options
.
ignore_installed
=
True
options
.
target_dir
=
os
.
path
.
abspath
(
options
.
target_dir
)
if
(
# fmt: off
os
.
path
.
exists
(
options
.
target_dir
)
and
not
os
.
path
.
isdir
(
options
.
target_dir
)
# fmt: on
):
raise
CommandError
(
"
Target path exists but is not a directory, will not continue.
"
)
# Create a target directory for using with the target option
target_temp_dir
=
TempDirectory
(
kind
=
"
target
"
)
target_temp_dir_path
=
target_temp_dir
.
path
self
.
enter_context
(
target_temp_dir
)
global_options
=
options
.
global_options
or
[]
session
=
self
.
get_default_session
(
options
)
target_python
=
make_target_python
(
options
)
finder
=
self
.
_build_package_finder
(
options
=
options
,
session
=
session
,
target_python
=
target_python
,
ignore_requires_python
=
options
.
ignore_requires_python
,
)
build_tracker
=
self
.
enter_context
(
get_build_tracker
())
directory
=
TempDirectory
(
delete
=
not
options
.
no_clean
,
kind
=
"
install
"
,
globally_managed
=
True
,
)
try
:
reqs
=
self
.
get_requirements
(
args
,
options
,
finder
,
session
)
check_legacy_setup_py_options
(
options
,
reqs
,
LegacySetupPyOptionsCheckMode
.
INSTALL
)
if
"
no-binary-enable-wheel-cache
"
in
options
.
features_enabled
:
# TODO: remove format_control from WheelCache when the deprecation cycle
# is over
wheel_cache
=
WheelCache
(
options
.
cache_dir
)
else
:
if
options
.
format_control
.
no_binary
:
deprecated
(
reason
=
(
"
--no-binary currently disables reading from
"
"
the cache of locally built wheels. In the future
"
"
--no-binary will not influence the wheel cache.
"
),
replacement
=
"
to use the --no-cache-dir option
"
,
feature_flag
=
"
no-binary-enable-wheel-cache
"
,
issue
=
11453
,
gone_in
=
"
23.1
"
,
)
wheel_cache
=
WheelCache
(
options
.
cache_dir
,
options
.
format_control
)
# Only when installing is it permitted to use PEP 660.
# In other circumstances (pip wheel, pip download) we generate
# regular (i.e. non editable) metadata and wheels.
for
req
in
reqs
:
req
.
permit_editable_wheels
=
True
reject_location_related_install_options
(
reqs
,
options
.
install_options
)
preparer
=
self
.
make_requirement_preparer
(
temp_build_dir
=
directory
,
options
=
options
,
build_tracker
=
build_tracker
,
session
=
session
,
finder
=
finder
,
use_user_site
=
options
.
use_user_site
,
verbosity
=
self
.
verbosity
,
)
resolver
=
self
.
make_resolver
(
preparer
=
preparer
,
finder
=
finder
,
options
=
options
,
wheel_cache
=
wheel_cache
,
use_user_site
=
options
.
use_user_site
,
ignore_installed
=
options
.
ignore_installed
,
ignore_requires_python
=
options
.
ignore_requires_python
,
force_reinstall
=
options
.
force_reinstall
,
upgrade_strategy
=
upgrade_strategy
,
use_pep517
=
options
.
use_pep517
,
)
self
.
trace_basic_info
(
finder
)
requirement_set
=
resolver
.
resolve
(
reqs
,
check_supported_wheels
=
not
options
.
target_dir
)
if
options
.
json_report_file
:
report
=
InstallationReport
(
requirement_set
.
requirements_to_install
)
if
options
.
json_report_file
==
"
-
"
:
print_json
(
data
=
report
.
to_dict
())
else
:
with
open
(
options
.
json_report_file
,
"
w
"
,
encoding
=
"
utf-8
"
)
as
f
:
json
.
dump
(
report
.
to_dict
(),
f
,
indent
=
2
,
ensure_ascii
=
False
)
if
options
.
dry_run
:
would_install_items
=
sorted
(
(
r
.
metadata
[
"
name
"
],
r
.
metadata
[
"
version
"
])
for
r
in
requirement_set
.
requirements_to_install
)
if
would_install_items
:
write_output
(
"
Would install %s
"
,
"
"
.
join
(
"
-
"
.
join
(
item
)
for
item
in
would_install_items
),
)
return
SUCCESS
try
:
pip_req
=
requirement_set
.
get_requirement
(
"
pip
"
)
except
KeyError
:
modifying_pip
=
False
else
:
# If we're not replacing an already installed pip,
# we're not modifying it.
modifying_pip
=
pip_req
.
satisfied_by
is
None
protect_pip_from_modification_on_windows
(
modifying_pip
=
modifying_pip
)
check_bdist_wheel_allowed
=
get_check_bdist_wheel_allowed
(
finder
.
format_control
)
reqs_to_build
=
[
r
for
r
in
requirement_set
.
requirements
.
values
()
if
should_build_for_install_command
(
r
,
check_bdist_wheel_allowed
)
]
_
,
build_failures
=
build
(
reqs_to_build
,
wheel_cache
=
wheel_cache
,
verify
=
True
,
build_options
=
[],
global_options
=
global_options
,
)
# If we're using PEP 517, we cannot do a legacy setup.py install
# so we fail here.
pep517_build_failure_names
:
List
[
str
]
=
[
r
.
name
for
r
in
build_failures
if
r
.
use_pep517
# type: ignore
]
if
pep517_build_failure_names
:
raise
InstallationError
(
"
Could not build wheels for {}, which is required to
"
"
install pyproject.toml-based projects
"
.
format
(
"
,
"
.
join
(
pep517_build_failure_names
)
)
)
# For now, we just warn about failures building legacy
# requirements, as we'll fall through to a setup.py install for
# those.
for
r
in
build_failures
:
if
not
r
.
use_pep517
:
r
.
legacy_install_reason
=
LegacyInstallReasonFailedBdistWheel
to_install
=
resolver
.
get_installation_order
(
requirement_set
)
# Check for conflicts in the package set we're installing.
conflicts
:
Optional
[
ConflictDetails
]
=
None
should_warn_about_conflicts
=
(
not
options
.
ignore_dependencies
and
options
.
warn_about_conflicts
)
if
should_warn_about_conflicts
:
conflicts
=
self
.
_determine_conflicts
(
to_install
)
# Don't warn about script install locations if
# --target or --prefix has been specified
warn_script_location
=
options
.
warn_script_location
if
options
.
target_dir
or
options
.
prefix_path
:
warn_script_location
=
False
installed
=
install_given_reqs
(
to_install
,
install_options
,
global_options
,
root
=
options
.
root_path
,
home
=
target_temp_dir_path
,
prefix
=
options
.
prefix_path
,
warn_script_location
=
warn_script_location
,
use_user_site
=
options
.
use_user_site
,
pycompile
=
options
.
compile
,
)
lib_locations
=
get_lib_location_guesses
(
user
=
options
.
use_user_site
,
home
=
target_temp_dir_path
,
root
=
options
.
root_path
,
prefix
=
options
.
prefix_path
,
isolated
=
options
.
isolated_mode
,
)
env
=
get_environment
(
lib_locations
)
installed
.
sort
(
key
=
operator
.
attrgetter
(
"
name
"
))
items
=
[]
for
result
in
installed
:
item
=
result
.
name
try
:
installed_dist
=
env
.
get_distribution
(
item
)
if
installed_dist
is
not
None
:
item
=
f
"
{
item
}
-
{
installed_dist
.
version
}
"
except
Exception
:
pass
items
.
append
(
item
)
if
conflicts
is
not
None
:
self
.
_warn_about_conflicts
(
conflicts
,
resolver_variant
=
self
.
determine_resolver_variant
(
options
),
)
installed_desc
=
"
"
.
join
(
items
)
if
installed_desc
:
write_output
(
"
Successfully installed %s
"
,
installed_desc
,
)
except
OSError
as
error
:
show_traceback
=
self
.
verbosity
>=
1
message
=
create_os_error_message
(
error
,
show_traceback
,
options
.
use_user_site
,
)
logger
.
error
(
message
,
exc_info
=
show_traceback
)
# noqa
return
ERROR
if
options
.
target_dir
:
assert
target_temp_dir
self
.
_handle_target_dir
(
options
.
target_dir
,
target_temp_dir
,
options
.
upgrade
)
if
options
.
root_user_action
==
"
warn
"
:
warn_if_run_as_root
()
return
SUCCESS
def
_handle_target_dir
(
self
,
target_dir
:
str
,
target_temp_dir
:
TempDirectory
,
upgrade
:
bool
)
->
None
:
ensure_dir
(
target_dir
)
# Checking both purelib and platlib directories for installed
# packages to be moved to target directory
lib_dir_list
=
[]
# Checking both purelib and platlib directories for installed
# packages to be moved to target directory
scheme
=
get_scheme
(
""
,
home
=
target_temp_dir
.
path
)
purelib_dir
=
scheme
.
purelib
platlib_dir
=
scheme
.
platlib
data_dir
=
scheme
.
data
if
os
.
path
.
exists
(
purelib_dir
):
lib_dir_list
.
append
(
purelib_dir
)
if
os
.
path
.
exists
(
platlib_dir
)
and
platlib_dir
!=
purelib_dir
:
lib_dir_list
.
append
(
platlib_dir
)
if
os
.
path
.
exists
(
data_dir
):
lib_dir_list
.
append
(
data_dir
)
for
lib_dir
in
lib_dir_list
:
for
item
in
os
.
listdir
(
lib_dir
):
if
lib_dir
==
data_dir
:
ddir
=
os
.
path
.
join
(
data_dir
,
item
)
if
any
(
s
.
startswith
(
ddir
)
for
s
in
lib_dir_list
[:
-
1
]):
continue
target_item_dir
=
os
.
path
.
join
(
target_dir
,
item
)
if
os
.
path
.
exists
(
target_item_dir
):
if
not
upgrade
:
logger
.
warning
(
"
Target directory %s already exists. Specify
"
"
--upgrade to force replacement.
"
,
target_item_dir
,
)
continue
if
os
.
path
.
islink
(
target_item_dir
):
logger
.
warning
(
"
Target directory %s already exists and is
"
"
a link. pip will not automatically replace
"
"
links, please remove if replacement is
"
"
desired.
"
,
target_item_dir
,
)
continue
if
os
.
path
.
isdir
(
target_item_dir
):
shutil
.
rmtree
(
target_item_dir
)
else
:
os
.
remove
(
target_item_dir
)
shutil
.
move
(
os
.
path
.
join
(
lib_dir
,
item
),
target_item_dir
)
def
_determine_conflicts
(
self
,
to_install
:
List
[
InstallRequirement
]
)
->
Optional
[
ConflictDetails
]:
try
:
return
check_install_conflicts
(
to_install
)
except
Exception
:
logger
.
exception
(
"
Error while checking for conflicts. Please file an issue on
"
"
pip
'
s issue tracker: https://github.com/pypa/pip/issues/new
"
)
return
None
def
_warn_about_conflicts
(
self
,
conflict_details
:
ConflictDetails
,
resolver_variant
:
str
)
->
None
:
package_set
,
(
missing
,
conflicting
)
=
conflict_details
if
not
missing
and
not
conflicting
:
return
parts
:
List
[
str
]
=
[]
if
resolver_variant
==
"
legacy
"
:
parts
.
append
(
"
pip
'
s legacy dependency resolver does not consider dependency
"
"
conflicts when selecting packages. This behaviour is the
"
"
source of the following dependency conflicts.
"
)
else
:
assert
resolver_variant
==
"
2020-resolver
"
parts
.
append
(
"
pip
'
s dependency resolver does not currently take into account
"
"
all the packages that are installed. This behaviour is the
"
"
source of the following dependency conflicts.
"
)
# NOTE: There is some duplication here, with commands/check.py
for
project_name
in
missing
:
version
=
package_set
[
project_name
][
0
]
for
dependency
in
missing
[
project_name
]:
message
=
(
"
{name} {version} requires {requirement},
"
"
which is not installed.
"
).
format
(
name
=
project_name
,
version
=
version
,
requirement
=
dependency
[
1
],
)
parts
.
append
(
message
)
for
project_name
in
conflicting
:
version
=
package_set
[
project_name
][
0
]
for
dep_name
,
dep_version
,
req
in
conflicting
[
project_name
]:
message
=
(
"
{name} {version} requires {requirement}, but {you} have
"
"
{dep_name} {dep_version} which is incompatible.
"
).
format
(
name
=
project_name
,
version
=
version
,
requirement
=
req
,
dep_name
=
dep_name
,
dep_version
=
dep_version
,
you
=
(
"
you
"
if
resolver_variant
==
"
2020-resolver
"
else
"
you
'
ll
"
),
)
parts
.
append
(
message
)
logger
.
critical
(
"
\n
"
.
join
(
parts
))
def
get_lib_location_guesses
(
user
:
bool
=
False
,
home
:
Optional
[
str
]
=
None
,
root
:
Optional
[
str
]
=
None
,
isolated
:
bool
=
False
,
prefix
:
Optional
[
str
]
=
None
,
)
->
List
[
str
]:
scheme
=
get_scheme
(
""
,
user
=
user
,
home
=
home
,
root
=
root
,
isolated
=
isolated
,
prefix
=
prefix
,
)
return
[
scheme
.
purelib
,
scheme
.
platlib
]
def
site_packages_writable
(
root
:
Optional
[
str
],
isolated
:
bool
)
->
bool
:
return
all
(
test_writable_dir
(
d
)
for
d
in
set
(
get_lib_location_guesses
(
root
=
root
,
isolated
=
isolated
))
)
def
decide_user_install
(
use_user_site
:
Optional
[
bool
],
prefix_path
:
Optional
[
str
]
=
None
,
target_dir
:
Optional
[
str
]
=
None
,
root_path
:
Optional
[
str
]
=
None
,
isolated_mode
:
bool
=
False
,
)
->
bool
:
"""
Determine whether to do a user install based on the input options.
If use_user_site is False, no additional checks are done.
If use_user_site is True, it is checked for compatibility with other
options.
If use_user_site is None, the default behaviour depends on the environment,
which is provided by the other arguments.
"""
# In some cases (config from tox), use_user_site can be set to an integer
# rather than a bool, which 'use_user_site is False' wouldn't catch.
if
(
use_user_site
is
not
None
)
and
(
not
use_user_site
):
logger
.
debug
(
"
Non-user install by explicit request
"
)
return
False
if
use_user_site
:
if
prefix_path
:
raise
CommandError
(
"
Can not combine
'
--user
'
and
'
--prefix
'
as they imply
"
"
different installation locations
"
)
if
virtualenv_no_global
():
raise
InstallationError
(
"
Can not perform a
'
--user
'
install. User site-packages
"
"
are not visible in this virtualenv.
"
)
logger
.
debug
(
"
User install by explicit request
"
)
return
True
# If we are here, user installs have not been explicitly requested/avoided
assert
use_user_site
is
None
# user install incompatible with --prefix/--target
if
prefix_path
or
target_dir
:
logger
.
debug
(
"
Non-user install due to --prefix or --target option
"
)
return
False
# If user installs are not enabled, choose a non-user install
if
not
site
.
ENABLE_USER_SITE
:
logger
.
debug
(
"
Non-user install because user site-packages disabled
"
)
return
False
# If we have permission for a non-user install, do that,
# otherwise do a user install.
if
site_packages_writable
(
root
=
root_path
,
isolated
=
isolated_mode
):
logger
.
debug
(
"
Non-user install because site-packages writeable
"
)
return
False
logger
.
info
(
"
Defaulting to user installation because normal site-packages
"
"
is not writeable
"
)
return
True
def
reject_location_related_install_options
(
requirements
:
List
[
InstallRequirement
],
options
:
Optional
[
List
[
str
]]
)
->
None
:
"""
If any location-changing --install-option arguments were passed for
requirements or on the command-line, then show a deprecation warning.
"""
def
format_options
(
option_names
:
Iterable
[
str
])
->
List
[
str
]:
return
[
"
--{}
"
.
format
(
name
.
replace
(
"
_
"
,
"
-
"
))
for
name
in
option_names
]
offenders
=
[]
for
requirement
in
requirements
:
install_options
=
requirement
.
install_options
location_options
=
parse_distutils_args
(
install_options
)
if
location_options
:
offenders
.
append
(
"
{!r} from {}
"
.
format
(
format_options
(
location_options
.
keys
()),
requirement
)
)
if
options
:
location_options
=
parse_distutils_args
(
options
)
if
location_options
:
offenders
.
append
(
"
{!r} from command line
"
.
format
(
format_options
(
location_options
.
keys
()))
)
if
not
offenders
:
return
raise
CommandError
(
"
Location-changing options found in --install-option: {}.
"
"
This is unsupported, use pip-level options like --user,
"
"
--prefix, --root, and --target instead.
"
.
format
(
"
;
"
.
join
(
offenders
))
)
def
create_os_error_message
(
error
:
OSError
,
show_traceback
:
bool
,
using_user_site
:
bool
)
->
str
:
"""
Format an error message for an OSError
It may occur anytime during the execution of the install command.
"""
parts
=
[]
# Mention the error if we are not going to show a traceback
parts
.
append
(
"
Could not install packages due to an OSError
"
)
if
not
show_traceback
:
parts
.
append
(
"
:
"
)
parts
.
append
(
str
(
error
))
else
:
parts
.
append
(
"
.
"
)
# Spilt the error indication from a helper message (if any)
parts
[
-
1
]
+=
"
\n
"
# Suggest useful actions to the user:
# (1) using user site-packages or (2) verifying the permissions
if
error
.
errno
==
errno
.
EACCES
:
user_option_part
=
"
Consider using the `--user` option
"
permissions_part
=
"
Check the permissions
"
if
not
running_under_virtualenv
()
and
not
using_user_site
:
parts
.
extend
(
[
user_option_part
,
"
or
"
,
permissions_part
.
lower
(),
]
)
else
:
parts
.
append
(
permissions_part
)
parts
.
append
(
"
.
\n
"
)
# Suggest the user to enable Long Paths if path length is
# more than 260
if
(
WINDOWS
and
error
.
errno
==
errno
.
ENOENT
and
error
.
filename
and
len
(
error
.
filename
)
>
260
):
parts
.
append
(
"
HINT: This error might have occurred since
"
"
this system does not have Windows Long Path
"
"
support enabled. You can find information on
"
"
how to enable this at
"
"
https://pip.pypa.io/warnings/enable-long-paths
\n
"
)
return
""
.
join
(
parts
).
strip
()
+
"
\n
"
server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/list.py
deleted
100644 → 0
View file @
03bf2ef9
import
json
import
logging
from
optparse
import
Values
from
typing
import
TYPE_CHECKING
,
Generator
,
List
,
Optional
,
Sequence
,
Tuple
,
cast
from
pip._vendor.packaging.utils
import
canonicalize_name
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.req_command
import
IndexGroupCommand
from
pip._internal.cli.status_codes
import
SUCCESS
from
pip._internal.exceptions
import
CommandError
from
pip._internal.index.collector
import
LinkCollector
from
pip._internal.index.package_finder
import
PackageFinder
from
pip._internal.metadata
import
BaseDistribution
,
get_environment
from
pip._internal.models.selection_prefs
import
SelectionPreferences
from
pip._internal.network.session
import
PipSession
from
pip._internal.utils.compat
import
stdlib_pkgs
from
pip._internal.utils.misc
import
tabulate
,
write_output
if
TYPE_CHECKING
:
from
pip._internal.metadata.base
import
DistributionVersion
class
_DistWithLatestInfo
(
BaseDistribution
):
"""
Give the distribution object a couple of extra fields.
These will be populated during ``get_outdated()``. This is dirty but
makes the rest of the code much cleaner.
"""
latest_version
:
DistributionVersion
latest_filetype
:
str
_ProcessedDists
=
Sequence
[
_DistWithLatestInfo
]
logger
=
logging
.
getLogger
(
__name__
)
class
ListCommand
(
IndexGroupCommand
):
"""
List installed packages, including editables.
Packages are listed in a case-insensitive sorted order.
"""
ignore_require_venv
=
True
usage
=
"""
%prog [options]
"""
def
add_options
(
self
)
->
None
:
self
.
cmd_opts
.
add_option
(
"
-o
"
,
"
--outdated
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
"
List outdated packages
"
,
)
self
.
cmd_opts
.
add_option
(
"
-u
"
,
"
--uptodate
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
"
List uptodate packages
"
,
)
self
.
cmd_opts
.
add_option
(
"
-e
"
,
"
--editable
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
"
List editable projects.
"
,
)
self
.
cmd_opts
.
add_option
(
"
-l
"
,
"
--local
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
(
"
If in a virtualenv that has global access, do not list
"
"
globally-installed packages.
"
),
)
self
.
cmd_opts
.
add_option
(
"
--user
"
,
dest
=
"
user
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
"
Only output packages installed in user-site.
"
,
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
list_path
())
self
.
cmd_opts
.
add_option
(
"
--pre
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
(
"
Include pre-release and development versions. By default,
"
"
pip only finds stable versions.
"
),
)
self
.
cmd_opts
.
add_option
(
"
--format
"
,
action
=
"
store
"
,
dest
=
"
list_format
"
,
default
=
"
columns
"
,
choices
=
(
"
columns
"
,
"
freeze
"
,
"
json
"
),
help
=
"
Select the output format among: columns (default), freeze, or json
"
,
)
self
.
cmd_opts
.
add_option
(
"
--not-required
"
,
action
=
"
store_true
"
,
dest
=
"
not_required
"
,
help
=
"
List packages that are not dependencies of installed packages.
"
,
)
self
.
cmd_opts
.
add_option
(
"
--exclude-editable
"
,
action
=
"
store_false
"
,
dest
=
"
include_editable
"
,
help
=
"
Exclude editable package from output.
"
,
)
self
.
cmd_opts
.
add_option
(
"
--include-editable
"
,
action
=
"
store_true
"
,
dest
=
"
include_editable
"
,
help
=
"
Include editable package from output.
"
,
default
=
True
,
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
list_exclude
())
index_opts
=
cmdoptions
.
make_option_group
(
cmdoptions
.
index_group
,
self
.
parser
)
self
.
parser
.
insert_option_group
(
0
,
index_opts
)
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
def
_build_package_finder
(
self
,
options
:
Values
,
session
:
PipSession
)
->
PackageFinder
:
"""
Create a package finder appropriate to this list command.
"""
link_collector
=
LinkCollector
.
create
(
session
,
options
=
options
)
# Pass allow_yanked=False to ignore yanked versions.
selection_prefs
=
SelectionPreferences
(
allow_yanked
=
False
,
allow_all_prereleases
=
options
.
pre
,
)
return
PackageFinder
.
create
(
link_collector
=
link_collector
,
selection_prefs
=
selection_prefs
,
)
def
run
(
self
,
options
:
Values
,
args
:
List
[
str
])
->
int
:
if
options
.
outdated
and
options
.
uptodate
:
raise
CommandError
(
"
Options --outdated and --uptodate cannot be combined.
"
)
if
options
.
outdated
and
options
.
list_format
==
"
freeze
"
:
raise
CommandError
(
"
List format
'
freeze
'
can not be used with the --outdated option.
"
)
cmdoptions
.
check_list_path_option
(
options
)
skip
=
set
(
stdlib_pkgs
)
if
options
.
excludes
:
skip
.
update
(
canonicalize_name
(
n
)
for
n
in
options
.
excludes
)
packages
:
"
_ProcessedDists
"
=
[
cast
(
"
_DistWithLatestInfo
"
,
d
)
for
d
in
get_environment
(
options
.
path
).
iter_installed_distributions
(
local_only
=
options
.
local
,
user_only
=
options
.
user
,
editables_only
=
options
.
editable
,
include_editables
=
options
.
include_editable
,
skip
=
skip
,
)
]
# get_not_required must be called firstly in order to find and
# filter out all dependencies correctly. Otherwise a package
# can't be identified as requirement because some parent packages
# could be filtered out before.
if
options
.
not_required
:
packages
=
self
.
get_not_required
(
packages
,
options
)
if
options
.
outdated
:
packages
=
self
.
get_outdated
(
packages
,
options
)
elif
options
.
uptodate
:
packages
=
self
.
get_uptodate
(
packages
,
options
)
self
.
output_package_listing
(
packages
,
options
)
return
SUCCESS
def
get_outdated
(
self
,
packages
:
"
_ProcessedDists
"
,
options
:
Values
)
->
"
_ProcessedDists
"
:
return
[
dist
for
dist
in
self
.
iter_packages_latest_infos
(
packages
,
options
)
if
dist
.
latest_version
>
dist
.
version
]
def
get_uptodate
(
self
,
packages
:
"
_ProcessedDists
"
,
options
:
Values
)
->
"
_ProcessedDists
"
:
return
[
dist
for
dist
in
self
.
iter_packages_latest_infos
(
packages
,
options
)
if
dist
.
latest_version
==
dist
.
version
]
def
get_not_required
(
self
,
packages
:
"
_ProcessedDists
"
,
options
:
Values
)
->
"
_ProcessedDists
"
:
dep_keys
=
{
canonicalize_name
(
dep
.
name
)
for
dist
in
packages
for
dep
in
(
dist
.
iter_dependencies
()
or
())
}
# Create a set to remove duplicate packages, and cast it to a list
# to keep the return type consistent with get_outdated and
# get_uptodate
return
list
({
pkg
for
pkg
in
packages
if
pkg
.
canonical_name
not
in
dep_keys
})
def
iter_packages_latest_infos
(
self
,
packages
:
"
_ProcessedDists
"
,
options
:
Values
)
->
Generator
[
"
_DistWithLatestInfo
"
,
None
,
None
]:
with
self
.
_build_session
(
options
)
as
session
:
finder
=
self
.
_build_package_finder
(
options
,
session
)
def
latest_info
(
dist
:
"
_DistWithLatestInfo
"
,
)
->
Optional
[
"
_DistWithLatestInfo
"
]:
all_candidates
=
finder
.
find_all_candidates
(
dist
.
canonical_name
)
if
not
options
.
pre
:
# Remove prereleases
all_candidates
=
[
candidate
for
candidate
in
all_candidates
if
not
candidate
.
version
.
is_prerelease
]
evaluator
=
finder
.
make_candidate_evaluator
(
project_name
=
dist
.
canonical_name
,
)
best_candidate
=
evaluator
.
sort_best_candidate
(
all_candidates
)
if
best_candidate
is
None
:
return
None
remote_version
=
best_candidate
.
version
if
best_candidate
.
link
.
is_wheel
:
typ
=
"
wheel
"
else
:
typ
=
"
sdist
"
dist
.
latest_version
=
remote_version
dist
.
latest_filetype
=
typ
return
dist
for
dist
in
map
(
latest_info
,
packages
):
if
dist
is
not
None
:
yield
dist
def
output_package_listing
(
self
,
packages
:
"
_ProcessedDists
"
,
options
:
Values
)
->
None
:
packages
=
sorted
(
packages
,
key
=
lambda
dist
:
dist
.
canonical_name
,
)
if
options
.
list_format
==
"
columns
"
and
packages
:
data
,
header
=
format_for_columns
(
packages
,
options
)
self
.
output_package_listing_columns
(
data
,
header
)
elif
options
.
list_format
==
"
freeze
"
:
for
dist
in
packages
:
if
options
.
verbose
>=
1
:
write_output
(
"
%s==%s (%s)
"
,
dist
.
raw_name
,
dist
.
version
,
dist
.
location
)
else
:
write_output
(
"
%s==%s
"
,
dist
.
raw_name
,
dist
.
version
)
elif
options
.
list_format
==
"
json
"
:
write_output
(
format_for_json
(
packages
,
options
))
def
output_package_listing_columns
(
self
,
data
:
List
[
List
[
str
]],
header
:
List
[
str
]
)
->
None
:
# insert the header first: we need to know the size of column names
if
len
(
data
)
>
0
:
data
.
insert
(
0
,
header
)
pkg_strings
,
sizes
=
tabulate
(
data
)
# Create and add a separator.
if
len
(
data
)
>
0
:
pkg_strings
.
insert
(
1
,
"
"
.
join
(
map
(
lambda
x
:
"
-
"
*
x
,
sizes
)))
for
val
in
pkg_strings
:
write_output
(
val
)
def
format_for_columns
(
pkgs
:
"
_ProcessedDists
"
,
options
:
Values
)
->
Tuple
[
List
[
List
[
str
]],
List
[
str
]]:
"""
Convert the package data into something usable
by output_package_listing_columns.
"""
header
=
[
"
Package
"
,
"
Version
"
]
running_outdated
=
options
.
outdated
if
running_outdated
:
header
.
extend
([
"
Latest
"
,
"
Type
"
])
has_editables
=
any
(
x
.
editable
for
x
in
pkgs
)
if
has_editables
:
header
.
append
(
"
Editable project location
"
)
if
options
.
verbose
>=
1
:
header
.
append
(
"
Location
"
)
if
options
.
verbose
>=
1
:
header
.
append
(
"
Installer
"
)
data
=
[]
for
proj
in
pkgs
:
# if we're working on the 'outdated' list, separate out the
# latest_version and type
row
=
[
proj
.
raw_name
,
str
(
proj
.
version
)]
if
running_outdated
:
row
.
append
(
str
(
proj
.
latest_version
))
row
.
append
(
proj
.
latest_filetype
)
if
has_editables
:
row
.
append
(
proj
.
editable_project_location
or
""
)
if
options
.
verbose
>=
1
:
row
.
append
(
proj
.
location
or
""
)
if
options
.
verbose
>=
1
:
row
.
append
(
proj
.
installer
)
data
.
append
(
row
)
return
data
,
header
def
format_for_json
(
packages
:
"
_ProcessedDists
"
,
options
:
Values
)
->
str
:
data
=
[]
for
dist
in
packages
:
info
=
{
"
name
"
:
dist
.
raw_name
,
"
version
"
:
str
(
dist
.
version
),
}
if
options
.
verbose
>=
1
:
info
[
"
location
"
]
=
dist
.
location
or
""
info
[
"
installer
"
]
=
dist
.
installer
if
options
.
outdated
:
info
[
"
latest_version
"
]
=
str
(
dist
.
latest_version
)
info
[
"
latest_filetype
"
]
=
dist
.
latest_filetype
editable_project_location
=
dist
.
editable_project_location
if
editable_project_location
:
info
[
"
editable_project_location
"
]
=
editable_project_location
data
.
append
(
info
)
return
json
.
dumps
(
data
)
server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/search.py
deleted
100644 → 0
View file @
03bf2ef9
import
logging
import
shutil
import
sys
import
textwrap
import
xmlrpc.client
from
collections
import
OrderedDict
from
optparse
import
Values
from
typing
import
TYPE_CHECKING
,
Dict
,
List
,
Optional
from
pip._vendor.packaging.version
import
parse
as
parse_version
from
pip._internal.cli.base_command
import
Command
from
pip._internal.cli.req_command
import
SessionCommandMixin
from
pip._internal.cli.status_codes
import
NO_MATCHES_FOUND
,
SUCCESS
from
pip._internal.exceptions
import
CommandError
from
pip._internal.metadata
import
get_default_environment
from
pip._internal.models.index
import
PyPI
from
pip._internal.network.xmlrpc
import
PipXmlrpcTransport
from
pip._internal.utils.logging
import
indent_log
from
pip._internal.utils.misc
import
write_output
if
TYPE_CHECKING
:
from
typing
import
TypedDict
class
TransformedHit
(
TypedDict
):
name
:
str
summary
:
str
versions
:
List
[
str
]
logger
=
logging
.
getLogger
(
__name__
)
class
SearchCommand
(
Command
,
SessionCommandMixin
):
"""
Search for PyPI packages whose name or summary contains <query>.
"""
usage
=
"""
%prog [options] <query>
"""
ignore_require_venv
=
True
def
add_options
(
self
)
->
None
:
self
.
cmd_opts
.
add_option
(
"
-i
"
,
"
--index
"
,
dest
=
"
index
"
,
metavar
=
"
URL
"
,
default
=
PyPI
.
pypi_url
,
help
=
"
Base URL of Python Package Index (default %default)
"
,
)
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
def
run
(
self
,
options
:
Values
,
args
:
List
[
str
])
->
int
:
if
not
args
:
raise
CommandError
(
"
Missing required argument (search query).
"
)
query
=
args
pypi_hits
=
self
.
search
(
query
,
options
)
hits
=
transform_hits
(
pypi_hits
)
terminal_width
=
None
if
sys
.
stdout
.
isatty
():
terminal_width
=
shutil
.
get_terminal_size
()[
0
]
print_results
(
hits
,
terminal_width
=
terminal_width
)
if
pypi_hits
:
return
SUCCESS
return
NO_MATCHES_FOUND
def
search
(
self
,
query
:
List
[
str
],
options
:
Values
)
->
List
[
Dict
[
str
,
str
]]:
index_url
=
options
.
index
session
=
self
.
get_default_session
(
options
)
transport
=
PipXmlrpcTransport
(
index_url
,
session
)
pypi
=
xmlrpc
.
client
.
ServerProxy
(
index_url
,
transport
)
try
:
hits
=
pypi
.
search
({
"
name
"
:
query
,
"
summary
"
:
query
},
"
or
"
)
except
xmlrpc
.
client
.
Fault
as
fault
:
message
=
"
XMLRPC request failed [code: {code}]
\n
{string}
"
.
format
(
code
=
fault
.
faultCode
,
string
=
fault
.
faultString
,
)
raise
CommandError
(
message
)
assert
isinstance
(
hits
,
list
)
return
hits
def
transform_hits
(
hits
:
List
[
Dict
[
str
,
str
]])
->
List
[
"
TransformedHit
"
]:
"""
The list from pypi is really a list of versions. We want a list of
packages with the list of versions stored inline. This converts the
list from pypi into one we can use.
"""
packages
:
Dict
[
str
,
"
TransformedHit
"
]
=
OrderedDict
()
for
hit
in
hits
:
name
=
hit
[
"
name
"
]
summary
=
hit
[
"
summary
"
]
version
=
hit
[
"
version
"
]
if
name
not
in
packages
.
keys
():
packages
[
name
]
=
{
"
name
"
:
name
,
"
summary
"
:
summary
,
"
versions
"
:
[
version
],
}
else
:
packages
[
name
][
"
versions
"
].
append
(
version
)
# if this is the highest version, replace summary and score
if
version
==
highest_version
(
packages
[
name
][
"
versions
"
]):
packages
[
name
][
"
summary
"
]
=
summary
return
list
(
packages
.
values
())
def
print_dist_installation_info
(
name
:
str
,
latest
:
str
)
->
None
:
env
=
get_default_environment
()
dist
=
env
.
get_distribution
(
name
)
if
dist
is
not
None
:
with
indent_log
():
if
dist
.
version
==
latest
:
write_output
(
"
INSTALLED: %s (latest)
"
,
dist
.
version
)
else
:
write_output
(
"
INSTALLED: %s
"
,
dist
.
version
)
if
parse_version
(
latest
).
pre
:
write_output
(
"
LATEST: %s (pre-release; install
"
"
with `pip install --pre`)
"
,
latest
,
)
else
:
write_output
(
"
LATEST: %s
"
,
latest
)
def
print_results
(
hits
:
List
[
"
TransformedHit
"
],
name_column_width
:
Optional
[
int
]
=
None
,
terminal_width
:
Optional
[
int
]
=
None
,
)
->
None
:
if
not
hits
:
return
if
name_column_width
is
None
:
name_column_width
=
(
max
(
[
len
(
hit
[
"
name
"
])
+
len
(
highest_version
(
hit
.
get
(
"
versions
"
,
[
"
-
"
])))
for
hit
in
hits
]
)
+
4
)
for
hit
in
hits
:
name
=
hit
[
"
name
"
]
summary
=
hit
[
"
summary
"
]
or
""
latest
=
highest_version
(
hit
.
get
(
"
versions
"
,
[
"
-
"
]))
if
terminal_width
is
not
None
:
target_width
=
terminal_width
-
name_column_width
-
5
if
target_width
>
10
:
# wrap and indent summary to fit terminal
summary_lines
=
textwrap
.
wrap
(
summary
,
target_width
)
summary
=
(
"
\n
"
+
"
"
*
(
name_column_width
+
3
)).
join
(
summary_lines
)
name_latest
=
f
"
{
name
}
(
{
latest
}
)
"
line
=
f
"
{
name_latest
:{
name_column_width
}}
-
{
summary
}
"
try
:
write_output
(
line
)
print_dist_installation_info
(
name
,
latest
)
except
UnicodeEncodeError
:
pass
def
highest_version
(
versions
:
List
[
str
])
->
str
:
return
max
(
versions
,
key
=
parse_version
)
server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/show.py
deleted
100644 → 0
View file @
03bf2ef9
import
logging
from
optparse
import
Values
from
typing
import
Generator
,
Iterable
,
Iterator
,
List
,
NamedTuple
,
Optional
from
pip._vendor.packaging.utils
import
canonicalize_name
from
pip._internal.cli.base_command
import
Command
from
pip._internal.cli.status_codes
import
ERROR
,
SUCCESS
from
pip._internal.metadata
import
BaseDistribution
,
get_default_environment
from
pip._internal.utils.misc
import
write_output
logger
=
logging
.
getLogger
(
__name__
)
class
ShowCommand
(
Command
):
"""
Show information about one or more installed packages.
The output is in RFC-compliant mail header format.
"""
usage
=
"""
%prog [options] <package> ...
"""
ignore_require_venv
=
True
def
add_options
(
self
)
->
None
:
self
.
cmd_opts
.
add_option
(
"
-f
"
,
"
--files
"
,
dest
=
"
files
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
"
Show the full list of installed files for each package.
"
,
)
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
def
run
(
self
,
options
:
Values
,
args
:
List
[
str
])
->
int
:
if
not
args
:
logger
.
warning
(
"
ERROR: Please provide a package name or names.
"
)
return
ERROR
query
=
args
results
=
search_packages_info
(
query
)
if
not
print_results
(
results
,
list_files
=
options
.
files
,
verbose
=
options
.
verbose
):
return
ERROR
return
SUCCESS
class
_PackageInfo
(
NamedTuple
):
name
:
str
version
:
str
location
:
str
editable_project_location
:
Optional
[
str
]
requires
:
List
[
str
]
required_by
:
List
[
str
]
installer
:
str
metadata_version
:
str
classifiers
:
List
[
str
]
summary
:
str
homepage
:
str
project_urls
:
List
[
str
]
author
:
str
author_email
:
str
license
:
str
entry_points
:
List
[
str
]
files
:
Optional
[
List
[
str
]]
def
search_packages_info
(
query
:
List
[
str
])
->
Generator
[
_PackageInfo
,
None
,
None
]:
"""
Gather details from installed distributions. Print distribution name,
version, location, and installed files. Installed files requires a
pip generated
'
installed-files.txt
'
in the distributions
'
.egg-info
'
directory.
"""
env
=
get_default_environment
()
installed
=
{
dist
.
canonical_name
:
dist
for
dist
in
env
.
iter_all_distributions
()}
query_names
=
[
canonicalize_name
(
name
)
for
name
in
query
]
missing
=
sorted
(
[
name
for
name
,
pkg
in
zip
(
query
,
query_names
)
if
pkg
not
in
installed
]
)
if
missing
:
logger
.
warning
(
"
Package(s) not found: %s
"
,
"
,
"
.
join
(
missing
))
def
_get_requiring_packages
(
current_dist
:
BaseDistribution
)
->
Iterator
[
str
]:
return
(
dist
.
metadata
[
"
Name
"
]
or
"
UNKNOWN
"
for
dist
in
installed
.
values
()
if
current_dist
.
canonical_name
in
{
canonicalize_name
(
d
.
name
)
for
d
in
dist
.
iter_dependencies
()}
)
for
query_name
in
query_names
:
try
:
dist
=
installed
[
query_name
]
except
KeyError
:
continue
requires
=
sorted
((
req
.
name
for
req
in
dist
.
iter_dependencies
()),
key
=
str
.
lower
)
required_by
=
sorted
(
_get_requiring_packages
(
dist
),
key
=
str
.
lower
)
try
:
entry_points_text
=
dist
.
read_text
(
"
entry_points.txt
"
)
entry_points
=
entry_points_text
.
splitlines
(
keepends
=
False
)
except
FileNotFoundError
:
entry_points
=
[]
files_iter
=
dist
.
iter_declared_entries
()
if
files_iter
is
None
:
files
:
Optional
[
List
[
str
]]
=
None
else
:
files
=
sorted
(
files_iter
)
metadata
=
dist
.
metadata
yield
_PackageInfo
(
name
=
dist
.
raw_name
,
version
=
str
(
dist
.
version
),
location
=
dist
.
location
or
""
,
editable_project_location
=
dist
.
editable_project_location
,
requires
=
requires
,
required_by
=
required_by
,
installer
=
dist
.
installer
,
metadata_version
=
dist
.
metadata_version
or
""
,
classifiers
=
metadata
.
get_all
(
"
Classifier
"
,
[]),
summary
=
metadata
.
get
(
"
Summary
"
,
""
),
homepage
=
metadata
.
get
(
"
Home-page
"
,
""
),
project_urls
=
metadata
.
get_all
(
"
Project-URL
"
,
[]),
author
=
metadata
.
get
(
"
Author
"
,
""
),
author_email
=
metadata
.
get
(
"
Author-email
"
,
""
),
license
=
metadata
.
get
(
"
License
"
,
""
),
entry_points
=
entry_points
,
files
=
files
,
)
def
print_results
(
distributions
:
Iterable
[
_PackageInfo
],
list_files
:
bool
,
verbose
:
bool
,
)
->
bool
:
"""
Print the information from installed distributions found.
"""
results_printed
=
False
for
i
,
dist
in
enumerate
(
distributions
):
results_printed
=
True
if
i
>
0
:
write_output
(
"
---
"
)
write_output
(
"
Name: %s
"
,
dist
.
name
)
write_output
(
"
Version: %s
"
,
dist
.
version
)
write_output
(
"
Summary: %s
"
,
dist
.
summary
)
write_output
(
"
Home-page: %s
"
,
dist
.
homepage
)
write_output
(
"
Author: %s
"
,
dist
.
author
)
write_output
(
"
Author-email: %s
"
,
dist
.
author_email
)
write_output
(
"
License: %s
"
,
dist
.
license
)
write_output
(
"
Location: %s
"
,
dist
.
location
)
if
dist
.
editable_project_location
is
not
None
:
write_output
(
"
Editable project location: %s
"
,
dist
.
editable_project_location
)
write_output
(
"
Requires: %s
"
,
"
,
"
.
join
(
dist
.
requires
))
write_output
(
"
Required-by: %s
"
,
"
,
"
.
join
(
dist
.
required_by
))
if
verbose
:
write_output
(
"
Metadata-Version: %s
"
,
dist
.
metadata_version
)
write_output
(
"
Installer: %s
"
,
dist
.
installer
)
write_output
(
"
Classifiers:
"
)
for
classifier
in
dist
.
classifiers
:
write_output
(
"
%s
"
,
classifier
)
write_output
(
"
Entry-points:
"
)
for
entry
in
dist
.
entry_points
:
write_output
(
"
%s
"
,
entry
.
strip
())
write_output
(
"
Project-URLs:
"
)
for
project_url
in
dist
.
project_urls
:
write_output
(
"
%s
"
,
project_url
)
if
list_files
:
write_output
(
"
Files:
"
)
if
dist
.
files
is
None
:
write_output
(
"
Cannot locate RECORD or installed-files.txt
"
)
else
:
for
line
in
dist
.
files
:
write_output
(
"
%s
"
,
line
.
strip
())
return
results_printed
server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py
deleted
100644 → 0
View file @
03bf2ef9
import
logging
from
optparse
import
Values
from
typing
import
List
from
pip._vendor.packaging.utils
import
canonicalize_name
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.base_command
import
Command
from
pip._internal.cli.req_command
import
SessionCommandMixin
,
warn_if_run_as_root
from
pip._internal.cli.status_codes
import
SUCCESS
from
pip._internal.exceptions
import
InstallationError
from
pip._internal.req
import
parse_requirements
from
pip._internal.req.constructors
import
(
install_req_from_line
,
install_req_from_parsed_requirement
,
)
from
pip._internal.utils.misc
import
(
check_externally_managed
,
protect_pip_from_modification_on_windows
,
)
logger
=
logging
.
getLogger
(
__name__
)
class
UninstallCommand
(
Command
,
SessionCommandMixin
):
"""
Uninstall packages.
pip is able to uninstall most installed packages. Known exceptions are:
- Pure distutils packages installed with ``python setup.py install``, which
leave behind no metadata to determine what files were installed.
- Script wrappers installed by ``python setup.py develop``.
"""
usage
=
"""
%prog [options] <package> ...
%prog [options] -r <requirements file> ...
"""
def
add_options
(
self
)
->
None
:
self
.
cmd_opts
.
add_option
(
"
-r
"
,
"
--requirement
"
,
dest
=
"
requirements
"
,
action
=
"
append
"
,
default
=
[],
metavar
=
"
file
"
,
help
=
(
"
Uninstall all the packages listed in the given requirements
"
"
file. This option can be used multiple times.
"
),
)
self
.
cmd_opts
.
add_option
(
"
-y
"
,
"
--yes
"
,
dest
=
"
yes
"
,
action
=
"
store_true
"
,
help
=
"
Don
'
t ask for confirmation of uninstall deletions.
"
,
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
root_user_action
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
override_externally_managed
())
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
def
run
(
self
,
options
:
Values
,
args
:
List
[
str
])
->
int
:
session
=
self
.
get_default_session
(
options
)
reqs_to_uninstall
=
{}
for
name
in
args
:
req
=
install_req_from_line
(
name
,
isolated
=
options
.
isolated_mode
,
)
if
req
.
name
:
reqs_to_uninstall
[
canonicalize_name
(
req
.
name
)]
=
req
else
:
logger
.
warning
(
"
Invalid requirement: %r ignored -
"
"
the uninstall command expects named
"
"
requirements.
"
,
name
,
)
for
filename
in
options
.
requirements
:
for
parsed_req
in
parse_requirements
(
filename
,
options
=
options
,
session
=
session
):
req
=
install_req_from_parsed_requirement
(
parsed_req
,
isolated
=
options
.
isolated_mode
)
if
req
.
name
:
reqs_to_uninstall
[
canonicalize_name
(
req
.
name
)]
=
req
if
not
reqs_to_uninstall
:
raise
InstallationError
(
f
"
You must give at least one requirement to
{
self
.
name
}
(see
"
f
'"
pip help
{
self
.
name
}
"
)
'
)
if
not
options
.
override_externally_managed
:
check_externally_managed
()
protect_pip_from_modification_on_windows
(
modifying_pip
=
"
pip
"
in
reqs_to_uninstall
)
for
req
in
reqs_to_uninstall
.
values
():
uninstall_pathset
=
req
.
uninstall
(
auto_confirm
=
options
.
yes
,
verbose
=
self
.
verbosity
>
0
,
)
if
uninstall_pathset
:
uninstall_pathset
.
commit
()
if
options
.
root_user_action
==
"
warn
"
:
warn_if_run_as_root
()
return
SUCCESS
server-temp/venv/lib/python3.10/site-packages/pip/_internal/commands/wheel.py
deleted
100644 → 0
View file @
03bf2ef9
import
logging
import
os
import
shutil
from
optparse
import
Values
from
typing
import
List
from
pip._internal.cache
import
WheelCache
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.req_command
import
RequirementCommand
,
with_cleanup
from
pip._internal.cli.status_codes
import
SUCCESS
from
pip._internal.exceptions
import
CommandError
from
pip._internal.operations.build.build_tracker
import
get_build_tracker
from
pip._internal.req.req_install
import
(
InstallRequirement
,
LegacySetupPyOptionsCheckMode
,
check_legacy_setup_py_options
,
)
from
pip._internal.utils.deprecation
import
deprecated
from
pip._internal.utils.misc
import
ensure_dir
,
normalize_path
from
pip._internal.utils.temp_dir
import
TempDirectory
from
pip._internal.wheel_builder
import
build
,
should_build_for_wheel_command
logger
=
logging
.
getLogger
(
__name__
)
class
WheelCommand
(
RequirementCommand
):
"""
Build Wheel archives for your requirements and dependencies.
Wheel is a built-package format, and offers the advantage of not
recompiling your software during every install. For more details, see the
wheel docs: https://wheel.readthedocs.io/en/latest/
'
pip wheel
'
uses the build system interface as described here:
https://pip.pypa.io/en/stable/reference/build-system/
"""
usage
=
"""
%prog [options] <requirement specifier> ...
%prog [options] -r <requirements file> ...
%prog [options] [-e] <vcs project url> ...
%prog [options] [-e] <local project path> ...
%prog [options] <archive url/path> ...
"""
def
add_options
(
self
)
->
None
:
self
.
cmd_opts
.
add_option
(
"
-w
"
,
"
--wheel-dir
"
,
dest
=
"
wheel_dir
"
,
metavar
=
"
dir
"
,
default
=
os
.
curdir
,
help
=
(
"
Build wheels into <dir>, where the default is the
"
"
current working directory.
"
),
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
no_binary
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
only_binary
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
prefer_binary
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
no_build_isolation
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
use_pep517
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
no_use_pep517
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
check_build_deps
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
constraints
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
editable
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
requirements
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
src
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
ignore_requires_python
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
no_deps
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
progress_bar
())
self
.
cmd_opts
.
add_option
(
"
--no-verify
"
,
dest
=
"
no_verify
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
"
Don
'
t verify if built wheel is valid.
"
,
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
config_settings
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
build_options
())
self
.
cmd_opts
.
add_option
(
cmdoptions
.
global_options
())
self
.
cmd_opts
.
add_option
(
"
--pre
"
,
action
=
"
store_true
"
,
default
=
False
,
help
=
(
"
Include pre-release and development versions. By default,
"
"
pip only finds stable versions.
"
),
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
require_hashes
())
index_opts
=
cmdoptions
.
make_option_group
(
cmdoptions
.
index_group
,
self
.
parser
,
)
self
.
parser
.
insert_option_group
(
0
,
index_opts
)
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
@with_cleanup
def
run
(
self
,
options
:
Values
,
args
:
List
[
str
])
->
int
:
session
=
self
.
get_default_session
(
options
)
finder
=
self
.
_build_package_finder
(
options
,
session
)
wheel_cache
=
WheelCache
(
options
.
cache_dir
,
options
.
format_control
)
options
.
wheel_dir
=
normalize_path
(
options
.
wheel_dir
)
ensure_dir
(
options
.
wheel_dir
)
build_tracker
=
self
.
enter_context
(
get_build_tracker
())
directory
=
TempDirectory
(
delete
=
not
options
.
no_clean
,
kind
=
"
wheel
"
,
globally_managed
=
True
,
)
reqs
=
self
.
get_requirements
(
args
,
options
,
finder
,
session
)
check_legacy_setup_py_options
(
options
,
reqs
,
LegacySetupPyOptionsCheckMode
.
WHEEL
)
if
"
no-binary-enable-wheel-cache
"
in
options
.
features_enabled
:
# TODO: remove format_control from WheelCache when the deprecation cycle
# is over
wheel_cache
=
WheelCache
(
options
.
cache_dir
)
else
:
if
options
.
format_control
.
no_binary
:
deprecated
(
reason
=
(
"
--no-binary currently disables reading from
"
"
the cache of locally built wheels. In the future
"
"
--no-binary will not influence the wheel cache.
"
),
replacement
=
"
to use the --no-cache-dir option
"
,
feature_flag
=
"
no-binary-enable-wheel-cache
"
,
issue
=
11453
,
gone_in
=
"
23.1
"
,
)
wheel_cache
=
WheelCache
(
options
.
cache_dir
,
options
.
format_control
)
preparer
=
self
.
make_requirement_preparer
(
temp_build_dir
=
directory
,
options
=
options
,
build_tracker
=
build_tracker
,
session
=
session
,
finder
=
finder
,
download_dir
=
options
.
wheel_dir
,
use_user_site
=
False
,
verbosity
=
self
.
verbosity
,
)
resolver
=
self
.
make_resolver
(
preparer
=
preparer
,
finder
=
finder
,
options
=
options
,
wheel_cache
=
wheel_cache
,
ignore_requires_python
=
options
.
ignore_requires_python
,
use_pep517
=
options
.
use_pep517
,
)
self
.
trace_basic_info
(
finder
)
requirement_set
=
resolver
.
resolve
(
reqs
,
check_supported_wheels
=
True
)
reqs_to_build
:
List
[
InstallRequirement
]
=
[]
for
req
in
requirement_set
.
requirements
.
values
():
if
req
.
is_wheel
:
preparer
.
save_linked_requirement
(
req
)
elif
should_build_for_wheel_command
(
req
):
reqs_to_build
.
append
(
req
)
# build wheels
build_successes
,
build_failures
=
build
(
reqs_to_build
,
wheel_cache
=
wheel_cache
,
verify
=
(
not
options
.
no_verify
),
build_options
=
options
.
build_options
or
[],
global_options
=
options
.
global_options
or
[],
)
for
req
in
build_successes
:
assert
req
.
link
and
req
.
link
.
is_wheel
assert
req
.
local_file_path
# copy from cache to target directory
try
:
shutil
.
copy
(
req
.
local_file_path
,
options
.
wheel_dir
)
except
OSError
as
e
:
logger
.
warning
(
"
Building wheel for %s failed: %s
"
,
req
.
name
,
e
,
)
build_failures
.
append
(
req
)
if
len
(
build_failures
)
!=
0
:
raise
CommandError
(
"
Failed to build one or more wheels
"
)
return
SUCCESS
server-temp/venv/lib/python3.10/site-packages/pip/_internal/configuration.py
deleted
100644 → 0
View file @
03bf2ef9
"""
Configuration management setup
Some terminology:
- name
As written in config files.
- value
Value associated with a name
- key
Name combined with it
'
s section (section.name)
- variant
A single word describing where the configuration key-value pair came from
"""
import
configparser
import
locale
import
os
import
sys
from
typing
import
Any
,
Dict
,
Iterable
,
List
,
NewType
,
Optional
,
Tuple
from
pip._internal.exceptions
import
(
ConfigurationError
,
ConfigurationFileCouldNotBeLoaded
,
)
from
pip._internal.utils
import
appdirs
from
pip._internal.utils.compat
import
WINDOWS
from
pip._internal.utils.logging
import
getLogger
from
pip._internal.utils.misc
import
ensure_dir
,
enum
RawConfigParser
=
configparser
.
RawConfigParser
# Shorthand
Kind
=
NewType
(
"
Kind
"
,
str
)
CONFIG_BASENAME
=
"
pip.ini
"
if
WINDOWS
else
"
pip.conf
"
ENV_NAMES_IGNORED
=
"
version
"
,
"
help
"
# The kinds of configurations there are.
kinds
=
enum
(
USER
=
"
user
"
,
# User Specific
GLOBAL
=
"
global
"
,
# System Wide
SITE
=
"
site
"
,
# [Virtual] Environment Specific
ENV
=
"
env
"
,
# from PIP_CONFIG_FILE
ENV_VAR
=
"
env-var
"
,
# from Environment Variables
)
OVERRIDE_ORDER
=
kinds
.
GLOBAL
,
kinds
.
USER
,
kinds
.
SITE
,
kinds
.
ENV
,
kinds
.
ENV_VAR
VALID_LOAD_ONLY
=
kinds
.
USER
,
kinds
.
GLOBAL
,
kinds
.
SITE
logger
=
getLogger
(
__name__
)
# NOTE: Maybe use the optionx attribute to normalize keynames.
def
_normalize_name
(
name
:
str
)
->
str
:
"""
Make a name consistent regardless of source (environment or file)
"""
name
=
name
.
lower
().
replace
(
"
_
"
,
"
-
"
)
if
name
.
startswith
(
"
--
"
):
name
=
name
[
2
:]
# only prefer long opts
return
name
def
_disassemble_key
(
name
:
str
)
->
List
[
str
]:
if
"
.
"
not
in
name
:
error_message
=
(
"
Key does not contain dot separated section and key.
"
"
Perhaps you wanted to use
'
global.{}
'
instead?
"
).
format
(
name
)
raise
ConfigurationError
(
error_message
)
return
name
.
split
(
"
.
"
,
1
)
def
get_configuration_files
()
->
Dict
[
Kind
,
List
[
str
]]:
global_config_files
=
[
os
.
path
.
join
(
path
,
CONFIG_BASENAME
)
for
path
in
appdirs
.
site_config_dirs
(
"
pip
"
)
]
site_config_file
=
os
.
path
.
join
(
sys
.
prefix
,
CONFIG_BASENAME
)
legacy_config_file
=
os
.
path
.
join
(
os
.
path
.
expanduser
(
"
~
"
),
"
pip
"
if
WINDOWS
else
"
.pip
"
,
CONFIG_BASENAME
,
)
new_config_file
=
os
.
path
.
join
(
appdirs
.
user_config_dir
(
"
pip
"
),
CONFIG_BASENAME
)
return
{
kinds
.
GLOBAL
:
global_config_files
,
kinds
.
SITE
:
[
site_config_file
],
kinds
.
USER
:
[
legacy_config_file
,
new_config_file
],
}
class
Configuration
:
"""
Handles management of configuration.
Provides an interface to accessing and managing configuration files.
This class converts provides an API that takes
"
section.key-name
"
style
keys and stores the value associated with it as
"
key-name
"
under the
section
"
section
"
.
This allows for a clean interface wherein the both the section and the
key-name are preserved in an easy to manage form in the configuration files
and the data stored is also nice.
"""
def
__init__
(
self
,
isolated
:
bool
,
load_only
:
Optional
[
Kind
]
=
None
)
->
None
:
super
().
__init__
()
if
load_only
is
not
None
and
load_only
not
in
VALID_LOAD_ONLY
:
raise
ConfigurationError
(
"
Got invalid value for load_only - should be one of {}
"
.
format
(
"
,
"
.
join
(
map
(
repr
,
VALID_LOAD_ONLY
))
)
)
self
.
isolated
=
isolated
self
.
load_only
=
load_only
# Because we keep track of where we got the data from
self
.
_parsers
:
Dict
[
Kind
,
List
[
Tuple
[
str
,
RawConfigParser
]]]
=
{
variant
:
[]
for
variant
in
OVERRIDE_ORDER
}
self
.
_config
:
Dict
[
Kind
,
Dict
[
str
,
Any
]]
=
{
variant
:
{}
for
variant
in
OVERRIDE_ORDER
}
self
.
_modified_parsers
:
List
[
Tuple
[
str
,
RawConfigParser
]]
=
[]
def
load
(
self
)
->
None
:
"""
Loads configuration from configuration files and environment
"""
self
.
_load_config_files
()
if
not
self
.
isolated
:
self
.
_load_environment_vars
()
def
get_file_to_edit
(
self
)
->
Optional
[
str
]:
"""
Returns the file with highest priority in configuration
"""
assert
self
.
load_only
is
not
None
,
"
Need to be specified a file to be editing
"
try
:
return
self
.
_get_parser_to_modify
()[
0
]
except
IndexError
:
return
None
def
items
(
self
)
->
Iterable
[
Tuple
[
str
,
Any
]]:
"""
Returns key-value pairs like dict.items() representing the loaded
configuration
"""
return
self
.
_dictionary
.
items
()
def
get_value
(
self
,
key
:
str
)
->
Any
:
"""
Get a value from the configuration.
"""
orig_key
=
key
key
=
_normalize_name
(
key
)
try
:
return
self
.
_dictionary
[
key
]
except
KeyError
:
# disassembling triggers a more useful error message than simply
# "No such key" in the case that the key isn't in the form command.option
_disassemble_key
(
key
)
raise
ConfigurationError
(
f
"
No such key -
{
orig_key
}
"
)
def
set_value
(
self
,
key
:
str
,
value
:
Any
)
->
None
:
"""
Modify a value in the configuration.
"""
key
=
_normalize_name
(
key
)
self
.
_ensure_have_load_only
()
assert
self
.
load_only
fname
,
parser
=
self
.
_get_parser_to_modify
()
if
parser
is
not
None
:
section
,
name
=
_disassemble_key
(
key
)
# Modify the parser and the configuration
if
not
parser
.
has_section
(
section
):
parser
.
add_section
(
section
)
parser
.
set
(
section
,
name
,
value
)
self
.
_config
[
self
.
load_only
][
key
]
=
value
self
.
_mark_as_modified
(
fname
,
parser
)
def
unset_value
(
self
,
key
:
str
)
->
None
:
"""
Unset a value in the configuration.
"""
orig_key
=
key
key
=
_normalize_name
(
key
)
self
.
_ensure_have_load_only
()
assert
self
.
load_only
if
key
not
in
self
.
_config
[
self
.
load_only
]:
raise
ConfigurationError
(
f
"
No such key -
{
orig_key
}
"
)
fname
,
parser
=
self
.
_get_parser_to_modify
()
if
parser
is
not
None
:
section
,
name
=
_disassemble_key
(
key
)
if
not
(
parser
.
has_section
(
section
)
and
parser
.
remove_option
(
section
,
name
)
):
# The option was not removed.
raise
ConfigurationError
(
"
Fatal Internal error [id=1]. Please report as a bug.
"
)
# The section may be empty after the option was removed.
if
not
parser
.
items
(
section
):
parser
.
remove_section
(
section
)
self
.
_mark_as_modified
(
fname
,
parser
)
del
self
.
_config
[
self
.
load_only
][
key
]
def
save
(
self
)
->
None
:
"""
Save the current in-memory state.
"""
self
.
_ensure_have_load_only
()
for
fname
,
parser
in
self
.
_modified_parsers
:
logger
.
info
(
"
Writing to %s
"
,
fname
)
# Ensure directory exists.
ensure_dir
(
os
.
path
.
dirname
(
fname
))
with
open
(
fname
,
"
w
"
)
as
f
:
parser
.
write
(
f
)
#
# Private routines
#
def
_ensure_have_load_only
(
self
)
->
None
:
if
self
.
load_only
is
None
:
raise
ConfigurationError
(
"
Needed a specific file to be modifying.
"
)
logger
.
debug
(
"
Will be working with %s variant only
"
,
self
.
load_only
)
@property
def
_dictionary
(
self
)
->
Dict
[
str
,
Any
]:
"""
A dictionary representing the loaded configuration.
"""
# NOTE: Dictionaries are not populated if not loaded. So, conditionals
# are not needed here.
retval
=
{}
for
variant
in
OVERRIDE_ORDER
:
retval
.
update
(
self
.
_config
[
variant
])
return
retval
def
_load_config_files
(
self
)
->
None
:
"""
Loads configuration from configuration files
"""
config_files
=
dict
(
self
.
iter_config_files
())
if
config_files
[
kinds
.
ENV
][
0
:
1
]
==
[
os
.
devnull
]:
logger
.
debug
(
"
Skipping loading configuration files due to
"
"
environment
'
s PIP_CONFIG_FILE being os.devnull
"
)
return
for
variant
,
files
in
config_files
.
items
():
for
fname
in
files
:
# If there's specific variant set in `load_only`, load only
# that variant, not the others.
if
self
.
load_only
is
not
None
and
variant
!=
self
.
load_only
:
logger
.
debug
(
"
Skipping file
'
%s
'
(variant: %s)
"
,
fname
,
variant
)
continue
parser
=
self
.
_load_file
(
variant
,
fname
)
# Keeping track of the parsers used
self
.
_parsers
[
variant
].
append
((
fname
,
parser
))
def
_load_file
(
self
,
variant
:
Kind
,
fname
:
str
)
->
RawConfigParser
:
logger
.
verbose
(
"
For variant
'
%s
'
, will try loading
'
%s
'"
,
variant
,
fname
)
parser
=
self
.
_construct_parser
(
fname
)
for
section
in
parser
.
sections
():
items
=
parser
.
items
(
section
)
self
.
_config
[
variant
].
update
(
self
.
_normalized_keys
(
section
,
items
))
return
parser
def
_construct_parser
(
self
,
fname
:
str
)
->
RawConfigParser
:
parser
=
configparser
.
RawConfigParser
()
# If there is no such file, don't bother reading it but create the
# parser anyway, to hold the data.
# Doing this is useful when modifying and saving files, where we don't
# need to construct a parser.
if
os
.
path
.
exists
(
fname
):
locale_encoding
=
locale
.
getpreferredencoding
(
False
)
try
:
parser
.
read
(
fname
,
encoding
=
locale_encoding
)
except
UnicodeDecodeError
:
# See https://github.com/pypa/pip/issues/4963
raise
ConfigurationFileCouldNotBeLoaded
(
reason
=
f
"
contains invalid
{
locale_encoding
}
characters
"
,
fname
=
fname
,
)
except
configparser
.
Error
as
error
:
# See https://github.com/pypa/pip/issues/4893
raise
ConfigurationFileCouldNotBeLoaded
(
error
=
error
)
return
parser
def
_load_environment_vars
(
self
)
->
None
:
"""
Loads configuration from environment variables
"""
self
.
_config
[
kinds
.
ENV_VAR
].
update
(
self
.
_normalized_keys
(
"
:env:
"
,
self
.
get_environ_vars
())
)
def
_normalized_keys
(
self
,
section
:
str
,
items
:
Iterable
[
Tuple
[
str
,
Any
]]
)
->
Dict
[
str
,
Any
]:
"""
Normalizes items to construct a dictionary with normalized keys.
This routine is where the names become keys and are made the same
regardless of source - configuration files or environment.
"""
normalized
=
{}
for
name
,
val
in
items
:
key
=
section
+
"
.
"
+
_normalize_name
(
name
)
normalized
[
key
]
=
val
return
normalized
def
get_environ_vars
(
self
)
->
Iterable
[
Tuple
[
str
,
str
]]:
"""
Returns a generator with all environmental vars with prefix PIP_
"""
for
key
,
val
in
os
.
environ
.
items
():
if
key
.
startswith
(
"
PIP_
"
):
name
=
key
[
4
:].
lower
()
if
name
not
in
ENV_NAMES_IGNORED
:
yield
name
,
val
# XXX: This is patched in the tests.
def
iter_config_files
(
self
)
->
Iterable
[
Tuple
[
Kind
,
List
[
str
]]]:
"""
Yields variant and configuration files associated with it.
This should be treated like items of a dictionary.
"""
# SMELL: Move the conditions out of this function
# environment variables have the lowest priority
config_file
=
os
.
environ
.
get
(
"
PIP_CONFIG_FILE
"
,
None
)
if
config_file
is
not
None
:
yield
kinds
.
ENV
,
[
config_file
]
else
:
yield
kinds
.
ENV
,
[]
config_files
=
get_configuration_files
()
# at the base we have any global configuration
yield
kinds
.
GLOBAL
,
config_files
[
kinds
.
GLOBAL
]
# per-user configuration next
should_load_user_config
=
not
self
.
isolated
and
not
(
config_file
and
os
.
path
.
exists
(
config_file
)
)
if
should_load_user_config
:
# The legacy config file is overridden by the new config file
yield
kinds
.
USER
,
config_files
[
kinds
.
USER
]
# finally virtualenv configuration first trumping others
yield
kinds
.
SITE
,
config_files
[
kinds
.
SITE
]
def
get_values_in_config
(
self
,
variant
:
Kind
)
->
Dict
[
str
,
Any
]:
"""
Get values present in a config file
"""
return
self
.
_config
[
variant
]
def
_get_parser_to_modify
(
self
)
->
Tuple
[
str
,
RawConfigParser
]:
# Determine which parser to modify
assert
self
.
load_only
parsers
=
self
.
_parsers
[
self
.
load_only
]
if
not
parsers
:
# This should not happen if everything works correctly.
raise
ConfigurationError
(
"
Fatal Internal error [id=2]. Please report as a bug.
"
)
# Use the highest priority parser.
return
parsers
[
-
1
]
# XXX: This is patched in the tests.
def
_mark_as_modified
(
self
,
fname
:
str
,
parser
:
RawConfigParser
)
->
None
:
file_parser_tuple
=
(
fname
,
parser
)
if
file_parser_tuple
not
in
self
.
_modified_parsers
:
self
.
_modified_parsers
.
append
(
file_parser_tuple
)
def
__repr__
(
self
)
->
str
:
return
f
"
{
self
.
__class__
.
__name__
}
(
{
self
.
_dictionary
!r}
)
"
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__init__.py
deleted
100644 → 0
View file @
03bf2ef9
from
pip._internal.distributions.base
import
AbstractDistribution
from
pip._internal.distributions.sdist
import
SourceDistribution
from
pip._internal.distributions.wheel
import
WheelDistribution
from
pip._internal.req.req_install
import
InstallRequirement
def
make_distribution_for_install_requirement
(
install_req
:
InstallRequirement
,
)
->
AbstractDistribution
:
"""
Returns a Distribution for the given InstallRequirement
"""
# Editable requirements will always be source distributions. They use the
# legacy logic until we create a modern standard for them.
if
install_req
.
editable
:
return
SourceDistribution
(
install_req
)
# If it's a wheel, it's a WheelDistribution
if
install_req
.
is_wheel
:
return
WheelDistribution
(
install_req
)
# Otherwise, a SourceDistribution
return
SourceDistribution
(
install_req
)
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc
deleted
100644 → 0
View file @
03bf2ef9
File deleted
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/base.cpython-310.pyc
deleted
100644 → 0
View file @
03bf2ef9
File deleted
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc
deleted
100644 → 0
View file @
03bf2ef9
File deleted
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc
deleted
100644 → 0
View file @
03bf2ef9
File deleted
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc
deleted
100644 → 0
View file @
03bf2ef9
File deleted
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/base.py
deleted
100644 → 0
View file @
03bf2ef9
import
abc
from
pip._internal.index.package_finder
import
PackageFinder
from
pip._internal.metadata.base
import
BaseDistribution
from
pip._internal.req
import
InstallRequirement
class
AbstractDistribution
(
metaclass
=
abc
.
ABCMeta
):
"""
A base class for handling installable artifacts.
The requirements for anything installable are as follows:
- we must be able to determine the requirement name
(or we can
'
t correctly handle the non-upgrade case).
- for packages with setup requirements, we must also be able
to determine their requirements without installing additional
packages (for the same reason as run-time dependencies)
- we must be able to create a Distribution object exposing the
above metadata.
"""
def
__init__
(
self
,
req
:
InstallRequirement
)
->
None
:
super
().
__init__
()
self
.
req
=
req
@abc.abstractmethod
def
get_metadata_distribution
(
self
)
->
BaseDistribution
:
raise
NotImplementedError
()
@abc.abstractmethod
def
prepare_distribution_metadata
(
self
,
finder
:
PackageFinder
,
build_isolation
:
bool
,
check_build_deps
:
bool
,
)
->
None
:
raise
NotImplementedError
()
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/installed.py
deleted
100644 → 0
View file @
03bf2ef9
from
pip._internal.distributions.base
import
AbstractDistribution
from
pip._internal.index.package_finder
import
PackageFinder
from
pip._internal.metadata
import
BaseDistribution
class
InstalledDistribution
(
AbstractDistribution
):
"""
Represents an installed package.
This does not need any preparation as the required information has already
been computed.
"""
def
get_metadata_distribution
(
self
)
->
BaseDistribution
:
assert
self
.
req
.
satisfied_by
is
not
None
,
"
not actually installed
"
return
self
.
req
.
satisfied_by
def
prepare_distribution_metadata
(
self
,
finder
:
PackageFinder
,
build_isolation
:
bool
,
check_build_deps
:
bool
,
)
->
None
:
pass
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py
deleted
100644 → 0
View file @
03bf2ef9
import
logging
from
typing
import
Iterable
,
Set
,
Tuple
from
pip._internal.build_env
import
BuildEnvironment
from
pip._internal.distributions.base
import
AbstractDistribution
from
pip._internal.exceptions
import
InstallationError
from
pip._internal.index.package_finder
import
PackageFinder
from
pip._internal.metadata
import
BaseDistribution
from
pip._internal.utils.subprocess
import
runner_with_spinner_message
logger
=
logging
.
getLogger
(
__name__
)
class
SourceDistribution
(
AbstractDistribution
):
"""
Represents a source distribution.
The preparation step for these needs metadata for the packages to be
generated, either using PEP 517 or using the legacy `setup.py egg_info`.
"""
def
get_metadata_distribution
(
self
)
->
BaseDistribution
:
return
self
.
req
.
get_dist
()
def
prepare_distribution_metadata
(
self
,
finder
:
PackageFinder
,
build_isolation
:
bool
,
check_build_deps
:
bool
,
)
->
None
:
# Load pyproject.toml, to determine whether PEP 517 is to be used
self
.
req
.
load_pyproject_toml
()
# Set up the build isolation, if this requirement should be isolated
should_isolate
=
self
.
req
.
use_pep517
and
build_isolation
if
should_isolate
:
# Setup an isolated environment and install the build backend static
# requirements in it.
self
.
_prepare_build_backend
(
finder
)
# Check that if the requirement is editable, it either supports PEP 660 or
# has a setup.py or a setup.cfg. This cannot be done earlier because we need
# to setup the build backend to verify it supports build_editable, nor can
# it be done later, because we want to avoid installing build requirements
# needlessly. Doing it here also works around setuptools generating
# UNKNOWN.egg-info when running get_requires_for_build_wheel on a directory
# without setup.py nor setup.cfg.
self
.
req
.
isolated_editable_sanity_check
()
# Install the dynamic build requirements.
self
.
_install_build_reqs
(
finder
)
# Check if the current environment provides build dependencies
should_check_deps
=
self
.
req
.
use_pep517
and
check_build_deps
if
should_check_deps
:
pyproject_requires
=
self
.
req
.
pyproject_requires
assert
pyproject_requires
is
not
None
conflicting
,
missing
=
self
.
req
.
build_env
.
check_requirements
(
pyproject_requires
)
if
conflicting
:
self
.
_raise_conflicts
(
"
the backend dependencies
"
,
conflicting
)
if
missing
:
self
.
_raise_missing_reqs
(
missing
)
self
.
req
.
prepare_metadata
()
def
_prepare_build_backend
(
self
,
finder
:
PackageFinder
)
->
None
:
# Isolate in a BuildEnvironment and install the build-time
# requirements.
pyproject_requires
=
self
.
req
.
pyproject_requires
assert
pyproject_requires
is
not
None
self
.
req
.
build_env
=
BuildEnvironment
()
self
.
req
.
build_env
.
install_requirements
(
finder
,
pyproject_requires
,
"
overlay
"
,
kind
=
"
build dependencies
"
)
conflicting
,
missing
=
self
.
req
.
build_env
.
check_requirements
(
self
.
req
.
requirements_to_check
)
if
conflicting
:
self
.
_raise_conflicts
(
"
PEP 517/518 supported requirements
"
,
conflicting
)
if
missing
:
logger
.
warning
(
"
Missing build requirements in pyproject.toml for %s.
"
,
self
.
req
,
)
logger
.
warning
(
"
The project does not specify a build backend, and
"
"
pip cannot fall back to setuptools without %s.
"
,
"
and
"
.
join
(
map
(
repr
,
sorted
(
missing
))),
)
def
_get_build_requires_wheel
(
self
)
->
Iterable
[
str
]:
with
self
.
req
.
build_env
:
runner
=
runner_with_spinner_message
(
"
Getting requirements to build wheel
"
)
backend
=
self
.
req
.
pep517_backend
assert
backend
is
not
None
with
backend
.
subprocess_runner
(
runner
):
return
backend
.
get_requires_for_build_wheel
()
def
_get_build_requires_editable
(
self
)
->
Iterable
[
str
]:
with
self
.
req
.
build_env
:
runner
=
runner_with_spinner_message
(
"
Getting requirements to build editable
"
)
backend
=
self
.
req
.
pep517_backend
assert
backend
is
not
None
with
backend
.
subprocess_runner
(
runner
):
return
backend
.
get_requires_for_build_editable
()
def
_install_build_reqs
(
self
,
finder
:
PackageFinder
)
->
None
:
# Install any extra build dependencies that the backend requests.
# This must be done in a second pass, as the pyproject.toml
# dependencies must be installed before we can call the backend.
if
(
self
.
req
.
editable
and
self
.
req
.
permit_editable_wheels
and
self
.
req
.
supports_pyproject_editable
()
):
build_reqs
=
self
.
_get_build_requires_editable
()
else
:
build_reqs
=
self
.
_get_build_requires_wheel
()
conflicting
,
missing
=
self
.
req
.
build_env
.
check_requirements
(
build_reqs
)
if
conflicting
:
self
.
_raise_conflicts
(
"
the backend dependencies
"
,
conflicting
)
self
.
req
.
build_env
.
install_requirements
(
finder
,
missing
,
"
normal
"
,
kind
=
"
backend dependencies
"
)
def
_raise_conflicts
(
self
,
conflicting_with
:
str
,
conflicting_reqs
:
Set
[
Tuple
[
str
,
str
]]
)
->
None
:
format_string
=
(
"
Some build dependencies for {requirement}
"
"
conflict with {conflicting_with}: {description}.
"
)
error_message
=
format_string
.
format
(
requirement
=
self
.
req
,
conflicting_with
=
conflicting_with
,
description
=
"
,
"
.
join
(
f
"
{
installed
}
is incompatible with
{
wanted
}
"
for
installed
,
wanted
in
sorted
(
conflicting_reqs
)
),
)
raise
InstallationError
(
error_message
)
def
_raise_missing_reqs
(
self
,
missing
:
Set
[
str
])
->
None
:
format_string
=
(
"
Some build dependencies for {requirement} are missing: {missing}.
"
)
error_message
=
format_string
.
format
(
requirement
=
self
.
req
,
missing
=
"
,
"
.
join
(
map
(
repr
,
sorted
(
missing
)))
)
raise
InstallationError
(
error_message
)
server-temp/venv/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py
deleted
100644 → 0
View file @
03bf2ef9
from
pip._vendor.packaging.utils
import
canonicalize_name
from
pip._internal.distributions.base
import
AbstractDistribution
from
pip._internal.index.package_finder
import
PackageFinder
from
pip._internal.metadata
import
(
BaseDistribution
,
FilesystemWheel
,
get_wheel_distribution
,
)
class
WheelDistribution
(
AbstractDistribution
):
"""
Represents a wheel distribution.
This does not need any preparation as wheels can be directly unpacked.
"""
def
get_metadata_distribution
(
self
)
->
BaseDistribution
:
"""
Loads the metadata from the wheel file into memory and returns a
Distribution that uses it, not relying on the wheel file or
requirement.
"""
assert
self
.
req
.
local_file_path
,
"
Set as part of preparation during download
"
assert
self
.
req
.
name
,
"
Wheels are never unnamed
"
wheel
=
FilesystemWheel
(
self
.
req
.
local_file_path
)
return
get_wheel_distribution
(
wheel
,
canonicalize_name
(
self
.
req
.
name
))
def
prepare_distribution_metadata
(
self
,
finder
:
PackageFinder
,
build_isolation
:
bool
,
check_build_deps
:
bool
,
)
->
None
:
pass
Prev
1
…
13
14
15
16
17
18
Next