Skip to content

Commit

Permalink
Add ability to suppress nested venv courtesy notice
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Haplo-Dragon authored and uranusjr committed Jul 25, 2018
1 parent 350aede commit 7c681cc
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 3 deletions.
15 changes: 12 additions & 3 deletions pipenv/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand Down
8 changes: 8 additions & 0 deletions pipenv/environments.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
20 changes: 20 additions & 0 deletions tests/unit/test_core.py
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 7c681cc

Please sign in to comment.