Source code for jivago.wsgi.routing.table.reflective_routing_table

from typing import List

from jivago.lang.registration import Registration
from jivago.lang.registry import Registry
from jivago.lang.stream import Stream
from jivago.wsgi.annotations import Path
from jivago.wsgi.methods import http_methods
from jivago.wsgi.routing.table.tree_routing_table import TreeRoutingTable


[docs]class ReflectiveRoutingTable(TreeRoutingTable): def __init__(self, registry: Registry, resources: List[Registration]): super().__init__() for resource in resources: for primitive in http_methods: routable_functions = registry.get_annotated_in_package(primitive, resource.registered.__module__) sub_paths = registry.get_annotated_in_package(Path, resource.registered.__module__) for route_function in routable_functions: route_sub_path = Stream(sub_paths).firstMatch(lambda r: r.registered == route_function.registered) resource_path = resource.arguments['value'] if not route_sub_path.isPresent(): self.register_route(primitive, resource_path, resource.registered, route_function.registered) else: sub_path = route_sub_path.get().arguments['value'] path = resource_path + sub_path if \ resource_path.endswith('/') or sub_path.startswith('/') \ else resource_path + '/' + sub_path self.register_route(primitive, path, resource.registered, route_function.registered)