2024-07-10 19:30:23 +03:00
# Спецификация модулей
> **Внимание!**
>
2024-08-24 15:34:13 +03:00
> Данная спецификация ещё не закончена и активно разрабатывается.
>
> Могут возникнуть изменения, которые не будут обратно совместимы (breaking changes).
2024-07-10 19:30:23 +03:00
2024-08-24 15:34:13 +03:00
Каждый модуль представлен в виде папки, содержащей два обязательных файла: `info.json` и `__init__.py` .
2024-07-10 19:30:23 +03:00
2024-08-24 15:34:13 +03:00
## Метаданные модуля (`info.json`)
2024-07-10 19:30:23 +03:00
2024-08-24 15:34:13 +03:00
Файл `info.json` содержит информацию о модуле в формате 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",
2024-08-24 15:34:13 +03:00
"uses": ["db_api"]
2024-08-02 16:59:51 +03:00
}
},
"optional": {
"external.yandexgpt": "*"
}
},
"pythonDependencies": {
"required": {
"some_package": "^1.2.3"
},
"optional": {
"another_package": "*"
}
2024-07-10 19:30:23 +03:00
}
}
```
2024-08-24 15:34:13 +03:00
| Поле | Описание |
| :-----------------------------------------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id` | Уникальный идентификатор модуля |
| `name` | Название модуля |
| `description` | Описание функциональности модуля |
| `author` | Автор модуля |
| `version` | Версия модуля в формате [SemVer ](https://semver.org/ ) |
| `privileged` | Является ли модуль привилегированным (булево значение) |
| `dependencies` | Объект, описывающий зависимости модуля от других модулей |
| `dependencies.required` и `dependencies.optional` | Объекты, описывающий обязательные и необязательные зависимости соответственно. Ключ — идентификатор модуля, значение — версия или объект `DependencyInfo` . |
| `pythonDependencies` | Объект, описывающий зависимости модуля от внешних Python пакетов. |
| `pythonDependencies.required` и `pythonDependencies.optional` | Объекты, описывающий обязательные и необязательные зависимости соответственно. Ключ — название пакета, значение — версия. |
2024-08-02 16:59:51 +03:00
### DependencyInfo
2024-08-24 15:34:13 +03:00
Объект `DependencyInfo` позволяет указать не только версию зависимости, но и список доступных к использованию атрибутов модуля (`uses`). Если `uses` не указан, то доступ к модулю целиком запрещён. Пример объекта `DependencyInfo` :
2024-08-02 16:59:51 +03:00
```json
{
"version": "^1.0.0",
2024-08-24 15:34:13 +03:00
"uses": ["db_api"]
2024-08-02 16:59:51 +03:00
}
```
2024-08-24 15:34:13 +03:00
| Поле | Описание |
| :-------: | ------------------------------------ |
| `version` | Версия модуля |
| `uses` | Список используемых атрибутов модуля |
## Режимы работы модулей
2024-07-10 19:30:23 +03:00
2024-08-24 15:34:13 +03:00
### Непривилегированный режим (`privileged: false`)
2024-07-10 19:30:23 +03:00
2024-08-24 15:34:13 +03:00
- Модуль выполняется в доверенной среде на основе `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-24 15:34:13 +03:00
### Привилегированный режим (`privileged: true`)
- Модуль выполняется без ограничений;
- Имеет полный доступ ко всем пакетам, доступным в окружении;
2024-07-10 19:30:23 +03:00
- Должен использоваться с осторожностью и только для модулей, требующих расширенных прав.
## Жизненный цикл модуля
2024-08-24 15:34:13 +03:00
1. Загрузка метаданных из `info.json` ;
2024-08-02 16:59:51 +03:00
2. Проверка зависимостей:
2024-08-24 15:34:13 +03:00
- Проверка всех обязательных зависимостей;
- Проверка совместимости версий зависимостей;
- Проверка зависимостей Python;
3. Загрузка кода модуля из `__init__.py` ;
4. Вызов функции `module_init` , если она есть;
5. После загрузки всех модулей вызывается функция `module_late_init` , если она есть.
2024-07-10 19:30:23 +03:00
2024-08-24 15:34:13 +03:00
## Межмодульное взаимодейтвие
2024-07-10 19:30:23 +03:00
2024-08-24 15:34:13 +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-24 15:34:13 +03:00
Например, можно использовать функцию `get_module` для получения модуля или предоставляемых им объекты по идентификатору.