2015-11-16 14:04:32 -08:00
|
|
|
# -*- coding: utf-8 -*-
|
2015-03-22 02:46:33 +01:00
|
|
|
"""Testing built_ins.Aliases"""
|
|
|
|
from __future__ import unicode_literals, print_function
|
2015-03-25 18:32:10 -05:00
|
|
|
|
2015-12-19 17:29:48 -05:00
|
|
|
import os
|
2016-05-17 11:25:46 +02:00
|
|
|
|
2016-06-22 22:45:42 +03:00
|
|
|
import pytest
|
2021-04-15 16:39:13 +03:00
|
|
|
import inspect
|
2015-03-25 18:32:10 -05:00
|
|
|
|
2019-08-16 15:17:31 -04:00
|
|
|
from xonsh.aliases import Aliases, ExecAlias
|
2015-12-19 17:29:48 -05:00
|
|
|
from xonsh.environ import Env
|
2015-03-22 02:46:33 +01:00
|
|
|
|
2016-06-25 01:15:48 +03:00
|
|
|
from tools import skip_if_on_windows
|
2015-12-19 18:09:06 -05:00
|
|
|
|
2015-03-22 02:46:33 +01:00
|
|
|
|
2019-01-28 17:17:55 -05:00
|
|
|
def cd(args, stdin=None, **kwargs):
|
2015-03-22 02:46:33 +01:00
|
|
|
return args
|
|
|
|
|
2018-08-30 09:18:49 -05:00
|
|
|
|
2018-11-19 19:51:15 -05:00
|
|
|
def make_aliases():
|
|
|
|
ales = Aliases(
|
|
|
|
{"o": ["omg", "lala"]},
|
|
|
|
color_ls=["ls", "--color=true"],
|
|
|
|
ls="ls '- -'",
|
|
|
|
cd=cd,
|
|
|
|
indirect_cd="cd ..",
|
|
|
|
)
|
|
|
|
return ales
|
2015-03-22 02:46:33 +01:00
|
|
|
|
2016-06-25 01:15:48 +03:00
|
|
|
|
2018-11-19 20:01:20 -05:00
|
|
|
def test_imports(xonsh_execer, xonsh_builtins):
|
2018-11-19 19:51:15 -05:00
|
|
|
ales = make_aliases()
|
2016-06-22 22:45:42 +03:00
|
|
|
expected = {
|
2018-08-30 09:18:49 -05:00
|
|
|
"o": ["omg", "lala"],
|
|
|
|
"ls": ["ls", "- -"],
|
|
|
|
"color_ls": ["ls", "--color=true"],
|
|
|
|
"cd": cd,
|
|
|
|
"indirect_cd": ["cd", ".."],
|
2016-06-22 22:45:42 +03:00
|
|
|
}
|
2018-11-19 19:51:15 -05:00
|
|
|
raw = ales._raw
|
|
|
|
assert raw == expected
|
2015-03-22 02:46:33 +01:00
|
|
|
|
2015-07-29 23:58:25 +02:00
|
|
|
|
2018-11-19 20:01:20 -05:00
|
|
|
def test_eval_normal(xonsh_execer, xonsh_builtins):
|
2018-11-19 19:51:15 -05:00
|
|
|
ales = make_aliases()
|
|
|
|
assert ales.get("o") == ["omg", "lala"]
|
2016-06-25 01:15:48 +03:00
|
|
|
|
|
|
|
|
2018-11-19 20:01:20 -05:00
|
|
|
def test_eval_self_reference(xonsh_execer, xonsh_builtins):
|
2018-11-19 19:51:15 -05:00
|
|
|
ales = make_aliases()
|
|
|
|
assert ales.get("ls") == ["ls", "- -"]
|
2016-06-25 01:15:48 +03:00
|
|
|
|
|
|
|
|
2018-11-19 20:01:20 -05:00
|
|
|
def test_eval_recursive(xonsh_execer, xonsh_builtins):
|
2018-11-19 19:51:15 -05:00
|
|
|
ales = make_aliases()
|
|
|
|
assert ales.get("color_ls") == ["ls", "- -", "--color=true"]
|
2016-06-25 01:15:48 +03:00
|
|
|
|
2015-07-29 23:58:25 +02:00
|
|
|
|
2016-06-25 01:15:48 +03:00
|
|
|
@skip_if_on_windows
|
2018-11-19 20:01:20 -05:00
|
|
|
def test_eval_recursive_callable_partial(xonsh_execer, xonsh_builtins):
|
2018-11-19 19:51:15 -05:00
|
|
|
ales = make_aliases()
|
2018-09-13 14:03:35 -04:00
|
|
|
xonsh_builtins.__xonsh__.env = Env(HOME=os.path.expanduser("~"))
|
2018-11-19 19:51:15 -05:00
|
|
|
assert ales.get("indirect_cd")(["arg2", "arg3"]) == ["..", "arg2", "arg3"]
|
2019-01-28 17:17:55 -05:00
|
|
|
|
|
|
|
|
2019-02-04 16:15:29 -05:00
|
|
|
def _return_to_sender_all(args, stdin, stdout, stderr, spec, stack):
|
2019-02-04 16:17:02 -05:00
|
|
|
return (
|
|
|
|
args,
|
|
|
|
{
|
|
|
|
"stdin": stdin,
|
|
|
|
"stdout": stdout,
|
|
|
|
"stderr": stderr,
|
|
|
|
"spec": spec,
|
|
|
|
"stack": stack,
|
|
|
|
},
|
|
|
|
)
|
2019-01-28 17:17:55 -05:00
|
|
|
|
|
|
|
|
2019-02-04 16:15:29 -05:00
|
|
|
def test_recursive_callable_partial_all(xonsh_execer, xonsh_builtins):
|
|
|
|
ales = Aliases({"rtn": _return_to_sender_all, "rtn-recurse": ["rtn", "arg1"]})
|
2019-01-28 17:17:55 -05:00
|
|
|
alias = ales.get("rtn-recurse")
|
|
|
|
assert callable(alias)
|
|
|
|
args, obs = alias(["arg2"], stdin="a", stdout="b", stderr="c", spec="d", stack="e")
|
|
|
|
assert args == ["arg1", "arg2"]
|
|
|
|
assert len(obs) == 5
|
|
|
|
exp = {"stdin": "a", "stdout": "b", "stderr": "c", "spec": "d", "stack": "e"}
|
|
|
|
assert obs == exp
|
2019-02-04 16:15:29 -05:00
|
|
|
|
|
|
|
|
|
|
|
def _return_to_sender_handles(args, stdin, stdout, stderr):
|
|
|
|
return args, {"stdin": stdin, "stdout": stdout, "stderr": stderr}
|
|
|
|
|
|
|
|
|
|
|
|
def test_recursive_callable_partial_handles(xonsh_execer, xonsh_builtins):
|
|
|
|
ales = Aliases({"rtn": _return_to_sender_handles, "rtn-recurse": ["rtn", "arg1"]})
|
|
|
|
alias = ales.get("rtn-recurse")
|
|
|
|
assert callable(alias)
|
|
|
|
args, obs = alias(["arg2"], stdin="a", stdout="b", stderr="c")
|
|
|
|
assert args == ["arg1", "arg2"]
|
|
|
|
assert len(obs) == 3
|
|
|
|
exp = {"stdin": "a", "stdout": "b", "stderr": "c"}
|
|
|
|
assert obs == exp
|
|
|
|
|
|
|
|
|
|
|
|
def _return_to_sender_none():
|
|
|
|
return "wakka", {}
|
|
|
|
|
|
|
|
|
|
|
|
def test_recursive_callable_partial_none(xonsh_execer, xonsh_builtins):
|
|
|
|
ales = Aliases({"rtn": _return_to_sender_none, "rtn-recurse": ["rtn"]})
|
|
|
|
alias = ales.get("rtn-recurse")
|
|
|
|
assert callable(alias)
|
|
|
|
args, obs = alias()
|
|
|
|
assert args == "wakka"
|
|
|
|
assert len(obs) == 0
|
2019-08-16 15:17:31 -04:00
|
|
|
|
2020-02-14 09:09:34 -05:00
|
|
|
|
2019-08-16 15:17:31 -04:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"alias",
|
|
|
|
[
|
|
|
|
"echo 'hi' and echo 'there'",
|
|
|
|
"echo 'hi' or echo 'there'",
|
|
|
|
"echo 'hi' && echo 'there'",
|
|
|
|
"echo 'hi' || echo 'there'",
|
|
|
|
"echo 'hi'; echo 'there'",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_subprocess_logical_operators(xonsh_execer, xonsh_builtins, alias):
|
|
|
|
ales = make_aliases()
|
|
|
|
ales["echocat"] = alias
|
|
|
|
assert isinstance(ales["echocat"], ExecAlias)
|
2020-08-11 17:30:08 +03:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"alias",
|
|
|
|
[
|
|
|
|
"echo 'hi' | grep h",
|
|
|
|
"echo 'hi' > file",
|
|
|
|
"cat < file",
|
|
|
|
"COMMAND1 e>o < input.txt | COMMAND2 > output.txt e>> errors.txt",
|
|
|
|
"echo 'h|i' | grep h",
|
|
|
|
"echo 'h|i << x > 3' | grep x",
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_subprocess_io_operators(xonsh_execer, xonsh_builtins, alias):
|
|
|
|
ales = make_aliases()
|
|
|
|
ales["echocat"] = alias
|
|
|
|
assert isinstance(ales["echocat"], ExecAlias)
|
2021-01-04 19:44:21 +02:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"alias",
|
|
|
|
[
|
|
|
|
{'echocat': 'ls'},
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_dict_merging(xonsh_execer, xonsh_builtins, alias):
|
|
|
|
ales = make_aliases()
|
|
|
|
assert (ales | alias)['echocat'] == ['ls']
|
|
|
|
assert (alias | ales)['echocat'] == ['ls']
|
|
|
|
assert 'echocat' not in ales
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"alias",
|
|
|
|
[
|
|
|
|
{'echocat': 'echo Why do people still use python2.7?'},
|
|
|
|
{'echocat': 'echo Why?'},
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_dict_merging_assignment(xonsh_execer, xonsh_builtins, alias):
|
|
|
|
ales = make_aliases()
|
|
|
|
ales |= alias
|
|
|
|
|
|
|
|
assert 'echocat' in ales
|
|
|
|
assert ' '.join(ales['echocat']) == alias['echocat']
|
|
|
|
|
|
|
|
ales = make_aliases()
|
|
|
|
alias |= ales
|
|
|
|
|
|
|
|
assert 'o' in alias
|
|
|
|
assert alias['o'] == ales['o']
|
2021-04-15 16:39:13 +03:00
|
|
|
|
|
|
|
|
|
|
|
def test_exec_alias_args(xonsh_execer, xonsh_builtins):
|
|
|
|
stack = inspect.stack()
|
|
|
|
try:
|
|
|
|
ExecAlias('myargs = $args')(['arg0'], stack=stack)
|
|
|
|
ExecAlias('myarg0 = $arg0')(['arg0'], stack=stack)
|
|
|
|
except KeyError:
|
|
|
|
assert False
|
|
|
|
|
|
|
|
assert stack[0][0].f_locals['myargs'] == ['arg0']
|
|
|
|
assert stack[0][0].f_locals['myarg0'] == 'arg0'
|