mirror of
https://github.com/kennethreitz/pipenv.git
synced 2026-06-05 22:50:18 +00:00
6a93e6cf44
Carets introduce a difficult situation since they are essentially
"lossy" when parses. Consider this in cmd.exe:
> echo "foo^bar"
"foo^bar"
> echo foo^^bar
foo^bar
The two commands produce different results, but are both parsed by the
shell as `foo^bar`, and there's essentially no sensible way to tell what
was actually passed in. This implementation assumes the quoted variation
(the first) since it is easier to implement, and arguably the more common
case.
76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
import pytest
|
|
|
|
from pipenv.cmdparse import Script, ScriptEmptyError
|
|
|
|
|
|
@pytest.mark.run
|
|
@pytest.mark.script
|
|
def test_parse():
|
|
script = Script.parse(['python', '-c', "print('hello')"])
|
|
assert script.command == 'python'
|
|
assert script.args == ['-c', "print('hello')"], script
|
|
|
|
|
|
@pytest.mark.run
|
|
@pytest.mark.script
|
|
def test_parse_error():
|
|
with pytest.raises(ScriptEmptyError) as e:
|
|
Script.parse('')
|
|
assert str(e.value) == "[]"
|
|
|
|
|
|
@pytest.mark.run
|
|
def test_extend():
|
|
script = Script('python', ['-c', "print('hello')"])
|
|
script.extend(['--verbose'])
|
|
assert script.command == 'python'
|
|
assert script.args == ['-c', "print('hello')", "--verbose"], script
|
|
|
|
|
|
@pytest.mark.run
|
|
@pytest.mark.script
|
|
def test_cmdify():
|
|
script = Script('python', ['-c', "print('hello world')"])
|
|
cmd = script.cmdify()
|
|
assert cmd == 'python -c "print(\'hello world\')"', script
|
|
|
|
|
|
@pytest.mark.run
|
|
@pytest.mark.script
|
|
def test_cmdify_complex():
|
|
script = Script.parse(' '.join([
|
|
'"C:\\Program Files\\Python36\\python.exe" -c',
|
|
""" "print(\'Double quote: \\\"\')" """.strip(),
|
|
]))
|
|
assert script.cmdify() == ' '.join([
|
|
'"C:\\Program Files\\Python36\\python.exe"',
|
|
'-c',
|
|
""" "print(\'Double quote: \\\"\')" """.strip(),
|
|
]), script
|
|
|
|
|
|
@pytest.mark.run
|
|
@pytest.mark.script
|
|
def test_cmdify_quote_if_paren_in_command():
|
|
"""Ensure ONLY the command is quoted if it contains parentheses.
|
|
"""
|
|
script = Script.parse(' '.join([
|
|
'"C:\\Python36(x86)\\python.exe"',
|
|
'-c',
|
|
"print(123)",
|
|
]))
|
|
assert script.cmdify() == ' '.join([
|
|
'"C:\\Python36(x86)\\python.exe"',
|
|
'-c',
|
|
"print(123)",
|
|
]), script
|
|
|
|
|
|
@pytest.mark.run
|
|
@pytest.mark.script
|
|
def test_cmdify_quote_if_carets():
|
|
"""Ensure arguments are quoted if they contain carets.
|
|
"""
|
|
script = Script('foo^bar', ['baz^rex'])
|
|
assert script.cmdify() == '"foo^bar" "baz^rex"', script
|