Commit fd0f84bd authored by Vinay Sajip's avatar Vinay Sajip

Closes #22829: Added --prompt option to venv.

parent c0752011
...@@ -89,7 +89,8 @@ mechanisms for third-party virtual environment creators to customize environment ...@@ -89,7 +89,8 @@ mechanisms for third-party virtual environment creators to customize environment
creation according to their needs, the :class:`EnvBuilder` class. creation according to their needs, the :class:`EnvBuilder` class.
.. class:: EnvBuilder(system_site_packages=False, clear=False, \ .. class:: EnvBuilder(system_site_packages=False, clear=False, \
symlinks=False, upgrade=False, with_pip=False) symlinks=False, upgrade=False, with_pip=False, \
prompt=None)
The :class:`EnvBuilder` class accepts the following keyword arguments on The :class:`EnvBuilder` class accepts the following keyword arguments on
instantiation: instantiation:
...@@ -113,9 +114,16 @@ creation according to their needs, the :class:`EnvBuilder` class. ...@@ -113,9 +114,16 @@ creation according to their needs, the :class:`EnvBuilder` class.
installed in the virtual environment. This uses :mod:`ensurepip` with installed in the virtual environment. This uses :mod:`ensurepip` with
the ``--default-pip`` option. the ``--default-pip`` option.
* ``prompt`` -- a String to be used after virtual environment is activated
(defaults to ``None`` which means directory name of the environment would
be used).
.. versionchanged:: 3.4 .. versionchanged:: 3.4
Added the ``with_pip`` parameter Added the ``with_pip`` parameter
.. versionadded:: 3.6
Added the ``prompt`` parameter
Creators of third-party virtual environment tools will be free to use the Creators of third-party virtual environment tools will be free to use the
provided ``EnvBuilder`` class as a base class. provided ``EnvBuilder`` class as a base class.
......
...@@ -284,6 +284,14 @@ class has been added to the :mod:`typing` module as ...@@ -284,6 +284,14 @@ class has been added to the :mod:`typing` module as
(Contributed by Brett Cannon in :issue:`25609`.) (Contributed by Brett Cannon in :issue:`25609`.)
venv
----
:mod:`venv` accepts a new parameter ``--prompt``. This parameter provides an
alternative prefix for the virtual environment. (Proposed by Łukasz.Balcerzak
and ported to 3.6 by Stéphane Wirtel in :issue:`22829`.)
datetime datetime
-------- --------
......
...@@ -114,6 +114,17 @@ class BasicTest(BaseTest): ...@@ -114,6 +114,17 @@ class BasicTest(BaseTest):
print(' %r' % os.listdir(bd)) print(' %r' % os.listdir(bd))
self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn) self.assertTrue(os.path.exists(fn), 'File %r should exist.' % fn)
def test_prompt(self):
env_name = os.path.split(self.env_dir)[1]
builder = venv.EnvBuilder()
context = builder.ensure_directories(self.env_dir)
self.assertEqual(context.prompt, '(%s) ' % env_name)
builder = venv.EnvBuilder(prompt='My prompt')
context = builder.ensure_directories(self.env_dir)
self.assertEqual(context.prompt, '(My prompt) ')
@skipInVenv @skipInVenv
def test_prefixes(self): def test_prefixes(self):
""" """
......
...@@ -36,15 +36,17 @@ class EnvBuilder: ...@@ -36,15 +36,17 @@ class EnvBuilder:
:param upgrade: If True, upgrade an existing virtual environment. :param upgrade: If True, upgrade an existing virtual environment.
:param with_pip: If True, ensure pip is installed in the virtual :param with_pip: If True, ensure pip is installed in the virtual
environment environment
:param prompt: Alternative terminal prefix for the environment.
""" """
def __init__(self, system_site_packages=False, clear=False, def __init__(self, system_site_packages=False, clear=False,
symlinks=False, upgrade=False, with_pip=False): symlinks=False, upgrade=False, with_pip=False, prompt=None):
self.system_site_packages = system_site_packages self.system_site_packages = system_site_packages
self.clear = clear self.clear = clear
self.symlinks = symlinks self.symlinks = symlinks
self.upgrade = upgrade self.upgrade = upgrade
self.with_pip = with_pip self.with_pip = with_pip
self.prompt = prompt
def create(self, env_dir): def create(self, env_dir):
""" """
...@@ -90,7 +92,8 @@ class EnvBuilder: ...@@ -90,7 +92,8 @@ class EnvBuilder:
context = types.SimpleNamespace() context = types.SimpleNamespace()
context.env_dir = env_dir context.env_dir = env_dir
context.env_name = os.path.split(env_dir)[1] context.env_name = os.path.split(env_dir)[1]
context.prompt = '(%s) ' % context.env_name prompt = self.prompt if self.prompt is not None else context.env_name
context.prompt = '(%s) ' % prompt
create_if_needed(env_dir) create_if_needed(env_dir)
env = os.environ env = os.environ
if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in env: if sys.platform == 'darwin' and '__PYVENV_LAUNCHER__' in env:
...@@ -326,10 +329,11 @@ class EnvBuilder: ...@@ -326,10 +329,11 @@ class EnvBuilder:
def create(env_dir, system_site_packages=False, clear=False, def create(env_dir, system_site_packages=False, clear=False,
symlinks=False, with_pip=False): symlinks=False, with_pip=False, prompt=None):
"""Create a virtual environment in a directory.""" """Create a virtual environment in a directory."""
builder = EnvBuilder(system_site_packages=system_site_packages, builder = EnvBuilder(system_site_packages=system_site_packages,
clear=clear, symlinks=symlinks, with_pip=with_pip) clear=clear, symlinks=symlinks, with_pip=with_pip,
prompt=prompt)
builder.create(env_dir) builder.create(env_dir)
def main(args=None): def main(args=None):
...@@ -389,6 +393,9 @@ def main(args=None): ...@@ -389,6 +393,9 @@ def main(args=None):
help='Skips installing or upgrading pip in the ' help='Skips installing or upgrading pip in the '
'virtual environment (pip is bootstrapped ' 'virtual environment (pip is bootstrapped '
'by default)') 'by default)')
parser.add_argument('--prompt',
help='Provides an alternative prompt prefix for '
'this environment.')
options = parser.parse_args(args) options = parser.parse_args(args)
if options.upgrade and options.clear: if options.upgrade and options.clear:
raise ValueError('you cannot supply --upgrade and --clear together.') raise ValueError('you cannot supply --upgrade and --clear together.')
...@@ -396,7 +403,8 @@ def main(args=None): ...@@ -396,7 +403,8 @@ def main(args=None):
clear=options.clear, clear=options.clear,
symlinks=options.symlinks, symlinks=options.symlinks,
upgrade=options.upgrade, upgrade=options.upgrade,
with_pip=options.with_pip) with_pip=options.with_pip,
prompt=options.prompt)
for d in options.dirs: for d in options.dirs:
builder.create(d) builder.create(d)
......
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