Загрузить файлы в «venv/Lib/site-packages/pip/_internal/utils»
This commit is contained in:
BIN
venv/Lib/site-packages/pip/_internal/utils/__init__.py
Normal file
BIN
venv/Lib/site-packages/pip/_internal/utils/__init__.py
Normal file
Binary file not shown.
109
venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py
Normal file
109
venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
"""Functions brought over from jaraco.text.
|
||||||
|
|
||||||
|
These functions are not supposed to be used within `pip._internal`. These are
|
||||||
|
helper functions brought over from `jaraco.text` to enable vendoring newer
|
||||||
|
copies of `pkg_resources` without having to vendor `jaraco.text` and its entire
|
||||||
|
dependency cone; something that our vendoring setup is not currently capable of
|
||||||
|
handling.
|
||||||
|
|
||||||
|
License reproduced from original source below:
|
||||||
|
|
||||||
|
Copyright Jason R. Coombs
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to
|
||||||
|
deal in the Software without restriction, including without limitation the
|
||||||
|
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
IN THE SOFTWARE.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import functools
|
||||||
|
import itertools
|
||||||
|
|
||||||
|
|
||||||
|
def _nonblank(str):
|
||||||
|
return str and not str.startswith("#")
|
||||||
|
|
||||||
|
|
||||||
|
@functools.singledispatch
|
||||||
|
def yield_lines(iterable):
|
||||||
|
r"""
|
||||||
|
Yield valid lines of a string or iterable.
|
||||||
|
|
||||||
|
>>> list(yield_lines(''))
|
||||||
|
[]
|
||||||
|
>>> list(yield_lines(['foo', 'bar']))
|
||||||
|
['foo', 'bar']
|
||||||
|
>>> list(yield_lines('foo\nbar'))
|
||||||
|
['foo', 'bar']
|
||||||
|
>>> list(yield_lines('\nfoo\n#bar\nbaz #comment'))
|
||||||
|
['foo', 'baz #comment']
|
||||||
|
>>> list(yield_lines(['foo\nbar', 'baz', 'bing\n\n\n']))
|
||||||
|
['foo', 'bar', 'baz', 'bing']
|
||||||
|
"""
|
||||||
|
return itertools.chain.from_iterable(map(yield_lines, iterable))
|
||||||
|
|
||||||
|
|
||||||
|
@yield_lines.register(str)
|
||||||
|
def _(text):
|
||||||
|
return filter(_nonblank, map(str.strip, text.splitlines()))
|
||||||
|
|
||||||
|
|
||||||
|
def drop_comment(line):
|
||||||
|
"""
|
||||||
|
Drop comments.
|
||||||
|
|
||||||
|
>>> drop_comment('foo # bar')
|
||||||
|
'foo'
|
||||||
|
|
||||||
|
A hash without a space may be in a URL.
|
||||||
|
|
||||||
|
>>> drop_comment('http://example.com/foo#bar')
|
||||||
|
'http://example.com/foo#bar'
|
||||||
|
"""
|
||||||
|
return line.partition(" #")[0]
|
||||||
|
|
||||||
|
|
||||||
|
def join_continuation(lines):
|
||||||
|
r"""
|
||||||
|
Join lines continued by a trailing backslash.
|
||||||
|
|
||||||
|
>>> list(join_continuation(['foo \\', 'bar', 'baz']))
|
||||||
|
['foobar', 'baz']
|
||||||
|
>>> list(join_continuation(['foo \\', 'bar', 'baz']))
|
||||||
|
['foobar', 'baz']
|
||||||
|
>>> list(join_continuation(['foo \\', 'bar \\', 'baz']))
|
||||||
|
['foobarbaz']
|
||||||
|
|
||||||
|
Not sure why, but...
|
||||||
|
The character preceding the backslash is also elided.
|
||||||
|
|
||||||
|
>>> list(join_continuation(['goo\\', 'dly']))
|
||||||
|
['godly']
|
||||||
|
|
||||||
|
A terrible idea, but...
|
||||||
|
If no line is available to continue, suppress the lines.
|
||||||
|
|
||||||
|
>>> list(join_continuation(['foo', 'bar\\', 'baz\\']))
|
||||||
|
['foo']
|
||||||
|
"""
|
||||||
|
lines = iter(lines)
|
||||||
|
for item in lines:
|
||||||
|
while item.endswith("\\"):
|
||||||
|
try:
|
||||||
|
item = item[:-2].strip() + next(lines)
|
||||||
|
except StopIteration:
|
||||||
|
return
|
||||||
|
yield item
|
||||||
38
venv/Lib/site-packages/pip/_internal/utils/_log.py
Normal file
38
venv/Lib/site-packages/pip/_internal/utils/_log.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
"""Customize logging
|
||||||
|
|
||||||
|
Defines custom logger class for the `logger.verbose(...)` method.
|
||||||
|
|
||||||
|
init_logging() must be called before any other modules that call logging.getLogger.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from typing import Any, cast
|
||||||
|
|
||||||
|
# custom log level for `--verbose` output
|
||||||
|
# between DEBUG and INFO
|
||||||
|
VERBOSE = 15
|
||||||
|
|
||||||
|
|
||||||
|
class VerboseLogger(logging.Logger):
|
||||||
|
"""Custom Logger, defining a verbose log-level
|
||||||
|
|
||||||
|
VERBOSE is between INFO and DEBUG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def verbose(self, msg: str, *args: Any, **kwargs: Any) -> None:
|
||||||
|
return self.log(VERBOSE, msg, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
def getLogger(name: str) -> VerboseLogger:
|
||||||
|
"""logging.getLogger, but ensures our VerboseLogger class is returned"""
|
||||||
|
return cast(VerboseLogger, logging.getLogger(name))
|
||||||
|
|
||||||
|
|
||||||
|
def init_logging() -> None:
|
||||||
|
"""Register our VerboseLogger and VERBOSE log level.
|
||||||
|
|
||||||
|
Should be called before any calls to getLogger(),
|
||||||
|
i.e. in pip._internal.__init__
|
||||||
|
"""
|
||||||
|
logging.setLoggerClass(VerboseLogger)
|
||||||
|
logging.addLevelName(VERBOSE, "VERBOSE")
|
||||||
52
venv/Lib/site-packages/pip/_internal/utils/appdirs.py
Normal file
52
venv/Lib/site-packages/pip/_internal/utils/appdirs.py
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
"""
|
||||||
|
This code wraps the vendored appdirs module to so the return values are
|
||||||
|
compatible for the current pip code base.
|
||||||
|
|
||||||
|
The intention is to rewrite current usages gradually, keeping the tests pass,
|
||||||
|
and eventually drop this after all usages are changed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from pip._vendor import platformdirs as _appdirs
|
||||||
|
|
||||||
|
|
||||||
|
def user_cache_dir(appname: str) -> str:
|
||||||
|
return _appdirs.user_cache_dir(appname, appauthor=False)
|
||||||
|
|
||||||
|
|
||||||
|
def _macos_user_config_dir(appname: str, roaming: bool = True) -> str:
|
||||||
|
# Use ~/Application Support/pip, if the directory exists.
|
||||||
|
path = _appdirs.user_data_dir(appname, appauthor=False, roaming=roaming)
|
||||||
|
if os.path.isdir(path):
|
||||||
|
return path
|
||||||
|
|
||||||
|
# Use a Linux-like ~/.config/pip, by default.
|
||||||
|
linux_like_path = "~/.config/"
|
||||||
|
if appname:
|
||||||
|
linux_like_path = os.path.join(linux_like_path, appname)
|
||||||
|
|
||||||
|
return os.path.expanduser(linux_like_path)
|
||||||
|
|
||||||
|
|
||||||
|
def user_config_dir(appname: str, roaming: bool = True) -> str:
|
||||||
|
if sys.platform == "darwin":
|
||||||
|
return _macos_user_config_dir(appname, roaming)
|
||||||
|
|
||||||
|
return _appdirs.user_config_dir(appname, appauthor=False, roaming=roaming)
|
||||||
|
|
||||||
|
|
||||||
|
# for the discussion regarding site_config_dir locations
|
||||||
|
# see <https://github.com/pypa/pip/issues/1733>
|
||||||
|
def site_config_dirs(appname: str) -> list[str]:
|
||||||
|
if sys.platform == "darwin":
|
||||||
|
dirval = _appdirs.site_data_dir(appname, appauthor=False, multipath=True)
|
||||||
|
return dirval.split(os.pathsep)
|
||||||
|
|
||||||
|
dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True)
|
||||||
|
if sys.platform == "win32":
|
||||||
|
return [dirval]
|
||||||
|
|
||||||
|
# Unix-y system. Look in /etc as well.
|
||||||
|
return dirval.split(os.pathsep) + ["/etc"]
|
||||||
85
venv/Lib/site-packages/pip/_internal/utils/compat.py
Normal file
85
venv/Lib/site-packages/pip/_internal/utils/compat.py
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
"""Stuff that differs in different Python versions and platform
|
||||||
|
distributions."""
|
||||||
|
|
||||||
|
import importlib.resources
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from typing import IO
|
||||||
|
|
||||||
|
__all__ = ["get_path_uid", "stdlib_pkgs", "tomllib", "WINDOWS"]
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def has_tls() -> bool:
|
||||||
|
try:
|
||||||
|
import _ssl # noqa: F401 # ignore unused
|
||||||
|
|
||||||
|
return True
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
from pip._vendor.urllib3.util import IS_PYOPENSSL
|
||||||
|
|
||||||
|
return IS_PYOPENSSL
|
||||||
|
|
||||||
|
|
||||||
|
def get_path_uid(path: str) -> int:
|
||||||
|
"""
|
||||||
|
Return path's uid.
|
||||||
|
|
||||||
|
Does not follow symlinks:
|
||||||
|
https://github.com/pypa/pip/pull/935#discussion_r5307003
|
||||||
|
|
||||||
|
Placed this function in compat due to differences on AIX and
|
||||||
|
Jython, that should eventually go away.
|
||||||
|
|
||||||
|
:raises OSError: When path is a symlink or can't be read.
|
||||||
|
"""
|
||||||
|
if hasattr(os, "O_NOFOLLOW"):
|
||||||
|
fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW)
|
||||||
|
file_uid = os.fstat(fd).st_uid
|
||||||
|
os.close(fd)
|
||||||
|
else: # AIX and Jython
|
||||||
|
# WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW
|
||||||
|
if not os.path.islink(path):
|
||||||
|
# older versions of Jython don't have `os.fstat`
|
||||||
|
file_uid = os.stat(path).st_uid
|
||||||
|
else:
|
||||||
|
# raise OSError for parity with os.O_NOFOLLOW above
|
||||||
|
raise OSError(f"{path} is a symlink; Will not return uid for symlinks")
|
||||||
|
return file_uid
|
||||||
|
|
||||||
|
|
||||||
|
# The importlib.resources.open_text function was deprecated in 3.11 with suggested
|
||||||
|
# replacement we use below.
|
||||||
|
if sys.version_info < (3, 11):
|
||||||
|
open_text_resource = importlib.resources.open_text
|
||||||
|
else:
|
||||||
|
|
||||||
|
def open_text_resource(
|
||||||
|
package: str, resource: str, encoding: str = "utf-8", errors: str = "strict"
|
||||||
|
) -> IO[str]:
|
||||||
|
return (importlib.resources.files(package) / resource).open(
|
||||||
|
"r", encoding=encoding, errors=errors
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if sys.version_info >= (3, 11):
|
||||||
|
import tomllib
|
||||||
|
else:
|
||||||
|
from pip._vendor import tomli as tomllib
|
||||||
|
|
||||||
|
|
||||||
|
# packages in the stdlib that may have installation metadata, but should not be
|
||||||
|
# considered 'installed'. this theoretically could be determined based on
|
||||||
|
# dist.location (py27:`sysconfig.get_paths()['stdlib']`,
|
||||||
|
# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may
|
||||||
|
# make this ineffective, so hard-coding
|
||||||
|
stdlib_pkgs = {"python", "wsgiref", "argparse"}
|
||||||
|
|
||||||
|
|
||||||
|
# windows detection, covers cpython and ironpython
|
||||||
|
WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt")
|
||||||
Reference in New Issue
Block a user