sanic icon indicating copy to clipboard operation
sanic copied to clipboard

[Feature Request] Warn when multiple route names are the same

Open BenJeau opened this issue 1 year ago • 4 comments

Is your feature request related to a problem? Please describe your use case. Just spent a good amount of time trying to figure why injections were not working on certain routes, after digging the code a bit more, it seemed like when the route names are the same, the injection will overwrite the value in the SignatureRegistry

Describe the solution you'd like Something like this, showing which route names are already in the registry and maybe also mentioning which route have injections (although that last one would be for debugging purposes, maybe have a toggle?):

[2022-08-08 21:17:46 -0400] [80724] [DEBUG] Dispatching signal: server.init.after
[2022-08-08 21:23:19 -0400] [81202] [DEBUG] Injecting into route 'manager.cases.get_cases' {'user': (<class 'src.utils.User'>, <Constructor(func=create)>)} 
[2022-08-08 21:23:19 -0400] [81202] [WARNING] Following route has already been injected: 'ioc_manager.templates.get_rule_filters'
[2022-08-08 21:23:19 -0400] [81202] [WARNING] Following route has already been injected: 'ioc_manager.cases.get_case_iocs'
[2022-08-08 21:23:19 -0400] [81202] [WARNING] Following route has already been injected: 'ioc_manager.cases.get_case_iocs'
[2022-08-08 21:17:46 -0400] [80724] [INFO] Starting worker [80724]

For the warning, I've just added a simple check here:

https://github.com/sanic-org/sanic-ext/blob/b65cd9f28c8d1e6ee0aad91685bfb84fc4925ac6/sanic_ext/extensions/injection/registry.py#L54-L59

With

    def register(
        self,
        route_name: str,
        injections: Dict[str, Tuple[Type, Optional[Callable[..., Any]]]],
    ) -> None:
        if route_name in self._registry:
            logger.warning(f"Following route has already been injected: '{route_name}'")
        self._registry[route_name] = injections

BenJeau avatar Aug 09 '22 01:08 BenJeau

Not sure if this should be a part of sanic_ext or sanic

BenJeau avatar Aug 09 '22 01:08 BenJeau

Another way would be to list, at the beginning when starting the server, all the routes and their route names, and then warning on the duplicate ones (I would personally love this since you sometimes don't know which routes/handlers actually get registered when you have a big codebase with nested blueprints) - unless that's already a feature

BenJeau avatar Aug 09 '22 01:08 BenJeau

This is a known thing. We will probably start with a warning and eventually raise an error for duplicate named routes. It will probably be a part of sanic-routing in finalize.

ahopkins avatar Aug 09 '22 04:08 ahopkins

I am going to solve this in app startup so we can provide a deprecation notice consistently.

ahopkins avatar Aug 09 '22 20:08 ahopkins