Replace deprecated pkg_resources with importlib.metadata (#97628)

This commit is contained in:
Marc Mueller 2023-08-03 09:14:00 +02:00 committed by GitHub
parent 357bfc46bf
commit 1daac46635
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 29 deletions

View File

@ -7,7 +7,7 @@ import logging
import os import os
from typing import Any, cast from typing import Any, cast
import pkg_resources from packaging.requirements import Requirement
from .core import HomeAssistant, callback from .core import HomeAssistant, callback
from .exceptions import HomeAssistantError from .exceptions import HomeAssistantError
@ -232,8 +232,7 @@ class RequirementsManager:
skipped_requirements = [ skipped_requirements = [
req req
for req in requirements for req in requirements
if pkg_resources.Requirement.parse(req).project_name if Requirement(req).name in self.hass.config.skip_pip_packages
in self.hass.config.skip_pip_packages
] ]
for req in skipped_requirements: for req in skipped_requirements:

View File

@ -3,7 +3,7 @@ from __future__ import annotations
import asyncio import asyncio
from functools import cache from functools import cache
from importlib.metadata import PackageNotFoundError, version from importlib.metadata import PackageNotFoundError, distribution, version
import logging import logging
import os import os
from pathlib import Path from pathlib import Path
@ -11,7 +11,7 @@ from subprocess import PIPE, Popen
import sys import sys
from urllib.parse import urlparse from urllib.parse import urlparse
import pkg_resources from packaging.requirements import InvalidRequirement, Requirement
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -37,26 +37,27 @@ def is_installed(package: str) -> bool:
Returns False when the package is not installed or doesn't meet req. Returns False when the package is not installed or doesn't meet req.
""" """
try: try:
pkg_resources.get_distribution(package) distribution(package)
return True return True
except (IndexError, pkg_resources.ResolutionError, pkg_resources.ExtractionError): except (IndexError, PackageNotFoundError):
req = pkg_resources.Requirement.parse(package) try:
except ValueError: req = Requirement(package)
# This is a zip file. We no longer use this in Home Assistant, except InvalidRequirement:
# leaving it in for custom components. # This is a zip file. We no longer use this in Home Assistant,
req = pkg_resources.Requirement.parse(urlparse(package).fragment) # leaving it in for custom components.
req = Requirement(urlparse(package).fragment)
try: try:
installed_version = version(req.project_name) installed_version = version(req.name)
# This will happen when an install failed or # This will happen when an install failed or
# was aborted while in progress see # was aborted while in progress see
# https://github.com/home-assistant/core/issues/47699 # https://github.com/home-assistant/core/issues/47699
if installed_version is None: if installed_version is None:
_LOGGER.error( # type: ignore[unreachable] _LOGGER.error( # type: ignore[unreachable]
"Installed version for %s resolved to None", req.project_name "Installed version for %s resolved to None", req.name
) )
return False return False
return installed_version in req return req.specifier.contains(installed_version, prereleases=True)
except PackageNotFoundError: except PackageNotFoundError:
return False return False

View File

@ -1,12 +1,12 @@
"""Test Home Assistant package util methods.""" """Test Home Assistant package util methods."""
import asyncio import asyncio
from importlib.metadata import PackageNotFoundError, metadata
import logging import logging
import os import os
from subprocess import PIPE from subprocess import PIPE
import sys import sys
from unittest.mock import MagicMock, call, patch from unittest.mock import MagicMock, call, patch
import pkg_resources
import pytest import pytest
import homeassistant.util.package as package import homeassistant.util.package as package
@ -246,9 +246,9 @@ async def test_async_get_user_site(mock_env_copy) -> None:
def test_check_package_global() -> None: def test_check_package_global() -> None:
"""Test for an installed package.""" """Test for an installed package."""
first_package = list(pkg_resources.working_set)[0] pkg = metadata("homeassistant")
installed_package = first_package.project_name installed_package = pkg["name"]
installed_version = first_package.version installed_version = pkg["version"]
assert package.is_installed(installed_package) assert package.is_installed(installed_package)
assert package.is_installed(f"{installed_package}=={installed_version}") assert package.is_installed(f"{installed_package}=={installed_version}")
@ -264,13 +264,13 @@ def test_check_package_zip() -> None:
def test_get_distribution_falls_back_to_version() -> None: def test_get_distribution_falls_back_to_version() -> None:
"""Test for get_distribution failing and fallback to version.""" """Test for get_distribution failing and fallback to version."""
first_package = list(pkg_resources.working_set)[0] pkg = metadata("homeassistant")
installed_package = first_package.project_name installed_package = pkg["name"]
installed_version = first_package.version installed_version = pkg["version"]
with patch( with patch(
"homeassistant.util.package.pkg_resources.get_distribution", "homeassistant.util.package.distribution",
side_effect=pkg_resources.ExtractionError, side_effect=PackageNotFoundError,
): ):
assert package.is_installed(installed_package) assert package.is_installed(installed_package)
assert package.is_installed(f"{installed_package}=={installed_version}") assert package.is_installed(f"{installed_package}=={installed_version}")
@ -281,13 +281,13 @@ def test_get_distribution_falls_back_to_version() -> None:
def test_check_package_previous_failed_install() -> None: def test_check_package_previous_failed_install() -> None:
"""Test for when a previously install package failed and left cruft behind.""" """Test for when a previously install package failed and left cruft behind."""
first_package = list(pkg_resources.working_set)[0] pkg = metadata("homeassistant")
installed_package = first_package.project_name installed_package = pkg["name"]
installed_version = first_package.version installed_version = pkg["version"]
with patch( with patch(
"homeassistant.util.package.pkg_resources.get_distribution", "homeassistant.util.package.distribution",
side_effect=pkg_resources.ExtractionError, side_effect=PackageNotFoundError,
), patch("homeassistant.util.package.version", return_value=None): ), patch("homeassistant.util.package.version", return_value=None):
assert not package.is_installed(installed_package) assert not package.is_installed(installed_package)
assert not package.is_installed(f"{installed_package}=={installed_version}") assert not package.is_installed(f"{installed_package}=={installed_version}")