From aea8d1c2ffdae5a0cf6607f20cf9278e8999d512 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 12 Mar 2021 11:41:47 +0100 Subject: [PATCH] preimplemented helper class for endpoint --- pype/modules/webserver/base_routes.py | 51 ++++++++++++++++++++++ pype/modules/webserver/webserver_module.py | 4 ++ 2 files changed, 55 insertions(+) create mode 100644 pype/modules/webserver/base_routes.py diff --git a/pype/modules/webserver/base_routes.py b/pype/modules/webserver/base_routes.py new file mode 100644 index 0000000000..8730e133c8 --- /dev/null +++ b/pype/modules/webserver/base_routes.py @@ -0,0 +1,51 @@ +"""Helper functions or classes for Webserver module. + +These must not be imported in module itself to not break Python 2 +applications. +""" + +import json +import inspect +from aiohttp.http_exceptions import HttpBadRequest +from aiohttp.web_exceptions import HTTPMethodNotAllowed +from aiohttp.web_request import Request + + +DEFAULT_METHODS = ("GET", "POST", "PUT", "DELETE") + + +class RestApiEndpoint: + """Helper endpoint class for single endpoint. + + Class can define `get`, `post`, `put` or `delete` async methods for the + endpoint. + """ + def __init__(self): + methods = {} + + for method_name in DEFAULT_METHODS: + method = getattr(self, method_name.lower(), None) + if method: + methods[method_name.upper()] = method + + self.methods = methods + + async def dispatch(self, request: Request): + method = self.methods.get(request.method.upper()) + if not method: + raise HTTPMethodNotAllowed("", DEFAULT_METHODS) + + wanted_args = list(inspect.signature(method).parameters.keys()) + + available_args = request.match_info.copy() + available_args["request"] = request + + unsatisfied_args = set(wanted_args) - set(available_args.keys()) + if unsatisfied_args: + # Expected match info that doesn't exist + raise HttpBadRequest("") + + return await method(**{ + arg_name: available_args[arg_name] + for arg_name in wanted_args + }) diff --git a/pype/modules/webserver/webserver_module.py b/pype/modules/webserver/webserver_module.py index 7280292330..3b3f0e7a79 100644 --- a/pype/modules/webserver/webserver_module.py +++ b/pype/modules/webserver/webserver_module.py @@ -1,5 +1,9 @@ import os import socket +from abc import ABCMeta, abstractmethod + +import six + from pype import resources from .. import PypeModule, ITrayService