hammad-python 0.0.11__py3-none-any.whl → 0.0.13__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 +169 -56
- hammad/_core/__init__.py +1 -0
- hammad/_core/_utils/__init__.py +4 -0
- hammad/_core/_utils/_import_utils.py +182 -0
- hammad/ai/__init__.py +59 -0
- hammad/ai/_utils.py +142 -0
- hammad/ai/completions/__init__.py +44 -0
- hammad/ai/completions/client.py +729 -0
- hammad/ai/completions/create.py +686 -0
- hammad/ai/completions/types.py +711 -0
- hammad/ai/completions/utils.py +374 -0
- hammad/ai/embeddings/__init__.py +35 -0
- hammad/ai/embeddings/client/__init__.py +1 -0
- hammad/ai/embeddings/client/base_embeddings_client.py +26 -0
- hammad/ai/embeddings/client/fastembed_text_embeddings_client.py +200 -0
- hammad/ai/embeddings/client/litellm_embeddings_client.py +288 -0
- hammad/ai/embeddings/create.py +159 -0
- hammad/ai/embeddings/types.py +69 -0
- hammad/base/__init__.py +35 -0
- hammad/{based → base}/fields.py +23 -23
- hammad/{based → base}/model.py +124 -14
- hammad/base/utils.py +280 -0
- hammad/cache/__init__.py +30 -12
- hammad/cache/base_cache.py +181 -0
- hammad/cache/cache.py +169 -0
- hammad/cache/decorators.py +261 -0
- hammad/cache/file_cache.py +80 -0
- hammad/cache/ttl_cache.py +74 -0
- hammad/cli/__init__.py +10 -2
- hammad/cli/{styles/animations.py → animations.py} +79 -23
- hammad/cli/{plugins/__init__.py → plugins.py} +85 -90
- hammad/cli/styles/__init__.py +50 -0
- hammad/cli/styles/settings.py +4 -0
- hammad/configuration/__init__.py +35 -0
- hammad/{data/types/files → configuration}/configuration.py +96 -7
- hammad/data/__init__.py +14 -26
- hammad/data/collections/__init__.py +4 -2
- hammad/data/collections/collection.py +300 -75
- hammad/data/collections/vector_collection.py +118 -12
- hammad/data/databases/__init__.py +2 -2
- hammad/data/databases/database.py +383 -32
- hammad/json/__init__.py +2 -2
- hammad/logging/__init__.py +13 -5
- hammad/logging/decorators.py +404 -2
- hammad/logging/logger.py +442 -22
- hammad/multimodal/__init__.py +24 -0
- hammad/{data/types/files → multimodal}/audio.py +21 -6
- hammad/{data/types/files → multimodal}/image.py +5 -5
- hammad/multithreading/__init__.py +304 -0
- hammad/pydantic/__init__.py +2 -2
- hammad/pydantic/converters.py +1 -1
- hammad/pydantic/models/__init__.py +2 -2
- hammad/text/__init__.py +59 -14
- hammad/text/converters.py +723 -0
- hammad/text/{utils/markdown/formatting.py → markdown.py} +25 -23
- hammad/text/text.py +12 -14
- hammad/types/__init__.py +11 -0
- hammad/{data/types/files → types}/file.py +18 -18
- hammad/typing/__init__.py +138 -84
- hammad/web/__init__.py +3 -2
- hammad/web/models.py +245 -0
- hammad/web/search/client.py +75 -23
- hammad/web/utils.py +14 -5
- hammad/yaml/__init__.py +2 -2
- hammad/yaml/converters.py +1 -1
- {hammad_python-0.0.11.dist-info → hammad_python-0.0.13.dist-info}/METADATA +4 -1
- hammad_python-0.0.13.dist-info/RECORD +85 -0
- hammad/based/__init__.py +0 -52
- hammad/based/utils.py +0 -455
- hammad/cache/_cache.py +0 -746
- hammad/data/types/__init__.py +0 -33
- hammad/data/types/files/__init__.py +0 -1
- hammad/data/types/files/document.py +0 -195
- hammad/text/utils/__init__.py +0 -1
- hammad/text/utils/converters.py +0 -229
- hammad/text/utils/markdown/__init__.py +0 -1
- hammad/text/utils/markdown/converters.py +0 -506
- hammad_python-0.0.11.dist-info/RECORD +0 -65
- {hammad_python-0.0.11.dist-info → hammad_python-0.0.13.dist-info}/WHEEL +0 -0
- {hammad_python-0.0.11.dist-info → hammad_python-0.0.13.dist-info}/licenses/LICENSE +0 -0
@@ -1,506 +0,0 @@
|
|
1
|
-
"""hammad.text.utils.markdown.converters"""
|
2
|
-
|
3
|
-
import json
|
4
|
-
import logging
|
5
|
-
import dataclasses
|
6
|
-
from dataclasses import is_dataclass, fields as dataclass_fields
|
7
|
-
from docstring_parser import parse
|
8
|
-
from typing import (
|
9
|
-
Any,
|
10
|
-
Optional,
|
11
|
-
Dict,
|
12
|
-
List,
|
13
|
-
Set,
|
14
|
-
Callable,
|
15
|
-
Union,
|
16
|
-
)
|
17
|
-
|
18
|
-
from ....typing import (
|
19
|
-
is_pydantic_basemodel,
|
20
|
-
is_pydantic_basemodel_instance,
|
21
|
-
is_msgspec_struct,
|
22
|
-
)
|
23
|
-
from ...utils.converters import convert_type_to_text as convert_type_to_string
|
24
|
-
from .formatting import (
|
25
|
-
bold,
|
26
|
-
italic,
|
27
|
-
code,
|
28
|
-
code_block,
|
29
|
-
heading,
|
30
|
-
list_item,
|
31
|
-
table_row,
|
32
|
-
horizontal_rule,
|
33
|
-
)
|
34
|
-
|
35
|
-
|
36
|
-
logger = logging.getLogger(__name__)
|
37
|
-
|
38
|
-
|
39
|
-
class MarkdownError(Exception):
|
40
|
-
"""Exception raised for errors in the markdown converters."""
|
41
|
-
|
42
|
-
def __init__(self, message: str):
|
43
|
-
self.message = message
|
44
|
-
super().__init__(self.message)
|
45
|
-
|
46
|
-
|
47
|
-
def _escape_markdown(text: str) -> str:
|
48
|
-
"""Escape special Markdown characters."""
|
49
|
-
# Only escape the most problematic characters
|
50
|
-
chars_to_escape = ["*", "_", "`", "[", "]", "(", ")", "#", "+", "-", "!"]
|
51
|
-
for char in chars_to_escape:
|
52
|
-
text = text.replace(char, f"\\{char}")
|
53
|
-
return text
|
54
|
-
|
55
|
-
|
56
|
-
def convert_dataclass_to_markdown(
|
57
|
-
obj: Any,
|
58
|
-
name: Optional[str],
|
59
|
-
description: Optional[str],
|
60
|
-
table_format: bool,
|
61
|
-
show_types: bool,
|
62
|
-
show_defaults: bool,
|
63
|
-
show_values: bool,
|
64
|
-
indent_level: int,
|
65
|
-
) -> str:
|
66
|
-
"""Convert a dataclass to Markdown format."""
|
67
|
-
is_class = isinstance(obj, type)
|
68
|
-
obj_name = name or (obj.__name__ if is_class else obj.__class__.__name__)
|
69
|
-
|
70
|
-
parts = []
|
71
|
-
parts.append(heading(obj_name, min(indent_level + 1, 6)))
|
72
|
-
|
73
|
-
if description:
|
74
|
-
parts.append(f"\n{description}\n")
|
75
|
-
|
76
|
-
fields_data = []
|
77
|
-
for field in dataclass_fields(obj if is_class else obj.__class__):
|
78
|
-
field_info = {
|
79
|
-
"name": field.name,
|
80
|
-
"type": convert_type_to_string(field.type) if show_types else None,
|
81
|
-
"default": field.default
|
82
|
-
if show_defaults and field.default is not dataclasses.MISSING
|
83
|
-
else None,
|
84
|
-
"value": getattr(obj, field.name) if show_values and not is_class else None,
|
85
|
-
}
|
86
|
-
fields_data.append(field_info)
|
87
|
-
|
88
|
-
if table_format and fields_data:
|
89
|
-
# Create table headers
|
90
|
-
headers = ["Field"]
|
91
|
-
if show_types:
|
92
|
-
headers.append("Type")
|
93
|
-
if show_defaults:
|
94
|
-
headers.append("Default")
|
95
|
-
if show_values and not is_class:
|
96
|
-
headers.append("Value")
|
97
|
-
|
98
|
-
parts.append("\n" + table_row(headers, is_header=True))
|
99
|
-
|
100
|
-
# Add rows
|
101
|
-
for field_info in fields_data:
|
102
|
-
row = [code(field_info["name"])]
|
103
|
-
if show_types:
|
104
|
-
row.append(field_info["type"] or "")
|
105
|
-
if show_defaults:
|
106
|
-
row.append(
|
107
|
-
str(field_info["default"])
|
108
|
-
if field_info["default"] is not None
|
109
|
-
else ""
|
110
|
-
)
|
111
|
-
if show_values and not is_class:
|
112
|
-
row.append(
|
113
|
-
str(field_info["value"]) if field_info["value"] is not None else ""
|
114
|
-
)
|
115
|
-
parts.append(table_row(row))
|
116
|
-
else:
|
117
|
-
# List format
|
118
|
-
for field_info in fields_data:
|
119
|
-
field_desc = code(field_info["name"])
|
120
|
-
if field_info["type"]:
|
121
|
-
field_desc += f" ({field_info['type']})"
|
122
|
-
if field_info["default"] is not None:
|
123
|
-
field_desc += f" - default: {field_info['default']}"
|
124
|
-
if field_info["value"] is not None:
|
125
|
-
field_desc += f" = {field_info['value']}"
|
126
|
-
parts.append(list_item(field_desc, indent_level))
|
127
|
-
|
128
|
-
return "\n".join(parts)
|
129
|
-
|
130
|
-
|
131
|
-
def convert_pydantic_to_markdown(
|
132
|
-
obj: Any,
|
133
|
-
name: Optional[str],
|
134
|
-
description: Optional[str],
|
135
|
-
table_format: bool,
|
136
|
-
show_types: bool,
|
137
|
-
show_defaults: bool,
|
138
|
-
show_values: bool,
|
139
|
-
show_required: bool,
|
140
|
-
indent_level: int,
|
141
|
-
) -> str:
|
142
|
-
"""Convert a Pydantic model to Markdown format."""
|
143
|
-
is_class = isinstance(obj, type)
|
144
|
-
is_instance = is_pydantic_basemodel_instance(obj)
|
145
|
-
|
146
|
-
obj_name = name or (obj.__name__ if is_class else obj.__class__.__name__)
|
147
|
-
|
148
|
-
parts = []
|
149
|
-
parts.append(heading(obj_name, min(indent_level + 1, 6)))
|
150
|
-
|
151
|
-
if description:
|
152
|
-
parts.append(f"\n{description}\n")
|
153
|
-
|
154
|
-
model_fields = getattr(obj if is_class else obj.__class__, "model_fields", {})
|
155
|
-
fields_data = []
|
156
|
-
|
157
|
-
for field_name, field_info in model_fields.items():
|
158
|
-
field_data = {
|
159
|
-
"name": field_name,
|
160
|
-
"type": convert_type_to_string(field_info.annotation)
|
161
|
-
if show_types
|
162
|
-
else None,
|
163
|
-
"required": getattr(field_info, "is_required", lambda: True)()
|
164
|
-
if show_required
|
165
|
-
else None,
|
166
|
-
"default": getattr(field_info, "default", None) if show_defaults else None,
|
167
|
-
"value": getattr(obj, field_name, None)
|
168
|
-
if show_values and is_instance
|
169
|
-
else None,
|
170
|
-
"description": getattr(field_info, "description", None),
|
171
|
-
}
|
172
|
-
fields_data.append(field_data)
|
173
|
-
|
174
|
-
if table_format and fields_data:
|
175
|
-
# Create table
|
176
|
-
headers = ["Field"]
|
177
|
-
if show_types:
|
178
|
-
headers.append("Type")
|
179
|
-
if show_required:
|
180
|
-
headers.append("Required")
|
181
|
-
if show_defaults:
|
182
|
-
headers.append("Default")
|
183
|
-
if show_values and is_instance:
|
184
|
-
headers.append("Value")
|
185
|
-
|
186
|
-
parts.append("\n" + table_row(headers, is_header=True))
|
187
|
-
|
188
|
-
for field_data in fields_data:
|
189
|
-
row = [code(field_data["name"])]
|
190
|
-
if show_types:
|
191
|
-
row.append(field_data["type"] or "")
|
192
|
-
if show_required:
|
193
|
-
row.append("Yes" if field_data["required"] else "No")
|
194
|
-
if show_defaults:
|
195
|
-
row.append(
|
196
|
-
str(field_data["default"])
|
197
|
-
if field_data["default"] is not None
|
198
|
-
else ""
|
199
|
-
)
|
200
|
-
if show_values and is_instance:
|
201
|
-
row.append(
|
202
|
-
str(field_data["value"]) if field_data["value"] is not None else ""
|
203
|
-
)
|
204
|
-
parts.append(table_row(row))
|
205
|
-
else:
|
206
|
-
# List format
|
207
|
-
for field_data in fields_data:
|
208
|
-
field_desc = code(field_data["name"])
|
209
|
-
if field_data["type"]:
|
210
|
-
field_desc += f" ({field_data['type']})"
|
211
|
-
if field_data["required"] is not None:
|
212
|
-
field_desc += (
|
213
|
-
" " + bold("[Required]")
|
214
|
-
if field_data["required"]
|
215
|
-
else " " + italic("[Optional]")
|
216
|
-
)
|
217
|
-
if field_data["default"] is not None:
|
218
|
-
field_desc += f" - default: {field_data['default']}"
|
219
|
-
if field_data["value"] is not None:
|
220
|
-
field_desc += f" = {field_data['value']}"
|
221
|
-
|
222
|
-
parts.append(list_item(field_desc, indent_level))
|
223
|
-
|
224
|
-
if field_data["description"]:
|
225
|
-
parts.append(list_item(field_data["description"], indent_level + 1))
|
226
|
-
|
227
|
-
return "\n".join(parts)
|
228
|
-
|
229
|
-
|
230
|
-
def convert_function_to_markdown(
|
231
|
-
obj: Callable,
|
232
|
-
name: Optional[str],
|
233
|
-
description: Optional[str],
|
234
|
-
show_signature: bool,
|
235
|
-
show_docstring: bool,
|
236
|
-
indent_level: int,
|
237
|
-
) -> str:
|
238
|
-
"""Convert a function to Markdown format."""
|
239
|
-
func_name = name or obj.__name__
|
240
|
-
|
241
|
-
parts = []
|
242
|
-
parts.append(heading(func_name, min(indent_level + 1, 6)))
|
243
|
-
|
244
|
-
if show_signature:
|
245
|
-
import inspect
|
246
|
-
|
247
|
-
try:
|
248
|
-
sig = inspect.signature(obj)
|
249
|
-
parts.append(f"\n{code(f'{func_name}{sig}')}\n")
|
250
|
-
except Exception:
|
251
|
-
pass
|
252
|
-
|
253
|
-
if description:
|
254
|
-
parts.append(f"\n{description}\n")
|
255
|
-
elif show_docstring and obj.__doc__:
|
256
|
-
doc_info = parse(obj.__doc__)
|
257
|
-
if doc_info.short_description:
|
258
|
-
parts.append(f"\n{doc_info.short_description}\n")
|
259
|
-
if doc_info.long_description:
|
260
|
-
parts.append(f"\n{doc_info.long_description}\n")
|
261
|
-
|
262
|
-
return "\n".join(parts)
|
263
|
-
|
264
|
-
|
265
|
-
def convert_collection_to_markdown(
|
266
|
-
obj: Union[List, Set, tuple],
|
267
|
-
name: Optional[str],
|
268
|
-
description: Optional[str],
|
269
|
-
compact: bool,
|
270
|
-
show_indices: bool,
|
271
|
-
indent_level: int,
|
272
|
-
visited: Set[int],
|
273
|
-
) -> str:
|
274
|
-
"""Convert a collection to Markdown format."""
|
275
|
-
obj_name = name or obj.__class__.__name__
|
276
|
-
|
277
|
-
parts = []
|
278
|
-
if not compact:
|
279
|
-
parts.append(heading(obj_name, min(indent_level + 1, 6)))
|
280
|
-
if description:
|
281
|
-
parts.append(f"\n{description}\n")
|
282
|
-
|
283
|
-
if not obj:
|
284
|
-
parts.append(italic("(empty)"))
|
285
|
-
return "\n".join(parts)
|
286
|
-
|
287
|
-
for i, item in enumerate(obj):
|
288
|
-
if show_indices:
|
289
|
-
item_text = (
|
290
|
-
f"[{i}] {convert_to_markdown(item, compact=True, _visited=visited)}"
|
291
|
-
)
|
292
|
-
else:
|
293
|
-
item_text = convert_to_markdown(item, compact=True, _visited=visited)
|
294
|
-
parts.append(list_item(item_text, indent_level))
|
295
|
-
|
296
|
-
return "\n".join(parts)
|
297
|
-
|
298
|
-
|
299
|
-
def convert_dict_to_markdown(
|
300
|
-
obj: Dict[Any, Any],
|
301
|
-
name: Optional[str],
|
302
|
-
description: Optional[str],
|
303
|
-
table_format: bool,
|
304
|
-
compact: bool,
|
305
|
-
indent_level: int,
|
306
|
-
visited: Set[int],
|
307
|
-
) -> str:
|
308
|
-
"""Convert a dictionary to Markdown format."""
|
309
|
-
obj_name = name or "Dictionary"
|
310
|
-
|
311
|
-
parts = []
|
312
|
-
if not compact:
|
313
|
-
parts.append(heading(obj_name, min(indent_level + 1, 6)))
|
314
|
-
if description:
|
315
|
-
parts.append(f"\n{description}\n")
|
316
|
-
|
317
|
-
if not obj:
|
318
|
-
parts.append(italic("(empty)"))
|
319
|
-
return "\n".join(parts)
|
320
|
-
|
321
|
-
if table_format and all(
|
322
|
-
isinstance(v, (str, int, float, bool, type(None))) for v in obj.values()
|
323
|
-
):
|
324
|
-
# Use table format for simple values
|
325
|
-
parts.append("\n" + table_row(["Key", "Value"], is_header=True))
|
326
|
-
for key, value in obj.items():
|
327
|
-
parts.append(table_row([code(str(key)), str(value)]))
|
328
|
-
else:
|
329
|
-
# Use list format
|
330
|
-
for key, value in obj.items():
|
331
|
-
key_str = code(str(key))
|
332
|
-
value_str = convert_to_markdown(value, compact=True, _visited=visited)
|
333
|
-
parts.append(list_item(f"{key_str}: {value_str}", indent_level))
|
334
|
-
|
335
|
-
return "\n".join(parts)
|
336
|
-
|
337
|
-
|
338
|
-
# -----------------------------------------------------------------------------
|
339
|
-
# Main Converter Function
|
340
|
-
# -----------------------------------------------------------------------------
|
341
|
-
|
342
|
-
|
343
|
-
def convert_to_markdown(
|
344
|
-
obj: Any,
|
345
|
-
*,
|
346
|
-
# Formatting options
|
347
|
-
name: Optional[str] = None,
|
348
|
-
description: Optional[str] = None,
|
349
|
-
heading_level: int = 1,
|
350
|
-
table_format: bool = False,
|
351
|
-
compact: bool = False,
|
352
|
-
code_block_language: Optional[str] = None,
|
353
|
-
# Display options
|
354
|
-
show_types: bool = True,
|
355
|
-
show_values: bool = True,
|
356
|
-
show_defaults: bool = True,
|
357
|
-
show_required: bool = True,
|
358
|
-
show_docstring: bool = True,
|
359
|
-
show_signature: bool = True,
|
360
|
-
show_indices: bool = False,
|
361
|
-
# Style options
|
362
|
-
escape_special_chars: bool = False,
|
363
|
-
add_toc: bool = False,
|
364
|
-
add_horizontal_rules: bool = False,
|
365
|
-
# Internal
|
366
|
-
_visited: Optional[Set[int]] = None,
|
367
|
-
_indent_level: int = 0,
|
368
|
-
) -> str:
|
369
|
-
"""
|
370
|
-
Converts any object into a Markdown formatted string.
|
371
|
-
|
372
|
-
Args:
|
373
|
-
obj: The object to convert to Markdown
|
374
|
-
name: Optional name/title for the object
|
375
|
-
description: Optional description to add
|
376
|
-
heading_level: Starting heading level (1-6)
|
377
|
-
table_format: Use tables for structured data when possible
|
378
|
-
compact: Minimize formatting for inline usage
|
379
|
-
code_block_language: If set, wrap entire output in code block
|
380
|
-
show_types: Include type information
|
381
|
-
show_values: Show current values (for instances)
|
382
|
-
show_defaults: Show default values
|
383
|
-
show_required: Show required/optional status
|
384
|
-
show_docstring: Include docstrings
|
385
|
-
show_signature: Show function signatures
|
386
|
-
show_indices: Show indices for collections
|
387
|
-
escape_special_chars: Escape Markdown special characters
|
388
|
-
add_toc: Add table of contents (not implemented)
|
389
|
-
add_horizontal_rules: Add separators between sections
|
390
|
-
|
391
|
-
Returns:
|
392
|
-
Markdown formatted string representation of the object
|
393
|
-
"""
|
394
|
-
# Handle circular references
|
395
|
-
visited = _visited if _visited is not None else set()
|
396
|
-
obj_id = id(obj)
|
397
|
-
|
398
|
-
if obj_id in visited:
|
399
|
-
return italic("(circular reference)")
|
400
|
-
|
401
|
-
visited_copy = visited.copy()
|
402
|
-
visited_copy.add(obj_id)
|
403
|
-
|
404
|
-
# Handle None
|
405
|
-
if obj is None:
|
406
|
-
return code("None")
|
407
|
-
|
408
|
-
# Handle primitives
|
409
|
-
if isinstance(obj, (str, int, float, bool)):
|
410
|
-
text = str(obj)
|
411
|
-
if escape_special_chars and isinstance(obj, str):
|
412
|
-
text = _escape_markdown(text)
|
413
|
-
return text if compact else code(text)
|
414
|
-
|
415
|
-
# Handle bytes
|
416
|
-
if isinstance(obj, bytes):
|
417
|
-
return code(f"b'{obj.hex()}'")
|
418
|
-
|
419
|
-
# Wrap in code block if requested
|
420
|
-
if code_block_language:
|
421
|
-
try:
|
422
|
-
if code_block_language.lower() == "json":
|
423
|
-
content = json.dumps(obj, indent=2)
|
424
|
-
else:
|
425
|
-
content = str(obj)
|
426
|
-
return code_block(content, code_block_language)
|
427
|
-
except Exception:
|
428
|
-
pass
|
429
|
-
|
430
|
-
result = ""
|
431
|
-
|
432
|
-
# Handle dataclasses
|
433
|
-
if is_dataclass(obj):
|
434
|
-
result = convert_dataclass_to_markdown(
|
435
|
-
obj,
|
436
|
-
name,
|
437
|
-
description,
|
438
|
-
table_format,
|
439
|
-
show_types,
|
440
|
-
show_defaults,
|
441
|
-
show_values,
|
442
|
-
_indent_level,
|
443
|
-
)
|
444
|
-
|
445
|
-
# Handle Pydantic models
|
446
|
-
elif is_pydantic_basemodel(obj):
|
447
|
-
result = convert_pydantic_to_markdown(
|
448
|
-
obj,
|
449
|
-
name,
|
450
|
-
description,
|
451
|
-
table_format,
|
452
|
-
show_types,
|
453
|
-
show_defaults,
|
454
|
-
show_values,
|
455
|
-
show_required,
|
456
|
-
_indent_level,
|
457
|
-
)
|
458
|
-
|
459
|
-
# Handle msgspec structs
|
460
|
-
elif is_msgspec_struct(obj):
|
461
|
-
# Similar to dataclass handling
|
462
|
-
result = convert_dataclass_to_markdown(
|
463
|
-
obj,
|
464
|
-
name,
|
465
|
-
description,
|
466
|
-
table_format,
|
467
|
-
show_types,
|
468
|
-
show_defaults,
|
469
|
-
show_values,
|
470
|
-
_indent_level,
|
471
|
-
)
|
472
|
-
|
473
|
-
# Handle functions
|
474
|
-
elif callable(obj) and hasattr(obj, "__name__"):
|
475
|
-
result = convert_function_to_markdown(
|
476
|
-
obj, name, description, show_signature, show_docstring, _indent_level
|
477
|
-
)
|
478
|
-
|
479
|
-
# Handle collections
|
480
|
-
elif isinstance(obj, (list, tuple, set)):
|
481
|
-
result = convert_collection_to_markdown(
|
482
|
-
obj, name, description, compact, show_indices, _indent_level, visited_copy
|
483
|
-
)
|
484
|
-
|
485
|
-
# Handle dictionaries
|
486
|
-
elif isinstance(obj, dict):
|
487
|
-
result = convert_dict_to_markdown(
|
488
|
-
obj, name, description, table_format, compact, _indent_level, visited_copy
|
489
|
-
)
|
490
|
-
|
491
|
-
# Default handling
|
492
|
-
else:
|
493
|
-
obj_name = name or obj.__class__.__name__
|
494
|
-
parts = []
|
495
|
-
if not compact:
|
496
|
-
parts.append(heading(obj_name, min(_indent_level + 1, 6)))
|
497
|
-
if description:
|
498
|
-
parts.append(f"\n{description}\n")
|
499
|
-
parts.append(code(str(obj)))
|
500
|
-
result = "\n".join(parts)
|
501
|
-
|
502
|
-
# Add horizontal rule if requested
|
503
|
-
if add_horizontal_rules and not compact and _indent_level == 0:
|
504
|
-
result += f"\n\n{horizontal_rule()}\n"
|
505
|
-
|
506
|
-
return result
|
@@ -1,65 +0,0 @@
|
|
1
|
-
hammad/__init__.py,sha256=eeb0R0wxMJGlYNT6ksfI_nWrVoFt5Oy7XnwYs0TbDpM,1355
|
2
|
-
hammad/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
-
hammad/based/__init__.py,sha256=cqAMf0nN2BzTMldMlh5ZvVrVRhSy5A0W9HxzHsXoLOY,1168
|
4
|
-
hammad/based/fields.py,sha256=dVwVx-hjDwxEkuqkndchZxGVWvAAl9B5XuLti2JziYA,19288
|
5
|
-
hammad/based/model.py,sha256=ROnby4MWqBDtgLG28Ywp4cmJJtGjXo1a4zjKPDYTWSc,35561
|
6
|
-
hammad/based/utils.py,sha256=0kEiHng2ybFk1YrDJHzzhsdwhhectfIbiWk0CvNGhzo,16023
|
7
|
-
hammad/cache/__init__.py,sha256=tFoiLMuw150cJ5tZTSMYa-H4n7mzhsCCjtD714RtH-0,515
|
8
|
-
hammad/cache/_cache.py,sha256=XBsRoPYT1bVYx9rLYKoD8whTUpepp91PYyJs6lhuB6o,25295
|
9
|
-
hammad/cli/__init__.py,sha256=mxlAWQnXBrPDBS0aneWe6j7snrzDgKp6wrd87qI8L9A,496
|
10
|
-
hammad/cli/plugins/__init__.py,sha256=1l4e68XzmMIaKXTkzLPoxECXosGaW8IOK1kEaqh9nJ0,25971
|
11
|
-
hammad/cli/styles/__init__.py,sha256=G-j_Sx8uOUYR4HjbcOYuA26HXZ5-yd5y8SS3Qj5o_7U,189
|
12
|
-
hammad/cli/styles/animations.py,sha256=vYEfOKBvCGvXMNu7jJGkxX8_XUjEuKoMvKCMGKIXMUg,17874
|
13
|
-
hammad/cli/styles/settings.py,sha256=i07i7y6YoTr5HkeWbgYRA9JwZv2AKcC0o4KBkHunARA,5409
|
14
|
-
hammad/cli/styles/types.py,sha256=vNIeQY_23m10K8qVT7Iy-PMwosGL-La-UAZKszHJjEE,7911
|
15
|
-
hammad/cli/styles/utils.py,sha256=BGFwQIEJHWlTAXed8ZxHeI_phLfEdh-_Mok2fe-jn7g,19356
|
16
|
-
hammad/data/__init__.py,sha256=B1g9mPhe9L6tQ9QbfiUEG16j16-jinaFQa9khTLoOMo,1273
|
17
|
-
hammad/data/collections/__init__.py,sha256=vujWqbnhTftqXjrmvKG949cLr6nD-azWHdng1jEpNvw,777
|
18
|
-
hammad/data/collections/base_collection.py,sha256=ZRht7OZjLIT8GxNvMgNxTarbCTY6EUUurEkGHZ3Rsy4,1419
|
19
|
-
hammad/data/collections/collection.py,sha256=JnOmD7E0GkBA7VBS7yJjXS76Rvo4dAT7KZk9SmLtZ1g,7436
|
20
|
-
hammad/data/collections/searchable_collection.py,sha256=vCV_JgMwB57QRi4Cri6dfEUzLCyTBN58_JfWEKL2h_0,21361
|
21
|
-
hammad/data/collections/vector_collection.py,sha256=D0aNyRwTe6VOyDAFS9Iyiw_4isvVNjudoGtd1KElSPU,17241
|
22
|
-
hammad/data/databases/__init__.py,sha256=NfRKlADRMzOsPrspOCyA0GmmCoHVXXqRfriqOZrDiYw,402
|
23
|
-
hammad/data/databases/database.py,sha256=jteV-P8BMsPd9NA_J-jeFkOQN3uFNitaDZN5uwv2yRY,18946
|
24
|
-
hammad/data/types/__init__.py,sha256=P_dM1RZf3W0zYpRV0KSZw24pHKQxCAl9tRV51BZwOHk,729
|
25
|
-
hammad/data/types/files/__init__.py,sha256=ufxESRe0PYBSxIs4FMhEUWK1DdlLpBFiaHyxsQuRtAg,30
|
26
|
-
hammad/data/types/files/audio.py,sha256=T5t4P6UN2oFUgzj-bVkWpEGZ91A8M-HxNxC65peOQjA,2361
|
27
|
-
hammad/data/types/files/configuration.py,sha256=PFg5InnHdGRyOMOySNL5u4ufo3uDORYAthgnlX2ATzQ,15457
|
28
|
-
hammad/data/types/files/document.py,sha256=9it-VC6gaTXqDGhFjzVenTr9Zb5RkXAcMpPaDWKC_Wk,6305
|
29
|
-
hammad/data/types/files/file.py,sha256=LWr5LaUljJfLTWvwDIAj37tuIa3Z7IG4SQcqn87xEwE,11204
|
30
|
-
hammad/data/types/files/image.py,sha256=orCnLwtthYV0ohzOLhIhWef6S4NgdBBw4udw-MbSnxI,2281
|
31
|
-
hammad/json/__init__.py,sha256=hCyzw5Hyyf7YqsED7P52DtMHM2XvZtdsaxV0y8nSkps,458
|
32
|
-
hammad/json/converters.py,sha256=gXWJRN6OlzqDoL69nZqtyn8ET22Sxv7znso-VVamDR4,5480
|
33
|
-
hammad/logging/__init__.py,sha256=FwpYFBF8wpYxDKXtRBhQQFP8ymFuNF5bnTBu5DFhK8s,557
|
34
|
-
hammad/logging/decorators.py,sha256=Wa3q063UxJDd9Orx-unkLkVF8Mt-KWNcWV6SwS5YOqg,14756
|
35
|
-
hammad/logging/logger.py,sha256=jk23wkdAf8qeKStBEUMWxEESuEXR4OWPYChEMsPYyrY,17543
|
36
|
-
hammad/pydantic/__init__.py,sha256=0qljzy1ZdTHSSly1KbhgdyLyVPU7JjX5uDKUdFuYFuA,994
|
37
|
-
hammad/pydantic/converters.py,sha256=d5fDXHTrxVCpBi3H-OuZShxD_BeCev5hupcsvC6csg8,20199
|
38
|
-
hammad/pydantic/models/__init__.py,sha256=HR9sQ_pC0Xaw8o_FgQwW-tT2hqHXRTLhhFxBXXcdKIY,648
|
39
|
-
hammad/pydantic/models/arbitrary_model.py,sha256=XSsB2hMC3bCHwyLXepe1D_S3M57yaWG5QUBo3pAoG_M,1524
|
40
|
-
hammad/pydantic/models/cacheable_model.py,sha256=JDzV5kZrgEPovE3M2bF4scoCAoGEhISeMhc69cifDfM,2809
|
41
|
-
hammad/pydantic/models/fast_model.py,sha256=WVJxcUQydScQLhzMOh88Kn2WIFtN5cel_srI6UL3kVk,11716
|
42
|
-
hammad/pydantic/models/function_model.py,sha256=pMtCM2slqJso77L5WuCMoNtm3gO_OMoSe87tgODaZJM,6300
|
43
|
-
hammad/pydantic/models/subscriptable_model.py,sha256=yJ-PpaXPu0eKEktNrGizj5rOSHLGclDAGjwtnYYAcgY,1706
|
44
|
-
hammad/text/__init__.py,sha256=5oDbPD74ziwPGew36SXeV0ltwutNyigzVRfj6y0WTfQ,771
|
45
|
-
hammad/text/text.py,sha256=F1XD2YvXlbS8N18eH97FTaKN5haODTgAA8vGzuy3dcs,33388
|
46
|
-
hammad/text/utils/__init__.py,sha256=c4GEfUadmnhrx3h5T0JT38icULObriObPOucrr1tiL4,24
|
47
|
-
hammad/text/utils/converters.py,sha256=cBlOJ5qPGsBhP7q785ITuuLRR0RPhr0HfAyaXGTsiCg,8208
|
48
|
-
hammad/text/utils/markdown/__init__.py,sha256=TK4Nm88dkMyemsUmWD8uS8zSo4hDwkFhElIcOyQkVPs,33
|
49
|
-
hammad/text/utils/markdown/converters.py,sha256=aZze09fEB__WHiV08DGGxXAZWX4OgR90m0P3bwy6Crk,15406
|
50
|
-
hammad/text/utils/markdown/formatting.py,sha256=XCldk1sVfkQF-c1aMZOjkIy8xNIddi0VGwQaOqmrWCY,3209
|
51
|
-
hammad/typing/__init__.py,sha256=UMUo_-BsDBGVfk7ByWzymsoaxnAcK-Svp-g3d9BN0CI,10694
|
52
|
-
hammad/web/__init__.py,sha256=vh1HjRhhHb0yESYf6JdSyaRjjTZVAn3Q3kJ8vu9uhO8,1054
|
53
|
-
hammad/web/utils.py,sha256=B4GAVsdKgFgVUMOGI0L2_3HKVSjeJsFRml4RevTA6Ic,15685
|
54
|
-
hammad/web/http/__init__.py,sha256=jn9Rn7Yg2cypD7duTTNFuW2wQZx9B63Bde4RJJeDYU0,22
|
55
|
-
hammad/web/http/client.py,sha256=N_w9WFwolrb43BTNbmi2feHJBoB7Z8PX-XOsHyS6efo,33147
|
56
|
-
hammad/web/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
57
|
-
hammad/web/openapi/client.py,sha256=1pXz7KAO_0pN4kQZoWKWskXDYGiJ535TsPO1GGCiC0E,26816
|
58
|
-
hammad/web/search/__init__.py,sha256=e9A6znPIiZCz-4secyHbUs0uUGf5yAqW6wGacgx961U,24
|
59
|
-
hammad/web/search/client.py,sha256=_ifT8RcW6Xibhg8J-ouEc7BRA2cTd0xQO3rzOjM53t0,33692
|
60
|
-
hammad/yaml/__init__.py,sha256=HJb_8-xFxizGFEIbELN2sTEfKB-_wQvA6spj_kkXuCo,524
|
61
|
-
hammad/yaml/converters.py,sha256=NQHetbxfkTS3jEJyThsz-hnG2IgRSbaGs_TnqNjFciA,510
|
62
|
-
hammad_python-0.0.11.dist-info/METADATA,sha256=buxO0GEAaH-EQG7As4C6B6jBs8MyjyHYime5L-WTjCw,1323
|
63
|
-
hammad_python-0.0.11.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
64
|
-
hammad_python-0.0.11.dist-info/licenses/LICENSE,sha256=h74yFUWjbBaodcWG5wNmm30npjl8obVcxD-1nQfUp2I,1069
|
65
|
-
hammad_python-0.0.11.dist-info/RECORD,,
|
File without changes
|
File without changes
|