refactor(core,logger)migrate to CherryPickObserver API and drop CherryPickLogger

BREAKING CHANGE:
- Removed the deprecated CherryPickLogger interface from cherrypick
- Logger/adapters (e.g., talker_cherrypick_logger) must now implement CherryPickObserver
- talker_cherrypick_logger: replace TalkerCherryPickLogger with TalkerCherryPickObserver
- All usages, docs, tests migrated to observer API
- Improved test mocks and integration tests for observer pattern
- Removed obsolete files: cherrypick/src/logger.dart, talker_cherrypick_logger/src/talker_cherrypick_logger.dart
- Updated README and example usages for new CherryPickObserver model

This refactor introduces a unified observer pattern (CherryPickObserver) to handle all DI lifecycle events, replacing the limited info/warn/error logger pattern.
All external logging adapters and integrations must migrate to use CherryPickObserver.
This commit is contained in:
Sergey Penkovsky
2025-08-11 18:01:21 +03:00
parent 4dc9e269cd
commit efed72cc39
24 changed files with 507 additions and 436 deletions

View File

@@ -3,38 +3,44 @@ import 'package:talker/talker.dart';
import 'package:talker_cherrypick_logger/talker_cherrypick_logger.dart';
void main() {
group('TalkerCherryPickLogger', () {
group('TalkerCherryPickObserver', () {
late Talker talker;
late TalkerCherryPickLogger logger;
late TalkerCherryPickObserver observer;
setUp(() {
talker = Talker();
logger = TalkerCherryPickLogger(talker);
observer = TalkerCherryPickObserver(talker);
});
test('logs info messages correctly', () {
logger.info('Test info');
test('onInstanceRequested logs info', () {
observer.onInstanceRequested('A', String, scopeName: 'test');
final log = talker.history.last;
expect(log.message, contains('[CherryPick] Test info'));
//xpect(log.level, TalkerLogLevel.info);
expect(log.message, contains('[request][CherryPick] A — String (scope: test)'));
});
test('logs warning messages correctly', () {
logger.warn('Danger!');
test('onCycleDetected logs warning', () {
observer.onCycleDetected(['A', 'B'], scopeName: 's');
final log = talker.history.last;
expect(log.message, contains('[CherryPick] Danger!'));
expect(log.message, contains('[cycle][CherryPick] Detected'));
//expect(log.level, TalkerLogLevel.warning);
});
test('logs error messages correctly', () {
final error = Exception('some error');
test('onError calls handle', () {
final error = Exception('fail');
final stack = StackTrace.current;
logger.error('ERR', error, stack);
observer.onError('Oops', error, stack);
final log = talker.history.last;
//expect(log.level, TalkerLogLevel.error);
expect(log.message, contains('[CherryPick] ERR'));
expect(log.message, contains('[error][CherryPick] Oops'));
expect(log.exception, error);
expect(log.stackTrace, stack);
});
test('onDiagnostic logs verbose', () {
observer.onDiagnostic('hello', details: 123);
final log = talker.history.last;
//expect(log.level, TalkerLogLevel.verbose);
expect(log.message, contains('hello'));
expect(log.message, contains('123'));
});
});
}