def generate_class_markdown()

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("<", "&#60;").replace(
            ">", "&#62;"
        )
        # 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)