feat: add model and extension autoloading

This commit is contained in:
Radek Goláň jr. 2025-08-09 17:54:01 +02:00
parent 5e4fabb24c
commit e8141ad8f7
Signed by: shield
GPG Key ID: D86423BFC31F3591
2 changed files with 73 additions and 0 deletions

View File

@ -187,6 +187,26 @@ class Imp:
if isinstance(potential_blueprint, Blueprint): if isinstance(potential_blueprint, Blueprint):
self._quart_blueprint_registration(potential_blueprint) self._quart_blueprint_registration(potential_blueprint)
def import_model(self, model: str) -> None:
if Path(model).is_absolute():
model_path = Path(model)
else:
model_path = Path(self.app_path / model)
if model_path.exists() and not model_path.name.startswith("__"):
module = import_module(cast_to_import_str(self.app_name, model_path))
def import_extension(self, ext: str) -> None:
if Path(model).is_absolute():
ext_path = Path(ext)
else:
ext_path = Path(self.app_path / ext)
if model_path.exists() and not model_path.name.startswith("__"):
module = import_module(cast_to_import_str(self.app_name, model_path))
module.register_module(self.app)
def import_blueprints(self, folder: str) -> None: def import_blueprints(self, folder: str) -> None:
""" """
@ -206,6 +226,34 @@ class Imp:
for potential_bp in folder_path.iterdir(): for potential_bp in folder_path.iterdir():
self.import_blueprint(f"{potential_bp}") self.import_blueprint(f"{potential_bp}")
def import_models(self, folder: str) -> None:
"""
Will import all models from the given folder.
Given folder must be relative to the
"""
folder_path = Path(self.app_path / folder)
if not folder_path.exists():
raise ImportError(f"Cannot find models folder at {folder_path}")
if not folder_path.is_dir():
raise ImportError(f"Models must be a folder {folder_path}")
for potential_model in folder_path.iterdir():
self.import_model(potential_model)
def import_extensions(self, folder: str) -> None:
"""
Will import all extensions from the given folder.
Given folder must be relative to the
"""
folder_path = Path(self.app_path / folder)
if not folder_path.exists():
raise ImportError(f"Cannot find extensions folder at {folder_path}")
if not folder_path.is_dir():
raise ImportError(f"Extensions must be a folder {folder_path}")
for potential_ext in folder_path.iterdir():
self.import_model(potential_ext)
async def _async_import_resource_module( async def _async_import_resource_module(
self, module: Path, factories: t.List[str] self, module: Path, factories: t.List[str]

View File

@ -100,6 +100,31 @@ class ImpBlueprint(Blueprint):
raise ImportError( raise ImportError(
f"Error when importing {self.package}.{resource}: {e}" f"Error when importing {self.package}.{resource}: {e}"
) )
def import_models(self, folder: str = "models") -> None:
"""
Will import all the models from the given folder.
Given folder must be relative to the blueprint (in the same folder as the __init__.py file).
:param folder: Folder to look for models in. Must be relative.
:return: None
"""
if self._prevent_if_disabled():
return
model_path = self.location / folder
if not model_path.exists():
raise NotADirectoryError(f"{model_path} is not a directory")
models = model_path.glob("*.py")
for model in models:
try:
import_module(f"{self.package}.{folder}.{model.stem}")
except ImportsError as e:
raise ImportError(
f"Error when importing {self.package}.{model}: {e}"
)
def import_nested_blueprint(self, blueprint: t.Union[str, Path]) -> None: def import_nested_blueprint(self, blueprint: t.Union[str, Path]) -> None:
""" """