diff --git a/poetry/core/masonry/utils/package_include.py b/poetry/core/masonry/utils/package_include.py index addbea59d..f5dd677f9 100644 --- a/poetry/core/masonry/utils/package_include.py +++ b/poetry/core/masonry/utils/package_include.py @@ -47,8 +47,7 @@ def is_stub_only(self) -> bool: # returns `True` if this a PEP 561 stub-only package, # see [PEP 561](https://www.python.org/dev/peps/pep-0561/#stub-only-packages) return self.package.endswith("-stubs") and all( - el.suffix == ".pyi" - or (el.parent.name == self.package and el.name == "py.typed") + el.suffix == ".pyi" or el.name == "py.typed" for el in self.elements if el.is_file() ) diff --git a/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pkg-stubs/module.pyi b/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pkg-stubs/module.pyi new file mode 100644 index 000000000..d79e6e39e --- /dev/null +++ b/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pkg-stubs/module.pyi @@ -0,0 +1,4 @@ +"""Example module""" +from typing import Tuple + +version_info = Tuple[int, int, int] diff --git a/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pkg-stubs/subpkg/__init__.pyi b/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pkg-stubs/subpkg/__init__.pyi new file mode 100644 index 000000000..e69de29bb diff --git a/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pkg-stubs/subpkg/py.typed b/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pkg-stubs/subpkg/py.typed new file mode 100644 index 000000000..b648ac923 --- /dev/null +++ b/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pkg-stubs/subpkg/py.typed @@ -0,0 +1 @@ +partial diff --git a/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pyproject.toml b/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pyproject.toml new file mode 100644 index 000000000..265effd0f --- /dev/null +++ b/tests/masonry/builders/fixtures/pep_561_stub_only_partial_namespace/pyproject.toml @@ -0,0 +1,14 @@ +[tool.poetry] +name = "pep-561-stubs" +version = "0.1" +description = "PEP 561 stub namespace package example with the py.typed marker file" +authors = [ + "Henrik BruÄsdal " +] +license = "MIT" +packages = [ + {include = "pkg-stubs"} +] + +[tool.poetry.dependencies] +python = "^3.6" diff --git a/tests/masonry/builders/test_wheel.py b/tests/masonry/builders/test_wheel.py index 9a54ea9f2..c7baf52be 100644 --- a/tests/masonry/builders/test_wheel.py +++ b/tests/masonry/builders/test_wheel.py @@ -205,6 +205,20 @@ def test_wheel_package_pep_561_stub_only(package): assert "pkg-stubs/subpkg/__init__.pyi" in z.namelist() +def test_wheel_package_pep_561_stub_only_partial_namespace(): + root = fixtures_dir / "pep_561_stub_only_partial_namespace" + WheelBuilder.make(Factory().create_poetry(root)) + + whl = root / "dist" / "pep_561_stubs-0.1-py3-none-any.whl" + + assert whl.exists() + + with zipfile.ZipFile(str(whl)) as z: + assert "pkg-stubs/module.pyi" in z.namelist() + assert "pkg-stubs/subpkg/__init__.pyi" in z.namelist() + assert "pkg-stubs/subpkg/py.typed" in z.namelist() + + def test_wheel_package_pep_561_stub_only_includes_typed_marker(): root = fixtures_dir / "pep_561_stub_only_partial" WheelBuilder.make(Factory().create_poetry(root)) diff --git a/tests/masonry/utils/fixtures/pep_561_stub_only_partial_namespace/good-stubs/module.pyi b/tests/masonry/utils/fixtures/pep_561_stub_only_partial_namespace/good-stubs/module.pyi new file mode 100644 index 000000000..d79e6e39e --- /dev/null +++ b/tests/masonry/utils/fixtures/pep_561_stub_only_partial_namespace/good-stubs/module.pyi @@ -0,0 +1,4 @@ +"""Example module""" +from typing import Tuple + +version_info = Tuple[int, int, int] diff --git a/tests/masonry/utils/fixtures/pep_561_stub_only_partial_namespace/good-stubs/subpkg/__init__.pyi b/tests/masonry/utils/fixtures/pep_561_stub_only_partial_namespace/good-stubs/subpkg/__init__.pyi new file mode 100644 index 000000000..e69de29bb diff --git a/tests/masonry/utils/fixtures/pep_561_stub_only_partial_namespace/good-stubs/subpkg/py.typed b/tests/masonry/utils/fixtures/pep_561_stub_only_partial_namespace/good-stubs/subpkg/py.typed new file mode 100644 index 000000000..b648ac923 --- /dev/null +++ b/tests/masonry/utils/fixtures/pep_561_stub_only_partial_namespace/good-stubs/subpkg/py.typed @@ -0,0 +1 @@ +partial diff --git a/tests/masonry/utils/test_package_include.py b/tests/masonry/utils/test_package_include.py index f9bebf19c..3ed9b7844 100644 --- a/tests/masonry/utils/test_package_include.py +++ b/tests/masonry/utils/test_package_include.py @@ -63,6 +63,20 @@ def test_pep_561_stub_only_package_good_name_suffix(): ] +def test_pep_561_stub_only_partial_namespace_package_good_name_suffix(): + pkg_include = PackageInclude( + base=fixtures_dir / "pep_561_stub_only_partial_namespace", include="good-stubs" + ) + print(pkg_include.elements) + assert pkg_include.elements == [ + fixtures_dir / "pep_561_stub_only_partial_namespace/good-stubs/module.pyi", + fixtures_dir / "pep_561_stub_only_partial_namespace/good-stubs/subpkg/", + fixtures_dir + / "pep_561_stub_only_partial_namespace/good-stubs/subpkg/__init__.pyi", + fixtures_dir / "pep_561_stub_only_partial_namespace/good-stubs/subpkg/py.typed", + ] + + def test_pep_561_stub_only_package_bad_name_suffix(): with pytest.raises(ValueError) as e: PackageInclude(base=fixtures_dir / "pep_561_stub_only", include="bad")