@@ -23,12 +23,19 @@ class Ansi {
2323 Ansi (this .useAnsi);
2424
2525 String get cyan => _code ('\u 001b[36m' );
26+
2627 String get green => _code ('\u 001b[32m' );
28+
2729 String get magenta => _code ('\u 001b[35m' );
30+
2831 String get red => _code ('\u 001b[31m' );
32+
2933 String get yellow => _code ('\u 001b[33m' );
34+
3035 String get blue => _code ('\u 001b[34m' );
36+
3137 String get gray => _code ('\u 001b[1;30m' );
38+
3239 String get noColor => _code ('\u 001b[39m' );
3340
3441 String get none => _code ('\u 001b[0m' );
@@ -55,10 +62,14 @@ class Ansi {
5562/// standard status messages, trace level output, and indeterminate progress.
5663abstract class Logger {
5764 /// 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);
5966
6067 /// 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+ }
6273
6374 Ansi get ansi;
6475
@@ -75,9 +86,9 @@ abstract class Logger {
7586
7687 /// Start an indeterminate progress display.
7788 Progress progress (String message);
78- void _progressFinished (Progress progress);
7989
8090 /// Flush any un-written output.
91+ @Deprecated ('This method will be removed in the future' )
8192 void flush ();
8293}
8394
@@ -86,7 +97,7 @@ abstract class Progress {
8697 final String message;
8798 final Stopwatch _stopwatch;
8899
89- Progress ._ (this .message) : _stopwatch = new Stopwatch ()..start ();
100+ Progress (this .message) : _stopwatch = new Stopwatch ()..start ();
90101
91102 Duration get elapsed => _stopwatch.elapsed;
92103
@@ -97,10 +108,10 @@ abstract class Progress {
97108 void cancel ();
98109}
99110
100- class _StandardLogger implements Logger {
111+ class StandardLogger implements Logger {
101112 Ansi ansi;
102113
103- _StandardLogger ({this .ansi}) {
114+ StandardLogger ({this .ansi}) {
104115 ansi ?? = new Ansi (Ansi .terminalSupportsAnsi);
105116 }
106117
@@ -109,67 +120,68 @@ class _StandardLogger implements Logger {
109120 Progress _currentProgress;
110121
111122 void stderr (String message) {
123+ if (_currentProgress != null ) {
124+ Progress progress = _currentProgress;
125+ _currentProgress = null ;
126+ progress.cancel ();
127+ }
128+
112129 io.stderr.writeln (message);
113- _currentProgress? .cancel ();
114- _currentProgress = null ;
115130 }
116131
117132 void stdout (String message) {
133+ if (_currentProgress != null ) {
134+ Progress progress = _currentProgress;
135+ _currentProgress = null ;
136+ progress.cancel ();
137+ }
138+
118139 print (message);
119- _currentProgress? .cancel ();
120- _currentProgress = null ;
121140 }
122141
123142 void trace (String message) {}
124143
125144 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+ }
128150
129151 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);
132154 _currentProgress = progress;
133155 return progress;
134156 }
135157
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' )
142159 void flush () {}
143160}
144161
145- class _SimpleProgress extends Progress {
162+ class SimpleProgress extends Progress {
146163 final Logger logger;
147164
148- _SimpleProgress (this .logger, String message) : super ._ (message) {
165+ SimpleProgress (this .logger, String message) : super (message) {
149166 logger.stdout ('$message ...' );
150167 }
151168
152169 @override
153- void cancel () {
154- logger._progressFinished (this );
155- }
170+ void cancel () {}
156171
157172 @override
158- void finish ({String message, bool showTiming}) {
159- logger._progressFinished (this );
160- }
173+ void finish ({String message, bool showTiming}) {}
161174}
162175
163- class _AnsiProgress extends Progress {
176+ class AnsiProgress extends Progress {
164177 static const List <String > kAnimationItems = const ['/' , '-' , '\\ ' , '|' ];
165178
166- final Logger logger;
167179 final Ansi ansi;
168180
169181 int _index = 0 ;
170182 Timer _timer;
171183
172- _AnsiProgress (this .logger, this . ansi, String message) : super ._ (message) {
184+ AnsiProgress (this .ansi, String message) : super (message) {
173185 io.stdout.write ('${message }... ' .padRight (40 ));
174186
175187 _timer = new Timer .periodic (new Duration (milliseconds: 80 ), (t) {
@@ -185,7 +197,6 @@ class _AnsiProgress extends Progress {
185197 if (_timer.isActive) {
186198 _timer.cancel ();
187199 _updateDisplay (cancelled: true );
188- logger._progressFinished (this );
189200 }
190201 }
191202
@@ -194,7 +205,6 @@ class _AnsiProgress extends Progress {
194205 if (_timer.isActive) {
195206 _timer.cancel ();
196207 _updateDisplay (isFinal: true , message: message, showTiming: showTiming);
197- logger._progressFinished (this );
198208 }
199209 }
200210
@@ -222,52 +232,55 @@ class _AnsiProgress extends Progress {
222232 }
223233}
224234
225- class _VerboseLogger implements Logger {
235+ class VerboseLogger implements Logger {
226236 Ansi ansi;
237+ bool logTime;
227238 Stopwatch _timer;
228239
229- String _previousErr;
230- String _previousMsg;
231-
232- _VerboseLogger ({this .ansi}) {
240+ VerboseLogger ({this .ansi, this .logTime}) {
233241 ansi ?? = new Ansi (Ansi .terminalSupportsAnsi);
242+ logTime ?? = false ;
243+
234244 _timer = new Stopwatch ()..start ();
235245 }
236246
237247 bool get isVerbose => true ;
238248
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 ' );
242251 }
243252
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 }' );
247255 }
248256
249257 void trace (String message) {
250- flush ();
251- _previousMsg = '${ansi .gray }$message ${ansi .none }' ;
258+ io.stdout.writeln ('${_createPrefix ()}${ansi .gray }$message ${ansi .none }' );
252259 }
253260
254- Progress progress (String message) => new _SimpleProgress (this , message);
261+ Progress progress (String message) => new SimpleProgress (this , message);
255262
256- void _progressFinished (Progress progress) {}
263+ @Deprecated ('This method will be removed in the future' )
264+ void flush () {}
257265
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 '' ;
265269 }
266- }
267270
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 )}] ' ;
272285 }
273286}
0 commit comments