Source code for typer_router.route

from pathlib import Path
from typing import List

from pydantic import BaseModel

from typer_router.exc import NoParentRouteException

DEFAULT_FUNCTION_NAME = "main"


[docs]class Route(BaseModel): import_path: str name: str is_dir: bool function_name: str = DEFAULT_FUNCTION_NAME @property def parts(self) -> List[str]: return self.import_path.split(".") @property def subpaths(self) -> List[str]: parts = self.parts return [".".join(parts[:i]) for i in range(1, len(parts))] @property def subroutes(self) -> List["Route"]: return [ Route.from_import_path(path, is_dir=True, function_name=self.function_name) for path in self.subpaths ] @property def parent(self) -> "Route": try: return self.subroutes[-1] except IndexError: raise NoParentRouteException(f"No parent route for {self.import_path}") @property def depth(self) -> int: return len(self.parts)
[docs] @classmethod def from_file_path( cls, file_path: Path, function_name: str = DEFAULT_FUNCTION_NAME ) -> "Route": import_path = file_path.as_posix().replace("/", ".").replace(".py", "") name = file_path.stem return cls( import_path=import_path, name=name, is_dir=False, function_name=function_name, )
[docs] @classmethod def from_import_path( cls, import_path: str, is_dir: bool, function_name: str = DEFAULT_FUNCTION_NAME ) -> "Route": name = import_path.split(".")[-1] return cls( import_path=import_path, name=name, is_dir=is_dir, function_name=function_name, )