hammad-python 0.0.12__py3-none-any.whl → 0.0.14__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 (78) hide show
  1. hammad/__init__.py +1 -180
  2. hammad/ai/__init__.py +0 -58
  3. hammad/ai/completions/__init__.py +3 -2
  4. hammad/ai/completions/client.py +84 -129
  5. hammad/ai/completions/create.py +33 -9
  6. hammad/ai/completions/settings.py +100 -0
  7. hammad/ai/completions/types.py +86 -5
  8. hammad/ai/completions/utils.py +112 -0
  9. hammad/ai/embeddings/__init__.py +2 -2
  10. hammad/ai/embeddings/client/fastembed_text_embeddings_client.py +1 -1
  11. hammad/ai/embeddings/client/litellm_embeddings_client.py +1 -1
  12. hammad/ai/embeddings/types.py +4 -4
  13. hammad/cache/__init__.py +13 -21
  14. hammad/cli/__init__.py +2 -2
  15. hammad/cli/animations.py +8 -39
  16. hammad/cli/styles/__init__.py +2 -2
  17. hammad/data/__init__.py +19 -2
  18. hammad/data/collections/__init__.py +2 -2
  19. hammad/data/collections/vector_collection.py +0 -7
  20. hammad/{configuration → data/configurations}/__init__.py +2 -2
  21. hammad/{configuration → data/configurations}/configuration.py +1 -1
  22. hammad/data/databases/__init__.py +2 -2
  23. hammad/data/models/__init__.py +44 -0
  24. hammad/{base → data/models/base}/__init__.py +3 -3
  25. hammad/{pydantic → data/models/pydantic}/__init__.py +28 -16
  26. hammad/{pydantic → data/models/pydantic}/converters.py +11 -2
  27. hammad/{pydantic → data/models/pydantic}/models/__init__.py +3 -3
  28. hammad/{pydantic → data/models/pydantic}/models/arbitrary_model.py +1 -1
  29. hammad/{pydantic → data/models/pydantic}/models/cacheable_model.py +1 -1
  30. hammad/{pydantic → data/models/pydantic}/models/fast_model.py +1 -1
  31. hammad/{pydantic → data/models/pydantic}/models/function_model.py +1 -1
  32. hammad/{pydantic → data/models/pydantic}/models/subscriptable_model.py +1 -1
  33. hammad/data/types/__init__.py +41 -0
  34. hammad/{types → data/types}/file.py +2 -2
  35. hammad/{multimodal → data/types/multimodal}/__init__.py +2 -2
  36. hammad/{multimodal → data/types/multimodal}/audio.py +2 -2
  37. hammad/{multimodal → data/types/multimodal}/image.py +2 -2
  38. hammad/{text → data/types}/text.py +4 -4
  39. hammad/formatting/__init__.py +38 -0
  40. hammad/{json → formatting/json}/__init__.py +3 -3
  41. hammad/{json → formatting/json}/converters.py +2 -2
  42. hammad/{text → formatting/text}/__init__.py +5 -24
  43. hammad/{text → formatting/text}/converters.py +2 -2
  44. hammad/{text → formatting/text}/markdown.py +1 -1
  45. hammad/{yaml → formatting/yaml}/__init__.py +3 -7
  46. hammad/formatting/yaml/converters.py +5 -0
  47. hammad/logging/__init__.py +2 -2
  48. hammad/mcp/__init__.py +50 -0
  49. hammad/mcp/client/__init__.py +1 -0
  50. hammad/mcp/client/client.py +523 -0
  51. hammad/mcp/client/client_service.py +393 -0
  52. hammad/mcp/client/settings.py +178 -0
  53. hammad/mcp/servers/__init__.py +1 -0
  54. hammad/mcp/servers/launcher.py +1161 -0
  55. hammad/performance/__init__.py +36 -0
  56. hammad/{_core/_utils/_import_utils.py → performance/imports.py} +125 -76
  57. hammad/performance/runtime/__init__.py +32 -0
  58. hammad/performance/runtime/decorators.py +142 -0
  59. hammad/performance/runtime/run.py +299 -0
  60. hammad/service/__init__.py +49 -0
  61. hammad/service/create.py +532 -0
  62. hammad/service/decorators.py +285 -0
  63. hammad/web/__init__.py +2 -2
  64. hammad/web/http/client.py +1 -1
  65. hammad/web/openapi/__init__.py +1 -0
  66. {hammad_python-0.0.12.dist-info → hammad_python-0.0.14.dist-info}/METADATA +35 -3
  67. hammad_python-0.0.14.dist-info/RECORD +99 -0
  68. hammad/_core/__init__.py +0 -1
  69. hammad/_core/_utils/__init__.py +0 -4
  70. hammad/multithreading/__init__.py +0 -304
  71. hammad/types/__init__.py +0 -11
  72. hammad/yaml/converters.py +0 -19
  73. hammad_python-0.0.12.dist-info/RECORD +0 -85
  74. /hammad/{base → data/models/base}/fields.py +0 -0
  75. /hammad/{base → data/models/base}/model.py +0 -0
  76. /hammad/{base → data/models/base}/utils.py +0 -0
  77. {hammad_python-0.0.12.dist-info → hammad_python-0.0.14.dist-info}/WHEEL +0 -0
  78. {hammad_python-0.0.12.dist-info → hammad_python-0.0.14.dist-info}/licenses/LICENSE +0 -0
@@ -1,304 +0,0 @@
1
- """hammad.multithreading"""
2
-
3
- import concurrent.futures
4
- import functools
5
- import time
6
- from typing import (
7
- Callable,
8
- Iterable,
9
- List,
10
- Any,
11
- TypeVar,
12
- Tuple,
13
- Optional,
14
- Union,
15
- Type,
16
- cast,
17
- overload,
18
- )
19
- from tenacity import (
20
- retry,
21
- wait_exponential,
22
- stop_after_attempt,
23
- retry_if_exception_type,
24
- retry_if_exception_message,
25
- retry_if_exception_type,
26
- )
27
-
28
- T_Arg = TypeVar("T_Arg")
29
- R_Out = TypeVar("R_Out")
30
-
31
- SingleTaskArgs = Union[T_Arg, Tuple[Any, ...]]
32
-
33
-
34
- __all__ = (
35
- "run_sequentially",
36
- "run_parallel",
37
- "sequentialize",
38
- "parallelize",
39
- "typed_batch",
40
- "run_with_retry",
41
- "retry",
42
- "wait_exponential",
43
- "stop_after_attempt",
44
- "retry_if_exception_type",
45
- "retry_if_exception_message",
46
- "retry_if_exception_type",
47
- )
48
-
49
-
50
- def run_sequentially(
51
- func: Callable[..., R_Out], args_list: Iterable[SingleTaskArgs]
52
- ) -> List[R_Out]:
53
- """
54
- Executes a function sequentially for each set of arguments in args_list.
55
- If the function raises an exception during any call, the execution stops
56
- and the exception is propagated.
57
-
58
- Args:
59
- func: The function to execute.
60
- args_list: An iterable of arguments (or argument tuples) to pass to func.
61
- - If func takes multiple arguments (e.g., func(a, b)),
62
- each item in args_list should be a tuple (e.g., [(val1_a, val1_b), (val2_a, val2_b)]).
63
- - If func takes one argument (e.g., func(a)),
64
- each item can be the argument itself (e.g., [val1, val2]).
65
- - If func takes no arguments (e.g., func()),
66
- each item should be an empty tuple (e.g., [(), ()]).
67
-
68
- Returns:
69
- A list of results from the sequential execution.
70
- """
71
- results: List[R_Out] = []
72
- for args_item in args_list:
73
- if isinstance(args_item, tuple):
74
- results.append(func(*args_item))
75
- else:
76
- # This branch handles single arguments.
77
- # If func expects no arguments, args_item should be `()` and caught by `isinstance(tuple)`.
78
- # If func expects one argument, args_item is that argument.
79
- results.append(func(args_item))
80
- return results
81
-
82
-
83
- def run_parallel(
84
- func: Callable[..., R_Out],
85
- args_list: Iterable[SingleTaskArgs],
86
- max_workers: Optional[int] = None,
87
- task_timeout: Optional[float] = None,
88
- ) -> List[Union[R_Out, Exception]]:
89
- """
90
- Executes a function in parallel for each set of arguments in args_list
91
- using a ThreadPoolExecutor. Results are returned in the same order as the input args_list.
92
-
93
- Args:
94
- func: The function to execute.
95
- args_list: An iterable of arguments (or argument tuples) to pass to func.
96
- (See `run_sequentially` for formatting details).
97
- max_workers: The maximum number of worker threads. If None, it defaults
98
- to ThreadPoolExecutor's default (typically based on CPU cores).
99
- task_timeout: The maximum number of seconds to wait for each individual task
100
- to complete. If a task exceeds this timeout, a
101
- concurrent.futures.TimeoutError will be stored as its result.
102
- If None, tasks will wait indefinitely for completion.
103
-
104
- Returns:
105
- A list where each element corresponds to the respective item in args_list.
106
- - If a task executed successfully, its return value (R_Out) is stored.
107
- - If a task raised an exception (including TimeoutError due to task_timeout),
108
- the exception object itself is stored.
109
- """
110
- # Materialize args_list to ensure consistent ordering and count, especially if it's a generator.
111
- materialized_args_list = list(args_list)
112
- if not materialized_args_list:
113
- return []
114
-
115
- with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
116
- futures: List[concurrent.futures.Future] = []
117
- for args_item in materialized_args_list:
118
- if isinstance(args_item, tuple):
119
- future = executor.submit(func, *args_item)
120
- else:
121
- future = executor.submit(func, args_item)
122
- futures.append(future)
123
-
124
- # Initialize results list. Type ignore is used because None is a placeholder.
125
- results: List[Union[R_Out, Exception]] = [None] * len(futures) # type: ignore
126
- for i, future in enumerate(futures):
127
- try:
128
- results[i] = future.result(timeout=task_timeout)
129
- except Exception as e: # Catches TimeoutError from future.result and any exception from func
130
- results[i] = e
131
- return results
132
-
133
-
134
- def sequentialize():
135
- """
136
- Decorator to make a function that processes a single item (or argument set)
137
- able to process an iterable of items (or argument sets) sequentially.
138
-
139
- The decorated function will expect an iterable of argument sets as its
140
- primary argument and will return a list of results. If the underlying
141
- function raises an error, execution stops and the error propagates.
142
-
143
- Example:
144
- @sequentialize()
145
- def process_single(data, factor):
146
- return data * factor
147
-
148
- # Now call it with a list of argument tuples
149
- results = process_single([(1, 2), (3, 4)])
150
- # results will be [2, 12]
151
- """
152
-
153
- def decorator(
154
- func_to_process_single_item: Callable[..., R_Out],
155
- ) -> Callable[[Iterable[SingleTaskArgs]], List[R_Out]]:
156
- @functools.wraps(func_to_process_single_item)
157
- def wrapper(args_list_for_func: Iterable[SingleTaskArgs]) -> List[R_Out]:
158
- return run_sequentially(func_to_process_single_item, args_list_for_func)
159
-
160
- return wrapper
161
-
162
- return decorator
163
-
164
-
165
- def parallelize(
166
- max_workers: Optional[int] = None, task_timeout: Optional[float] = None
167
- ):
168
- """
169
- Decorator to make a function that processes a single item (or argument set)
170
- able to process an iterable of items (or argument sets) in parallel.
171
-
172
- The decorated function will expect an iterable of argument sets as its
173
- primary argument and will return a list of results or exceptions,
174
- maintaining the original order.
175
-
176
- Args:
177
- max_workers (Optional[int]): Max worker threads for parallel execution.
178
- task_timeout (Optional[float]): Timeout for each individual task.
179
-
180
- Example:
181
- @parallelize(max_workers=4, task_timeout=5.0)
182
- def fetch_url_content(url: str) -> str:
183
- # ... implementation to fetch url ...
184
- return "content"
185
-
186
- # Now call it with a list of URLs
187
- results = fetch_url_content(["http://example.com", "http://example.org"])
188
- # results will be a list of contents or Exception objects.
189
- """
190
-
191
- def decorator(
192
- func_to_process_single_item: Callable[..., R_Out],
193
- ) -> Callable[[Iterable[SingleTaskArgs]], List[Union[R_Out, Exception]]]:
194
- @functools.wraps(func_to_process_single_item)
195
- def wrapper(
196
- args_list_for_func: Iterable[SingleTaskArgs],
197
- ) -> List[Union[R_Out, Exception]]:
198
- return run_parallel(
199
- func_to_process_single_item,
200
- args_list_for_func,
201
- max_workers=max_workers,
202
- task_timeout=task_timeout,
203
- )
204
-
205
- return wrapper
206
-
207
- return decorator
208
-
209
-
210
- def typed_batch():
211
- """
212
- Decorator that provides better IDE type hinting for functions converted from
213
- single-item to batch processing. This helps IDEs understand the transformation
214
- and provide accurate autocomplete and type checking.
215
-
216
- The decorated function maintains proper type information showing it transforms
217
- from Callable[[T], R] to Callable[[Iterable[T]], List[R]].
218
-
219
- Example:
220
- @typed_batch()
221
- def process_url(url: str) -> dict:
222
- return {"url": url, "status": "ok"}
223
-
224
- # IDE will now correctly understand:
225
- # process_url: (Iterable[str]) -> List[dict]
226
- results = process_url(["http://example.com", "http://test.com"])
227
- """
228
-
229
- def decorator(
230
- func: Callable[..., R_Out],
231
- ) -> Callable[[Iterable[SingleTaskArgs]], List[R_Out]]:
232
- @functools.wraps(func)
233
- def wrapper(args_list: Iterable[SingleTaskArgs]) -> List[R_Out]:
234
- return run_sequentially(func, args_list)
235
-
236
- # Preserve original function's type info while updating signature
237
- wrapper.__annotations__ = {
238
- "args_list": Iterable[SingleTaskArgs],
239
- "return": List[R_Out],
240
- }
241
-
242
- return cast(Callable[[Iterable[SingleTaskArgs]], List[R_Out]], wrapper)
243
-
244
- return decorator
245
-
246
-
247
- def run_with_retry(
248
- max_attempts: int = 3,
249
- delay: float = 1.0,
250
- backoff: float = 2.0,
251
- exceptions: Optional[Tuple[Type[Exception], ...]] = None,
252
- ):
253
- """
254
- Decorator that adds retry logic to functions. Essential for robust parallel
255
- processing when dealing with network calls, database operations, or other
256
- operations that might fail transiently.
257
-
258
- Args:
259
- max_attempts: Maximum number of attempts (including the first try).
260
- delay: Initial delay between retries in seconds.
261
- backoff: Multiplier for delay after each failed attempt.
262
- exceptions: Tuple of exception types to retry on. If None, retries on all exceptions.
263
-
264
- Example:
265
- @with_retry(max_attempts=3, delay=0.5, backoff=2.0, exceptions=(ConnectionError, TimeoutError))
266
- def fetch_data(url: str) -> dict:
267
- # This will retry up to 3 times with exponential backoff
268
- # only for ConnectionError and TimeoutError
269
- return requests.get(url).json()
270
-
271
- @parallelize(max_workers=10)
272
- @with_retry(max_attempts=2)
273
- def robust_fetch(url: str) -> str:
274
- return fetch_url_content(url)
275
- """
276
- if exceptions is None:
277
- exceptions = (Exception,)
278
-
279
- def decorator(func: Callable[..., R_Out]) -> Callable[..., R_Out]:
280
- @functools.wraps(func)
281
- def wrapper(*args, **kwargs) -> R_Out:
282
- last_exception = None
283
- current_delay = delay
284
-
285
- for attempt in range(max_attempts):
286
- try:
287
- return func(*args, **kwargs)
288
- except exceptions as e:
289
- last_exception = e
290
- if attempt == max_attempts - 1: # Last attempt
291
- break
292
-
293
- print(
294
- f"Attempt {attempt + 1} failed for {func.__name__}: {e}. Retrying in {current_delay:.2f}s..."
295
- )
296
- time.sleep(current_delay)
297
- current_delay *= backoff
298
-
299
- # If we get here, all attempts failed
300
- raise last_exception
301
-
302
- return wrapper
303
-
304
- return decorator
hammad/types/__init__.py DELETED
@@ -1,11 +0,0 @@
1
- """hammad.types
2
-
3
- Contains functional aliases, types and model-like objects that are used
4
- internally within the `hammad` package, as well as usable for
5
- various other cases."""
6
-
7
- from typing import TYPE_CHECKING
8
- from .._core._utils._import_utils import _auto_create_getattr_loader
9
-
10
- if TYPE_CHECKING:
11
- from .file import File, FileSource
hammad/yaml/converters.py DELETED
@@ -1,19 +0,0 @@
1
- """hammad.yaml.converters"""
2
-
3
- from msgspec.yaml import encode as encode_yaml, decode as decode_yaml
4
- from ..configuration.configuration import Configuration as Yaml
5
-
6
- __all__ = ("encode_yaml", "decode_yaml", "read_yaml_file", "Yaml")
7
-
8
-
9
- def read_yaml_file(path: str) -> Yaml:
10
- """Parses a YAML file to return a Configuration object.
11
- This utilizes the following file types:
12
-
13
- Args:
14
- path (str): The path to the YAML file.
15
-
16
- Returns:
17
- Yaml: A Configuration object.
18
- """
19
- return Yaml.from_file(path)
@@ -1,85 +0,0 @@
1
- hammad/__init__.py,sha256=q812SgfUvft8HbB1HLDfuBgt0dBpnTnHc1uprM3HOec,3962
2
- hammad/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- hammad/_core/__init__.py,sha256=AOFUkG80nF2WSgQQSdFE_kehH77gBskKYrzKSNogi8Q,19
4
- hammad/_core/_utils/__init__.py,sha256=pqNuAShC-0BJ4td85wrwSfXk7zOo1RFde-oO3VUA_iQ,133
5
- hammad/_core/_utils/_import_utils.py,sha256=uO1XWolUV8Zcu1ZVeTAr6-_Zvwwvxjxew-te968kP0E,6048
6
- hammad/ai/__init__.py,sha256=vfIDw17dy4ZKL44U7iz4-R5OzUQJFtQs1tAdWaNOWpI,1380
7
- hammad/ai/_utils.py,sha256=axsCHv66zfjjhlEbxaF_049fClHjQgHtUReXs8nsMwc,3950
8
- hammad/ai/completions/__init__.py,sha256=7JiR29M-AI5XOcD5lY85GolJcb0B6Jm67I7bbCz6n0g,1058
9
- hammad/ai/completions/client.py,sha256=ulobB3PTY-hY7JTgMyqiguKhKTE8EivSDW_P1_6H3J8,27387
10
- hammad/ai/completions/create.py,sha256=jXqBzZ0-K9BzVQX4X70sN8WYYnbcJL_1ZJelgDYd0fw,29970
11
- hammad/ai/completions/types.py,sha256=9kD_eiZHZ52lKt72y4Nnfb9PmY7jWhq9Ncv5x4spRRI,25575
12
- hammad/ai/completions/utils.py,sha256=Y9GVl_buljRDrbG0THG9398jJKy4wZc689D4PHiWfJc,13138
13
- hammad/ai/embeddings/__init__.py,sha256=4KduX3CTfYG8acp9Smhvqhf_24o4eCZsq4c85fE1IXI,1105
14
- hammad/ai/embeddings/create.py,sha256=voVD6WLvoyIgqIMYOmJKJFxUho8ZIl0YDfbgM4X6B6w,6590
15
- hammad/ai/embeddings/types.py,sha256=O6MgrGl6431-cH5sRLyNz7BXIehVyfpMDqrCe4wHxyA,1761
16
- hammad/ai/embeddings/client/__init__.py,sha256=F2SO89Q6xOYQWNfvAONBJdDLoXIsCxON6I1BxpjEkGQ,34
17
- hammad/ai/embeddings/client/base_embeddings_client.py,sha256=EMT8jDMa0TKIV9XA9Tx9ze7eJ882OuCLL9KucI2EezQ,600
18
- hammad/ai/embeddings/client/fastembed_text_embeddings_client.py,sha256=814inmH6YgA8mi0hSBKT2P-sCALaiotWNzlsMewQ-Z0,6945
19
- hammad/ai/embeddings/client/litellm_embeddings_client.py,sha256=7aFspROjacnAA79jm7f0stzlSi4EHwEgZqI7Im2gNic,10031
20
- hammad/base/__init__.py,sha256=PooFQh69XNCeySLj2bfAuwn5xMI2kesl3WjRmsxukiw,818
21
- hammad/base/fields.py,sha256=n02Qqq1AkcxwGCGEjcBSu63uWSkcyfxisATr7nwc7DA,19173
22
- hammad/base/model.py,sha256=_qyJ3IRJTwRXqZsYMpuYP8FTbMfLgh75VbTrTt1Wqx8,39121
23
- hammad/base/utils.py,sha256=kmdWqDcCTB7y4w5pdAfyrOfpzqj1hjKILIklAwbvNxM,9957
24
- hammad/cache/__init__.py,sha256=W5CK3JvbfHzS_-KmGIS_ZtjnXuXRjWGmSKaT2eeftEE,1104
25
- hammad/cache/base_cache.py,sha256=kYJS2IcQtxhzT7BQBFtOWnhw4VkvAapPhAVkfbW5IeY,6353
26
- hammad/cache/cache.py,sha256=bzDXxjSolrSdIxqES2VMfVZZGTk_8k4x9n0AW4tlifs,4621
27
- hammad/cache/decorators.py,sha256=olYLK5x4JkxHpA8WIiplI45QYmNIzyGjNMrTKNRCSQg,9599
28
- hammad/cache/file_cache.py,sha256=XjLJxM4Ql65OABxz8q1DtA_s8HZQJKywCw6MNVnC6YE,2485
29
- hammad/cache/ttl_cache.py,sha256=-0pJ4lkVgg1OIb98bQFub9n6f4zgWVs-dQfKZe_DmpE,2153
30
- hammad/cli/__init__.py,sha256=81UslbyYQ3-2tJNYQv1pHe5R0_nufAAo6ktpDeuEskQ,758
31
- hammad/cli/animations.py,sha256=_ILMhyT_02FlLMhROe6br0Fhz2EVEwgOyKHY55qWsJY,20541
32
- hammad/cli/plugins.py,sha256=61cljGF_V03_6xrBhO0tR-rrlgB44veHh5HXcxMTM3Y,26932
33
- hammad/cli/styles/__init__.py,sha256=4HE20exLpIQgPGFt6KnCbjiYaK95fXvFJBGGjJZTwMM,1388
34
- hammad/cli/styles/settings.py,sha256=irChf9RsMij3djx_n9D9duoVIzxLCpd9-BlKl6U_OLk,5532
35
- hammad/cli/styles/types.py,sha256=vNIeQY_23m10K8qVT7Iy-PMwosGL-La-UAZKszHJjEE,7911
36
- hammad/cli/styles/utils.py,sha256=BGFwQIEJHWlTAXed8ZxHeI_phLfEdh-_Mok2fe-jn7g,19356
37
- hammad/configuration/__init__.py,sha256=d1ztew6E-7SsJa_yiBOfXULRAnuFcCCel_MkyrDajXs,852
38
- hammad/configuration/configuration.py,sha256=Ssty95LALoS9QiviZByXHGyMMe43m63un-Ycz4DFeNw,17732
39
- hammad/data/__init__.py,sha256=1PzfRx0bsv0AYkGlssCHxWE4zjSpnSTK_tG3uy6RZ-4,884
40
- hammad/data/collections/__init__.py,sha256=jOl1B1avTYhrHuKi27Iq2n48CDTG9Id8W2xMagEiJ6I,838
41
- hammad/data/collections/base_collection.py,sha256=ZRht7OZjLIT8GxNvMgNxTarbCTY6EUUurEkGHZ3Rsy4,1419
42
- hammad/data/collections/collection.py,sha256=MWjyY3YqZa3U9WH3Br8v-Q_FLP5XWf3p0lIMGzfIeJ4,15758
43
- hammad/data/collections/searchable_collection.py,sha256=vCV_JgMwB57QRi4Cri6dfEUzLCyTBN58_JfWEKL2h_0,21361
44
- hammad/data/collections/vector_collection.py,sha256=f7GIbJdElmIzqcApcCCxmbXgAXng2EY20n2ttBopwE0,21129
45
- hammad/data/databases/__init__.py,sha256=hPg0ujYlS6cqrNsI5CMqTtXWivXPuxm3nyY7_q63nxs,425
46
- hammad/data/databases/database.py,sha256=7ngi-oWAsmAdtLTvpT4axw5ftcMzqsCtJmfmjzw5etk,31160
47
- hammad/json/__init__.py,sha256=-7laMbXoayDBlFDYw9wGgMJSRJ_pnUsI30jJvQsK54M,481
48
- hammad/json/converters.py,sha256=gXWJRN6OlzqDoL69nZqtyn8ET22Sxv7znso-VVamDR4,5480
49
- hammad/logging/__init__.py,sha256=NbZO9drdBqYj33MKkISIdSI-xEVqtorxQNAyPL6ySpg,726
50
- hammad/logging/decorators.py,sha256=xhHRA7WhesgdVMSwK_JvqZhGb90GF3TbYco13Y7aY0w,30119
51
- hammad/logging/logger.py,sha256=8q-7anLeZk07QlPszdt_qzsQPaeuZyDHevV8C6R_okk,31451
52
- hammad/multimodal/__init__.py,sha256=58zgdyWQTW9_YNED8mlOKBK6AgBjeuteOcvE3QZANRs,444
53
- hammad/multimodal/audio.py,sha256=cnmjfnLAQxlh7b8EfDlfk541PzzLL102bOlj5atDSPA,2777
54
- hammad/multimodal/image.py,sha256=eRlsCu1oSdlRtcJ8zGlD4np77pvqWMCDPU6FNJ6zNmg,2265
55
- hammad/multithreading/__init__.py,sha256=akEIhZndORW1dg3HvfVjDaYJv4IyB_fP6DQt1fH_ums,10788
56
- hammad/pydantic/__init__.py,sha256=5ZZfqSrXEapkDcEM5kcOcjs4_tfKlxHyIhK1u-veb3I,1017
57
- hammad/pydantic/converters.py,sha256=vlxVoPMY6IpwH4U1B0iVnW3p6VC8M7tINx8o9FU1JOI,20203
58
- hammad/pydantic/models/__init__.py,sha256=N8-B-_pAZ7mGpzEeE1M65hda8iQC-SWjDnzIS3gRTg8,671
59
- hammad/pydantic/models/arbitrary_model.py,sha256=XSsB2hMC3bCHwyLXepe1D_S3M57yaWG5QUBo3pAoG_M,1524
60
- hammad/pydantic/models/cacheable_model.py,sha256=JDzV5kZrgEPovE3M2bF4scoCAoGEhISeMhc69cifDfM,2809
61
- hammad/pydantic/models/fast_model.py,sha256=WVJxcUQydScQLhzMOh88Kn2WIFtN5cel_srI6UL3kVk,11716
62
- hammad/pydantic/models/function_model.py,sha256=pMtCM2slqJso77L5WuCMoNtm3gO_OMoSe87tgODaZJM,6300
63
- hammad/pydantic/models/subscriptable_model.py,sha256=yJ-PpaXPu0eKEktNrGizj5rOSHLGclDAGjwtnYYAcgY,1706
64
- hammad/text/__init__.py,sha256=xt4wjg5XvGMIEkr2mD5s__V6QHLX9C0GTIAtquNiyZM,1853
65
- hammad/text/converters.py,sha256=LmgyPGrRQrvyNZQlWOiTKfnSQcEtSlTznN7blPIv6Qk,23800
66
- hammad/text/markdown.py,sha256=13vS7HmBZIrktua5JoI1CBmigQkk7gJzndEzYkMYjvU,3402
67
- hammad/text/text.py,sha256=Fjp0n6upyXLlzecamcY7xzx1j2rFlda_2qPoiyYinVo,33309
68
- hammad/types/__init__.py,sha256=0ouYhOy3FydxEn4GUXbWWZ-5FMgLsU2NnQzyaCgKqBQ,336
69
- hammad/types/file.py,sha256=o3JSqQyCcKmRtAzk4oltnmzXZ60STL0VEiunOGfNVfk,11102
70
- hammad/typing/__init__.py,sha256=jQEwoJVMdgk1VQTLyMiJaU7l5P8JIvcvwcjMazE7iSo,10923
71
- hammad/web/__init__.py,sha256=WQYIzWKMG7p1WqONX2P6V-jagmBK2TLe_1N4fio4lUE,1078
72
- hammad/web/models.py,sha256=q9d4_3UPvHcvG_HuULxKHQuNrllA2S-3CSP3HdU21Cs,5637
73
- hammad/web/utils.py,sha256=7jf_esoIwctKg1qxSaN6yAgzeo70HT1IdSVqoNdHFSQ,15815
74
- hammad/web/http/__init__.py,sha256=jn9Rn7Yg2cypD7duTTNFuW2wQZx9B63Bde4RJJeDYU0,22
75
- hammad/web/http/client.py,sha256=N_w9WFwolrb43BTNbmi2feHJBoB7Z8PX-XOsHyS6efo,33147
76
- hammad/web/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
- hammad/web/openapi/client.py,sha256=1pXz7KAO_0pN4kQZoWKWskXDYGiJ535TsPO1GGCiC0E,26816
78
- hammad/web/search/__init__.py,sha256=e9A6znPIiZCz-4secyHbUs0uUGf5yAqW6wGacgx961U,24
79
- hammad/web/search/client.py,sha256=4VEhctFf_4LRxM2TXsEssSW6tbaZnu0NYaIVMYQrJNs,35434
80
- hammad/yaml/__init__.py,sha256=0w5YV4fOF33-9AyfKJcWhhCOnzrBOyzJAHXJLvTLml8,547
81
- hammad/yaml/converters.py,sha256=h2tb7IxlXVvjQs_E2uyTo6LTklUzTVh8lehur-p6iGs,527
82
- hammad_python-0.0.12.dist-info/METADATA,sha256=1mAxsLfG2ZD5LGRfcrcvqzueypGD1Lr-71dvF7lr_VQ,1430
83
- hammad_python-0.0.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
84
- hammad_python-0.0.12.dist-info/licenses/LICENSE,sha256=h74yFUWjbBaodcWG5wNmm30npjl8obVcxD-1nQfUp2I,1069
85
- hammad_python-0.0.12.dist-info/RECORD,,
File without changes
File without changes
File without changes