Implemented IsInitialized(), fixing several more tests.

pull/13171/head
Joshua Haberman 3 years ago
parent 586f84cd30
commit cbe314d91e
  1. 48
      python/message.c
  2. 5
      python/pb_unit_tests/reflection_test_wrapper.py

@ -923,6 +923,37 @@ static PyObject* PyUpb_CMessage_HasField(PyObject* _self, PyObject* arg) {
: upb_msg_whichoneof(self->ptr.msg, oneof) != NULL);
}
static PyObject* PyUpb_CMessage_FindInitializationErrors(PyObject* _self,
PyObject* arg);
static PyObject* PyUpb_CMessage_IsInitialized(PyObject* _self, PyObject* args) {
PyObject* errors = NULL;
if (!PyArg_ParseTuple(args, "|O", &errors)) {
return NULL;
}
upb_msg* msg = PyUpb_CMessage_GetIfReified(_self);
if (!msg) Py_RETURN_NONE; // TODO
if (errors) {
PyObject* list = PyUpb_CMessage_FindInitializationErrors(_self, NULL);
if (!list) return NULL;
if (PyList_Size(list) == 0) {
return PyBool_FromLong(true);
}
PyObject* extend_name = PyUnicode_FromString("extend");
if (extend_name == NULL) {
Py_DECREF(list);
return NULL;
}
PyObject_CallMethodObjArgs(errors, extend_name, list, NULL);
return PyBool_FromLong(false);
} else {
const upb_msgdef* m = PyUpb_CMessage_GetMsgdef(_self);
const upb_symtab* symtab = upb_filedef_symtab(upb_msgdef_file(m));
bool initialized = !upb_util_HasUnsetRequired(msg, m, symtab, NULL);
return PyBool_FromLong(initialized);
}
}
static PyObject* PyUpb_CMessage_ListFields(PyObject* _self, PyObject* arg) {
PyObject* list = PyList_New(0);
upb_msg* msg = PyUpb_CMessage_GetIfReified(_self);
@ -1157,14 +1188,15 @@ static PyObject* PyUpb_CMessage_FindInitializationErrors(PyObject* _self,
upb_msg* msg = PyUpb_CMessage_GetIfReified(_self);
if (!msg) return PyList_New(0);
const upb_msgdef* msgdef = _PyUpb_CMessage_GetMsgdef(self);
const upb_symtab* ext_pool = NULL; // TODO
const upb_symtab* ext_pool = upb_filedef_symtab(upb_msgdef_file(msgdef));
upb_FieldPathEntry* fields;
PyObject* ret = PyList_New(0);
if (upb_util_HasUnsetRequired(msg, msgdef, ext_pool, &fields)) {
char* buf = NULL;
size_t size = 0;
size_t i = 0;
while (fields) {
assert(fields->field);
while (fields->field) {
upb_FieldPathEntry* field = fields;
size_t need = upb_FieldPath_ToText(&fields, buf, size);
if (need >= size) {
@ -1175,7 +1207,7 @@ static PyObject* PyUpb_CMessage_FindInitializationErrors(PyObject* _self,
need = upb_FieldPath_ToText(&fields, buf, size);
assert(size > need);
}
PyList_SetItem(ret, i, PyUnicode_FromString(buf));
PyList_Append(ret, PyUnicode_FromString(buf));
}
free(buf);
}
@ -1348,18 +1380,16 @@ static PyMethodDef PyUpb_CMessage_Methods[] = {
// "Copies a protocol message into the current message." },
{"DiscardUnknownFields", (PyCFunction)PyUpb_CMessage_DiscardUnknownFields,
METH_NOARGS, "Discards the unknown fields."},
{"FindInitializationErrors",
(PyCFunction)PyUpb_CMessage_FindInitializationErrors, METH_NOARGS,
"Finds unset required fields."},
{"FindInitializationErrors", PyUpb_CMessage_FindInitializationErrors,
METH_NOARGS, "Finds unset required fields."},
{"FromString", PyUpb_CMessage_FromString, METH_O | METH_CLASS,
"Creates new method instance from given serialized data."},
{"HasExtension", PyUpb_CMessage_HasExtension, METH_O,
"Checks if a message field is set."},
{"HasField", PyUpb_CMessage_HasField, METH_O,
"Checks if a message field is set."},
// TODO(https://github.com/protocolbuffers/upb/issues/459)
//{ "IsInitialized", (PyCFunction)IsInitialized, METH_VARARGS,
// "Checks if all required fields of a protocol message are set." },
{"IsInitialized", PyUpb_CMessage_IsInitialized, METH_VARARGS,
"Checks if all required fields of a protocol message are set."},
{"ListFields", PyUpb_CMessage_ListFields, METH_NOARGS,
"Lists all set fields of a message."},
{"MergeFrom", PyUpb_CMessage_MergeFrom, METH_O,

@ -30,7 +30,6 @@ import unittest
# specified or guaranteed.
reflection_test.Proto2ReflectionTest.testExtensionIter.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testIsInitialized.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testListFieldsAndExtensions.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testRepeatedListExtensions.__unittest_expecting_failure__ = True
reflection_test.Proto2ReflectionTest.testSingularListExtensions.__unittest_expecting_failure__ = True
@ -51,10 +50,6 @@ reflection_test.SerializationTest.testFieldDataDescriptor.__unittest_expecting_f
reflection_test.SerializationTest.testFieldNumbers.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testFieldProperties.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testInitArgsUnknownFieldName.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testInitKwargs.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testInitRepeatedKwargs.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testInitRequiredForeignKwargs.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testInitRequiredKwargs.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeUninitialized.__unittest_expecting_failure__ = True
reflection_test.SerializationTest.testSerializeUninitializedSubMessage.__unittest_expecting_failure__ = True

Loading…
Cancel
Save