diff --git a/src/poetry/console/commands/init.py b/src/poetry/console/commands/init.py index 18d7c4356da..523728dc778 100644 --- a/src/poetry/console/commands/init.py +++ b/src/poetry/console/commands/init.py @@ -58,6 +58,7 @@ class InitCommand(Command): flag=False, multiple=True, ), + option("disable-package-mode", "-N", "Disables package mode.", flag=True), option("license", "l", "License of the package.", flag=False), ] @@ -141,9 +142,12 @@ def _init_pyproject( if is_interactive: question = self.create_question( - f"Version [{version}]: ", default=version + f"Version [{version}]: ", + default=version if not self.option("disable-package-mode") else "", ) version = self.ask(question) + else: + version = version if not self.option("disable-package-mode") else "" description = self.option("description") or "" if not description and is_interactive: @@ -244,6 +248,7 @@ def _init_pyproject( python=python, dependencies=requirements, dev_dependencies=dev_requirements, + package_mode=not self.option("disable-package-mode"), ) create_layout = not project_path.exists() or ( diff --git a/src/poetry/layouts/layout.py b/src/poetry/layouts/layout.py index 18f72e903ea..568493b7bfb 100644 --- a/src/poetry/layouts/layout.py +++ b/src/poetry/layouts/layout.py @@ -44,6 +44,8 @@ [tool.poetry.group.dev.dependencies] """ +POETRY_DEFAULT_AUTHOR = "Your Name " + poetry_core_version = Version.parse(importlib.metadata.version("poetry-core")) BUILD_SYSTEM_MIN_VERSION: str | None = Version.from_parts( @@ -68,6 +70,7 @@ def __init__( python: str | None = None, dependencies: Mapping[str, str | Mapping[str, Any]] | None = None, dev_dependencies: Mapping[str, str | Mapping[str, Any]] | None = None, + package_mode: bool = True, ) -> None: self._project = canonicalize_name(project) self._package_path_relative = Path( @@ -83,9 +86,10 @@ def __init__( self._python = python self._dependencies = dependencies or {} self._dev_dependencies = dev_dependencies or {} + self._package_mode = package_mode if not author: - author = "Your Name " + author = POETRY_DEFAULT_AUTHOR self._author = author @@ -152,6 +156,14 @@ def generate_project_content(self) -> TOMLDocument: if email := m.group("email"): author["email"] = email project_content["authors"].append(author) + if self._author == POETRY_DEFAULT_AUTHOR and not self._package_mode: + project_content.remove("authors") + + if not self._package_mode: + if not project_content["version"]: + project_content.remove("version") + if not project_content["description"]: + project_content.remove("description") if self._license: project_content["license"]["text"] = self._license @@ -185,6 +197,9 @@ def generate_project_content(self) -> TOMLDocument: else: del poetry_content["group"] + if not self._package_mode: + poetry_content["package-mode"] = False + if not poetry_content: del content["tool"]["poetry"] diff --git a/tests/console/commands/test_init.py b/tests/console/commands/test_init.py index 98222c385ac..776386500f1 100644 --- a/tests/console/commands/test_init.py +++ b/tests/console/commands/test_init.py @@ -1207,3 +1207,108 @@ def test_init_does_not_create_project_structure_in_non_empty_directory( # Existing files should remain assert (source_dir / "existing_file.txt").exists() assert (source_dir / "existing_dir").exists() + + +def test_init_with_no_package_mode_flag_active( + tester: CommandTester, source_dir: Path +) -> None: + """Test that poetry init add package-mode = false to pyproject.toml""" + inputs = [ + "my-package", # Package name + "", # Version + "", # Description + "n", # Author + "", # License + "", # Python + "n", # Interactive packages + "n", # Interactive dev packages + "\n", # Generate + ] + + expected = """\ +[tool.poetry] +package-mode = false +""" + tester.execute("--disable-package-mode", inputs="\n".join(inputs)) + + assert (source_dir / "pyproject.toml").exists() + assert expected in (source_dir / "pyproject.toml").read_text(encoding="utf-8") + + +def test_init_with_no_package_mode_flag_active_short_flag( + tester: CommandTester, source_dir: Path +) -> None: + """Test that poetry init add package-mode = false to pyproject.toml""" + inputs = [ + "my-package", # Package name + "", # Version + "", # Description + "n", # Author + "", # License + "", # Python + "n", # Interactive packages + "n", # Interactive dev packages + "\n", # Generate + ] + + expected = """\ +[tool.poetry] +package-mode = false +""" + tester.execute("-N", inputs="\n".join(inputs)) + + assert (source_dir / "pyproject.toml").exists() + assert expected in (source_dir / "pyproject.toml").read_text(encoding="utf-8") + + +def test_init_with_no_package_mode_flag_active_remove_optional_fields( + tester: CommandTester, source_dir: Path +) -> None: + """Test that poetry init add package-mode = false to pyproject.toml""" + inputs = [ + "my-package", # Package name + "", # Version + "", # Description + "n", # Author + "", # License + "", # Python + "n", # Interactive packages + "n", # Interactive dev packages + "\n", # Generate + ] + + tester.execute("-N", inputs="\n".join(inputs)) + + assert (source_dir / "pyproject.toml").exists() + toml_content = (source_dir / "pyproject.toml").read_text(encoding="utf-8") + assert "version = " not in toml_content + assert "description =" not in toml_content + assert "authors =" not in toml_content + + +def test_init_with_no_package_mode_flag_active_remove_optional_fields_with_email( + tester: CommandTester, source_dir: Path +) -> None: + """Test that poetry init add package-mode = false to pyproject.toml""" + inputs = [ + "my-package", # Package name + "", # Version + "", # Description + "poetry ", # Author + "", # License + "", # Python + "n", # Interactive packages + "n", # Interactive dev packages + "\n", # Generate + ] + + tester.execute("-N", inputs="\n".join(inputs)) + expected = """ +authors = [ + {name = "poetry",email = "poetry@poetry.com"} +] +""" + + assert (source_dir / "pyproject.toml").exists() + toml_content = (source_dir / "pyproject.toml").read_text(encoding="utf-8") + assert expected in toml_content