| """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() | |