python: Better exception reporting
authorTomas Mlcoch <tmlcoch@redhat.com>
Thu, 13 Jun 2013 14:44:33 +0000 (16:44 +0200)
committerTomas Mlcoch <tmlcoch@redhat.com>
Thu, 13 Jun 2013 14:58:35 +0000 (16:58 +0200)
Return more appropriate python exceptions instead of CreaterepoCError in some cases.

20 files changed:
src/python/compression_wrapper-py.c
src/python/contentstat-py.c
src/python/exception-py.c
src/python/exception-py.h
src/python/load_metadata-py.c
src/python/locate_metadata-py.c
src/python/misc-py.c
src/python/package-py.c
src/python/parsepkg-py.c
src/python/repomd-py.c
src/python/repomdrecord-py.c
src/python/sqlite-py.c
src/python/xml_dump-py.c
src/python/xml_file-py.c
src/python/xml_parser-py.c
tests/python/tests/test_crfile.py
tests/python/tests/test_misc.py
tests/python/tests/test_parsepkg.py
tests/python/tests/test_xml_file.py
tests/python/tests/test_xml_parser.py

index 6a47f03c9bcfb1d883ebd85345996a5419bd1927..f2613774f3514edbb4945d59cda44e45279b8530 100644 (file)
@@ -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;
     }
 
index 1f60fefcd117b53456201f02ceb6d13054280061..217736948c4e9c45dc14f1a3791eeb3d84698b99 100644 (file)
@@ -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;
index 69f158c5b504eb6855013807a58a00bee2022cc1..736baaba66cb98728e219f1e9602b02c75206331 100644 (file)
@@ -18,6 +18,8 @@
  */
 
 #include <Python.h>
+#include <glib.h>
+#include <glib/gprintf.h>
 #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);
+}
index dfeb02c4c5c2eb736f3d343ad126aef122c48590..5877576d1cedc64fef3043f3ca804767ab6f1e9d 100644 (file)
@@ -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
index d4a1a73442660ddb78af18e356bac95b43d6bff6..9341d6251b53fa0f85a10189bc7b9b084fd5ff7e 100644 (file)
@@ -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;
index 35d329a8a0fb7782b9592a56439207d0fd581c1b..528d4bda990b2210a7d2935eae3fd9033461937e 100644 (file)
@@ -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;
     }
 
index fcd9ba653d99da85f432117d6fb0658deceaaf92..91a2ad3923b472385bf23adefe364a1d36629432 100644 (file)
@@ -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;
     }
 
index 29fa088006ac97485e20ae393d3653506d55d7c6..1240659e40c305cb6aed04f8c947c6cbd6c6769f 100644 (file)
@@ -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;
     }
 
index d4155a453a23ceb25dce616b09c3db23ea0e3015..bd6cc46c1bdd3e20538531ebdbb2560ad682d452 100644 (file)
@@ -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;
     }
 
index f774300e1e0c97ec44899afd3c3177bd535d80dc..4e47257bfd6a7b9db43bc9efbd22d3b55872bb9c 100644 (file)
@@ -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;
     }
 
index 3aaa834486bb90165905789dc9e93e0e757cbe8c..6f1c3e31e2708e22d84b305be18ea856f13a4e7b 100644 (file)
@@ -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;
index f30e2c45a309d981b2f8b3f24dab24aeb17ff423..69ca879b4d605f1bbe418eb7edd07bd60870ad27 100644 (file)
@@ -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;
         }
     }
index e4a4141324ecfea97d393dad02080b0648803ae2..e024e6765ebc006e7068abbb8e74328402a2ad66 100644 (file)
@@ -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;
     }
 
index 06cecd1ce99c318c8f5af0d2c4cc97ff3a75fae1..d733be09d4b356bca904af87d2a9ac711f501f98 100644 (file)
@@ -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;
     }
 
index faeafddeba7348a3d51e1d3c601e6bb488c6a8ac..b60c6061d96d9ea245d3d9aa8c3f3149ff4ac55a 100644 (file)
@@ -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;
     }
 
index f2511e52bd30b29288299788e6b16444c38149b4..f47963cd0b4573b7456e77df31fc1ca86ae051f3 100644 (file)
@@ -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):
index 9a217c4eb0f0e29d00e76c7bed007abb31be13a7..9d578f03b0add3d064f1512975a28ff296742870 100644 (file)
@@ -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
index 4dd49c25748a012be9d073ab9a79327cbc4819fb..0c94f32cd4f0f87247468033ea11215729ee0b6f 100644 (file)
@@ -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)
index 963b5405b47609bd65baef77e5ca418266e489d3..fa8ebbfc3c6a5c4ec4c302f397c60e906fd5d271 100644 (file)
@@ -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")
index 09341ad873dc4e97d5854bd27006154109b3e64a..1ea2bccbb1a71ae0d55f78926e4782cf313391f4 100644 (file)
@@ -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 = []