# Spec Delta ## Purpose Поставка общей нормализации форм как устанавливаемой библиотеки с правилами и идентификатором версии, доступной ядру без встроенной копии исходников. ## ADDED Requirements ### Requirement: Установка локальной библиотеки Команда `make install` SHALL устанавливать или переустанавливать дистрибутив `pylib-ai-arm-statements` в окружение backend `api/.venv` из соседнего репозитория `../pylib_ai_arm_statements`. Путь SHALL переопределяться через `STATEMENTS_DIR`. При отсутствии окружения команда SHALL создавать его на Python 3.11. #### Scenario: Повторная установка после изменения библиотеки - **WHEN** разработчик выполняет `make install` после изменения исходников или YAML-правил локальной библиотеки - **THEN** backend получает обновлённую библиотеку, даже если номер версии дистрибутива не изменён #### Scenario: Другой путь к исходникам - **WHEN** разработчик выполняет `make install STATEMENTS_DIR=/tmp/local-statements` - **THEN** библиотека устанавливается из указанного каталога в окружение backend ### Requirement: Подготовка окружения разработки При установке `api/requirements.txt` команда `make venv` SHALL пропускать строки с префиксами `raisa_` и `pylib_ai`. Обработка `requirements-dev.txt` SHALL сохраняться: исключаются вложенные строки `-r`. После установки requirements локальная библиотека SHALL устанавливаться в окружение backend. #### Scenario: Внутренний пакет не запрашивается из реестра - **WHEN** requirements содержит `pylib_ai_arm_statements==0.1.1` и выполняется `make venv` - **THEN** этот пакет не запрашивается из реестра по requirements и устанавливается из локального репозитория ### Requirement: Совместимость импортов и ресурсов Установленная библиотека SHALL предоставлять импорт `arm_statements` и необходимые YAML-правила. Нормализация и загрузка стандартных правил MUST работать без каталога `api/arm_statements/` и без обращения к исходникам соседнего репозитория во время исполнения. #### Scenario: Стандартные правила из установленного пакета - **WHEN** установлен собранный дистрибутив и backend загружает стандартные правила - **THEN** `statement_checks.yaml` и остальные необходимые YAML доступны внутри пакета; ошибка отсутствующего файла не возникает ### Requirement: Версия установленной библиотеки Версия библиотеки SHALL определяться непустым стандартным маркером `VERSION`, а при его отсутствии или пустом содержимом — метаданными дистрибутива `pylib-ai-arm-statements`. Если оба источника недоступны, результат SHALL быть `None`. Явно переданный отсутствующий или пустой файл SHALL возвращать `None` без подстановки метаданных. #### Scenario: Пакет без внутреннего VERSION - **WHEN** у установленного дистрибутива версии `0.1.1` нет внутреннего `VERSION` - **THEN** версия библиотеки равна `0.1.1`, а не `None` #### Scenario: Приоритет маркера - **WHEN** внутренний `VERSION` содержит непустой идентификатор, а метаданные содержат версию дистрибутива - **THEN** возвращается идентификатор из `VERSION` без окружающих пробелов #### Scenario: Явно указанный файл отсутствует - **WHEN** вызывающий передаёт путь к отсутствующему файлу версии - **THEN** возвращается `None`, даже если дистрибутив установлен #### Scenario: Пустой стандартный маркер - **WHEN** стандартный `VERSION` пуст, но метаданные дистрибутива доступны - **THEN** возвращается версия дистрибутива #### Scenario: Нет доступного идентификатора - **WHEN** стандартного маркера и метаданных дистрибутива нет - **THEN** возвращается `None`