Spaces:
Running
Running
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| import asyncio | |
| import shutil | |
| from pathlib import Path | |
| import typer | |
| from metagpt.actions.rebuild_class_view import RebuildClassView | |
| from metagpt.actions.rebuild_sequence_view import RebuildSequenceView | |
| from metagpt.context import Context | |
| from metagpt.llm import LLM | |
| from metagpt.logs import logger | |
| from metagpt.utils.git_repository import GitRepository | |
| from metagpt.utils.project_repo import ProjectRepo | |
| app = typer.Typer(add_completion=False, pretty_exceptions_show_locals=False) | |
| def startup( | |
| project_root: str = typer.Argument( | |
| default="", | |
| help="Specify the root directory of the existing project for reverse engineering.", | |
| ), | |
| output_dir: str = typer.Option(default="", help="Specify the output directory path for reverse engineering."), | |
| ): | |
| package_root = Path(project_root) | |
| if not package_root.exists(): | |
| raise FileNotFoundError(f"{project_root} not exists") | |
| if not _is_python_package_root(package_root): | |
| raise FileNotFoundError(f'There are no "*.py" files under "{project_root}".') | |
| init_file = package_root / "__init__.py" # used by pyreverse | |
| init_file_exists = init_file.exists() | |
| if not init_file_exists: | |
| init_file.touch() | |
| if not output_dir: | |
| output_dir = package_root / "../reverse_engineering_output" | |
| logger.info(f"output dir:{output_dir}") | |
| try: | |
| asyncio.run(reverse_engineering(package_root, Path(output_dir))) | |
| finally: | |
| if not init_file_exists: | |
| init_file.unlink(missing_ok=True) | |
| tmp_dir = package_root / "__dot__" | |
| if tmp_dir.exists(): | |
| shutil.rmtree(tmp_dir, ignore_errors=True) | |
| def _is_python_package_root(package_root: Path) -> bool: | |
| for file_path in package_root.iterdir(): | |
| if file_path.is_file(): | |
| if file_path.suffix == ".py": | |
| return True | |
| return False | |
| async def reverse_engineering(package_root: Path, output_dir: Path): | |
| ctx = Context() | |
| ctx.git_repo = GitRepository(output_dir) | |
| ctx.repo = ProjectRepo(ctx.git_repo) | |
| action = RebuildClassView(name="ReverseEngineering", i_context=str(package_root), llm=LLM(), context=ctx) | |
| await action.run() | |
| action = RebuildSequenceView(name="ReverseEngineering", llm=LLM(), context=ctx) | |
| await action.run() | |
| if __name__ == "__main__": | |
| app() | |