From 55549ea01f64c0b8616eb824db7a257f1c34d3b3 Mon Sep 17 00:00:00 2001 From: Ivan Levkivskyi Date: Mon, 1 Feb 2021 15:16:53 +0000 Subject: [PATCH] More consistency checks for dependencies (#4990) Closes #4988 Co-authored-by: Ivan Levkivskyi --- tests/check_consistent.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/tests/check_consistent.py b/tests/check_consistent.py index e779238b4..15949e045 100755 --- a/tests/check_consistent.py +++ b/tests/check_consistent.py @@ -128,7 +128,28 @@ def check_versions(): assert not extra, f"Versions not in modules: {extra}" +def _strip_dep_version(dependency): + dep_version_pos = len(dependency) + for pos, c in enumerate(dependency): + if c in "=<>": + dep_version_pos = pos + break + stripped = dependency[:dep_version_pos] + rest = dependency[dep_version_pos:] + if not rest: + return stripped, "", "" + number_pos = 0 + for pos, c in enumerate(rest): + if c not in "=<>": + number_pos = pos + break + relation = rest[:number_pos] + version = rest[number_pos:] + return stripped, relation, version + + def check_metadata(): + known_distributions = set(os.listdir("stubs")) for distribution in os.listdir("stubs"): with open(os.path.join("stubs", distribution, "METADATA.toml")) as f: data = toml.loads(f.read()) @@ -146,9 +167,20 @@ def check_metadata(): assert isinstance(data.get("python3", True), bool), f"Invalid python3 value for {distribution}" assert isinstance(data.get("requires", []), list), f"Invalid requires value for {distribution}" for dep in data.get("requires", []): - # TODO: add more validation here. assert isinstance(dep, str), f"Invalid dependency {dep} for {distribution}" assert dep.startswith("types-"), f"Only stub dependencies supported, got {dep}" + dep = dep[len("types-"):] + for space in " \t\n": + assert space not in dep, f"For consistency dependency should not have whitespace: {dep}" + assert ";" not in dep, f"Semicolons in dependencies are not supported, got {dep}" + stripped, relation, dep_version = _strip_dep_version(dep) + assert stripped in known_distributions, f"Only dependencies from typeshed are supported, got {stripped}" + if relation: + msg = f"Bad version in dependency {dep}" + assert relation in {"==", ">", ">=", "<", "<="}, msg + assert version.count(".") <= 2, msg + for part in version.split("."): + assert part.isnumeric(), msg if __name__ == "__main__":