Skip to content

Commit 40ae23f

Browse files
committed
Replace println calls with enforcable signature
Having the `log` call return a `List<String>` instead of `void` has several advantages. It makes the printers testable. The `buffer` field was not accessable in the tests. It also decouples printers from the main logger. Yet an other advantage is that, instead of imploring implementers of custom printer classes to use `println` we now enforce it via the type interface. This leads to less confusion.
1 parent 7b0182f commit 40ae23f

File tree

6 files changed

+44
-39
lines changed

6 files changed

+44
-39
lines changed

README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,12 @@ A very basic printer could look like this:
116116
```dart
117117
class MyPrinter extends LogPrinter {
118118
@override
119-
void log(LogEvent event) {
120-
println(event.message);
119+
List<String> log(LogEvent event) {
120+
return [event.message];
121121
}
122122
}
123123
```
124124

125-
**Important:** Every implementation has to send its output using the `println()` method.
126-
127125
If you created a cool `LogPrinter` which might be helpful to others, feel free to open a pull request. :)
128126

129127

lib/src/log_printer.dart

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,11 @@ import 'package:logger/src/logger.dart';
88
///
99
/// You can implement a `LogPrinter` from scratch or extend [PrettyPrinter].
1010
abstract class LogPrinter {
11-
List<String> buffer;
12-
1311
void init() {}
1412

1513
/// Is called every time a new [LogEvent] is sent and handles printing or
1614
/// storing the message.
17-
void log(LogEvent event);
15+
List<String> log(LogEvent event);
1816

1917
void destroy() {}
20-
21-
/// Sends a line to the [LogOutput].
22-
void println(String line) {
23-
buffer.add(line);
24-
}
2518
}

lib/src/logger.dart

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ class Logger {
4949
final LogFilter _filter;
5050
final LogPrinter _printer;
5151
final LogOutput _output;
52-
List<String> _outputBuffer = [];
5352
bool _active = true;
5453

5554
/// Create a new instance of Logger.
@@ -66,7 +65,6 @@ class Logger {
6665
_printer = printer ?? PrettyPrinter(),
6766
_output = output ?? ConsoleOutput() {
6867
_filter.init();
69-
_printer.buffer = _outputBuffer;
7068
_filter.level = level ?? Logger.level;
7169
_printer.init();
7270
_output.init();
@@ -117,27 +115,23 @@ class Logger {
117115
for (var callback in _logCallbacks) {
118116
callback(logEvent);
119117
}
120-
_printer.log(logEvent);
118+
var output = _printer.log(logEvent);
121119

122-
if (_outputBuffer.isNotEmpty) {
123-
var outputEvent = OutputEvent(level, _outputBuffer);
120+
if (output.isNotEmpty) {
121+
var outputEvent = OutputEvent(level, output);
124122
for (var callback in _outputCallbacks) {
125123
callback(outputEvent);
126124
}
127125
_output.output(outputEvent);
128-
_outputBuffer = [];
129-
_printer.buffer = _outputBuffer;
130126
}
131127
}
132128
}
133129

134130
/// Closes the logger and releases all resources.
135131
void close() {
136132
_active = false;
137-
_outputBuffer = null;
138133
_filter.destroy();
139134
_printer.destroy();
140-
_printer.buffer = null;
141135
_output.destroy();
142136
}
143137

lib/src/printers/pretty_printer.dart

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class PrettyPrinter extends LogPrinter {
8282
}
8383

8484
@override
85-
void log(LogEvent event) {
85+
List<String> log(LogEvent event) {
8686
var messageStr = stringifyMessage(event.message);
8787

8888
String stackTraceStr;
@@ -101,7 +101,13 @@ class PrettyPrinter extends LogPrinter {
101101
timeStr = getTime();
102102
}
103103

104-
formatAndPrint(event.level, messageStr, timeStr, errorStr, stackTraceStr);
104+
return _formatAndPrint(
105+
event.level,
106+
messageStr,
107+
timeStr,
108+
errorStr,
109+
stackTraceStr,
110+
);
105111
}
106112

107113
String formatStackTrace(StackTrace stackTrace, int methodCount) {
@@ -190,40 +196,48 @@ class PrettyPrinter extends LogPrinter {
190196
}
191197
}
192198

193-
formatAndPrint(Level level, String message, String time, String error,
194-
String stacktrace) {
199+
List<String> _formatAndPrint(
200+
Level level,
201+
String message,
202+
String time,
203+
String error,
204+
String stacktrace,
205+
) {
206+
List<String> buffer = [];
195207
var color = _getLevelColor(level);
196-
println(color(_topBorder));
208+
buffer.add(color(_topBorder));
197209

198210
if (error != null) {
199211
var errorColor = _getErrorColor(level);
200212
for (var line in error.split('\n')) {
201-
println(
213+
buffer.add(
202214
color('$verticalLine ') +
203215
errorColor.resetForeground +
204216
errorColor(line) +
205217
errorColor.resetBackground,
206218
);
207219
}
208-
println(color(_middleBorder));
220+
buffer.add(color(_middleBorder));
209221
}
210222

211223
if (stacktrace != null) {
212224
for (var line in stacktrace.split('\n')) {
213-
println('${color}$verticalLine $line');
225+
buffer.add('${color}$verticalLine $line');
214226
}
215-
println(color(_middleBorder));
227+
buffer.add(color(_middleBorder));
216228
}
217229

218230
if (time != null) {
219-
println(color('$verticalLine $time'));
220-
println(color(_middleBorder));
231+
buffer.add(color('$verticalLine $time'));
232+
buffer.add(color(_middleBorder));
221233
}
222234

223235
var emoji = _getEmoji(level);
224236
for (var line in message.split('\n')) {
225-
println(color('$verticalLine $emoji$line'));
237+
buffer.add(color('$verticalLine $emoji$line'));
226238
}
227-
println(color(_bottomBorder));
239+
buffer.add(color(_bottomBorder));
240+
241+
return buffer;
228242
}
229243
}

lib/src/printers/simple_printer.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ class SimplePrinter extends LogPrinter {
2222
SimplePrinter({this.printTime = false});
2323

2424
@override
25-
void log(LogEvent event) {
25+
List<String> log(LogEvent event) {
2626
var messageStr = stringifyMessage(event.message);
2727
var errorStr = event.error != null ? " ERROR: ${event.error}" : "";
2828
var timeStr = printTime ? "TIME: ${DateTime.now().toIso8601String()}" : "";
29-
println("${levelPrefixes[event.level]} $timeStr $messageStr$errorStr");
29+
return ["${levelPrefixes[event.level]} $timeStr $messageStr$errorStr"];
3030
}
3131

3232
String stringifyMessage(dynamic message) {

test/logger_test.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'dart:math';
33
import 'package:test/test.dart';
44
import 'package:logger/logger.dart';
55

6-
typedef PrinterCallback = void Function(
6+
typedef PrinterCallback = List<String> Function(
77
Level level, dynamic message, dynamic error, StackTrace stackTrace);
88

99
class _AlwaysFilter extends LogFilter {
@@ -22,8 +22,13 @@ class _CallbackPrinter extends LogPrinter {
2222
_CallbackPrinter(this.callback);
2323

2424
@override
25-
void log(LogEvent event) {
26-
callback(event.level, event.message, event.error, event.stackTrace);
25+
List<String> log(LogEvent event) {
26+
return callback(
27+
event.level,
28+
event.message,
29+
event.error,
30+
event.stackTrace,
31+
);
2732
}
2833
}
2934

@@ -37,6 +42,7 @@ void main() {
3742
printedMessage = m;
3843
printedError = e;
3944
printedStackTrace = s;
45+
return [];
4046
});
4147

4248
setUp(() {

0 commit comments

Comments
 (0)