1
1
Fork 0
mirror of https://github.com/pypa/pip synced 2023-12-13 21:30:23 +01:00

Remove unnecessary uses of six.ensure_(binary|str|text)

Now that Python 2 is not supported, the bytes/str boundaries are more
clear and explicit. Using six.ensure_* methods for backwards
compatibility is no longer necessary as the types are known and verified
using mypy.

One exception is tests/lib/wheel.py which allows tests to pass test
setup data as either bytes or str.

The module operations.install.wheel also remains untouched as it is
especially delicate to bytes/str mixups and the current version is
working.
This commit is contained in:
Jon Dufresne 2020-12-26 08:31:00 -08:00
parent 609d9d4a68
commit c115cdc81a
11 changed files with 26 additions and 54 deletions

View file

@ -16,7 +16,7 @@ import sys
import urllib.parse import urllib.parse
import warnings import warnings
from pip._vendor import requests, six, urllib3 from pip._vendor import requests, urllib3
from pip._vendor.cachecontrol import CacheControlAdapter from pip._vendor.cachecontrol import CacheControlAdapter
from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter
from pip._vendor.requests.models import Response from pip._vendor.requests.models import Response
@ -367,14 +367,8 @@ class PipSession(requests.Session):
continue continue
try: try:
addr = ipaddress.ip_address( addr = ipaddress.ip_address(origin_host)
None network = ipaddress.ip_network(secure_host)
if origin_host is None
else six.ensure_text(origin_host)
)
network = ipaddress.ip_network(
six.ensure_text(secure_host)
)
except ValueError: except ValueError:
# We don't have both a valid address or a valid network, so # We don't have both a valid address or a valid network, so
# we'll check this origin against hostnames. # we'll check this origin against hostnames.

View file

@ -255,7 +255,7 @@ class InstallRequirement:
# type: () -> Optional[str] # type: () -> Optional[str]
if self.req is None: if self.req is None:
return None return None
return six.ensure_str(pkg_resources.safe_name(self.req.name)) return pkg_resources.safe_name(self.req.name)
@property @property
def specifier(self): def specifier(self):

View file

@ -6,7 +6,6 @@ import os.path
import sys import sys
from pip._vendor.packaging import version as packaging_version from pip._vendor.packaging import version as packaging_version
from pip._vendor.six import ensure_binary
from pip._internal.index.collector import LinkCollector from pip._internal.index.collector import LinkCollector
from pip._internal.index.package_finder import PackageFinder from pip._internal.index.package_finder import PackageFinder
@ -31,7 +30,7 @@ logger = logging.getLogger(__name__)
def _get_statefile_name(key): def _get_statefile_name(key):
# type: (str) -> str # type: (str) -> str
key_bytes = ensure_binary(key) key_bytes = key.encode()
name = hashlib.sha224(key_bytes).hexdigest() name = hashlib.sha224(key_bytes).hexdigest()
return name return name
@ -85,7 +84,7 @@ class SelfCheckState:
text = json.dumps(state, sort_keys=True, separators=(",", ":")) text = json.dumps(state, sort_keys=True, separators=(",", ":"))
with adjacent_tmp_file(self.statefile_path) as f: with adjacent_tmp_file(self.statefile_path) as f:
f.write(ensure_binary(text)) f.write(text.encode())
try: try:
# Since we have a prefix-specific state file, we can just # Since we have a prefix-specific state file, we can just

View file

@ -1,5 +1,4 @@
from pip._vendor.pkg_resources import yield_lines from pip._vendor.pkg_resources import yield_lines
from pip._vendor.six import ensure_str
from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.typing import MYPY_CHECK_RUNNING
@ -21,7 +20,7 @@ class DictMetadata:
def get_metadata(self, name): def get_metadata(self, name):
# type: (str) -> str # type: (str) -> str
try: try:
return ensure_str(self._metadata[name]) return self._metadata[name].decode()
except UnicodeDecodeError as e: except UnicodeDecodeError as e:
# Mirrors handling done in pkg_resources.NullProvider. # Mirrors handling done in pkg_resources.NullProvider.
e.reason += f" in {name} file" e.reason += f" in {name} file"

View file

@ -6,9 +6,7 @@ import tempfile
from contextlib import contextmanager from contextlib import contextmanager
from pip._vendor.contextlib2 import ExitStack from pip._vendor.contextlib2 import ExitStack
from pip._vendor.six import ensure_text
from pip._internal.utils.compat import WINDOWS
from pip._internal.utils.misc import enum, rmtree from pip._internal.utils.misc import enum, rmtree
from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.typing import MYPY_CHECK_RUNNING
@ -196,15 +194,7 @@ class TempDirectory:
self._deleted = True self._deleted = True
if not os.path.exists(self._path): if not os.path.exists(self._path):
return return
# Make sure to pass unicode on Python 2 to make the contents also rmtree(self._path)
# use unicode, ensuring non-ASCII names and can be represented.
# This is only done on Windows because POSIX platforms use bytes
# natively for paths, and the bytes-text conversion omission avoids
# errors caused by the environment configuring encodings incorrectly.
if WINDOWS:
rmtree(ensure_text(self._path))
else:
rmtree(self._path)
class AdjacentTempDirectory(TempDirectory): class AdjacentTempDirectory(TempDirectory):

View file

@ -7,7 +7,6 @@ from zipfile import BadZipFile, ZipFile
from pip._vendor.packaging.utils import canonicalize_name from pip._vendor.packaging.utils import canonicalize_name
from pip._vendor.pkg_resources import DistInfoDistribution from pip._vendor.pkg_resources import DistInfoDistribution
from pip._vendor.six import ensure_str
from pip._internal.exceptions import UnsupportedWheel from pip._internal.exceptions import UnsupportedWheel
from pip._internal.utils.pkg_resources import DictMetadata from pip._internal.utils.pkg_resources import DictMetadata
@ -62,17 +61,10 @@ def pkg_resources_distribution_for_wheel(wheel_zip, name, location):
metadata_text = {} # type: Dict[str, bytes] metadata_text = {} # type: Dict[str, bytes]
for path in metadata_files: for path in metadata_files:
# If a flag is set, namelist entries may be unicode in Python 2. _, metadata_name = path.split("/", 1)
# We coerce them to native str type to match the types used in the rest
# of the code. This cannot fail because unicode can always be encoded
# with UTF-8.
full_path = ensure_str(path)
_, metadata_name = full_path.split("/", 1)
try: try:
metadata_text[metadata_name] = read_wheel_metadata_file( metadata_text[metadata_name] = read_wheel_metadata_file(wheel_zip, path)
wheel_zip, full_path
)
except UnsupportedWheel as e: except UnsupportedWheel as e:
raise UnsupportedWheel( raise UnsupportedWheel(
"{} has an invalid wheel, {}".format(name, str(e)) "{} has an invalid wheel, {}".format(name, str(e))
@ -139,9 +131,7 @@ def wheel_dist_info_dir(source, name):
) )
) )
# Zip file paths can be unicode or str depending on the zip entry flags, return info_dir
# so normalize it.
return ensure_str(info_dir)
def read_wheel_metadata_file(source, path): def read_wheel_metadata_file(source, path):
@ -166,7 +156,7 @@ def wheel_metadata(source, dist_info_dir):
wheel_contents = read_wheel_metadata_file(source, path) wheel_contents = read_wheel_metadata_file(source, path)
try: try:
wheel_text = ensure_str(wheel_contents) wheel_text = wheel_contents.decode()
except UnicodeDecodeError as e: except UnicodeDecodeError as e:
raise UnsupportedWheel(f"error decoding {path!r}: {e!r}") raise UnsupportedWheel(f"error decoding {path!r}: {e!r}")

View file

@ -13,7 +13,6 @@ from textwrap import dedent
from zipfile import ZipFile from zipfile import ZipFile
import pytest import pytest
from pip._vendor.six import ensure_binary
from scripttest import FoundDir, TestFileEnvironment from scripttest import FoundDir, TestFileEnvironment
from pip._internal.index.collector import LinkCollector from pip._internal.index.collector import LinkCollector
@ -1095,7 +1094,7 @@ def create_basic_sdist_for_package(
for fname in files: for fname in files:
path = script.temp_path / fname path = script.temp_path / fname
path.parent.mkdir(exist_ok=True, parents=True) path.parent.mkdir(exist_ok=True, parents=True)
path.write_bytes(ensure_binary(files[fname])) path.write_bytes(files[fname].encode("utf-8"))
retval = script.scratch_path / archive_name retval = script.scratch_path / archive_name
generated = shutil.make_archive( generated = shutil.make_archive(

View file

@ -5,8 +5,6 @@ from email import message_from_string
from functools import partial from functools import partial
from zipfile import ZipFile from zipfile import ZipFile
from pip._vendor.six import ensure_text
from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.typing import MYPY_CHECK_RUNNING
from tests.lib.wheel import ( from tests.lib.wheel import (
_default, _default,
@ -164,7 +162,7 @@ def test_make_wheel_default_record():
extra_data_files={"purelib/info.txt": "c"}, extra_data_files={"purelib/info.txt": "c"},
).as_zipfile() as z: ).as_zipfile() as z:
record_bytes = z.read("simple-0.1.0.dist-info/RECORD") record_bytes = z.read("simple-0.1.0.dist-info/RECORD")
record_text = ensure_text(record_bytes) record_text = record_bytes.decode()
record_rows = list(csv.reader(record_text.splitlines())) record_rows = list(csv.reader(record_text.splitlines()))
records = { records = {
row[0]: row[1:] for row in record_rows row[0]: row[1:] for row in record_rows

View file

@ -13,7 +13,6 @@ from zipfile import ZipFile
import csv23 import csv23
from pip._vendor.requests.structures import CaseInsensitiveDict from pip._vendor.requests.structures import CaseInsensitiveDict
from pip._vendor.six import ensure_binary, ensure_text
from pip._internal.utils.typing import MYPY_CHECK_RUNNING from pip._internal.utils.typing import MYPY_CHECK_RUNNING
from tests.lib.path import Path from tests.lib.path import Path
@ -61,6 +60,13 @@ if MYPY_CHECK_RUNNING:
pass pass
def ensure_binary(value):
# type: (AnyStr) -> bytes
if isinstance(value, bytes):
return value
return value.encode()
def message_from_dict(headers): def message_from_dict(headers):
# type: (Dict[str, HeaderValue]) -> Message # type: (Dict[str, HeaderValue]) -> Message
"""Plain key-value pairs are set in the returned message. """Plain key-value pairs are set in the returned message.
@ -110,7 +116,7 @@ def make_metadata_file(
if body is not _default: if body is not _default:
message.set_payload(body) message.set_payload(body)
return File(path, ensure_binary(message_from_dict(metadata).as_string())) return File(path, message_from_dict(metadata).as_bytes())
def make_wheel_metadata_file( def make_wheel_metadata_file(
@ -139,7 +145,7 @@ def make_wheel_metadata_file(
if updates is not _default: if updates is not _default:
metadata.update(updates) metadata.update(updates)
return File(path, ensure_binary(message_from_dict(metadata).as_string())) return File(path, message_from_dict(metadata).as_bytes())
def make_entry_points_file( def make_entry_points_file(
@ -167,7 +173,7 @@ def make_entry_points_file(
return File( return File(
dist_info_path(name, version, "entry_points.txt"), dist_info_path(name, version, "entry_points.txt"),
ensure_binary("\n".join(lines)), "\n".join(lines).encode(),
) )
@ -243,7 +249,7 @@ def record_file_maker_wrapper(
with StringIO(newline="") as buf: with StringIO(newline="") as buf:
writer = csv23.writer(buf) writer = csv23.writer(buf)
for record in records: for record in records:
writer.writerow(map(ensure_text, record)) writer.writerow(record)
contents = buf.getvalue().encode("utf-8") contents = buf.getvalue().encode("utf-8")
yield File(record_path, contents) yield File(record_path, contents)

View file

@ -2,7 +2,6 @@ from email.message import Message
import pytest import pytest
from pip._vendor.pkg_resources import DistInfoDistribution, Requirement from pip._vendor.pkg_resources import DistInfoDistribution, Requirement
from pip._vendor.six import ensure_binary
from pip._internal.utils.packaging import get_metadata, get_requires_python from pip._internal.utils.packaging import get_metadata, get_requires_python
from pip._internal.utils.pkg_resources import DictMetadata from pip._internal.utils.pkg_resources import DictMetadata
@ -26,9 +25,7 @@ def test_dict_metadata_works():
metadata["Provides-Extra"] = extra metadata["Provides-Extra"] = extra
metadata["Requires-Python"] = requires_python metadata["Requires-Python"] = requires_python
inner_metadata = DictMetadata({ inner_metadata = DictMetadata({"METADATA": metadata.as_bytes()})
"METADATA": ensure_binary(metadata.as_string())
})
dist = DistInfoDistribution( dist = DistInfoDistribution(
location="<in-memory>", metadata=inner_metadata, project_name=name location="<in-memory>", metadata=inner_metadata, project_name=name
) )