mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 18:57:19 +02:00
Merge branch 'fix/check_python_dependencies_v5.4' into 'release/v5.4'
fix(tools): handle packages with dots in their names during dependency checks (v5.4) See merge request espressif/esp-idf!38062
This commit is contained in:
@ -1,11 +1,12 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2018-2024 Espressif Systems (Shanghai) CO LTD
|
# SPDX-FileCopyrightText: 2018-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from packaging.requirements import Requirement
|
from packaging.requirements import Requirement
|
||||||
@ -17,12 +18,14 @@ except ImportError:
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from importlib.metadata import requires
|
from importlib.metadata import requires as _requires
|
||||||
from importlib.metadata import version as get_version
|
from importlib.metadata import version as _version
|
||||||
|
from importlib.metadata import PackageNotFoundError
|
||||||
except ImportError:
|
except ImportError:
|
||||||
# compatibility for python <=3.7
|
# compatibility for python <=3.7
|
||||||
from importlib_metadata import requires # type: ignore
|
from importlib_metadata import requires as _requires # type: ignore
|
||||||
from importlib_metadata import version as get_version # type: ignore
|
from importlib_metadata import version as _version # type: ignore
|
||||||
|
from importlib_metadata import PackageNotFoundError # type: ignore
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from typing import Set
|
from typing import Set
|
||||||
@ -33,6 +36,34 @@ except ImportError:
|
|||||||
|
|
||||||
PYTHON_PACKAGE_RE = re.compile(r'[^<>=~]+')
|
PYTHON_PACKAGE_RE = re.compile(r'[^<>=~]+')
|
||||||
|
|
||||||
|
|
||||||
|
# The version and requires function from importlib.metadata in python prior
|
||||||
|
# 3.10 does perform distribution name normalization before searching for
|
||||||
|
# package distribution. This might cause problems for package with dot in its
|
||||||
|
# name as the wheel build backend(e.g. setuptools >= 75.8.1), may perform
|
||||||
|
# distribution name normalization. If the package name is not found, try again
|
||||||
|
# with normalized name.
|
||||||
|
# https://packaging.python.org/en/latest/specifications/binary-distribution-format/#escaping-and-unicode
|
||||||
|
def normalize_name(name: str) -> str:
|
||||||
|
return re.sub(r'[-_.]+', '-', name).lower().replace('-', '_')
|
||||||
|
|
||||||
|
|
||||||
|
def get_version(name: str) -> str:
|
||||||
|
try:
|
||||||
|
version = _version(name)
|
||||||
|
except PackageNotFoundError:
|
||||||
|
version = _version(normalize_name(name))
|
||||||
|
return version
|
||||||
|
|
||||||
|
|
||||||
|
def get_requires(name: str) -> Optional[list]:
|
||||||
|
try:
|
||||||
|
requires = _requires(name)
|
||||||
|
except PackageNotFoundError:
|
||||||
|
requires = _requires(normalize_name(name))
|
||||||
|
return requires
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
parser = argparse.ArgumentParser(description='ESP-IDF Python package dependency checker')
|
parser = argparse.ArgumentParser(description='ESP-IDF Python package dependency checker')
|
||||||
parser.add_argument('--requirements', '-r',
|
parser.add_argument('--requirements', '-r',
|
||||||
@ -108,7 +139,7 @@ if __name__ == '__main__':
|
|||||||
dependency_requirements = set()
|
dependency_requirements = set()
|
||||||
extras = list(requirement.extras) or ['']
|
extras = list(requirement.extras) or ['']
|
||||||
# `requires` returns all sub-requirements including all extras - we need to filter out just required ones
|
# `requires` returns all sub-requirements including all extras - we need to filter out just required ones
|
||||||
for name in requires(requirement.name) or []:
|
for name in get_requires(requirement.name) or []:
|
||||||
sub_req = Requirement(name)
|
sub_req = Requirement(name)
|
||||||
# check extras e.g. esptool[hsm]
|
# check extras e.g. esptool[hsm]
|
||||||
for extra in extras:
|
for extra in extras:
|
||||||
|
Reference in New Issue
Block a user