Exemplo n.º 1
0
def eval(*args, **kwargs):
    """
    Usage $eval(<expression>)
    Returns evaluation of a simple Python expression. The string may *only* consist of the following
        Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
        and None. The strings can also contain #dbrefs. Escape embedded protfuncs as $$protfunc(..)
        - those will then be evaluated *after* $eval.

    """
    global _PROTLIB
    if not _PROTLIB:
        from evennia.prototypes import prototypes as _PROTLIB

    string = ",".join(args)
    struct = literal_eval(string)

    if isinstance(struct, basestring):
        # we must shield the string, otherwise it will be merged as a string and future
        # literal_evas will pick up e.g. '2' as something that should be converted to a number
        struct = '"{}"'.format(struct)

    # convert any #dbrefs to objects (also in nested structures)
    struct = _PROTLIB.value_to_obj_or_any(struct)

    return struct
Exemplo n.º 2
0
def eval(*args, **kwargs):
    """
    Usage $eval(<expression>)
    Returns evaluation of a simple Python expression. The string may *only* consist of the following
        Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
        and None. The strings can also contain #dbrefs. Escape embedded protfuncs as $$protfunc(..)
        - those will then be evaluated *after* $eval.

    """
    global _PROTLIB
    if not _PROTLIB:
        from evennia.prototypes import prototypes as _PROTLIB

    string = ",".join(args)
    struct = literal_eval(string)

    if isinstance(struct, basestring):
        # we must shield the string, otherwise it will be merged as a string and future
        # literal_evas will pick up e.g. '2' as something that should be converted to a number
        struct = '"{}"'.format(struct)

    # convert any #dbrefs to objects (also in nested structures)
    struct = _PROTLIB.value_to_obj_or_any(struct)

    return struct
Exemplo n.º 3
0
    def test_protfuncs(self):
        self.assertEqual(protlib.protfunc_parser("$random()"), 0.5)
        self.assertEqual(protlib.protfunc_parser("$randint(1, 10)"), 5)
        self.assertEqual(protlib.protfunc_parser("$left_justify(  foo  )"),
                         "foo                 ")
        self.assertEqual(protlib.protfunc_parser("$right_justify( foo  )"),
                         "                 foo")
        self.assertEqual(protlib.protfunc_parser("$center_justify(foo  )"),
                         "        foo         ")
        self.assertEqual(
            protlib.protfunc_parser("$full_justify(foo bar moo too)"),
            "foo   bar   moo  too")
        self.assertEqual(
            protlib.protfunc_parser("$right_justify( foo  )", testing=True),
            ("unexpected indent (<unknown>, line 1)", "                 foo"),
        )

        test_prot = {"key1": "value1", "key2": 2}

        self.assertEqual(
            protlib.protfunc_parser("$protkey(key1)",
                                    testing=True,
                                    prototype=test_prot),
            (None, "value1"),
        )
        self.assertEqual(
            protlib.protfunc_parser("$protkey(key2)",
                                    testing=True,
                                    prototype=test_prot), (None, 2))

        self.assertEqual(protlib.protfunc_parser("$add(1, 2)"), 3)
        self.assertEqual(protlib.protfunc_parser("$add(10, 25)"), 35)
        self.assertEqual(
            protlib.protfunc_parser("$add('''[1,2,3]''', '''[4,5,6]''')"),
            [1, 2, 3, 4, 5, 6])
        self.assertEqual(protlib.protfunc_parser("$add(foo, bar)"), "foo bar")

        self.assertEqual(protlib.protfunc_parser("$sub(5, 2)"), 3)
        self.assertRaises(TypeError, protlib.protfunc_parser, "$sub(5, test)")

        self.assertEqual(protlib.protfunc_parser("$mult(5, 2)"), 10)
        self.assertEqual(protlib.protfunc_parser("$mult(  5 ,   10)"), 50)
        self.assertEqual(protlib.protfunc_parser("$mult('foo',3)"),
                         "foofoofoo")
        self.assertEqual(protlib.protfunc_parser("$mult(foo,3)"), "foofoofoo")
        self.assertRaises(TypeError, protlib.protfunc_parser,
                          "$mult(foo, foo)")

        self.assertEqual(protlib.protfunc_parser("$toint(5.3)"), 5)

        self.assertEqual(protlib.protfunc_parser("$div(5, 2)"), 2.5)
        self.assertEqual(protlib.protfunc_parser("$toint($div(5, 2))"), 2)
        self.assertEqual(
            protlib.protfunc_parser("$sub($add(5, 3), $add(10, 2))"), -4)

        self.assertEqual(protlib.protfunc_parser("$eval('2')"), "2")

        self.assertEqual(
            protlib.protfunc_parser("$eval(['test', 1, '2', 3.5, \"foo\"])"),
            ["test", 1, "2", 3.5, "foo"],
        )
        self.assertEqual(
            protlib.protfunc_parser(
                "$eval({'test': '1', 2:3, 3: $toint(3.5)})"),
            {
                "test": "1",
                2: 3,
                3: 3
            },
        )

        # no object search
        odbref = self.obj1.dbref

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("obj({})".format(odbref),
                                        session=self.session),
                "obj({})".format(odbref),
            )
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("dbref({})".format(odbref),
                                        session=self.session),
                "dbref({})".format(odbref),
            )
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("stone(#12345)", session=self.session),
                "stone(#12345)")
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser(odbref, session=self.session), odbref)
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("#12345", session=self.session),
                "#12345")
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("nothing({})".format(odbref),
                                        session=self.session),
                "nothing({})".format(odbref),
            )
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("(#12345)", session=self.session),
                "(#12345)")
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("obj(Char)", session=self.session),
                "obj(Char)")
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("objlist({})".format(odbref),
                                        session=self.session),
                "objlist({})".format(odbref),
            )
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("dbref(Char)", session=self.session),
                "dbref(Char)")
            mocked__obj_search.assert_not_called()

        # obj search happens

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$objlist({})".format(odbref),
                                        session=self.session),
                [odbref],
            )
            mocked__obj_search.assert_called_once()
            assert (odbref, ) == mocked__obj_search.call_args[0]

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$obj({})".format(odbref),
                                        session=self.session), odbref)
            mocked__obj_search.assert_called_once()
            assert (odbref, ) == mocked__obj_search.call_args[0]

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$dbref({})".format(odbref),
                                        session=self.session), odbref)
            mocked__obj_search.assert_called_once()
            assert (odbref, ) == mocked__obj_search.call_args[0]

        cdbref = self.char1.dbref

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$obj(Char)", session=self.session),
                cdbref)
            mocked__obj_search.assert_called_once()
            assert ("Char", ) == mocked__obj_search.call_args[0]

        # bad invocation

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$badfunc(#112345)",
                                        session=self.session), "<UNKNOWN>")
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertRaises(ValueError, protlib.protfunc_parser,
                              "$dbref(Char)")
            mocked__obj_search.assert_not_called()

        self.assertEqual(
            protlib.value_to_obj(
                protlib.protfunc_parser(cdbref, session=self.session)),
            self.char1)
        self.assertEqual(
            protlib.value_to_obj_or_any(
                protlib.protfunc_parser(cdbref, session=self.session)),
            self.char1,
        )
        self.assertEqual(
            protlib.value_to_obj_or_any(
                protlib.protfunc_parser("[1,2,3,'{}',5]".format(cdbref),
                                        session=self.session)),
            [1, 2, 3, self.char1, 5],
        )
Exemplo n.º 4
0
    def test_protfuncs(self):
        self.assertEqual(protlib.protfunc_parser("$random()"), 0.5)
        self.assertEqual(protlib.protfunc_parser("$randint(1, 10)"), 5)
        self.assertEqual(protlib.protfunc_parser("$left_justify(  foo  )"),
                         "foo                 ")
        self.assertEqual(protlib.protfunc_parser("$right_justify( foo  )"),
                         "                 foo")
        self.assertEqual(protlib.protfunc_parser("$center_justify(foo  )"),
                         "        foo         ")
        self.assertEqual(
            protlib.protfunc_parser("$full_justify(foo bar moo too)"),
            'foo   bar   moo  too')
        self.assertEqual(
            protlib.protfunc_parser("$right_justify( foo  )", testing=True),
            ('unexpected indent (<unknown>, line 1)', '                 foo'))

        test_prot = {"key1": "value1", "key2": 2}

        self.assertEqual(
            protlib.protfunc_parser("$protkey(key1)",
                                    testing=True,
                                    prototype=test_prot), (None, "value1"))
        self.assertEqual(
            protlib.protfunc_parser("$protkey(key2)",
                                    testing=True,
                                    prototype=test_prot), (None, 2))

        self.assertEqual(protlib.protfunc_parser("$add(1, 2)"), 3)
        self.assertEqual(protlib.protfunc_parser("$add(10, 25)"), 35)
        self.assertEqual(
            protlib.protfunc_parser("$add('''[1,2,3]''', '''[4,5,6]''')"),
            [1, 2, 3, 4, 5, 6])
        self.assertEqual(protlib.protfunc_parser("$add(foo, bar)"), "foo bar")

        self.assertEqual(protlib.protfunc_parser("$sub(5, 2)"), 3)
        self.assertRaises(TypeError, protlib.protfunc_parser, "$sub(5, test)")

        self.assertEqual(protlib.protfunc_parser("$mult(5, 2)"), 10)
        self.assertEqual(protlib.protfunc_parser("$mult(  5 ,   10)"), 50)
        self.assertEqual(protlib.protfunc_parser("$mult('foo',3)"),
                         "foofoofoo")
        self.assertEqual(protlib.protfunc_parser("$mult(foo,3)"), "foofoofoo")
        self.assertRaises(TypeError, protlib.protfunc_parser,
                          "$mult(foo, foo)")

        self.assertEqual(protlib.protfunc_parser("$toint(5.3)"), 5)

        self.assertEqual(protlib.protfunc_parser("$div(5, 2)"), 2.5)
        self.assertEqual(protlib.protfunc_parser("$toint($div(5, 2))"), 2)
        self.assertEqual(
            protlib.protfunc_parser("$sub($add(5, 3), $add(10, 2))"), -4)

        self.assertEqual(protlib.protfunc_parser("$eval('2')"), '2')

        self.assertEqual(
            protlib.protfunc_parser("$eval(['test', 1, '2', 3.5, \"foo\"])"),
            ['test', 1, '2', 3.5, 'foo'])
        self.assertEqual(
            protlib.protfunc_parser(
                "$eval({'test': '1', 2:3, 3: $toint(3.5)})"), {
                    'test': '1',
                    2: 3,
                    3: 3
                })

        self.assertEqual(
            protlib.protfunc_parser("$obj(#1)", session=self.session), '#1')
        self.assertEqual(protlib.protfunc_parser("#1", session=self.session),
                         '#1')
        self.assertEqual(
            protlib.protfunc_parser("$obj(Char)", session=self.session), '#6')
        self.assertEqual(
            protlib.protfunc_parser("$obj(Char)", session=self.session), '#6')
        self.assertEqual(
            protlib.protfunc_parser("$objlist(#1)", session=self.session),
            ['#1'])

        self.assertEqual(
            protlib.value_to_obj(
                protlib.protfunc_parser("#6", session=self.session)),
            self.char1)
        self.assertEqual(
            protlib.value_to_obj_or_any(
                protlib.protfunc_parser("#6", session=self.session)),
            self.char1)
        self.assertEqual(
            protlib.value_to_obj_or_any(
                protlib.protfunc_parser("[1,2,3,'#6',5]",
                                        session=self.session)),
            [1, 2, 3, self.char1, 5])
Exemplo n.º 5
0
    def test_protfuncs(self):
        self.assertEqual(protlib.protfunc_parser("$random()"), 0.5)
        self.assertEqual(protlib.protfunc_parser("$randint(1, 10)"), 5)
        self.assertEqual(protlib.protfunc_parser("$left_justify(  foo  )"),
                         "foo                 ")
        self.assertEqual(protlib.protfunc_parser("$right_justify( foo  )"),
                         "                 foo")
        self.assertEqual(protlib.protfunc_parser("$center_justify(foo  )"),
                         "        foo         ")
        self.assertEqual(
            protlib.protfunc_parser("$full_justify(foo bar moo too)"),
            'foo   bar   moo  too')
        self.assertEqual(
            protlib.protfunc_parser("$right_justify( foo  )", testing=True),
            ('unexpected indent (<unknown>, line 1)', '                 foo'))

        test_prot = {"key1": "value1", "key2": 2}

        self.assertEqual(
            protlib.protfunc_parser("$protkey(key1)",
                                    testing=True,
                                    prototype=test_prot), (None, "value1"))
        self.assertEqual(
            protlib.protfunc_parser("$protkey(key2)",
                                    testing=True,
                                    prototype=test_prot), (None, 2))

        self.assertEqual(protlib.protfunc_parser("$add(1, 2)"), 3)
        self.assertEqual(protlib.protfunc_parser("$add(10, 25)"), 35)
        self.assertEqual(
            protlib.protfunc_parser("$add('''[1,2,3]''', '''[4,5,6]''')"),
            [1, 2, 3, 4, 5, 6])
        self.assertEqual(protlib.protfunc_parser("$add(foo, bar)"), "foo bar")

        self.assertEqual(protlib.protfunc_parser("$sub(5, 2)"), 3)
        self.assertRaises(TypeError, protlib.protfunc_parser, "$sub(5, test)")

        self.assertEqual(protlib.protfunc_parser("$mult(5, 2)"), 10)
        self.assertEqual(protlib.protfunc_parser("$mult(  5 ,   10)"), 50)
        self.assertEqual(protlib.protfunc_parser("$mult('foo',3)"),
                         "foofoofoo")
        self.assertEqual(protlib.protfunc_parser("$mult(foo,3)"), "foofoofoo")
        self.assertRaises(TypeError, protlib.protfunc_parser,
                          "$mult(foo, foo)")

        self.assertEqual(protlib.protfunc_parser("$toint(5.3)"), 5)

        self.assertEqual(protlib.protfunc_parser("$div(5, 2)"), 2.5)
        self.assertEqual(protlib.protfunc_parser("$toint($div(5, 2))"), 2)
        self.assertEqual(
            protlib.protfunc_parser("$sub($add(5, 3), $add(10, 2))"), -4)

        self.assertEqual(protlib.protfunc_parser("$eval('2')"), '2')

        self.assertEqual(
            protlib.protfunc_parser("$eval(['test', 1, '2', 3.5, \"foo\"])"),
            ['test', 1, '2', 3.5, 'foo'])
        self.assertEqual(
            protlib.protfunc_parser(
                "$eval({'test': '1', 2:3, 3: $toint(3.5)})"), {
                    'test': '1',
                    2: 3,
                    3: 3
                })

        # no object search

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("obj(#1)", session=self.session),
                'obj(#1)')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("dbref(#1)", session=self.session),
                'dbref(#1)')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("stone(#12345)", session=self.session),
                'stone(#12345)')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("#1", session=self.session), '#1')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("#12345", session=self.session),
                '#12345')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("nothing(#1)", session=self.session),
                'nothing(#1)')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("(#12345)", session=self.session),
                '(#12345)')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("obj(Char)", session=self.session),
                'obj(Char)')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("objlist(#1)", session=self.session),
                'objlist(#1)')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("dbref(Char)", session=self.session),
                'dbref(Char)')
            mocked__obj_search.assert_not_called()

        # obj search happens

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$objlist(#1)", session=self.session),
                ['#1'])
            mocked__obj_search.assert_called_once()
            assert ('#1', ) == mocked__obj_search.call_args[0]

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$obj(#1)", session=self.session),
                '#1')
            mocked__obj_search.assert_called_once()
            assert ('#1', ) == mocked__obj_search.call_args[0]

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$dbref(#1)", session=self.session),
                '#1')
            mocked__obj_search.assert_called_once()
            assert ('#1', ) == mocked__obj_search.call_args[0]

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$obj(Char)", session=self.session),
                '#6')
            mocked__obj_search.assert_called_once()
            assert ('Char', ) == mocked__obj_search.call_args[0]

        # bad invocation

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertEqual(
                protlib.protfunc_parser("$badfunc(#1)", session=self.session),
                '<UNKNOWN>')
            mocked__obj_search.assert_not_called()

        with mock.patch("evennia.prototypes.protfuncs._obj_search",
                        wraps=protofuncs._obj_search) as mocked__obj_search:
            self.assertRaises(ValueError, protlib.protfunc_parser,
                              "$dbref(Char)")
            mocked__obj_search.assert_not_called()

        self.assertEqual(
            protlib.value_to_obj(
                protlib.protfunc_parser("#6", session=self.session)),
            self.char1)
        self.assertEqual(
            protlib.value_to_obj_or_any(
                protlib.protfunc_parser("#6", session=self.session)),
            self.char1)
        self.assertEqual(
            protlib.value_to_obj_or_any(
                protlib.protfunc_parser("[1,2,3,'#6',5]",
                                        session=self.session)),
            [1, 2, 3, self.char1, 5])