♻️Refactor App/Project

- also fix ohmyapi.core.scaffolding.startapp
This commit is contained in:
Brian Wiborg 2025-09-27 06:04:19 +02:00
parent 69bd447374
commit 557bda6045
No known key found for this signature in database
2 changed files with 63 additions and 62 deletions

View file

@ -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

View file

@ -55,7 +55,7 @@ def startapp(name: str, project: str):
"""Create a new app inside a project: templates go into <project_dir>/<name>/"""
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!")