Skip to content

Commit 8bb0c63

Browse files
committed
add support for PEP 621: poetry init and poetry new (#9135)
1 parent 5f8c49d commit 8bb0c63

File tree

5 files changed

+252
-174
lines changed

5 files changed

+252
-174
lines changed

src/poetry/console/commands/init.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ def _init_pyproject(
105105
if pyproject.file.exists():
106106
if pyproject.is_poetry_project():
107107
self.line_error(
108-
"<error>A pyproject.toml file with a poetry section already"
109-
" exists.</error>"
108+
"<error>A pyproject.toml file with a project and/or"
109+
" a poetry section already exists.</error>"
110110
)
111111
return 1
112112

@@ -255,7 +255,7 @@ def _init_pyproject(
255255
if create_layout:
256256
layout_.create(project_path, with_pyproject=False)
257257

258-
content = layout_.generate_poetry_content()
258+
content = layout_.generate_project_content()
259259
for section, item in content.items():
260260
pyproject.data.append(section, item)
261261

src/poetry/layouts/layout.py

+45-21
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
from typing import Any
66

77
from packaging.utils import canonicalize_name
8+
from poetry.core.packages.package import AUTHOR_REGEX
89
from poetry.core.utils.helpers import module_name
910
from tomlkit import inline_table
1011
from tomlkit import loads
1112
from tomlkit import table
1213
from tomlkit.toml_document import TOMLDocument
1314

15+
from poetry.factory import Factory
1416
from poetry.pyproject.toml import PyProjectTOML
1517

1618

@@ -21,16 +23,20 @@
2123

2224

2325
POETRY_DEFAULT = """\
24-
[tool.poetry]
26+
[project]
2527
name = ""
2628
version = ""
2729
description = ""
28-
authors = []
29-
license = ""
30+
authors = [
31+
]
32+
license = {}
3033
readme = ""
31-
packages = []
34+
requires-python = ""
35+
dependencies = [
36+
]
3237
33-
[tool.poetry.dependencies]
38+
[tool.poetry]
39+
packages = []
3440
3541
[tool.poetry.group.dev.dependencies]
3642
"""
@@ -48,7 +54,7 @@ def __init__(
4854
readme_format: str = "md",
4955
author: str | None = None,
5056
license: str | None = None,
51-
python: str = "*",
57+
python: str | None = None,
5258
dependencies: Mapping[str, str | Mapping[str, Any]] | None = None,
5359
dev_dependencies: Mapping[str, str | Mapping[str, Any]] | None = None,
5460
) -> None:
@@ -117,34 +123,49 @@ def create(
117123
if with_pyproject:
118124
self._write_poetry(path)
119125

120-
def generate_poetry_content(self) -> TOMLDocument:
126+
def generate_project_content(self) -> TOMLDocument:
121127
template = POETRY_DEFAULT
122128

123129
content: dict[str, Any] = loads(template)
124130

125-
poetry_content = content["tool"]["poetry"]
126-
poetry_content["name"] = self._project
127-
poetry_content["version"] = self._version
128-
poetry_content["description"] = self._description
129-
poetry_content["authors"].append(self._author)
131+
project_content = content["project"]
132+
project_content["name"] = self._project
133+
project_content["version"] = self._version
134+
project_content["description"] = self._description
135+
m = AUTHOR_REGEX.match(self._author)
136+
if m is None:
137+
# This should not happen because author has been validated before.
138+
raise ValueError(f"Invalid author: {self._author}")
139+
else:
140+
author = {"name": m.group("name")}
141+
if email := m.group("email"):
142+
author["email"] = email
143+
project_content["authors"].append(author)
130144

131145
if self._license:
132-
poetry_content["license"] = self._license
146+
project_content["license"]["text"] = self._license
147+
else:
148+
project_content.remove("license")
149+
150+
project_content["readme"] = f"README.{self._readme_format}"
151+
152+
if self._python:
153+
project_content["requires-python"] = self._python
133154
else:
134-
poetry_content.remove("license")
155+
project_content.remove("requires-python")
156+
157+
for dep_name, dep_constraint in self._dependencies.items():
158+
dependency = Factory.create_dependency(dep_name, dep_constraint)
159+
project_content["dependencies"].append(dependency.to_pep_508())
160+
161+
poetry_content = content["tool"]["poetry"]
135162

136-
poetry_content["readme"] = f"README.{self._readme_format}"
137163
packages = self.get_package_include()
138164
if packages:
139165
poetry_content["packages"].append(packages)
140166
else:
141167
poetry_content.remove("packages")
142168

143-
poetry_content["dependencies"]["python"] = self._python
144-
145-
for dep_name, dep_constraint in self._dependencies.items():
146-
poetry_content["dependencies"][dep_name] = dep_constraint
147-
148169
if self._dev_dependencies:
149170
for dep_name, dep_constraint in self._dev_dependencies.items():
150171
poetry_content["group"]["dev"]["dependencies"][dep_name] = (
@@ -153,6 +174,9 @@ def generate_poetry_content(self) -> TOMLDocument:
153174
else:
154175
del poetry_content["group"]
155176

177+
if not poetry_content:
178+
del content["tool"]["poetry"]
179+
156180
# Add build system
157181
build_system = table()
158182
build_system_version = ""
@@ -194,7 +218,7 @@ def _create_tests(path: Path) -> None:
194218

195219
def _write_poetry(self, path: Path) -> None:
196220
pyproject = PyProjectTOML(path / "pyproject.toml")
197-
content = self.generate_poetry_content()
221+
content = self.generate_project_content()
198222
for section, item in content.items():
199223
pyproject.data.append(section, item)
200224
pyproject.save()

tests/console/commands/conftest.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def init_basic_inputs() -> str:
1212
"This is a description", # Description
1313
"n", # Author
1414
"MIT", # License
15-
"~2.7 || ^3.6", # Python
15+
">=3.6", # Python
1616
"n", # Interactive packages
1717
"n", # Interactive dev packages
1818
"\n", # Generate
@@ -23,14 +23,14 @@ def init_basic_inputs() -> str:
2323
@pytest.fixture()
2424
def init_basic_toml() -> str:
2525
return """\
26-
[tool.poetry]
26+
[project]
2727
name = "my-package"
2828
version = "1.2.3"
2929
description = "This is a description"
30-
authors = ["Your Name <[email protected]>"]
31-
license = "MIT"
30+
authors = [
31+
{name = "Your Name",email = "[email protected]"}
32+
]
33+
license = {text = "MIT"}
3234
readme = "README.md"
33-
34-
[tool.poetry.dependencies]
35-
python = "~2.7 || ^3.6"
35+
requires-python = ">=3.6"
3636
"""

0 commit comments

Comments
 (0)