Update
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "jsonrpc"
|
name = "jsonrpc"
|
||||||
version = "2.0"
|
version = "3.0"
|
||||||
authors = [
|
authors = [
|
||||||
{ name="RemiZOffAlex", email="remizoffalex@gmail.com" },
|
{ name="RemiZOffAlex", email="remizoffalex@gmail.com" },
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -11,20 +11,6 @@ from .exceptions import *
|
|||||||
log = logging.getLogger(__name__)
|
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:
|
class Method:
|
||||||
def __init__(self, function, middlewares=None, debug: bool = False):
|
def __init__(self, function, middlewares=None, debug: bool = False):
|
||||||
self.function = function
|
self.function = function
|
||||||
@@ -71,11 +57,6 @@ class Method:
|
|||||||
return '<{}>'.format(self.function)
|
return '<{}>'.format(self.function)
|
||||||
|
|
||||||
|
|
||||||
class Wrapper:
|
|
||||||
def __init__(self, func):
|
|
||||||
self.func = func
|
|
||||||
|
|
||||||
|
|
||||||
class JSONRPC:
|
class JSONRPC:
|
||||||
"""Основной класс JSON-RPC
|
"""Основной класс JSON-RPC
|
||||||
"""
|
"""
|
||||||
@@ -177,8 +158,6 @@ class JSONRPC:
|
|||||||
response = method(query)
|
response = method(query)
|
||||||
except JSONRPCError as e:
|
except JSONRPCError as e:
|
||||||
log.error(traceback.format_exc())
|
log.error(traceback.format_exc())
|
||||||
# print(traceback.format_exc())
|
|
||||||
# response = traceback.format_exc()
|
|
||||||
response = InternalError(
|
response = InternalError(
|
||||||
id=query['id'],
|
id=query['id'],
|
||||||
message=str(e)
|
message=str(e)
|
||||||
@@ -192,10 +171,11 @@ class JSONRPC:
|
|||||||
# message=traceback.format_exc()
|
# message=traceback.format_exc()
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
response = Response(
|
response = {
|
||||||
id=query['id'],
|
"jsonrpc": query['jsonrpc'],
|
||||||
result=response
|
"id": query['id'],
|
||||||
)
|
"result": response
|
||||||
|
}
|
||||||
result = response
|
result = response
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,11 @@ import logging
|
|||||||
import pathlib
|
import pathlib
|
||||||
import aiohttp_jinja2
|
import aiohttp_jinja2
|
||||||
|
|
||||||
from aiohttp.web import Response, json_response
|
from aiohttp.web import Response
|
||||||
|
|
||||||
from .. import JSONRPC
|
from .. import JSONRPC
|
||||||
from ..exceptions import ParseError
|
from ..exceptions import ParseError
|
||||||
|
from ..serialize import JSONRPCEncoder
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@@ -39,7 +40,13 @@ class APIHandler:
|
|||||||
try:
|
try:
|
||||||
json_data = await request.json()
|
json_data = await request.json()
|
||||||
result = self.jsonrpc(json_data)
|
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:
|
except ValueError as e:
|
||||||
log.error('invalid json: %s', request_data)
|
log.error('invalid json: %s', request_data)
|
||||||
log.exception(e)
|
log.exception(e)
|
||||||
|
|||||||
@@ -16,22 +16,21 @@ class Client:
|
|||||||
debug: bool = False
|
debug: bool = False
|
||||||
):
|
):
|
||||||
self.url = url
|
self.url = url
|
||||||
self.headers = {'content-type': 'application/json'}
|
|
||||||
self.debug = debug
|
self.debug = debug
|
||||||
|
|
||||||
def __call__(self, queries):
|
def __call__(self, queries):
|
||||||
"""Вызов метода
|
"""Вызов метода
|
||||||
"""
|
"""
|
||||||
if isinstance(queries, str):
|
if isinstance(queries, str):
|
||||||
payload = queries
|
|
||||||
elif isinstance(queries, dict | list):
|
|
||||||
payload = json.dumps(queries)
|
payload = json.dumps(queries)
|
||||||
|
elif isinstance(queries, dict | list):
|
||||||
|
payload = queries
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
self.url,
|
self.url,
|
||||||
data=payload,
|
json=payload
|
||||||
headers=self.headers
|
|
||||||
)
|
)
|
||||||
if self.debug:
|
if self.debug:
|
||||||
|
log.debug('status_code', response.status_code)
|
||||||
log.debug('content', response.content)
|
log.debug('content', response.content)
|
||||||
result = response.json()
|
result = response.json()
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ __author__ = 'RemiZOffAlex'
|
|||||||
__email__ = 'remizoffalex@mail.ru'
|
__email__ = 'remizoffalex@mail.ru'
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
|
from uuid import uuid4
|
||||||
|
|
||||||
from jsonrpc import JSONRPC
|
from jsonrpc import JSONRPC
|
||||||
|
|
||||||
@@ -19,29 +20,36 @@ class Calc(unittest.TestCase):
|
|||||||
def test_example(self):
|
def test_example(self):
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
jsonrpc.example('boo'),
|
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):
|
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)
|
response = jsonrpc(request)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
response,
|
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):
|
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)
|
response = jsonrpc(request)
|
||||||
|
print('test_error.response', response)
|
||||||
print(response)
|
print(response)
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
response,
|
response,
|
||||||
{
|
{
|
||||||
'jsonrpc': '2.0',
|
'jsonrpc': '3.0',
|
||||||
'error': {
|
'error': {
|
||||||
'code': -32601,
|
'code': 'internal.error',
|
||||||
'message': 'Метод не найден: bla-bla'
|
'message': 'Метод не найден: bla-bla'
|
||||||
},
|
},
|
||||||
'id': 1
|
'id': id
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user