karkas/docs/MODULES-SPEC.md

108 lines
5.4 KiB
Markdown
Raw Normal View History

2024-07-10 19:30:23 +03:00
# Спецификация модулей
> **Внимание!**
>
> Данная спецификация еще не закончена и активно разрабатывается.
> Могут быть значительные изменения (breaking changes).
Каждый модуль представлен в виде папки, содержащей два обязательных файла: info.json и `__init__.py`.
## Метаинформация о модуле (info.json)
2024-08-02 16:59:51 +03:00
Этот файл содержит метаинформацию о модуле в формате JSON. Пример структуры info.json приведен ниже:
2024-07-10 19:30:23 +03:00
```json
{
"id": "standard.info",
"name": "Info",
"description": "Модуль с информацией",
"author": "Karkas Team",
2024-07-10 19:30:23 +03:00
"version": "1.0.0",
"privileged": false,
"dependencies": {
2024-08-02 16:59:51 +03:00
"required": {
"standard.roles": "^1.0.0",
"standard.database": {
"version": "^1.0.0",
"uses": [
"db_api"
]
}
},
"optional": {
"external.yandexgpt": "*"
}
},
"pythonDependencies": {
"required": {
"some_package": "^1.2.3"
},
"optional": {
"another_package": "*"
}
2024-07-10 19:30:23 +03:00
}
}
```
- `id`: Уникальный идентификатор модуля.
- `name`: Название модуля.
- `description`: Описание функциональности модуля.
- `author`: Автор модуля.
2024-08-02 16:59:51 +03:00
- `version`: Версия модуля в формате [SemVer](https://semver.org/).
2024-07-10 19:30:23 +03:00
- `privileged`: Булево значение, указывающее, является ли модуль привилегированным.
- `dependencies`: Объект, описывающий зависимости модуля от других **Karkas** модулей.
2024-08-02 16:59:51 +03:00
- `required`: Обязательные зависимости. Ключ - идентификатор модуля, значение - версия или объект `DependencyInfo`.
- `optional`: Необязательные зависимости. Ключ - идентификатор модуля, значение - версия или объект `DependencyInfo`.
- `pythonDependencies`: Объект, описывающий зависимости модуля от внешних Python пакетов.
- `required`: Обязательные зависимости. Ключ - название пакета, значение - версия.
- `optional`: Необязательные зависимости. Ключ - название пакета, значение - версия.
### DependencyInfo
Объект `DependencyInfo` позволяет указать не только версию зависимости, но и список разрешенных к использованию
атрибутов модуля (`uses`). Если `uses` не указан, то доступ к модулю целиком запрещен.
```json
{
"version": "^1.0.0",
"uses": [
"db_api"
]
}
```
- `version`: Версия модуля.
- `uses`: Список разрешенных атрибутов модуля.
2024-07-10 19:30:23 +03:00
## Режимы выполнения модулей
2024-08-02 16:59:51 +03:00
**Непривилегированный режим** (`privileged: false`):
- Модуль выполняется в доверенной среде на основе RestrictedPython (это накладывает ряд ограничений).
- Может импортировать только явно разрешенные модули, указанные в `pythonDependencies`,
а также несколько стандартных модулей, необходимых для работы.
- Имеет доступ к пакету `karkas_core.modules_system.public_api` для взаимодействия с ботом.
2024-07-10 19:30:23 +03:00
2024-08-02 16:59:51 +03:00
**Привилегированный режим** (`privileged: true`):
2024-07-10 19:30:23 +03:00
- Модуль выполняется без ограничений.
2024-08-02 16:59:51 +03:00
- Имеет полный доступ ко всем пакетам, доступным в окружении.
2024-07-10 19:30:23 +03:00
- Должен использоваться с осторожностью и только для модулей, требующих расширенных прав.
## Жизненный цикл модуля
2024-08-02 16:59:51 +03:00
1. Загрузка метаданных из `info.json`.
2. Проверка зависимостей:
- Проверяется наличие всех обязательных зависимостей.
- Проверяется совместимость версий зависимостей.
- Проверяется наличие Python зависимостей.
3. Загрузка кода модуля из `__init__.py`.
4. Вызов функции `module_init` (если она есть).
5. После загрузки всех модулей вызывается функция `module_late_init` (если она есть).
2024-07-10 19:30:23 +03:00
## Взаимодействие между модулями
Модули могут взаимодействовать друг с другом через [API](../src/karkas_core/karkas_core/modules_system/public_api/__init__.py),
2024-08-02 16:59:51 +03:00
предоставляемое системой управления модулями.
2024-07-10 19:30:23 +03:00
2024-08-02 16:59:51 +03:00
Например, есть функция `get_module`. Она позволяет получить модуль или предоставляемые им объекты по его
идентификатору.