def test_locals(): env = make_env() env['x'] = "1" env.functions["f"] = Function( Id("f"), CommandSequence([ Command([ Word([Id("local")]), Word([Id("x"), Token("="), VarRef("1")]) ]), Command([Word([Id("echo")]), Word([VarRef("x")])]), ])) cmd = CommandSequence([ Command([Word([Id("f")]), Word([ConstantString("hello world")])]), ]) assert cmd.evaluate(env) == "hello world" assert env['x'] == "1"
def test_invoke_a_function(): env = make_env() env.functions["f"] = Function( Id("f"), CommandSequence([Command([Word([Id("echo")]), Word([VarRef("1")])])])) cmd = CommandSequence([ Command([Word([Id("f")]), Word([ConstantString("hello world")])]), ]) assert cmd.evaluate(env) == "hello world"
def test_return(): env = make_env() env['x'] = "30" env.functions["f"] = Function( Id("f"), CommandSequence([ Command([Word([Id("return")]), Word([VarRef("x")])]), ])) cmd = CommandSequence([ Command([Word([Id("f")]), Word([ConstantString("hello world")])]), ]) assert cmd.evaluate(env) == "" assert env['?'] == "30"
Word([ConstantString("cat")]), Word([ConstantString("foo")]), Word([ConstantString("bar")]), ])), ("'hello'", Command([Word([ConstantString("hello")])])), ("'hel\nlo'", Command([Word([ConstantString("hel\nlo")])])), ("'hello'' world'", Command([Word([ConstantString("hello"), ConstantString(" world")])])), ("$(cat $foo $bar)", Command([ Word([ CommandSequence([ Command([ Word([ConstantString("cat")]), Word([VarRef(ConstantString("foo"))]), Word([VarRef(ConstantString("bar"))]) ]) ]) ]) ])), ("a=2", Command([]).with_assignment( Assignment("a", Word([ConstantString("2")])))), ("a=1 b=2 echo $a$b", Command([ Word([Id("echo")]), Word([VarRef(ConstantString("a")), VarRef(ConstantString("b"))]) ]).with_assignment(Assignment("a", Word([ConstantString("1")])), Assignment("b", Word([ConstantString("2")])))), ("a=2 echo b=1",
append=True))), (">&- cat", cat().with_redirect(RedirectDup(1, w("-")))), ("<&- cat", cat().with_redirect(RedirectDup(0, w("-")))), (">&2 cat", cat().with_redirect(RedirectDup(1, w("2")))), ("<&6 cat", cat().with_redirect(RedirectDup(0, w("6")))), ("cat <<'EOF'\nhello $world\nEOF\n", cat().with_redirect( RedirectHere( end="EOF", quote="'", content=ConstantString("hello $world\n")))), ("cat <<\"EOF\"\nhello $world\nEOF\n", cat().with_redirect( RedirectHere( end="EOF", quote='"', content=ConstantString("hello $world\n")))), ("cat <<EOF\nhello $world\nEOF\n", cat().with_redirect( RedirectHere(end="EOF", content=Word([ ConstantString("hello "), VarRef(ConstantString("world"), double_quoted=True), ConstantString("\n"), ], double_quoted=True)))), ("cat <<'EOF'\nhello $world\nEOF", cat().with_redirect( RedirectHere( end="EOF", quote="'", content=ConstantString("hello $world\n")))), ), ids=lambda x: x.replace(" ", "_").replace("'", "*") if isinstance(x, str) else None) def test_basic(text, expected): cmd = command_sequence.parse(text) assert cmd == CommandSequence([expected]) @pytest.mark.parametrize("text", (
('hello" world"', CommandSequence([ Command([ Word([ Id('hello'), Word([ConstantString(' world')], double_quoted=True) ], double_quoted=False) ]) ])), ("", CommandSequence([Command([])])), ('""', CommandSequence( [Command([Word([ConstantString('')], double_quoted=True)])])), ('"$a $b"', CommandSequence([ Command([ Word([ VarRef(ConstantString("a"), double_quoted=True), ConstantString(" "), VarRef(ConstantString("b"), double_quoted=True), ], double_quoted=True) ]) ])), ), ids=lambda x: x.replace(" ", "_").replace('"', '%') if isinstance(x, str) else None) def test_dq(text, expected): assert command_sequence.parse(text) == expected
import pytest from psh.parser import command_sequence from psh.model import Word, ConstantString, Command, VarRef, Id, CommandSequence, VarOp cmd = lambda *ws: CommandSequence([Command([*ws])]) cat = Word([Id("cat")]) @pytest.mark.parametrize(("text", "expected"), ( ("cat $a", cmd( cat, Word([VarRef(ConstantString("a"))]), )), ('cat "$a"', cmd( cat, Word([VarRef(ConstantString("a"), double_quoted=True)], double_quoted=True), )), ('cat ${a}', cmd( cat, Word([VarRef(ConstantString("a"))]), )), ("cat '$a'", cmd( cat, Word([ConstantString("$a")]), )), ("cat '${a}'", cmd( cat, Word([ConstantString("${a}")]),
import pytest from psh.parser import command_sequence from psh.model import Word, Id, Token, ConstantString, CommandSequence, Command, For, VarRef, RedirectTo, RedirectFrom w = lambda w: Word([Id(w)]) i = Id("i") cmds = lambda *cs: CommandSequence([Command([c]) for c in cs]) devnull = Word([ConstantString("/dev/null")]) @pytest.mark.parametrize(("text", "expected"), ( ("for i; do done", CommandSequence([ For(i, [VarRef(Token("@"))], CommandSequence([])) ])), ("for i\ndo\ndone", CommandSequence([ For(i, [VarRef(Token("@"))], CommandSequence([])) ])), ("for i in a b c; do foo; done", CommandSequence([ For(i, [w("a"), w("b"), w("c")], cmds(w("foo"))) ])), (">/dev/null for i in a b c\n\ndo\n\nfoo\n\nbar\n\ndone </dev/null", CommandSequence([ For(i, [w("a"), w("b"), w("c")], cmds(w("foo"), w("bar"))) .with_redirect(RedirectTo(1, devnull), RedirectFrom(0, devnull)) ])), ), ids=lambda x: x.replace(" ", "_") if isinstance(x, str) else x) def test_basic(text, expected): cmd = command_sequence.parse(text) assert cmd == expected
import pytest from psh.model import Word, ConstantString, VarRef, Id, VarOp from psh.glob import STAR from psh.local import make_env @pytest.mark.parametrize(("pattern", "value", "expected"), ( (Word([VarRef(ConstantString("a"))]), "xx", "xx"), (Word([VarRef(ConstantString("a"), double_quoted=True)], double_quoted=True), "xx yy", "xx yy"), (Word([VarOp(VarRef(ConstantString("a")), '#', Word([Id("x")]))]), "xx123xx", "x123xx"), (Word([VarOp(VarRef(ConstantString("a")), '#', Word([STAR, Id("x")]))]), "xx123xx", "x123xx"), (Word([VarOp(VarRef(ConstantString("a")), '#', Word([Id("x"), STAR]))]), "xx123xx", "x123xx"), (Word([VarOp(VarRef(ConstantString("a")), '#', Word([STAR, Id("x"), STAR]))]), "xx123xx", "x123xx"), (Word([VarOp(VarRef(ConstantString("a")), '##', Word([Id("x")]))]), "xx123xx", "x123xx"), (Word([VarOp(VarRef(ConstantString("a")), '##', Word([STAR, Id("x")]))]), "xx123xx", ""), (Word([VarOp(VarRef(ConstantString("a")), '##', Word([Id("x"), STAR]))]), "xx123xx", ""), (Word([VarOp(VarRef(ConstantString("a")), '##', Word([STAR, Id("x"), STAR]))]), "xx123xx", ""), (Word([VarOp(VarRef(ConstantString("a")), '%', Word([Id("x")]))]), "xx123xx", "xx123x"), (Word([VarOp(VarRef(ConstantString("a")), '%', Word([STAR, Id("x")]))]), "xx123xx", "xx123x"), (Word([VarOp(VarRef(ConstantString("a")), '%', Word([Id("x"), STAR]))]), "xx123xx", "xx123x"), (Word([VarOp(VarRef(ConstantString("a")), '%', Word([STAR, Id("x"), STAR]))]), "xx123xx", "xx123x"), (Word([VarOp(VarRef(ConstantString("a")), '%%', Word([Id("x")]))]), "xx123xx", "xx123x"), (Word([VarOp(VarRef(ConstantString("a")), '%%', Word([STAR, Id("x")]))]), "xx123xx", ""), (Word([VarOp(VarRef(ConstantString("a")), '%%', Word([Id("x"), STAR]))]), "xx123xx", ""), (Word([VarOp(VarRef(ConstantString("a")), '%%', Word([STAR, Id("x"), STAR]))]), "xx123xx", ""),
import pytest from psh.model import Word, Id, CommandSequence, Command, Case, VarRef, ConstantString from psh.glob import STAR from psh.local import make_env w = lambda w: Word([Id(w)]) a = Word([VarRef(Id("a"))]) echo = lambda out: CommandSequence( [Command([Word([Id("echo")]), Word([ConstantString(out)])])]) x = w("x") cmd = lambda *cs: CommandSequence([Command([*cs])]) star = Word([STAR]) @pytest.mark.parametrize(("cmd", "variable", "expected"), ( (CommandSequence([Case(a)]), "", ""), (CommandSequence([Case(a).with_case(x, echo("foo"))]), "", ""), (CommandSequence([Case(a).with_case(x, echo("foo"))]), "y", ""), (CommandSequence([Case(a).with_case(x, echo("foo"))]), "x", "foo"), (CommandSequence([ Case(a).with_case(x, echo("foo")).with_case(star, echo("bar")) ]), "", "bar"), (CommandSequence([ Case(a).with_case(x, echo("foo")).with_case(star, echo("bar")) ]), "y", "bar"), (CommandSequence([ Case(a).with_case(x, echo("foo")).with_case(star, echo("bar")) ]), "x", "foo"), ),