diff --git a/evennia/contrib/base_systems/custom_gametime/custom_gametime.py b/evennia/contrib/base_systems/custom_gametime/custom_gametime.py index 5611580187..33588deca9 100644 --- a/evennia/contrib/base_systems/custom_gametime/custom_gametime.py +++ b/evennia/contrib/base_systems/custom_gametime/custom_gametime.py @@ -328,4 +328,4 @@ class GametimeScript(DefaultScript): callback() seconds = real_seconds_until(**self.db.gametime) - self.restart(interval=seconds) + self.start(interval=seconds,force_restart=True) diff --git a/evennia/typeclasses/managers.py b/evennia/typeclasses/managers.py index c8ad666e23..e5d1130f12 100644 --- a/evennia/typeclasses/managers.py +++ b/evennia/typeclasses/managers.py @@ -286,7 +286,7 @@ class TypedObjectManager(idmapper.manager.SharedMemoryManager): categories = make_iter(category) if category else [] n_keys = len(keys) n_categories = len(categories) - unique_categories = sorted(set(categories)) + unique_categories = set(categories) n_unique_categories = len(unique_categories) dbmodel = self.model.__dbclass__.__name__.lower() diff --git a/evennia/typeclasses/tests.py b/evennia/typeclasses/tests.py index aea6ce7518..90c4945898 100644 --- a/evennia/typeclasses/tests.py +++ b/evennia/typeclasses/tests.py @@ -142,6 +142,13 @@ class TestTypedObjectManager(BaseEvenniaTest): [self.obj1], ) + def test_get_tag_with_any_including_nones(self): + self.obj1.tags.add("tagA", "categoryA") + self.assertEqual( + self._manager("get_by_tag", ["tagA", "tagB"], ["categoryA", "categoryB", None], match="any"), + [self.obj1], + ) + def test_get_tag_withnomatch(self): self.obj1.tags.add("tagC", "categoryC") self.assertEqual( diff --git a/evennia/utils/containers.py b/evennia/utils/containers.py index 85678ee03e..9a97e03ed0 100644 --- a/evennia/utils/containers.py +++ b/evennia/utils/containers.py @@ -167,7 +167,6 @@ class GlobalScriptContainer(Container): # store a hash representation of the setup script.attributes.add("_global_script_settings", compare_hash, category="settings_hash") - script.start() return script @@ -183,9 +182,12 @@ class GlobalScriptContainer(Container): # populate self.typeclass_storage self.load_data() - # start registered scripts + # make sure settings-defined scripts are loaded for key in self.loaded_data: self._load_script(key) + # start all global scripts + for script in self._get_scripts(): + script.start() def load_data(self): """ diff --git a/evennia/utils/dbserialize.py b/evennia/utils/dbserialize.py index e18eee9d18..a12f986e04 100644 --- a/evennia/utils/dbserialize.py +++ b/evennia/utils/dbserialize.py @@ -239,6 +239,9 @@ class _SaverMutable(object): def __gt__(self, other): return self._data > other + def __or__(self, other): + return self._data | other + @_save def __setitem__(self, key, value): self._data.__setitem__(key, self._convert_mutables(value)) @@ -450,7 +453,9 @@ def deserialize(obj): elif tname in ("_SaverOrderedDict", "OrderedDict"): return OrderedDict([(_iter(key), _iter(val)) for key, val in obj.items()]) elif tname in ("_SaverDefaultDict", "defaultdict"): - return defaultdict(obj.default_factory, {_iter(key): _iter(val) for key, val in obj.items()}) + return defaultdict( + obj.default_factory, {_iter(key): _iter(val) for key, val in obj.items()} + ) elif tname in _DESERIALIZE_MAPPING: return _DESERIALIZE_MAPPING[tname](_iter(val) for val in obj) elif is_iter(obj): @@ -614,7 +619,10 @@ def to_pickle(data): elif dtype in (dict, _SaverDict): return dict((process_item(key), process_item(val)) for key, val in item.items()) elif dtype in (defaultdict, _SaverDefaultDict): - return defaultdict(item.default_factory, ((process_item(key), process_item(val)) for key, val in item.items())) + return defaultdict( + item.default_factory, + ((process_item(key), process_item(val)) for key, val in item.items()), + ) elif dtype in (set, _SaverSet): return set(process_item(val) for val in item) elif dtype in (OrderedDict, _SaverOrderedDict): @@ -693,7 +701,10 @@ def from_pickle(data, db_obj=None): elif dtype == dict: return dict((process_item(key), process_item(val)) for key, val in item.items()) elif dtype == defaultdict: - return defaultdict(item.default_factory, ((process_item(key), process_item(val)) for key, val in item.items())) + return defaultdict( + item.default_factory, + ((process_item(key), process_item(val)) for key, val in item.items()), + ) elif dtype == set: return set(process_item(val) for val in item) elif dtype == OrderedDict: diff --git a/evennia/utils/gametime.py b/evennia/utils/gametime.py index 0e6358285c..ab14c77847 100644 --- a/evennia/utils/gametime.py +++ b/evennia/utils/gametime.py @@ -67,7 +67,7 @@ class TimeScript(DefaultScript): callback(*args, **kwargs) seconds = real_seconds_until(**self.db.gametime) - self.restart(interval=seconds) + self.start(interval=seconds,force_restart=True) # Access functions diff --git a/evennia/utils/tests/test_dbserialize.py b/evennia/utils/tests/test_dbserialize.py index 028d6d1f72..480893c466 100644 --- a/evennia/utils/tests/test_dbserialize.py +++ b/evennia/utils/tests/test_dbserialize.py @@ -62,10 +62,12 @@ class TestDbSerialize(TestCase): self.obj.db.test.sort(key=lambda d: str(d)) self.assertEqual(self.obj.db.test, [{0: 1}, {1: 0}]) - def test_dict(self): + def test_saverdict(self): self.obj.db.test = {"a": True} self.obj.db.test.update({"b": False}) self.assertEqual(self.obj.db.test, {"a": True, "b": False}) + self.obj.db.test |= {"c": 5} + self.assertEqual(self.obj.db.test, {"a": True, "b": False, "c": 5}) @parameterized.expand( [ @@ -88,27 +90,30 @@ class TestDbSerialize(TestCase): self.assertIsInstance(value, base_type) self.assertNotIsInstance(value, saver_type) self.assertEqual(value, default_value) - self.obj.db.test = {'a': True} - self.obj.db.test.update({'b': False}) - self.assertEqual(self.obj.db.test, {'a': True, 'b': False}) + self.obj.db.test = {"a": True} + self.obj.db.test.update({"b": False}) + self.assertEqual(self.obj.db.test, {"a": True, "b": False}) def test_defaultdict(self): from collections import defaultdict + # baseline behavior for a defaultdict _dd = defaultdict(list) - _dd['a'] - self.assertEqual(_dd, {'a': []}) + _dd["a"] + self.assertEqual(_dd, {"a": []}) # behavior after defaultdict is set as attribute dd = defaultdict(list) self.obj.db.test = dd - self.obj.db.test['a'] - self.assertEqual(self.obj.db.test, {'a': []}) + self.obj.db.test["a"] + self.assertEqual(self.obj.db.test, {"a": []}) - self.obj.db.test['a'].append(1) - self.assertEqual(self.obj.db.test, {'a': [1]}) - self.obj.db.test['a'].append(2) - self.assertEqual(self.obj.db.test, {'a': [1, 2]}) - self.obj.db.test['a'].append(3) - self.assertEqual(self.obj.db.test, {'a': [1, 2, 3]}) + self.obj.db.test["a"].append(1) + self.assertEqual(self.obj.db.test, {"a": [1]}) + self.obj.db.test["a"].append(2) + self.assertEqual(self.obj.db.test, {"a": [1, 2]}) + self.obj.db.test["a"].append(3) + self.assertEqual(self.obj.db.test, {"a": [1, 2, 3]}) + self.obj.db.test |= {"b": [5, 6]} + self.assertEqual(self.obj.db.test, {"a": [1, 2, 3], "b": [5, 6]})