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.
Files changed (74) hide show
  1. hammad/__init__.py +64 -10
  2. hammad/based/__init__.py +52 -0
  3. hammad/based/fields.py +546 -0
  4. hammad/based/model.py +968 -0
  5. hammad/based/utils.py +455 -0
  6. hammad/cache/__init__.py +30 -0
  7. hammad/{cache.py → cache/_cache.py} +83 -12
  8. hammad/cli/__init__.py +25 -0
  9. hammad/cli/plugins/__init__.py +786 -0
  10. hammad/cli/styles/__init__.py +5 -0
  11. hammad/cli/styles/animations.py +548 -0
  12. hammad/cli/styles/settings.py +135 -0
  13. hammad/cli/styles/types.py +358 -0
  14. hammad/cli/styles/utils.py +480 -0
  15. hammad/data/__init__.py +51 -0
  16. hammad/data/collections/__init__.py +32 -0
  17. hammad/data/collections/base_collection.py +58 -0
  18. hammad/data/collections/collection.py +227 -0
  19. hammad/data/collections/searchable_collection.py +556 -0
  20. hammad/data/collections/vector_collection.py +497 -0
  21. hammad/data/databases/__init__.py +21 -0
  22. hammad/data/databases/database.py +551 -0
  23. hammad/data/types/__init__.py +33 -0
  24. hammad/data/types/files/__init__.py +1 -0
  25. hammad/data/types/files/audio.py +81 -0
  26. hammad/data/types/files/configuration.py +475 -0
  27. hammad/data/types/files/document.py +195 -0
  28. hammad/data/types/files/file.py +358 -0
  29. hammad/data/types/files/image.py +80 -0
  30. hammad/json/__init__.py +21 -0
  31. hammad/{utils/json → json}/converters.py +4 -1
  32. hammad/logging/__init__.py +27 -0
  33. hammad/logging/decorators.py +432 -0
  34. hammad/logging/logger.py +534 -0
  35. hammad/pydantic/__init__.py +43 -0
  36. hammad/{utils/pydantic → pydantic}/converters.py +2 -1
  37. hammad/pydantic/models/__init__.py +28 -0
  38. hammad/pydantic/models/arbitrary_model.py +46 -0
  39. hammad/pydantic/models/cacheable_model.py +79 -0
  40. hammad/pydantic/models/fast_model.py +318 -0
  41. hammad/pydantic/models/function_model.py +176 -0
  42. hammad/pydantic/models/subscriptable_model.py +63 -0
  43. hammad/text/__init__.py +37 -0
  44. hammad/text/text.py +1068 -0
  45. hammad/text/utils/__init__.py +1 -0
  46. hammad/{utils/text → text/utils}/converters.py +2 -2
  47. hammad/text/utils/markdown/__init__.py +1 -0
  48. hammad/{utils → text/utils}/markdown/converters.py +3 -3
  49. hammad/{utils → text/utils}/markdown/formatting.py +1 -1
  50. hammad/{utils/typing/utils.py → typing/__init__.py} +75 -2
  51. hammad/web/__init__.py +42 -0
  52. hammad/web/http/__init__.py +1 -0
  53. hammad/web/http/client.py +944 -0
  54. hammad/web/openapi/client.py +740 -0
  55. hammad/web/search/__init__.py +1 -0
  56. hammad/web/search/client.py +936 -0
  57. hammad/web/utils.py +463 -0
  58. hammad/yaml/__init__.py +30 -0
  59. hammad/yaml/converters.py +19 -0
  60. {hammad_python-0.0.10.dist-info → hammad_python-0.0.11.dist-info}/METADATA +14 -8
  61. hammad_python-0.0.11.dist-info/RECORD +65 -0
  62. hammad/database.py +0 -447
  63. hammad/logger.py +0 -273
  64. hammad/types/color.py +0 -951
  65. hammad/utils/json/__init__.py +0 -0
  66. hammad/utils/markdown/__init__.py +0 -0
  67. hammad/utils/pydantic/__init__.py +0 -0
  68. hammad/utils/text/__init__.py +0 -0
  69. hammad/utils/typing/__init__.py +0 -0
  70. hammad_python-0.0.10.dist-info/RECORD +0 -22
  71. /hammad/{types/__init__.py → py.typed} +0 -0
  72. /hammad/{utils → web/openapi}/__init__.py +0 -0
  73. {hammad_python-0.0.10.dist-info → hammad_python-0.0.11.dist-info}/WHEEL +0 -0
  74. {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)