feat(logging): add talker_dio_logger and talker_bloc_logger integration, improve cherrypick logger structure, add UI log screen for DI and network/bloc debug

This commit is contained in:
Sergey Penkovsky
2025-08-11 16:27:46 +03:00
parent d153ab4255
commit 4dc9e269cd
18 changed files with 523 additions and 55 deletions

View File

@@ -47,7 +47,7 @@ packages:
path: "../cherrypick"
relative: true
source: path
version: "3.0.0-dev.5"
version: "3.0.0-dev.7"
collection:
dependency: transitive
description:

View File

@@ -127,28 +127,28 @@ packages:
path: "../../cherrypick"
relative: true
source: path
version: "3.0.0-dev.5"
version: "3.0.0-dev.7"
cherrypick_annotations:
dependency: "direct main"
description:
path: "../../cherrypick_annotations"
relative: true
source: path
version: "1.1.0"
version: "1.1.1"
cherrypick_flutter:
dependency: "direct main"
description:
path: "../../cherrypick_flutter"
relative: true
source: path
version: "1.1.3-dev.5"
version: "1.1.3-dev.7"
cherrypick_generator:
dependency: "direct dev"
description:
path: "../../cherrypick_generator"
relative: true
source: path
version: "1.1.0"
version: "1.1.1"
clock:
dependency: transitive
description:

View File

@@ -2,6 +2,7 @@ import 'package:cherrypick/cherrypick.dart';
import 'package:cherrypick_annotations/cherrypick_annotations.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:talker/talker.dart';
import 'domain/repository/post_repository.dart';
import 'presentation/bloc/post_bloc.dart';
@@ -9,26 +10,38 @@ import 'router/app_router.dart';
part 'app.inject.cherrypick.g.dart';
class TalkerProvider extends InheritedWidget {
final Talker talker;
const TalkerProvider({required this.talker, required Widget child, Key? key}) : super(key: key, child: child);
static Talker of(BuildContext context) => context.dependOnInheritedWidgetOfExactType<TalkerProvider>()!.talker;
@override
bool updateShouldNotify(TalkerProvider oldWidget) => oldWidget.talker != talker;
}
@injectable()
class MyApp extends StatelessWidget with _$MyApp {
final _appRouter = AppRouter();
final Talker talker;
@named('repo')
@inject()
late final PostRepository repository;
MyApp({super.key}) {
MyApp({super.key, required this.talker}) {
_inject(this);
}
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (_) => PostBloc(repository),
child: MaterialApp.router(
routeInformationParser: _appRouter.defaultRouteParser(),
routerDelegate: _appRouter.delegate(),
theme: ThemeData.light(),
return TalkerProvider(
talker: talker,
child: BlocProvider(
create: (_) => PostBloc(repository),
child: MaterialApp.router(
routeInformationParser: _appRouter.defaultRouteParser(),
routerDelegate: _appRouter.delegate(),
theme: ThemeData.light(),
),
),
);
}

View File

@@ -1,6 +1,9 @@
import 'package:cherrypick_annotations/cherrypick_annotations.dart';
import 'package:dio/dio.dart';
import 'package:cherrypick/cherrypick.dart';
import 'package:talker_dio_logger/talker_dio_logger_interceptor.dart';
import 'package:talker_dio_logger/talker_dio_logger_settings.dart';
import 'package:talker_flutter/talker_flutter.dart';
import '../data/network/json_placeholder_api.dart';
import '../data/post_repository_impl.dart';
import '../domain/repository/post_repository.dart';
@@ -9,6 +12,18 @@ part 'app_module.module.cherrypick.g.dart';
@module()
abstract class AppModule extends Module {
@provide()
@singleton()
TalkerDioLoggerSettings talkerDioLoggerSettings() => TalkerDioLoggerSettings(
printRequestHeaders: true,
printResponseHeaders: true,
printResponseMessage: true,
);
@provide()
@singleton()
TalkerDioLogger talkerDioLogger(Talker talker, TalkerDioLoggerSettings settings) => TalkerDioLogger(talker: talker, settings: settings);
@instance()
int timeout() => 1000;
@@ -35,8 +50,8 @@ abstract class AppModule extends Module {
@provide()
@singleton()
@named('dio')
Dio dio(@named('baseUrl') String baseUrl) =>
Dio(BaseOptions(baseUrl: baseUrl));
Dio dio(@named('baseUrl') String baseUrl, TalkerDioLogger logger) =>
Dio(BaseOptions(baseUrl: baseUrl))..interceptors.add(logger);
@provide()
@singleton()

View File

@@ -0,0 +1,13 @@
import 'package:cherrypick/cherrypick.dart';
import 'package:talker_flutter/talker_flutter.dart';
class CoreModule extends Module {
final Talker _talker;
CoreModule({required Talker talker}) : _talker = talker;
@override
void builder(Scope currentScope) {
bind<Talker>().toProvide(() => _talker).singleton();
}
}

View File

@@ -1,18 +1,30 @@
import 'package:cherrypick/cherrypick.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:postly/app.dart';
import 'package:postly/di/core_module.dart';
import 'package:talker_bloc_logger/talker_bloc_logger_observer.dart';
import 'package:talker_flutter/talker_flutter.dart';
import 'di/app_module.dart';
import 'package:talker_cherrypick_logger/talker_cherrypick_logger.dart';
void main() {
final talker = Talker();
final talkerLogger = TalkerCherryPickLogger(talker);
Bloc.observer = TalkerBlocObserver(talker: talker);
CherryPick.setGlobalLogger(talkerLogger);
// Включаем cycle-detection только в debug/test
if (kDebugMode) {
CherryPick.setGlobalLogger(PrintLogger());
CherryPick.enableGlobalCycleDetection();
CherryPick.enableGlobalCrossScopeCycleDetection();
}
// Используем safe root scope для гарантии защиты
CherryPick.openRootScope().installModules([$AppModule()]);
runApp(MyApp());
CherryPick.openRootScope().installModules([CoreModule(talker: talker), $AppModule()]);
runApp(MyApp(talker: talker,));
}

View File

@@ -0,0 +1,15 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:talker_flutter/talker_flutter.dart';
import '../../app.dart';
@RoutePage()
class LogsPage extends StatelessWidget {
const LogsPage({super.key});
@override
Widget build(BuildContext context) {
final talker = TalkerProvider.of(context);
return TalkerScreen(talker: talker);
}
}

View File

@@ -1,6 +1,7 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:postly/app.dart';
import '../../router/app_router.gr.dart';
import '../bloc/post_bloc.dart';
@@ -15,7 +16,18 @@ class PostsPage extends StatelessWidget {
create: (context) =>
context.read<PostBloc>()..add(const PostEvent.fetchAll()),
child: Scaffold(
appBar: AppBar(title: const Text('Posts')),
appBar: AppBar(
title: const Text('Posts'),
actions: [
IconButton(
icon: const Icon(Icons.bug_report),
tooltip: 'Open logs',
onPressed: () {
AutoRouter.of(context).push(const LogsRoute());
},
),
],
),
body: BlocBuilder<PostBloc, PostState>(
builder: (context, state) {
return state.when(

View File

@@ -1,5 +1,5 @@
import 'package:auto_route/auto_route.dart';
import '../presentation/pages/logs_page.dart';
import 'app_router.gr.dart';
@AutoRouterConfig()
@@ -8,5 +8,6 @@ class AppRouter extends RootStackRouter {
List<AutoRoute> get routes => [
AutoRoute(page: PostsRoute.page, initial: true),
AutoRoute(page: PostDetailsRoute.page),
AutoRoute(page: LogsRoute.page),
];
}

View File

@@ -17,6 +17,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "7.4.5"
ansi_styles:
dependency: transitive
description:
name: ansi_styles
sha256: "9c656cc12b3c27b17dd982b2cc5c0cfdfbdabd7bc8f3ae5e8542d9867b47ce8a"
url: "https://pub.dev"
source: hosted
version: "0.3.2+1"
ansicolor:
dependency: transitive
description:
name: ansicolor
sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f"
url: "https://pub.dev"
source: hosted
version: "2.0.3"
args:
dependency: transitive
description:
@@ -42,7 +58,7 @@ packages:
source: hosted
version: "9.3.0+1"
auto_route_generator:
dependency: "direct dev"
dependency: "direct main"
description:
name: auto_route_generator
sha256: c2e359d8932986d4d1bcad7a428143f81384ce10fef8d4aa5bc29e1f83766a46
@@ -98,7 +114,7 @@ packages:
source: hosted
version: "2.4.4"
build_runner:
dependency: "direct dev"
dependency: "direct main"
description:
name: build_runner
sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99"
@@ -137,6 +153,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.4.0"
charcode:
dependency: transitive
description:
name: charcode
sha256: fb0f1107cac15a5ea6ef0a6ef71a807b9e4267c713bb93e00e92d737cc8dbd8a
url: "https://pub.dev"
source: hosted
version: "1.4.0"
checked_yaml:
dependency: transitive
description:
@@ -151,21 +175,37 @@ packages:
path: "../../cherrypick"
relative: true
source: path
version: "3.0.0-dev.5"
version: "3.0.0-dev.7"
cherrypick_annotations:
dependency: "direct main"
description:
path: "../../cherrypick_annotations"
relative: true
source: path
version: "1.1.0"
version: "1.1.1"
cherrypick_generator:
dependency: "direct dev"
dependency: "direct main"
description:
path: "../../cherrypick_generator"
relative: true
source: path
version: "1.1.0"
version: "1.1.1"
cli_launcher:
dependency: transitive
description:
name: cli_launcher
sha256: "67d89e0a1c07b103d1253f6b953a43d3f502ee36805c8cfc21196282c9ddf177"
url: "https://pub.dev"
source: hosted
version: "0.3.2"
cli_util:
dependency: transitive
description:
name: cli_util
sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c
url: "https://pub.dev"
source: hosted
version: "0.4.2"
clock:
dependency: transitive
description:
@@ -190,6 +230,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.19.1"
conventional_commit:
dependency: transitive
description:
name: conventional_commit
sha256: fad254feb6fb8eace2be18855176b0a4b97e0d50e416ff0fe590d5ba83735d34
url: "https://pub.dev"
source: hosted
version: "0.6.1"
convert:
dependency: transitive
description:
@@ -198,6 +246,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.2"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670"
url: "https://pub.dev"
source: hosted
version: "0.3.4+2"
crypto:
dependency: transitive
description:
@@ -254,6 +310,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.2"
ffi:
dependency: transitive
description:
name: ffi
sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
file:
dependency: transitive
description:
@@ -284,7 +348,7 @@ packages:
source: hosted
version: "9.1.1"
flutter_lints:
dependency: "direct dev"
dependency: "direct main"
description:
name: flutter_lints
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
@@ -292,12 +356,17 @@ packages:
source: hosted
version: "5.0.0"
flutter_test:
dependency: "direct dev"
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
freezed:
dependency: "direct dev"
dependency: "direct main"
description:
name: freezed
sha256: "59a584c24b3acdc5250bb856d0d3e9c0b798ed14a4af1ddb7dc1c7b41df91c9c"
@@ -336,6 +405,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.3.2"
group_button:
dependency: transitive
description:
name: group_button
sha256: "0610fcf28ed122bfb4b410fce161a390f7f2531d55d1d65c5375982001415940"
url: "https://pub.dev"
source: hosted
version: "5.3.4"
http:
dependency: transitive
description:
@@ -360,6 +437,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.0.2"
intl:
dependency: transitive
description:
name: intl
sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
url: "https://pub.dev"
source: hosted
version: "0.19.0"
io:
dependency: transitive
description:
@@ -385,7 +470,7 @@ packages:
source: hosted
version: "4.9.0"
json_serializable:
dependency: "direct dev"
dependency: "direct main"
description:
name: json_serializable
sha256: c50ef5fc083d5b5e12eef489503ba3bf5ccc899e487d691584699b4bdefeea8c
@@ -448,6 +533,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.11.1"
melos:
dependency: "direct dev"
description:
name: melos
sha256: "3f3ab3f902843d1e5a1b1a4dd39a4aca8ba1056f2d32fd8995210fa2843f646f"
url: "https://pub.dev"
source: hosted
version: "6.3.2"
meta:
dependency: transitive
description:
@@ -464,6 +557,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.0.0"
mustache_template:
dependency: transitive
description:
name: mustache_template
sha256: a46e26f91445bfb0b60519be280555b06792460b27b19e2b19ad5b9740df5d1c
url: "https://pub.dev"
source: hosted
version: "2.0.0"
nested:
dependency: transitive
description:
@@ -488,6 +589,54 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.9.1"
path_provider:
dependency: transitive
description:
name: path_provider
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
url: "https://pub.dev"
source: hosted
version: "2.1.5"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9
url: "https://pub.dev"
source: hosted
version: "2.2.17"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev"
source: hosted
version: "2.3.0"
petitparser:
dependency: transitive
description:
@@ -496,6 +645,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "6.0.2"
platform:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
pool:
dependency: transitive
description:
@@ -504,6 +669,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.5.1"
process:
dependency: transitive
description:
name: process
sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744
url: "https://pub.dev"
source: hosted
version: "5.0.5"
prompts:
dependency: transitive
description:
name: prompts
sha256: "3773b845e85a849f01e793c4fc18a45d52d7783b4cb6c0569fad19f9d0a774a1"
url: "https://pub.dev"
source: hosted
version: "2.0.0"
protobuf:
dependency: transitive
description:
@@ -528,6 +709,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.2.0"
pub_updater:
dependency: transitive
description:
name: pub_updater
sha256: "54e8dc865349059ebe7f163d6acce7c89eb958b8047e6d6e80ce93b13d7c9e60"
url: "https://pub.dev"
source: hosted
version: "0.4.0"
pubspec_parse:
dependency: transitive
description:
@@ -545,13 +734,29 @@ packages:
source: hosted
version: "4.4.2"
retrofit_generator:
dependency: "direct dev"
dependency: "direct main"
description:
name: retrofit_generator
sha256: "65d28d3a7b4db485f1c73fee8ee32f552ef23ee4ecb68ba491f39d80b73bdcbf"
url: "https://pub.dev"
source: hosted
version: "9.2.0"
share_plus:
dependency: transitive
description:
name: share_plus
sha256: b2961506569e28948d75ec346c28775bb111986bb69dc6a20754a457e3d97fa0
url: "https://pub.dev"
source: hosted
version: "11.0.0"
share_plus_platform_interface:
dependency: transitive
description:
name: share_plus_platform_interface
sha256: "1032d392bc5d2095a77447a805aa3f804d2ae6a4d5eef5e6ebb3bd94c1bc19ef"
url: "https://pub.dev"
source: hosted
version: "6.0.0"
shelf:
dependency: transitive
description:
@@ -597,6 +802,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.10.1"
sprintf:
dependency: transitive
description:
name: sprintf
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
url: "https://pub.dev"
source: hosted
version: "7.0.0"
stack_trace:
dependency: transitive
description:
@@ -629,6 +842,53 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.4.1"
talker:
dependency: transitive
description:
name: talker
sha256: "028a753874d98df39f210cb74f0ee09a0a95e28f8bc2dc975c3c328e24fde23d"
url: "https://pub.dev"
source: hosted
version: "4.9.3"
talker_bloc_logger:
dependency: "direct main"
description:
name: talker_bloc_logger
sha256: cf1e3b1d70f9a47e061288f0d230ba0e04a0f6394629d5df1c7b0933b236e397
url: "https://pub.dev"
source: hosted
version: "4.9.3"
talker_cherrypick_logger:
dependency: "direct main"
description:
path: "../../talker_cherrypick_logger"
relative: true
source: path
version: "1.0.0"
talker_dio_logger:
dependency: "direct main"
description:
name: talker_dio_logger
sha256: dcf784f1841e248c270ef741f8a07ca9cf562c6424ee43fc6e598c4eb7f18238
url: "https://pub.dev"
source: hosted
version: "4.9.3"
talker_flutter:
dependency: "direct main"
description:
name: talker_flutter
sha256: "2cfee6661277d415a895b6258ecb0bf80d7b564e91ea7e769fc6d0f970a01c09"
url: "https://pub.dev"
source: hosted
version: "4.9.3"
talker_logger:
dependency: transitive
description:
name: talker_logger
sha256: "778ec673f1b71a6516e5576ae8d90ea23bbbcf9f405a97cc30e8ccdc33e26d27"
url: "https://pub.dev"
source: hosted
version: "4.9.3"
term_glyph:
dependency: transitive
description:
@@ -661,6 +921,46 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.4.0"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
uuid:
dependency: transitive
description:
name: uuid
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
url: "https://pub.dev"
source: hosted
version: "4.5.1"
vector_math:
dependency: transitive
description:
@@ -709,6 +1009,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.0.3"
win32:
dependency: transitive
description:
name: win32
sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba"
url: "https://pub.dev"
source: hosted
version: "5.13.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xml:
dependency: transitive
description:
@@ -725,6 +1041,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "3.1.3"
yaml_edit:
dependency: transitive
description:
name: yaml_edit
sha256: fb38626579fb345ad00e674e2af3a5c9b0cc4b9bfb8fd7f7ff322c7c9e62aef5
url: "https://pub.dev"
source: hosted
version: "2.2.2"
sdks:
dart: ">=3.7.0 <4.0.0"
flutter: ">=3.18.0-18.0.pre.54"
dart: ">=3.7.2 <4.0.0"
flutter: ">=3.27.0"

View File

@@ -24,9 +24,12 @@ dependencies:
flutter_bloc: ^9.1.1
auto_route: ^9.3.0+1
cupertino_icons: ^1.0.8
dev_dependencies:
talker_flutter: ^4.9.3
talker_cherrypick_logger:
path: ../../talker_cherrypick_logger
flutter_test:
sdk: flutter
@@ -40,7 +43,11 @@ dev_dependencies:
freezed: ^2.5.8
json_serializable: ^6.9.0
auto_route_generator: ^9.0.0
talker_dio_logger: ^4.9.3
talker_bloc_logger: ^4.9.3
flutter:
uses-material-design: true
dev_dependencies:
melos: ^6.3.2

View File

@@ -5,23 +5,23 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
sha256: "45cfa8471b89fb6643fe9bf51bd7931a76b8f5ec2d65de4fb176dba8d4f22c77"
url: "https://pub.dev"
source: hosted
version: "76.0.0"
version: "73.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.3"
version: "0.3.2"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
sha256: "4959fec185fe70cce007c57e9ab6983101dbe593d2bf8bbfb4453aaec0cf470a"
url: "https://pub.dev"
source: hosted
version: "6.11.0"
version: "6.8.0"
ansi_styles:
dependency: transitive
description:
@@ -298,10 +298,10 @@ packages:
dependency: transitive
description:
name: macros
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
url: "https://pub.dev"
source: hosted
version: "0.1.3-main.0"
version: "0.1.2-main.4"
matcher:
dependency: transitive
description:

View File

@@ -1,6 +1,17 @@
import 'package:talker_cherrypick_logger/talker_cherrypick_logger.dart';
import 'package:talker/talker.dart';
void main() {
var awesome = Awesome();
print('awesome: ${awesome.isAwesome}');
final talker = Talker();
final logger = TalkerCherryPickLogger(talker);
logger.info('Hello from CherryPickLogger!');
logger.warn('Something might be wrong...');
logger.error('Oops! An error occurred', Exception('Test error'));
// Вывод всех логов
print('\nВсе сообщения логирования через Talker:');
for (final log in talker.history) {
print(log); // Пример, либо log.toString(), либо log.message
}
}

View File

@@ -0,0 +1,24 @@
import 'package:cherrypick/cherrypick.dart';
import 'package:talker/talker.dart';
/// Реализация CherryPickLogger для логирования через Talker
class TalkerCherryPickLogger implements CherryPickLogger {
final Talker talker;
TalkerCherryPickLogger(this.talker);
@override
void info(String message) => talker.info('[CherryPick] $message');
@override
void warn(String message) => talker.warning('[CherryPick] $message');
@override
void error(String message, [Object? error, StackTrace? stackTrace]) {
talker.handle(
error ?? '[CherryPick] $message',
stackTrace,
'[CherryPick] $message',
);
}
}

View File

@@ -1,6 +0,0 @@
// TODO: Put public facing types in this file.
/// Checks if you are awesome. Spoiler: you are.
class Awesome {
bool get isAwesome => true;
}

View File

@@ -3,6 +3,6 @@
/// More dartdocs go here.
library;
export 'src/talker_cherrypick_logger_base.dart';
export 'src/talker_cherrypick_logger.dart';
// TODO: Export any libraries intended for clients of this package.

View File

@@ -8,6 +8,9 @@ environment:
# Add regular dependencies here.
dependencies:
talker: ^4.9.3
cherrypick:
path: ../cherrypick
# path: ^1.8.0
dev_dependencies:

View File

@@ -1,16 +1,40 @@
import 'package:talker_cherrypick_logger/talker_cherrypick_logger.dart';
import 'package:test/test.dart';
import 'package:talker/talker.dart';
import 'package:talker_cherrypick_logger/talker_cherrypick_logger.dart';
void main() {
group('A group of tests', () {
final awesome = Awesome();
group('TalkerCherryPickLogger', () {
late Talker talker;
late TalkerCherryPickLogger logger;
setUp(() {
// Additional setup goes here.
talker = Talker();
logger = TalkerCherryPickLogger(talker);
});
test('First Test', () {
expect(awesome.isAwesome, isTrue);
test('logs info messages correctly', () {
logger.info('Test info');
final log = talker.history.last;
expect(log.message, contains('[CherryPick] Test info'));
//xpect(log.level, TalkerLogLevel.info);
});
test('logs warning messages correctly', () {
logger.warn('Danger!');
final log = talker.history.last;
expect(log.message, contains('[CherryPick] Danger!'));
//expect(log.level, TalkerLogLevel.warning);
});
test('logs error messages correctly', () {
final error = Exception('some error');
final stack = StackTrace.current;
logger.error('ERR', error, stack);
final log = talker.history.last;
//expect(log.level, TalkerLogLevel.error);
expect(log.message, contains('[CherryPick] ERR'));
expect(log.exception, error);
expect(log.stackTrace, stack);
});
});
}