diff --git a/src/ohmyapi/core/runtime.py b/src/ohmyapi/core/runtime.py index 5e0db0d..e1ed344 100644 --- a/src/ohmyapi/core/runtime.py +++ b/src/ohmyapi/core/runtime.py @@ -15,67 +15,6 @@ from fastapi import FastAPI, APIRouter from ohmyapi.db.model import Model -class App: - """App container holding runtime data like detected models and routes.""" - - def __init__(self, project: "OhMyAPI Project", name: str): - self.project = project - self.name = name - - # The list of module paths (e.g. "ohmyapi_auth.models") for Tortoise and Aerich - self.model_modules: List[str] = [] - - # The APIRouter - self.router: Optional[APIRouter] = None - - # Import the app, so its __init__.py runs. - importlib.import_module(self.name) - - # Load the models - try: - models_mod = importlib.import_module(f"{self.name}.models") - self.model_modules.append(f"{self.name}.models") - except ModuleNotFoundError: - pass - - # Locate the APIRouter - try: - routes_mod = importlib.import_module(f"{self.name}.routes") - router = getattr(routes_mod, "router", None) - if isinstance(router, APIRouter): - self.router = router - except ModuleNotFoundError: - 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 - - def __str__(self): - return self.__repr__() - - @property - def models(self) -> List[Model]: - models: List[Model] = [] - 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 - - @property - def routes(self): - return self.router.routes - - class Project: """ Project runtime loader + Tortoise/Aerich integration. @@ -244,3 +183,65 @@ class Project: # No migrations yet, initialize then retry upgrade await c.init_db(safe=True) await c.upgrade() + + +class App: + """App container holding runtime data like detected models and routes.""" + + def __init__(self, project: Project, name: str): + self.project = project + self.name = name + + # The list of module paths (e.g. "ohmyapi_auth.models") for Tortoise and Aerich + self.model_modules: List[str] = [] + + # The APIRouter + self.router: Optional[APIRouter] = None + + # Import the app, so its __init__.py runs. + importlib.import_module(self.name) + + # Load the models + try: + models_mod = importlib.import_module(f"{self.name}.models") + self.model_modules.append(f"{self.name}.models") + except ModuleNotFoundError: + pass + + # Locate the APIRouter + try: + routes_mod = importlib.import_module(f"{self.name}.routes") + router = getattr(routes_mod, "router", None) + if isinstance(router, APIRouter): + self.router = router + except ModuleNotFoundError: + 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 + + def __str__(self): + return self.__repr__() + + @property + def models(self) -> List[Model]: + models: List[Model] = [] + 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 + + @property + def routes(self): + return self.router.routes + diff --git a/src/ohmyapi/core/scaffolding.py b/src/ohmyapi/core/scaffolding.py index 8674dfd..b725f0e 100644 --- a/src/ohmyapi/core/scaffolding.py +++ b/src/ohmyapi/core/scaffolding.py @@ -55,7 +55,7 @@ def startapp(name: str, project: str): """Create a new app inside a project: templates go into //""" target_dir = Path(project) os.makedirs(target_dir, exist_ok=True) - render_template_dir("app", target_dir, {"project_name": project, "app_name": name}, subdir_name=name) + render_template_dir("app", target_dir, {"project_name": target_dir.resolve().name, "app_name": name}, subdir_name=name) print(f"✅ App '{name}' created in project '{target_dir}' successfully.") print(f"🔧 Remember to add '{name}' to your INSTALLED_APPS!")