From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1QhqoH-0000f9-Sz for garchives@archives.gentoo.org; Fri, 15 Jul 2011 22:24:38 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id E2F7721C0D9; Fri, 15 Jul 2011 22:24:20 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 9469221C0D9 for ; Fri, 15 Jul 2011 22:24:20 +0000 (UTC) Received: from pelican.gentoo.org (unknown [66.219.59.40]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 16F6B2AC14B for ; Fri, 15 Jul 2011 22:24:20 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id 2DDAC8003D for ; Fri, 15 Jul 2011 22:24:19 +0000 (UTC) From: "Michał Górny" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Michał Górny" Message-ID: Subject: [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/ X-VCS-Repository: proj/gentoopm X-VCS-Files: gentoopm/basepm/pkg.py gentoopm/basepm/pkgset.py gentoopm/basepm/repo.py gentoopm/basepm/stack.py gentoopm/paludispm/pkg.py gentoopm/paludispm/pkgset.py gentoopm/paludispm/repo.py gentoopm/pkgcorepm/pkg.py gentoopm/portagepm/pkg.py X-VCS-Directories: gentoopm/portagepm/ gentoopm/pkgcorepm/ gentoopm/paludispm/ gentoopm/basepm/ X-VCS-Committer: mgorny X-VCS-Committer-Name: Michał Górny X-VCS-Revision: e08574117f8c27923f3edf562b75bdebeb4889d6 Date: Fri, 15 Jul 2011 22:24:19 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: X-Archives-Hash: 80aafb20334ed0f5ec78f1ab8b9d1424 commit: e08574117f8c27923f3edf562b75bdebeb4889d6 Author: Micha=C5=82 G=C3=B3rny gentoo org> AuthorDate: Fri Jul 15 21:58:43 2011 +0000 Commit: Micha=C5=82 G=C3=B3rny gentoo org> CommitDate: Fri Jul 15 21:58:43 2011 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/gentoopm.git;= a=3Dcommit;h=3De0857411 Split out PM*PackageSet into .pkgset. --- gentoopm/basepm/pkg.py | 160 +-----------------------------------= ---- gentoopm/basepm/pkgset.py | 168 ++++++++++++++++++++++++++++++++++++= ++++++ gentoopm/basepm/repo.py | 2 +- gentoopm/basepm/stack.py | 2 +- gentoopm/paludispm/pkg.py | 35 +--------- gentoopm/paludispm/pkgset.py | 38 ++++++++++ gentoopm/paludispm/repo.py | 3 +- gentoopm/pkgcorepm/pkg.py | 3 +- gentoopm/portagepm/pkg.py | 4 +- 9 files changed, 216 insertions(+), 199 deletions(-) diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py index ad3e1f1..02b1f5e 100644 --- a/gentoopm/basepm/pkg.py +++ b/gentoopm/basepm/pkg.py @@ -4,170 +4,12 @@ # Released under the terms of the 2-clause BSD license. =20 import os.path -from abc import abstractmethod, abstractproperty +from abc import abstractproperty =20 from gentoopm.basepm.atom import PMAtom from gentoopm.basepm.environ import PMPackageEnvironment -from gentoopm.exceptions import EmptyPackageSetError, AmbiguousPackageSe= tError from gentoopm.util import ABCObject =20 -class PMPackageSet(ABCObject): - """ A set of packages. """ - - @abstractmethod - def __iter__(self): - """ - Iterate over the packages (or sets) in a set. - - @return: packages in the set - @rtype: iter(L{PMPackage}) - """ - pass - - def filter(self, *args, **kwargs): - """ - Filter the packages based on arguments. Return a filtered package set. - - The positional arguments can provide a number of L{PMPackageMatcher}s - and/or a L{PMAtom} instance. The keyword arguments match metadata keys - using '=3D=3D' comparison with passed string (or L{PMKeywordMatcher}s)= . - - Multiple filters will be AND-ed together. Same applies for .filter() - called multiple times. You should, however, avoid passing multiple - atoms as it is not supported by all PMs. - - @param args: list of package matchers - @type args: list(L{PMPackageMatcher},L{PMAtom}) - @param kwargs: dict of keyword matchers - @type kwargs: dict(string -> L{PMKeywordMatcher}) - @return: filtered package set - @rtype: L{PMFilteredPackageSet} - @raise KeyError: when invalid metadata key is referenced in kwargs - """ - - return PMFilteredPackageSet(self, args, kwargs) - - @property - def best(self): - """ - Return the best-matching package in the set (the newest one). - - @type: L{PMPackage} - @raise EmptyPackageSetError: when no packages match the condition - @raise AmbiguousPackageSetError: when packages with different keys - match the condition - """ - - l =3D sorted(self, reverse =3D True) - try: - best =3D l[0] - except IndexError: - raise EmptyPackageSetError('.best called on an empty set') - - for p in l: - if p.key !=3D best.key: - raise AmbiguousPackageSetError('.best called on a set of differently= -named packages') - return best - - def select(self, *args, **kwargs): - """ - Select a single package matching keys in positional and keyword - arguments. This is a convenience wrapper for C{filter(*args, - **kwargs).best}. - - @param args: list of package matchers - @type args: list(L{PMPackageMatcher},L{PMAtom}) - @param kwargs: dict of keyword matchers - @type kwargs: dict(string -> L{PMKeywordMatcher}) - @return: filtered package set - @rtype: L{PMFilteredPackageSet} - @raise KeyError: when invalid metadata key is referenced in kwargs - @raise EmptyPackageSetError: when no packages match the condition - @raise AmbiguousPackageSetError: when packages with different keys - match the condition - """ - try: - return self.filter(*args, **kwargs).best - except EmptyPackageSetError: - raise EmptyPackageSetError('No packages match the filters.') - except AmbiguousPackageSetError: - raise AmbiguousPackageSetError('Ambiguous filter (matches more than a= single package name).') - - def __getitem__(self, filt): - """ - Select a single package matching an atom (or filter). Unlike L{select(= )}, - this one doesn't choose the best match but requires the filter to matc= h - exactly one package. - - @param filt: a package matcher or an atom - @type filt: L{PMPackageMatcher}/L{PMAtom} - @return: matching package - @rtype: L{PMPackage} - @raise EmptyPackageSetError: when no packages match the condition - @raise AmbiguousPackageSetError: when packages with different keys - match the condition - """ - - it =3D iter(self.filter(filt)) - - try: - ret =3D next(it) - except StopIteration: - raise EmptyPackageSetError('No packages match the filter.') - try: - next(it) - except StopIteration: - pass - else: - raise AmbiguousPackageSetError('Filter matches more than one package.= ') - - return ret - - def __contains__(self, arg): - """ - Check whether the package set contains at least a single package - matching the filter or package atom passed as an argument. - - @param arg: a package matcher or an atom - @type arg: L{PMPackageMatcher}/L{PMAtom} - @return: True if at least a single package matched - @rtype: bool - """ - - i =3D iter(self.filter(arg)) - try: - next(i) - except StopIteration: - return False - return True - - def __bool__(self): - """ - Check whether the package set is non-empty. - - @return: True if package set matches at least one package. - @rtype: bool - """ - try: - next(iter(self)) - except StopIteration: - return False - return True - - def __nonzero__(self): # py2 compat - return self.__bool__() - -class PMFilteredPackageSet(PMPackageSet): - def __init__(self, src, args, kwargs): - self._src =3D src - self._args =3D args - self._kwargs =3D kwargs - - def __iter__(self): - for el in self._src: - if el._matches(*self._args, **self._kwargs): - yield el - class PMPackage(ABCObject): """ An abstract class representing a single, uniquely-identified package diff --git a/gentoopm/basepm/pkgset.py b/gentoopm/basepm/pkgset.py new file mode 100644 index 0000000..4c7cb7c --- /dev/null +++ b/gentoopm/basepm/pkgset.py @@ -0,0 +1,168 @@ +#!/usr/bin/python +# vim:fileencoding=3Dutf-8 +# (c) 2011 Micha=C5=82 G=C3=B3rny +# Released under the terms of the 2-clause BSD license. + +from abc import abstractmethod + +from gentoopm.exceptions import EmptyPackageSetError, AmbiguousPackageSe= tError +from gentoopm.util import ABCObject + +class PMPackageSet(ABCObject): + """ A set of packages. """ + + @abstractmethod + def __iter__(self): + """ + Iterate over the packages (or sets) in a set. + + @return: packages in the set + @rtype: iter(L{PMPackage}) + """ + pass + + def filter(self, *args, **kwargs): + """ + Filter the packages based on arguments. Return a filtered package set. + + The positional arguments can provide a number of L{PMPackageMatcher}s + and/or a L{PMAtom} instance. The keyword arguments match metadata keys + using '=3D=3D' comparison with passed string (or L{PMKeywordMatcher}s)= . + + Multiple filters will be AND-ed together. Same applies for .filter() + called multiple times. You should, however, avoid passing multiple + atoms as it is not supported by all PMs. + + @param args: list of package matchers + @type args: list(L{PMPackageMatcher},L{PMAtom}) + @param kwargs: dict of keyword matchers + @type kwargs: dict(string -> L{PMKeywordMatcher}) + @return: filtered package set + @rtype: L{PMFilteredPackageSet} + @raise KeyError: when invalid metadata key is referenced in kwargs + """ + + return PMFilteredPackageSet(self, args, kwargs) + + @property + def best(self): + """ + Return the best-matching package in the set (the newest one). + + @type: L{PMPackage} + @raise EmptyPackageSetError: when no packages match the condition + @raise AmbiguousPackageSetError: when packages with different keys + match the condition + """ + + l =3D sorted(self, reverse =3D True) + try: + best =3D l[0] + except IndexError: + raise EmptyPackageSetError('.best called on an empty set') + + for p in l: + if p.key !=3D best.key: + raise AmbiguousPackageSetError('.best called on a set of differently= -named packages') + return best + + def select(self, *args, **kwargs): + """ + Select a single package matching keys in positional and keyword + arguments. This is a convenience wrapper for C{filter(*args, + **kwargs).best}. + + @param args: list of package matchers + @type args: list(L{PMPackageMatcher},L{PMAtom}) + @param kwargs: dict of keyword matchers + @type kwargs: dict(string -> L{PMKeywordMatcher}) + @return: filtered package set + @rtype: L{PMFilteredPackageSet} + @raise KeyError: when invalid metadata key is referenced in kwargs + @raise EmptyPackageSetError: when no packages match the condition + @raise AmbiguousPackageSetError: when packages with different keys + match the condition + """ + try: + return self.filter(*args, **kwargs).best + except EmptyPackageSetError: + raise EmptyPackageSetError('No packages match the filters.') + except AmbiguousPackageSetError: + raise AmbiguousPackageSetError('Ambiguous filter (matches more than a= single package name).') + + def __getitem__(self, filt): + """ + Select a single package matching an atom (or filter). Unlike L{select(= )}, + this one doesn't choose the best match but requires the filter to matc= h + exactly one package. + + @param filt: a package matcher or an atom + @type filt: L{PMPackageMatcher}/L{PMAtom} + @return: matching package + @rtype: L{PMPackage} + @raise EmptyPackageSetError: when no packages match the condition + @raise AmbiguousPackageSetError: when packages with different keys + match the condition + """ + + it =3D iter(self.filter(filt)) + + try: + ret =3D next(it) + except StopIteration: + raise EmptyPackageSetError('No packages match the filter.') + try: + next(it) + except StopIteration: + pass + else: + raise AmbiguousPackageSetError('Filter matches more than one package.= ') + + return ret + + def __contains__(self, arg): + """ + Check whether the package set contains at least a single package + matching the filter or package atom passed as an argument. + + @param arg: a package matcher or an atom + @type arg: L{PMPackageMatcher}/L{PMAtom} + @return: True if at least a single package matched + @rtype: bool + """ + + i =3D iter(self.filter(arg)) + try: + next(i) + except StopIteration: + return False + return True + + def __bool__(self): + """ + Check whether the package set is non-empty. + + @return: True if package set matches at least one package. + @rtype: bool + """ + try: + next(iter(self)) + except StopIteration: + return False + return True + + def __nonzero__(self): # py2 compat + return self.__bool__() + +class PMFilteredPackageSet(PMPackageSet): + def __init__(self, src, args, kwargs): + self._src =3D src + self._args =3D args + self._kwargs =3D kwargs + + def __iter__(self): + for el in self._src: + if el._matches(*self._args, **self._kwargs): + yield el + + diff --git a/gentoopm/basepm/repo.py b/gentoopm/basepm/repo.py index b4ce8ce..7f517ad 100644 --- a/gentoopm/basepm/repo.py +++ b/gentoopm/basepm/repo.py @@ -6,7 +6,7 @@ import os.path from abc import abstractmethod, abstractproperty =20 -from gentoopm.basepm.pkg import PMPackageSet +from gentoopm.basepm.pkgset import PMPackageSet from gentoopm.util import ABCObject =20 class PMRepositoryDict(ABCObject): diff --git a/gentoopm/basepm/stack.py b/gentoopm/basepm/stack.py index 2d6d453..85162ac 100644 --- a/gentoopm/basepm/stack.py +++ b/gentoopm/basepm/stack.py @@ -4,7 +4,7 @@ # Released under the terms of the 2-clause BSD license. =20 from gentoopm.basepm.repo import PMRepository -from gentoopm.basepm.pkg import PMPackageSet +from gentoopm.basepm.pkgset import PMPackageSet =20 class PMRepoStackWrapper(PMRepository): """ diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py index 42b6fc7..e1adbdb 100644 --- a/gentoopm/paludispm/pkg.py +++ b/gentoopm/paludispm/pkg.py @@ -6,42 +6,9 @@ import paludis =20 from gentoopm.basepm.metadata import PMPackageMetadata -from gentoopm.basepm.pkg import PMPackageSet, PMPackage, \ - PMFilteredPackageSet -from gentoopm.exceptions import EmptyPackageSetError, AmbiguousPackageSe= tError +from gentoopm.basepm.pkg import PMPackage from gentoopm.paludispm.atom import PaludisAtom =20 -class PaludisPackageSet(PMPackageSet): - _sorted =3D False - - def filter(self, *args, **kwargs): - return PaludisFilteredPackageSet(self, args, kwargs) - - @property - def best(self): - if self._sorted: - it =3D iter(self) - - try: - f =3D next(it) - except StopIteration: - raise EmptyPackageSetError('.best called on an empty set') - for p in it: - if p.key !=3D f.key: - raise AmbiguousPackageSetError('.best called on a set of differentl= y-named packages') - - try: - return p - except NameError: - return f - else: - return PMPackageSet.best.fget(self) - -class PaludisFilteredPackageSet(PMFilteredPackageSet, PaludisPackageSet)= : - def __init__(self, pset, args, kwargs): - self._sorted =3D pset._sorted - PMFilteredPackageSet.__init__(self, pset, args, kwargs) - class PaludisID(PMPackage): def __init__(self, pkg, num =3D 0, enum_id =3D None, env =3D None): self._pkg =3D pkg diff --git a/gentoopm/paludispm/pkgset.py b/gentoopm/paludispm/pkgset.py new file mode 100644 index 0000000..98cc4f5 --- /dev/null +++ b/gentoopm/paludispm/pkgset.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +# vim:fileencoding=3Dutf-8 +# (c) 2011 Micha=C5=82 G=C3=B3rny +# Released under the terms of the 2-clause BSD license. + +from gentoopm.basepm.pkgset import PMPackageSet, PMFilteredPackageSet +from gentoopm.exceptions import EmptyPackageSetError, AmbiguousPackageSe= tError + +class PaludisPackageSet(PMPackageSet): + _sorted =3D False + + def filter(self, *args, **kwargs): + return PaludisFilteredPackageSet(self, args, kwargs) + + @property + def best(self): + if self._sorted: + it =3D iter(self) + + try: + f =3D next(it) + except StopIteration: + raise EmptyPackageSetError('.best called on an empty set') + for p in it: + if p.key !=3D f.key: + raise AmbiguousPackageSetError('.best called on a set of differentl= y-named packages') + + try: + return p + except NameError: + return f + else: + return PMPackageSet.best.fget(self) + +class PaludisFilteredPackageSet(PMFilteredPackageSet, PaludisPackageSet)= : + def __init__(self, pset, args, kwargs): + self._sorted =3D pset._sorted + PMFilteredPackageSet.__init__(self, pset, args, kwargs) diff --git a/gentoopm/paludispm/repo.py b/gentoopm/paludispm/repo.py index 78214e5..c9817f8 100644 --- a/gentoopm/paludispm/repo.py +++ b/gentoopm/paludispm/repo.py @@ -8,7 +8,8 @@ import paludis from gentoopm.basepm.repo import PMRepository, PMRepositoryDict, \ PMEbuildRepository from gentoopm.paludispm.atom import PaludisAtom -from gentoopm.paludispm.pkg import PaludisID, PaludisPackageSet +from gentoopm.paludispm.pkg import PaludisID +from gentoopm.paludispm.pkgset import PaludisPackageSet =20 class PaludisRepoDict(PMRepositoryDict): def __iter__(self): diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py index cbd4bef..5355643 100644 --- a/gentoopm/pkgcorepm/pkg.py +++ b/gentoopm/pkgcorepm/pkg.py @@ -4,7 +4,8 @@ # Released under the terms of the 2-clause BSD license. =20 from gentoopm.basepm.metadata import PMPackageMetadata -from gentoopm.basepm.pkg import PMPackage, PMPackageSet, PMFilteredPacka= geSet +from gentoopm.basepm.pkg import PMPackage +from gentoopm.basepm.pkgset import PMPackageSet, PMFilteredPackageSet from gentoopm.pkgcorepm.atom import PkgCoreAtom =20 class PkgCorePackageSet(PMPackageSet): diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py index 90db650..f141df7 100644 --- a/gentoopm/portagepm/pkg.py +++ b/gentoopm/portagepm/pkg.py @@ -7,8 +7,8 @@ from portage.versions import cpv_getkey, cpv_getversion, = vercmp, \ catsplit =20 from gentoopm.basepm.metadata import PMPackageMetadata -from gentoopm.basepm.pkg import PMPackage, PMPackageSet, \ - PMFilteredPackageSet +from gentoopm.basepm.pkg import PMPackage +from gentoopm.basepm.pkgset import PMPackageSet, PMFilteredPackageSet from gentoopm.portagepm.atom import PortageAtom =20 class PortagePackageSet(PMPackageSet):