@@ -23,12 +23,19 @@ class Ansi {
23
23
Ansi (this .useAnsi);
24
24
25
25
String get cyan => _code ('\u 001b[36m' );
26
+
26
27
String get green => _code ('\u 001b[32m' );
28
+
27
29
String get magenta => _code ('\u 001b[35m' );
30
+
28
31
String get red => _code ('\u 001b[31m' );
32
+
29
33
String get yellow => _code ('\u 001b[33m' );
34
+
30
35
String get blue => _code ('\u 001b[34m' );
36
+
31
37
String get gray => _code ('\u 001b[1;30m' );
38
+
32
39
String get noColor => _code ('\u 001b[39m' );
33
40
34
41
String get none => _code ('\u 001b[0m' );
@@ -55,10 +62,14 @@ class Ansi {
55
62
/// standard status messages, trace level output, and indeterminate progress.
56
63
abstract class Logger {
57
64
/// Create a normal [Logger] ; this logger will not display trace level output.
58
- factory Logger .standard ({Ansi ansi}) => new _StandardLogger (ansi: ansi);
65
+ factory Logger .standard ({Ansi ansi}) => new StandardLogger (ansi: ansi);
59
66
60
67
/// Create a [Logger] that will display trace level output.
61
- factory Logger .verbose ({Ansi ansi}) => new _VerboseLogger (ansi: ansi);
68
+ ///
69
+ /// If [logTime] is `true` , this logger will display the time of the message.
70
+ factory Logger .verbose ({Ansi ansi, bool logTime: true }) {
71
+ return new VerboseLogger (ansi: ansi, logTime: logTime);
72
+ }
62
73
63
74
Ansi get ansi;
64
75
@@ -75,9 +86,9 @@ abstract class Logger {
75
86
76
87
/// Start an indeterminate progress display.
77
88
Progress progress (String message);
78
- void _progressFinished (Progress progress);
79
89
80
90
/// Flush any un-written output.
91
+ @Deprecated ('This method will be removed in the future' )
81
92
void flush ();
82
93
}
83
94
@@ -86,7 +97,7 @@ abstract class Progress {
86
97
final String message;
87
98
final Stopwatch _stopwatch;
88
99
89
- Progress ._ (this .message) : _stopwatch = new Stopwatch ()..start ();
100
+ Progress (this .message) : _stopwatch = new Stopwatch ()..start ();
90
101
91
102
Duration get elapsed => _stopwatch.elapsed;
92
103
@@ -97,10 +108,10 @@ abstract class Progress {
97
108
void cancel ();
98
109
}
99
110
100
- class _StandardLogger implements Logger {
111
+ class StandardLogger implements Logger {
101
112
Ansi ansi;
102
113
103
- _StandardLogger ({this .ansi}) {
114
+ StandardLogger ({this .ansi}) {
104
115
ansi ?? = new Ansi (Ansi .terminalSupportsAnsi);
105
116
}
106
117
@@ -109,67 +120,68 @@ class _StandardLogger implements Logger {
109
120
Progress _currentProgress;
110
121
111
122
void stderr (String message) {
123
+ if (_currentProgress != null ) {
124
+ Progress progress = _currentProgress;
125
+ _currentProgress = null ;
126
+ progress.cancel ();
127
+ }
128
+
112
129
io.stderr.writeln (message);
113
- _currentProgress? .cancel ();
114
- _currentProgress = null ;
115
130
}
116
131
117
132
void stdout (String message) {
133
+ if (_currentProgress != null ) {
134
+ Progress progress = _currentProgress;
135
+ _currentProgress = null ;
136
+ progress.cancel ();
137
+ }
138
+
118
139
print (message);
119
- _currentProgress? .cancel ();
120
- _currentProgress = null ;
121
140
}
122
141
123
142
void trace (String message) {}
124
143
125
144
Progress progress (String message) {
126
- _currentProgress? .cancel ();
127
- _currentProgress = null ;
145
+ if (_currentProgress != null ) {
146
+ Progress progress = _currentProgress;
147
+ _currentProgress = null ;
148
+ progress.cancel ();
149
+ }
128
150
129
151
Progress progress = ansi.useAnsi
130
- ? new _AnsiProgress ( this , ansi, message)
131
- : new _SimpleProgress (this , message);
152
+ ? new AnsiProgress ( ansi, message)
153
+ : new SimpleProgress (this , message);
132
154
_currentProgress = progress;
133
155
return progress;
134
156
}
135
157
136
- void _progressFinished (Progress progress) {
137
- if (_currentProgress == progress) {
138
- _currentProgress = null ;
139
- }
140
- }
141
-
158
+ @Deprecated ('This method will be removed in the future' )
142
159
void flush () {}
143
160
}
144
161
145
- class _SimpleProgress extends Progress {
162
+ class SimpleProgress extends Progress {
146
163
final Logger logger;
147
164
148
- _SimpleProgress (this .logger, String message) : super ._ (message) {
165
+ SimpleProgress (this .logger, String message) : super (message) {
149
166
logger.stdout ('$message ...' );
150
167
}
151
168
152
169
@override
153
- void cancel () {
154
- logger._progressFinished (this );
155
- }
170
+ void cancel () {}
156
171
157
172
@override
158
- void finish ({String message, bool showTiming}) {
159
- logger._progressFinished (this );
160
- }
173
+ void finish ({String message, bool showTiming}) {}
161
174
}
162
175
163
- class _AnsiProgress extends Progress {
176
+ class AnsiProgress extends Progress {
164
177
static const List <String > kAnimationItems = const ['/' , '-' , '\\ ' , '|' ];
165
178
166
- final Logger logger;
167
179
final Ansi ansi;
168
180
169
181
int _index = 0 ;
170
182
Timer _timer;
171
183
172
- _AnsiProgress (this .logger, this . ansi, String message) : super ._ (message) {
184
+ AnsiProgress (this .ansi, String message) : super (message) {
173
185
io.stdout.write ('${message }... ' .padRight (40 ));
174
186
175
187
_timer = new Timer .periodic (new Duration (milliseconds: 80 ), (t) {
@@ -185,7 +197,6 @@ class _AnsiProgress extends Progress {
185
197
if (_timer.isActive) {
186
198
_timer.cancel ();
187
199
_updateDisplay (cancelled: true );
188
- logger._progressFinished (this );
189
200
}
190
201
}
191
202
@@ -194,7 +205,6 @@ class _AnsiProgress extends Progress {
194
205
if (_timer.isActive) {
195
206
_timer.cancel ();
196
207
_updateDisplay (isFinal: true , message: message, showTiming: showTiming);
197
- logger._progressFinished (this );
198
208
}
199
209
}
200
210
@@ -222,52 +232,55 @@ class _AnsiProgress extends Progress {
222
232
}
223
233
}
224
234
225
- class _VerboseLogger implements Logger {
235
+ class VerboseLogger implements Logger {
226
236
Ansi ansi;
237
+ bool logTime;
227
238
Stopwatch _timer;
228
239
229
- String _previousErr;
230
- String _previousMsg;
231
-
232
- _VerboseLogger ({this .ansi}) {
240
+ VerboseLogger ({this .ansi, this .logTime}) {
233
241
ansi ?? = new Ansi (Ansi .terminalSupportsAnsi);
242
+ logTime ?? = false ;
243
+
234
244
_timer = new Stopwatch ()..start ();
235
245
}
236
246
237
247
bool get isVerbose => true ;
238
248
239
- void stderr (String message) {
240
- flush ();
241
- _previousErr = '${ansi .red }$message ${ansi .none }' ;
249
+ void stdout (String message) {
250
+ io.stdout.writeln ('${_createPrefix ()}$message ' );
242
251
}
243
252
244
- void stdout (String message) {
245
- flush ();
246
- _previousMsg = message;
253
+ void stderr (String message) {
254
+ io.stderr.writeln ('${_createPrefix ()}${ansi .red }$message ${ansi .none }' );
247
255
}
248
256
249
257
void trace (String message) {
250
- flush ();
251
- _previousMsg = '${ansi .gray }$message ${ansi .none }' ;
258
+ io.stdout.writeln ('${_createPrefix ()}${ansi .gray }$message ${ansi .none }' );
252
259
}
253
260
254
- Progress progress (String message) => new _SimpleProgress (this , message);
261
+ Progress progress (String message) => new SimpleProgress (this , message);
255
262
256
- void _progressFinished (Progress progress) {}
263
+ @Deprecated ('This method will be removed in the future' )
264
+ void flush () {}
257
265
258
- void flush () {
259
- if (_previousErr != null ) {
260
- io.stderr.writeln ('${_createTag ()} $_previousErr ' );
261
- _previousErr = null ;
262
- } else if (_previousMsg != null ) {
263
- io.stdout.writeln ('${_createTag ()} $_previousMsg ' );
264
- _previousMsg = null ;
266
+ String _createPrefix () {
267
+ if (! logTime) {
268
+ return '' ;
265
269
}
266
- }
267
270
268
- String _createTag () {
269
- int millis = _timer.elapsedMilliseconds;
270
- _timer.reset ();
271
- return '[${millis .toString ().padLeft (4 )} ms]' ;
271
+ double seconds = _timer.elapsedMilliseconds / 1000.0 ;
272
+ int minutes = seconds ~ / 60 ;
273
+ seconds -= minutes * 60.0 ;
274
+
275
+ StringBuffer buf = new StringBuffer ();
276
+ if (minutes > 0 ) {
277
+ buf.write ((minutes % 60 ));
278
+ buf.write ('m ' );
279
+ }
280
+
281
+ buf.write (seconds.toStringAsFixed (3 ).padLeft (minutes > 0 ? 6 : 1 , '0' ));
282
+ buf.write ('s' );
283
+
284
+ return '[${buf .toString ().padLeft (11 )}] ' ;
272
285
}
273
286
}
0 commit comments