예제 #1
0
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"
예제 #2
0
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"
예제 #3
0
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"
예제 #4
0
      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",
예제 #5
0
                                                       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", (
예제 #6
0
    ('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
예제 #7
0
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}")]),
예제 #8
0
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
예제 #9
0
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", ""),
예제 #10
0
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"),
),