Skip to content
This repository was archived by the owner on Nov 1, 2024. It is now read-only.

Commit 352a8f8

Browse files
authored
Merge pull request #31 from dart-lang/change_verbose_logging
Change verbose logging
2 parents f1becff + e838ecb commit 352a8f8

File tree

6 files changed

+89
-62
lines changed

6 files changed

+89
-62
lines changed

.travis.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
language: dart
2+
dart:
3+
- dev
24
script: ./tool/travis.sh
35
dist: trusty
46
sudo: false
7+
8+
branches:
9+
only:
10+
- master

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 0.1.3
2+
- In verbose mode, instead of printing the diff from the last log message,
3+
print the total time since the tool started
4+
- Change to not buffer the last log message sent in verbose logging mode
5+
- Expose more classes from the logging library
6+
17
## 0.1.2+1
28

39
- Remove unneeded change to Dart SDK constraint.

example/main.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,4 @@ main(List<String> args) async {
2121
progress.finish(showTiming: true);
2222

2323
logger.stdout('All ${logger.ansi.emphasized('done')}.');
24-
logger.flush();
2524
}

lib/cli_logging.dart

Lines changed: 73 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,19 @@ class Ansi {
2323
Ansi(this.useAnsi);
2424

2525
String get cyan => _code('\u001b[36m');
26+
2627
String get green => _code('\u001b[32m');
28+
2729
String get magenta => _code('\u001b[35m');
30+
2831
String get red => _code('\u001b[31m');
32+
2933
String get yellow => _code('\u001b[33m');
34+
3035
String get blue => _code('\u001b[34m');
36+
3137
String get gray => _code('\u001b[1;30m');
38+
3239
String get noColor => _code('\u001b[39m');
3340

3441
String get none => _code('\u001b[0m');
@@ -55,10 +62,14 @@ class Ansi {
5562
/// standard status messages, trace level output, and indeterminate progress.
5663
abstract 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
}

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: cli_util
2-
version: 0.1.2+1
2+
version: 0.1.3
33
author: Dart Team <[email protected]>
44
description: A library to help in building Dart command-line apps.
55
homepage: https://github.com/dart-lang/cli_util

tool/travis.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ dartanalyzer --fatal-warnings \
1515
# Run the tests.
1616
dart test/cli_util_test.dart
1717

18+
# Ensure we can run in Dart 2.
19+
dart --preview-dart-2 example/main.dart
20+
1821
# Install dart_coveralls; gather and send coverage data.
1922
if [ "$COVERALLS_TOKEN" ]; then
2023
pub global activate dart_coveralls

0 commit comments

Comments
 (0)