in flowtorch/docs.py [0:0]
def generate_class_markdown(symbol_name: str, entity: Any) -> str:
markdown = []
# Parents (for classes, this is like signature)
parents = []
for b in entity.__bases__:
parents.append(b.__module__ + "." + b.__name__)
parents_str = ", ".join(parents)
# Docstring
# TODO: Parse docstring and extract short summary
docstring = entity.__doc__ if entity.__doc__ is not None else "empty docstring"
docstring = "\n".join(line.strip() for line in docstring.splitlines())
# short_summary = "```short summary```\n"
safe_name = symbol_name.replace("_", r"\_")
# Create top section for class
markdown.append("<PythonClass>\n")
markdown.append(
"""<div className="doc-class-row">
<div className="doc-class-label"><span className="doc-symbol-label">class</span></div>
<div className="doc-class-signature">\n"""
)
markdown.append(
f"""## <span className="doc-symbol-name">{safe_name}</span> {{#class}}"""
)
markdown.append(
f"""<span className="doc-inherits-from">Inherits from: <span className=\
"doc-symbol-name">{parents_str}</span></span>\n"""
)
# markdown.append(short_summary)
markdown.append("</div>\n</div>\n\n</PythonClass>\n")
markdown.append(f"```\n{docstring}\n```\n")
# Methods for class
members = inspect.getmembers(entity, predicate=inspect.isroutine)
members = [
(n, obj) for n, obj in members if n == "__init__" or not n.startswith("_")
]
members = [(n, obj) for n, obj in members if type(obj) not in ["method_descriptor"]]
# member_strs = []
for member_name, member_object in members:
# Try to unwrap class method and fetch decorators
# decorators = []
try:
if hasattr(member_object, "__wrapped__"):
# decorators = get_decorators(member_object)
member_object = member_object.__wrapped__
except Exception:
pass
# TODO: Prepend decorators to method name
# for d in decorators:
# member_strs.append(d)
markdown.append("<PythonMethod>\n")
markdown.append(
"""<div className="doc-method-row">
<div className="doc-method-label"><span className="doc-symbol-label">member</span></div>
<div className="doc-method-signature">\n"""
)
# Some built-ins don't have a signature and throw exception...
try:
member_signature = str(signature(member_object))
except ValueError:
member_signature = "()"
safe_member_signature = member_signature.replace("<", "<").replace(
">", ">"
)
# safe_member_signature = safe_member_signature.replace("'", "\'")
safe_member_name = member_name.replace("_", r"\_")
safe_member_id = member_name.replace("_", "-")
markdown.append(
f"""### <span className="doc-symbol-name">{safe_member_name}</span>\
{{#{safe_member_id}}}\n"""
)
markdown.append(
f"""<span className="doc-symbol-signature">{safe_member_signature}\
</span>\n"""
)
markdown.append("</div>\n</div>\n\n</PythonMethod>\n")
member_docstring = (
member_object.__doc__
if member_object.__doc__ is not None
else "<empty docstring>"
)
member_docstring = "\n".join(
line.strip() for line in member_docstring.splitlines()
)
markdown.append(f"```\n{member_docstring}\n```\n")
return "\n".join(markdown)