karkas/docs/MODULES-SPEC.md

5.4 KiB
Raw Blame History

Спецификация модулей

Внимание!

Данная спецификация еще не закончена и активно разрабатывается. Могут быть значительные изменения (breaking changes).

Каждый модуль представлен в виде папки, содержащей два обязательных файла: info.json и __init__.py.

Метаинформация о модуле (info.json)

Этот файл содержит метаинформацию о модуле в формате JSON. Пример структуры info.json приведен ниже:

{
  "id": "standard.info",
  "name": "Info",
  "description": "Модуль с информацией",
  "author": "OCAB Team",
  "version": "1.0.0",
  "privileged": false,
  "dependencies": {
    "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": "*"
    }
  }
}
  • id: Уникальный идентификатор модуля.
  • name: Название модуля.
  • description: Описание функциональности модуля.
  • author: Автор модуля.
  • version: Версия модуля в формате SemVer.
  • privileged: Булево значение, указывающее, является ли модуль привилегированным.
  • dependencies: Объект, описывающий зависимости модуля от других OCAB модулей.
    • required: Обязательные зависимости. Ключ - идентификатор модуля, значение - версия или объект DependencyInfo.
    • optional: Необязательные зависимости. Ключ - идентификатор модуля, значение - версия или объект DependencyInfo.
  • pythonDependencies: Объект, описывающий зависимости модуля от внешних Python пакетов.
    • required: Обязательные зависимости. Ключ - название пакета, значение - версия.
    • optional: Необязательные зависимости. Ключ - название пакета, значение - версия.

DependencyInfo

Объект DependencyInfo позволяет указать не только версию зависимости, но и список разрешенных к использованию атрибутов модуля (uses). Если uses не указан, то доступ к модулю целиком запрещен.

{
  "version": "^1.0.0",
  "uses": [
    "db_api"
  ]
}
  • version: Версия модуля.
  • uses: Список разрешенных атрибутов модуля.

Режимы выполнения модулей

Непривилегированный режим (privileged: false):

  • Модуль выполняется в доверенной среде на основе RestrictedPython (это накладывает ряд ограничений).
  • Может импортировать только явно разрешенные модули, указанные в pythonDependencies, а также несколько стандартных модулей, необходимых для работы.
  • Имеет доступ к пакету ocab_core.modules_system.public_api для взаимодействия с ботом.

Привилегированный режим (privileged: true):

  • Модуль выполняется без ограничений.
  • Имеет полный доступ ко всем пакетам, доступным в окружении.
  • Должен использоваться с осторожностью и только для модулей, требующих расширенных прав.

Жизненный цикл модуля

  1. Загрузка метаданных из info.json.
  2. Проверка зависимостей:
    • Проверяется наличие всех обязательных зависимостей.
    • Проверяется совместимость версий зависимостей.
    • Проверяется наличие Python зависимостей.
  3. Загрузка кода модуля из __init__.py.
  4. Вызов функции module_init (если она есть).
  5. После загрузки всех модулей вызывается функция module_late_init (если она есть).

Взаимодействие между модулями

Модули могут взаимодействовать друг с другом через API, предоставляемое системой управления модулями.

Например, есть функция get_module. Она позволяет получить модуль или предоставляемые им объекты по его идентификатору.