feat(logger): add extensible logging API, usage examples, and bilingual documentation

- Introduce CherryPickLogger interface, PrintLogger and SilentLogger implementations
- Add setGlobalLogger() to CherryPick API for custom DI logging
- Log key events (scope, module, error) via logger throughout DI lifecycle
- Comprehensive comments and code documentation in both English and Russian
- Document usage of logging system in quick_start and full_tutorial documentation (EN/RU)
- Provide usage examples in docs and code comments
- No logging inside GlobalCycleDetectionMixin (design choice: exceptions handled at Scope, not detector/mixin level) and detailed architectural reasoning
- Update helper.dart, logger.dart: comments, examples, API doc improvements
BREAKING CHANGE: Projects can now inject any logger via CherryPick.setGlobalLogger; default log behavior clarified and docstrings/usage examples enhanced
This commit is contained in:
Sergey Penkovsky
2025-08-08 08:13:58 +03:00
parent 41d49e98d0
commit aa97632add
16 changed files with 492 additions and 29 deletions

View File

@@ -313,7 +313,7 @@ final config = await scope.resolveAsync<RemoteConfig>();
[`cherrypick_flutter`](https://pub.dev/packages/cherrypick_flutter) is the integration package for CherryPick DI in Flutter. It provides a convenient `CherryPickProvider` widget which sits in your widget tree and gives access to the root DI scope (and subscopes) from context.
### Features
## Features
- **Global DI Scope Access:**
Use `CherryPickProvider` to access rootScope and subscopes anywhere in the widget tree.
@@ -356,6 +356,26 @@ class MyApp extends StatelessWidget {
- You can create subscopes, e.g. for screens or modules:
`final subScope = CherryPickProvider.of(context).openSubScope(scopeName: "profileFeature");`
---
## Logging
To enable logging of all dependency injection (DI) events and errors in CherryPick, set the global logger before creating your scopes:
```dart
import 'package:cherrypick/cherrypick.dart';
void main() {
// Set a global logger before any scopes are created
CherryPick.setGlobalLogger(PrintLogger()); // or your own custom logger
final scope = CherryPick.openRootScope();
// All DI events and cycle errors will now be sent to your logger
}
```
- By default, CherryPick uses SilentLogger (no output in production).
- Any dependency resolution, scope events, or cycle detection errors are logged via info/error on your logger.
---
## CherryPick is not just for Flutter!

View File

@@ -358,6 +358,26 @@ class MyApp extends StatelessWidget {
- Вы можете создавать подскоупы, если нужно, например, для экранов или модулей:
`final subScope = CherryPickProvider.of(context).openSubScope(scopeName: "profileFeature");`
---
## Логирование
Чтобы включить вывод логов о событиях и ошибках DI в CherryPick, настройте глобальный логгер до создания любых scope:
```dart
import 'package:cherrypick/cherrypick.dart';
void main() {
// Установите глобальный логгер до создания scope
CherryPick.setGlobalLogger(PrintLogger()); // или свой логгер
final scope = CherryPick.openRootScope();
// Логи DI и циклов будут выводиться через ваш логгер
}
```
- По умолчанию используется SilentLogger (нет логов в продакшене).
- Любые ошибки резолва и события циклов логируются через info/error на логгере.
---
## CherryPick подходит не только для Flutter!

View File

@@ -79,6 +79,24 @@ Example:
Cherrypick.closeRootScope();
```
## Logging
To enable logging of all dependency injection (DI) events and errors in CherryPick, set the global logger before creating your scopes:
```dart
import 'package:cherrypick/cherrypick.dart';
void main() {
// Set a global logger before any scopes are created
CherryPick.setGlobalLogger(PrintLogger()); // or your own custom logger
final scope = CherryPick.openRootScope();
// All DI events and cycle errors will now be sent to your logger
}
```
- By default, CherryPick uses SilentLogger (no output in production).
- Any dependency resolution, scope events, or cycle detection errors are logged via info/error on your logger.
## Example app

View File

@@ -79,6 +79,24 @@ Scope - это контейнер, который хранит все дерев
Cherrypick.closeRootScope();
```
## Логирование
Чтобы включить вывод логов о событиях и ошибках DI в CherryPick, настройте глобальный логгер до создания любых scope:
```dart
import 'package:cherrypick/cherrypick.dart';
void main() {
// Установите глобальный логгер до создания scope
CherryPick.setGlobalLogger(PrintLogger()); // или свой логгер
final scope = CherryPick.openRootScope();
// Логи DI и циклов будут выводиться через ваш логгер
}
```
- По умолчанию используется SilentLogger (нет логов в продакшене).
- Любые ошибки резолва и события циклов логируются через info/error на логгере.
## Пример приложения