diff --git a/poetry/utils/_compat.py b/poetry/utils/_compat.py index 429c84cd455..937f9b300e6 100644 --- a/poetry/utils/_compat.py +++ b/poetry/utils/_compat.py @@ -46,15 +46,11 @@ WINDOWS = sys.platform == "win32" -if PY2: - import pipes - - shell_quote = pipes.quote -else: - import shlex - - shell_quote = shlex.quote - +try: + from shlex import quote +except ImportError: + # PY2 + from pipes import quote # noqa if PY34: from importlib.machinery import EXTENSION_SUFFIXES @@ -288,10 +284,7 @@ def to_str(string): def list_to_shell_command(cmd): - executable = cmd[0] - - if " " in executable: - executable = '"{}"'.format(executable) - cmd[0] = executable - - return " ".join(cmd) + return " ".join( + '"{}"'.format(token) if " " in token and token[0] not in {"'", '"'} else token + for token in cmd + ) diff --git a/tests/utils/test_env.py b/tests/utils/test_env.py index c0bee94605d..3779623839f 100644 --- a/tests/utils/test_env.py +++ b/tests/utils/test_env.py @@ -15,6 +15,7 @@ from poetry.factory import Factory from poetry.utils._compat import PY2 from poetry.utils._compat import Path +from poetry.utils.env import GET_BASE_PREFIX from poetry.utils.env import EnvCommandError from poetry.utils.env import EnvManager from poetry.utils.env import NoCompatiblePythonVersionFound @@ -74,6 +75,26 @@ def test_virtualenvs_with_spaces_in_their_path_work_as_expected(tmp_dir, manager assert venv.run("python", "-V", shell=True).startswith("Python") +def test_env_commands_with_spaces_in_their_arg_work_as_expected(tmp_dir, manager): + venv_path = Path(tmp_dir) / "Virtual Env" + manager.build_venv(str(venv_path)) + venv = VirtualEnv(venv_path) + assert venv.run("python", venv.pip, "--version", shell=True).startswith( + "pip {} from ".format(venv.pip_version) + ) + + +def test_env_shell_commands_with_stdinput_in_their_arg_work_as_expected( + tmp_dir, manager +): + venv_path = Path(tmp_dir) / "Virtual Env" + manager.build_venv(str(venv_path)) + venv = VirtualEnv(venv_path) + assert venv.run("python", "-", input_=GET_BASE_PREFIX, shell=True).strip() == str( + venv.get_base_prefix() + ) + + @pytest.fixture def in_project_venv_dir(poetry): os.environ.pop("VIRTUAL_ENV", None)