From 4dc9e269cd7fbc724312b54a28564cf421ac8063 Mon Sep 17 00:00:00 2001 From: Sergey Penkovsky Date: Mon, 11 Aug 2025 16:27:46 +0300 Subject: [PATCH] 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 --- benchmark_di/pubspec.lock | 2 +- examples/client_app/pubspec.lock | 8 +- examples/postly/lib/app.dart | 27 +- examples/postly/lib/di/app_module.dart | 19 +- examples/postly/lib/di/core_module.dart | 13 + examples/postly/lib/main.dart | 18 +- .../lib/presentation/pages/logs_page.dart | 15 + .../lib/presentation/pages/posts_page.dart | 14 +- examples/postly/lib/router/app_router.dart | 3 +- examples/postly/pubspec.lock | 350 +++++++++++++++++- examples/postly/pubspec.yaml | 9 +- pubspec.lock | 14 +- .../talker_cherrypick_logger_example.dart | 15 +- .../lib/src/talker_cherrypick_logger.dart | 24 ++ .../src/talker_cherrypick_logger_base.dart | 6 - .../lib/talker_cherrypick_logger.dart | 2 +- talker_cherrypick_logger/pubspec.yaml | 3 + .../test/talker_cherrypick_logger_test.dart | 36 +- 18 files changed, 523 insertions(+), 55 deletions(-) create mode 100644 examples/postly/lib/di/core_module.dart create mode 100644 examples/postly/lib/presentation/pages/logs_page.dart create mode 100644 talker_cherrypick_logger/lib/src/talker_cherrypick_logger.dart delete mode 100644 talker_cherrypick_logger/lib/src/talker_cherrypick_logger_base.dart diff --git a/benchmark_di/pubspec.lock b/benchmark_di/pubspec.lock index 05cb540..f3d4d99 100644 --- a/benchmark_di/pubspec.lock +++ b/benchmark_di/pubspec.lock @@ -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: diff --git a/examples/client_app/pubspec.lock b/examples/client_app/pubspec.lock index 9650bbf..de5aa91 100644 --- a/examples/client_app/pubspec.lock +++ b/examples/client_app/pubspec.lock @@ -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: diff --git a/examples/postly/lib/app.dart b/examples/postly/lib/app.dart index 260850c..5707836 100644 --- a/examples/postly/lib/app.dart +++ b/examples/postly/lib/app.dart @@ -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()!.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(), + ), ), ); } diff --git a/examples/postly/lib/di/app_module.dart b/examples/postly/lib/di/app_module.dart index 27cf10e..c6df93b 100644 --- a/examples/postly/lib/di/app_module.dart +++ b/examples/postly/lib/di/app_module.dart @@ -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() diff --git a/examples/postly/lib/di/core_module.dart b/examples/postly/lib/di/core_module.dart new file mode 100644 index 0000000..63e024a --- /dev/null +++ b/examples/postly/lib/di/core_module.dart @@ -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().toProvide(() => _talker).singleton(); + } +} \ No newline at end of file diff --git a/examples/postly/lib/main.dart b/examples/postly/lib/main.dart index c17432b..9771377 100644 --- a/examples/postly/lib/main.dart +++ b/examples/postly/lib/main.dart @@ -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,)); } diff --git a/examples/postly/lib/presentation/pages/logs_page.dart b/examples/postly/lib/presentation/pages/logs_page.dart new file mode 100644 index 0000000..ebcfb0a --- /dev/null +++ b/examples/postly/lib/presentation/pages/logs_page.dart @@ -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); + } +} diff --git a/examples/postly/lib/presentation/pages/posts_page.dart b/examples/postly/lib/presentation/pages/posts_page.dart index 4cd11fc..e03ae09 100644 --- a/examples/postly/lib/presentation/pages/posts_page.dart +++ b/examples/postly/lib/presentation/pages/posts_page.dart @@ -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()..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( builder: (context, state) { return state.when( diff --git a/examples/postly/lib/router/app_router.dart b/examples/postly/lib/router/app_router.dart index bd6d4a1..4c8473c 100644 --- a/examples/postly/lib/router/app_router.dart +++ b/examples/postly/lib/router/app_router.dart @@ -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 get routes => [ AutoRoute(page: PostsRoute.page, initial: true), AutoRoute(page: PostDetailsRoute.page), + AutoRoute(page: LogsRoute.page), ]; } diff --git a/examples/postly/pubspec.lock b/examples/postly/pubspec.lock index 21d5810..ec79cba 100644 --- a/examples/postly/pubspec.lock +++ b/examples/postly/pubspec.lock @@ -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" diff --git a/examples/postly/pubspec.yaml b/examples/postly/pubspec.yaml index b2d7851..f45b167 100644 --- a/examples/postly/pubspec.yaml +++ b/examples/postly/pubspec.yaml @@ -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 diff --git a/pubspec.lock b/pubspec.lock index 89c1b0a..eb70210 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -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: diff --git a/talker_cherrypick_logger/example/talker_cherrypick_logger_example.dart b/talker_cherrypick_logger/example/talker_cherrypick_logger_example.dart index 905fa40..183626f 100644 --- a/talker_cherrypick_logger/example/talker_cherrypick_logger_example.dart +++ b/talker_cherrypick_logger/example/talker_cherrypick_logger_example.dart @@ -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 + } } diff --git a/talker_cherrypick_logger/lib/src/talker_cherrypick_logger.dart b/talker_cherrypick_logger/lib/src/talker_cherrypick_logger.dart new file mode 100644 index 0000000..3fd16e0 --- /dev/null +++ b/talker_cherrypick_logger/lib/src/talker_cherrypick_logger.dart @@ -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', + ); + } +} diff --git a/talker_cherrypick_logger/lib/src/talker_cherrypick_logger_base.dart b/talker_cherrypick_logger/lib/src/talker_cherrypick_logger_base.dart deleted file mode 100644 index e8a6f15..0000000 --- a/talker_cherrypick_logger/lib/src/talker_cherrypick_logger_base.dart +++ /dev/null @@ -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; -} diff --git a/talker_cherrypick_logger/lib/talker_cherrypick_logger.dart b/talker_cherrypick_logger/lib/talker_cherrypick_logger.dart index 46b39ef..62e1674 100644 --- a/talker_cherrypick_logger/lib/talker_cherrypick_logger.dart +++ b/talker_cherrypick_logger/lib/talker_cherrypick_logger.dart @@ -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. diff --git a/talker_cherrypick_logger/pubspec.yaml b/talker_cherrypick_logger/pubspec.yaml index a400d69..a653841 100644 --- a/talker_cherrypick_logger/pubspec.yaml +++ b/talker_cherrypick_logger/pubspec.yaml @@ -8,6 +8,9 @@ environment: # Add regular dependencies here. dependencies: + talker: ^4.9.3 + cherrypick: + path: ../cherrypick # path: ^1.8.0 dev_dependencies: diff --git a/talker_cherrypick_logger/test/talker_cherrypick_logger_test.dart b/talker_cherrypick_logger/test/talker_cherrypick_logger_test.dart index eab2dd2..de0873f 100644 --- a/talker_cherrypick_logger/test/talker_cherrypick_logger_test.dart +++ b/talker_cherrypick_logger/test/talker_cherrypick_logger_test.dart @@ -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); }); }); }