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