|
1 | 1 | from __future__ import annotations # Needed for forward references |
2 | 2 | from datetime import datetime |
| 3 | +from enum import Enum |
3 | 4 | import time |
4 | 5 | import requests |
5 | 6 | import logging |
6 | 7 | import json |
7 | 8 | import re |
8 | 9 |
|
| 10 | +class LogLevel(Enum): |
| 11 | + DEBUG = logging.DEBUG |
| 12 | + INFO = logging.INFO |
| 13 | + WARNING = logging.WARNING |
| 14 | + ERROR = logging.ERROR |
| 15 | + CRITICAL = logging.CRITICAL |
| 16 | + |
9 | 17 | class JsonSerializableDict(dict): |
10 | 18 | def __init__(self, **kwargs): |
11 | 19 | # Initialize with keyword arguments as dictionary items |
@@ -37,11 +45,23 @@ class XurrentApiHelper: |
37 | 45 | api_user: Person # Forward declaration with a string |
38 | 46 | api_user_teams: List[Team] # Forward declaration with a string |
39 | 47 |
|
40 | | - def __init__(self, base_url, api_key, api_account, resolve_user=True): |
| 48 | + def __init__(self, base_url, api_key, api_account,resolve_user=True, logger: Logger=None): |
| 49 | + """ |
| 50 | + Initialize the Xurrent API helper. |
| 51 | +
|
| 52 | + :param base_url: Base URL of the Xurrent API |
| 53 | + :param api_key: API key to authenticate with |
| 54 | + :param api_account: Account name to use |
| 55 | + :param resolve_user: Resolve the API user and their teams (default: True) |
| 56 | + :param logger: Logger to use (optional), otherwise a new logger is created |
| 57 | + """ |
41 | 58 | self.base_url = base_url |
42 | 59 | self.api_key = api_key |
43 | 60 | self.api_account = api_account |
44 | | - self.logger = logging.getLogger(__name__) |
| 61 | + if logger: |
| 62 | + self.logger = logger |
| 63 | + else: |
| 64 | + self.logger = self.create_logger(False) |
45 | 65 | if resolve_user: |
46 | 66 | # Import Person lazily |
47 | 67 | from .people import Person |
@@ -77,6 +97,37 @@ def __append_per_page(self, uri, per_page=100): |
77 | 97 | return f'{uri}?per_page={per_page}' |
78 | 98 | return uri |
79 | 99 |
|
| 100 | + def create_logger(self, verbose) -> Logger: |
| 101 | + """ |
| 102 | + Create a logger for the API helper. |
| 103 | + :param verbose: Enable verbose logging (debug level) |
| 104 | + :return: Logger instance |
| 105 | + """ |
| 106 | + logger = logging.getLogger() |
| 107 | + log_stream = logging.StreamHandler() |
| 108 | + |
| 109 | + if verbose: |
| 110 | + logger.setLevel(logging.DEBUG) |
| 111 | + log_stream.setLevel(logging.DEBUG) |
| 112 | + else: |
| 113 | + logger.setLevel(logging.INFO) |
| 114 | + log_stream.setLevel(logging.INFO) |
| 115 | + |
| 116 | + formatter = logging.Formatter('%(levelname)s - %(message)s') |
| 117 | + log_stream.setFormatter(formatter) |
| 118 | + logger.addHandler(log_stream) |
| 119 | + return logger |
| 120 | + |
| 121 | + def set_log_level(self, level: LogLevel): |
| 122 | + """ |
| 123 | + Set the log level for the logger and all handlers. |
| 124 | +
|
| 125 | + :param level: Log level to set |
| 126 | + """ |
| 127 | + self.logger.setLevel(level) |
| 128 | + for handler in self.logger.handlers: |
| 129 | + handler.setLevel(level) |
| 130 | + |
80 | 131 |
|
81 | 132 | def api_call(self, uri: str, method='GET', data=None, per_page=100): |
82 | 133 | """ |
|
0 commit comments