refactor: consolidate exact post dispatch
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import ast
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
@@ -59,8 +60,32 @@ def _role(method: str, path: str) -> str:
|
||||
return required_role(method, sample)
|
||||
|
||||
|
||||
def _mapped_paths(text: str) -> dict[str, set[str]]:
|
||||
paths = {method: set() for method in ("GET", "POST", "DELETE")}
|
||||
tree = ast.parse(text)
|
||||
for node in tree.body:
|
||||
if not isinstance(node, ast.Assign) or len(node.targets) != 1:
|
||||
continue
|
||||
target = node.targets[0]
|
||||
if not isinstance(target, ast.Name):
|
||||
continue
|
||||
match = re.fullmatch(
|
||||
r"(?:PUBLIC_|AUTHENTICATED_)?(GET|POST|DELETE)_HANDLERS", target.id
|
||||
)
|
||||
if not match:
|
||||
continue
|
||||
mapping = ast.literal_eval(node.value)
|
||||
if not isinstance(mapping, dict) or not all(
|
||||
isinstance(path, str) and path.startswith("/api/") for path in mapping
|
||||
):
|
||||
raise ValueError(f"Invalid route handler map: {target.id}")
|
||||
paths[match.group(1)].update(mapping)
|
||||
return paths
|
||||
|
||||
|
||||
def build() -> dict:
|
||||
text = (ROOT / "backend" / "application.py").read_text(encoding="utf-8")
|
||||
mapped_paths = _mapped_paths(text)
|
||||
method_matches = list(re.finditer(r"^ def do_(GET|POST|DELETE)\(", text, re.MULTILINE))
|
||||
routes = []
|
||||
for index, match in enumerate(method_matches):
|
||||
@@ -68,6 +93,7 @@ def build() -> dict:
|
||||
end = method_matches[index + 1].start() if index + 1 < len(method_matches) else len(text)
|
||||
block = text[match.start():end]
|
||||
exact_paths = set(re.findall(r'parsed\.path\s*==\s*"(/api/[^"]+)"', block))
|
||||
exact_paths.update(mapped_paths[method])
|
||||
patterns = set(
|
||||
re.findall(
|
||||
r're\.(?:fullmatch|match)\(\s*r?["\']([^"\']*?/api/[^"\']+)["\']\s*,\s*parsed\.path',
|
||||
|
||||
Reference in New Issue
Block a user