From: Tomas Mlcoch Date: Thu, 13 Jun 2013 14:44:33 +0000 (+0200) Subject: python: Better exception reporting X-Git-Tag: upstream/0.2.1~79 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=48b801827bb53eb25eee45db8084eca0ec53039c;p=services%2Fcreaterepo_c.git python: Better exception reporting Return more appropriate python exceptions instead of CreaterepoCError in some cases. --- diff --git a/src/python/compression_wrapper-py.c b/src/python/compression_wrapper-py.c index 6a47f03..f261377 100644 --- a/src/python/compression_wrapper-py.c +++ b/src/python/compression_wrapper-py.c @@ -57,8 +57,7 @@ py_detect_compression(PyObject *self, PyObject *args) type = cr_detect_compression(filename, &tmp_err); if (tmp_err) { - PyErr_Format(CrErr_Exception, "%s", tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } @@ -121,6 +120,7 @@ crfile_init(_CrFileObject *self, PyObject *args, PyObject *kwds) return -1; /* Check arguments */ + if (mode != CR_CW_MODE_READ && mode != CR_CW_MODE_WRITE) { PyErr_SetString(PyExc_ValueError, "Bad open mode"); return -1; @@ -136,7 +136,7 @@ crfile_init(_CrFileObject *self, PyObject *args, PyObject *kwds) } else if (ContentStatObject_Check(py_stat)) { stat = ContentStat_FromPyObject(py_stat); } else { - PyErr_SetString(PyExc_ValueError, "Use ContentStat or None"); + PyErr_SetString(PyExc_TypeError, "Use ContentStat or None"); return -1; } @@ -153,8 +153,7 @@ crfile_init(_CrFileObject *self, PyObject *args, PyObject *kwds) /* Init */ self->f = cr_sopen(path, mode, comtype, stat, &err); if (err) { - PyErr_Format(CrErr_Exception, "CrFile initialization failed: %s", err->message); - g_clear_error(&err); + nice_exception(&err, "CrFile %s init failed: ", path); return -1; } @@ -208,8 +207,7 @@ py_write(_CrFileObject *self, PyObject *args) cr_write(self->f, str, len, &tmp_err); if (tmp_err) { - PyErr_Format(CrErr_Exception, "%s", tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } @@ -232,8 +230,7 @@ py_close(_CrFileObject *self, void *nothing) self->py_stat = NULL; if (tmp_err) { - PyErr_Format(CrErr_Exception, "Close error: %s", tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, "Close error: "); return NULL; } diff --git a/src/python/contentstat-py.c b/src/python/contentstat-py.c index 1f60fef..2177369 100644 --- a/src/python/contentstat-py.c +++ b/src/python/contentstat-py.c @@ -83,9 +83,7 @@ contentstat_init(_ContentStatObject *self, PyObject *args, PyObject *kwds) /* Init */ self->stat = cr_contentstat_new(type, &tmp_err); if (tmp_err) { - PyErr_Format(CrErr_Exception, "ContentStat initialization failed: %s", - tmp_err->message); - g_error_free(tmp_err); + nice_exception(&tmp_err, "ContentStat init failed: "); return -1; } @@ -154,7 +152,7 @@ set_num(_ContentStatObject *self, PyObject *value, void *member_offset) } else if (PyInt_Check(value)) { val = (gint64) PyInt_AS_LONG(value); } else { - PyErr_SetString(PyExc_ValueError, "Number expected!"); + PyErr_SetString(PyExc_TypeError, "Number expected!"); return -1; } cr_ContentStat *rec = self->stat; @@ -173,7 +171,7 @@ set_int(_ContentStatObject *self, PyObject *value, void *member_offset) } else if (PyInt_Check(value)) { val = PyInt_AS_LONG(value); } else { - PyErr_SetString(PyExc_ValueError, "Number expected!"); + PyErr_SetString(PyExc_TypeError, "Number expected!"); return -1; } cr_ContentStat *rec = self->stat; @@ -187,7 +185,7 @@ set_str(_ContentStatObject *self, PyObject *value, void *member_offset) if (check_ContentStatStatus(self)) return -1; if (!PyString_Check(value) && value != Py_None) { - PyErr_SetString(PyExc_ValueError, "String or None expected!"); + PyErr_SetString(PyExc_TypeError, "String or None expected!"); return -1; } cr_ContentStat *rec = self->stat; diff --git a/src/python/exception-py.c b/src/python/exception-py.c index 69f158c..736baab 100644 --- a/src/python/exception-py.c +++ b/src/python/exception-py.c @@ -18,6 +18,8 @@ */ #include +#include +#include #include "exception-py.h" PyObject *CrErr_Exception = NULL; @@ -32,3 +34,59 @@ init_exceptions() return 1; } + +void +nice_exception(GError **err, const char *format, ...) +{ + int ret; + va_list vl; + gchar *message, *usr_message = NULL; + PyObject *exception; + + if (format) { + // Prepare user message + va_start(vl, format); + ret = g_vasprintf(&usr_message, format, vl); + va_end(vl); + + if (ret < 0) { + // vasprintf failed - silently ignore this error + g_free(usr_message); + usr_message = NULL; + } + } + + // Prepare whole error message + if (usr_message) + message = g_strdup_printf("%s%s", usr_message, (*err)->message); + else + message = g_strdup((*err)->message); + + g_free(usr_message); + + // Select appropriate exception + switch ((*err)->code) { + case CRE_IO: + case CRE_STAT: + case CRE_NOFILE: + case CRE_NODIR: + case CRE_EXISTS: + exception = PyExc_IOError; + break; + case CRE_MEMORY: + exception = PyExc_MemoryError; + break; + case CRE_BADARG: + exception = PyExc_ValueError; + break; + default: + exception = CrErr_Exception; + } + + g_clear_error(err); + + // Set exception + PyErr_SetString(exception, message); + + g_free(message); +} diff --git a/src/python/exception-py.h b/src/python/exception-py.h index dfeb02c..5877576 100644 --- a/src/python/exception-py.h +++ b/src/python/exception-py.h @@ -26,4 +26,11 @@ extern PyObject *CrErr_Exception; int init_exceptions(); +/* Set exception by its return code (e.g., for CRE_IO, CRE_NOFILE, etc. will + * be used a build-in python IOError exception) and free the GError. + * @param err GError **, must be != NULL + * @param format Prefix for the error message. + */ +void nice_exception(GError **err, const char *format, ...); + #endif diff --git a/src/python/load_metadata-py.c b/src/python/load_metadata-py.c index d4a1a73..9341d62 100644 --- a/src/python/load_metadata-py.c +++ b/src/python/load_metadata-py.c @@ -43,7 +43,7 @@ check_MetadataStatus(const _MetadataObject *self) assert(self != NULL); assert(MetadataObject_Check(self)); if (self->md == NULL) { - PyErr_SetString(CrErr_Exception, "Improper createrepo_c Metadata object."); + PyErr_SetString(PyExc_TypeError, "Improper createrepo_c Metadata object."); return -1; } return 0; @@ -152,8 +152,7 @@ load_xml(_MetadataObject *self, PyObject *args) cr_metadata_load_xml(self->md, MetadataLocation_FromPyObject(ml), &tmp_err); if (tmp_err) { - PyErr_SetString(CrErr_Exception, tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } @@ -174,8 +173,7 @@ locate_and_load_xml(_MetadataObject *self, PyObject *args) cr_metadata_locate_and_load_xml(self->md, path, &tmp_err); if (tmp_err) { - PyErr_SetString(CrErr_Exception, tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } Py_RETURN_NONE; diff --git a/src/python/locate_metadata-py.c b/src/python/locate_metadata-py.c index 35d329a..528d4bd 100644 --- a/src/python/locate_metadata-py.c +++ b/src/python/locate_metadata-py.c @@ -85,8 +85,7 @@ metadatalocation_init(_MetadataLocationObject *self, PyObject *args, PyObject *k /* Init */ self->ml = cr_locate_metadata(repopath, ignore_db, &tmp_err); if (tmp_err) { - PyErr_SetString(CrErr_Exception, tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return -1; } return 0; @@ -132,7 +131,7 @@ getitem(_MetadataLocationObject *self, PyObject *pykey) return NULL; if (!PyString_Check(pykey)) { - PyErr_SetString(PyExc_ValueError, "String expected!"); + PyErr_SetString(PyExc_TypeError, "String expected!"); return NULL; } diff --git a/src/python/misc-py.c b/src/python/misc-py.c index fcd9ba6..91a2ad3 100644 --- a/src/python/misc-py.c +++ b/src/python/misc-py.c @@ -53,8 +53,7 @@ py_compress_file_with_stat(PyObject *self, PyObject *args) cr_compress_file_with_stat(src, dst, type, contentstat, &tmp_err); if (tmp_err) { - PyErr_SetString(CrErr_Exception, tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } diff --git a/src/python/package-py.c b/src/python/package-py.c index 29fa088..1240659 100644 --- a/src/python/package-py.c +++ b/src/python/package-py.c @@ -48,7 +48,7 @@ Object_FromPackage(cr_Package *pkg, int free_on_destroy) PyObject *pypkg; if (!pkg) { - PyErr_SetString(PyExc_TypeError, "Expected a cr_Package pointer not NULL."); + PyErr_SetString(PyExc_ValueError, "Expected a cr_Package pointer not NULL."); return NULL; } @@ -322,7 +322,7 @@ set_num(_PackageObject *self, PyObject *value, void *member_offset) } else if (PyInt_Check(value)) { val = (gint64) PyInt_AS_LONG(value); } else { - PyErr_SetString(PyExc_ValueError, "Number expected!"); + PyErr_SetString(PyExc_TypeError, "Number expected!"); return -1; } cr_Package *pkg = self->package; @@ -336,7 +336,7 @@ set_str(_PackageObject *self, PyObject *value, void *member_offset) if (check_PackageStatus(self)) return -1; if (!PyString_Check(value) && value != Py_None) { - PyErr_SetString(PyExc_ValueError, "String or None expected!"); + PyErr_SetString(PyExc_TypeError, "String or None expected!"); return -1; } cr_Package *pkg = self->package; @@ -366,7 +366,7 @@ static int CheckPyDependency(PyObject *dep) { if (!PyTuple_Check(dep) || PyTuple_Size(dep) != 6) { - PyErr_SetString(PyExc_ValueError, "Element of list has to be a tuple with 6 items."); + PyErr_SetString(PyExc_TypeError, "Element of list has to be a tuple with 6 items."); return 1; } return 0; @@ -376,7 +376,7 @@ static int CheckPyPackageFile(PyObject *dep) { if (!PyTuple_Check(dep) || PyTuple_Size(dep) != 3) { - PyErr_SetString(PyExc_ValueError, "Element of list has to be a tuple with 3 items."); + PyErr_SetString(PyExc_TypeError, "Element of list has to be a tuple with 3 items."); return 1; } return 0; @@ -386,7 +386,7 @@ static int CheckPyChangelogEntry(PyObject *dep) { if (!PyTuple_Check(dep) || PyTuple_Size(dep) != 3) { - PyErr_SetString(PyExc_ValueError, "Element of list has to be a tuple with 3 items."); + PyErr_SetString(PyExc_TypeError, "Element of list has to be a tuple with 3 items."); return 1; } return 0; @@ -403,7 +403,7 @@ set_list(_PackageObject *self, PyObject *list, void *conv) return -1; if (!PyList_Check(list)) { - PyErr_SetString(PyExc_ValueError, "List expected!"); + PyErr_SetString(PyExc_TypeError, "List expected!"); return -1; } diff --git a/src/python/parsepkg-py.c b/src/python/parsepkg-py.c index d4155a4..bd6cc46 100644 --- a/src/python/parsepkg-py.c +++ b/src/python/parsepkg-py.c @@ -48,17 +48,10 @@ py_package_from_rpm(PyObject *self, PyObject *args) return NULL; } - if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) { - PyErr_Format(PyExc_IOError, "File %s doesn't exist", filename); - return NULL; - } - pkg = cr_package_from_rpm(filename, checksum_type, location_href, location_base, changelog_limit, NULL, &tmp_err); if (tmp_err) { - PyErr_Format(CrErr_Exception, "Cannot load %s: %s", - filename, tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, "Cannot load %s: ", filename); return NULL; } @@ -86,18 +79,10 @@ py_xml_from_rpm(PyObject *self, PyObject *args) return NULL; } - if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) { - PyErr_Format(PyExc_IOError, "File %s doesn't exist", filename); - return NULL; - } - - xml_res = cr_xml_from_rpm(filename, checksum_type, location_href, location_base, changelog_limit, NULL, &tmp_err); if (tmp_err) { - PyErr_Format(CrErr_Exception, "Cannot load %s: %s", - filename, tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, "Cannot load %s: ", filename); return NULL; } diff --git a/src/python/repomd-py.c b/src/python/repomd-py.c index f774300..4e47257 100644 --- a/src/python/repomd-py.c +++ b/src/python/repomd-py.c @@ -194,8 +194,7 @@ xml_dump(_RepomdObject *self, void *nothing) GError *tmp_err = NULL; char *xml = cr_xml_dump_repomd(self->repomd, &tmp_err); if (tmp_err) { - PyErr_Format(CrErr_Exception, "dump failed: %s", tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } py_str = PyStringOrNone_FromString(xml); @@ -238,7 +237,7 @@ static int CheckPyString(PyObject *dep) { if (!PyString_Check(dep)) { - PyErr_SetString(PyExc_ValueError, "Element of list has to be a string"); + PyErr_SetString(PyExc_TypeError, "Element of list has to be a string"); return 1; } return 0; @@ -248,7 +247,7 @@ static int CheckPyDistroTag(PyObject *dep) { if (!PyTuple_Check(dep) || PyTuple_Size(dep) != 2) { - PyErr_SetString(PyExc_ValueError, "Element of list has to be a tuple with 2 items."); + PyErr_SetString(PyExc_TypeError, "Element of list has to be a tuple with 2 items."); return 1; } return 0; @@ -325,7 +324,7 @@ set_str(_RepomdObject *self, PyObject *value, void *member_offset) if (check_RepomdStatus(self)) return -1; if (!PyString_Check(value) && value != Py_None) { - PyErr_SetString(PyExc_ValueError, "String or None expected!"); + PyErr_SetString(PyExc_TypeError, "String or None expected!"); return -1; } cr_Repomd *repomd = self->repomd; @@ -347,7 +346,7 @@ set_list(_RepomdObject *self, PyObject *list, void *conv) return -1; if (!PyList_Check(list)) { - PyErr_SetString(PyExc_ValueError, "List expected!"); + PyErr_SetString(PyExc_TypeError, "List expected!"); return -1; } diff --git a/src/python/repomdrecord-py.c b/src/python/repomdrecord-py.c index 3aaa834..6f1c3e3 100644 --- a/src/python/repomdrecord-py.c +++ b/src/python/repomdrecord-py.c @@ -37,7 +37,7 @@ Object_FromRepomdRecord(cr_RepomdRecord *rec) PyObject *py_rec; if (!rec) { - PyErr_SetString(PyExc_TypeError, "Expected a cr_RepomdRecord pointer not NULL."); + PyErr_SetString(PyExc_ValueError, "Expected a cr_RepomdRecord pointer not NULL."); return NULL; } @@ -152,8 +152,7 @@ fill(_RepomdRecordObject *self, PyObject *args) cr_repomd_record_fill(self->record, checksum_type, &err); if (err) { - PyErr_Format(CrErr_Exception, "fill method failed: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -167,7 +166,7 @@ compress_and_fill(_RepomdRecordObject *self, PyObject *args) PyObject *compressed_repomdrecord; GError *err = NULL; - if (!PyArg_ParseTuple(args, "O!ii:fill", + if (!PyArg_ParseTuple(args, "O!ii:compress_and_fill", &RepomdRecord_Type, &compressed_repomdrecord, &checksum_type, @@ -183,8 +182,7 @@ compress_and_fill(_RepomdRecordObject *self, PyObject *args) compression_type, &err); if (err) { - PyErr_Format(CrErr_Exception, "compress_and_fill method failed: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -200,8 +198,7 @@ rename_file(_RepomdRecordObject *self, void *nothing) cr_repomd_record_rename_file(self->record, &err); if (err) { - PyErr_Format(CrErr_Exception, "rename_file method failed: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -282,7 +279,7 @@ set_num(_RepomdRecordObject *self, PyObject *value, void *member_offset) } else if (PyInt_Check(value)) { val = (gint64) PyInt_AS_LONG(value); } else { - PyErr_SetString(PyExc_ValueError, "Number expected!"); + PyErr_SetString(PyExc_TypeError, "Number expected!"); return -1; } cr_RepomdRecord *rec = self->record; @@ -301,7 +298,7 @@ set_int(_RepomdRecordObject *self, PyObject *value, void *member_offset) } else if (PyInt_Check(value)) { val = PyInt_AS_LONG(value); } else { - PyErr_SetString(PyExc_ValueError, "Number expected!"); + PyErr_SetString(PyExc_TypeError, "Number expected!"); return -1; } cr_RepomdRecord *rec = self->record; @@ -315,7 +312,7 @@ set_str(_RepomdRecordObject *self, PyObject *value, void *member_offset) if (check_RepomdRecordStatus(self)) return -1; if (!PyString_Check(value) && value != Py_None) { - PyErr_SetString(PyExc_ValueError, "String or None expected!"); + PyErr_SetString(PyExc_TypeError, "String or None expected!"); return -1; } cr_RepomdRecord *rec = self->record; diff --git a/src/python/sqlite-py.c b/src/python/sqlite-py.c index f30e2c4..69ca879 100644 --- a/src/python/sqlite-py.c +++ b/src/python/sqlite-py.c @@ -76,7 +76,7 @@ sqlite_init(_SqliteObject *self, PyObject *args, PyObject *kwds) /* Check arguments */ if (db_type < CR_DB_PRIMARY || db_type >= CR_DB_SENTINEL) { - PyErr_SetString(PyExc_ValueError, "Unknown type value"); + PyErr_SetString(PyExc_ValueError, "Unknown db type"); return -1; } @@ -91,8 +91,7 @@ sqlite_init(_SqliteObject *self, PyObject *args, PyObject *kwds) /* Init */ self->db = cr_db_open(path, db_type, &err); if (err) { - PyErr_Format(CrErr_Exception, "Sqlite initialization failed: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return -1; } @@ -141,8 +140,7 @@ add_pkg(_SqliteObject *self, PyObject *args) cr_db_add_pkg(self->db, Package_FromPyObject(py_pkg), &err); if (err) { - PyErr_Format(CrErr_Exception, "Cannot add package: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -163,8 +161,7 @@ dbinfo_update(_SqliteObject *self, PyObject *args) cr_db_dbinfo_update(self->db, checksum, &err); if (err) { - PyErr_Format(CrErr_Exception, "Sqlite dbinfo_update error: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -182,8 +179,7 @@ close_db(_SqliteObject *self, void *nothing) cr_db_close(self->db, &err); self->db = NULL; if (err) { - PyErr_Format(CrErr_Exception, "Sqlite close error: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } } diff --git a/src/python/xml_dump-py.c b/src/python/xml_dump-py.c index e4a4141..e024e67 100644 --- a/src/python/xml_dump-py.c +++ b/src/python/xml_dump-py.c @@ -41,9 +41,7 @@ py_xml_dump_primary(PyObject *self, PyObject *args) xml = cr_xml_dump_primary(Package_FromPyObject(py_pkg), &err); if (err) { - PyErr_Format(CrErr_Exception, "Error while dumping primary xml: %s", - err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -66,9 +64,7 @@ py_xml_dump_filelists(PyObject *self, PyObject *args) xml = cr_xml_dump_filelists(Package_FromPyObject(py_pkg), &err); if (err) { - PyErr_Format(CrErr_Exception, "Error while dumping filelists xml: %s", - err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -91,9 +87,7 @@ py_xml_dump_other(PyObject *self, PyObject *args) xml = cr_xml_dump_other(Package_FromPyObject(py_pkg), &err); if (err) { - PyErr_Format(CrErr_Exception, "Error while dumping other xml: %s", - err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -117,9 +111,7 @@ py_xml_dump(PyObject *self, PyObject *args) xml_res = cr_xml_dump(Package_FromPyObject(py_pkg), &err); if (err) { - PyErr_Format(CrErr_Exception, "Error while dumping xml: %s", - err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } diff --git a/src/python/xml_file-py.c b/src/python/xml_file-py.c index 06cecd1..d733be0 100644 --- a/src/python/xml_file-py.c +++ b/src/python/xml_file-py.c @@ -94,7 +94,7 @@ xmlfile_init(_XmlFileObject *self, PyObject *args, PyObject *kwds) } else if (ContentStatObject_Check(py_stat)) { stat = ContentStat_FromPyObject(py_stat); } else { - PyErr_SetString(PyExc_ValueError, "Use ContentStat or None"); + PyErr_SetString(PyExc_TypeError, "Use ContentStat or None"); return -1; } @@ -111,8 +111,7 @@ xmlfile_init(_XmlFileObject *self, PyObject *args, PyObject *kwds) /* Init */ self->xmlfile = cr_xmlfile_sopen(path, type, comtype, stat, &err); if (err) { - PyErr_Format(CrErr_Exception, "XmlFile initialization failed: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return -1; } @@ -168,8 +167,7 @@ set_num_of_pkgs(_XmlFileObject *self, PyObject *args) cr_xmlfile_set_num_of_pkgs(self->xmlfile, num, &err); if (err) { - PyErr_Format(CrErr_Exception, "XmlFile set_num_of_pkgs error: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -190,8 +188,7 @@ add_pkg(_XmlFileObject *self, PyObject *args) cr_xmlfile_add_pkg(self->xmlfile, Package_FromPyObject(py_pkg), &err); if (err) { - PyErr_Format(CrErr_Exception, "Cannot add package: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -212,8 +209,7 @@ add_chunk(_XmlFileObject *self, PyObject *args) cr_xmlfile_add_chunk(self->xmlfile, chunk, &err); if (err) { - PyErr_Format(CrErr_Exception, "Cannot add chunk: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } @@ -236,8 +232,7 @@ xmlfile_close(_XmlFileObject *self, void *nothing) self->py_stat = NULL; if (err) { - PyErr_Format(CrErr_Exception, "Error while closing: %s", err->message); - g_clear_error(&err); + nice_exception(&err, NULL); return NULL; } diff --git a/src/python/xml_parser-py.c b/src/python/xml_parser-py.c index faeafdd..b60c606 100644 --- a/src/python/xml_parser-py.c +++ b/src/python/xml_parser-py.c @@ -170,7 +170,7 @@ py_xml_parse_primary(PyObject *self, PyObject *args) } if (py_newpkgcb == Py_None && py_pkgcb == Py_None) { - PyErr_SetString(PyExc_TypeError, "both pkgcb and newpkgcb cannot be None"); + PyErr_SetString(PyExc_ValueError, "both pkgcb and newpkgcb cannot be None"); return NULL; } @@ -210,8 +210,7 @@ py_xml_parse_primary(PyObject *self, PyObject *args) Py_XDECREF(cbdata.py_pkg); if (tmp_err) { - PyErr_Format(CrErr_Exception, "%s", tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } @@ -252,7 +251,7 @@ py_xml_parse_filelists(PyObject *self, PyObject *args) } if (py_newpkgcb == Py_None && py_pkgcb == Py_None) { - PyErr_SetString(PyExc_TypeError, "both pkgcb and newpkgcb cannot be None"); + PyErr_SetString(PyExc_ValueError, "both pkgcb and newpkgcb cannot be None"); return NULL; } @@ -291,8 +290,7 @@ py_xml_parse_filelists(PyObject *self, PyObject *args) Py_XDECREF(cbdata.py_pkg); if (tmp_err) { - PyErr_Format(CrErr_Exception, "%s", tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } @@ -333,7 +331,7 @@ py_xml_parse_other(PyObject *self, PyObject *args) } if (py_newpkgcb == Py_None && py_pkgcb == Py_None) { - PyErr_SetString(PyExc_TypeError, "both pkgcb and newpkgcb cannot be None"); + PyErr_SetString(PyExc_ValueError, "both pkgcb and newpkgcb cannot be None"); return NULL; } @@ -372,8 +370,7 @@ py_xml_parse_other(PyObject *self, PyObject *args) Py_XDECREF(cbdata.py_pkg); if (tmp_err) { - PyErr_Format(CrErr_Exception, "%s", tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } @@ -391,18 +388,14 @@ py_xml_parse_repomd(PyObject *self, PyObject *args) cr_Repomd *repomd; GError *tmp_err = NULL; - if (!PyArg_ParseTuple(args, "sOO:py_xml_parse_repomd", + if (!PyArg_ParseTuple(args, "sO!O:py_xml_parse_repomd", &filename, + &Repomd_Type, &py_repomd, &py_warningcb)) { return NULL; } - if (!RepomdObject_Check(py_repomd)) { - PyErr_SetString(PyExc_TypeError, "Bad type"); - return NULL; - } - if (!PyCallable_Check(py_warningcb) && py_warningcb != Py_None) { PyErr_SetString(PyExc_TypeError, "warningcb must be callable or None"); return NULL; @@ -433,8 +426,7 @@ py_xml_parse_repomd(PyObject *self, PyObject *args) Py_XDECREF(py_warningcb); if (tmp_err) { - PyErr_Format(CrErr_Exception, "%s", tmp_err->message); - g_clear_error(&tmp_err); + nice_exception(&tmp_err, NULL); return NULL; } diff --git a/tests/python/tests/test_crfile.py b/tests/python/tests/test_crfile.py index f2511e5..f47963c 100644 --- a/tests/python/tests/test_crfile.py +++ b/tests/python/tests/test_crfile.py @@ -49,12 +49,12 @@ class TestCaseCrFile(unittest.TestCase): self.assertFalse(os.path.exists(path)) # Bad contentstat object - self.assertRaises(ValueError, cr.XmlFile, path, + self.assertRaises(TypeError, cr.XmlFile, path, cr.MODE_READ, cr.GZ_COMPRESSION, "foo") self.assertFalse(os.path.exists(path)) # Non existing path - self.assertRaises(cr.CreaterepoCError, cr.CrFile, + self.assertRaises(IOError, cr.CrFile, "foobar/foo/xxx/cvydmaticxuiowe") def test_crfile_no_compression(self): diff --git a/tests/python/tests/test_misc.py b/tests/python/tests/test_misc.py index 9a217c4..9d578f0 100644 --- a/tests/python/tests/test_misc.py +++ b/tests/python/tests/test_misc.py @@ -20,7 +20,7 @@ class TestCaseMisc(unittest.TestCase): def test_compress_file(self): # Non exist file - self.assertRaises(cr.CreaterepoCError, cr.compress_file, + self.assertRaises(IOError, cr.compress_file, self.nofile, None, cr.BZ2) # Compression - use the same name+suffix diff --git a/tests/python/tests/test_parsepkg.py b/tests/python/tests/test_parsepkg.py index 4dd49c2..0c94f32 100644 --- a/tests/python/tests/test_parsepkg.py +++ b/tests/python/tests/test_parsepkg.py @@ -46,7 +46,7 @@ class TestCaseParsepkg(unittest.TestCase): self.assertRaises(IOError, cr.package_from_rpm, "./") # File is not a rpm - self.assertRaises(cr.CreaterepoCError, cr.package_from_rpm, FILE_BINARY_PATH) + self.assertRaises(IOError, cr.package_from_rpm, FILE_BINARY_PATH) def test_xml_from_rpm(self): xml = cr.xml_from_rpm(PKG_ARCHER_PATH) @@ -65,4 +65,4 @@ class TestCaseParsepkg(unittest.TestCase): self.assertRaises(IOError, cr.xml_from_rpm, "./") # File is not a rpm - self.assertRaises(cr.CreaterepoCError, cr.xml_from_rpm, FILE_BINARY_PATH) + self.assertRaises(IOError, cr.xml_from_rpm, FILE_BINARY_PATH) diff --git a/tests/python/tests/test_xml_file.py b/tests/python/tests/test_xml_file.py index 963b540..fa8ebbf 100644 --- a/tests/python/tests/test_xml_file.py +++ b/tests/python/tests/test_xml_file.py @@ -67,7 +67,7 @@ class TestCaseXmlFile(unittest.TestCase): self.assertFalse(os.path.exists(path)) # Bad contentstat object - self.assertRaises(ValueError, cr.XmlFile, path, + self.assertRaises(TypeError, cr.XmlFile, path, cr.XMLFILE_PRIMARY, cr.GZ_COMPRESSION, "foo") self.assertFalse(os.path.exists(path)) @@ -77,7 +77,7 @@ class TestCaseXmlFile(unittest.TestCase): # Already existing file open(path, "w").write("foobar") - self.assertRaises(cr.CreaterepoCError, cr.PrimaryXmlFile, path) + self.assertRaises(IOError, cr.PrimaryXmlFile, path) def test_xmlfile_no_compression(self): path = os.path.join(self.tmpdir, "primary.xml") diff --git a/tests/python/tests/test_xml_parser.py b/tests/python/tests/test_xml_parser.py index 09341ad..1ea2bcc 100644 --- a/tests/python/tests/test_xml_parser.py +++ b/tests/python/tests/test_xml_parser.py @@ -122,7 +122,7 @@ class TestCaseXmlParserPrimary(unittest.TestCase): ['fake_bash', 'super_kernel']) def test_xml_parser_primary_repo02_no_cbs(self): - self.assertRaises(TypeError, + self.assertRaises(ValueError, cr.xml_parse_primary, REPO_02_PRIXML, None, None, None, 1) @@ -300,7 +300,7 @@ class TestCaseXmlParserFilelists(unittest.TestCase): ['fake_bash', 'super_kernel']) def test_xml_parser_filelists_repo02_no_cbs(self): - self.assertRaises(TypeError, + self.assertRaises(ValueError, cr.xml_parse_filelists, REPO_02_FILXML, None, None, None) @@ -478,7 +478,7 @@ class TestCaseXmlParserOther(unittest.TestCase): ['fake_bash', 'super_kernel']) def test_xml_parser_other_repo02_no_cbs(self): - self.assertRaises(TypeError, + self.assertRaises(ValueError, cr.xml_parse_other, REPO_02_OTHXML, None, None, None) @@ -552,6 +552,11 @@ class TestCaseXmlParserOther(unittest.TestCase): class TestCaseXmlParserRepomd(unittest.TestCase): + def test_xml_parser_repomd_bad_repomd_object(self): + self.assertRaises(TypeError, + cr.xml_parse_repomd, + REPO_01_REPOMD, "foo", None) + def test_xml_parser_repomd_repo01(self): warnings = []