|
19 | 19 | """ |
20 | 20 |
|
21 | 21 | import os |
| 22 | +import re |
22 | 23 | import sys |
23 | | -from typing import Set |
| 24 | +from typing import List, Pattern |
24 | 25 |
|
25 | 26 | LogName = str |
26 | 27 |
|
27 | 28 |
|
28 | 29 | class DebugLogger: |
29 | 30 | def __init__(self) -> None: |
30 | | - self._enabled: Set[str] = set() |
31 | | - for name in (os.environ.get("DEBUG") or "").split(","): |
32 | | - name = name.strip() |
33 | | - if name == "pw:*": |
34 | | - self._enabled.update({"api", "channel"}) |
35 | | - elif name.startswith("pw:"): |
36 | | - self._enabled.add(name[3:]) |
| 31 | + # Python: the names of the `debug` npm package, which debugLogger.ts uses: |
| 32 | + # DEBUG is a list of names, split on commas and spaces; `*` in a name |
| 33 | + # matches anything; a name that starts with `-` turns its matches off. |
| 34 | + self._names: List[Pattern[str]] = [] |
| 35 | + self._skips: List[Pattern[str]] = [] |
| 36 | + for name in re.split(r"[\s,]+", (os.environ.get("DEBUG") or "").strip()): |
| 37 | + if not name: |
| 38 | + continue |
| 39 | + if name.startswith("-"): |
| 40 | + self._skips.append(_template(name[1:])) |
| 41 | + else: |
| 42 | + self._names.append(_template(name)) |
37 | 43 |
|
38 | 44 | def log(self, name: LogName, message: object) -> None: |
39 | 45 | if self.is_enabled(name): |
40 | 46 | print(f"pw:{name} {message}", file=sys.stderr) |
41 | 47 |
|
42 | 48 | def is_enabled(self, name: LogName) -> bool: |
43 | | - return name in self._enabled |
| 49 | + full_name = "pw:" + name |
| 50 | + if any(skip.match(full_name) for skip in self._skips): |
| 51 | + return False |
| 52 | + return any(enabled.match(full_name) for enabled in self._names) |
| 53 | + |
| 54 | + |
| 55 | +def _template(name: str) -> Pattern[str]: |
| 56 | + # matchesTemplate() of the `debug` package: `*` matches any text. |
| 57 | + return re.compile( |
| 58 | + "^" + ".*".join(re.escape(part) for part in name.split("*")) + "$" |
| 59 | + ) |
44 | 60 |
|
45 | 61 |
|
46 | 62 | debug_logger = DebugLogger() |
0 commit comments