diff --git a/data/test_typeshed_stubs/bogusfiles/METADATA.toml b/data/test_typeshed/stubs/bogusfiles/METADATA.toml similarity index 100% rename from data/test_typeshed_stubs/bogusfiles/METADATA.toml rename to data/test_typeshed/stubs/bogusfiles/METADATA.toml diff --git a/data/test_typeshed_stubs/bogusfiles/bogusfile.txt b/data/test_typeshed/stubs/bogusfiles/bogusfile.txt similarity index 100% rename from data/test_typeshed_stubs/bogusfiles/bogusfile.txt rename to data/test_typeshed/stubs/bogusfiles/bogusfile.txt diff --git a/data/test_typeshed_stubs/bogusfiles/bogusfiles.pyi b/data/test_typeshed/stubs/bogusfiles/bogusfiles.pyi similarity index 100% rename from data/test_typeshed_stubs/bogusfiles/bogusfiles.pyi rename to data/test_typeshed/stubs/bogusfiles/bogusfiles.pyi diff --git a/data/test_typeshed_stubs/multifilepkg/@tests/stubtest_allowlist.txt b/data/test_typeshed/stubs/multifilepkg/@tests/stubtest_allowlist.txt similarity index 100% rename from data/test_typeshed_stubs/multifilepkg/@tests/stubtest_allowlist.txt rename to data/test_typeshed/stubs/multifilepkg/@tests/stubtest_allowlist.txt diff --git a/data/test_typeshed_stubs/multifilepkg/METADATA.toml b/data/test_typeshed/stubs/multifilepkg/METADATA.toml similarity index 100% rename from data/test_typeshed_stubs/multifilepkg/METADATA.toml rename to data/test_typeshed/stubs/multifilepkg/METADATA.toml diff --git a/data/test_typeshed_stubs/multifilepkg/multifilepkg/__init__.pyi b/data/test_typeshed/stubs/multifilepkg/multifilepkg/__init__.pyi similarity index 100% rename from data/test_typeshed_stubs/multifilepkg/multifilepkg/__init__.pyi rename to data/test_typeshed/stubs/multifilepkg/multifilepkg/__init__.pyi diff --git a/data/test_typeshed_stubs/multifilepkg/multifilepkg/a.pyi b/data/test_typeshed/stubs/multifilepkg/multifilepkg/a.pyi similarity index 100% rename from data/test_typeshed_stubs/multifilepkg/multifilepkg/a.pyi rename to data/test_typeshed/stubs/multifilepkg/multifilepkg/a.pyi diff --git a/data/test_typeshed_stubs/multifilepkg/multifilepkg/b.pyi b/data/test_typeshed/stubs/multifilepkg/multifilepkg/b.pyi similarity index 100% rename from data/test_typeshed_stubs/multifilepkg/multifilepkg/b.pyi rename to data/test_typeshed/stubs/multifilepkg/multifilepkg/b.pyi diff --git a/data/test_typeshed_stubs/multifilepkg/multifilepkg/c/__init__.pyi b/data/test_typeshed/stubs/multifilepkg/multifilepkg/c/__init__.pyi similarity index 100% rename from data/test_typeshed_stubs/multifilepkg/multifilepkg/c/__init__.pyi rename to data/test_typeshed/stubs/multifilepkg/multifilepkg/c/__init__.pyi diff --git a/data/test_typeshed_stubs/multifilepkg/multifilepkg/c/d.pyi b/data/test_typeshed/stubs/multifilepkg/multifilepkg/c/d.pyi similarity index 100% rename from data/test_typeshed_stubs/multifilepkg/multifilepkg/c/d.pyi rename to data/test_typeshed/stubs/multifilepkg/multifilepkg/c/d.pyi diff --git a/data/test_typeshed_stubs/multifilepkg/multifilepkg/c/e.pyi b/data/test_typeshed/stubs/multifilepkg/multifilepkg/c/e.pyi similarity index 100% rename from data/test_typeshed_stubs/multifilepkg/multifilepkg/c/e.pyi rename to data/test_typeshed/stubs/multifilepkg/multifilepkg/c/e.pyi diff --git a/data/test_typeshed_stubs/singlefilepkg/@tests/stubtest_allowlist.txt b/data/test_typeshed/stubs/nspkg/@tests/stubtest_allowlist.txt similarity index 100% rename from data/test_typeshed_stubs/singlefilepkg/@tests/stubtest_allowlist.txt rename to data/test_typeshed/stubs/nspkg/@tests/stubtest_allowlist.txt diff --git a/data/test_typeshed/stubs/nspkg/METADATA.toml b/data/test_typeshed/stubs/nspkg/METADATA.toml new file mode 100644 index 00000000..40f3c61c --- /dev/null +++ b/data/test_typeshed/stubs/nspkg/METADATA.toml @@ -0,0 +1,2 @@ +version = "0.1" +requires = [] diff --git a/data/test_typeshed_stubs/singlefilepkg/singlefilepkg.pyi b/data/test_typeshed/stubs/nspkg/nspkg/innerpkg/__init__.pyi similarity index 100% rename from data/test_typeshed_stubs/singlefilepkg/singlefilepkg.pyi rename to data/test_typeshed/stubs/nspkg/nspkg/innerpkg/__init__.pyi diff --git a/data/test_typeshed/stubs/singlefilepkg/@tests/stubtest_allowlist.txt b/data/test_typeshed/stubs/singlefilepkg/@tests/stubtest_allowlist.txt new file mode 100644 index 00000000..e69de29b diff --git a/data/test_typeshed_stubs/singlefilepkg/METADATA.toml b/data/test_typeshed/stubs/singlefilepkg/METADATA.toml similarity index 100% rename from data/test_typeshed_stubs/singlefilepkg/METADATA.toml rename to data/test_typeshed/stubs/singlefilepkg/METADATA.toml diff --git a/data/test_typeshed/stubs/singlefilepkg/singlefilepkg.pyi b/data/test_typeshed/stubs/singlefilepkg/singlefilepkg.pyi new file mode 100644 index 00000000..e69de29b diff --git a/scripts/build_wheel.py b/scripts/build_wheel.py index ca7709fe..2ff9ada5 100644 --- a/scripts/build_wheel.py +++ b/scripts/build_wheel.py @@ -92,11 +92,13 @@ def __init__(self, typeshed_dir: str, distribution: str) -> None: self.distribution = distribution self._base_dir = os.path.join(typeshed_dir, THIRD_PARTY_NAMESPACE, distribution) # Python 3 (and mixed Python 2 and 3) stubs exist if at least one - # *.pyi file exists on the top-level or one level down, *excluding* - # the @python2 directory. + # *.pyi file exists on the top-level or in subdirectories, *excluding* + # the @python2 directory. May be more than one level down in the case + # of namespace packages (which lack __init__.pyi or any pyi files) self.py3_stubs = ( len(glob(f"{self._base_dir}/*.pyi")) >= 1 or len(glob(f"{self._base_dir}/[!@]*/*.pyi")) >= 1 + or len(glob(f"{self._base_dir}/[!@]*/**/*.pyi")) >= 1 ) # Python 2 stubs exist if a @python2 directory exists. self.py2_stubs = PY2_NAMESPACE in os.listdir(self._base_dir) diff --git a/tests/test_unit.py b/tests/test_unit.py index 45435ac6..3a9b9beb 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -8,6 +8,7 @@ sort_by_dependency, transitive_deps, strip_types_prefix, + BuildData, SUFFIX, PY2_SUFFIX, ) @@ -97,7 +98,7 @@ def test_sort_by_dependency() -> None: def test_collect_setup_entries() -> None: - stubs = os.path.join("data", "test_typeshed_stubs") + stubs = os.path.join("data", "test_typeshed", "stubs") entries = collect_setup_entries(os.path.join(stubs, "singlefilepkg"), SUFFIX) assert entries == ({"singlefilepkg-stubs": ["__init__.pyi", "METADATA.toml"]}) @@ -121,9 +122,29 @@ def test_collect_setup_entries() -> None: } ) + entries = collect_setup_entries(os.path.join(stubs, "nspkg"), SUFFIX) + assert entries == ( + { + "nspkg-stubs": [ + "innerpkg/__init__.pyi", + "METADATA.toml", + ] + } + ) + + +def test_build_data() -> None: + typeshed = os.path.join("data", "test_typeshed") + singlefilepkg_bd = BuildData(typeshed, "singlefilepkg") + assert singlefilepkg_bd.py3_stubs + assert not singlefilepkg_bd.py2_stubs + nspkg_bd = BuildData(typeshed, "nspkg") + assert nspkg_bd.py3_stubs + assert not nspkg_bd.py2_stubs + def test_collect_setup_entries_bogusfile() -> None: - stubs = os.path.join("data", "test_typeshed_stubs") + stubs = os.path.join("data", "test_typeshed", "stubs") with pytest.raises(ValueError, match="Only stub files are allowed: bogusfile.txt"): collect_setup_entries(os.path.join(stubs, "bogusfiles"), SUFFIX)