Commit 1e8b3272 by Arun Babu Neelicattu

env: enable usersite for system environments

Resolves: #2996
parent cd8a329b
......@@ -94,13 +94,7 @@ class EditableBuilder(Builder):
os.remove(str(setup))
def _add_pth(self):
pth = self._env.site_packages.joinpath(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
)
)
pth_file = Path(self._module.name).with_suffix(".pth")
paths = set()
for include in self._module.includes:
if isinstance(include, PackageInclude) and (
......@@ -108,11 +102,33 @@ class EditableBuilder(Builder):
):
paths.add(include.base.resolve().as_posix())
with pth.open("w", encoding="utf-8") as f:
for path in paths:
f.write(decode(path + os.linesep))
content = ""
for path in paths:
content += decode(path + os.linesep)
for site_package in [self._env.site_packages, self._env.usersite]:
if not site_package:
continue
return [pth]
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")
self._io.error_line(
" - Failed to create <c2>{}</c2> for {}".format(
pth_file.name, self._poetry.file.parent
)
)
return []
def _add_scripts(self):
added = []
......
......@@ -812,11 +812,15 @@ class Env(object):
@property
def site_packages(self): # type: () -> Path
if self._site_packages is None:
self._site_packages = Path(self.purelib)
self._site_packages = self.purelib
return self._site_packages
@property
def usersite(self): # type: () -> Optional[Path]
if "usersite" in self.paths:
return Path(self.paths["usersite"])
@property
def purelib(self): # type: () -> Path
if self._purelib is None:
self._purelib = Path(self.paths["purelib"])
......@@ -1017,6 +1021,8 @@ class SystemEnv(Env):
# on some distributions it does not return the proper paths
# (those used by pip for instance). We go through distutils
# to get the proper ones.
import site
from distutils.command.install import SCHEME_KEYS # noqa
from distutils.core import Distribution
......@@ -1033,6 +1039,9 @@ class SystemEnv(Env):
paths[key] = getattr(obj, "install_{}".format(key))
if site.check_enableusersite() and hasattr(obj, "install_usersite"):
paths["usersite"] = getattr(obj, "install_usersite")
return paths
def get_supported_tags(self): # type: () -> List[Tag]
......
......@@ -830,6 +830,17 @@ def test_system_env_has_correct_paths():
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):
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