Skip to content

Commit 036a5d7

Browse files
committed
Add a setup file context manager in sdist builder
A temporary setup file is required for various scenarios at the moment. This change introduces a context manager such that generates a temporary setup.py file and handles cleanup on exiting the context.
1 parent fbfcda7 commit 036a5d7

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

poetry/core/masonry/builders/sdist.py

+21
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
import time
77

88
from collections import defaultdict
9+
from contextlib import contextmanager
910
from copy import copy
1011
from gzip import GzipFile
1112
from io import BytesIO
1213
from posixpath import join as pjoin
1314
from pprint import pformat
15+
from typing import Iterator
1416

1517
from poetry.core.utils._compat import Path
18+
from poetry.core.utils._compat import decode
1619
from poetry.core.utils._compat import encode
1720
from poetry.core.utils._compat import to_str
1821

@@ -198,6 +201,24 @@ def build_setup(self): # type: () -> bytes
198201
)
199202
)
200203

204+
@contextmanager
205+
def setup_py(self): # type: () -> Iterator[Path]
206+
setup = self._path / "setup.py"
207+
has_setup = setup.exists()
208+
209+
if has_setup:
210+
logger.info(
211+
" - <warning>A setup.py file already exists. Using it.</warning>"
212+
)
213+
else:
214+
with setup.open("w", encoding="utf-8") as f:
215+
f.write(decode(self.build_setup()))
216+
217+
yield setup
218+
219+
if not has_setup:
220+
setup.unlink()
221+
201222
def build_pkg_info(self):
202223
return encode(self.get_metadata_content())
203224

tests/masonry/builders/test_sdist.py

+24
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from poetry.core.packages.dependency import Dependency
1515
from poetry.core.packages.vcs_dependency import VCSDependency
1616
from poetry.core.utils._compat import Path
17+
from poetry.core.utils._compat import encode
1718
from poetry.core.utils._compat import to_str
1819

1920

@@ -247,6 +248,29 @@ def test_package():
247248
assert "my-package-1.2.3/LICENSE" in tar.getnames()
248249

249250

251+
def test_setup_py_context():
252+
poetry = Factory().create_poetry(project("complete"))
253+
254+
builder = SdistBuilder(poetry)
255+
256+
project_setup_py = poetry.file.parent / "setup.py"
257+
258+
assert not project_setup_py.exists()
259+
260+
try:
261+
with builder.setup_py() as setup:
262+
assert setup.exists()
263+
assert project_setup_py == setup
264+
265+
with open(str(setup), "r", encoding="utf-8") as f:
266+
assert encode(f.read()) == builder.build_setup()
267+
268+
assert not project_setup_py.exists()
269+
finally:
270+
if project_setup_py.exists():
271+
project_setup_py.unlink()
272+
273+
250274
def test_module():
251275
poetry = Factory().create_poetry(project("module1"))
252276

0 commit comments

Comments
 (0)