From 2d74c89eb8e08942e708d0b8aaa49ba2601f8b8f Mon Sep 17 00:00:00 2001 From: Griatch Date: Thu, 13 Oct 2022 18:45:39 +0200 Subject: [PATCH] Fix funcparser issues --- evennia/utils/funcparser.py | 2 +- evennia/utils/tests/test_funcparser.py | 31 +++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/evennia/utils/funcparser.py b/evennia/utils/funcparser.py index 8d64e1798a..b67fa2e530 100644 --- a/evennia/utils/funcparser.py +++ b/evennia/utils/funcparser.py @@ -354,7 +354,7 @@ class FuncParser: if curr_func: # we are starting a nested funcdef - return_str = True + # return_str = True if len(callstack) > _MAX_NESTING: # stack full - ignore this function if raise_errors: diff --git a/evennia/utils/tests/test_funcparser.py b/evennia/utils/tests/test_funcparser.py index dcad686007..53832e2ea2 100644 --- a/evennia/utils/tests/test_funcparser.py +++ b/evennia/utils/tests/test_funcparser.py @@ -5,8 +5,8 @@ Test the funcparser module. """ import time -from ast import literal_eval import unittest +from ast import literal_eval from unittest.mock import MagicMock, patch from django.test import TestCase, override_settings @@ -765,3 +765,32 @@ class TestCallableSearch(test_resources.BaseEvenniaTest): ret = self.parser.parse(string, caller=self.char1, return_list=True, raise_errors=True) self.assertEqual("[]", ret) + + def test_search_nested__issue2902(self): + """ + Search for objects by-tag, check that the result is a valid object + + """ + # we + parser = funcparser.FuncParser( + {**funcparser.SEARCHING_CALLABLES, **funcparser.FUNCPARSER_CALLABLES} + ) + + # set up search targets + self.obj1.tags.add("beach", category="zone") + self.obj2.tags.add("beach", category="zone") + + # first a plain search + string = "$objlist(beach,category=zone,type=tag)" + ret = parser.parse_to_any(string, caller=self.char1, raise_errors=True) + + self.assertEqual(ret, [self.obj1, self.obj2]) + + # get random result from the possible matches + string = "$choice($objlist(beach,category=zone,type=tag))" + from evennia import set_trace + + set_trace() + ret = parser.parse_to_any(string, caller=self.char1, raise_errors=True) + + self.assertIn(ret, [self.obj1, self.obj2])