diff --git a/src/ohmyapi/core/runtime.py b/src/ohmyapi/core/runtime.py index e1ed344..d07fd3f 100644 --- a/src/ohmyapi/core/runtime.py +++ b/src/ohmyapi/core/runtime.py @@ -2,10 +2,11 @@ import copy import importlib import importlib.util +import json import pkgutil import sys from pathlib import Path -from typing import Dict, List, Optional +from typing import Any, Dict, Generator, List, Optional import click from aerich import Command as AerichCommand @@ -218,28 +219,39 @@ class App: pass def __repr__(self): - out = "" - out += f"App: {self.name}\n" - out += f"Models:\n" - for model in self.models: - out += f" - {model.__name__}\n" - out += "Routes:\n" - for route in (self.routes or []): - out += f" - {route}\n" - return out + return json.dumps(self.dict(), indent=2) def __str__(self): return self.__repr__() + def _serialize_route(self, route): + """Convert APIRoute to JSON-serializable dict.""" + return { + "path": route.path, + "name": route.name, + "methods": list(route.methods), + "endpoint": route.endpoint.__name__, # just the function name + "response_model": getattr(route, "response_model", None).__name__ + if getattr(route, "response_model", None) else None, + "tags": getattr(route, "tags", None), + } + + def _serialize_router(self): + return [self._serialize_route(route) for route in self.routes] + + def dict(self) -> Dict[str, Any]: + return { + 'models': [m.__name__ for m in self.models], + 'routes': self._serialize_router(), + } + @property - def models(self) -> List[Model]: - models: List[Model] = [] + def models(self) -> Generator[Model, None, None]: for mod in self.model_modules: models_mod = importlib.import_module(mod) for obj in models_mod.__dict__.values(): if isinstance(obj, type) and getattr(obj, "_meta", None) is not None and obj.__name__ != 'Model': - models.append(obj) - return models + yield obj @property def routes(self):