8000 Re-organize directory structure by ilevkivskyi · Pull Request #4971 · python/typeshed · GitHub
[go: up one dir, main page]

Skip to content

Re-organize directory structure #4971

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 18 commits into from
Jan 27, 2021
Merged
Prev Previous commit
Next Next commit
Try fixing mypy test
  • Loading branch information
Ivan Levkivskyi committed Jan 26, 2021
commit f3d9c3c8130aded2e0aaaa939b22df0697b2a34b
1 change: 1 addition & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
- run: pip install toml # TODO: remove when it is a mypy dep.
- run: pip install -U git+git://github.com/python/mypy
- run: ./tests/mypy_test.py --platform=${{ matrix.platform }}

Expand Down
139 changes: 96 additions & 43 deletions tests/mypy_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,14 @@
import os
import re
import sys
import toml

parser = argparse.ArgumentParser(description="Test runner for typeshed. " "Patterns are unanchored regexps on the full path.")
PY2_NAMESPACE = "@python2"
THIRD_PARTY_NAMESPACE = "stubs"

parser = argparse.ArgumentParser(
description="Test runner for typeshed. Patterns are unanchored regexps on the full path."
)
parser.add_argument("-v", "--verbose", action="count", default=0, help="More output")
parser.add_argument("-n", "--dry-run", action="store_true", help="Don't actually run mypy")
parser.add_argument("-x", "--exclude", type=str, nargs="*", help="Exclude pattern")
Expand Down Expand Up @@ -63,17 +69,51 @@ def match(fn, args, exclude_list):
return True


def libpath(major, minor):
versions = ["%d.%d" % (major, minor) for minor in reversed(range(minor + 1))]
versions.append(str(major))
versions.append("2and3")
paths = []
for v in versions:
for top in ["stdlib", "third_party"]:
p = os.path.join(top, v)
if os.path.isdir(p):
paths.append(p)
return paths
def parse_versions(fname):
with open(fname) as f:
data = f.read().splitlines()
result = {}
for line in data:
mod, ver_str = line.split(": ")
assert ver_str.count(".") == 1
major, minor = ver_str.split(".")
result[mod] = (int(major), int(minor))
return result


def is_supported(distribution, major):
with open(os.path.join(THIRD_PARTY_NAMESPACE, distribution, "METADATA.toml")) as f:
data = dict(toml.loads(f.read()))
if major == 2:
# Python 2 is not supported by default.
return bool(data.get("python2"))
supported = data.get("python3")
# Python 3 is supported by default.
return supported is None or supported


def add_files(files, seen, root, name, args, exclude_list):
"""Add all files in package or module represented by 'name' located in 'root'."""
full = os.path.join(root, name)
mod, ext = os.path.splitext(name)
if ext in [".pyi", ".py"]:
if match(full, args, exclude_list):
seen.add(mod)
files.append(full)
elif (
os.path.isfile(os.path.join(full, "__init__.pyi")) or
os.path.isfile(os.path.join(full, "__init__.py"))
):
for r, ds, fs in os.walk(full):
ds.sort()
fs.sort()
for f in fs:
m, x = os.path.splitext(f)
if x in [".pyi", ".py"]:
fn = os.path.join(r, f)
if match(fn, args, exclude_list):
seen.add(mod)
files.append(fn)


def main():
Expand All @@ -88,7 +128,7 @@ def main():
print("Cannot import mypy. Did you install it?")
sys.exit(1)

versions = [(3, 9), (3, 8), (3, 7), (3, 6), (3, 5), (2, 7)]
versions = [(3, 9), (3, 8), (3, 7), (3, 6), (2, 7)]
if args.python_version:
versions = [v for v in versions if any(("%d.%d" % v).startswith(av) for av in args.python_version)]
if not versions:
Expand All @@ -98,44 +138,57 @@ def main():
code = 0
runs = 0
for major, minor in versions:
roots = libpath(major, minor)
files = []
seen = {"__builtin__", "builtins", "typing"} # Always ignore these.
for root in roots:
names = os.listdir(root)
for name in names:
full = os.path.join(root, name)
mod, ext = os.path.splitext(name)

# First add standard library files.
if major == 2:
root = os.path.join("stdlib", PY2_NAMESPACE)
for name in os.listdir(root):
add_files(files, seen, root, name, args, exclude_list)
else:
supported_versions = parse_versions(os.path.join("stdlib", "VERSIONS"))
root = "stdlib"
for name in os.listdir(root):
if name == PY2_NAMESPACE:
continue
mod, _ = os.path.splitext(name)
if supported_versions[mod] > (major, minor):
continue
add_files(files, seen, root, name, args, exclude_list)

# Next add files for all third party distributions.
for distribution in os.listdir(THIRD_PARTY_NAMESPACE):
if not is_supported(distribution, major):
continue
if major == 2 and os.path.isdir(os.path.join(THIRD_PARTY_NAMESPACE, distribution, PY2_NAMESPACE)):
root = os.path.join(THIRD_PARTY_NAMESPACE, distribution, 8000 PY2_NAMESPACE)
else:
root = os.path.join(THIRD_PARTY_NAMESPACE, distribution)
for name in os.listdir(root):
if name == PY2_NAMESPACE:
continue
mod, _ = os.path.splitext(name)
if mod in seen or mod.startswith("."):
continue
if ext in [".pyi", ".py"]:
if match(full, args, exclude_list):
seen.add(mod)
files.append(full)
elif os.path.isfile(os.path.join(full, "__init__.pyi")) or os.path.isfile(os.path.join(full, "__init__.py")):
for r, ds, fs in os.walk(full):
ds.sort()
fs.sort()
for f in fs:
m, x = os.path.splitext(f)
if x in [".pyi", ".py"]:
fn = os.path.join(r, f)
if match(fn, args, exclude_list):
seen.add(mod)
files.append(fn)
add_files(files, seen, root, name, args, exclude_list)

if files:
runs += 1
flags = ["--python-version", "%d.%d" % (major, minor)]
flags.append("--strict-optional")
flags.append("--no-site-packages")
flags.append("--show-traceback")
flags.append("--no-implicit-optional")
flags.append("--disallow-any-generics")
flags.append("--disallow-subclassing-any")
flags = [
"--python-version", "%d.%d" % (major, minor),
"--strict-optional",
"--no-site-packages",
"--show-traceback",
"--no-implicit-optional",
"--disallow-any-generics",
"--disallow-subclassing-any",
]
# Setting custom typeshed dir prevents mypy from falling back to its bundled typeshed in
# case of stub deletions
flags.append("--custom-typeshed-dir")
flags.append(os.path.dirname(os.path.dirname(__file__)))
# TODO: re-enable when supported.
# flags.append("--custom-typeshed-dir")
# flags.append(os.path.dirname(os.path.dirname(__file__)))
if args.warn_unused_ignores:
flags.append("--warn-unused-ignores")
if args.platform:
Expand Down
0