def __init__(self, msg: Type[M]): super().__init__(msg) # TODO only create validators where the schema is not empty field_schemas = ((field, _get_field_schema(field)) for field in fields(msg)) self._field_validators = tuple( (field.name, _FieldValidator(field, schema)) for field, schema in field_schemas if schema != Schema())
async def test_magic_request_message_auto_schema(self): @schema('a', minimum=5) def func(self, a: int) -> IntegerValue: return IntegerValue(a) inspect = magic_normalize(func, auto_generate_request=True) self.assertEqual(inspect.response, IntegerValue) self.assertEqual(fields(inspect.request), ( Field(int, name='a'), )) self.assertEqual(inspect.request.a.schema, Schema(minimum=5)) self.assertEqual(await inspect.invokable(None, inspect.request(5)), IntegerValue(5))
async def test_magic_request_message_auto_unpack(self): def func(self, value: str) -> StringValue: return StringValue(value) inspect = magic_normalize(func, auto_generate_request=True) self.assertEqual(inspect.response, StringValue) self.assertEqual(inspect.request.__meta__.name, 'FuncRequest') self.assertEqual(fields(inspect.request), ( String(name='value'), )) # TODO StringValue() should be equal to StringValue('') self.assertEqual(await inspect.invokable(None, inspect.request()), StringValue('')) self.assertEqual(await inspect.invokable(None, inspect.request('foo')), StringValue('foo'))
def test_stub_rpc_response_repeat_auto(self): class GreeterStub(Stub): @rpc(auto=True) def get_greetings(self) -> List[str]: raise NotImplementedError self.assertEqual(GreeterStub.get_greetings.response.__meta__.name, 'GetGreetingsResponse') self.assertEqual(tuple(fields(GreeterStub.get_greetings.response)), (repeated(String(), name='values'))) self.assertEqual(GreeterStub.greet.response, StringValue) self.assertEqual(GreeterStub.greet.name, 'get_greetings')
def test_stub_rpc_request_repeat_auto(self): class GreeterStub(Stub): @rpc(auto=True) def greet_many(self, names: List[str]) -> str: raise NotImplementedError self.assertEqual(GreeterStub.greet_many.request.__meta__.name, 'GreetManyRequest') self.assertEqual(tuple(fields(GreeterStub.greet_many.request)), (repeated(String(), name='names'), )) self.assertEqual(GreeterStub.greet_many.response, StringValue) self.assertEqual(GreeterStub.greet_many.name, 'greet_many')
def test_stub_rpc_request_auto(self): class GreeterStub(Stub): @rpc(auto=True) def greet(self, name: str, shout: bool = False) -> str: raise NotImplementedError self.assertEqual(GreeterStub.greet.request.__meta__.name, 'GreetRequest') self.assertEqual(tuple(fields(GreeterStub.greet.request)), ( String(name='name'), Bool(name='shout'), )) self.assertEqual(GreeterStub.greet.response, StringValue) self.assertEqual(GreeterStub.greet.name, 'greet')
def schema_for_message(message: Message, protocol: Protocol = None) -> SchemaMessage: return fields_schema(fields(message), JSONProtocol, # XXX description=message.__meta__.get('description'))
def _add_message(self, message: Message): if message not in self.messages: self.messages.add(message) for field in fields(message): self._add_field(field)