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 1QiozZ-0005jJ-KO for garchives@archives.gentoo.org; Mon, 18 Jul 2011 14:40:17 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 4E63A21C04D; Mon, 18 Jul 2011 14:40:09 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id D963521C04D for ; Mon, 18 Jul 2011 14:40:08 +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 3D16A2AC018 for ; Mon, 18 Jul 2011 14:40:08 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id 56BD18003D for ; Mon, 18 Jul 2011 14:40:07 +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/atom.py gentoopm/basepm/pkg.py gentoopm/paludispm/atom.py gentoopm/paludispm/pkg.py gentoopm/pkgcorepm/atom.py gentoopm/pkgcorepm/filter.py gentoopm/pkgcorepm/pkg.py gentoopm/portagepm/atom.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: f34d91de9079ee70851a0b1b2cf8787708b650c9 Date: Mon, 18 Jul 2011 14:40:07 +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: 54d4fd0a5dd3e3d9f86426a28e89902d commit: f34d91de9079ee70851a0b1b2cf8787708b650c9 Author: Micha=C5=82 G=C3=B3rny gentoo org> AuthorDate: Mon Jul 18 14:22:39 2011 +0000 Commit: Micha=C5=82 G=C3=B3rny gentoo org> CommitDate: Mon Jul 18 14:22:39 2011 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/gentoopm.git;= a=3Dcommit;h=3Df34d91de Make PMPackage a subclass of PMAtom. --- gentoopm/basepm/atom.py | 35 ++++------------------ gentoopm/basepm/pkg.py | 66 ++++++++++++++++++++++++++----------= ----- gentoopm/paludispm/atom.py | 19 +----------- gentoopm/paludispm/pkg.py | 40 ++++++++++++++++++++++--- gentoopm/pkgcorepm/atom.py | 18 +----------- gentoopm/pkgcorepm/filter.py | 3 ++ gentoopm/pkgcorepm/pkg.py | 21 +++++++++++-- gentoopm/portagepm/atom.py | 36 ++++++---------------- gentoopm/portagepm/pkg.py | 46 ++++++++++++++++++++++++---- 9 files changed, 155 insertions(+), 129 deletions(-) diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py index b12ac3e..953982e 100644 --- a/gentoopm/basepm/atom.py +++ b/gentoopm/basepm/atom.py @@ -176,7 +176,7 @@ class PMAtom(ABCObject): """ pass =20 - @abstractproperty + @property def associated(self): """ Whether the atom is associated with a package. @@ -184,8 +184,10 @@ class PMAtom(ABCObject): If an atom is unassociated, it is impossible to transform it. =20 @type: bool + @deprecated: now L{PMPackage} is a subclass of L{PMAtom}, + and that's the associated atom variant """ - pass + return False =20 def get_associated(self, repo): """ @@ -198,34 +200,9 @@ class PMAtom(ABCObject): @raise EmptyPackageSetError: when no packages match the atom @raise AmbiguousPackageSetError: when packages with different keys match the atom + @depracated: redundant and unclear, please use C{repo[atom]} instead """ - return repo.select(self).atom - - @abstractproperty - def slotted(self): - """ - Return an atom matching all packages in the same slot as the associate= d - package. - - This method should be used on associated atoms only. When called - on an unassociated atom, it should raise an exception. - - @type: L{PMAtom} - """ - pass - - @abstractproperty - def unversioned(self): - """ - Return an atom matching all packages with the same key as the - associated package. - - This method should be used on associated atoms only. When called - on an unassociated atom, it should raise an exception. - - @type: L{PMAtom} - """ - pass + return repo.select(self) =20 @abstractproperty def key(self): diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py index 23790ab..51944d9 100644 --- a/gentoopm/basepm/pkg.py +++ b/gentoopm/basepm/pkg.py @@ -10,7 +10,7 @@ from gentoopm.basepm.atom import PMAtom from gentoopm.basepm.environ import PMPackageEnvironment from gentoopm.util import ABCObject =20 -class PMPackage(ABCObject): +class PMPackage(PMAtom): """ An abstract class representing a single, uniquely-identified package in the package tree. @@ -53,32 +53,25 @@ class PMPackage(ABCObject): return True =20 @property - def key(self): - """ - The key identifying the package. This is used to group packages, e.g. - when choosing the best package in a set. - - @type: hashable - """ - return self.atom.key - - @property def id(self): """ An unique identifier for the package. =20 @type: hashable + @deprecated: use the package itself or its C{hash()} instead """ - return self.atom + return self =20 - @abstractproperty + @property def atom(self): """ Return an atom matching the package uniquely. =20 @type: L{PMAtom} + @deprecated: the package is now a subclass of L{PMAtom} + and can be used directly as an atom """ - pass + return self =20 @abstractproperty def path(self): @@ -132,16 +125,41 @@ class PMPackage(ABCObject): return None return PMPackageEnvironment(p) =20 - def __eq__(self, other): - if not isinstance(other, self.__class__): - return False - return self.id =3D=3D other.id + @abstractproperty + def slotted(self): + """ + Return an atom matching all packages in the same slot as the associate= d + package. =20 - def __ne__(self, other): - return not self.__eq__(other) + This method should be used on associated atoms only. When called + on an unassociated atom, it should raise an exception. =20 - def __hash__(self): - return hash(self.id) + @type: L{PMAtom} + """ + pass =20 - def __repr__(self): - return '%s(%s)' % (self.__class__.__name__, repr(self.id)) + @abstractproperty + def unversioned(self): + """ + Return an atom matching all packages with the same key as the + associated package. + + This method should be used on associated atoms only. When called + on an unassociated atom, it should raise an exception. + + @type: L{PMAtom} + """ + pass + + # atom API + + def __contains__(self, pkg): + return self =3D=3D pkg + + @property + def complete(self): + return True + + @property + def associated(self): + return True diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py index ccdd612..3b54de3 100644 --- a/gentoopm/paludispm/atom.py +++ b/gentoopm/paludispm/atom.py @@ -66,7 +66,7 @@ class PaludisAtom(PMAtom): paludis.RepositoryNameError): raise InvalidAtomStringError('Incorrect atom: %s' % s) =20 - def __init__(self, s, env, pkg =3D None): + def __init__(self, s, env): self._incomplete =3D False if isinstance(s, paludis.PackageDepSpec): self._atom =3D s @@ -77,7 +77,6 @@ class PaludisAtom(PMAtom): # try */ for the category self._init_atom(_category_wildcard_re.sub(r'*/\g<0>', s, 1), env, Tr= ue) self._incomplete =3D True - self._pkg =3D pkg self._env =3D env =20 def __contains__(self, pkg): @@ -119,22 +118,6 @@ class PaludisAtom(PMAtom): return not self._incomplete =20 @property - def associated(self): - return self._pkg is not None - - @property - def slotted(self): - assert(self.associated) - cp =3D str(self.key) - slot =3D self.slot or self._pkg.metadata['SLOT'] - return PaludisAtom('%s:%s' % (cp, slot), self._env) - - @property - def unversioned(self): - assert(self.associated) - return PaludisAtom(str(self.key), self._env) - - @property def key(self): if self.complete: return PaludisPackageKey(self._atom.package) diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py index 439e1fa..9f7405e 100644 --- a/gentoopm/paludispm/pkg.py +++ b/gentoopm/paludispm/pkg.py @@ -7,9 +7,10 @@ import paludis =20 from gentoopm.basepm.metadata import PMPackageMetadata from gentoopm.basepm.pkg import PMPackage -from gentoopm.paludispm.atom import PaludisAtom +from gentoopm.paludispm.atom import PaludisAtom, \ + PaludisPackageKey, PaludisPackageVersion =20 -class PaludisID(PMPackage): +class PaludisID(PMPackage, PaludisAtom): def __init__(self, pkg, num =3D 0, enum_id =3D None, env =3D None): self._pkg =3D pkg self._num =3D num @@ -25,9 +26,38 @@ class PaludisID(PMPackage): return self._pkg.fs_location_key().parse_value() =20 @property - def atom(self): - return PaludisAtom(self._pkg.uniquely_identifying_spec(), - self._env, self) + def slotted(self): + cp =3D str(self.key) + slot =3D self.slot + return PaludisAtom('%s:%s' % (cp, slot), self._env) + + @property + def unversioned(self): + return PaludisAtom(str(self.key), self._env) + + @property + def key(self): + return PaludisPackageKey(self._pkg.name) + + @property + def version(self): + return PaludisPackageVersion(self._pkg.version) + + @property + def slot(self): + k =3D self._pkg.slot_key() + return str(k.parse_value()) + + @property + def repository(self): + return str(self._pkg.repository_name) + + @property + def _atom(self): + return self._pkg.uniquely_identifying_spec() + + def __str__(self): + return str(self._atom) =20 def __lt__(self, other): if not isinstance(other, PaludisID): diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py index 7d000a9..c903131 100644 --- a/gentoopm/pkgcorepm/atom.py +++ b/gentoopm/pkgcorepm/atom.py @@ -86,7 +86,7 @@ class PkgCoreIncompletePackageVersion(PMPackageVersion)= : return str(self._r).split()[-1] =20 class PkgCoreAtom(PMAtom): - def __init__(self, s, pkg =3D None): + def __init__(self, s): if isinstance(s, atom): self._r =3D s else: @@ -95,8 +95,6 @@ class PkgCoreAtom(PMAtom): except ParseError: raise InvalidAtomStringError('Incorrect atom: %s' % s) =20 - self._pkg =3D pkg - def __contains__(self, pkg): return self._r.match(pkg._pkg) =20 @@ -111,20 +109,6 @@ class PkgCoreAtom(PMAtom): return isinstance(self._r, atom) =20 @property - def associated(self): - return self._pkg is not None - - @property - def slotted(self): - assert(self.associated) - return PkgCoreAtom(self._pkg._pkg.slotted_atom, self._pkg) - - @property - def unversioned(self): - assert(self.associated) - return PkgCoreAtom(self._pkg._pkg.unversioned_atom, self._pkg) - - @property def key(self): if self.complete: return PkgCorePackageKey(self._r) diff --git a/gentoopm/pkgcorepm/filter.py b/gentoopm/pkgcorepm/filter.py index 1f49144..9299cfc 100644 --- a/gentoopm/pkgcorepm/filter.py +++ b/gentoopm/pkgcorepm/filter.py @@ -6,6 +6,7 @@ import pkgcore.restrictions.boolean as br =20 from gentoopm.pkgcorepm.atom import PkgCoreAtom +from gentoopm.pkgcorepm.pkg import PkgCorePackage =20 def transform_filters(args, kwargs): """ @@ -21,6 +22,8 @@ def transform_filters(args, kwargs): f =3D [] =20 for a in args: + if isinstance(a, PkgCorePackage): + a =3D str(a) if isinstance(a, str): a =3D PkgCoreAtom(a) if isinstance(a, PkgCoreAtom): diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py index 7a0ebfd..4c33ddb 100644 --- a/gentoopm/pkgcorepm/pkg.py +++ b/gentoopm/pkgcorepm/pkg.py @@ -18,7 +18,7 @@ class PkgCorePackageSet(PMPackageSet): class PkgCoreFilteredPackageSet(PkgCorePackageSet, PMFilteredPackageSet)= : pass =20 -class PkgCorePackage(PMPackage): +class PkgCorePackage(PMPackage, PkgCoreAtom): def __init__(self, pkg, repo_index =3D 0): self._pkg =3D pkg self._repo_index =3D repo_index @@ -32,12 +32,27 @@ class PkgCorePackage(PMPackage): return self._pkg.path =20 @property - def atom(self): + def slotted(self): + return PkgCoreAtom(self._pkg.slotted_atom) + + @property + def unversioned(self): + return PkgCoreAtom(self._pkg.unversioned_atom) + + @property + def _r(self): + return self._pkg + + @property + def repository(self): + return self._pkg.repo.repo_id + + def __str__(self): if self._repo_index !=3D 0: s =3D '%s::%s' % (self._pkg.cpvstr, self._pkg.repo.repo_id) else: s =3D self._pkg.cpvstr - return PkgCoreAtom('=3D%s' % s, self) + return '=3D%s' % s =20 def __lt__(self, other): if not isinstance(other, PkgCorePackage): diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py index 0a77f76..e893033 100644 --- a/gentoopm/portagepm/atom.py +++ b/gentoopm/portagepm/atom.py @@ -57,23 +57,23 @@ class FakeSettings(object): def __getattr__(self, key): return lambda: collections.defaultdict(lambda: '') =20 -class PortageAtom(object): - def __new__(self, s, pkg =3D None): - try: - a =3D dep_expand(s, settings =3D FakeSettings()) - except pe.InvalidAtom: - raise InvalidAtomStringError('Incorrect atom: %s' % s) +def _get_atom(s): + try: + return dep_expand(s, settings =3D FakeSettings()) + except pe.InvalidAtom: + raise InvalidAtomStringError('Incorrect atom: %s' % s) =20 +class PortageAtom(object): + def __new__(self, s): + a =3D _get_atom(s) if catsplit(a.cp)[0] =3D=3D 'null': - assert(pkg is None) return UnexpandedPortageAtom(a) else: - return CompletePortageAtom(a, pkg) + return CompletePortageAtom(a) =20 class CompletePortageAtom(PMAtom): - def __init__(self, a, pkg =3D None): + def __init__(self, a): self._atom =3D a - self._pkg =3D pkg =20 def __contains__(self, pkg): # SLOT matching requires metadata so delay it. @@ -90,22 +90,6 @@ class CompletePortageAtom(PMAtom): return True =20 @property - def associated(self): - return self._pkg is not None - - @property - def slotted(self): - assert(self.associated) - cp =3D str(self.key) - slot =3D self._pkg.metadata['SLOT'] - return PortageAtom('%s:%s' % (cp, slot)) - - @property - def unversioned(self): - assert(self.associated) - return PortageAtom(str(self.key)) - - @property def key(self): return PortagePackageKey(self._atom.cp) =20 diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py index b084dbc..a999eec 100644 --- a/gentoopm/portagepm/pkg.py +++ b/gentoopm/portagepm/pkg.py @@ -8,7 +8,8 @@ from portage.versions import cpv_getkey, cpv_getversion, = vercmp from gentoopm.basepm.metadata import PMPackageMetadata from gentoopm.basepm.pkg import PMPackage from gentoopm.basepm.pkgset import PMPackageSet, PMFilteredPackageSet -from gentoopm.portagepm.atom import PortageAtom +from gentoopm.portagepm.atom import PortageAtom, CompletePortageAtom, \ + PortagePackageKey, PortagePackageVersion, _get_atom =20 class PortagePackageSet(PMPackageSet): def filter(self, *args, **kwargs): @@ -20,7 +21,7 @@ class PortagePackageSet(PMPackageSet): class PortageFilteredPackageSet(PortagePackageSet, PMFilteredPackageSet)= : pass =20 -class PortageDBCPV(PMPackage): +class PortageDBCPV(PMPackage, CompletePortageAtom): def __init__(self, cpv, dbapi): self._cpv =3D cpv self._dbapi =3D dbapi @@ -35,8 +36,37 @@ class PortageDBCPV(PMPackage): return self._dbapi.getpath(self._cpv) =20 @property - def atom(self): - return PortageAtom('=3D%s' % self._cpv, self) + def key(self): + return PortagePackageKey(cpv_getkey(self._cpv)) + + @property + def version(self): + return PortagePackageVersion(self._cpv) + + @property + def slot(self): + return self.metadata['SLOT'] # XXX + + @property + def repository(self): + raise NotImplementedError() # XXX + + @property + def slotted(self): + cp =3D str(self.key) + slot =3D self.slot + return PortageAtom('%s:%s' % (cp, slot)) + + @property + def unversioned(self): + return PortageAtom(str(self.key)) + + @property + def _atom(self): + return _get_atom(str(self)) + + def __str__(self): + return '=3D%s' % self._cpv =20 def __lt__(self, other): if not isinstance(other, PortageDBCPV): @@ -60,9 +90,11 @@ class PortageCPV(PortageDBCPV): return self._dbapi.findname(self._cpv, self._tree) =20 @property - def atom(self): - return PortageAtom('=3D%s::%s' % (self._cpv, - self._dbapi.getRepositoryName(self._tree)), self) + def repository(self): + return self._dbapi.getRepositoryName(self._tree) + + def __str__(self): + return '=3D%s::%s' % (self._cpv, self.repository) =20 def __lt__(self, other): if not isinstance(other, PortageCPV):