This commit is contained in:
2025-09-03 17:39:24 +03:00
parent d761858482
commit e336a9d452
5 changed files with 34 additions and 40 deletions

View File

@@ -1,6 +1,6 @@
[project]
name = "jsonrpc"
version = "2.0"
version = "3.0"
authors = [
{ name="RemiZOffAlex", email="remizoffalex@gmail.com" },
]

View File

@@ -11,20 +11,6 @@ from .exceptions import *
log = logging.getLogger(__name__)
class Response:
def __init__(self, id: int, result):
self.id = id
self.result = result
def __json__(self):
response = {
"jsonrpc": "3.0",
"result": self.result,
"id": self.id,
}
return response
class Method:
def __init__(self, function, middlewares=None, debug: bool = False):
self.function = function
@@ -71,11 +57,6 @@ class Method:
return '<{}>'.format(self.function)
class Wrapper:
def __init__(self, func):
self.func = func
class JSONRPC:
"""Основной класс JSON-RPC
"""
@@ -177,8 +158,6 @@ class JSONRPC:
response = method(query)
except JSONRPCError as e:
log.error(traceback.format_exc())
# print(traceback.format_exc())
# response = traceback.format_exc()
response = InternalError(
id=query['id'],
message=str(e)
@@ -192,10 +171,11 @@ class JSONRPC:
# message=traceback.format_exc()
)
else:
response = Response(
id=query['id'],
result=response
)
response = {
"jsonrpc": query['jsonrpc'],
"id": query['id'],
"result": response
}
result = response
return result

View File

@@ -6,10 +6,11 @@ import logging
import pathlib
import aiohttp_jinja2
from aiohttp.web import Response, json_response
from aiohttp.web import Response
from .. import JSONRPC
from ..exceptions import ParseError
from ..serialize import JSONRPCEncoder
log = logging.getLogger(__name__)
@@ -39,7 +40,13 @@ class APIHandler:
try:
json_data = await request.json()
result = self.jsonrpc(json_data)
return json_response(result)
body = json.dumps(result, cls=JSONRPCEncoder)
response = Response(
text=body,
status=200,
content_type='application/json'
)
return response
except ValueError as e:
log.error('invalid json: %s', request_data)
log.exception(e)

View File

@@ -16,22 +16,21 @@ class Client:
debug: bool = False
):
self.url = url
self.headers = {'content-type': 'application/json'}
self.debug = debug
def __call__(self, queries):
"""Вызов метода
"""
if isinstance(queries, str):
payload = queries
elif isinstance(queries, dict | list):
payload = json.dumps(queries)
elif isinstance(queries, dict | list):
payload = queries
response = requests.post(
self.url,
data=payload,
headers=self.headers
json=payload
)
if self.debug:
log.debug('status_code', response.status_code)
log.debug('content', response.content)
result = response.json()

View File

@@ -2,6 +2,7 @@ __author__ = 'RemiZOffAlex'
__email__ = 'remizoffalex@mail.ru'
import unittest
from uuid import uuid4
from jsonrpc import JSONRPC
@@ -19,29 +20,36 @@ class Calc(unittest.TestCase):
def test_example(self):
self.assertEqual(
jsonrpc.example('boo'),
{'jsonrpc': '2.0', 'method': 'boo', 'id': 1}
{
'jsonrpc': '3.0',
'method': 'boo',
'id': '00000000-0000-0000-0000-000000000000'
}
)
def test_evaluate(self):
request = {'jsonrpc': '2.0', 'method': 'boo', 'id': 1}
id = str(uuid4())
request = {'jsonrpc': '3.0', 'method': 'boo', 'id': id}
response = jsonrpc(request)
self.assertEqual(
response,
{'jsonrpc': '2.0', 'result': 'Welcome to JSON-RPC', 'id': 1}
{'jsonrpc': '3.0', 'result': 'Welcome to JSON-RPC', 'id': id}
)
def test_error(self):
request = {'jsonrpc': '2.0', 'method': 'bla-bla', 'id': 1}
id = str(uuid4())
request = {'jsonrpc': '3.0', 'method': 'bla-bla', 'id': id}
response = jsonrpc(request)
print('test_error.response', response)
print(response)
self.assertEqual(
response,
{
'jsonrpc': '2.0',
'jsonrpc': '3.0',
'error': {
'code': -32601,
'code': 'internal.error',
'message': 'Метод не найден: bla-bla'
},
'id': 1
'id': id
}
)