From cd450dba57ec209fbf4190d97e29523495a21596 Mon Sep 17 00:00:00 2001 From: bot Date: Fri, 20 Dec 2024 22:43:03 +0000 Subject: [PATCH] Automated update of Base Application package. --- dist/app-1.0.0-py3-none-any.whl | Bin 7522 -> 12809 bytes dist/app-1.0.0.tar.gz | Bin 6015 -> 10623 bytes src/app/rpc.py | 151 ++++++++++++++++---------------- 3 files changed, 77 insertions(+), 74 deletions(-) diff --git a/dist/app-1.0.0-py3-none-any.whl b/dist/app-1.0.0-py3-none-any.whl index 5a9033c28095bf0b24cef695817e50a816bb60ef..d95fecb328c712b1ff108d984ece5d3dc241c9fe 100644 GIT binary patch delta 9096 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 delta 3724 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 diff --git a/dist/app-1.0.0.tar.gz b/dist/app-1.0.0.tar.gz index cd6504df0d8639b9469c75dd31e1e16047d00f43..9c40b934a451876ab12a2df0bc5246a83144d790 100644 GIT binary patch literal 10623 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 Q5JYT4NX!RH92)9>0rB@Jh5!Hn literal 6015 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 diff --git a/src/app/rpc.py b/src/app/rpc.py index cd0ec8b..1f0220b 100644 --- a/src/app/rpc.py +++ b/src/app/rpc.py @@ -1,31 +1,37 @@ - -from xmlrpc.server import resolve_dotted_attribute -from xmlrpc.client import Fault, dumps, loads, gzip_encode, gzip_decode, ServerProxy,MultiCall -from functools import partial -from inspect import signature -from aiohttp import web from datetime import datetime +from functools import partial +from xmlrpc.client import ( + Fault, + MultiCall, + ServerProxy, + dumps, + loads, +) +from xmlrpc.server import resolve_dotted_attribute + +from aiohttp import web class AsyncSimpleXMLRPCDispatcher: """ Original not async version of this class is in the original python std lib: https://github.com/python/cpython/blob/main/Lib/xmlrpc/server.py. - + use_builtin_types=True allows the use of bytes-object which is preferred because else it's a custom xmlrpc.client.Binary which sucks. """ - def __init__(self, instance,allow_none=True, encoding="utf-8", use_builtin_types=True): + def __init__( + self, instance, allow_none=True, encoding="utf-8", use_builtin_types=True + ): self.setup_rpc(allow_none=allow_none, encoding=encoding, use_builtin_types=True) - self.register_instance(instance,True) + self.register_instance(instance, True) - def setup_rpc(self, allow_none=True, encoding="utf-8", - use_builtin_types=True): + def setup_rpc(self, allow_none=True, encoding="utf-8", use_builtin_types=True): self.funcs = {} self.instance = None self.allow_none = allow_none - self.encoding = encoding or 'utf-8' + self.encoding = encoding or "utf-8" self.use_builtin_types = use_builtin_types def register_instance(self, instance, allow_dotted_names=True): @@ -45,14 +51,18 @@ class AsyncSimpleXMLRPCDispatcher: return function def register_introspection_functions(self): - self.funcs.update({'system.listMethods' : self.system_listMethods, - 'system.methodSignature' : self.system_methodSignature, - 'system.methodHelp' : self.system_methodHelp}) + self.funcs.update( + { + "system.listMethods": self.system_listMethods, + "system.methodSignature": self.system_methodSignature, + "system.methodHelp": self.system_methodHelp, + } + ) def register_multicall_functions(self): - self.funcs.update({'system.multicall' : self.system_multicall}) + self.funcs.update({"system.multicall": self.system_multicall}) - async def _marshaled_dispatch(self, data, dispatch_method = None, path = None): + async def _marshaled_dispatch(self, data, dispatch_method=None, path=None): try: params, method = loads(data, use_builtin_types=self.use_builtin_types) @@ -61,45 +71,47 @@ class AsyncSimpleXMLRPCDispatcher: else: response = await self._dispatch(method, params) response = (response,) - response = dumps(response, methodresponse=1, - allow_none=self.allow_none, encoding=self.encoding) + response = dumps( + response, + methodresponse=1, + allow_none=self.allow_none, + encoding=self.encoding, + ) except Fault as fault: - response = dumps(fault, allow_none=self.allow_none, - encoding=self.encoding) + response = dumps(fault, allow_none=self.allow_none, encoding=self.encoding) except BaseException as exc: response = dumps( - Fault(1, "%s:%s" % (type(exc), exc)), - encoding=self.encoding, allow_none=self.allow_none, - ) + Fault(1, f"{type(exc)}:{exc}"), + encoding=self.encoding, + allow_none=self.allow_none, + ) - return response.encode(self.encoding, 'xmlcharrefreplace') + return response.encode(self.encoding, "xmlcharrefreplace") def system_listMethods(self): methods = set(self.funcs.keys()) if self.instance is not None: - if hasattr(self.instance, '_listMethods'): + if hasattr(self.instance, "_listMethods"): methods |= set(self.instance._listMethods()) - elif not hasattr(self.instance, '_dispatch'): + elif not hasattr(self.instance, "_dispatch"): methods |= set(list_public_methods(self.instance)) return sorted(methods) def system_methodSignature(self, method_name): - return 'signatures not supported' + return "signatures not supported" def system_methodHelp(self, method_name): method = None if method_name in self.funcs: method = self.funcs[method_name] elif self.instance is not None: - if hasattr(self.instance, '_methodHelp'): + if hasattr(self.instance, "_methodHelp"): return self.instance._methodHelp(method_name) - elif not hasattr(self.instance, '_dispatch'): + elif not hasattr(self.instance, "_dispatch"): try: method = resolve_dotted_attribute( - self.instance, - method_name, - self.allow_dotted_names - ) + self.instance, method_name, self.allow_dotted_names + ) except AttributeError: pass if method is None: @@ -110,21 +122,17 @@ class AsyncSimpleXMLRPCDispatcher: async def system_multicall(self, call_list): results = [] for call in call_list: - method_name = call['methodName'] - params = call['params'] + method_name = call["methodName"] + params = call["params"] try: results.append([await self._dispatch(method_name, params)]) except Fault as fault: results.append( - {'faultCode' : fault.faultCode, - 'faultString' : fault.faultString} - ) + {"faultCode": fault.faultCode, "faultString": fault.faultString} + ) except BaseException as exc: - results.append( - {'faultCode' : 1, - 'faultString' : "%s:%s" % (type(exc), exc)} - ) + results.append({"faultCode": 1, "faultString": f"{type(exc)}:{exc}"}) return results async def _dispatch(self, method, params): @@ -135,17 +143,15 @@ class AsyncSimpleXMLRPCDispatcher: else: if func is not None: return await func(*params) - raise Exception('method "%s" is not supported' % method) + raise Exception(f'method "{method}" is not supported') if self.instance is not None: - if hasattr(self.instance, '_dispatch'): + if hasattr(self.instance, "_dispatch"): return await self.instance._dispatch(method, params) try: func = resolve_dotted_attribute( - self.instance, - method, - self.allow_dotted_names + self.instance, method, self.allow_dotted_names ) except AttributeError: pass @@ -153,20 +159,21 @@ class AsyncSimpleXMLRPCDispatcher: if func is not None: return await func(*params) - raise Exception('method "%s" is not supported' % method) + raise Exception(f'method "{method}" is not supported') + def rpc_wrap_instance(obj): class Session: - def __init__(self,data=None): + def __init__(self, data=None): self._data = data or {} async def get(self, key, default=None): - return self._data.get(key,default) + return self._data.get(key, default) - async def set(self,key, value): - self._data[key] = value + async def set(self, key, value): + self._data[key] = value async def delete(self, key): try: @@ -175,39 +182,35 @@ def rpc_wrap_instance(obj): except KeyError: return False - async def exists(self,key): + async def exists(self, key): return key in self._data class Instance: - - def __init__(self, _self): - self._self = self - self.session = Session() - - def __get__(self,key): - return getattr(self._self,key) - def ping(self,*args,**kwargs): - return dict( - args=args, - kwargs=kwargs, - timestamp=str(datetime.now()) - ) + def __init__(self, _self): + self._self = self + self.session = Session() + + def __get__(self, key): + return getattr(self._self, key) + + def ping(self, *args, **kwargs): + return {"args": args, "kwargs": kwargs, "timestamp": str(datetime.now())} instance = Instance(obj) for attr in dir(obj): - if attr == 'rpc_handler': + if attr == "rpc_handler": continue if attr.startswith("rpc_") and callable(getattr(obj, attr)): - setattr(instance,attr[4:], getattr(obj,attr)) + setattr(instance, attr[4:], getattr(obj, attr)) return instance class Application(web.Application): - def __init__(self, url=None,host=None,port=None, *args, **kwargs): + def __init__(self, url=None, host=None, port=None, *args, **kwargs): self.host = host self.port = port self._url = url @@ -221,14 +224,14 @@ class Application(web.Application): def __get__(self, key): if self._rpc: - return getattr(self._rpc,key) - return getattr(self.arpc,key) + return getattr(self._rpc, key) + return getattr(self.arpc, key) @property def url(self): if self._url: - return self._url - return "http://{}:{}".format(self.host,self.port) + return self._url + return f"http://{self.host}:{self.port}" @property def rpc_url(self):