OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 /// Generic utility functions. Stuff that should possibly be in core. | 5 /// Generic utility functions. Stuff that should possibly be in core. |
6 library pub.utils; | 6 library pub.utils; |
7 | 7 |
8 import 'dart:async'; | 8 import 'dart:async'; |
9 import "dart:collection"; | 9 import "dart:collection"; |
10 import "dart:convert"; | 10 import "dart:convert"; |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 /// path. | 613 /// path. |
614 String nicePath(String inputPath) { | 614 String nicePath(String inputPath) { |
615 var relative = path.relative(inputPath); | 615 var relative = path.relative(inputPath); |
616 var split = path.split(relative); | 616 var split = path.split(relative); |
617 if (split.length > 1 && split[0] == '..' && split[1] == '..') { | 617 if (split.length > 1 && split[0] == '..' && split[1] == '..') { |
618 return path.absolute(inputPath); | 618 return path.absolute(inputPath); |
619 } | 619 } |
620 return relative; | 620 return relative; |
621 } | 621 } |
622 | 622 |
| 623 /// Returns a human-friendly representation of [duration]. |
| 624 String niceDuration(Duration duration) { |
| 625 var result = duration.inMinutes > 0 ? "${duration.inMinutes}:" : ""; |
| 626 |
| 627 var s = duration.inSeconds % 59; |
| 628 var ms = (duration.inMilliseconds % 1000) ~/ 100; |
| 629 return result + "$s.${ms}s"; |
| 630 } |
| 631 |
623 /// Decodes a URL-encoded string. Unlike [Uri.decodeComponent], this includes | 632 /// Decodes a URL-encoded string. Unlike [Uri.decodeComponent], this includes |
624 /// replacing `+` with ` `. | 633 /// replacing `+` with ` `. |
625 String urlDecode(String encoded) => | 634 String urlDecode(String encoded) => |
626 Uri.decodeComponent(encoded.replaceAll("+", " ")); | 635 Uri.decodeComponent(encoded.replaceAll("+", " ")); |
627 | 636 |
628 /// Takes a simple data structure (composed of [Map]s, [Iterable]s, scalar | 637 /// Takes a simple data structure (composed of [Map]s, [Iterable]s, scalar |
629 /// objects, and [Future]s) and recursively resolves all the [Future]s contained | 638 /// objects, and [Future]s) and recursively resolves all the [Future]s contained |
630 /// within. Completes with the fully resolved structure. | 639 /// within. Completes with the fully resolved structure. |
631 Future awaitObject(object) { | 640 Future awaitObject(object) { |
632 // Unroll nested futures. | 641 // Unroll nested futures. |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 // This refers to http.ClientException. | 846 // This refers to http.ClientException. |
838 'ClientException', | 847 'ClientException', |
839 // Errors coming from the Dart analyzer are probably caused by syntax errors | 848 // Errors coming from the Dart analyzer are probably caused by syntax errors |
840 // in user code, so they're user-facing. | 849 // in user code, so they're user-facing. |
841 'AnalyzerError', 'AnalyzerErrorGroup', | 850 'AnalyzerError', 'AnalyzerErrorGroup', |
842 // An error spawning an isolate probably indicates a transformer with an | 851 // An error spawning an isolate probably indicates a transformer with an |
843 // invalid import. | 852 // invalid import. |
844 'IsolateSpawnException', | 853 'IsolateSpawnException', |
845 // TODO(nweiz): clean up the dart:io errors when issue 9955 is fixed. | 854 // TODO(nweiz): clean up the dart:io errors when issue 9955 is fixed. |
846 'FileSystemException', 'HttpException', 'OSError', | 855 'FileSystemException', 'HttpException', 'OSError', |
847 'ProcessException', 'SocketException', 'WebSocketException' | 856 'ProcessException', 'SocketException', 'TimeoutException', |
| 857 'WebSocketException' |
848 ]); | 858 ]); |
849 | 859 |
850 /// Returns whether [error] is a user-facing error object. This includes both | 860 /// Returns whether [error] is a user-facing error object. This includes both |
851 /// [ApplicationException] and any dart:io errors. | 861 /// [ApplicationException] and any dart:io errors. |
852 bool isUserFacingException(error) { | 862 bool isUserFacingException(error) { |
853 if (error is CrossIsolateException) { | 863 if (error is CrossIsolateException) { |
854 return _userFacingExceptions.contains(error.type); | 864 return _userFacingExceptions.contains(error.type); |
855 } | 865 } |
856 | 866 |
857 // TODO(nweiz): unify this list with _userFacingExceptions when issue 5897 is | 867 // TODO(nweiz): unify this list with _userFacingExceptions when issue 5897 is |
858 // fixed. | 868 // fixed. |
859 return error is ApplicationException || | 869 return error is ApplicationException || |
860 error is AnalyzerError || | 870 error is AnalyzerError || |
861 error is AnalyzerErrorGroup || | 871 error is AnalyzerErrorGroup || |
862 error is IsolateSpawnException || | 872 error is IsolateSpawnException || |
863 error is FileSystemException || | 873 error is FileSystemException || |
864 error is HttpException || | 874 error is HttpException || |
865 error is http.ClientException || | 875 error is http.ClientException || |
866 error is OSError || | 876 error is OSError || |
867 error is ProcessException || | 877 error is ProcessException || |
| 878 error is TimeoutException || |
868 error is SocketException || | 879 error is SocketException || |
869 error is WebSocketException; | 880 error is WebSocketException; |
870 } | 881 } |
OLD | NEW |