| 94 | |
| 95 | |
| 96 | class Log: |
| 97 | def __init__(self) -> None: |
| 98 | self._entries = [] |
| 99 | |
| 100 | def append(self, entry): |
| 101 | if not hasattr(entry, "time"): |
| 102 | entry["time"] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
| 103 | self._entries.append(entry) |
| 104 | |
| 105 | def __str__(self) -> str: |
| 106 | string_entries = [] |
| 107 | for entry in self._entries: |
| 108 | type_str = "[" + entry.get("type", "") + "]" |
| 109 | string_entries.append( |
| 110 | f"{entry.get('time', '')}{type_str: >10s}{entry.get('name', ''): >15s}: " |
| 111 | + str( |
| 112 | { |
| 113 | k: v |
| 114 | for k, v in entry.items() |
| 115 | if k not in ["type", "name", "time"] |
| 116 | } |
| 117 | ) |
| 118 | ) |
| 119 | return "\n".join(string_entries) |
| 120 | |
| 121 | def __repr__(self) -> str: |
| 122 | return str(self) |
| 123 | |
| 124 | def __len__(self) -> int: |
| 125 | return len(self._entries) |
| 126 | |
| 127 | def __getitem__(self, key): |
| 128 | return self._entries[key] |
| 129 | |
| 130 | def copy(self): |
| 131 | new_log = Log() |
| 132 | new_log._entries = [copy.copy(v) for v in self._entries] |
| 133 | return new_log |
| 134 | |
| 135 | |
| 136 | class Program: |