1 /* -*- Mode: C; c-basic-offset: 4 -*-
2 * vim: tabstop=4 shiftwidth=4 expandtab
4 * Copyright (C) 2005-2009 Johan Dahlin <johan@gnome.org>
6 * pygi-repository.c: GIRepository wrapper.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
22 #include "pygi-private.h"
24 #include <pyglib-python-compat.h>
26 PyObject *PyGIRepositoryError;
28 PYGLIB_DEFINE_TYPE("gi.Repository", PyGIRepository_Type, PyGIRepository);
31 _wrap_g_irepository_enumerate_versions (PyGIRepository *self,
35 static char *kwlist[] = { "namespace", NULL };
36 const char *namespace_;
37 GList *versions, *item;
40 if (!PyArg_ParseTupleAndKeywords (args, kwargs, "s:Repository.enumerate_versions",
41 kwlist, &namespace_)) {
45 versions = g_irepository_enumerate_versions (self->repository, namespace_);
47 for (item = versions; item; item = item->next) {
48 char *version = item->data;
49 PyObject *py_version = PYGLIB_PyUnicode_FromString (version);
50 PyList_Append(ret, py_version);
51 Py_DECREF(py_version);
54 g_list_free(versions);
60 _wrap_g_irepository_get_default (PyObject *self)
62 static PyGIRepository *repository = NULL;
65 repository = (PyGIRepository *) PyObject_New (PyGIRepository, &PyGIRepository_Type);
66 if (repository == NULL) {
70 repository->repository = g_irepository_get_default();
73 Py_INCREF ( (PyObject *) repository);
74 return (PyObject *) repository;
78 _wrap_g_irepository_require (PyGIRepository *self,
82 static char *kwlist[] = { "namespace", "version", "lazy", NULL };
84 const char *namespace_;
85 const char *version = NULL;
86 PyObject *lazy = NULL;
87 GIRepositoryLoadFlags flags = 0;
90 if (!PyArg_ParseTupleAndKeywords (args, kwargs, "s|zO:Repository.require",
91 kwlist, &namespace_, &version, &lazy)) {
95 if (lazy != NULL && PyObject_IsTrue (lazy)) {
96 flags |= G_IREPOSITORY_LOAD_FLAG_LAZY;
100 g_irepository_require (self->repository, namespace_, version, flags, &error);
102 PyErr_SetString (PyGIRepositoryError, error->message);
103 g_error_free (error);
111 _wrap_g_irepository_is_registered (PyGIRepository *self,
115 static char *kwlist[] = { "namespace", "version", NULL };
116 const char *namespace_;
117 const char *version = NULL;
119 if (!PyArg_ParseTupleAndKeywords (args, kwargs, "s|z:Repository.is_registered",
120 kwlist, &namespace_, &version)) {
124 return PyBool_FromLong (g_irepository_is_registered (self->repository,
125 namespace_, version));
129 _wrap_g_irepository_find_by_name (PyGIRepository *self,
133 static char *kwlist[] = { "namespace", "name", NULL };
135 const char *namespace_;
140 char *trimmed_name = NULL;
142 if (!PyArg_ParseTupleAndKeywords (args, kwargs,
143 "ss:Repository.find_by_name", kwlist, &namespace_, &name)) {
147 /* If the given name ends with an underscore, it might be due to usage
148 * as an accessible replacement for something in GI with the same name
149 * as a Python keyword. Test for this and trim it out if necessary.
152 if (len > 0 && name[len-1] == '_') {
153 trimmed_name = g_strndup (name, len-1);
154 if (_pygi_is_python_keyword (trimmed_name)) {
159 info = g_irepository_find_by_name (self->repository, namespace_, name);
160 g_free (trimmed_name);
166 py_info = _pygi_info_new (info);
168 g_base_info_unref (info);
174 _wrap_g_irepository_get_infos (PyGIRepository *self,
178 static char *kwlist[] = { "namespace", NULL };
180 const char *namespace_;
185 if (!PyArg_ParseTupleAndKeywords (args, kwargs, "s:Repository.get_infos",
186 kwlist, &namespace_)) {
190 n_infos = g_irepository_get_n_infos (self->repository, namespace_);
192 PyErr_Format (PyExc_RuntimeError, "Namespace '%s' not loaded", namespace_);
196 infos = PyTuple_New (n_infos);
198 for (i = 0; i < n_infos; i++) {
202 info = g_irepository_get_info (self->repository, namespace_, i);
203 g_assert (info != NULL);
205 py_info = _pygi_info_new (info);
207 g_base_info_unref (info);
209 if (py_info == NULL) {
214 PyTuple_SET_ITEM (infos, i, py_info);
221 _wrap_g_irepository_get_typelib_path (PyGIRepository *self,
225 static char *kwlist[] = { "namespace", NULL };
226 const char *namespace_;
227 const gchar *typelib_path;
229 if (!PyArg_ParseTupleAndKeywords (args, kwargs,
230 "s:Repository.get_typelib_path", kwlist, &namespace_)) {
234 typelib_path = g_irepository_get_typelib_path (self->repository, namespace_);
235 if (typelib_path == NULL) {
236 PyErr_Format (PyExc_RuntimeError, "Namespace '%s' not loaded", namespace_);
240 return PYGLIB_PyBytes_FromString (typelib_path);
244 _wrap_g_irepository_get_version (PyGIRepository *self,
248 static char *kwlist[] = { "namespace", NULL };
249 const char *namespace_;
250 const gchar *version;
252 if (!PyArg_ParseTupleAndKeywords (args, kwargs,
253 "s:Repository.get_version", kwlist, &namespace_)) {
257 version = g_irepository_get_version (self->repository, namespace_);
258 if (version == NULL) {
259 PyErr_Format (PyExc_RuntimeError, "Namespace '%s' not loaded", namespace_);
263 return PYGLIB_PyUnicode_FromString (version);
267 _wrap_g_irepository_get_loaded_namespaces (PyGIRepository *self)
270 PyObject *py_namespaces;
273 namespaces = g_irepository_get_loaded_namespaces (self->repository);
275 py_namespaces = PyList_New (0);
276 for (i = 0; namespaces[i] != NULL; i++) {
277 PyObject *py_namespace = PYGLIB_PyUnicode_FromString (namespaces[i]);
278 PyList_Append (py_namespaces, py_namespace);
279 Py_DECREF(py_namespace);
280 g_free (namespaces[i]);
285 return py_namespaces;
289 _wrap_g_irepository_get_dependencies (PyGIRepository *self,
293 static char *kwlist[] = { "namespace", NULL };
294 const char *namespace_;
296 PyObject *py_namespaces;
299 if (!PyArg_ParseTupleAndKeywords (args, kwargs,
300 "s:Repository.get_dependencies", kwlist, &namespace_)) {
304 py_namespaces = PyList_New (0);
305 /* Returns NULL in case of no dependencies */
306 namespaces = g_irepository_get_dependencies (self->repository, namespace_);
307 if (namespaces == NULL) {
308 return py_namespaces;
311 for (i = 0; namespaces[i] != NULL; i++) {
312 PyObject *py_namespace = PYGLIB_PyUnicode_FromString (namespaces[i]);
313 PyList_Append (py_namespaces, py_namespace);
314 Py_DECREF(py_namespace);
317 g_strfreev (namespaces);
319 return py_namespaces;
324 _wrap_g_irepository_get_immediate_dependencies (PyGIRepository *self,
328 static char *kwlist[] = { "namespace", NULL };
329 const char *namespace_;
331 PyObject *py_namespaces;
334 if (!PyArg_ParseTupleAndKeywords (args, kwargs,
335 "s:Repository.get_immediate_dependencies",
336 kwlist, &namespace_)) {
340 py_namespaces = PyList_New (0);
341 namespaces = g_irepository_get_immediate_dependencies (self->repository,
344 for (i = 0; namespaces[i] != NULL; i++) {
345 PyObject *py_namespace = PYGLIB_PyUnicode_FromString (namespaces[i]);
346 PyList_Append (py_namespaces, py_namespace);
347 Py_DECREF (py_namespace);
350 g_strfreev (namespaces);
352 return py_namespaces;
356 static PyMethodDef _PyGIRepository_methods[] = {
357 { "enumerate_versions", (PyCFunction) _wrap_g_irepository_enumerate_versions, METH_VARARGS | METH_KEYWORDS },
358 { "get_default", (PyCFunction) _wrap_g_irepository_get_default, METH_STATIC | METH_NOARGS },
359 { "require", (PyCFunction) _wrap_g_irepository_require, METH_VARARGS | METH_KEYWORDS },
360 { "get_infos", (PyCFunction) _wrap_g_irepository_get_infos, METH_VARARGS | METH_KEYWORDS },
361 { "find_by_name", (PyCFunction) _wrap_g_irepository_find_by_name, METH_VARARGS | METH_KEYWORDS },
362 { "get_typelib_path", (PyCFunction) _wrap_g_irepository_get_typelib_path, METH_VARARGS | METH_KEYWORDS },
363 { "get_version", (PyCFunction) _wrap_g_irepository_get_version, METH_VARARGS | METH_KEYWORDS },
364 { "get_loaded_namespaces", (PyCFunction) _wrap_g_irepository_get_loaded_namespaces, METH_NOARGS },
365 { "get_dependencies", (PyCFunction) _wrap_g_irepository_get_dependencies, METH_VARARGS | METH_KEYWORDS },
366 { "get_immediate_dependencies", (PyCFunction) _wrap_g_irepository_get_immediate_dependencies, METH_VARARGS | METH_KEYWORDS },
367 { "is_registered", (PyCFunction) _wrap_g_irepository_is_registered, METH_VARARGS | METH_KEYWORDS },
372 _pygi_repository_register_types (PyObject *m)
374 Py_TYPE(&PyGIRepository_Type) = &PyType_Type;
376 PyGIRepository_Type.tp_flags = Py_TPFLAGS_DEFAULT;
377 PyGIRepository_Type.tp_methods = _PyGIRepository_methods;
379 if (PyType_Ready (&PyGIRepository_Type)) {
383 if (PyModule_AddObject (m, "Repository", (PyObject *) &PyGIRepository_Type)) {
387 PyGIRepositoryError = PyErr_NewException ("gi.RepositoryError", NULL, NULL);
388 if (PyModule_AddObject (m, "RepositoryError", PyGIRepositoryError)) {