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
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], )
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])
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])