diff --git a/packages/talker/lib/src/extensions/extensions.dart b/packages/talker/lib/src/extensions/extensions.dart index e9d3d545..1095a98a 100644 --- a/packages/talker/lib/src/extensions/extensions.dart +++ b/packages/talker/lib/src/extensions/extensions.dart @@ -3,10 +3,10 @@ import 'package:talker/talker.dart'; extension TalkerDataInterfaceListExt on List { /// The method allows you to get /// full text of logs or history - String get text { + String text({TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { final sb = StringBuffer(); for (final data in this) { - sb.write('${data.generateTextMessage()}\n'); + sb.write('${data.generateTextMessage(timeFormat: timeFormat)}\n'); } return sb.toString(); } diff --git a/packages/talker/lib/src/models/talker_data.dart b/packages/talker/lib/src/models/talker_data.dart index 0775c68f..6734f445 100644 --- a/packages/talker/lib/src/models/talker_data.dart +++ b/packages/talker/lib/src/models/talker_data.dart @@ -70,8 +70,9 @@ class TalkerData { /// [TalkerError] -> [TalkerError.generateTextMessage] /// /// {@endtemplate} - String generateTextMessage() { - return '$displayTitleWithTime$message$displayStackTrace'; + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { + return '${displayTitleWithTime(timeFormat: timeFormat)}$message$displayStackTrace'; } } @@ -80,8 +81,9 @@ class TalkerData { extension FieldsToDisplay on TalkerData { /// Displayed title of [TalkerData] - String get displayTitleWithTime { - return '[$title] | $displayTime | '; + String displayTitleWithTime( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { + return '[$title] | ${displayTime(timeFormat: timeFormat)} | '; } /// Displayed stackTrace of [TalkerData] @@ -117,5 +119,6 @@ extension FieldsToDisplay on TalkerData { } /// Displayed tile of [TalkerData] - String get displayTime => TalkerDateTimeFormatter(time).timeAndSeconds; + String displayTime({TimeFormat timeFormat = TimeFormat.timeAndSeconds}) => + TalkerDateTimeFormatter(time, timeFormat: timeFormat).format; } diff --git a/packages/talker/lib/src/models/talker_error.dart b/packages/talker/lib/src/models/talker_error.dart index 50479076..6b40e68f 100644 --- a/packages/talker/lib/src/models/talker_error.dart +++ b/packages/talker/lib/src/models/talker_error.dart @@ -26,7 +26,8 @@ class TalkerError extends TalkerData { /// {@macro talker_data_generateTextMessage} @override - String generateTextMessage() { - return '$displayTitleWithTime$displayMessage$displayError$displayStackTrace'; + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { + return '${displayTitleWithTime(timeFormat: timeFormat)}$displayMessage$displayError$displayStackTrace'; } } diff --git a/packages/talker/lib/src/models/talker_exception.dart b/packages/talker/lib/src/models/talker_exception.dart index 824ec5c8..fb6d50a6 100644 --- a/packages/talker/lib/src/models/talker_exception.dart +++ b/packages/talker/lib/src/models/talker_exception.dart @@ -26,7 +26,8 @@ class TalkerException extends TalkerData { /// {@macro talker_data_generateTextMessage} @override - String generateTextMessage() { - return '$displayTitleWithTime$displayMessage$displayException$displayStackTrace'; + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { + return '${displayTitleWithTime(timeFormat: timeFormat)}$displayMessage$displayException$displayStackTrace'; } } diff --git a/packages/talker/lib/src/models/talker_log.dart b/packages/talker/lib/src/models/talker_log.dart index c07f4505..16691e7d 100644 --- a/packages/talker/lib/src/models/talker_log.dart +++ b/packages/talker/lib/src/models/talker_log.dart @@ -17,7 +17,8 @@ class TalkerLog extends TalkerData { /// {@macro talker_data_generateTextMessage} @override - String generateTextMessage() { - return '$displayTitleWithTime$displayMessage$displayException$displayStackTrace'; + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { + return '${displayTitleWithTime(timeFormat: timeFormat)}$displayMessage$displayException$displayStackTrace'; } } diff --git a/packages/talker/lib/src/settings.dart b/packages/talker/lib/src/settings.dart index eb8a9902..71551293 100644 --- a/packages/talker/lib/src/settings.dart +++ b/packages/talker/lib/src/settings.dart @@ -73,9 +73,11 @@ class TalkerSettings { int maxHistoryItems = 1000, this.titles = _defaultTitles, Map? colors, + TimeFormat timeFormat = TimeFormat.timeAndSeconds, }) : _useHistory = useHistory, _useConsoleLogs = useConsoleLogs, - _maxHistoryItems = maxHistoryItems { + _maxHistoryItems = maxHistoryItems, + _timeFormat = timeFormat { if (colors != null) { _defaultColors.addAll(colors); } @@ -99,6 +101,10 @@ class TalkerSettings { int get maxHistoryItems => _maxHistoryItems; final int _maxHistoryItems; + /// the time format of the logs [TimeFormat] + TimeFormat get timeFormat => _timeFormat; + final TimeFormat _timeFormat; + /// Use writing talker records in file // bool get writeToFile => _writeToFile && enabled; // final bool _writeToFile; diff --git a/packages/talker/lib/src/talker.dart b/packages/talker/lib/src/talker.dart index 7c1127dd..e471005a 100644 --- a/packages/talker/lib/src/talker.dart +++ b/packages/talker/lib/src/talker.dart @@ -391,7 +391,7 @@ class Talker { _handleForOutputs(data); if (settings.useConsoleLogs) { _logger.log( - data.generateTextMessage(), + data.generateTextMessage(timeFormat: settings.timeFormat), level: data.logLevel ?? LogLevel.error, ); } @@ -423,7 +423,7 @@ class Talker { _handleForOutputs(data); if (settings.useConsoleLogs) { _logger.log( - data.generateTextMessage(), + data.generateTextMessage(timeFormat: settings.timeFormat), level: logLevel ?? data.logLevel, pen: data.pen ?? customPen, ); diff --git a/packages/talker/lib/src/utils/time_format.dart b/packages/talker/lib/src/utils/time_format.dart new file mode 100644 index 00000000..65cff5cd --- /dev/null +++ b/packages/talker/lib/src/utils/time_format.dart @@ -0,0 +1,8 @@ +/// Enum representing different time formats. +enum TimeFormat { + /// Format representing year, month, day, and time. + yearMonthDayAndTime, + + /// Format representing time and seconds. + timeAndSeconds +} diff --git a/packages/talker/lib/src/utils/time_formatter.dart b/packages/talker/lib/src/utils/time_formatter.dart index 480bf1b1..f3e2e096 100644 --- a/packages/talker/lib/src/utils/time_formatter.dart +++ b/packages/talker/lib/src/utils/time_formatter.dart @@ -1,12 +1,19 @@ -/// Util for [DateTime] formatting +import 'package:talker/src/utils/time_format.dart'; + +/// Utility class for [DateTime] formatting. class TalkerDateTimeFormatter { - const TalkerDateTimeFormatter(this.date); + /// Constructs a [TalkerDateTimeFormatter] with the given [date]. + const TalkerDateTimeFormatter(this.date, + {this.timeFormat = TimeFormat.timeAndSeconds}); - /// Date + /// The [DateTime] object to be formatted. final DateTime date; - /// Get time and seconds for display in UI - /// Format ['HH:mm:s ms'] + /// The [TimeFormat] to be used for formatting. + final TimeFormat? timeFormat; + + /// Returns a string representation of the time and seconds. + /// Format: ['HH:mm:s ms'] String get timeAndSeconds { final d = date; final minutesPadded = '${d.minute}'.padLeft(2, '0'); @@ -14,4 +21,20 @@ class TalkerDateTimeFormatter { return '${d.hour}:$minutesPadded:$secondsPadded ${d.millisecond}ms'; } + + /// Returns a string representation of the year, month, day, and time. + /// Format: ['YYYY-MM-DD HH:mm:s ms'] + String get yearMonthDayAndTime => + '${date.year}-${date.month}-${date.day} $timeAndSeconds'; + + String get format { + switch (timeFormat) { + case TimeFormat.timeAndSeconds: + return timeAndSeconds; + case TimeFormat.yearMonthDayAndTime: + return yearMonthDayAndTime; + case null: + return timeAndSeconds; + } + } } diff --git a/packages/talker/lib/src/utils/utils.dart b/packages/talker/lib/src/utils/utils.dart index e199c0b4..5d6af40a 100644 --- a/packages/talker/lib/src/utils/utils.dart +++ b/packages/talker/lib/src/utils/utils.dart @@ -1,2 +1,3 @@ export 'error_handler.dart'; export 'time_formatter.dart'; +export 'time_format.dart'; diff --git a/packages/talker/test/extensions_test.dart b/packages/talker/test/extensions_test.dart index 688ca117..ac8871bd 100644 --- a/packages/talker/test/extensions_test.dart +++ b/packages/talker/test/extensions_test.dart @@ -9,7 +9,7 @@ void main() { final log = TalkerLog('message'); final data = [error, exception, log]; - final fullMsg = data.text; + final fullMsg = data.text(); final expectedMsg = '${error.generateTextMessage()}\n${exception.generateTextMessage()}\n${log.generateTextMessage()}\n'; expect(fullMsg, expectedMsg); diff --git a/packages/talker/test/talker_data_test.dart b/packages/talker/test/talker_data_test.dart index 8ef15a85..921e7b42 100644 --- a/packages/talker/test/talker_data_test.dart +++ b/packages/talker/test/talker_data_test.dart @@ -44,7 +44,7 @@ void main() { expect( generatedMessage, equals( - '${talkerData.displayTitleWithTime}${talkerData.displayMessage}${talkerData.displayStackTrace}', + '${talkerData.displayTitleWithTime()}${talkerData.displayMessage}${talkerData.displayStackTrace}', ), ); }); @@ -58,7 +58,7 @@ void main() { time: dateTime, ); - final displayTitleWithTime = talkerData.displayTitleWithTime; + final displayTitleWithTime = talkerData.displayTitleWithTime(); expect( displayTitleWithTime, equals( @@ -101,7 +101,7 @@ void main() { time: dateTime, ); - final displayTime = talkerData.displayTime; + final displayTime = talkerData.displayTime(); expect(displayTime, equals(TalkerDateTimeFormatter(dateTime).timeAndSeconds)); }); diff --git a/packages/talker/test/talker_error_test.dart b/packages/talker/test/talker_error_test.dart index f6986b47..0020b3c7 100644 --- a/packages/talker/test/talker_error_test.dart +++ b/packages/talker/test/talker_error_test.dart @@ -31,7 +31,7 @@ void main() { expect( generatedMessage, equals( - '${talkerError.displayTitleWithTime}${talkerError.displayMessage}${talkerError.displayError}${talkerError.displayStackTrace}', + '${talkerError.displayTitleWithTime()}${talkerError.displayMessage}${talkerError.displayError}${talkerError.displayStackTrace}', ), ); }); diff --git a/packages/talker/test/talker_exception_test.dart b/packages/talker/test/talker_exception_test.dart index 28b5fe32..6a6af0ca 100644 --- a/packages/talker/test/talker_exception_test.dart +++ b/packages/talker/test/talker_exception_test.dart @@ -31,7 +31,7 @@ void main() { expect( generatedMessage, equals( - '${talkerException.displayTitleWithTime}${talkerException.displayMessage}${talkerException.displayException}${talkerException.displayStackTrace}', + '${talkerException.displayTitleWithTime()}${talkerException.displayMessage}${talkerException.displayException}${talkerException.displayStackTrace}', ), ); }); diff --git a/packages/talker/test/talker_settings_test.dart b/packages/talker/test/talker_settings_test.dart index 58ac16ff..2707b4bf 100644 --- a/packages/talker/test/talker_settings_test.dart +++ b/packages/talker/test/talker_settings_test.dart @@ -59,7 +59,8 @@ class HttpTalkerLog extends TalkerLog { AnsiPen get pen => AnsiPen()..blue(); @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return pen.write(message ?? ''); } } diff --git a/packages/talker_bloc_logger/lib/bloc_logs.dart b/packages/talker_bloc_logger/lib/bloc_logs.dart index 28964ade..3e37dbdf 100644 --- a/packages/talker_bloc_logger/lib/bloc_logs.dart +++ b/packages/talker_bloc_logger/lib/bloc_logs.dart @@ -20,13 +20,14 @@ class BlocEventLog extends TalkerLog { String get key => TalkerLogType.blocEvent.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return _createMessage(); } String _createMessage() { final sb = StringBuffer(); - sb.write(displayTitleWithTime); + sb.write(displayTitleWithTime()); sb.write('\n$message'); return sb.toString(); } @@ -48,13 +49,14 @@ class BlocStateLog extends TalkerLog { String get key => TalkerLogType.blocTransition.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return _createMessage(); } String _createMessage() { final sb = StringBuffer(); - sb.write(displayTitleWithTime); + sb.write(displayTitleWithTime()); sb.write('\n$message'); sb.write( '\n${'CURRENT state: ${settings.printStateFullData ? '\n${transition.currentState}' : transition.currentState.runtimeType}'}'); @@ -80,7 +82,8 @@ class BlocChangeLog extends TalkerLog { String get key => TalkerLogType.blocTransition.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return _createMessage(); } @@ -108,7 +111,8 @@ class BlocCreateLog extends TalkerLog { String? get key => TalkerLogType.blocCreate.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return _createMessage(); } @@ -132,7 +136,8 @@ class BlocCloseLog extends TalkerLog { String? get key => TalkerLogType.blocClose.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return _createMessage(); } diff --git a/packages/talker_dio_logger/lib/dio_logs.dart b/packages/talker_dio_logger/lib/dio_logs.dart index 5bbd4d4c..09edf6a6 100644 --- a/packages/talker_dio_logger/lib/dio_logs.dart +++ b/packages/talker_dio_logger/lib/dio_logs.dart @@ -23,7 +23,8 @@ class DioRequestLog extends TalkerLog { String get key => TalkerLogType.httpRequest.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { var msg = '[$title] [${requestOptions.method}] $message'; final data = requestOptions.data; @@ -62,7 +63,8 @@ class DioResponseLog extends TalkerLog { String get key => TalkerLogType.httpResponse.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { var msg = '[$title] [${response.requestOptions.method}] $message'; final responseMessage = response.statusMessage; @@ -108,7 +110,8 @@ class DioErrorLog extends TalkerLog { String get key => TalkerLogType.httpError.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { var msg = '[$title] [${dioException.requestOptions.method}] $message'; final responseMessage = dioException.message; diff --git a/packages/talker_flutter/lib/src/ui/talker_view.dart b/packages/talker_flutter/lib/src/ui/talker_view.dart index cd013833..667cacc1 100644 --- a/packages/talker_flutter/lib/src/ui/talker_view.dart +++ b/packages/talker_flutter/lib/src/ui/talker_view.dart @@ -157,7 +157,8 @@ class _TalkerViewState extends State { } void _copyTalkerDataItemText(TalkerData data) { - final text = data.generateTextMessage(); + final text = + data.generateTextMessage(timeFormat: widget.talker.settings.timeFormat); Clipboard.setData(ClipboardData(text: text)); _showSnackBar(context, 'Log item is copied in clipboard'); } @@ -212,7 +213,7 @@ class _TalkerViewState extends State { Future _shareLogsInFile() async { await _controller.downloadLogsFile( - widget.talker.history.text, + widget.talker.history.text(timeFormat: widget.talker.settings.timeFormat), ); } @@ -226,7 +227,9 @@ class _TalkerViewState extends State { } void _copyAllLogs(BuildContext context) { - Clipboard.setData(ClipboardData(text: widget.talker.history.text)); + Clipboard.setData(ClipboardData( + text: widget.talker.history + .text(timeFormat: widget.talker.settings.timeFormat))); _showSnackBar(context, 'All logs copied in buffer'); } } diff --git a/packages/talker_http_logger/lib/talker_http_logger.dart b/packages/talker_http_logger/lib/talker_http_logger.dart index 86230464..4e022d08 100644 --- a/packages/talker_http_logger/lib/talker_http_logger.dart +++ b/packages/talker_http_logger/lib/talker_http_logger.dart @@ -48,7 +48,8 @@ class HttpRequestLog extends TalkerLog { String get key => TalkerLogType.httpRequest.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { var msg = '[$title] [${request.method}] $message'; final headers = request.headers; @@ -80,7 +81,8 @@ class HttpResponseLog extends TalkerLog { String get title => TalkerLogType.httpResponse.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { var msg = '[$title] [${response.request?.method}] $message'; final headers = response.request?.headers; diff --git a/packages/talker_riverpod_logger/lib/riverpod_logs.dart b/packages/talker_riverpod_logger/lib/riverpod_logs.dart index cecd8e7f..5c931051 100644 --- a/packages/talker_riverpod_logger/lib/riverpod_logs.dart +++ b/packages/talker_riverpod_logger/lib/riverpod_logs.dart @@ -35,7 +35,8 @@ class RiverpodAddLog extends TalkerLog { String get key => TalkerLogType.riverpodAdd.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return _createMessage(); } @@ -75,7 +76,8 @@ class RiverpodUpdateLog extends TalkerLog { String get key => TalkerLogType.riverpodUpdate.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return _createMessage(); } @@ -110,7 +112,8 @@ class RiverpodDisposeLog extends TalkerLog { String get key => TalkerLogType.riverpodDispose.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return _createMessage(); } @@ -148,7 +151,8 @@ class RiverpodFailLog extends TalkerLog { String? get key => TalkerLogType.riverpodFail.key; @override - String generateTextMessage() { + String generateTextMessage( + {TimeFormat timeFormat = TimeFormat.timeAndSeconds}) { return _createMessage(); }