Spaces:
Running
on
Zero
Running
on
Zero
"""Script for auto-generating api_reference.rst""" | |
import glob | |
import re | |
from pathlib import Path | |
ROOT_DIR = Path(__file__).parents[1].absolute() | |
print(ROOT_DIR) | |
PKG_DIR = ROOT_DIR / "gpt_engineer" | |
WRITE_FILE = Path(__file__).parent / "api_reference.rst" | |
def load_members() -> dict: | |
members: dict = {} | |
for py in glob.glob(str(PKG_DIR) + "/**/*.py", recursive=True): | |
module = py[len(str(PKG_DIR)) + 1 :].replace(".py", "").replace("/", ".") | |
top_level = module.split(".")[0] | |
if top_level not in members: | |
members[top_level] = {"classes": [], "functions": []} | |
with open(py, "r") as f: | |
for line in f.readlines(): | |
cls = re.findall(r"^class ([^_].*)\(", line) | |
members[top_level]["classes"].extend([module + "." + c for c in cls]) | |
func = re.findall(r"^def ([^_].*)\(", line) | |
afunc = re.findall(r"^async def ([^_].*)\(", line) | |
func_strings = [module + "." + f for f in func + afunc] | |
members[top_level]["functions"].extend(func_strings) | |
return members | |
def construct_doc(members: dict) -> str: | |
full_doc = """\ | |
.. _api_reference: | |
============= | |
API Reference | |
============= | |
""" | |
for module, _members in sorted(members.items(), key=lambda kv: kv[0]): | |
classes = _members["classes"] | |
functions = _members["functions"] | |
if not (classes or functions): | |
continue | |
module_title = module.replace("_", " ").title() | |
if module_title == "Llms": | |
module_title = "LLMs" | |
section = f":mod:`gpt_engineer.{module}`: {module_title}" | |
full_doc += f"""\ | |
{section} | |
{'=' * (len(section) + 1)} | |
.. automodule:: gpt_engineer.{module} | |
:no-members: | |
:no-inherited-members: | |
""" | |
if classes: | |
cstring = "\n ".join(sorted(classes)) | |
full_doc += f"""\ | |
Classes | |
-------------- | |
.. currentmodule:: gpt_engineer | |
.. autosummary:: | |
:toctree: {module} | |
:template: class.rst | |
{cstring} | |
""" | |
if functions: | |
fstring = "\n ".join(sorted(functions)) | |
full_doc += f"""\ | |
Functions | |
-------------- | |
.. currentmodule:: gpt_engineer | |
.. autosummary:: | |
:toctree: {module} | |
{fstring} | |
""" | |
return full_doc | |
def main() -> None: | |
members = load_members() | |
full_doc = construct_doc(members) | |
with open(WRITE_FILE, "w") as f: | |
f.write(full_doc) | |
if __name__ == "__main__": | |
main() | |