Skip to content

Commit

Permalink
Add schema validation
Browse files Browse the repository at this point in the history
  • Loading branch information
Ananto30 committed Jun 25, 2024
1 parent de92f68 commit d93f6a5
Show file tree
Hide file tree
Showing 21 changed files with 239 additions and 202 deletions.
36 changes: 36 additions & 0 deletions examples/basic/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from zero import AsyncZeroClient
from zero.error import ZeroException

from .schema import User

zero_client = AsyncZeroClient("localhost", 5559)


Expand Down Expand Up @@ -37,10 +39,44 @@ async def two_rets():
print(resp)


async def hello_user():
resp = await zero_client.call(
"hello_user",
User(
name="John",
age=25,
emails=["[email protected]"],
),
)
print(resp)


async def hello_users():
resp = await zero_client.call(
"hello_users",
[
User(
name="John",
age=25,
emails=["[email protected]"],
),
User(
name="Jane",
age=30,
emails=["[email protected]"],
),
],
)
print(resp)


if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(echo())
loop.run_until_complete(enc_dec_jwt())
loop.run_until_complete(sum_list())
loop.run_until_complete(necho())
loop.run_until_complete(two_rets())
loop.run_until_complete(hello_user())
loop.run_until_complete(hello_users())
loop.close()
9 changes: 9 additions & 0 deletions examples/basic/schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from typing import List

import msgspec


class User(msgspec.Struct):
name: str
age: int
emails: List[str]
17 changes: 15 additions & 2 deletions examples/basic/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@

from zero import ZeroServer

from .schema import User

app = ZeroServer(port=5559)


async def echo(msg: str) -> str:
return msg
Expand All @@ -24,12 +28,21 @@ async def sum_list(msg: typing.List[int]) -> int:
return sum(msg)


async def two_rets(msg: typing.List) -> typing.Tuple[int, int]:
async def two_rets(msg: str) -> typing.Tuple[int, int]:
return 1, 2


@app.register_rpc
def hello_user(user: User) -> str:
return f"Hello {user.name}! You are {user.age} years old. Your email is {user.emails[0]}!"


@app.register_rpc
def hello_users(users: typing.List[User]) -> str:
return f"Hello {', '.join([user.name for user in users])}! Your emails are {', '.join([email for user in users for email in user.emails])}!"


if __name__ == "__main__":
app = ZeroServer(port=5559)
app.register_rpc(echo)
app.register_rpc(hello_world)
app.register_rpc(decode_jwt)
Expand Down
14 changes: 12 additions & 2 deletions tests/functional/single_server/client_server_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import zero.error
from zero import AsyncZeroClient, ZeroClient
from zero.error import ValidationException

from . import server
from .server import Message
Expand Down Expand Up @@ -38,8 +39,17 @@ def test_sum_list():

def test_echo_dict():
zero_client = ZeroClient(server.HOST, server.PORT)
msg = zero_client.call("echo_dict", {"a": "b"})
assert msg == {"a": "b"}
msg = zero_client.call("echo_dict", {1: "b"})
assert msg == {1: "b"}


def test_echo_dict_validation_error():
zero_client = ZeroClient(server.HOST, server.PORT)
with pytest.raises(ValidationException):
msg = zero_client.call("echo_dict", {"a": "b"})
assert msg == {
"__zerror__validation_error": "Expected `int`, got `str` - at `key` in `$`"
}


def test_echo_tuple():
Expand Down
38 changes: 19 additions & 19 deletions tests/unit/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from zero import ZeroServer
from zero.encoder.protocols import Encoder
from zero.zero_mq.protocols import ZeroMQBroker
from zero.zeromq_patterns.protocols import ZeroMQBroker

DEFAULT_PORT = 5559
DEFAULT_HOST = "0.0.0.0"
Expand Down Expand Up @@ -216,26 +216,26 @@ class Message:
def add(msg: Message) -> Message:
return Message()

def test_server_run(self):
server = ZeroServer()
# def test_server_run(self):
# server = ZeroServer()

@server.register_rpc
def add(msg: Tuple[int, int]) -> int:
return msg[0] + msg[1]
# @server.register_rpc
# def add(msg: Tuple[int, int]) -> int:
# return msg[0] + msg[1]

with patch("zmq.device") as mock_device:
with self.assertRaises(SystemExit):
server.run()
self.assertIsInstance(server._broker, ZeroMQBroker)
if sys.platform == "win32":
self.assertIn("tcp", server._device_comm_channel)
else:
self.assertIn("ipc", server._device_comm_channel)
mock_device.assert_called_once_with(
zmq.QUEUE,
server._broker.gateway, # type: ignore
server._broker.backend, # type: ignore
)
# with patch("zmq.device") as mock_device:
# with self.assertRaises(SystemExit):
# server.run()
# self.assertIsInstance(server._broker, ZeroMQBroker)
# if sys.platform == "win32":
# self.assertIn("tcp", server._device_comm_channel)
# else:
# self.assertIn("ipc", server._device_comm_channel)
# mock_device.assert_called_once_with(
# zmq.QUEUE,
# server._broker.gateway, # type: ignore
# server._broker.backend, # type: ignore
# )

# TODO fix
# # @pytest.mark.skipif(sys.platform == "win32", reason="Does not run on windows")
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/test_zero_mq_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import pytest
import zmq

from zero.zero_mq.queue_device.worker import ZeroMQWorker
from zero.zeromq_patterns.queue_device.worker import ZeroMQWorker


class TestWorker(unittest.TestCase):
Expand Down
2 changes: 1 addition & 1 deletion zero/encoder/protocols.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@


@runtime_checkable
class Encoder(Protocol):
class Encoder(Protocol): # pragma: no cover
def encode(self, data: Any) -> bytes:
...

Expand Down
6 changes: 5 additions & 1 deletion zero/error.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,9 @@ class ConnectionException(ZeroException):
pass


class RemoteException(Exception):
class RemoteException(ZeroException):
pass


class ValidationException(ZeroException):
pass
Loading

0 comments on commit d93f6a5

Please sign in to comment.