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": "Модуль с информацией",
|
2024-08-16 22:42:02 +03:00
|
|
|
|
"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`: Булево значение, указывающее, является ли модуль привилегированным.
|
2024-08-16 22:42:02 +03:00
|
|
|
|
- `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`,
|
|
|
|
|
а также несколько стандартных модулей, необходимых для работы.
|
2024-08-16 22:42:02 +03:00
|
|
|
|
- Имеет доступ к пакету `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
|
|
|
|
|
|
|
|
|
## Взаимодействие между модулями
|
|
|
|
|
|
2024-08-16 22:42:02 +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`. Она позволяет получить модуль или предоставляемые им объекты по его
|
|
|
|
|
идентификатору.
|