diff --git a/src/poetry/core/packages/directory_dependency.py b/src/poetry/core/packages/directory_dependency.py index 16d7de821..808d1057d 100644 --- a/src/poetry/core/packages/directory_dependency.py +++ b/src/poetry/core/packages/directory_dependency.py @@ -36,7 +36,6 @@ def __init__( raise ValueError(f"Directory {self._path} does not exist") self._develop = develop - self._supports_poetry = False if not self._full_path.exists(): raise ValueError(f"Directory {self._path} does not exist") @@ -45,12 +44,17 @@ def __init__( raise ValueError(f"{self._path} is a file, expected a directory") # Checking content to determine actions - setup = self._full_path / "setup.py" - self._supports_poetry = PyProjectTOML( - self._full_path / "pyproject.toml" - ).is_poetry_project() + setup_py = self._full_path / "setup.py" + setup_cfg = self._full_path / "setup.cfg" + setuptools_project = setup_py.exists() or setup_cfg.exists() + pyproject = PyProjectTOML(self._full_path / "pyproject.toml") - if not setup.exists() and not self._supports_poetry: + self._supports_pep517 = ( + setuptools_project or pyproject.is_build_system_defined() + ) + self._supports_poetry = pyproject.is_poetry_project() + + if not (self._supports_pep517 or self._supports_poetry): raise ValueError( f"Directory {self._full_path} does not seem to be a Python package" ) diff --git a/src/poetry/core/pyproject/toml.py b/src/poetry/core/pyproject/toml.py index 048aa6368..7496254a7 100644 --- a/src/poetry/core/pyproject/toml.py +++ b/src/poetry/core/pyproject/toml.py @@ -40,6 +40,9 @@ def data(self) -> TOMLDocument: return self._data + def is_build_system_defined(self) -> bool: + return self._file.exists() and "build-system" in self.data + @property def build_system(self) -> BuildSystem: from poetry.core.pyproject.tables import BuildSystem diff --git a/tests/fixtures/project_with_pep517_non_poetry/pyproject.toml b/tests/fixtures/project_with_pep517_non_poetry/pyproject.toml new file mode 100644 index 000000000..8b36a60d6 --- /dev/null +++ b/tests/fixtures/project_with_pep517_non_poetry/pyproject.toml @@ -0,0 +1,13 @@ +[build-system] +requires = ["flit_core >=3.7.1,<4"] +build-backend = "flit_core.buildapi" + +[project] +name = "flit" +authors = [] +dependencies = [ + "flit_core >=3.7.1", +] +requires-python = ">=3.6" +readme = "README.rst" +dynamic = ['version', 'description'] diff --git a/tests/fixtures/project_with_setup_cfg_only/setup.cfg b/tests/fixtures/project_with_setup_cfg_only/setup.cfg new file mode 100644 index 000000000..b0f43520e --- /dev/null +++ b/tests/fixtures/project_with_setup_cfg_only/setup.cfg @@ -0,0 +1,18 @@ +[metadata] +name = my_package +version = attr: my_package.VERSION +description = My package description +long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst +keywords = one, two +license = BSD 3-Clause License +classifiers = + Framework :: Django + Programming Language :: Python :: 3 + +[options] +zip_safe = False +include_package_data = True +packages = find: +install_requires = + requests + importlib-metadata; python_version<"3.8" diff --git a/tests/packages/test_directory_dependency.py b/tests/packages/test_directory_dependency.py index 86e54fd1b..4330b8a68 100644 --- a/tests/packages/test_directory_dependency.py +++ b/tests/packages/test_directory_dependency.py @@ -75,3 +75,21 @@ def test_directory_dependency_pep_508_extras() -> None: requirement = f"demo[foo,bar] @ file://{path.as_posix()}" requirement_expected = f"demo[bar,foo] @ file://{path.as_posix()}" _test_directory_dependency_pep_508("demo", path, requirement, requirement_expected) + + +@pytest.mark.parametrize( + ("fixture", "name"), + [ + ("project_with_pep517_non_poetry", "PEP 517"), + ("project_with_setup_cfg_only", "setup.cfg"), + ], +) +def test_directory_dependency_non_poetry_pep517(fixture: str, name: str) -> None: + path = Path(__file__).parent.parent / "fixtures" / fixture + + try: + DirectoryDependency("package", path) + except ValueError as e: + if "does not seem to be a Python package" not in str(e): + raise e from e + pytest.fail(f"A {name} project not recognized as valid directory dependency")