From 7c681cc139fcae933e38caacacd238b3e88cbd61 Mon Sep 17 00:00:00 2001 From: Haplo Date: Thu, 12 Jul 2018 02:36:36 -0500 Subject: [PATCH] Add ability to suppress nested venv courtesy notice Added an environment variable, PIPENV_SUPPRESS_NESTED_WARNING, to be used to suppress the courtesy notice from warn_in_virtualenv. Changed wording of the courtesy notice to mention suppression variable. Fixes #2527. --- pipenv/core.py | 15 ++++++++++++--- pipenv/environments.py | 8 ++++++++ tests/unit/test_core.py | 20 ++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 tests/unit/test_core.py diff --git a/pipenv/core.py b/pipenv/core.py index 4ecf5d4add..4ffc69a625 100644 --- a/pipenv/core.py +++ b/pipenv/core.py @@ -1612,19 +1612,28 @@ def gen(out): def warn_in_virtualenv(): - from .environments import PIPENV_USE_SYSTEM, PIPENV_VIRTUALENV + from .environments import ( + PIPENV_USE_SYSTEM, + PIPENV_VIRTUALENV, + PIPENV_SUPPRESS_NESTED_WARNING, + ) # Only warn if pipenv isn't already active. pipenv_active = os.environ.get("PIPENV_ACTIVE") - if (PIPENV_USE_SYSTEM or PIPENV_VIRTUALENV) and not pipenv_active: + if ( + (PIPENV_USE_SYSTEM or PIPENV_VIRTUALENV) + and not (pipenv_active or PIPENV_SUPPRESS_NESTED_WARNING) + ): click.echo( "{0}: Pipenv found itself running within a virtual environment, " "so it will automatically use that environment, instead of " "creating its own for any project. You can set " "{1} to force pipenv to ignore that environment and create " - "its own instead.".format( + "its own instead. You can set {2} to suppress this " + "warning.".format( crayons.green("Courtesy Notice"), crayons.normal("PIPENV_IGNORE_VIRTUALENVS=1", bold=True), + crayons.normal("PIPENV_SUPPRESS_NESTED_WARNING=1", bold=True), ), err=True, ) diff --git a/pipenv/environments.py b/pipenv/environments.py index f241172a14..f89fdf92c3 100644 --- a/pipenv/environments.py +++ b/pipenv/environments.py @@ -162,6 +162,14 @@ Default is to use the compatibility shell if possible. """ +PIPENV_SUPPRESS_NESTED_WARNING = bool(os.environ.get( + 'PIPENV_SUPPRESS_NESTED_WARNING')) +"""If set, suppress the courtesy notice regarding nested virtual environments. + +Default is to show a courtesy notice when pipenv finds itself running inside +another virtual environment. +""" + PIPENV_TIMEOUT = int(os.environ.get("PIPENV_TIMEOUT", 120)) """Max number of seconds Pipenv will wait for virtualenv creation to complete. diff --git a/tests/unit/test_core.py b/tests/unit/test_core.py new file mode 100644 index 0000000000..460075f443 --- /dev/null +++ b/tests/unit/test_core.py @@ -0,0 +1,20 @@ +import io + +import pytest +import mock +from contextlib import redirect_stderr + +from pipenv.core import warn_in_virtualenv + + +@mock.patch('pipenv.environments.PIPENV_VIRTUALENV', 'totallyrealenv') +@mock.patch('pipenv.environments.PIPENV_SUPPRESS_NESTED_WARNING', '1') +@pytest.mark.core +def test_suppress_nested_venv_warning(): + f = io.StringIO() + # Capture the stderr of warn_in_virtualenv to test for the presence of the + # courtesy notice. + with redirect_stderr(f): + warn_in_virtualenv() + output = f.getvalue() + assert 'Courtesy Notice' not in output