From 4d8952eff799cc2180eb567d1537bad1db92c333 Mon Sep 17 00:00:00 2001 From: Brian Wiborg Date: Tue, 30 Sep 2025 00:30:55 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8D=B1=20Add=20package=5Frouters()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ohmyapi/router.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/ohmyapi/router.py b/src/ohmyapi/router.py index ed96e12..52116e1 100644 --- a/src/ohmyapi/router.py +++ b/src/ohmyapi/router.py @@ -1,2 +1,29 @@ +import importlib +import inspect +import pkgutil +import pathlib + from fastapi import APIRouter, Depends, HTTPException from http import HTTPStatus +from typing import Generator + + +def package_routers( + package_name: str, + package_path: str | pathlib.Path) -> Generator[APIRouter, None, None]: + """ + Discover all APIRouter instances in submodules of the given package. + """ + if isinstance(package_path, str): + package_path = pathlib.Path(package_path).parent + + for module_info in pkgutil.iter_modules([str(package_path)]): + if module_info.name.startswith("_"): + continue # skip private modules like __init__.py + + module_fqname = f"{package_name}.{module_info.name}" + module = importlib.import_module(module_fqname) + + for _, obj in inspect.getmembers(module): + if isinstance(obj, APIRouter): + yield obj