Skip to content

Commit 9403eef

Browse files
committed
feat: Implement parsing and rendering of class examples, and enhance documentation page layouts with MDX components.
1 parent f8a954b commit 9403eef

File tree

1 file changed

+64
-29
lines changed

1 file changed

+64
-29
lines changed

praisonai_tools/docs_generator/generator.py

Lines changed: 64 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class ClassInfo:
5454
methods: List[MethodInfo] = field(default_factory=list)
5555
class_methods: List[MethodInfo] = field(default_factory=list)
5656
properties: List[ParamInfo] = field(default_factory=list)
57+
examples: List[str] = field(default_factory=list)
5758

5859

5960
@dataclass
@@ -460,10 +461,14 @@ def parse_module(self, module_path: str) -> Optional[ModuleInfo]:
460461
def _parse_class(self, node: ast.ClassDef) -> Optional[ClassInfo]:
461462
try:
462463
bases = [self._get_annotation(b) for b in node.bases]
464+
raw_doc = ast.get_docstring(node) or ""
465+
parsed_doc = self._parse_docstring(raw_doc)
466+
463467
info = ClassInfo(
464468
name=node.name,
465-
docstring=ast.get_docstring(node) or "",
469+
docstring=parsed_doc["description"],
466470
bases=bases,
471+
examples=parsed_doc["examples"]
467472
)
468473

469474
for item in node.body:
@@ -892,21 +897,27 @@ def _render_module_granular(self, info: ModuleInfo) -> str:
892897

893898
if info.classes:
894899
lines.append("## Classes\n")
900+
lines.append("<CardGroup cols={2}>")
895901
for cls in info.classes:
896-
lines.append(f"**[Dedicated Page: {cls.name}](../classes/{cls.name})**\n")
897-
lines.extend(self._render_class(cls, info.package))
898-
lines.append("")
902+
lines.append(f' <Card title="{cls.name}" icon="brackets-curly" href="../classes/{cls.name}">')
903+
cls_desc = sanitize_description(cls.docstring) or "Class definition."
904+
lines.append(f" {cls_desc}")
905+
lines.append(" </Card>")
906+
lines.append("</CardGroup>\n")
899907

900908
if info.functions:
901909
lines.append("## Functions\n")
910+
lines.append("<CardGroup cols={2}>")
902911
for func in info.functions:
903-
lines.append(f"**[Dedicated Page: {func.name}()](../functions/{func.name})**\n")
904-
lines.extend(self._render_function(func, info.package))
905-
lines.append("")
912+
lines.append(f' <Card title="{func.name}()" icon="function" href="../functions/{func.name}">')
913+
func_desc = sanitize_description(func.docstring) or "Function definition."
914+
lines.append(f" {func_desc}")
915+
lines.append(" </Card>")
916+
lines.append("</CardGroup>\n")
906917

907918
if info.constants:
908919
lines.extend([
909-
"## Constants",
920+
"### Constants",
910921
"",
911922
"| Name | Value |",
912923
"|------|-------|",
@@ -924,7 +935,7 @@ def _render_module_granular(self, info: ModuleInfo) -> str:
924935
def _render_class_page(self, cls: ClassInfo, module_info: ModuleInfo) -> str:
925936
"""Render a dedicated Class Blueprint page."""
926937
safe_docstring = escape_mdx(cls.docstring) if cls.docstring else ""
927-
desc = f"Class reference for {cls.name}"
938+
desc = sanitize_description(cls.docstring) or f"Class reference for {cls.name}"
928939

929940
lines = [
930941
"---",
@@ -935,39 +946,63 @@ def _render_class_page(self, cls: ClassInfo, module_info: ModuleInfo) -> str:
935946
"",
936947
f"# {cls.name}",
937948
"",
938-
f"*Module: [{module_info.short_name}](../modules/{module_info.short_name})*",
949+
f"> Defined in the [**{module_info.short_name}**](../modules/{module_info.short_name}) module.",
939950
"",
940951
safe_docstring,
941952
"",
942953
]
943954

955+
# Add Mermaid Diagram if applicable
956+
mermaid = self._render_mermaid_diagram(cls.name)
957+
if mermaid:
958+
lines.append(mermaid)
959+
lines.append("")
960+
944961
if cls.init_params:
945-
lines.extend([
946-
"## Constructor",
947-
"",
948-
"| Parameter | Type | Required | Default |",
949-
"|-----------|------|----------|---------|",
950-
])
962+
lines.append("## Constructor\n")
951963
for p in cls.init_params:
952-
lines.append(f"| `{p.name}` | `{escape_for_table(p.type, is_type=True)}` | {'Yes' if p.required else 'No'} | `{escape_for_table(p.default, is_type=False) if p.default else '-'}` |")
953-
lines.append("")
964+
default_str = f' default="{escape_for_table(p.default)}"' if p.default and p.default != "None" else ""
965+
lines.extend([
966+
f'<ParamField query="{p.name}" type="{escape_for_table(p.type, is_type=True)}" required={"{true}" if p.required else "{false}"}{default_str}>',
967+
f' {escape_mdx(p.description) if p.description else "No description available."}',
968+
'</ParamField>',
969+
""
970+
])
954971

955972
if cls.properties:
956-
lines.extend([
957-
"## Properties",
958-
"",
959-
"| Property | Type |",
960-
"|----------|------|",
961-
])
973+
lines.append("## Properties\n")
962974
for p in cls.properties:
963-
lines.append(f"| `{p.name}` | `{escape_for_table(p.type, is_type=True)}` |")
964-
lines.append("")
975+
lines.extend([
976+
f'<ResponseField name="{p.name}" type="{escape_for_table(p.type, is_type=True)}">',
977+
f' {escape_mdx(p.description) if p.description else "No description available."}',
978+
'</ResponseField>',
979+
""
980+
])
965981

966-
if cls.methods:
982+
if cls.methods or cls.class_methods:
967983
lines.append("## Methods\n")
984+
lines.append("<CardGroup cols={2}>")
985+
for m in cls.class_methods:
986+
lines.append(f' <Card title="{m.name}()" icon="function" href="../functions/{cls.name}-{m.name}">')
987+
m_desc = sanitize_description(m.docstring) or "Class method."
988+
lines.append(f" {m_desc}")
989+
lines.append(" </Card>")
968990
for m in cls.methods:
969-
lines.append(f"- [{m.name}()](../functions/{cls.name}-{m.name})")
970-
lines.append("")
991+
lines.append(f' <Card title="{m.name}()" icon="function" href="../functions/{cls.name}-{m.name}">')
992+
m_desc = sanitize_description(m.docstring) or "Instance method."
993+
lines.append(f" {m_desc}")
994+
lines.append(" </Card>")
995+
lines.append("</CardGroup>\n")
996+
997+
if cls.examples:
998+
lines.append("## Usage\n")
999+
if len(cls.examples) > 1:
1000+
lines.append("<CodeGroup>")
1001+
for i, ex in enumerate(cls.examples):
1002+
lines.append(f"```python Example {i+1}\n{ex}\n```")
1003+
lines.append("</CodeGroup>\n")
1004+
else:
1005+
lines.append(f"```python\n{cls.examples[0]}\n```\n")
9711006

9721007
return "\n".join(lines)
9731008

0 commit comments

Comments
 (0)