Add OpenSpec system specification

This commit is contained in:
Sergey Penkovsky
2026-02-27 14:33:30 +03:00
parent e6b3017384
commit 3c550db8cd
16 changed files with 1663 additions and 0 deletions

View File

@@ -0,0 +1,84 @@
## ADDED Requirements
### Requirement: Сущности аннотаций
Пакет аннотаций MUST предоставлять аннотации `@module`, `@provide`, `@instance`, `@singleton`, `@named`, `@params`, `@inject`, `@injectable`, `@scope`.
#### Scenario: Наличие аннотаций
- **WHEN** разработчик импортирует пакет аннотаций
- **THEN** все перечисленные аннотации доступны для использования
### Requirement: Семантика module/provide/instance/singleton
Генератор MUST трактовать аннотации `@module`, `@provide`, `@instance`, `@singleton` как источники bindings и жизненного цикла.
#### Scenario: Генерация bindings для @module
- **WHEN** класс помечен `@module` и содержит методы с `@provide`
- **THEN** сгенерированный модуль регистрирует эти методы как DIbindings
#### Scenario: Singleton vs Instance
- **WHEN** метод помечен `@singleton`
- **THEN** binding создается как singleton
- **WHEN** метод помечен `@instance` или не имеет lifecycleаннотации
- **THEN** binding создается как factory/instance
#### Scenario: Обязательность provide/instance
- **WHEN** публичный метод в `@module` не помечен `@instance` или `@provide`
- **THEN** генератор завершает сборку с ошибкой валидации
### Requirement: Инъекция полей
Генератор MUST создавать миксин для класса с `@injectable` и инъектировать все поля, помеченные `@inject`.
#### Scenario: Инъекция полей без квалификаторов
- **WHEN** поле помечено `@inject`
- **THEN** миксин вызывает resolve для типа поля
#### Scenario: Инъекция с @named и @scope
- **WHEN** поле помечено `@inject` и `@named` или `@scope`
- **THEN** миксин использует соответствующий named/scope при резолве
### Requirement: Параметры выполнения
`@params` MUST обозначать runtimeпараметры, которые передаются при резолве.
#### Scenario: Параметризованный provider
- **WHEN** providerметод имеет параметр с `@params`
- **THEN** генерируется binding с параметрами и соответствующий API резолва
#### Scenario: Запрет @params с @instance
- **WHEN** `@params` используется вместе с `@instance`
- **THEN** генератор завершает сборку с ошибкой валидации
### Requirement: Поддержка async
Генератор MUST корректно обрабатывать `Future<T>` и асинхронные зависимости.
#### Scenario: Async provider
- **WHEN** provider возвращает `Future<T>`
- **THEN** генерируется asyncbinding и используется `resolveAsync`
### Requirement: Обработка ошибок и валидация
Генератор MUST валидировать корректность применения аннотаций и сообщать об ошибках на стадии build.
#### Scenario: Некорректная цель аннотации
- **WHEN** аннотация применена к неподдерживаемому элементу
- **THEN** генератор завершает сборку с понятной ошибкой
#### Scenario: Взаимоисключающие аннотации
- **WHEN** метод помечен одновременно `@instance` и `@provide`
- **THEN** генератор завершает сборку с ошибкой валидации
#### Scenario: Требования к @named
- **WHEN** `@named` использует пустую строку или некорректный идентификатор
- **THEN** генератор завершает сборку с ошибкой валидации
#### Scenario: Валидность @module
- **WHEN** класс с `@module` не имеет публичных методов
- **THEN** генератор завершает сборку с ошибкой валидации
#### Scenario: Валидность @injectable полей
- **WHEN** поле с `@inject` не является `final`
- **THEN** генератор завершает сборку с ошибкой валидации
### Requirement: Точки расширения
Система MUST позволять расширять DIконтракт через новые модули/классы без изменения генератора, используя стандартные аннотации.
#### Scenario: Новый модуль
- **WHEN** разработчик добавляет новый класс `@module`
- **THEN** генератор автоматически включает его в DIрегистрации