summaryrefslogtreecommitdiff
path: root/setuptools/tests/test_editable_install.py
diff options
context:
space:
mode:
authorAnderson Bravalheri <andersonbravalheri@gmail.com>2021-12-24 17:55:27 +0000
committerAnderson Bravalheri <andersonbravalheri@gmail.com>2022-03-05 14:32:13 +0000
commit09f784fd39256eeda666e223a0b583c77da19a0c (patch)
tree3e1c3b41da7f86bbbf5a1650c84851d1499d9e15 /setuptools/tests/test_editable_install.py
parent2b333e983514a69b0ba04c2668debf5ba99e07d2 (diff)
downloadpython-setuptools-git-09f784fd39256eeda666e223a0b583c77da19a0c.tar.gz
Test editable installs with pyproject.toml metadata
Diffstat (limited to 'setuptools/tests/test_editable_install.py')
-rw-r--r--setuptools/tests/test_editable_install.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/setuptools/tests/test_editable_install.py b/setuptools/tests/test_editable_install.py
new file mode 100644
index 00000000..2957cba0
--- /dev/null
+++ b/setuptools/tests/test_editable_install.py
@@ -0,0 +1,109 @@
+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()
+
+
+SETUP_SCRIPT_STUB = "__import__('setuptools').setup()"
+
+EXAMPLE = {
+ 'pyproject.toml': dedent("""\
+ [build-system]
+ requires = ["setuptools", "wheel"]
+ build-backend = "setuptools.build_meta"
+
+ [project]
+ name = "mypkg"
+ version = "3.14159"
+ description = "This is a Python package"
+ dynamic = ["license", "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"]}}
+
+ [tool.setuptools.dynamic]
+ license = "MIT"
+ license_files = ["LICENSE*"]
+ 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",
+ }
+ }
+}
+
+
+@pytest.mark.parametrize("setup_script", [SETUP_SCRIPT_STUB, None])
+def test_editable_with_pyproject(tmp_path, venv, setup_script):
+ if setup_script is None:
+ pytest.skip("Editable install currently only supported with `setup.py` stub")
+
+ 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"