GLOBAL_SCRIPTS.all() failed. Resolve #3788

This commit is contained in:
Griatch 2025-04-26 15:33:30 +02:00
parent 0779ec82b6
commit 27931248ec
4 changed files with 34 additions and 11 deletions

View file

@ -49,6 +49,7 @@ This upgrade requires running `evennia migrate` on your existing database
- [Fix][pull3751]: The `access` and `inventory` commands would traceback if run on a character without an Account (EliasWatson) - [Fix][pull3751]: The `access` and `inventory` commands would traceback if run on a character without an Account (EliasWatson)
- [Fix][pull3768]: Make sure the `CmdCopy` command copies object categories, - [Fix][pull3768]: Make sure the `CmdCopy` command copies object categories,
since otherwise plurals were lost (jaborsh) since otherwise plurals were lost (jaborsh)
- [Fix][issue3788]: `GLOBAL_SCRIPTS.all()` raised error (Griatch)
- Fix: `options` setting `NOPROMPTGOAHEAD` was not possible to set (Griatch) - Fix: `options` setting `NOPROMPTGOAHEAD` was not possible to set (Griatch)
- Fix: Make `\\` properly preserve one backlash in funcparser (Griatch) - Fix: Make `\\` properly preserve one backlash in funcparser (Griatch)
- Fix: The testing 'echo' inputfunc didn't work correctly; now returns both args/kwargs (Griatch) - Fix: The testing 'echo' inputfunc didn't work correctly; now returns both args/kwargs (Griatch)
@ -88,6 +89,7 @@ This upgrade requires running `evennia migrate` on your existing database
[pull3783]: https://github.com/evennia/evennia/pull/3783 [pull3783]: https://github.com/evennia/evennia/pull/3783
[issue3688]: https://github.com/evennia/evennia/issues/3688 [issue3688]: https://github.com/evennia/evennia/issues/3688
[issue3687]: https://github.com/evennia/evennia/issues/3687 [issue3687]: https://github.com/evennia/evennia/issues/3687
[issue3788]: https://github.com/evennia/evennia/issues/3788

View file

@ -21,7 +21,6 @@ therefore always be limited to superusers only.
import re import re
from django.conf import settings from django.conf import settings
from evennia.commands.cmdset import CmdSet from evennia.commands.cmdset import CmdSet
from evennia.utils import logger, utils from evennia.utils import logger, utils
from evennia.utils.batchprocessors import BATCHCMD, BATCHCODE from evennia.utils.batchprocessors import BATCHCMD, BATCHCODE
@ -412,7 +411,7 @@ class CmdStateLL(_COMMAND_DEFAULT_CLASS):
key = "ll" key = "ll"
help_category = "BatchProcess" help_category = "BatchProcess"
locks = "cmd:perm(batchcommands)" locks = "cmd:perm(batchcommands) or perm(Developer)"
def func(self): def func(self):
show_curr(self.caller, showall=True) show_curr(self.caller, showall=True)

View file

@ -14,7 +14,6 @@ from pickle import dumps
from django.conf import settings from django.conf import settings
from django.db.utils import OperationalError, ProgrammingError from django.db.utils import OperationalError, ProgrammingError
from evennia.scripts.models import ScriptDB from evennia.scripts.models import ScriptDB
from evennia.utils import logger from evennia.utils import logger
from evennia.utils.utils import callables_from_module, class_from_module from evennia.utils.utils import callables_from_module, class_from_module
@ -250,7 +249,7 @@ class GlobalScriptContainer(Container):
""" """
if not self.loaded: if not self.loaded:
self.load_data() self.load_data()
managed_scripts = list(self.loaded_data.values()) managed_scripts = [self._load_script(key) for key in self.typeclass_storage.keys()]
unmanaged_scripts = list( unmanaged_scripts = list(
ScriptDB.objects.filter(db_obj__isnull=True).exclude( ScriptDB.objects.filter(db_obj__isnull=True).exclude(
id__in=[scr.id for scr in managed_scripts] id__in=[scr.id for scr in managed_scripts]

View file

@ -2,7 +2,6 @@ import unittest
from django.conf import settings from django.conf import settings
from django.test import override_settings from django.test import override_settings
from evennia import DefaultScript from evennia import DefaultScript
from evennia.utils import containers from evennia.utils import containers
from evennia.utils.utils import class_from_module from evennia.utils.utils import class_from_module
@ -10,15 +9,16 @@ from evennia.utils.utils import class_from_module
_BASE_TYPECLASS = class_from_module(settings.BASE_SCRIPT_TYPECLASS) _BASE_TYPECLASS = class_from_module(settings.BASE_SCRIPT_TYPECLASS)
class GoodScript(DefaultScript): class UnittestGoodScript(DefaultScript):
pass pass
class InvalidScript: class UnittestInvalidScript:
pass pass
class TestGlobalScriptContainer(unittest.TestCase): class TestGlobalScriptContainer(unittest.TestCase):
def test_init_with_no_scripts(self): def test_init_with_no_scripts(self):
gsc = containers.GlobalScriptContainer() gsc = containers.GlobalScriptContainer()
@ -60,7 +60,7 @@ class TestGlobalScriptContainer(unittest.TestCase):
@override_settings( @override_settings(
GLOBAL_SCRIPTS={ GLOBAL_SCRIPTS={
"script_name": {"typeclass": "evennia.utils.tests.test_containers.GoodScript"} "script_name": {"typeclass": "evennia.utils.tests.test_containers.UnittestGoodScript"}
} }
) )
def test_start_with_valid_script(self): def test_start_with_valid_script(self):
@ -70,11 +70,13 @@ class TestGlobalScriptContainer(unittest.TestCase):
self.assertEqual(len(gsc.typeclass_storage), 1) self.assertEqual(len(gsc.typeclass_storage), 1)
self.assertIn("script_name", gsc.typeclass_storage) self.assertIn("script_name", gsc.typeclass_storage)
self.assertEqual(gsc.typeclass_storage["script_name"], GoodScript) self.assertEqual(gsc.typeclass_storage["script_name"], UnittestGoodScript)
@override_settings( @override_settings(
GLOBAL_SCRIPTS={ GLOBAL_SCRIPTS={
"script_name": {"typeclass": "evennia.utils.tests.test_containers.InvalidScript"} "script_name": {
"typeclass": "evennia.utils.tests.test_containers.UnittestInvalidScript"
}
} }
) )
def test_start_with_invalid_script(self): def test_start_with_invalid_script(self):
@ -85,7 +87,7 @@ class TestGlobalScriptContainer(unittest.TestCase):
gsc.start() gsc.start()
# check for general attribute failure on the invalid class to preserve against future code-rder changes # check for general attribute failure on the invalid class to preserve against future code-rder changes
self.assertTrue( self.assertTrue(
str(err.exception).startswith("type object 'InvalidScript' has no attribute"), str(err.exception).startswith("type object 'UnittestInvalidScript' has no attribute"),
err.exception, err.exception,
) )
@ -105,3 +107,24 @@ class TestGlobalScriptContainer(unittest.TestCase):
str(err.exception).startswith("cannot import name 'nonexistent_module' from 'evennia'"), str(err.exception).startswith("cannot import name 'nonexistent_module' from 'evennia'"),
err.exception, err.exception,
) )
@override_settings(
GLOBAL_SCRIPTS={
"script_name": {"typeclass": "evennia.utils.tests.test_containers.UnittestGoodScript"}
}
)
def test_using_global_script__all(self):
"""
Using the GlobalScriptContainer.all() to get all scripts
Tests https://github.com/evennia/evennia/issues/3788
"""
from evennia.scripts.models import ScriptDB
ScriptDB.objects.all().delete() # clean up any old scripts
gsc = containers.GlobalScriptContainer()
script = gsc.get("script_name")
result = gsc.all()
self.assertEqual(result, [script])