Update
Test / Builder (push) Failing after 3s

This commit is contained in:
2026-04-22 09:08:01 +03:00
parent 7e45059889
commit 65a8ccac59
2 changed files with 41 additions and 80 deletions
+30 -75
View File
@@ -11,86 +11,42 @@ from .exceptions import *
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class Method:
def __init__(self, function, middlewares=None, debug: bool = False):
self.function = function
self.middlewares = middlewares
self.debug = debug
def exec_function(self, query):
params = None
if 'params' in query:
params = query['params']
if self.debug:
log.error(params)
if params is None:
response = self.function()
elif isinstance(params, list):
response = self.function(*params)
elif isinstance(params, dict):
response = self.function(**params)
else:
raise InvalidParamsError(
id=query['id'],
message='Invalid params: {0}'.format(params)
)
return response
def __call__(self, query):
if isinstance(self.middlewares, list):
i = iter(self.middlewares)
onion = self.exec_function
while (handler := next(i, None)):
onion = handler(onion)
response = onion(query)
return response
elif callable(self.middlewares):
middleware = self.middlewares(self.exec_function)
response = middleware(query)
return response
response = self.exec_function(query)
return response
def __repr__(self):
return '<{}>'.format(self.function)
class JSONRPC: class JSONRPC:
"""Основной класс JSON-RPC """Основной класс JSON-RPC
""" """
def __init__(self, debug: bool = False): def __init__(self, debug: bool = False):
self.methods = {} self.__handlers = {}
self.debug = debug self.debug = debug
def method(self, name: str, middlewares=None): def method(self, name: str):
"""Декоратор метода """Декоратор метода
""" """
assert len(name) > 0, 'Не указано имя метода' assert len(name) > 0, 'Не указано имя метода'
def wrap(function): def wrap(method):
method = Method( self.__handlers[name] = method
function=function, return method
middlewares=middlewares
)
self.methods[name] = method
return function
return wrap return wrap
def register(self, name: str, handler):
"""Регистратор обработчика
"""
assert len(name) > 0, 'Не указано имя метода'
self.__handlers[name] = handler
def description(self, name: str): def description(self, name: str):
"""Описание процедуры """Описание процедуры
""" """
if name not in self.methods: if name not in self.__handlers:
return None return None
method = self.methods[name] handler = self.__handlers[name]
sig = signature(method.function) sig = signature(handler)
# for key in sig.parameters: # for key in sig.parameters:
# print(sig.parameters[key].annotation) # print(sig.parameters[key].annotation)
result = { result = {
'name': name, 'name': name,
'function': getattr(method.function, '__name__', None), 'handler': getattr(handler, '__name__', None),
'summary': getattr(method.function, '__doc__', None), 'summary': getattr(handler, '__doc__', None),
'params': [ 'params': [
{'name': k, 'type': sig.parameters[k].annotation.__name__} {'name': k, 'type': sig.parameters[k].annotation.__name__}
for k in sig.parameters for k in sig.parameters
@@ -102,10 +58,10 @@ class JSONRPC:
def example(self, name: str): def example(self, name: str):
"""Пример """Пример
""" """
if name not in self.methods: if name not in self.__handlers:
return None return None
method = self.methods[name] handler = self.__handlers[name]
sig = signature(method.function) sig = signature(handler)
result = { result = {
"jsonrpc": "3.0", "jsonrpc": "3.0",
@@ -145,17 +101,17 @@ class JSONRPC:
if result: if result:
return result return result
name = query['method'] name = query['method']
if name not in self.methods: if name not in self.__handlers:
result = MethodNotFoundError( result = MethodNotFoundError(
message=f'Метод не найден: {name}', message=f'Метод не найден: {name}',
id=query['id'] id=query['id']
) )
return result return result
method = self.methods[name] handler = self.__handlers[name]
try: try:
response = method(query) response = handler(query)
except JSONRPCError as e: except JSONRPCError as e:
log.error(traceback.format_exc()) log.error(traceback.format_exc())
response = InternalError( response = InternalError(
@@ -193,21 +149,20 @@ class JSONRPC:
return result return result
def __getitem__(self, key): def __getitem__(self, key):
method = self.methods[key] handler = self.__handlers[key]
return method.function return handler
def __iter__(self): def __iter__(self):
return iter(self.methods) return iter(self.__handlers)
def __len__(self): def __len__(self):
return len(self.methods) return len(self.__handlers)
def __setitem__(self, key, function, middlewares=None): def __setitem__(self, key, handler):
method = Method(function=function, middlewares=middlewares) self.__handlers[key] = handler
self.methods[key] = method
def __delitem__(self, key): def __delitem__(self, key):
del self.methods[key] del self.__handlers[key]
def __repr__(self): def __repr__(self):
return repr(self.methods) return repr(self.__handlers)
+11 -5
View File
@@ -18,8 +18,8 @@ class RPC:
self.__handlers = {} self.__handlers = {}
self.debug = debug self.debug = debug
def register(self, name: str): def method(self, name: str):
"""Регистратор обработчика """Декоратор метода
""" """
assert len(name) > 0, 'Не указано имя метода' assert len(name) > 0, 'Не указано имя метода'
@@ -28,19 +28,25 @@ class RPC:
return handler return handler
return wrap return wrap
def register(self, name: str, handler):
"""Регистратор обработчика
"""
assert len(name) > 0, 'Не указано имя метода'
self.__handlers[name] = handler
def description(self, name: str): def description(self, name: str):
"""Описание процедуры """Описание процедуры
""" """
if name not in self.__handlers: if name not in self.__handlers:
return None return None
handler = self.__handlers[name] handler = self.__handlers[name]
sig = signature(method.function) sig = signature(handler)
# for key in sig.parameters: # for key in sig.parameters:
# print(sig.parameters[key].annotation) # print(sig.parameters[key].annotation)
result = { result = {
'name': name, 'name': name,
'function': getattr(method, '__name__', None), 'handler': getattr(handler, '__name__', None),
'summary': getattr(method, '__doc__', None), 'summary': getattr(handler, '__doc__', None),
'params': [ 'params': [
{'name': k, 'type': sig.parameters[k].annotation.__name__} {'name': k, 'type': sig.parameters[k].annotation.__name__}
for k in sig.parameters for k in sig.parameters