1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
import subprocess
from textwrap import dedent
import pytest
import jaraco.envs
import path
@pytest.fixture
def venv(tmp_path, setuptools_wheel):
env = jaraco.envs.VirtualEnv()
vars(env).update(
root=path.Path(tmp_path), # workaround for error on windows
name=".venv",
create_opts=["--no-setuptools"],
req=str(setuptools_wheel),
)
return env.create()
EXAMPLE = {
'pyproject.toml': dedent("""\
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "mypkg"
version = "3.14159"
license = {text = "MIT"}
description = "This is a Python package"
dynamic = ["readme"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers"
]
urls = {Homepage = "http://github.com"}
dependencies = ['importlib-metadata; python_version<"3.8"']
[tool.setuptools]
package-dir = {"" = "src"}
packages = {find = {where = ["src"]}}
license-files = ["LICENSE*"]
[tool.setuptools.dynamic]
readme = {file = "README.rst"}
[tool.distutils.egg_info]
tag-build = ".post0"
"""),
"MANIFEST.in": dedent("""\
global-include *.py *.txt
global-exclude *.py[cod]
""").strip(),
"README.rst": "This is a ``README``",
"LICENSE.txt": "---- placeholder MIT license ----",
"src": {
"mypkg": {
"__init__.py": dedent("""\
import sys
if sys.version_info[:2] >= (3, 8):
from importlib.metadata import PackageNotFoundError, version
else:
from importlib_metadata import PackageNotFoundError, version
try:
__version__ = version(__name__)
except PackageNotFoundError:
__version__ = "unknown"
"""),
"__main__.py": dedent("""\
from importlib.resources import read_text
from . import __version__, __name__ as parent
from .mod import x
data = read_text(parent, "data.txt")
print(__version__, data, x)
"""),
"mod.py": "x = ''",
"data.txt": "Hello World",
}
}
}
SETUP_SCRIPT_STUB = "__import__('setuptools').setup()"
MISSING_SETUP_SCRIPT = pytest.param(
None,
marks=pytest.mark.xfail(
reason="Editable install is currently only supported with `setup.py`"
)
)
@pytest.mark.parametrize("setup_script", [SETUP_SCRIPT_STUB, MISSING_SETUP_SCRIPT])
def test_editable_with_pyproject(tmp_path, venv, setup_script):
project = tmp_path / "mypkg"
files = {**EXAMPLE, "setup.py": setup_script}
project.mkdir()
jaraco.path.build(files, prefix=project)
cmd = [venv.exe(), "-m", "pip", "install",
"--no-build-isolation", # required to force current version of setuptools
"-e", str(project)]
print(str(subprocess.check_output(cmd), "utf-8"))
cmd = [venv.exe(), "-m", "mypkg"]
assert subprocess.check_output(cmd).strip() == b"3.14159.post0 Hello World"
(project / "src/mypkg/data.txt").write_text("foobar")
(project / "src/mypkg/mod.py").write_text("x = 42")
assert subprocess.check_output(cmd).strip() == b"3.14159.post0 foobar 42"
|