diff --git a/poetry/core/masonry/builders/sdist.py b/poetry/core/masonry/builders/sdist.py index df07bb293..b653badbc 100644 --- a/poetry/core/masonry/builders/sdist.py +++ b/poetry/core/masonry/builders/sdist.py @@ -139,7 +139,14 @@ def build_setup(self) -> bytes: pkg_dir, _packages, _package_data = self.find_packages(include) if pkg_dir is not None: - package_dir[""] = os.path.relpath(pkg_dir, str(self._path)) + pkg_root = os.path.relpath(pkg_dir, str(self._path)) + if "" in package_dir: + package_dir.update( + (p, os.path.join(pkg_root, p.replace(".", "/"))) + for p in _packages + ) + else: + package_dir[""] = pkg_root packages += [p for p in _packages if p not in packages] package_data.update(_package_data) diff --git a/tests/masonry/builders/fixtures/split_source/lib_a/module_a/__init__.py b/tests/masonry/builders/fixtures/split_source/lib_a/module_a/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/masonry/builders/fixtures/split_source/lib_b/module_b/__init__.py b/tests/masonry/builders/fixtures/split_source/lib_b/module_b/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/masonry/builders/fixtures/split_source/pyproject.toml b/tests/masonry/builders/fixtures/split_source/pyproject.toml new file mode 100644 index 000000000..f11bba047 --- /dev/null +++ b/tests/masonry/builders/fixtures/split_source/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "split-source" +version = "0.1" +description = "Combine packages from different locations." +authors = [ + "Jan Harkes " +] +license = "MIT" +packages = [ + { include = "module_a", from = "lib_a" }, + { include = "module_b", from = "lib_b" }, +] + +[tool.poetry.dependencies] +python = "^3.6" diff --git a/tests/masonry/builders/test_sdist.py b/tests/masonry/builders/test_sdist.py index ae299595a..7ccd65ee9 100644 --- a/tests/masonry/builders/test_sdist.py +++ b/tests/masonry/builders/test_sdist.py @@ -629,3 +629,19 @@ def test_sdist_mtime_zero(): with gzip.open(str(sdist), "rb") as gz: gz.read(100) assert gz.mtime == 0 + + +def test_split_source(): + root = fixtures_dir / "split_source" + poetry = Factory().create_poetry(root) + + builder = SdistBuilder(poetry) + + # Check setup.py + setup = builder.build_setup() + setup_ast = ast.parse(setup) + + setup_ast.body = [n for n in setup_ast.body if isinstance(n, ast.Assign)] + ns = {} + exec(compile(setup_ast, filename="setup.py", mode="exec"), ns) + assert "" in ns["package_dir"] and "module_b" in ns["package_dir"]