aboutsummaryrefslogtreecommitdiffstats
path: root/backend/route_manager.py
diff options
context:
space:
mode:
authorGravatar decorator-factory <[email protected]>2020-12-15 09:03:00 +0300
committerGravatar decorator-factory <[email protected]>2020-12-15 09:03:00 +0300
commit55d51f87438fe0402b34f653807e596a3d2082c0 (patch)
tree55d83c4f4d1f03be473b5549f1590f854911870a /backend/route_manager.py
parentadd pytest (diff)
refactor route discovery
Diffstat (limited to 'backend/route_manager.py')
-rw-r--r--backend/route_manager.py44
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())