diff --git a/changelogs/unreleased/fix-pkgresources-import.yml b/changelogs/unreleased/fix-pkgresources-import.yml new file mode 100644 index 0000000000..8c2488f2a4 --- /dev/null +++ b/changelogs/unreleased/fix-pkgresources-import.yml @@ -0,0 +1,7 @@ +description: Fixed dropped import from pkg_resources +change-type: patch +sections: + bugfix: "Addressed breaking change in setuptools (core Python library)" + upgrade-note: "If you had previously constrained `setuptools<71` in your project's `requirements.txt`, you may now drop the constraint" +destination-branches: + - iso6 diff --git a/src/inmanta/env.py b/src/inmanta/env.py index 4ac808b33a..f82e09a131 100644 --- a/src/inmanta/env.py +++ b/src/inmanta/env.py @@ -43,6 +43,7 @@ from pkg_resources import DistInfoDistribution, Distribution, Requirement import inmanta.module +import packaging.requirements from inmanta import const from inmanta.ast import CompilerException from inmanta.server.bootloader import InmantaBootloader @@ -50,15 +51,18 @@ from inmanta.util import strtobool from packaging import version +InvalidRequirement: tuple[Exception] try: - from typing import TYPE_CHECKING + # older versions of pkg_resources raise this exception, newer versions don't have extern and raise the native one + import pkg_resources.extern.packaging.requirements + + InvalidRequirement = ( + packaging.requirements.InvalidRequirement, + pkg_resources.extern.packaging.requirements.InvalidRequirement, + ) except ImportError: - TYPE_CHECKING = False + InvalidRequirement = (packaging.requirements.InvalidRequirement,) -if TYPE_CHECKING: - from packaging.requirements import InvalidRequirement -else: - from pkg_resources.extern.packaging.requirements import InvalidRequirement LOGGER = logging.getLogger(__name__) LOGGER_PIP = logging.getLogger("inmanta.pip") # Use this logger to log pip commands or data related to pip commands. @@ -807,19 +811,17 @@ def _gen_content_requirements_file(cls, requirements_list: Sequence[str]) -> str extras = None try: # this will fail if an url is supplied - parsed_req = list(pkg_resources.parse_requirements(req_spec)) - if len(parsed_req) > 0: - item = parsed_req[0] - if hasattr(item, "name"): - name = item.name - elif hasattr(item, "unsafe_name"): - name = item.unsafe_name - version = item.specs - marker = item.marker - if hasattr(item, "url"): - url = item.url - if hasattr(item, "extras") and len(item.extras) > 0: - extras = sorted(item.extras) + parsed_req = Requirement.parse(req_spec) + if hasattr(parsed_req, "name"): + name = parsed_req.name + elif hasattr(parsed_req, "unsafe_name"): + name = parsed_req.unsafe_name + version = parsed_req.specs + marker = parsed_req.marker + if hasattr(parsed_req, "url"): + url = parsed_req.url + if hasattr(parsed_req, "extras") and len(parsed_req.extras) > 0: + extras = sorted(parsed_req.extras) except InvalidRequirement: url = req_spec diff --git a/src/inmanta/moduletool.py b/src/inmanta/moduletool.py index 403215eb27..f817615c24 100644 --- a/src/inmanta/moduletool.py +++ b/src/inmanta/moduletool.py @@ -36,7 +36,7 @@ from configparser import ConfigParser from functools import total_ordering from re import Pattern -from typing import TYPE_CHECKING, Any, Dict, List, Optional +from typing import Any, Dict, List, Optional import click import more_itertools @@ -76,11 +76,6 @@ from inmanta.stable_api import stable_api from packaging.version import Version -if TYPE_CHECKING: - from packaging.requirements import InvalidRequirement -else: - from pkg_resources.extern.packaging.requirements import InvalidRequirement - LOGGER = logging.getLogger(__name__) @@ -812,7 +807,7 @@ def add(self, module_req: str, v1: bool = False, v2: bool = False, override: boo raise CLIException("Current working directory doesn't contain an Inmanta module or project", exitcode=1) try: module_requirement = InmantaModuleRequirement.parse(module_req) - except InvalidRequirement: + except env.InvalidRequirement: raise CLIException(f"'{module_req}' is not a valid requirement", exitcode=1) if not override and module_like.has_module_requirement(module_requirement.key): raise CLIException(