diff options
author | 2020-12-15 09:03:00 +0300 | |
---|---|---|
committer | 2020-12-15 09:03:00 +0300 | |
commit | 55d51f87438fe0402b34f653807e596a3d2082c0 (patch) | |
tree | 55d83c4f4d1f03be473b5549f1590f854911870a | |
parent | add pytest (diff) |
refactor route discovery
-rw-r--r-- | backend/route_manager.py | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/backend/route_manager.py b/backend/route_manager.py index 437cbf6..7866404 100644 --- a/backend/route_manager.py +++ b/backend/route_manager.py @@ -17,6 +17,7 @@ from backend.route import Route def construct_route_map_from_dict(route_dict: dict) -> list[BaseRoute]: route_map = [] for mount, item in route_dict.items(): + print(mount, item) if inspect.isclass(item): route_map.append(StarletteRoute(mount, item)) else: @@ -32,32 +33,35 @@ def is_route_class(member: t.Any) -> bool: return inspect.isclass(member) and issubclass(member, Route) and member != Route -def create_route_map() -> list[BaseRoute]: +def route_classes() -> t.Iterator[tuple[Path, type[Route]]]: routes_directory = Path("backend") / "routes" - route_dict = nested_dict() - - for file in routes_directory.rglob("*.py"): - import_name = f"{str(file.parent).replace('/', '.')}.{file.stem}" - - route = importlib.import_module(import_name) - - for _member_name, member in inspect.getmembers(route): + for module_path in routes_directory.rglob("*.py"): + import_name = f"{str(module_path.parent).replace('/', '.')}.{module_path.stem}" + route_module = importlib.import_module(import_name) + for _member_name, member in inspect.getmembers(route_module): if is_route_class(member): member.check_parameters() + yield (module_path, member) - levels = str(file.parent).split("/")[2:] - current_level = None - for level in levels: - if current_level is None: - current_level = route_dict[f"/{level}"] - else: - current_level = current_level[f"/{level}"] +def create_route_map() -> list[BaseRoute]: + route_dict = nested_dict() - if current_level is not None: - current_level[member.path] = member - else: - route_dict[member.path] = member + for module_path, member in route_classes(): + # module_path == Path("backend/routes/foo/bar/baz/bin.py") + # => levels == ["foo", "bar", "baz"] + levels = str(module_path.parent).split("/")[2:] + current_level = None + for level in levels: + if current_level is None: + current_level = route_dict[f"/{level}"] + else: + current_level = current_level[f"/{level}"] + + if current_level is not None: + current_level[member.path] = member + else: + route_dict[member.path] = member return construct_route_map_from_dict(route_dict.to_dict()) |