APWorld: make it behave more like a regular world

- set sys.modules so it can be imported with worlds.*
- overwrite __package__ so it can reference ..generic
- fix deprecation warning
This commit is contained in:
black-sliver 2022-10-01 02:47:31 +02:00
parent 060a04700d
commit 4943d26160
1 changed files with 11 additions and 2 deletions

View File

@ -1,7 +1,9 @@
import importlib
import zipimport
import os
import sys
import typing
import warnings
import zipimport
folder = os.path.dirname(__file__)
@ -39,7 +41,14 @@ world_sources.sort()
for world_source in world_sources:
if world_source.is_zip:
importer = zipimport.zipimporter(os.path.join(folder, world_source.path))
importer.load_module(world_source.path.split(".", 1)[0])
spec = importer.find_spec(world_source.path.split(".", 1)[0])
mod = importlib.util.module_from_spec(spec)
mod.__package__ = f"worlds.{mod.__package__}"
mod.__name__ = f"worlds.{mod.__name__}"
sys.modules[mod.__name__] = mod
with warnings.catch_warnings():
warnings.filterwarnings("ignore", message="__package__ != __spec__.parent")
importer.exec_module(mod)
else:
importlib.import_module(f".{world_source.path}", "worlds")