mirror of
https://github.com/pese-git/cherrypick.git
synced 2026-03-25 04:40:33 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3331a3ee9c |
@@ -1,7 +1,3 @@
|
|||||||
## Unreleased
|
|
||||||
|
|
||||||
- **BREAKING** **REFACTOR**(binding): rename `Provider<T>` typedef to `ProviderFactory<T>` to avoid naming conflicts with `package:provider`.
|
|
||||||
|
|
||||||
## 3.0.2
|
## 3.0.2
|
||||||
|
|
||||||
- **FIX**(test): fix warning.
|
- **FIX**(test): fix warning.
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ class Binding<T> {
|
|||||||
/// bind<Api>().toProvide(() => ApiService());
|
/// bind<Api>().toProvide(() => ApiService());
|
||||||
/// bind<Db>().toProvide(() async => await openDb());
|
/// bind<Db>().toProvide(() async => await openDb());
|
||||||
/// ```
|
/// ```
|
||||||
Binding<T> toProvide(ProviderFactory<T> value) {
|
Binding<T> toProvide(Provider<T> value) {
|
||||||
_resolver = ProviderResolver<T>((_) => value.call(), withParams: false);
|
_resolver = ProviderResolver<T>((_) => value.call(), withParams: false);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -227,7 +227,7 @@ class Binding<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated('Use toProvide instead of toProvideAsync')
|
@Deprecated('Use toProvide instead of toProvideAsync')
|
||||||
Binding<T> toProvideAsync(ProviderFactory<T> value) {
|
Binding<T> toProvideAsync(Provider<T> value) {
|
||||||
return toProvide(value);
|
return toProvide(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ typedef Instance<T> = FutureOr<T>;
|
|||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ```dart
|
/// ```dart
|
||||||
/// ProviderFactory<MyService> provider = () => MyService();
|
/// Provider<MyService> provider = () => MyService();
|
||||||
/// ProviderFactory<Api> asyncProvider = () async => await Api.connect();
|
/// Provider<Api> asyncProvider = () async => await Api.connect();
|
||||||
/// ```
|
/// ```
|
||||||
typedef ProviderFactory<T> = FutureOr<T> Function();
|
typedef Provider<T> = FutureOr<T> Function();
|
||||||
|
|
||||||
/// Provider function type that accepts a dynamic parameter, for factory/parametrized injection.
|
/// Provider function type that accepts a dynamic parameter, for factory/parametrized injection.
|
||||||
/// Returns [T] or [Future<T>].
|
/// Returns [T] or [Future<T>].
|
||||||
|
|||||||
@@ -64,10 +64,14 @@
|
|||||||
- **WHEN** метод помечен одновременно `@instance` и `@provide`
|
- **WHEN** метод помечен одновременно `@instance` и `@provide`
|
||||||
- **THEN** генератор завершает сборку с ошибкой валидации
|
- **THEN** генератор завершает сборку с ошибкой валидации
|
||||||
|
|
||||||
#### Scenario: Требования к @named
|
#### Scenario: Требования к @named на provider-методе
|
||||||
- **WHEN** `@named` использует пустую строку или некорректный идентификатор
|
- **WHEN** `@named` на provider-методе использует пустую строку или некорректный идентификатор
|
||||||
- **THEN** генератор завершает сборку с ошибкой валидации
|
- **THEN** генератор завершает сборку с ошибкой валидации
|
||||||
|
|
||||||
|
#### Scenario: Пустой @named на inject-поле
|
||||||
|
- **WHEN** `@named('')` указан на поле с `@inject`
|
||||||
|
- **THEN** генератор трактует поле как безымянный резолв (без параметра `named`)
|
||||||
|
|
||||||
#### Scenario: Валидность @module
|
#### Scenario: Валидность @module
|
||||||
- **WHEN** класс с `@module` не имеет публичных методов
|
- **WHEN** класс с `@module` не имеет публичных методов
|
||||||
- **THEN** генератор завершает сборку с ошибкой валидации
|
- **THEN** генератор завершает сборку с ошибкой валидации
|
||||||
|
|||||||
@@ -23,11 +23,11 @@
|
|||||||
- **THEN** subscope удаляется из дерева, а связанные ресурсы освобождаются
|
- **THEN** subscope удаляется из дерева, а связанные ресурсы освобождаются
|
||||||
|
|
||||||
#### Scenario: Путь scope и разделитель
|
#### Scenario: Путь scope и разделитель
|
||||||
- **WHEN** scope открывается по иерархическому пути с разделителем
|
- **WHEN** вызывается `CherryPick.openScope(scopeName: ..., separator: ...)` с иерархическим путем
|
||||||
- **THEN** создается цепочка subscopes по каждому сегменту пути
|
- **THEN** создается цепочка subscopes по каждому сегменту пути
|
||||||
|
|
||||||
#### Scenario: Пустой scopeName
|
#### Scenario: Пустой scopeName
|
||||||
- **WHEN** scope открывается с пустым именем
|
- **WHEN** вызывается `CherryPick.openScope(scopeName: '')`
|
||||||
- **THEN** возвращается root scope
|
- **THEN** возвращается root scope
|
||||||
|
|
||||||
### Requirement: Установка и удаление модулей
|
### Requirement: Установка и удаление модулей
|
||||||
@@ -81,8 +81,8 @@
|
|||||||
### Requirement: Ошибки несоответствия sync/async
|
### Requirement: Ошибки несоответствия sync/async
|
||||||
Резолв MUST выбрасывать ошибки при несоответствии sync/async режима.
|
Резолв MUST выбрасывать ошибки при несоответствии sync/async режима.
|
||||||
|
|
||||||
#### Scenario: ResolveSync для async‑инстанса
|
#### Scenario: Синхронный резолв для async‑binding
|
||||||
- **WHEN** binding зарегистрирован как async‑инстанс или async‑provider, а вызывается `resolveSync`
|
- **WHEN** binding зарегистрирован как async‑инстанс или async‑provider, а вызывается `resolve<T>()` или `tryResolve<T>()`
|
||||||
- **THEN** выбрасывается ошибка с указанием использовать async‑резолв
|
- **THEN** выбрасывается ошибка с указанием использовать async‑резолв
|
||||||
|
|
||||||
### Requirement: Управление Disposable
|
### Requirement: Управление Disposable
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
- **THEN** observer получает соответствующие уведомления
|
- **THEN** observer получает соответствующие уведомления
|
||||||
|
|
||||||
### Requirement: Ошибки и сообщения об ошибках
|
### Requirement: Ошибки и сообщения об ошибках
|
||||||
При критических сбоях резолва ядро MUST выбрасывать ошибку с понятным сообщением, а для tryResolve MUST не бросать исключения.
|
При критических сбоях резолва ядро MUST выбрасывать ошибку с понятным сообщением. Для отсутствующей зависимости `tryResolve`/`tryResolveAsync` MUST возвращать `null` без исключения; ошибки выполнения резолва (например, цикл, sync/async mismatch, отсутствие обязательных params) MAY быть проброшены.
|
||||||
|
|
||||||
#### Scenario: Ошибка отсутствующей зависимости
|
#### Scenario: Ошибка отсутствующей зависимости
|
||||||
- **WHEN** вызывается `resolve<T>()` для незарегистрированной зависимости
|
- **WHEN** вызывается `resolve<T>()` для незарегистрированной зависимости
|
||||||
|
|||||||
@@ -41,14 +41,14 @@ Flutter‑интеграция MUST предоставлять `CherryPickProvid
|
|||||||
|
|
||||||
#### Scenario: Ошибка lookup
|
#### Scenario: Ошибка lookup
|
||||||
- **WHEN** вызов происходит вне поддерева провайдера
|
- **WHEN** вызов происходит вне поддерева провайдера
|
||||||
- **THEN** происходит assertion‑ошибка
|
- **THEN** в debug‑режиме происходит assertion‑ошибка
|
||||||
|
|
||||||
### Requirement: Ошибки и сообщения
|
### Requirement: Ошибки и сообщения
|
||||||
При отсутствии провайдера в дереве MUST быть диагностируемая ошибка.
|
При отсутствии провайдера в дереве MUST быть диагностируемая ошибка.
|
||||||
|
|
||||||
#### Scenario: Диагностика отсутствия провайдера
|
#### Scenario: Диагностика отсутствия провайдера
|
||||||
- **WHEN** `CherryPickProvider.of(context)` не находит провайдер
|
- **WHEN** `CherryPickProvider.of(context)` не находит провайдер
|
||||||
- **THEN** сообщение об ошибке указывает на отсутствие провайдера
|
- **THEN** в debug‑режиме сообщение assertion указывает на отсутствие провайдера
|
||||||
|
|
||||||
### Requirement: Точки расширения
|
### Requirement: Точки расширения
|
||||||
Flutter‑интеграция MUST позволять использовать собственные DI‑scope стратегии поверх `CherryPickProvider`.
|
Flutter‑интеграция MUST позволять использовать собственные DI‑scope стратегии поверх `CherryPickProvider`.
|
||||||
|
|||||||
Reference in New Issue
Block a user