[pygobject/gsoc2009: 104/160] Refactor _wrap_g_irepository_require



commit 9f8625a58037d44c8dd3d6e5980c54e8a62b062c
Author: Simon van der Linden <svdlinden src gnome org>
Date:   Mon Aug 3 23:05:45 2009 +0200

    Refactor _wrap_g_irepository_require

 gi/importer.py      |    8 +++++-
 gi/pygirepository.c |   57 ++++++++++++++++++++++++++-------------------------
 2 files changed, 35 insertions(+), 30 deletions(-)
---
diff --git a/gi/importer.py b/gi/importer.py
index dd7f105..812dced 100644
--- a/gi/importer.py
+++ b/gi/importer.py
@@ -23,7 +23,7 @@
 import sys
 import gobject
 
-from ._gi import Repository
+from ._gi import Repository, RepositoryError
 from .module import DynamicModule
 
 
@@ -44,7 +44,11 @@ class DynamicImporter(object):
         path, namespace = fullname.rsplit('.', 1)
         if path != self.path:
             return
-        if repository.require(namespace):
+        try:
+            repository.require(namespace)
+        except RepositoryError:
+            pass
+        else:
             return self
 
     def load_module(self, fullname):
diff --git a/gi/pygirepository.c b/gi/pygirepository.c
index 06763d4..dd0ae82 100644
--- a/gi/pygirepository.c
+++ b/gi/pygirepository.c
@@ -23,6 +23,8 @@
 
 #include "pygi-private.h"
 
+PyObject *PyGIRepositoryError;
+
 static PyMethodDef _PyGIRepository_methods[];
 
 PyTypeObject PyGIRepository_Type = {
@@ -78,39 +80,33 @@ _wrap_g_irepository_get_default(PyObject *self)
 static PyObject *
 _wrap_g_irepository_require(PyGIRepository *self, PyObject *args, PyObject *kwargs)
 {
-    static char *kwlist[] = { "namespace", "lazy", NULL };
-    gchar *namespace;
-    PyObject *lazy_obj = NULL;
-    int flags = 0;
-    GTypelib *ret;
-    PyObject *pyret;
-    GError *error = NULL;
+    static char *kwlist[] = { "namespace", "version", "lazy", NULL };
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
-				     "s|O:Repository.require",
-				     kwlist, &namespace, &lazy_obj))
-        return NULL;
+    const char *namespace_;
+    const char *version = NULL;
+    PyObject *lazy = NULL;
+    GIRepositoryLoadFlags flags = 0;
+    GTypelib *typelib;
+    GError *error;
 
-    if (lazy_obj != NULL && PyObject_IsTrue(lazy_obj))
-	flags |= G_IREPOSITORY_LOAD_FLAG_LAZY;
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|sO:Repository.require",
+            kwlist, &namespace_, &version, &lazy)) {
+        return NULL;
+    }
 
-    /* TODO - handle versioning in some way, need to figure out what
-     * this looks like Python side.
-     */
-    ret = g_irepository_require(self->repository, namespace, NULL, flags, &error);
+    if (lazy != NULL && PyObject_IsTrue(lazy)) {
+        flags |= G_IREPOSITORY_LOAD_FLAG_LAZY;
+    }
 
-    if (ret == NULL) {
-#if 0
-	g_print ("ERROR: %s (FIXME: raise GError exception)\n",
-		 error->message);
-	g_clear_error (&error);
-#endif
-	Py_INCREF(Py_None);
-	return Py_None;
+    error = NULL;
+    typelib = g_irepository_require(self->repository, namespace_, version, flags, &error);
+    if (error != NULL) {
+        PyErr_SetString(PyGIRepositoryError, error->message);
+        g_error_free(error);
+        return NULL;
     }
-    pyret = PyBool_FromLong(ret != NULL);
-    Py_INCREF(pyret);
-    return pyret;
+
+    Py_RETURN_NONE;
 }
 
 static PyObject *
@@ -261,5 +257,10 @@ pygi_repository_register_types(PyObject *m)
     if (PyModule_AddObject(m, "Repository", (PyObject *)&PyGIRepository_Type)) {
         return;
     }
+
+    PyGIRepositoryError = PyErr_NewException("gi.RepositoryError", NULL, NULL);
+    if (PyModule_AddObject(m, "RepositoryError", PyGIRepositoryError)) {
+        return;
+    }
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]