generated from geekiot/python-template
Add [router registry]: add import modules method for router registry
This commit is contained in:
parent
e4e2701a0a
commit
3171ce3acd
1 changed files with 122 additions and 0 deletions
|
|
@ -1,6 +1,8 @@
|
||||||
__all__ = ["RouterRegistry"]
|
__all__ = ["RouterRegistry"]
|
||||||
|
|
||||||
|
|
||||||
|
import importlib
|
||||||
|
from pathlib import Path
|
||||||
from typing import Any, Callable, Union
|
from typing import Any, Callable, Union
|
||||||
|
|
||||||
from aiogram import Bot, F, Router
|
from aiogram import Bot, F, Router
|
||||||
|
|
@ -9,6 +11,7 @@ from aiogram.types.bot_command import BotCommand
|
||||||
from aiogram.types.bot_command_scope_all_private_chats import (
|
from aiogram.types.bot_command_scope_all_private_chats import (
|
||||||
BotCommandScopeAllPrivateChats,
|
BotCommandScopeAllPrivateChats,
|
||||||
)
|
)
|
||||||
|
from loguru import logger as loguru_logger
|
||||||
|
|
||||||
from bot.handlers.utils.filters import ChatTypeFilter
|
from bot.handlers.utils.filters import ChatTypeFilter
|
||||||
from bot.handlers.utils.types import (
|
from bot.handlers.utils.types import (
|
||||||
|
|
@ -142,3 +145,122 @@ class RouterRegistry:
|
||||||
],
|
],
|
||||||
scope=BotCommandScopeAllPrivateChats(),
|
scope=BotCommandScopeAllPrivateChats(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_modules_names(
|
||||||
|
modules_folder: Path,
|
||||||
|
package: str,
|
||||||
|
) -> list[str]:
|
||||||
|
"""
|
||||||
|
Getting absolute Python modules names from the modules_folder.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
modules_folder (Path):
|
||||||
|
The folder containing the modules.
|
||||||
|
A relative path from the file that
|
||||||
|
calls this method should be used.
|
||||||
|
package (str):
|
||||||
|
The existing variable __package__
|
||||||
|
from the file that calls this method.
|
||||||
|
|
||||||
|
Warnings:
|
||||||
|
The attempt to import __init__.py
|
||||||
|
indicates something isn't right.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list[str]: Absolute module names for import.
|
||||||
|
"""
|
||||||
|
modules_names: list[str] = list()
|
||||||
|
|
||||||
|
for file_path in modules_folder.rglob("*.py"):
|
||||||
|
if file_path.name == "__init__.py":
|
||||||
|
loguru_logger.warning(
|
||||||
|
"An attempt to load a path using RouterRegistry "
|
||||||
|
+ "containing __init__.py "
|
||||||
|
+ "indicates something isn't right. Skipping. "
|
||||||
|
+ "modules_folder path: {} | ".format(
|
||||||
|
modules_folder.absolute().as_posix()
|
||||||
|
)
|
||||||
|
+ "package: {}".format(package)
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
|
||||||
|
module_name = (
|
||||||
|
package
|
||||||
|
+ "."
|
||||||
|
+ (
|
||||||
|
file_path.with_suffix("")
|
||||||
|
.relative_to(modules_folder.parent)
|
||||||
|
.as_posix()
|
||||||
|
.replace("/", ".")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
modules_names.append(module_name)
|
||||||
|
|
||||||
|
return modules_names
|
||||||
|
|
||||||
|
def import_modules(
|
||||||
|
self,
|
||||||
|
modules_folder: Path,
|
||||||
|
package: str | None,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Importing modules from the folder with Python modules.
|
||||||
|
It is implied that the modules contain configurations
|
||||||
|
for RouterRegistry.
|
||||||
|
|
||||||
|
For example, there may be register decorators contained there.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
registry: RouterRegistry = RouterRegistry()
|
||||||
|
|
||||||
|
registry_dir = Path(__file__).parent
|
||||||
|
|
||||||
|
registry.import_modules(
|
||||||
|
registry_dir / "commands",
|
||||||
|
__package__,
|
||||||
|
)
|
||||||
|
|
||||||
|
registry.import_modules(
|
||||||
|
registry_dir / "callbacks",
|
||||||
|
__package__,
|
||||||
|
)
|
||||||
|
|
||||||
|
dispatcher.include_router(registry.router)
|
||||||
|
```
|
||||||
|
|
||||||
|
Args:
|
||||||
|
modules_folder (Path):
|
||||||
|
The folder containing the modules.
|
||||||
|
A relative path from the file that
|
||||||
|
calls this method should be used.
|
||||||
|
package (str | None):
|
||||||
|
The existing variable __package__
|
||||||
|
from the file that calls this method.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
ImportError: The package variable cannot be None.
|
||||||
|
"""
|
||||||
|
if package is None:
|
||||||
|
loguru_logger.error(
|
||||||
|
"It is required that the package be a Python path "
|
||||||
|
+ "to the module from which the folder of modules "
|
||||||
|
+ "needs to be loaded."
|
||||||
|
)
|
||||||
|
raise ImportError("The package variable cannot be None.")
|
||||||
|
|
||||||
|
registry_modules: list[str] = self._get_modules_names(
|
||||||
|
modules_folder=modules_folder,
|
||||||
|
package=package,
|
||||||
|
)
|
||||||
|
|
||||||
|
loguru_logger.debug(
|
||||||
|
"Trying to load these modules: " + str(registry_modules)
|
||||||
|
)
|
||||||
|
|
||||||
|
for module_name in registry_modules:
|
||||||
|
importlib.import_module(module_name)
|
||||||
|
|
||||||
|
loguru_logger.debug("Modules loaded successfully.")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue