Commit 1e8b3272 by Arun Babu Neelicattu

env: enable usersite for system environments

Resolves: #2996
parent cd8a329b
...@@ -94,13 +94,7 @@ class EditableBuilder(Builder): ...@@ -94,13 +94,7 @@ class EditableBuilder(Builder):
os.remove(str(setup)) os.remove(str(setup))
def _add_pth(self): def _add_pth(self):
pth = self._env.site_packages.joinpath(self._module.name).with_suffix(".pth") pth_file = Path(self._module.name).with_suffix(".pth")
self._debug(
" - Adding <c2>{}</c2> to <b>{}</b> for {}".format(
pth.name, self._env.site_packages, self._poetry.file.parent
)
)
paths = set() paths = set()
for include in self._module.includes: for include in self._module.includes:
if isinstance(include, PackageInclude) and ( if isinstance(include, PackageInclude) and (
...@@ -108,11 +102,33 @@ class EditableBuilder(Builder): ...@@ -108,11 +102,33 @@ class EditableBuilder(Builder):
): ):
paths.add(include.base.resolve().as_posix()) paths.add(include.base.resolve().as_posix())
with pth.open("w", encoding="utf-8") as f: content = ""
for path in paths: for path in paths:
f.write(decode(path + os.linesep)) content += decode(path + os.linesep)
for site_package in [self._env.site_packages, self._env.usersite]:
if not site_package:
continue
try:
site_package.mkdir(parents=True, exist_ok=True)
path = site_package.joinpath(pth_file)
self._debug(
" - Adding <c2>{}</c2> to <b>{}</b> for {}".format(
path.name, site_package, self._poetry.file.parent
)
)
path.write_text(content, encoding="utf-8")
return [path]
except PermissionError:
self._debug("- <b>{}</b> is not writable trying next available site")
return [pth] self._io.error_line(
" - Failed to create <c2>{}</c2> for {}".format(
pth_file.name, self._poetry.file.parent
)
)
return []
def _add_scripts(self): def _add_scripts(self):
added = [] added = []
......
...@@ -812,11 +812,15 @@ class Env(object): ...@@ -812,11 +812,15 @@ class Env(object):
@property @property
def site_packages(self): # type: () -> Path def site_packages(self): # type: () -> Path
if self._site_packages is None: if self._site_packages is None:
self._site_packages = Path(self.purelib) self._site_packages = self.purelib
return self._site_packages return self._site_packages
@property @property
def usersite(self): # type: () -> Optional[Path]
if "usersite" in self.paths:
return Path(self.paths["usersite"])
@property
def purelib(self): # type: () -> Path def purelib(self): # type: () -> Path
if self._purelib is None: if self._purelib is None:
self._purelib = Path(self.paths["purelib"]) self._purelib = Path(self.paths["purelib"])
...@@ -1017,6 +1021,8 @@ class SystemEnv(Env): ...@@ -1017,6 +1021,8 @@ class SystemEnv(Env):
# on some distributions it does not return the proper paths # on some distributions it does not return the proper paths
# (those used by pip for instance). We go through distutils # (those used by pip for instance). We go through distutils
# to get the proper ones. # to get the proper ones.
import site
from distutils.command.install import SCHEME_KEYS # noqa from distutils.command.install import SCHEME_KEYS # noqa
from distutils.core import Distribution from distutils.core import Distribution
...@@ -1033,6 +1039,9 @@ class SystemEnv(Env): ...@@ -1033,6 +1039,9 @@ class SystemEnv(Env):
paths[key] = getattr(obj, "install_{}".format(key)) paths[key] = getattr(obj, "install_{}".format(key))
if site.check_enableusersite() and hasattr(obj, "install_usersite"):
paths["usersite"] = getattr(obj, "install_usersite")
return paths return paths
def get_supported_tags(self): # type: () -> List[Tag] def get_supported_tags(self): # type: () -> List[Tag]
......
...@@ -830,6 +830,17 @@ def test_system_env_has_correct_paths(): ...@@ -830,6 +830,17 @@ def test_system_env_has_correct_paths():
assert env.site_packages == Path(paths["purelib"]) assert env.site_packages == Path(paths["purelib"])
@pytest.mark.parametrize(
("enabled",), [(True,), (False,)],
)
def test_system_env_usersite(mocker, enabled):
mocker.patch("site.check_enableusersite", return_value=enabled)
env = SystemEnv(Path(sys.prefix))
assert (enabled and env.usersite is not None) or (
not enabled and env.usersite is None
)
def test_venv_has_correct_paths(tmp_venv): def test_venv_has_correct_paths(tmp_venv):
paths = tmp_venv.paths paths = tmp_venv.paths
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment