|
1 | 1 | import click |
2 | | -from six import string_types |
| 2 | +import six |
3 | 3 |
|
4 | 4 | from .config import config |
5 | 5 |
|
6 | 6 |
|
7 | | -def _log(message, color=None, err=False): |
8 | | - message = str(message) |
9 | | - color = color if config.USE_CONSOLE_COLORS else None |
10 | | - click.secho(message, fg=color, err=err) |
11 | | - |
12 | | - |
13 | | -def log(message, color=None, err=False): |
14 | | - _log(message, color=color, err=err) |
15 | | - |
16 | | - |
17 | | -def error(message): |
18 | | - color = "red" if config.USE_CONSOLE_COLORS else None |
19 | | - _log(message, color=color, err=True) |
20 | | - |
21 | | - |
22 | | -def warning(message): |
23 | | - color = "yellow" if config.USE_CONSOLE_COLORS else None |
24 | | - _log(message, color=color) |
25 | | - |
26 | | - |
27 | | -def log_error_response(data): |
28 | | - error_str = data.get("error") |
29 | | - details = data.get("details") |
30 | | - message = data.get("message") |
31 | | - |
32 | | - if not any((error_str, details, message)): |
33 | | - raise ValueError("No error messages found") |
34 | | - |
35 | | - if error_str: |
36 | | - try: |
37 | | - error(error_str["message"]) |
38 | | - except (KeyError, TypeError): |
39 | | - error(str(error_str)) |
40 | | - |
41 | | - if details: |
42 | | - if isinstance(details, dict): |
43 | | - for key, val in details.items(): |
44 | | - if isinstance(val, string_types): |
45 | | - val = [val] |
46 | | - |
47 | | - for v in val: |
48 | | - msg = "{}: {}".format(key, str(v)) |
49 | | - error(msg) |
| 7 | +class Logger(object): |
| 8 | + def _log(self, message, color=None, err=False): |
| 9 | + message = str(message) |
| 10 | + color = color if config.USE_CONSOLE_COLORS else None |
| 11 | + click.secho(message, fg=color, err=err) |
| 12 | + |
| 13 | + def log(self, message, color=None, err=False): |
| 14 | + self._log(message, color=color, err=err) |
| 15 | + |
| 16 | + def error(self, message): |
| 17 | + color = "red" if config.USE_CONSOLE_COLORS else None |
| 18 | + self._log(message, color=color, err=True) |
| 19 | + |
| 20 | + def warning(self, message): |
| 21 | + color = "yellow" if config.USE_CONSOLE_COLORS else None |
| 22 | + self._log(message, color=color) |
| 23 | + |
| 24 | + def log_error_response(self, data): |
| 25 | + messages = list(self._get_error_messages(data)) |
| 26 | + msg = "\n".join(messages) |
| 27 | + |
| 28 | + if not msg: |
| 29 | + raise ValueError("No error messages found") |
| 30 | + |
| 31 | + self.error(msg) |
| 32 | + |
| 33 | + def _get_error_messages(self, data, add_prefix=False): |
| 34 | + if isinstance(data, dict): |
| 35 | + for key, value in sorted(data.items()): |
| 36 | + if key in ("error", "errors", "message", "messages"): |
| 37 | + for message in self._get_error_messages(value): |
| 38 | + yield message |
| 39 | + |
| 40 | + # when key == "details" and value is a dict then values should be prefixed with key |
| 41 | + if add_prefix: |
| 42 | + for message in self._get_error_messages(value): |
| 43 | + # there is some useless message in data["context"] |
| 44 | + if key != "context": |
| 45 | + yield key + ": " + message |
| 46 | + if key == "details": |
| 47 | + for message in self._get_error_messages(value, add_prefix=True): |
| 48 | + yield message |
| 49 | + |
| 50 | + if isinstance(data, list): |
| 51 | + for element in data: |
| 52 | + for message in self._get_error_messages(element): |
| 53 | + yield message |
| 54 | + |
| 55 | + if isinstance(data, six.string_types): |
| 56 | + yield data |
| 57 | + |
| 58 | + def debug(self, message): |
| 59 | + if config.DEBUG: |
| 60 | + self._log("DEBUG: {}".format(message)) |
| 61 | + |
| 62 | + def log_response(self, response, success_msg, error_msg): |
| 63 | + if response.ok: |
| 64 | + self._log(success_msg) |
50 | 65 | else: |
51 | | - error(details) |
52 | | - |
53 | | - if message: |
54 | | - error(str(message)) |
55 | | - |
56 | | - |
57 | | -def debug(message): |
58 | | - if config.DEBUG: |
59 | | - log("DEBUG: {}".format(message)) |
60 | | - |
61 | | - |
62 | | -def log_response(response, success_msg, error_msg): |
63 | | - if response.ok: |
64 | | - log(success_msg) |
65 | | - else: |
66 | | - try: |
67 | | - data = response.json() |
68 | | - log_error_response(data) |
69 | | - except ValueError: |
70 | | - error(error_msg) |
| 66 | + try: |
| 67 | + data = response.json() |
| 68 | + self.log_error_response(data) |
| 69 | + except ValueError: |
| 70 | + self.error(error_msg) |
0 commit comments