hammad-python 0.0.10__py3-none-any.whl → 0.0.11__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hammad/__init__.py +64 -10
- hammad/based/__init__.py +52 -0
- hammad/based/fields.py +546 -0
- hammad/based/model.py +968 -0
- hammad/based/utils.py +455 -0
- hammad/cache/__init__.py +30 -0
- hammad/{cache.py → cache/_cache.py} +83 -12
- hammad/cli/__init__.py +25 -0
- hammad/cli/plugins/__init__.py +786 -0
- hammad/cli/styles/__init__.py +5 -0
- hammad/cli/styles/animations.py +548 -0
- hammad/cli/styles/settings.py +135 -0
- hammad/cli/styles/types.py +358 -0
- hammad/cli/styles/utils.py +480 -0
- hammad/data/__init__.py +51 -0
- hammad/data/collections/__init__.py +32 -0
- hammad/data/collections/base_collection.py +58 -0
- hammad/data/collections/collection.py +227 -0
- hammad/data/collections/searchable_collection.py +556 -0
- hammad/data/collections/vector_collection.py +497 -0
- hammad/data/databases/__init__.py +21 -0
- hammad/data/databases/database.py +551 -0
- hammad/data/types/__init__.py +33 -0
- hammad/data/types/files/__init__.py +1 -0
- hammad/data/types/files/audio.py +81 -0
- hammad/data/types/files/configuration.py +475 -0
- hammad/data/types/files/document.py +195 -0
- hammad/data/types/files/file.py +358 -0
- hammad/data/types/files/image.py +80 -0
- hammad/json/__init__.py +21 -0
- hammad/{utils/json → json}/converters.py +4 -1
- hammad/logging/__init__.py +27 -0
- hammad/logging/decorators.py +432 -0
- hammad/logging/logger.py +534 -0
- hammad/pydantic/__init__.py +43 -0
- hammad/{utils/pydantic → pydantic}/converters.py +2 -1
- hammad/pydantic/models/__init__.py +28 -0
- hammad/pydantic/models/arbitrary_model.py +46 -0
- hammad/pydantic/models/cacheable_model.py +79 -0
- hammad/pydantic/models/fast_model.py +318 -0
- hammad/pydantic/models/function_model.py +176 -0
- hammad/pydantic/models/subscriptable_model.py +63 -0
- hammad/text/__init__.py +37 -0
- hammad/text/text.py +1068 -0
- hammad/text/utils/__init__.py +1 -0
- hammad/{utils/text → text/utils}/converters.py +2 -2
- hammad/text/utils/markdown/__init__.py +1 -0
- hammad/{utils → text/utils}/markdown/converters.py +3 -3
- hammad/{utils → text/utils}/markdown/formatting.py +1 -1
- hammad/{utils/typing/utils.py → typing/__init__.py} +75 -2
- hammad/web/__init__.py +42 -0
- hammad/web/http/__init__.py +1 -0
- hammad/web/http/client.py +944 -0
- hammad/web/openapi/client.py +740 -0
- hammad/web/search/__init__.py +1 -0
- hammad/web/search/client.py +936 -0
- hammad/web/utils.py +463 -0
- hammad/yaml/__init__.py +30 -0
- hammad/yaml/converters.py +19 -0
- {hammad_python-0.0.10.dist-info → hammad_python-0.0.11.dist-info}/METADATA +14 -8
- hammad_python-0.0.11.dist-info/RECORD +65 -0
- hammad/database.py +0 -447
- hammad/logger.py +0 -273
- hammad/types/color.py +0 -951
- hammad/utils/json/__init__.py +0 -0
- hammad/utils/markdown/__init__.py +0 -0
- hammad/utils/pydantic/__init__.py +0 -0
- hammad/utils/text/__init__.py +0 -0
- hammad/utils/typing/__init__.py +0 -0
- hammad_python-0.0.10.dist-info/RECORD +0 -22
- /hammad/{types/__init__.py → py.typed} +0 -0
- /hammad/{utils → web/openapi}/__init__.py +0 -0
- {hammad_python-0.0.10.dist-info → hammad_python-0.0.11.dist-info}/WHEEL +0 -0
- {hammad_python-0.0.10.dist-info → hammad_python-0.0.11.dist-info}/licenses/LICENSE +0 -0
hammad/logger.py
DELETED
@@ -1,273 +0,0 @@
|
|
1
|
-
"""✼ hammadpy.objects.logger
|
2
|
-
|
3
|
-
Contains the `Logger` class, allowing for easy logging configuration and
|
4
|
-
usage with either standard logging or through the `rich` library."""
|
5
|
-
|
6
|
-
from dataclasses import dataclass
|
7
|
-
import inspect
|
8
|
-
import logging
|
9
|
-
from typing import Literal, TypeAlias
|
10
|
-
|
11
|
-
from rich import get_console as _get_console
|
12
|
-
from rich.logging import RichHandler
|
13
|
-
|
14
|
-
from .types.color import Color, ColorName
|
15
|
-
|
16
|
-
__all__ = ["Logger", "LoggerLevel", "get_logger"]
|
17
|
-
|
18
|
-
|
19
|
-
# -----------------------------------------------------------------------------
|
20
|
-
# Types
|
21
|
-
# -----------------------------------------------------------------------------
|
22
|
-
|
23
|
-
|
24
|
-
LoggerLevel: TypeAlias = Literal["debug", "info", "warning", "error", "critical"]
|
25
|
-
"""Literal type helper for logging levels."""
|
26
|
-
|
27
|
-
|
28
|
-
# -----------------------------------------------------------------------------
|
29
|
-
# Helpers
|
30
|
-
# -----------------------------------------------------------------------------
|
31
|
-
|
32
|
-
|
33
|
-
class RichLoggerFilter(logging.Filter):
|
34
|
-
"""Filter for using rich's markup tags for logging messages."""
|
35
|
-
|
36
|
-
def filter(self, record: logging.LogRecord) -> bool:
|
37
|
-
if record.levelno >= logging.CRITICAL:
|
38
|
-
record.msg = f"[bold red]{record.msg}[/bold red]"
|
39
|
-
elif record.levelno >= logging.ERROR:
|
40
|
-
record.msg = f"[italic red]{record.msg}[/italic red]"
|
41
|
-
elif record.levelno >= logging.WARNING:
|
42
|
-
record.msg = f"[italic yellow]{record.msg}[/italic yellow]"
|
43
|
-
elif record.levelno >= logging.INFO:
|
44
|
-
record.msg = f"[white]{record.msg}[/white]"
|
45
|
-
elif record.levelno >= logging.DEBUG:
|
46
|
-
record.msg = f"[italic dim white]{record.msg}[/italic dim white]"
|
47
|
-
return True
|
48
|
-
|
49
|
-
|
50
|
-
# -----------------------------------------------------------------------------
|
51
|
-
# Logger
|
52
|
-
# -----------------------------------------------------------------------------
|
53
|
-
|
54
|
-
|
55
|
-
@dataclass
|
56
|
-
class Logger:
|
57
|
-
"""
|
58
|
-
Quite flexible and easy to use logger with rich styling and simple level
|
59
|
-
configuration / management.
|
60
|
-
|
61
|
-
NOTE: By default the `display_all` parameter is set to `False` which will
|
62
|
-
display messages at the effective level.
|
63
|
-
"""
|
64
|
-
|
65
|
-
_logger: logging.Logger | None = None
|
66
|
-
"""The underlying logging.Logger instance."""
|
67
|
-
|
68
|
-
def __init__(
|
69
|
-
self,
|
70
|
-
name: str | None = None,
|
71
|
-
level: LoggerLevel | None = None,
|
72
|
-
rich: bool = True,
|
73
|
-
display_all: bool = False,
|
74
|
-
) -> None:
|
75
|
-
"""
|
76
|
-
Initialize a new Logger instance.
|
77
|
-
|
78
|
-
Args:
|
79
|
-
name: Name for the logger. If None, defaults to "hammadpy"
|
80
|
-
level: Logging level. If None, defaults to "debug" if display_all else "warning"
|
81
|
-
rich: Whether to use rich formatting for output
|
82
|
-
display_all: If True, sets effective level to debug to show all messages
|
83
|
-
"""
|
84
|
-
logger_name = name or "hammadpy"
|
85
|
-
|
86
|
-
self._user_level = level or "warning"
|
87
|
-
|
88
|
-
if display_all:
|
89
|
-
effective_level = "debug"
|
90
|
-
else:
|
91
|
-
effective_level = self._user_level
|
92
|
-
|
93
|
-
level_map = {
|
94
|
-
"debug": logging.DEBUG,
|
95
|
-
"info": logging.INFO,
|
96
|
-
"warning": logging.WARNING,
|
97
|
-
"error": logging.ERROR,
|
98
|
-
"critical": logging.CRITICAL,
|
99
|
-
}
|
100
|
-
log_level = level_map.get(effective_level.lower(), logging.WARNING)
|
101
|
-
|
102
|
-
# Create logger
|
103
|
-
self._logger = logging.getLogger(logger_name)
|
104
|
-
|
105
|
-
# Clear any existing handlers
|
106
|
-
if self._logger.hasHandlers():
|
107
|
-
self._logger.handlers.clear()
|
108
|
-
|
109
|
-
# Setup handler based on rich preference
|
110
|
-
if rich:
|
111
|
-
self._setup_rich_handler(log_level)
|
112
|
-
else:
|
113
|
-
self._setup_standard_handler(log_level)
|
114
|
-
|
115
|
-
self._logger.setLevel(log_level)
|
116
|
-
self._logger.propagate = False
|
117
|
-
|
118
|
-
def _setup_rich_handler(self, log_level: int) -> None:
|
119
|
-
"""Setup rich handler for the logger."""
|
120
|
-
console = _get_console()
|
121
|
-
|
122
|
-
handler = RichHandler(
|
123
|
-
level=log_level,
|
124
|
-
console=console,
|
125
|
-
rich_tracebacks=True,
|
126
|
-
show_time=False,
|
127
|
-
show_path=False,
|
128
|
-
markup=True,
|
129
|
-
)
|
130
|
-
formatter = logging.Formatter("| [bold]✼ {name}[/bold] - {message}", style="{")
|
131
|
-
handler.setFormatter(formatter)
|
132
|
-
handler.addFilter(RichLoggerFilter())
|
133
|
-
|
134
|
-
self._logger.addHandler(handler)
|
135
|
-
|
136
|
-
def _setup_standard_handler(self, log_level: int) -> None:
|
137
|
-
"""Setup standard handler for the logger."""
|
138
|
-
handler = logging.StreamHandler()
|
139
|
-
formatter = logging.Formatter("✼ {name} - {levelname} - {message}", style="{")
|
140
|
-
handler.setFormatter(formatter)
|
141
|
-
handler.setLevel(log_level)
|
142
|
-
|
143
|
-
self._logger.addHandler(handler)
|
144
|
-
|
145
|
-
@property
|
146
|
-
def handlers(self) -> list[logging.Handler]:
|
147
|
-
if not self._logger:
|
148
|
-
return []
|
149
|
-
return self._logger.handlers
|
150
|
-
|
151
|
-
@handlers.setter
|
152
|
-
def handlers(self, value: list[logging.Handler]) -> None:
|
153
|
-
if not self._logger:
|
154
|
-
return
|
155
|
-
self._logger.handlers = value
|
156
|
-
|
157
|
-
@property
|
158
|
-
def level(self) -> LoggerLevel:
|
159
|
-
if not self._logger:
|
160
|
-
return "warning"
|
161
|
-
|
162
|
-
# Return the user-specified level, not the effective level
|
163
|
-
return getattr(self, "_user_level", "warning")
|
164
|
-
|
165
|
-
@level.setter
|
166
|
-
def level(self, value: LoggerLevel) -> None:
|
167
|
-
if not self._logger:
|
168
|
-
return
|
169
|
-
|
170
|
-
# Update the user-specified level
|
171
|
-
self._user_level = value
|
172
|
-
|
173
|
-
level_map = {
|
174
|
-
"debug": logging.DEBUG,
|
175
|
-
"info": logging.INFO,
|
176
|
-
"warning": logging.WARNING,
|
177
|
-
"error": logging.ERROR,
|
178
|
-
"critical": logging.CRITICAL,
|
179
|
-
}
|
180
|
-
|
181
|
-
log_level = level_map.get(value.lower(), logging.WARNING)
|
182
|
-
|
183
|
-
# Update logger level
|
184
|
-
self._logger.setLevel(log_level)
|
185
|
-
|
186
|
-
# Update handler levels
|
187
|
-
if self.handlers:
|
188
|
-
for handler in self.handlers:
|
189
|
-
handler.setLevel(log_level)
|
190
|
-
|
191
|
-
# Convenience methods for logging
|
192
|
-
def debug(self, message: str, *args, **kwargs) -> None:
|
193
|
-
"""Log a debug message."""
|
194
|
-
if self._logger:
|
195
|
-
self._logger.debug(message, *args, **kwargs)
|
196
|
-
|
197
|
-
def info(self, message: str, *args, **kwargs) -> None:
|
198
|
-
"""Log an info message."""
|
199
|
-
if self._logger:
|
200
|
-
self._logger.info(message, *args, **kwargs)
|
201
|
-
|
202
|
-
def warning(self, message: str, *args, **kwargs) -> None:
|
203
|
-
"""Log a warning message."""
|
204
|
-
if self._logger:
|
205
|
-
self._logger.warning(message, *args, **kwargs)
|
206
|
-
|
207
|
-
def error(self, message: str, *args, **kwargs) -> None:
|
208
|
-
"""Log an error message."""
|
209
|
-
if self._logger:
|
210
|
-
self._logger.error(message, *args, **kwargs)
|
211
|
-
|
212
|
-
def critical(self, message: str, *args, **kwargs) -> None:
|
213
|
-
"""Log a critical message."""
|
214
|
-
if self._logger:
|
215
|
-
self._logger.critical(message, *args, **kwargs)
|
216
|
-
|
217
|
-
def log(self, level: LoggerLevel, message: str, *args, **kwargs) -> None:
|
218
|
-
"""Log a message at the specified level."""
|
219
|
-
if not self._logger:
|
220
|
-
return
|
221
|
-
|
222
|
-
level_map = {
|
223
|
-
"debug": logging.DEBUG,
|
224
|
-
"info": logging.INFO,
|
225
|
-
"warning": logging.WARNING,
|
226
|
-
"error": logging.ERROR,
|
227
|
-
"critical": logging.CRITICAL,
|
228
|
-
}
|
229
|
-
|
230
|
-
log_level = level_map.get(level.lower(), logging.WARNING)
|
231
|
-
self._logger.log(log_level, message, *args, **kwargs)
|
232
|
-
|
233
|
-
@property
|
234
|
-
def name(self) -> str:
|
235
|
-
"""Get the logger name."""
|
236
|
-
if self._logger:
|
237
|
-
return self._logger.name
|
238
|
-
return "unknown"
|
239
|
-
|
240
|
-
def get_logger(self) -> logging.Logger | None:
|
241
|
-
"""Get the underlying logging.Logger instance."""
|
242
|
-
return self._logger
|
243
|
-
|
244
|
-
|
245
|
-
# -----------------------------------------------------------------------------
|
246
|
-
# Factory
|
247
|
-
# -----------------------------------------------------------------------------
|
248
|
-
|
249
|
-
|
250
|
-
def get_logger(
|
251
|
-
name: str | None = None,
|
252
|
-
level: LoggerLevel | None = None,
|
253
|
-
rich: bool = True,
|
254
|
-
color: ColorName | Color | str = None,
|
255
|
-
display_all: bool = False,
|
256
|
-
) -> Logger:
|
257
|
-
"""
|
258
|
-
Get a logger instance.
|
259
|
-
|
260
|
-
Args:
|
261
|
-
name: Name for the logger. If None, defaults to the caller's function name.
|
262
|
-
level: Logging level. If None, defaults to "debug" if display_all else "warning"
|
263
|
-
rich: Whether to use rich formatting for output
|
264
|
-
color: The color for the loggers name.
|
265
|
-
display_all: If True, sets effective level to debug to show all messages
|
266
|
-
|
267
|
-
Returns:
|
268
|
-
A Logger instance with the specified configuration.
|
269
|
-
"""
|
270
|
-
if name is None:
|
271
|
-
name = inspect.currentframe().f_back.f_code.co_name
|
272
|
-
|
273
|
-
return Logger(name, level, rich, display_all)
|