Fix non-meaningful venv names. (#2134)

* Add feature to ignore certain virtualenv names

* Add tests for testing ignored names (specific as well as default)

* Don't use `zsh.environ` as this does not stringify the environment
This commit is contained in:
StopMotionCuber 2020-10-27 13:50:36 +01:00 committed by GitHub
parent f4ef122759
commit a6060c760a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 12 deletions

View File

@ -101,10 +101,7 @@ class Environment(object):
return False return False
if hasattr(getattr(zsh, 'environ', None), '__contains__'): environ = Environment()
environ = zsh.environ
else:
environ = Environment()
if hasattr(zsh, 'expand') and zsh.expand('${:-}') == '': if hasattr(zsh, 'expand') and zsh.expand('${:-}') == '':

View File

@ -19,20 +19,24 @@ def environment(pl, segment_info, variable=None):
@requires_segment_info @requires_segment_info
def virtualenv(pl, segment_info, ignore_venv=False, ignore_conda=False): def virtualenv(pl, segment_info, ignore_venv=False, ignore_conda=False, ignored_names=("venv", ".venv")):
'''Return the name of the current Python or conda virtualenv. '''Return the name of the current Python or conda virtualenv.
:param list ignored_names:
Names of venvs to ignore. Will then get the name of the venv by ascending to the parent directory
:param bool ignore_venv: :param bool ignore_venv:
Whether to ignore virtual environments. Default is False. Whether to ignore virtual environments. Default is False.
:param bool ignore_conda: :param bool ignore_conda:
Whether to ignore conda environments. Default is False. Whether to ignore conda environments. Default is False.
''' '''
return ( if not ignore_venv:
(not ignore_venv and for candidate in reversed(segment_info['environ'].get('VIRTUAL_ENV', '').split("/")):
os.path.basename(segment_info['environ'].get('VIRTUAL_ENV', ''))) or if candidate and candidate not in ignored_names:
(not ignore_conda and return candidate
segment_info['environ'].get('CONDA_DEFAULT_ENV', '')) or if not ignore_conda:
None) for candidate in reversed(segment_info['environ'].get('CONDA_DEFAULT_ENV', '').split("/")):
if candidate and candidate not in ignored_names:
return candidate
return None
@requires_segment_info @requires_segment_info

View File

@ -687,6 +687,10 @@ class TestEnv(TestCommon):
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_conda=True), 'ghi') self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_conda=True), 'ghi')
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True), None) self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True), None)
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True, ignore_conda=True), None) self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True, ignore_conda=True), None)
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignored_names=["aaa"]), "ghi")
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignored_names=["ghi"]), "def")
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignored_names=["def", "ghi"]), "abc")
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignored_names=["abc", "def", "ghi"]), None)
segment_info['environ'].pop('VIRTUAL_ENV') segment_info['environ'].pop('VIRTUAL_ENV')
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info), None) self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info), None)
@ -696,6 +700,7 @@ class TestEnv(TestCommon):
with replace_env('CONDA_DEFAULT_ENV', 'foo') as segment_info: with replace_env('CONDA_DEFAULT_ENV', 'foo') as segment_info:
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info), 'foo') self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info), 'foo')
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignored_names=["foo"]), None)
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_conda=True), None) self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_conda=True), None)
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True), 'foo') self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True), 'foo')
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True, ignore_conda=True), None) self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True, ignore_conda=True), None)
@ -718,6 +723,9 @@ class TestEnv(TestCommon):
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True), None) self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True), None)
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True, ignore_conda=True), None) self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info, ignore_venv=True, ignore_conda=True), None)
with replace_env('VIRTUAL_ENV', '/abc/def/venv') as segment_info:
self.assertEqual(self.module.virtualenv(pl=pl, segment_info=segment_info), 'def')
def test_environment(self): def test_environment(self):
pl = Pl() pl = Pl()
variable = 'FOO' variable = 'FOO'