pythondistdeps.py: Detect and error when metadata is corrupted
This commit is contained in:
parent
20f8b2c775
commit
27d363833e
@ -73,6 +73,14 @@ class Requirement(Requirement_):
|
|||||||
class Distribution(PathDistribution):
|
class Distribution(PathDistribution):
|
||||||
def __init__(self, path):
|
def __init__(self, path):
|
||||||
super(Distribution, self).__init__(Path(path))
|
super(Distribution, self).__init__(Path(path))
|
||||||
|
|
||||||
|
# Check that the initialization went well and metadata are not missing or corrupted
|
||||||
|
# name is the most important attribute, if it doesn't exist, import failed
|
||||||
|
if not self.name or not isinstance(self.name, str):
|
||||||
|
print("*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***")
|
||||||
|
print('Error: Python metadata at `{}` are missing or corrupted.'.format(path), file=stderr)
|
||||||
|
exit(65) # os.EX_DATAERR
|
||||||
|
|
||||||
self.normalized_name = normalize_name(self.name)
|
self.normalized_name = normalize_name(self.name)
|
||||||
self.legacy_normalized_name = legacy_normalize_name(self.name)
|
self.legacy_normalized_name = legacy_normalize_name(self.name)
|
||||||
self.requirements = [Requirement(r) for r in self.requires or []]
|
self.requirements = [Requirement(r) for r in self.requires or []]
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
Corrupted dist-info metadata
|
@ -1207,6 +1207,15 @@
|
|||||||
python3.9dist(zope-testing)
|
python3.9dist(zope-testing)
|
||||||
--requires --normalized-names-format pep503 --require-extras-subpackages:
|
--requires --normalized-names-format pep503 --require-extras-subpackages:
|
||||||
--provides --normalized-names-format pep503:
|
--provides --normalized-names-format pep503:
|
||||||
|
corrupted.dist-info:
|
||||||
|
stderr:
|
||||||
|
provides: |-
|
||||||
|
Error: Python metadata at `*/corrupted.dist-info` are missing or corrupted.
|
||||||
|
requires: |-
|
||||||
|
Error: Python metadata at `*/corrupted.dist-info` are missing or corrupted.
|
||||||
|
stdout:
|
||||||
|
provides: '*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***'
|
||||||
|
requires: '*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***'
|
||||||
pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info:
|
pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info:
|
||||||
provides: python3.9dist(pyreq2rpm-tests) = 2020.04.07.024dab0
|
provides: python3.9dist(pyreq2rpm-tests) = 2020.04.07.024dab0
|
||||||
requires: |-
|
requires: |-
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from fnmatch import fnmatch
|
||||||
import pytest
|
import pytest
|
||||||
import shlex
|
import shlex
|
||||||
import shutil
|
import shutil
|
||||||
@ -224,8 +225,21 @@ def fixture_check_and_install_test_data():
|
|||||||
def test_pythondistdeps(provides_params, requires_params, dist_egg_info_path, expected):
|
def test_pythondistdeps(provides_params, requires_params, dist_egg_info_path, expected):
|
||||||
"""Runs pythondistdeps with the given parameters and dist-info/egg-info
|
"""Runs pythondistdeps with the given parameters and dist-info/egg-info
|
||||||
path, compares the results with the expected results"""
|
path, compares the results with the expected results"""
|
||||||
|
|
||||||
expect_failure = "stderr" in expected
|
expect_failure = "stderr" in expected
|
||||||
assert expected == run_pythondistdeps(provides_params, requires_params, dist_egg_info_path, expect_failure)
|
tested = run_pythondistdeps(provides_params, requires_params, dist_egg_info_path, expect_failure)
|
||||||
|
|
||||||
|
if expect_failure:
|
||||||
|
for k1, k2 in ((k1, k2) for k1 in expected.keys() for k2 in expected[k1].keys()):
|
||||||
|
if k1 == "stderr":
|
||||||
|
# Some stderr messages contain full file paths. To get around
|
||||||
|
# this, asterisk is used in the test-data and we compare with
|
||||||
|
# fnmatch that understands Unix-style wildcards.
|
||||||
|
assert fnmatch(tested[k1][k2], expected[k1][k2])
|
||||||
|
else:
|
||||||
|
assert expected[k1][k2] == tested[k1][k2]
|
||||||
|
else:
|
||||||
|
assert expected == tested
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
Loading…
Reference in New Issue
Block a user