From 6df81472d75385008e6601251bf738a81d3e51aa Mon Sep 17 00:00:00 2001 From: William Pitcock Date: Jan 07 2017 07:00:14 +0000 Subject: more dependency resolver api coverage --- diff --git a/libpkgconf_pkg.pxd b/libpkgconf_pkg.pxd index c122ee8..0966c1e 100644 --- a/libpkgconf_pkg.pxd +++ b/libpkgconf_pkg.pxd @@ -2,6 +2,15 @@ from libcpp cimport bool from libpkgconf_iter cimport * from libpkgconf_client cimport * +ctypedef enum pkgconf_pkg_comparator_t: + PKGCONF_CMP_NOT_EQUAL + PKGCONF_CMP_ANY + PKGCONF_CMP_LESS_THAN + PKGCONF_CMP_LESS_THAN_EQUAL + PKGCONF_CMP_EQUAL + PKGCONF_CMP_GREATER_THAN + PKGCONF_CMP_GREATER_THAN_EQUAL + cdef enum property_flags: None = 0x0 Virtual = 0x1 @@ -16,17 +25,6 @@ cdef enum resolver_err: PackageConflict = 0x4 DependencyGraphBreak = 0x8 -cdef enum pkgconf_pkg_comparator_: - PKGCONF_CMP_NOT_EQUAL - PKGCONF_CMP_ANY - PKGCONF_CMP_LESS_THAN - PKGCONF_CMP_LESS_THAN_EQUAL - PKGCONF_CMP_EQUAL - PKGCONF_CMP_GREATER_THAN - PKGCONF_CMP_GREATER_THAN_EQUAL - -ctypedef pkgconf_pkg_comparator_ pkgconf_pkg_comparator_t - ctypedef pkgconf_dependency_ pkgconf_dependency_t ctypedef pkgconf_pkg_ pkgconf_pkg_t ctypedef bool (*pkgconf_pkg_iteration_func_t)(const pkgconf_pkg_t *pkg, void *data) diff --git a/pkgconf.pyx b/pkgconf.pyx index c9991a4..cb0b2fb 100644 --- a/pkgconf.pyx +++ b/pkgconf.pyx @@ -7,6 +7,13 @@ cdef void error_trampoline(const char *msg, const libpkgconf.pkgconf_client_t *c (error_data).handle_error(msg.decode('utf-8')[0:-1]) +cdef void traverse_trampoline(libpkgconf.pkgconf_client_t *client, libpkgconf.pkgconf_pkg_t *pkg, void *data, unsigned int flags): + pr = PackageRef() + pr.pc_client = client + pr.parent = pkg + (data)(pr, flags) + + resolver_errmap = { libpkgconf.resolver_err.NoError: 'no error', libpkgconf.resolver_err.PackageNotFound: 'package not found', @@ -16,15 +23,111 @@ resolver_errmap = { } +comparator_map = { + libpkgconf.pkgconf_pkg_comparator_t.PKGCONF_CMP_NOT_EQUAL: '!=', + libpkgconf.pkgconf_pkg_comparator_t.PKGCONF_CMP_ANY: '(any)', + libpkgconf.pkgconf_pkg_comparator_t.PKGCONF_CMP_LESS_THAN: '<', + libpkgconf.pkgconf_pkg_comparator_t.PKGCONF_CMP_LESS_THAN_EQUAL: '<=', + libpkgconf.pkgconf_pkg_comparator_t.PKGCONF_CMP_EQUAL: '=', + libpkgconf.pkgconf_pkg_comparator_t.PKGCONF_CMP_GREATER_THAN: '>', + libpkgconf.pkgconf_pkg_comparator_t.PKGCONF_CMP_GREATER_THAN_EQUAL: '>=', +} + + class ResolverError(Exception): def __init__(self, err): global resolver_errmap super().__init__(resolver_errmap.get(err, 'unknown error')) +cdef class DependencyRef: + cdef libpkgconf.pkgconf_client_t *pc_client + cdef libpkgconf.pkgconf_dependency_t *wrapped + cdef Client client + cdef PackageRef parent + + def __repr__(self): + global comparator_map + + summary = " iter.data + self.iter = iter.next + + return dr + + +cdef class DependencyList: + cdef Client client + cdef PackageRef parent + cdef libpkgconf.pkgconf_list_t *lst + + def __iter__(self): + di = DependencyIterator() + di.client = self.client + di.parent = self.parent + di.iter = self.lst.head + return di + + def __repr__(self): + repr([x for x in self]) + + cdef class PackageRef: cdef libpkgconf.pkgconf_client_t *pc_client cdef libpkgconf.pkgconf_pkg_t *parent + cdef Client client def __repr__(self): summary = " traverse_trampoline, callback, maxdepth, traits) + if result: + raise ResolverError(result) + + cdef deplist(self, libpkgconf.pkgconf_list_t *lst): + dl = DependencyList() + dl.client = self.client + dl.parent = self + dl.lst = lst + return dl + + @property + def requires(self): + return self.deplist(&self.parent.requires) + cdef class Package(PackageRef): cdef libpkgconf.pkgconf_pkg_t pkg @@ -113,12 +233,16 @@ cdef class Queue: cdef libpkgconf.pkgconf_client_t *pc_client cdef libpkgconf.pkgconf_list_t qlist cdef libpkgconf.pkgconf_pkg_t world + cdef Client client - def __cinit__(self): + def __cinit__(self, client): self.world.id = b'virtual:world' self.world.realname = b'virtual world package' self.world.flags = libpkgconf.property_flags.Virtual + def __init__(self, client): + self.client = client + def __del__(self): libpkgconf.pkgconf_pkg_free(self.pc_client, &self.world) libpkgconf.pkgconf_queue_free(&self.qlist) @@ -322,7 +446,7 @@ cdef class Client: def queue(self): """Creates a new dependency resolver attached to this client.""" - q = Queue() + q = Queue(self) q.pc_client = &self.pc_client return q