public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-21  8:47 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-21  8:47 UTC (permalink / raw
  To: gentoo-commits

commit:     72df8c45b927d6dee7cb30646c765d840140955b
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 21 08:34:15 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 21 08:34:15 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=72df8c45

Introduce PMInstallablePackage, to clearly distinguish.

This way, one kind of packages won't subclass another one, and we're
clear to use isinstance().

---
 gentoopm/basepm/pkg.py     |    6 ++++++
 gentoopm/paludispm/pkg.py  |    5 ++++-
 gentoopm/paludispm/repo.py |    6 +++---
 gentoopm/pkgcorepm/pkg.py  |   21 +++++++++++----------
 gentoopm/pkgcorepm/repo.py |    6 +++---
 gentoopm/portagepm/pkg.py  |    4 ++--
 6 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index b5ec780..d5da061 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -229,6 +229,12 @@ class PMPackage(PMAtom, FillMissingComparisons):
 	def associated(self):
 		return True
 
+class PMInstallablePackage(PMPackage):
+	"""
+	An abstract class for a package which can be installed.
+	"""
+	pass
+
 class PMInstalledPackage(PMPackage):
 	"""
 	An abstract class for a installed package.

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 437ddaf..74f2652 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -7,7 +7,7 @@ import paludis
 
 from gentoopm.basepm.metadata import PMPackageMetadata
 from gentoopm.basepm.pkg import PMPackage, PMPackageDescription, \
-		PMInstalledPackage
+		PMInstallablePackage, PMInstalledPackage
 from gentoopm.paludispm.atom import PaludisAtom, \
 		PaludisPackageKey, PaludisPackageVersion
 from gentoopm.util import SpaceSepTuple
@@ -98,6 +98,9 @@ class PaludisID(PMPackage, PaludisAtom):
 			raise TypeError('Unable to compare results of two enumerations')
 		return self._num < other._num
 
+class PaludisInstallableID(PaludisID, PMInstallablePackage):
+	pass
+
 class PaludisInstalledID(PaludisID, PMInstalledPackage):
 	pass
 

diff --git a/gentoopm/paludispm/repo.py b/gentoopm/paludispm/repo.py
index dc46ffe..27419a9 100644
--- a/gentoopm/paludispm/repo.py
+++ b/gentoopm/paludispm/repo.py
@@ -10,7 +10,7 @@ import paludis
 from gentoopm.basepm.repo import PMRepository, PMRepositoryDict, \
 		PMEbuildRepository
 from gentoopm.paludispm.atom import PaludisAtom
-from gentoopm.paludispm.pkg import PaludisID, PaludisInstalledID
+from gentoopm.paludispm.pkg import PaludisInstallableID, PaludisInstalledID
 from gentoopm.paludispm.pkgset import PaludisPackageSet
 
 class PaludisRepoDict(PMRepositoryDict):
@@ -87,14 +87,14 @@ class PaludisAtomFilteredRepo(PaludisBaseRepo):
 		self._mypkg_class = repo._pkg_class
 
 class PaludisStackRepo(PaludisBaseRepo):
-	_pkg_class = PaludisID
+	_pkg_class = PaludisInstallableID
 
 	@property
 	def _filt(self):
 		return paludis.Filter.SupportsInstallAction()
 
 class PaludisLivefsRepository(PaludisBaseRepo, PMEbuildRepository):
-	_pkg_class = PaludisID
+	_pkg_class = PaludisInstallableID
 
 	def __init__(self, repo_obj, env):
 		PaludisBaseRepo.__init__(self, env)

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index c255914..ec97c07 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -5,7 +5,7 @@
 
 from gentoopm.basepm.metadata import PMPackageMetadata
 from gentoopm.basepm.pkg import PMPackage, PMPackageDescription, \
-		PMInstalledPackage
+		PMInstalledPackage, PMInstallablePackage
 from gentoopm.basepm.pkgset import PMPackageSet, PMFilteredPackageSet
 from gentoopm.pkgcorepm.atom import PkgCoreAtom
 from gentoopm.util import SpaceSepTuple
@@ -53,15 +53,6 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 		return PkgCorePackageDescription(self._pkg)
 
 	@property
-	def inherits(self):
-		try:
-			l = self._pkg.data['_eclasses_']
-		except KeyError:
-			l = ()
-
-		return SpaceSepTuple(l)
-
-	@property
 	def homepages(self):
 		return SpaceSepTuple(self._pkg.homepage)
 
@@ -88,6 +79,16 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 			s = self._pkg.cpvstr
 		return '=%s' % s
 
+class PkgCoreInstallablePackage(PkgCorePackage, PMInstallablePackage):
+	@property
+	def inherits(self):
+		try:
+			l = self._pkg.data['_eclasses_']
+		except KeyError:
+			l = ()
+
+		return SpaceSepTuple(l)
+
 	def __lt__(self, other):
 		if not isinstance(other, PkgCorePackage):
 			raise TypeError('Unable to compare %s against %s' % \

diff --git a/gentoopm/pkgcorepm/repo.py b/gentoopm/pkgcorepm/repo.py
index 1fc2d35..095d89e 100644
--- a/gentoopm/pkgcorepm/repo.py
+++ b/gentoopm/pkgcorepm/repo.py
@@ -9,8 +9,8 @@ import pkgcore.restrictions.boolean as br
 
 from gentoopm.basepm.repo import PMRepository, PMRepositoryDict, \
 		PMEbuildRepository
-from gentoopm.pkgcorepm.pkg import PkgCorePackage, PkgCorePackageSet, \
-		PkgCoreFilteredPackageSet, PkgCoreInstalledPackage
+from gentoopm.pkgcorepm.pkg import PkgCorePackageSet, PkgCoreFilteredPackageSet, \
+		PkgCoreInstallablePackage, PkgCoreInstalledPackage
 from gentoopm.pkgcorepm.filter import transform_filters
 from gentoopm.util import FillMissingComparisons
 
@@ -77,7 +77,7 @@ class PkgCoreFilteredRepo(PkgCoreRepository):
 class PkgCoreEbuildRepo(PkgCoreRepository, PMEbuildRepository,
 		FillMissingComparisons):
 
-	_pkg_class = PkgCorePackage
+	_pkg_class = PkgCoreInstallablePackage
 
 	def __init__(self, repo_obj, index):
 		PkgCoreRepository.__init__(self, repo_obj)

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index e82b232..8c0cd53 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -7,7 +7,7 @@ from portage.versions import cpv_getkey, cpv_getversion, vercmp
 
 from gentoopm.basepm.metadata import PMPackageMetadata
 from gentoopm.basepm.pkg import PMPackage, PMPackageDescription, \
-		PMInstalledPackage
+		PMInstalledPackage, PMInstallablePackage
 from gentoopm.basepm.pkgset import PMPackageSet, PMFilteredPackageSet
 from gentoopm.portagepm.atom import PortageAtom, CompletePortageAtom, \
 		PortagePackageKey, PortagePackageVersion, _get_atom
@@ -115,7 +115,7 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 		return cpv_getkey(self._cpv) < cpv_getkey(other._cpv) \
 				or vercmp(cpv_getversion(self._cpv), cpv_getversion(other._cpv)) < 0
 
-class PortageCPV(PortageDBCPV):
+class PortageCPV(PortageDBCPV, PMInstallablePackage):
 	def __init__(self, cpv, dbapi, tree, repo_prio):
 		PortageDBCPV.__init__(self, cpv, dbapi)
 		self._tree = tree



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-09-16  7:39 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-09-16  7:39 UTC (permalink / raw
  To: gentoo-commits

commit:     139c4a6f8e00198c0c0765a50308803baf530669
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Fri Sep 16 07:41:27 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Fri Sep 16 07:41:27 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=139c4a6f

Move .maintainers to PMInstallablePackage.

---
 gentoopm/basepm/pkg.py    |   19 +++++++++----------
 gentoopm/paludispm/pkg.py |   10 ++++------
 gentoopm/pkgcorepm/pkg.py |    8 ++++----
 gentoopm/portagepm/pkg.py |    8 ++++----
 4 files changed, 21 insertions(+), 24 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 92069d1..d63d5fc 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -345,15 +345,6 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		pass
 
 	@abstractproperty
-	def maintainers(self):
-		"""
-		Get the package maintainer list (or C{None} if unavailable).
-
-		@type: tuple(L{PMPackageMaintainer})/C{None}
-		"""
-		pass
-
-	@abstractproperty
 	def slotted_atom(self):
 		"""
 		Return an atom matching all packages in the same slot as the package.
@@ -392,7 +383,15 @@ class PMInstallablePackage(PMPackage):
 	"""
 	An abstract class for a package which can be installed.
 	"""
-	pass
+
+	@abstractproperty
+	def maintainers(self):
+		"""
+		Get the package maintainer list (or C{None} if unavailable).
+
+		@type: tuple(L{PMPackageMaintainer})/C{None}
+		"""
+		pass
 
 class PMInstalledPackage(PMPackage):
 	"""

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index fd090c6..1470dbd 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -181,11 +181,6 @@ class PaludisID(PMPackage, PaludisAtom):
 				self._get_meta(self._pkg.choices_key()))
 
 	@property
-	def maintainers(self):
-		# XXX: find_metadata() + magic
-		return None
-
-	@property
 	def _atom(self):
 		return self._pkg.uniquely_identifying_spec()
 
@@ -202,7 +197,10 @@ class PaludisID(PMPackage, PaludisAtom):
 						other.repository, self.repository)
 
 class PaludisInstallableID(PaludisID, PMInstallablePackage):
-	pass
+	@property
+	def maintainers(self):
+		# XXX: find_metadata() + magic
+		return None
 
 class PaludisInstalledID(PaludisID, PMInstalledPackage):
 	@property

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 6ac88f9..e5c4761 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -134,10 +134,6 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 		return PkgCoreUseSet(self._pkg.iuse, self._pkg.use)
 
 	@property
-	def maintainers(self):
-		return PkgCoreMaintainerTuple(self._pkg.maintainers, self._pkg.herds)
-
-	@property
 	def slotted_atom(self):
 		return PkgCoreAtom(self._pkg.slotted_atom)
 
@@ -190,6 +186,10 @@ class PkgCoreInstallablePackage(PkgCorePackage, PMInstallablePackage):
 		return PkgCorePackageDepSet(self._pkg._raw_pkg.required_use,
 				self._pkg)
 
+	@property
+	def maintainers(self):
+		return PkgCoreMaintainerTuple(self._pkg.maintainers, self._pkg.herds)
+
 	def __lt__(self, other):
 		if not isinstance(other, PkgCorePackage):
 			raise TypeError('Unable to compare %s against %s' % \

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index b9df82d..8ab00b4 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -151,10 +151,6 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 				self._applied_use)
 
 	@property
-	def maintainers(self):
-		return None
-
-	@property
 	def slotted_atom(self):
 		cp = str(self.key)
 		slot = self.slot
@@ -237,6 +233,10 @@ class PortageCPV(PortageDBCPV, PMInstallablePackage):
 	def repository(self):
 		return self._dbapi.getRepositoryName(self._tree)
 
+	@property
+	def maintainers(self):
+		return None
+
 	def _aux_get(self, *keys):
 		val = map(str, self._dbapi.aux_get(self._cpv, keys,
 				mytree = self._tree))



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-08-15  9:01 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-08-15  9:01 UTC (permalink / raw
  To: gentoo-commits

commit:     25f69989d8f27d4e7557f94d684c83e216f8332b
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Mon Aug 15 09:02:19 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Aug 15 09:02:19 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=25f69989

Split __new__() into __new__()+__init__() in StringCompat subclasses.

---
 gentoopm/basepm/depend.py  |   10 ++++------
 gentoopm/paludispm/atom.py |   14 ++++++++------
 gentoopm/paludispm/pkg.py  |   14 ++++++++------
 gentoopm/pkgcorepm/atom.py |   14 ++++++++------
 gentoopm/pkgcorepm/pkg.py  |    7 ++++---
 gentoopm/portagepm/atom.py |    7 ++++---
 gentoopm/portagepm/pkg.py  |   14 ++++++++------
 7 files changed, 44 insertions(+), 36 deletions(-)

diff --git a/gentoopm/basepm/depend.py b/gentoopm/basepm/depend.py
index b765445..881c433 100644
--- a/gentoopm/basepm/depend.py
+++ b/gentoopm/basepm/depend.py
@@ -12,13 +12,11 @@ class PMRequiredUseAtom(StringCompat):
 	An atom for C{REQUIRED_USE} specification.
 	"""
 
-	def __new__(self, s):
-		rua = StringCompat.__new__(self, s)
-		rua._blocks = s.startswith('!')
-		if rua._blocks:
+	def __init__(self, s):
+		self._blocks = s.startswith('!')
+		if self._blocks:
 			s = s[1:]
-		rua._flag = s
-		return rua
+		self._flag = s
 
 	@property
 	def name(self):

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
index 71ed9db..d8ee5cf 100644
--- a/gentoopm/paludispm/atom.py
+++ b/gentoopm/paludispm/atom.py
@@ -13,9 +13,10 @@ _category_wildcard_re = re.compile(r'\w')
 
 class PaludisPackageKey(PMPackageKey):
 	def __new__(self, key):
-		k = PMPackageKey.__new__(self, str(key))
-		k._k = key
-		return k
+		return PMPackageKey.__new__(self, str(key))
+
+	def __init__(self, key):
+		self._k = key
 
 	@property
 	def category(self):
@@ -31,9 +32,10 @@ class PaludisIncompletePackageKey(PMIncompletePackageKey):
 
 class PaludisPackageVersion(PMPackageVersion):
 	def __new__(self, ver):
-		v = PMPackageVersion.__new__(self, str(ver))
-		v._v = ver
-		return v
+		return PMPackageVersion.__new__(self, str(ver))
+
+	def __init__(self, ver):
+		self._v = ver
 
 	@property
 	def without_revision(self):

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 9ccfed1..5b19b98 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -17,11 +17,12 @@ from .depend import PaludisPackageDepSet
 
 class PaludisBoundPackageKey(PaludisPackageKey, PMBoundPackageKey):
 	def __new__(self, key, pkg):
-		k = PaludisPackageKey.__new__(self, key)
-		k._state = PMPackageState(
+		return PaludisPackageKey.__new__(self, key)
+
+	def __init__(self, key, pkg):
+		self._state = PMPackageState(
 				installable = isinstance(pkg, PaludisInstallableID),
 				installed = isinstance(pkg, PaludisInstalledID))
-		return k
 
 	@property
 	def state(self):
@@ -42,9 +43,10 @@ class PaludisPackageDescription(PMPackageDescription):
 
 class PaludisChoice(PMUseFlag):
 	def __new__(self, choice):
-		uf = PMUseFlag.__new__(self, str(choice.name_with_prefix))
-		uf._c = choice
-		return uf
+		return PMUseFlag.__new__(self, str(choice.name_with_prefix))
+
+	def __init__(self, choice):
+		self._c = choice
 
 	@property
 	def enabled(self):

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
index 65892b3..a7e7720 100644
--- a/gentoopm/pkgcorepm/atom.py
+++ b/gentoopm/pkgcorepm/atom.py
@@ -27,9 +27,10 @@ def _find_res(res, cls):
 
 class PkgCorePackageKey(PMPackageKey):
 	def __new__(self, atom):
-		k = PMPackageKey.__new__(self, atom.key)
-		k._atom = atom
-		return k
+		return PMPackageKey.__new__(self, atom.key)
+
+	def __init__(self, atom):
+		self._atom = atom
 
 	@property
 	def category(self):
@@ -50,9 +51,10 @@ class PkgCorePackageVersion(PMPackageVersion):
 	def __new__(self, atom):
 		if atom.version is None:
 			raise AssertionError('Empty version in atom')
-		v = PMPackageVersion.__new__(self, atom.fullver)
-		v._atom = atom
-		return v
+		return PMPackageVersion.__new__(self, atom.fullver)
+
+	def __init__(self, atom):
+		self._atom = atom
 
 	@property
 	def without_revision(self):

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index d2ca767..8782433 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -47,9 +47,10 @@ class PkgCorePackageDescription(PMPackageDescription):
 
 class PkgCoreUseFlag(PMUseFlag):
 	def __new__(self, s, enabled_use):
-		uf = PMUseFlag.__new__(self, s)
-		uf._enabled = self.name in enabled_use
-		return uf
+		return PMUseFlag.__new__(self, s)
+
+	def __init__(self, s, enabled_use):
+		self._enabled = self.name in enabled_use
 
 	@property
 	def enabled(self):

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
index c4f76b7..c9c7874 100644
--- a/gentoopm/portagepm/atom.py
+++ b/gentoopm/portagepm/atom.py
@@ -29,9 +29,10 @@ class PortageIncompletePackageKey(PMIncompletePackageKey, PortagePackageKey):
 
 class PortagePackageVersion(PMPackageVersion):
 	def __new__(self, cpv):
-		v = PMPackageVersion.__new__(self, cpv_getversion(cpv))
-		v._cpv = cpv
-		return v
+		return PMPackageVersion.__new__(self, cpv_getversion(cpv))
+
+	def __init__(self, cpv):
+		self._cpv = cpv
 
 	@property
 	def without_revision(self):

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 5ad9cb3..1a7661f 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -29,11 +29,12 @@ class PortageFilteredPackageSet(PortagePackageSet, PMFilteredPackageSet):
 
 class PortageBoundPackageKey(PortagePackageKey, PMBoundPackageKey):
 	def __new__(self, cp, pkg):
-		k = PortagePackageKey.__new__(self, cp)
-		k._state = PMPackageState(
+		return PortagePackageKey.__new__(self, cp)
+
+	def __init__(self, cp, pkg):
+		self._state = PMPackageState(
 				installable = isinstance(pkg, PortageCPV),
 				installed = isinstance(pkg, PortageVDBCPV))
-		return k
 
 	@property
 	def state(self):
@@ -59,9 +60,10 @@ class PortagePackageDescription(PMPackageDescription):
 
 class PortageUseFlag(PMUseFlag):
 	def __new__(self, s, enabled_use):
-		uf = PMUseFlag.__new__(self, s)
-		uf._enabled = self.name in enabled_use
-		return uf
+		return PMUseFlag.__new__(self, s)
+
+	def __init__(self, s, enabled_use):
+		self._enabled = self.name in enabled_use
 
 	@property
 	def enabled(self):



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-08-15  8:48 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-08-15  8:48 UTC (permalink / raw
  To: gentoo-commits

commit:     b7bd88fc0a3fab28b28bea0cb30a030139d5538b
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Mon Aug 15 08:45:57 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Aug 15 08:45:57 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=b7bd88fc

Migrate PMUseFlag to new StringCompat.

---
 gentoopm/basepm/pkg.py    |   13 +++++--------
 gentoopm/paludispm/pkg.py |   10 ++++------
 gentoopm/pkgcorepm/pkg.py |    7 ++++---
 gentoopm/portagepm/pkg.py |    7 ++++---
 4 files changed, 17 insertions(+), 20 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index c379802..3ad2774 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -6,7 +6,7 @@
 import os.path
 from abc import abstractmethod, abstractproperty
 
-from ..util import ABCObject, FillMissingComparisons, StringCompat2, \
+from ..util import ABCObject, FillMissingComparisons, StringCompat, \
 		EnumTuple, FillMissingNotEqual
 
 from .atom import PMAtom, PMPackageKey
@@ -61,19 +61,19 @@ class PMPackageDescription(ABCObject):
 		"""
 		pass
 
-class PMUseFlag(ABCObject, StringCompat2):
+class PMUseFlag(ABCObject, StringCompat):
 	"""
 	A base class for a USE flag supported by a package.
 	"""
 
-	def __init__(self, usestr):
+	def __new__(self, usestr):
 		"""
 		Instantiate from an IUSE atom.
 
 		@param usestr: the IUSE atom (C{[+-]?flag})
 		@type usestr: string
 		"""
-		self._name = usestr.lstrip('+-')
+		return StringCompat.__new__(self, usestr.lstrip('+-'))
 
 	@property
 	def name(self):
@@ -82,7 +82,7 @@ class PMUseFlag(ABCObject, StringCompat2):
 
 		@type: string
 		"""
-		return self._name
+		return str(self)
 
 	@abstractproperty
 	def enabled(self):
@@ -93,9 +93,6 @@ class PMUseFlag(ABCObject, StringCompat2):
 		"""
 		pass
 
-	def __str__(self):
-		return self.name
-
 class PMPackage(PMAtom, FillMissingComparisons):
 	"""
 	An abstract class representing a single, uniquely-identified package

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 18b2d17..9ccfed1 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -41,12 +41,10 @@ class PaludisPackageDescription(PMPackageDescription):
 		return k.parse_value() if k is not None else None
 
 class PaludisChoice(PMUseFlag):
-	def __init__(self, choice):
-		self._c = choice
-
-	@property
-	def name(self):
-		return str(self._c.name_with_prefix)
+	def __new__(self, choice):
+		uf = PMUseFlag.__new__(self, str(choice.name_with_prefix))
+		uf._c = choice
+		return uf
 
 	@property
 	def enabled(self):

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 8a1fcbf..d2ca767 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -46,9 +46,10 @@ class PkgCorePackageDescription(PMPackageDescription):
 			return None
 
 class PkgCoreUseFlag(PMUseFlag):
-	def __init__(self, s, enabled_use):
-		PMUseFlag.__init__(self, s)
-		self._enabled = self.name in enabled_use
+	def __new__(self, s, enabled_use):
+		uf = PMUseFlag.__new__(self, s)
+		uf._enabled = self.name in enabled_use
+		return uf
 
 	@property
 	def enabled(self):

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 2a3d64e..5ad9cb3 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -58,9 +58,10 @@ class PortagePackageDescription(PMPackageDescription):
 		return None # XXX
 
 class PortageUseFlag(PMUseFlag):
-	def __init__(self, s, enabled_use):
-		PMUseFlag.__init__(self, s)
-		self._enabled = self.name in enabled_use
+	def __new__(self, s, enabled_use):
+		uf = PMUseFlag.__new__(self, s)
+		uf._enabled = self.name in enabled_use
+		return uf
 
 	@property
 	def enabled(self):



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-08-15  7:57 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-08-15  7:57 UTC (permalink / raw
  To: gentoo-commits

commit:     c49daeb0067272f2d845394014fc94be697cb3ac
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Mon Aug 15 07:59:12 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Aug 15 07:59:12 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=c49daeb0

Migrate package versions to new StringCompat.

---
 gentoopm/basepm/atom.py    |   23 +++++++++++------------
 gentoopm/paludispm/atom.py |    9 ++++-----
 gentoopm/pkgcorepm/atom.py |   22 ++++++++++------------
 gentoopm/portagepm/atom.py |    9 ++++-----
 4 files changed, 29 insertions(+), 34 deletions(-)

diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py
index 633eda3..675989a 100644
--- a/gentoopm/basepm/atom.py
+++ b/gentoopm/basepm/atom.py
@@ -6,7 +6,7 @@
 from abc import abstractmethod, abstractproperty
 
 from ..util import ABCObject, StringCompat, StringifiedComparisons, \
-		FillMissingComparisons, StringCompat2
+		FillMissingComparisons
 
 class PMPackageKey(ABCObject, StringCompat):
 	"""
@@ -57,11 +57,20 @@ class PMIncompletePackageKey(PMPackageKey):
 	def package(self):
 		return str(self)
 
-class PMPackageVersion(ABCObject, StringCompat2):
+class PMPackageVersion(ABCObject, FillMissingComparisons, StringCompat):
 	"""
 	A base class for a package version.
 	"""
 
+	def __new__(self, ver):
+		"""
+		Instantiate.
+
+		@param ver: complete package version
+		@type ver: string
+		"""
+		return StringCompat.__new__(self, ver)
+
 	@abstractproperty
 	def without_revision(self):
 		"""
@@ -81,16 +90,6 @@ class PMPackageVersion(ABCObject, StringCompat2):
 		pass
 
 	@abstractmethod
-	def __str__(self):
-		"""
-		Return the stringified package version.
-
-		@return: Stringified package version.
-		@rtype: string
-		"""
-		pass
-
-	@abstractmethod
 	def __lt__(self, other):
 		pass
 

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
index eeec57d..71ed9db 100644
--- a/gentoopm/paludispm/atom.py
+++ b/gentoopm/paludispm/atom.py
@@ -30,8 +30,10 @@ class PaludisIncompletePackageKey(PMIncompletePackageKey):
 		return PMIncompletePackageKey.__new__(self, str(key))
 
 class PaludisPackageVersion(PMPackageVersion):
-	def __init__(self, ver):
-		self._v = ver
+	def __new__(self, ver):
+		v = PMPackageVersion.__new__(self, str(ver))
+		v._v = ver
+		return v
 
 	@property
 	def without_revision(self):
@@ -43,9 +45,6 @@ class PaludisPackageVersion(PMPackageVersion):
 		assert(rs.startswith('r'))
 		return int(rs[1:])
 
-	def __str__(self):
-		return str(self._v)
-
 	def __lt__(self, other):
 		return self._v < other._v
 

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
index 8fa3fab..65892b3 100644
--- a/gentoopm/pkgcorepm/atom.py
+++ b/gentoopm/pkgcorepm/atom.py
@@ -47,10 +47,12 @@ class PkgCoreIncompletePackageKey(PMIncompletePackageKey):
 		return PMIncompletePackageKey.__new__(self, pd.restriction.exact)
 
 class PkgCorePackageVersion(PMPackageVersion):
-	def __init__(self, atom):
+	def __new__(self, atom):
 		if atom.version is None:
 			raise AssertionError('Empty version in atom')
-		self._atom = atom
+		v = PMPackageVersion.__new__(self, atom.fullver)
+		v._atom = atom
+		return v
 
 	@property
 	def without_revision(self):
@@ -60,19 +62,19 @@ class PkgCorePackageVersion(PMPackageVersion):
 	def revision(self):
 		return self._atom.revision or 0
 
-	def __str__(self):
-		return self._atom.fullver
-
 	def __lt__(self, other):
 		if self._atom.key != other._atom.key:
 			raise NotImplementedError('Unable to compare versions of distinct packages')
 		return self._atom < other._atom
 
 class PkgCoreIncompletePackageVersion(PMPackageVersion):
-	def __init__(self, r):
-		self._r = _find_res(r, VersionMatch)
-		if self._r is None:
+	def __new__(self, r):
+		vm = _find_res(r, VersionMatch)
+		if vm is None:
 			raise AssertionError('No VersionMatch in restrictions.')
+		v = PMPackageVersion.__new__(self, str(vm).split()[-1]) # XXX
+		v._r = vm
+		return v
 
 	@property
 	def without_revision(self):
@@ -85,10 +87,6 @@ class PkgCoreIncompletePackageVersion(PMPackageVersion):
 	def __lt__(self, other):
 		raise NotImplementedError('Unable to compare versions of incomplete atoms')
 
-	def __str__(self):
-		# XXX: ugly?
-		return str(self._r).split()[-1]
-
 class PkgCoreAtom(PMAtom):
 	def __init__(self, s):
 		if isinstance(s, atom):

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
index 0edb241..c4f76b7 100644
--- a/gentoopm/portagepm/atom.py
+++ b/gentoopm/portagepm/atom.py
@@ -28,8 +28,10 @@ class PortageIncompletePackageKey(PMIncompletePackageKey, PortagePackageKey):
 		return PMIncompletePackageKey.__new__(self, catsplit(key)[1])
 
 class PortagePackageVersion(PMPackageVersion):
-	def __init__(self, cpv):
-		self._cpv = cpv
+	def __new__(self, cpv):
+		v = PMPackageVersion.__new__(self, cpv_getversion(cpv))
+		v._cpv = cpv
+		return v
 
 	@property
 	def without_revision(self):
@@ -41,9 +43,6 @@ class PortagePackageVersion(PMPackageVersion):
 		assert(rs.startswith('r'))
 		return int(rs[1:])
 
-	def __str__(self):
-		return cpv_getversion(self._cpv)
-
 	def __lt__(self, other):
 		return vercmp(str(self), str(other)) < 0
 



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-08-14 14:22 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-08-14 14:22 UTC (permalink / raw
  To: gentoo-commits

commit:     1f20863378c79bba58662d73700ab60e99a7b657
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sun Aug 14 14:23:15 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sun Aug 14 14:23:15 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=1f208633

Introduce PackageManager.root attribute.

This attribute provides access to the install root path, as used by
current PM configuration (domain).

---
 gentoopm/basepm/__init__.py    |    9 +++++++++
 gentoopm/paludispm/__init__.py |    6 +++++-
 gentoopm/paludispm/repo.py     |    6 +++++-
 gentoopm/pkgcorepm/__init__.py |    4 ++++
 gentoopm/portagepm/__init__.py |    5 +++++
 5 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/gentoopm/basepm/__init__.py b/gentoopm/basepm/__init__.py
index 3f1c224..f7e09a9 100644
--- a/gentoopm/basepm/__init__.py
+++ b/gentoopm/basepm/__init__.py
@@ -56,6 +56,15 @@ class PackageManager(ABCObject):
 		pass
 
 	@abstractproperty
+	def root(self):
+		"""
+		The root path as specified by current PM configuration.
+
+		@type: str
+		"""
+		pass
+
+	@abstractproperty
 	def installed(self):
 		"""
 		Repository with installed packages (vardb).

diff --git a/gentoopm/paludispm/__init__.py b/gentoopm/paludispm/__init__.py
index bae6ffc..62c0cc5 100644
--- a/gentoopm/paludispm/__init__.py
+++ b/gentoopm/paludispm/__init__.py
@@ -31,8 +31,12 @@ class PaludisPM(PackageManager):
 		return PaludisRepoDict(self._env)
 
 	@property
+	def root(self):
+		return '/'
+
+	@property
 	def installed(self):
-		return PaludisInstalledRepo(self._env)
+		return PaludisInstalledRepo(self._env, self.root)
 
 	@property
 	def stack(self):

diff --git a/gentoopm/paludispm/repo.py b/gentoopm/paludispm/repo.py
index 8cb015a..bd98448 100644
--- a/gentoopm/paludispm/repo.py
+++ b/gentoopm/paludispm/repo.py
@@ -132,6 +132,10 @@ class PaludisLivefsRepository(PaludisBaseRepo, PMEbuildRepository):
 class PaludisInstalledRepo(PaludisBaseRepo):
 	_pkg_class = PaludisInstalledID
 
+	def __init__(self, env, root):
+		PaludisBaseRepo.__init__(self, env)
+		self._root = root
+
 	@property
 	def _filt(self):
-		return paludis.Filter.InstalledAtRoot('/')
+		return paludis.Filter.InstalledAtRoot(self._root)

diff --git a/gentoopm/pkgcorepm/__init__.py b/gentoopm/pkgcorepm/__init__.py
index 48c09b4..53afaaf 100644
--- a/gentoopm/pkgcorepm/__init__.py
+++ b/gentoopm/pkgcorepm/__init__.py
@@ -29,6 +29,10 @@ class PkgCorePM(PackageManager):
 				self._domain)
 
 	@property
+	def root(self):
+		return self._domain.root
+
+	@property
 	def installed(self):
 		return PkgCoreInstalledRepo(self._domain.named_repos['vdb'],
 				self._domain)

diff --git a/gentoopm/portagepm/__init__.py b/gentoopm/portagepm/__init__.py
index 28bcd66..b576a70 100644
--- a/gentoopm/portagepm/__init__.py
+++ b/gentoopm/portagepm/__init__.py
@@ -25,6 +25,7 @@ class PortagePM(PackageManager):
 				config_root = os.environ.get('PORTAGE_CONFIGROOT'),
 				target_root = os.environ.get('ROOT'))
 		tree = trees[max(trees)]
+		self._root = max(trees)
 		self._vardb = tree['vartree'].dbapi
 		self._portdb = tree['porttree'].dbapi
 
@@ -33,6 +34,10 @@ class PortagePM(PackageManager):
 		return PortageRepoDict(self._portdb)
 
 	@property
+	def root(self):
+		return self._root
+
+	@property
 	def installed(self):
 		return VDBRepository(self._vardb)
 



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-08-12  8:24 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-08-12  8:24 UTC (permalink / raw
  To: gentoo-commits

commit:     c487024326d099738f815f6168e3233d40070324
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Fri Aug 12 07:35:09 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Fri Aug 12 07:35:09 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=c4870243

Support getting PM version.

---
 gentoopm/basepm/__init__.py    |    9 +++++++++
 gentoopm/paludispm/__init__.py |    4 ++++
 gentoopm/pkgcorepm/__init__.py |    5 +++++
 gentoopm/portagepm/__init__.py |    6 +++++-
 4 files changed, 23 insertions(+), 1 deletions(-)

diff --git a/gentoopm/basepm/__init__.py b/gentoopm/basepm/__init__.py
index 2e61d2a..4a2e2ce 100644
--- a/gentoopm/basepm/__init__.py
+++ b/gentoopm/basepm/__init__.py
@@ -23,6 +23,15 @@ class PackageManager(ABCObject):
 		"""
 		pass
 
+	@abstractproperty
+	def version(self):
+		"""
+		Return the PM version as a simple string.
+
+		@type: string
+		"""
+		pass
+
 	@abstractmethod
 	def reload_config(self):
 		"""

diff --git a/gentoopm/paludispm/__init__.py b/gentoopm/paludispm/__init__.py
index 40ae49a..d060529 100644
--- a/gentoopm/paludispm/__init__.py
+++ b/gentoopm/paludispm/__init__.py
@@ -19,6 +19,10 @@ from gentoopm.paludispm.repo import PaludisRepoDict, PaludisInstalledRepo, \
 class PaludisPM(PackageManager):
 	name = 'paludis'
 
+	@property
+	def version(self):
+		return paludis.VERSION
+
 	def reload_config(self):
 		self._env = paludis.EnvironmentFactory.instance.create('')
 

diff --git a/gentoopm/pkgcorepm/__init__.py b/gentoopm/pkgcorepm/__init__.py
index b31e80f..7dafe6a 100644
--- a/gentoopm/pkgcorepm/__init__.py
+++ b/gentoopm/pkgcorepm/__init__.py
@@ -4,6 +4,7 @@
 # Released under the terms of the 2-clause BSD license.
 
 from pkgcore.config import load_config
+from pkgcore.const import VERSION
 
 from gentoopm.basepm import PackageManager
 from gentoopm.pkgcorepm.atom import PkgCoreAtom
@@ -14,6 +15,10 @@ from gentoopm.pkgcorepm.repo import PkgCoreRepoDict, \
 class PkgCorePM(PackageManager):
 	name = 'pkgcore'
 
+	@property
+	def version(self):
+		return VERSION
+
 	def reload_config(self):
 		c = load_config()
 		self._domain = c.get_default('domain')

diff --git a/gentoopm/portagepm/__init__.py b/gentoopm/portagepm/__init__.py
index bb8d72d..dcd7986 100644
--- a/gentoopm/portagepm/__init__.py
+++ b/gentoopm/portagepm/__init__.py
@@ -4,7 +4,7 @@
 # Released under the terms of the 2-clause BSD license.
 
 import os
-from portage import create_trees
+from portage import create_trees, VERSION
 
 from gentoopm.basepm import PackageManager
 from gentoopm.portagepm.atom import PortageAtom
@@ -14,6 +14,10 @@ from gentoopm.portagepm.repo import PortageRepoDict, VDBRepository
 class PortagePM(PackageManager):
 	name = 'portage'
 
+	@property
+	def version(self):
+		return VERSION
+
 	def reload_config(self):
 		# Similarly to emerge, care for PORTAGE_CONFIGROOT and ROOT.
 		trees = create_trees(



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-08-01 17:14 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-08-01 17:14 UTC (permalink / raw
  To: gentoo-commits

commit:     4cec22e068a1537dc18ba1324b0869f5e9afe3e0
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Mon Aug  1 17:15:13 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Aug  1 17:15:13 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=4cec22e0

Rename pkg.{slotted,unversioned} to *_atom.

---
 gentoopm/basepm/pkg.py    |   18 ++++++++++++++++--
 gentoopm/paludispm/pkg.py |    4 ++--
 gentoopm/pkgcorepm/pkg.py |    4 ++--
 gentoopm/portagepm/pkg.py |    4 ++--
 4 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 1442a5b..570c834 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -326,7 +326,7 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		pass
 
 	@abstractproperty
-	def slotted(self):
+	def slotted_atom(self):
 		"""
 		Return an atom matching all packages in the same slot as the associated
 		package.
@@ -338,8 +338,15 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		"""
 		pass
 
+	@property
+	def slotted(self):
+		"""
+		@deprecated: alias for L{PMPackage.slotted_atom}
+		"""
+		return self.slotted_atom
+
 	@abstractproperty
-	def unversioned(self):
+	def unversioned_atom(self):
 		"""
 		Return an atom matching all packages with the same key as the
 		associated package.
@@ -351,6 +358,13 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		"""
 		pass
 
+	@property
+	def unversioned(self):
+		"""
+		@deprecated: alias for L{PMPackage.unversioned_atom}
+		"""
+		return self.unversioned_atom
+
 	@abstractmethod
 	def __lt__(self, other):
 		pass

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 8e77b9d..47e2028 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -89,13 +89,13 @@ class PaludisID(PMPackage, PaludisAtom):
 		return self._pkg.fs_location_key().parse_value()
 
 	@property
-	def slotted(self):
+	def slotted_atom(self):
 		cp = str(self.key)
 		slot = self.slot
 		return PaludisAtom('%s:%s' % (cp, slot), self._env)
 
 	@property
-	def unversioned(self):
+	def unversioned_atom(self):
 		return PaludisAtom(str(self.key), self._env)
 
 	@property

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index f9281c2..5adfa17 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -112,11 +112,11 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 		return PkgCoreUseSet(self._pkg.iuse, self._pkg.use)
 
 	@property
-	def slotted(self):
+	def slotted_atom(self):
 		return PkgCoreAtom(self._pkg.slotted_atom)
 
 	@property
-	def unversioned(self):
+	def unversioned_atom(self):
 		return PkgCoreAtom(self._pkg.unversioned_atom)
 
 	@property

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 9ba5a35..25ffd26 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -152,13 +152,13 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 				self._applied_use)
 
 	@property
-	def slotted(self):
+	def slotted_atom(self):
 		cp = str(self.key)
 		slot = self.slot
 		return PortageAtom('%s:%s' % (cp, slot))
 
 	@property
-	def unversioned(self):
+	def unversioned_atom(self):
 		return PortageAtom(str(self.key))
 
 	@property



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-30 18:39 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-30 18:39 UTC (permalink / raw
  To: gentoo-commits

commit:     1e63873f70f222a087ebde05e9e75e35b2c5b59e
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat Jul 30 18:40:04 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sat Jul 30 18:40:04 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=1e63873f

Support getting hidden USEflags explicitly.

---
 gentoopm/basepm/pkg.py    |    5 ++++-
 gentoopm/paludispm/pkg.py |   28 ++++++++++++++++++++--------
 gentoopm/pkgcorepm/pkg.py |    7 +++++++
 gentoopm/portagepm/pkg.py |    7 +++++++
 4 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index b2e7581..1442a5b 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -307,7 +307,10 @@ class PMPackage(PMAtom, FillMissingComparisons):
 	@abstractproperty
 	def use(self):
 		"""
-		Get the list of USE flags applying to the ebuild.
+		Get the list of USE flags applying to the ebuild. Iterating over the
+		list should return only the explicitly listed flags (C{IUSE}), though
+		it is also possible to explicitly get other flags (using indexing)
+		applying to the ebuild.
 
 		@type: L{SpaceSepFrozenSet}(L{PMUseFlag})
 		"""

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 7a9b244..8e77b9d 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -54,14 +54,26 @@ class PaludisChoice(PMUseFlag):
 
 class PaludisChoiceSet(SpaceSepFrozenSet):
 	def __new__(self, choices):
-		l = []
-		for group in choices:
-			if group.raw_name == 'build_options': # paludis specific
-				continue
-			for c in group:
-				if c.explicitly_listed:
-					l.append(PaludisChoice(c))
-		return SpaceSepFrozenSet.__new__(self, l)
+		def _get_iuse():
+			for group in choices:
+				if group.raw_name == 'build_options': # paludis specific
+					continue
+				for c in group:
+					if c.explicitly_listed:
+						yield PaludisChoice(c)
+
+		self._choices = choices
+		return SpaceSepFrozenSet.__new__(self, _get_iuse())
+
+	def __getitem__(self, k):
+		try:
+			return SpaceSepFrozenSet.__getitem__(self, k)
+		except KeyError:
+			for group in self._choices:
+				for c in group:
+					if str(c.name_with_prefix) == k:
+						return PaludisChoice(c)
+			raise
 
 class PaludisID(PMPackage, PaludisAtom):
 	def __init__(self, pkg, env):

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 757bc90..f9281c2 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -63,6 +63,13 @@ class PkgCoreUseSet(SpaceSepFrozenSet):
 		self._use = use
 		return SpaceSepFrozenSet.__new__(self, _get_iuse())
 
+	def __getitem__(self, k):
+		try:
+			return SpaceSepFrozenSet.__getitem__(self, k)
+		except KeyError:
+			# XXX, incorrect flags?
+			return PkgCoreUseFlag(k, self._use)
+
 class PkgCorePackage(PMPackage, PkgCoreAtom):
 	def __init__(self, pkg, repo_index = 0):
 		self._pkg = pkg

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 9ced5ec..9ba5a35 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -74,6 +74,13 @@ class PortageUseSet(SpaceSepFrozenSet):
 		self._use = use
 		return SpaceSepFrozenSet.__new__(self, _get_iuse())
 
+	def __getitem__(self, k):
+		try:
+			return SpaceSepFrozenSet.__getitem__(self, k)
+		except KeyError:
+			# XXX, incorrect flags?
+			return PortageUseFlag(k, self._use)
+
 class PortageDBCPV(PMPackage, CompletePortageAtom):
 	def __init__(self, cpv, dbapi):
 		self._cpv = cpv



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-30  8:13 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-30  8:13 UTC (permalink / raw
  To: gentoo-commits

commit:     47fd2cbc28005be9fdf9707c2f64dd659a2b44a0
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat Jul 30 08:14:05 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sat Jul 30 08:14:05 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=47fd2cbc

Support checking whether a USEflag is enabled.

---
 gentoopm/basepm/pkg.py    |   11 ++++++++++-
 gentoopm/paludispm/pkg.py |    4 ++++
 gentoopm/pkgcorepm/pkg.py |   19 +++++++++++++++++--
 gentoopm/portagepm/pkg.py |   21 ++++++++++++++++++---
 4 files changed, 49 insertions(+), 6 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index efb80e7..b2e7581 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -93,6 +93,15 @@ class PMUseFlag(ABCObject, StringCompat):
 		"""
 		return self._name
 
+	@abstractproperty
+	def enabled(self):
+		"""
+		Whether the flag is enabled.
+
+		@type: bool
+		"""
+		pass
+
 	def __str__(self):
 		return self.name
 
@@ -298,7 +307,7 @@ class PMPackage(PMAtom, FillMissingComparisons):
 	@abstractproperty
 	def use(self):
 		"""
-		Get the list of USE flags declared in the ebuild (C{IUSE}).
+		Get the list of USE flags applying to the ebuild.
 
 		@type: L{SpaceSepFrozenSet}(L{PMUseFlag})
 		"""

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 0c5d567..7a9b244 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -48,6 +48,10 @@ class PaludisChoice(PMUseFlag):
 	def name(self):
 		return str(self._c.name_with_prefix)
 
+	@property
+	def enabled(self):
+		return self._c.enabled
+
 class PaludisChoiceSet(SpaceSepFrozenSet):
 	def __new__(self, choices):
 		l = []

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index da81888..757bc90 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -46,7 +46,22 @@ class PkgCorePackageDescription(PMPackageDescription):
 			return None
 
 class PkgCoreUseFlag(PMUseFlag):
-	pass
+	def __init__(self, s, enabled_use):
+		PMUseFlag.__init__(self, s)
+		self._enabled = self.name in enabled_use
+
+	@property
+	def enabled(self):
+		return self._enabled
+
+class PkgCoreUseSet(SpaceSepFrozenSet):
+	def __new__(self, iuse, use):
+		def _get_iuse():
+			for u in iuse:
+				yield PkgCoreUseFlag(u, use)
+
+		self._use = use
+		return SpaceSepFrozenSet.__new__(self, _get_iuse())
 
 class PkgCorePackage(PMPackage, PkgCoreAtom):
 	def __init__(self, pkg, repo_index = 0):
@@ -87,7 +102,7 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 
 	@property
 	def use(self):
-		return SpaceSepFrozenSet([PkgCoreUseFlag(x) for x in self._pkg.iuse])
+		return PkgCoreUseSet(self._pkg.iuse, self._pkg.use)
 
 	@property
 	def slotted(self):

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 9653262..9ced5ec 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -57,7 +57,22 @@ class PortagePackageDescription(PMPackageDescription):
 		return None # XXX
 
 class PortageUseFlag(PMUseFlag):
-	pass
+	def __init__(self, s, enabled_use):
+		PMUseFlag.__init__(self, s)
+		self._enabled = self.name in enabled_use
+
+	@property
+	def enabled(self):
+		return self._enabled
+
+class PortageUseSet(SpaceSepFrozenSet):
+	def __new__(self, iuse, use):
+		def _get_iuse():
+			for u in iuse:
+				yield PortageUseFlag(u, use)
+
+		self._use = use
+		return SpaceSepFrozenSet.__new__(self, _get_iuse())
 
 class PortageDBCPV(PMPackage, CompletePortageAtom):
 	def __init__(self, cpv, dbapi):
@@ -126,8 +141,8 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 
 	@property
 	def use(self):
-		return SpaceSepFrozenSet([PortageUseFlag(x) for x \
-				in self._aux_get('IUSE').split()])
+		return PortageUseSet(self._aux_get('IUSE').split(),
+				self._applied_use)
 
 	@property
 	def slotted(self):



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-28 19:54 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-28 19:54 UTC (permalink / raw
  To: gentoo-commits

commit:     448e5a4f8a9bd934048145b094c4faee3bb7769a
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 28 19:39:31 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 28 19:39:31 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=448e5a4f

Introduce PMRequiredUseAtom type.

---
 gentoopm/basepm/depend.py    |   44 +++++++++++++++++++++++++++++++++++++++++-
 gentoopm/basepm/pkg.py       |    9 ++++++++
 gentoopm/paludispm/depend.py |    6 +++-
 gentoopm/paludispm/pkg.py    |    4 ++-
 gentoopm/pkgcorepm/depend.py |    4 +-
 gentoopm/portagepm/pkg.py    |    3 +-
 6 files changed, 63 insertions(+), 7 deletions(-)

diff --git a/gentoopm/basepm/depend.py b/gentoopm/basepm/depend.py
index 923cdbf..307d32d 100644
--- a/gentoopm/basepm/depend.py
+++ b/gentoopm/basepm/depend.py
@@ -5,7 +5,49 @@
 
 from abc import abstractmethod, abstractproperty
 
-from gentoopm.util import ABCObject
+from gentoopm.util import ABCObject, StringCompat
+
+class PMRequiredUseAtom(StringCompat):
+	"""
+	An atom for C{REQUIRED_USE} specification.
+	"""
+
+	def __init__(self, s):
+		self._blocks = s.startswith('!')
+		if self._blocks:
+			s = s[1:]
+		self._flag = s
+
+	@property
+	def name(self):
+		"""
+		Relevant USE flag name.
+
+		@type: string
+		"""
+		return self._flag
+
+	@property
+	def blocking(self):
+		"""
+		Whether the atom blocks the USE flag (requires it not to be set).
+
+		@type: bool
+		"""
+		return self._blocks
+
+	@property
+	def requiring(self):
+		"""
+		Whether the atom requires the USE flag to be set.
+
+		@type: bool
+		"""
+		return not self._blocks
+
+	def __str__(self):
+		return '%s%s' % ('!' if self._blocks else '',
+				self.name)
 
 class PMBaseDep(ABCObject):
 	"""

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 33a4435..397ff7f 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -318,6 +318,15 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		pass
 
 	@abstractproperty
+	def required_use(self):
+		"""
+		Get the C{REQUIRED_USE} specification.
+
+		@type: L{PMPackageDepSet}
+		"""
+		pass
+
+	@abstractproperty
 	def slotted(self):
 		"""
 		Return an atom matching all packages in the same slot as the associated

diff --git a/gentoopm/paludispm/depend.py b/gentoopm/paludispm/depend.py
index 9084f3d..c16b3d0 100644
--- a/gentoopm/paludispm/depend.py
+++ b/gentoopm/paludispm/depend.py
@@ -20,8 +20,10 @@ class PaludisBaseDep(PMBaseDep):
 	def __iter__(self):
 		for d in self._deps:
 			if isinstance(d, paludis.PackageDepSpec):
+				assert(self._args.cls is None)
 				yield PaludisAtom(d, self._args.env)
 			elif isinstance(d, paludis.BlockDepSpec):
+				assert(self._args.cls is None)
 				yield PaludisAtom(d.blocking, self._args.env,
 						block = _block_re.match(d.text).group(0))
 			elif isinstance(d, paludis.AnyDepSpec):
@@ -33,8 +35,8 @@ class PaludisBaseDep(PMBaseDep):
 			elif isinstance(d, paludis.ConditionalDepSpec):
 				yield PaludisConditionalDep(d, self._args)
 			elif isinstance(d, paludis.PlainTextDepSpec):
-				# XXX: this is in REQUIRED_USE as well
-				yield str(d)
+				assert(self._args.cls is not None)
+				yield self._args.cls(str(d))
 			else:
 				raise NotImplementedError('Unable to parse %s' % repr(d))
 

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index c29c0d7..151cd92 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -5,6 +5,7 @@
 
 import paludis
 
+from gentoopm.basepm.depend import PMRequiredUseAtom
 from gentoopm.basepm.metadata import PMPackageMetadata
 from gentoopm.basepm.pkg import PMPackage, PMPackageDescription, \
 		PMInstallablePackage, PMInstalledPackage, PMBoundPackageKey, \
@@ -141,7 +142,8 @@ class PaludisID(PMPackage, PaludisAtom):
 		k = self._pkg.find_metadata('REQUIRED_USE')
 		if k is None:
 			return None
-		return PaludisPackageDepSet(k.parse_value(), self)
+		return PaludisPackageDepSet(k.parse_value(), self,
+				PMRequiredUseAtom)
 
 	@property
 	def use(self):

diff --git a/gentoopm/pkgcorepm/depend.py b/gentoopm/pkgcorepm/depend.py
index fd3dcce..3f25576 100644
--- a/gentoopm/pkgcorepm/depend.py
+++ b/gentoopm/pkgcorepm/depend.py
@@ -10,7 +10,7 @@ from pkgcore.restrictions.packages import Conditional
 from pkgcore.restrictions.values import ContainmentMatch
 
 from gentoopm.basepm.depend import PMPackageDepSet, PMConditionalDep, \
-	PMAnyOfDep, PMAllOfDep, PMExactlyOneOfDep, PMBaseDep
+	PMAnyOfDep, PMAllOfDep, PMExactlyOneOfDep, PMBaseDep, PMRequiredUseAtom
 from gentoopm.pkgcorepm.atom import PkgCoreAtom
 
 class PkgCoreBaseDep(PMBaseDep):
@@ -24,7 +24,7 @@ class PkgCoreBaseDep(PMBaseDep):
 				yield PkgCoreAtom(d)
 			elif isinstance(d, ContainmentMatch): # REQUIRED_USE
 				assert(len(d.vals) == 1)
-				yield next(iter(d.vals))
+				yield PMRequiredUseAtom(next(iter(d.vals)))
 			elif isinstance(d, OrRestriction):
 				yield PkgCoreAnyOfDep(d, self._pkg)
 			elif isinstance(d, AndRestriction):

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 5af125a..9653262 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -5,6 +5,7 @@
 
 from portage.versions import cpv_getkey, cpv_getversion, vercmp
 
+from gentoopm.basepm.depend import PMRequiredUseAtom
 from gentoopm.basepm.metadata import PMPackageMetadata
 from gentoopm.basepm.pkg import PMPackage, PMPackageDescription, \
 		PMInstalledPackage, PMInstallablePackage, PMBoundPackageKey, \
@@ -186,7 +187,7 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 	@property
 	def required_use(self):
 		return PortagePackageDepSet(self._aux_get('REQUIRED_USE'),
-				self._applied_use, str) # XXX
+				self._applied_use, PMRequiredUseAtom)
 
 	def __str__(self):
 		return '=%s' % self._cpv



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-28 16:24 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-28 16:24 UTC (permalink / raw
  To: gentoo-commits

commit:     8202118e14d08edd394656aa450d8e5343d13943
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 28 15:47:31 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 28 15:47:31 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=8202118e

Support PMAtom.blocking.

---
 gentoopm/basepm/atom.py    |   13 +++++++++++++
 gentoopm/basepm/pkg.py     |    4 ++++
 gentoopm/paludispm/atom.py |    4 ++++
 gentoopm/pkgcorepm/atom.py |    5 +++++
 gentoopm/portagepm/atom.py |    4 ++++
 5 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py
index 9fa2c39..e745a38 100644
--- a/gentoopm/basepm/atom.py
+++ b/gentoopm/basepm/atom.py
@@ -153,6 +153,19 @@ class PMAtom(ABCObject, StringifiedComparisons):
 		"""
 		pass
 
+	@abstractproperty
+	def blocking(self):
+		"""
+		Whether the atom represents a blocking atom.
+
+		Support for block atoms is limited. They may not be parseable from user
+		input (using L{PackageManager.Atom()}), and they should not be used as
+		arguments to matching functions.
+
+		@type: bool
+		"""
+		pass
+
 	@property
 	def associated(self):
 		"""

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 6b191fa..33a4435 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -357,6 +357,10 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		return True
 
 	@property
+	def blocking(self):
+		return False
+
+	@property
 	def associated(self):
 		return True
 

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
index ea1d233..ec5b830 100644
--- a/gentoopm/paludispm/atom.py
+++ b/gentoopm/paludispm/atom.py
@@ -122,6 +122,10 @@ class PaludisAtom(PMAtom):
 		return not self._incomplete
 
 	@property
+	def blocking(self):
+		return bool(self._blocking)
+
+	@property
 	def key(self):
 		if self.complete:
 			return PaludisPackageKey(self._atom.package)

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
index 698864e..ac0a350 100644
--- a/gentoopm/pkgcorepm/atom.py
+++ b/gentoopm/pkgcorepm/atom.py
@@ -117,6 +117,11 @@ class PkgCoreAtom(PMAtom):
 		return isinstance(self._r, atom)
 
 	@property
+	def blocking(self):
+		# incomplete atoms can't block
+		return self.complete and self._r.blocks
+
+	@property
 	def key(self):
 		if self.complete:
 			return PkgCorePackageKey(self._r)

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
index 28b273d..425fd1e 100644
--- a/gentoopm/portagepm/atom.py
+++ b/gentoopm/portagepm/atom.py
@@ -93,6 +93,10 @@ class CompletePortageAtom(PMAtom):
 		return True
 
 	@property
+	def blocking(self):
+		return self._atom.blocker
+
+	@property
 	def key(self):
 		return PortagePackageKey(self._atom.cp)
 



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-28 16:24 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-28 16:24 UTC (permalink / raw
  To: gentoo-commits

commit:     9d4789c7871d2c52b67fc304b5795d0ee60d985c
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 28 16:24:54 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 28 16:24:54 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=9d4789c7

Fix matching blockers.

---
 gentoopm/basepm/atom.py    |    7 +++++--
 gentoopm/paludispm/atom.py |    5 ++++-
 gentoopm/pkgcorepm/atom.py |    2 +-
 gentoopm/portagepm/atom.py |    9 ++++++---
 4 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py
index e745a38..368b72a 100644
--- a/gentoopm/basepm/atom.py
+++ b/gentoopm/basepm/atom.py
@@ -115,8 +115,11 @@ class PMAtom(ABCObject, StringifiedComparisons):
 	@abstractmethod
 	def __contains__(self, pkg):
 		"""
-		Check whether a package matches the atom (is contained in the set
-		of packages matched by atom).
+		Check whether a package is contained in the set of packages matched
+		by the atom.
+
+		Please note that with blockers, this function returns C{True} for all
+		atoms not blocked by the atom.
 
 		@param pkg: a package to match
 		@type pkg: L{PMPackage}

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
index ec5b830..60b4b05 100644
--- a/gentoopm/paludispm/atom.py
+++ b/gentoopm/paludispm/atom.py
@@ -83,7 +83,7 @@ class PaludisAtom(PMAtom):
 				self._incomplete = True
 		self._env = env
 
-	def __contains__(self, pkg):
+	def _match(self, pkg):
 		# we have to implementing matching by hand, boo
 		other = pkg.atom
 		# 1) category, our may be unset
@@ -112,6 +112,9 @@ class PaludisAtom(PMAtom):
 			return False
 		return True
 
+	def __contains__(self, pkg):
+		return self._match(pkg) != self.blocking
+
 	def __str__(self):
 		if self._incomplete:
 			raise ValueError('Unable to stringify incomplete atom')

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
index ac0a350..5eced44 100644
--- a/gentoopm/pkgcorepm/atom.py
+++ b/gentoopm/pkgcorepm/atom.py
@@ -104,7 +104,7 @@ class PkgCoreAtom(PMAtom):
 				raise InvalidAtomStringError('Incorrect atom: %s' % s)
 
 	def __contains__(self, pkg):
-		return self._r.match(pkg._pkg)
+		return self._r.match(pkg._pkg) != self.blocking
 
 	def __str__(self):
 		if self.complete:

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
index 425fd1e..9130d6a 100644
--- a/gentoopm/portagepm/atom.py
+++ b/gentoopm/portagepm/atom.py
@@ -78,13 +78,16 @@ class CompletePortageAtom(PMAtom):
 	def __init__(self, a):
 		self._atom = a
 
-	def __contains__(self, pkg):
+	def _match(self, pkg):
 		# SLOT matching requires metadata so delay it.
-		if not match_from_list(self._atom, [pkg.id]):
+		if not match_from_list(self._atom, [pkg._cpv]):
 			return False
 		return not self._atom.slot \
 				or self._atom.slot == pkg.metadata.SLOT
 
+	def __contains__(self, pkg):
+		return self._match(pkg) != self.blocking
+
 	def __str__(self):
 		return str(self._atom)
 
@@ -94,7 +97,7 @@ class CompletePortageAtom(PMAtom):
 
 	@property
 	def blocking(self):
-		return self._atom.blocker
+		return bool(self._atom.blocker)
 
 	@property
 	def key(self):



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-28 16:24 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-28 16:24 UTC (permalink / raw
  To: gentoo-commits

commit:     3d286b63c8287bcfff56b58efe097e521d8a5382
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 28 14:09:13 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 28 14:09:13 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=3d286b63

Make PackageDepSet a subclass of AllOfDep.

---
 gentoopm/basepm/depend.py    |    5 +++--
 gentoopm/paludispm/depend.py |    2 +-
 gentoopm/pkgcorepm/depend.py |    7 ++-----
 gentoopm/portagepm/depend.py |    5 +----
 4 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/gentoopm/basepm/depend.py b/gentoopm/basepm/depend.py
index 262a010..72ebb49 100644
--- a/gentoopm/basepm/depend.py
+++ b/gentoopm/basepm/depend.py
@@ -100,9 +100,10 @@ class PMOneOfDep(PMBaseDep):
 class PMUncondOneOfDep(PMOneOfDep, PMUncondBaseDep):
 	pass
 
-class PMPackageDepSet(PMBaseDep):
+class PMPackageDepSet(PMAllOfDep):
 	"""
-	A base class representing a depset of a single package.
+	A base class representing a depset (or depset-like variable) of a single
+	package.
 	"""
 
 	@property

diff --git a/gentoopm/paludispm/depend.py b/gentoopm/paludispm/depend.py
index ab23d27..d5e0069 100644
--- a/gentoopm/paludispm/depend.py
+++ b/gentoopm/paludispm/depend.py
@@ -38,5 +38,5 @@ class PaludisConditionalDep(PMConditionalDep, PaludisBaseDep):
 	def enabled(self):
 		return self._deps.condition_met(self._pkg._env, self._pkg._pkg)
 
-class PaludisPackageDepSet(PMPackageDepSet, PaludisBaseDep):
+class PaludisPackageDepSet(PMPackageDepSet, PaludisAllOfDep):
 	pass

diff --git a/gentoopm/pkgcorepm/depend.py b/gentoopm/pkgcorepm/depend.py
index 78689b3..ed69f64 100644
--- a/gentoopm/pkgcorepm/depend.py
+++ b/gentoopm/pkgcorepm/depend.py
@@ -41,10 +41,10 @@ class PkgCoreConditionalUseDep(PMConditionalDep, PkgCoreBaseDep):
 	def enabled(self):
 		return self._deps.restriction.match(self._pkg.use)
 
-class PkgCorePackageDepSet(PMPackageDepSet, PkgCoreBaseDep):
+class PkgCorePackageDepSet(PMPackageDepSet, PkgCoreAllOfDep):
 	@property
 	def without_conditionals(self):
-		return PkgCoreUncondPackageDepSet(
+		return PkgCoreUncondAllOfDep(
 				self._deps.evaluate_depset(self._pkg.use))
 
 class PkgCoreUncondDep(PkgCoreBaseDep):
@@ -72,6 +72,3 @@ class PkgCoreUncondOneOfDep(PMOneOfDep, PkgCoreUncondDep):
 
 class PkgCoreUncondAllOfDep(PMAllOfDep, PkgCoreUncondDep):
 	pass
-
-class PkgCoreUncondPackageDepSet(PkgCoreUncondDep):
-	pass

diff --git a/gentoopm/portagepm/depend.py b/gentoopm/portagepm/depend.py
index dd96664..15b7dcc 100644
--- a/gentoopm/portagepm/depend.py
+++ b/gentoopm/portagepm/depend.py
@@ -54,7 +54,7 @@ class PortagePackageDepSet(PMPackageDepSet, PortageBaseDep):
 
 	@property
 	def without_conditionals(self):
-		return PortageUncondPackageDepSet(
+		return PortageUncondAllOfDep(
 				use_reduce(self._depstr, self._puse))
 
 class PortageUncondDep(PortageBaseDep):
@@ -80,6 +80,3 @@ class PortageUncondOneOfDep(PMOneOfDep, PortageUncondDep):
 
 class PortageUncondAllOfDep(PMAllOfDep, PortageUncondDep):
 	pass
-
-class PortageUncondPackageDepSet(PortageUncondDep):
-	pass



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-28 16:24 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-28 16:24 UTC (permalink / raw
  To: gentoo-commits

commit:     4c3fe4e1e04edfeea5c5151c5dc5b083546dbf86
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 28 14:10:10 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 28 14:10:10 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=4c3fe4e1

OneOf -> AnyOf, to match PMS naming.

---
 gentoopm/basepm/depend.py    |   10 +++++-----
 gentoopm/paludispm/depend.py |    6 +++---
 gentoopm/pkgcorepm/depend.py |   10 +++++-----
 gentoopm/portagepm/depend.py |   10 +++++-----
 4 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/gentoopm/basepm/depend.py b/gentoopm/basepm/depend.py
index 72ebb49..ca6d2c5 100644
--- a/gentoopm/basepm/depend.py
+++ b/gentoopm/basepm/depend.py
@@ -50,8 +50,8 @@ class PMUncondBaseDep(PMBaseDep):
 				if d.enabled:
 					for d in self._iter_deps(d):
 						yield d
-			elif isinstance(d, PMOneOfDep):
-				yield PMUncondOneOfDep(d)
+			elif isinstance(d, PMAnyOfDep):
+				yield PMUncondAnyOfDep(d)
 			else:
 				yield d
 
@@ -88,16 +88,16 @@ class PMAllOfDep(PMBaseDep):
 class PMUncondAllOfDep(PMAllOfDep, PMUncondBaseDep):
 	pass
 
-class PMOneOfDep(PMBaseDep):
+class PMAnyOfDep(PMBaseDep):
 	"""
 	A one-of dependency set (C{|| ( ... )}).
 	"""
 
 	@property
 	def without_conditionals(self):
-		return PMUncondOneOfDep(self)
+		return PMUncondAnyOfDep(self)
 
-class PMUncondOneOfDep(PMOneOfDep, PMUncondBaseDep):
+class PMUncondAnyOfDep(PMAnyOfDep, PMUncondBaseDep):
 	pass
 
 class PMPackageDepSet(PMAllOfDep):

diff --git a/gentoopm/paludispm/depend.py b/gentoopm/paludispm/depend.py
index d5e0069..976fa55 100644
--- a/gentoopm/paludispm/depend.py
+++ b/gentoopm/paludispm/depend.py
@@ -6,7 +6,7 @@
 import paludis
 
 from gentoopm.basepm.depend import PMPackageDepSet, PMConditionalDep, \
-	PMOneOfDep, PMAllOfDep, PMBaseDep
+	PMAnyOfDep, PMAllOfDep, PMBaseDep
 from gentoopm.paludispm.atom import PaludisAtom
 
 class PaludisBaseDep(PMBaseDep):
@@ -19,7 +19,7 @@ class PaludisBaseDep(PMBaseDep):
 			if isinstance(d, paludis.PackageDepSpec):
 				yield PaludisAtom(d, self._pkg._env)
 			elif isinstance(d, paludis.AnyDepSpec):
-				yield PaludisOneOfDep(d, self._pkg)
+				yield PaludisAnyOfDep(d, self._pkg)
 			elif isinstance(d, paludis.AllDepSpec):
 				yield PaludisAllOfDep(d, self._pkg)
 			elif isinstance(d, paludis.ConditionalDepSpec):
@@ -27,7 +27,7 @@ class PaludisBaseDep(PMBaseDep):
 			else:
 				raise NotImplementedError('Unable to parse %s' % repr(d))
 
-class PaludisOneOfDep(PMOneOfDep, PaludisBaseDep):
+class PaludisAnyOfDep(PMAnyOfDep, PaludisBaseDep):
 	pass
 
 class PaludisAllOfDep(PMAllOfDep, PaludisBaseDep):

diff --git a/gentoopm/pkgcorepm/depend.py b/gentoopm/pkgcorepm/depend.py
index ed69f64..8ebe6cf 100644
--- a/gentoopm/pkgcorepm/depend.py
+++ b/gentoopm/pkgcorepm/depend.py
@@ -8,7 +8,7 @@ from pkgcore.restrictions.boolean import OrRestriction, AndRestriction
 from pkgcore.restrictions.packages import Conditional
 
 from gentoopm.basepm.depend import PMPackageDepSet, PMConditionalDep, \
-	PMOneOfDep, PMAllOfDep, PMBaseDep
+	PMAnyOfDep, PMAllOfDep, PMBaseDep
 from gentoopm.pkgcorepm.atom import PkgCoreAtom
 
 class PkgCoreBaseDep(PMBaseDep):
@@ -21,7 +21,7 @@ class PkgCoreBaseDep(PMBaseDep):
 			if isinstance(d, atom):
 				yield PkgCoreAtom(d)
 			elif isinstance(d, OrRestriction):
-				yield PkgCoreOneOfDep(d, self._pkg)
+				yield PkgCoreAnyOfDep(d, self._pkg)
 			elif isinstance(d, AndRestriction):
 				yield PkgCoreAllOfDep(d, self._pkg)
 			elif isinstance(d, Conditional) and d.attr == 'use':
@@ -30,7 +30,7 @@ class PkgCoreBaseDep(PMBaseDep):
 				raise NotImplementedError('Parsing %s not implemented' \
 						% repr(d))
 
-class PkgCoreOneOfDep(PMOneOfDep, PkgCoreBaseDep):
+class PkgCoreAnyOfDep(PMAnyOfDep, PkgCoreBaseDep):
 	pass
 
 class PkgCoreAllOfDep(PMAllOfDep, PkgCoreBaseDep):
@@ -60,14 +60,14 @@ class PkgCoreUncondDep(PkgCoreBaseDep):
 			if isinstance(d, atom):
 				yield PkgCoreAtom(d)
 			elif isinstance(d, OrRestriction):
-				yield PkgCoreUncondOneOfDep(d)
+				yield PkgCoreUncondAnyOfDep(d)
 			elif isinstance(d, AndRestriction):
 				yield PkgCoreUncondAllOfDep(d, self._pkg)
 			else:
 				raise NotImplementedError('Parsing %s not implemented' \
 						% repr(d))
 
-class PkgCoreUncondOneOfDep(PMOneOfDep, PkgCoreUncondDep):
+class PkgCoreUncondAnyOfDep(PMAnyOfDep, PkgCoreUncondDep):
 	pass
 
 class PkgCoreUncondAllOfDep(PMAllOfDep, PkgCoreUncondDep):

diff --git a/gentoopm/portagepm/depend.py b/gentoopm/portagepm/depend.py
index 15b7dcc..d4f3c33 100644
--- a/gentoopm/portagepm/depend.py
+++ b/gentoopm/portagepm/depend.py
@@ -6,7 +6,7 @@
 from portage.dep import paren_reduce, use_reduce
 
 from gentoopm.basepm.depend import PMPackageDepSet, PMConditionalDep, \
-	PMOneOfDep, PMAllOfDep, PMBaseDep
+	PMAnyOfDep, PMAllOfDep, PMBaseDep
 from gentoopm.portagepm.atom import PortageAtom
 
 class PortageBaseDep(PMBaseDep):
@@ -18,7 +18,7 @@ class PortageBaseDep(PMBaseDep):
 		it = iter(self._deps)
 		for d in it:
 			if d == '||':
-				yield PortageOneOfDep(next(it), self._puse)
+				yield PortageAnyOfDep(next(it), self._puse)
 			elif d == '&&':
 				yield PortageAllOfDep(next(it), self._puse)
 			elif d.endswith('?'):
@@ -27,7 +27,7 @@ class PortageBaseDep(PMBaseDep):
 			else:
 				yield PortageAtom(d)
 
-class PortageOneOfDep(PMOneOfDep, PortageBaseDep):
+class PortageAnyOfDep(PMAnyOfDep, PortageBaseDep):
 	pass
 
 class PortageAllOfDep(PMAllOfDep, PortageBaseDep):
@@ -69,13 +69,13 @@ class PortageUncondDep(PortageBaseDep):
 		it = iter(self._deps)
 		for d in it:
 			if d == '||':
-				yield PortageUncondOneOfDep(next(it))
+				yield PortageUncondAnyOfDep(next(it))
 			elif d == '&&':
 				yield PortageUncondAllOfDep(next(it))
 			else:
 				yield PortageAtom(d)
 
-class PortageUncondOneOfDep(PMOneOfDep, PortageUncondDep):
+class PortageUncondAnyOfDep(PMAnyOfDep, PortageUncondDep):
 	pass
 
 class PortageUncondAllOfDep(PMAllOfDep, PortageUncondDep):



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-27 21:32 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-27 21:32 UTC (permalink / raw
  To: gentoo-commits

commit:     2e8a33214b5b2febebc95eddcb56a7412a6be5fa
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 27 21:29:22 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jul 27 21:29:22 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=2e8a3321

Support getting keywords off packages.

---
 gentoopm/basepm/pkg.py    |    9 +++++++++
 gentoopm/paludispm/pkg.py |    5 +++++
 gentoopm/pkgcorepm/pkg.py |    4 ++++
 gentoopm/portagepm/pkg.py |    4 ++++
 4 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 9984df4..184533a 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -241,6 +241,15 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		"""
 		pass
 
+	@abstractproperty
+	def keywords(self):
+		"""
+		Package keywords.
+
+		@type: L{SpaceSepTuple}
+		"""
+		pass
+
 	@property
 	def environ(self):
 		"""

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 9d2a8e0..e9fadf2 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -105,6 +105,11 @@ class PaludisID(PMPackage, PaludisAtom):
 		return SpaceSepTuple([str(x) for x in spec])
 
 	@property
+	def keywords(self):
+		kws = self._pkg.keywords_key().parse_value()
+		return SpaceSepTuple([str(x) for x in kws])
+
+	@property
 	def slot(self):
 		k = self._pkg.slot_key()
 		return str(k.parse_value())

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 3f5af2d..3bab71c 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -78,6 +78,10 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 		return SpaceSepTuple(self._pkg.homepage)
 
 	@property
+	def keywords(self):
+		return SpaceSepTuple(self._pkg.keywords)
+
+	@property
 	def defined_phases(self):
 		return SpaceSepTuple(self._pkg.defined_phases)
 

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 7540756..c8eb91d 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -112,6 +112,10 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 		return SpaceSepTuple(self._aux_get('HOMEPAGE'))
 
 	@property
+	def keywords(self):
+		return SpaceSepTuple(self._aux_get('KEYWORDS'))
+
+	@property
 	def slot(self):
 		return self._aux_get('SLOT')
 



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-27 16:24 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-27 16:24 UTC (permalink / raw
  To: gentoo-commits

commit:     d8f9574ac882e5ec46420a6260e4a0dac41de7ec
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 27 16:25:32 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jul 27 16:25:32 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=d8f9574a

Support defined_phases.

---
 gentoopm/basepm/pkg.py    |   11 +++++++++++
 gentoopm/paludispm/pkg.py |   10 ++++++++++
 gentoopm/pkgcorepm/pkg.py |    4 ++++
 gentoopm/portagepm/pkg.py |    7 +++++++
 4 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 27cf769..9984df4 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -222,6 +222,17 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		pass
 
 	@abstractproperty
+	def defined_phases(self):
+		"""
+		List of phase functions declared by a package, if available.
+		C{None} otherwise. Empty L{SpaceSepTuple} means no phase function
+		is declared.
+
+		@type: L{SpaceSepTuple}/C{None}
+		"""
+		pass
+
+	@abstractproperty
 	def homepages(self):
 		"""
 		Homepages of a package.

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 9f8990a..9d2a8e0 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -90,6 +90,16 @@ class PaludisID(PMPackage, PaludisAtom):
 		return SpaceSepTuple(k.parse_value())
 
 	@property
+	def defined_phases(self):
+		k = self._pkg.find_metadata('DEFINED_PHASES')
+		if k is None:
+			return None
+		ret = SpaceSepTuple(k.parse_value())
+		if ret == ('-',):
+			return SpaceSepTuple(())
+		return ret
+
+	@property
 	def homepages(self):
 		spec = self._pkg.homepage_key().parse_value()
 		return SpaceSepTuple([str(x) for x in spec])

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 3e81192..d64d873 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -78,6 +78,10 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 		return SpaceSepTuple(self._pkg.homepage)
 
 	@property
+	def defined_phases(self):
+		return SpaceSepTuple(self._pkg.defined_phases)
+
+	@property
 	def use(self):
 		return SpaceSepTuple([PkgCoreUseFlag(x) for x in self._pkg.iuse])
 

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 60e0102..7540756 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -101,6 +101,13 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 		return SpaceSepTuple(self._aux_get('INHERITED'))
 
 	@property
+	def defined_phases(self):
+		v = self._aux_get('DEFINED_PHASES')
+		if v == '-':
+			return SpaceSepTuple(())
+		return SpaceSepTuple(v)
+
+	@property
 	def homepages(self):
 		return SpaceSepTuple(self._aux_get('HOMEPAGE'))
 



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-27 16:24 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-27 16:24 UTC (permalink / raw
  To: gentoo-commits

commit:     1bf175a31e7114ac8fe5b215547e350a80d093e4
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 27 16:11:12 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jul 27 16:11:12 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=1bf175a3

Support getting ebuild EAPI.

---
 gentoopm/basepm/pkg.py    |    9 +++++++++
 gentoopm/paludispm/pkg.py |    5 +++++
 gentoopm/pkgcorepm/pkg.py |    4 ++++
 gentoopm/portagepm/pkg.py |    4 ++++
 4 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index d1fa92d..27cf769 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -195,6 +195,15 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		pass
 
 	@abstractproperty
+	def eapi(self):
+		"""
+		The EAPI used by the ebuild.
+
+		@type: string
+		"""
+		pass
+
+	@abstractproperty
 	def description(self):
 		"""
 		The description of the package.

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 7ad3e61..9f8990a 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -74,6 +74,11 @@ class PaludisID(PMPackage, PaludisAtom):
 		return PaludisPackageVersion(self._pkg.version)
 
 	@property
+	def eapi(self):
+		k = self._pkg.find_metadata('EAPI')
+		return str(k.parse_value())
+
+	@property
 	def description(self):
 		return PaludisPackageDescription(self._pkg)
 

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 819aa4b..3e81192 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -66,6 +66,10 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 		return self._pkg.path
 
 	@property
+	def eapi(self):
+		return str(self._pkg.eapi)
+
+	@property
 	def description(self):
 		return PkgCorePackageDescription(self._pkg)
 

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index a85f70d..60e0102 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -89,6 +89,10 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 			return tuple(val)
 
 	@property
+	def eapi(self):
+		return self._aux_get('EAPI')
+
+	@property
 	def description(self):
 		return PortagePackageDescription(self)
 



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-23  9:27 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-23  9:27 UTC (permalink / raw
  To: gentoo-commits

commit:     d1fb230cde458c56a8251b5499987032226df8b3
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Sat Jul 23 09:12:35 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Sat Jul 23 09:12:35 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=d1fb230c

Support comparing PMPackageVersions.

---
 gentoopm/basepm/atom.py    |    4 ++++
 gentoopm/paludispm/atom.py |    3 +++
 gentoopm/pkgcorepm/atom.py |    8 ++++++++
 gentoopm/portagepm/atom.py |    5 ++++-
 4 files changed, 19 insertions(+), 1 deletions(-)

diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py
index b37b46f..9fa2c39 100644
--- a/gentoopm/basepm/atom.py
+++ b/gentoopm/basepm/atom.py
@@ -93,6 +93,10 @@ class PMPackageVersion(ABCObject, StringCompat):
 		"""
 		pass
 
+	@abstractmethod
+	def __lt__(self, other):
+		pass
+
 class PMAtom(ABCObject, StringifiedComparisons):
 	"""
 	A base class for PM-specific atom (dependency specification).

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
index 3b54de3..c416cb1 100644
--- a/gentoopm/paludispm/atom.py
+++ b/gentoopm/paludispm/atom.py
@@ -51,6 +51,9 @@ class PaludisPackageVersion(PMPackageVersion):
 	def __str__(self):
 		return str(self._v)
 
+	def __lt__(self, other):
+		return self._v < other._v
+
 class PaludisAtom(PMAtom):
 	def _init_atom(self, s, env, wildcards = False):
 		opts = paludis.UserPackageDepSpecOptions() \

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
index c903131..698864e 100644
--- a/gentoopm/pkgcorepm/atom.py
+++ b/gentoopm/pkgcorepm/atom.py
@@ -67,6 +67,11 @@ class PkgCorePackageVersion(PMPackageVersion):
 	def __str__(self):
 		return self._atom.fullver
 
+	def __lt__(self, other):
+		if self._atom.key != other._atom.key:
+			raise NotImplementedError('Unable to compare versions of distinct packages')
+		return self._atom < other._atom
+
 class PkgCoreIncompletePackageVersion(PMPackageVersion):
 	def __init__(self, r):
 		self._r = _find_res(r, VersionMatch)
@@ -81,6 +86,9 @@ class PkgCoreIncompletePackageVersion(PMPackageVersion):
 	def revision(self):
 		return self._r.rev or 0
 
+	def __lt__(self, other):
+		raise NotImplementedError('Unable to compare versions of incomplete atoms')
+
 	def __str__(self):
 		# XXX: ugly?
 		return str(self._r).split()[-1]

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
index e893033..28b273d 100644
--- a/gentoopm/portagepm/atom.py
+++ b/gentoopm/portagepm/atom.py
@@ -8,7 +8,7 @@ import collections
 import portage.exception as pe
 from portage.dbapi.dep_expand import dep_expand
 from portage.dep import match_from_list
-from portage.versions import catsplit, pkgsplit, cpv_getversion
+from portage.versions import catsplit, pkgsplit, cpv_getversion, vercmp
 
 from gentoopm.basepm.atom import PMAtom, PMPackageKey, PMPackageVersion, \
 		PMIncompletePackageKey
@@ -49,6 +49,9 @@ class PortagePackageVersion(PMPackageVersion):
 	def __str__(self):
 		return cpv_getversion(self._cpv)
 
+	def __lt__(self, other):
+		return vercmp(str(self), str(other)) < 0
+
 class FakeSettings(object):
 	"""
 	Fake settings object, to satisfy cpv_expand().



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-20 18:02 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-20 18:02 UTC (permalink / raw
  To: gentoo-commits

commit:     bbbab2ce01f276096793661f11219a9dd1ca3c38
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 20 18:03:07 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jul 20 18:03:07 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=bbbab2ce

Support getting package homepages.

---
 gentoopm/basepm/pkg.py    |    9 +++++++++
 gentoopm/paludispm/pkg.py |    5 +++++
 gentoopm/pkgcorepm/pkg.py |    4 ++++
 gentoopm/portagepm/pkg.py |   13 +++++++++----
 4 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 4fa6405..b633799 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -146,6 +146,15 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		"""
 		pass
 
+	@abstractproperty
+	def homepages(self):
+		"""
+		Homepages of a package.
+
+		@type: L{SpaceSepTuple}
+		"""
+		pass
+
 	@property
 	def environ(self):
 		"""

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 418fe95..b262080 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -69,6 +69,11 @@ class PaludisID(PMPackage, PaludisAtom):
 		return SpaceSepTuple(k.parse_value())
 
 	@property
+	def homepages(self):
+		spec = self._pkg.homepage_key().parse_value()
+		return SpaceSepTuple([str(x) for x in spec])
+
+	@property
 	def slot(self):
 		k = self._pkg.slot_key()
 		return str(k.parse_value())

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index b60a281..e2c0288 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -66,6 +66,10 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 		return SpaceSepTuple(l)
 
 	@property
+	def homepages(self):
+		return SpaceSepTuple(self._pkg.homepage)
+
+	@property
 	def slotted(self):
 		return PkgCoreAtom(self._pkg.slotted_atom)
 

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 40c1460..9874d07 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -63,7 +63,8 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 		return PortagePackageVersion(self._cpv)
 
 	def _aux_get(self, *keys):
-		val = self._dbapi.aux_get(self._cpv, keys)
+		val = [str(x) for x
+				in self._dbapi.aux_get(self._cpv, keys)]
 		if len(keys) == 1:
 			return val[0]
 		else:
@@ -75,7 +76,11 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 
 	@property
 	def inherits(self):
-		return SpaceSepTuple(str(self._aux_get('INHERITED')))
+		return SpaceSepTuple(self._aux_get('INHERITED'))
+
+	@property
+	def homepages(self):
+		return SpaceSepTuple(self._aux_get('HOMEPAGE'))
 
 	@property
 	def slot(self):
@@ -124,8 +129,8 @@ class PortageCPV(PortageDBCPV):
 		return self._dbapi.getRepositoryName(self._tree)
 
 	def _aux_get(self, *keys):
-		val = self._dbapi.aux_get(self._cpv, keys,
-				mytree = self._tree)
+		val = [str(x) for x in self._dbapi.aux_get
+				(self._cpv, keys, mytree = self._tree)]
 		if len(keys) == 1:
 			return val[0]
 		else:



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-20  9:41 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-20  9:41 UTC (permalink / raw
  To: gentoo-commits

commit:     fe71e02c32793baa57e0de673c2ea75aacbc2783
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 20 09:09:51 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jul 20 09:09:51 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=fe71e02c

Support getting inherits off packages.

---
 gentoopm/basepm/pkg.py    |    9 +++++++++
 gentoopm/paludispm/pkg.py |    8 ++++++++
 gentoopm/pkgcorepm/pkg.py |   14 ++++++++++++++
 gentoopm/portagepm/pkg.py |    5 +++++
 4 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index c58057e..14cf36c 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -137,6 +137,15 @@ class PMPackage(PMAtom, FillMissingComparisons):
 		"""
 		pass
 
+	@abstractproperty
+	def inherits(self):
+		"""
+		Eclasses inherited by a package.
+
+		@type: tuple(L{StringWrapper})/C{None}
+		"""
+		pass
+
 	@property
 	def environ(self):
 		"""

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index b51a059..9ddfeaf 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -62,6 +62,14 @@ class PaludisID(PMPackage, PaludisAtom):
 		return PaludisPackageDescription(self._pkg)
 
 	@property
+	def inherits(self):
+		k = self._pkg.find_metadata('INHERITED')
+		if k is None:
+			return None
+		return tuple([StringWrapper(x) for x
+			in k.parse_value()])
+
+	@property
 	def slot(self):
 		k = self._pkg.slot_key()
 		return StringWrapper(k.parse_value())

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 19d537b..9a95d60 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -52,6 +52,20 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 		return PkgCorePackageDescription(self._pkg)
 
 	@property
+	def inherits(self):
+		# ebuilds use _eclasses_
+		# vdb uses INHERITED
+		try:
+			l = self._pkg.data['_eclasses_']
+		except KeyError:
+			try:
+				l = self._pkg.data['INHERITED'].split()
+			except KeyError:
+				return None
+
+		return tuple([StringWrapper(x) for x in l])
+
+	@property
 	def slotted(self):
 		return PkgCoreAtom(self._pkg.slotted_atom)
 

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index e3e9c38..2c40611 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -74,6 +74,11 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 		return PortagePackageDescription(self)
 
 	@property
+	def inherits(self):
+		return tuple([StringWrapper(x) for x
+			in self._aux_get('INHERITED').split()])
+
+	@property
 	def slot(self):
 		return StringWrapper(self._aux_get('SLOT'))
 



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-19 11:53 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-19 11:53 UTC (permalink / raw
  To: gentoo-commits

commit:     b4a659df0e05aa66206a5b6d670fba0cca97fa86
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Tue Jul 19 11:54:00 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Tue Jul 19 11:54:00 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=b4a659df

Undo StringWrapping in pkg.metadata.

There's no reason to change deprecated APIs. Just let them die.

---
 gentoopm/basepm/metadata.py |    6 +++---
 gentoopm/paludispm/pkg.py   |    8 ++++----
 gentoopm/pkgcorepm/pkg.py   |   16 ++++++++--------
 gentoopm/portagepm/pkg.py   |   10 +++++-----
 4 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/gentoopm/basepm/metadata.py b/gentoopm/basepm/metadata.py
index a591c0b..f36f310 100644
--- a/gentoopm/basepm/metadata.py
+++ b/gentoopm/basepm/metadata.py
@@ -34,7 +34,7 @@ class PMPackageMetadata(ABCObject):
 		@param key: the metadata key to catch
 		@type key: string
 		@return: the value of a metadata key, or C{''} when unset
-		@rtype: L{StringWrapper}
+		@rtype: string
 		@raise KeyError: when invalid metadata key referred
 		"""
 		try:
@@ -53,7 +53,7 @@ class PMPackageMetadata(ABCObject):
 		@param key: the metadata key to catch
 		@type key: string
 		@return: the value of a metadata key, or C{''} when unset
-		@rtype: L{StringWrapper}
+		@rtype: string
 		@raise AttributeError: when invalid metadata key referred
 		"""
 		pass
@@ -63,6 +63,6 @@ class PMPackageMetadata(ABCObject):
 		Iterate over possible metadata keys.
 
 		@return: available metadata keys
-		@rtype: iter(L{StringWrapper})
+		@rtype: iter(string)
 		"""
 		return iter(metadata_keys)

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 4c65901..b51a059 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -96,7 +96,7 @@ class PaludisMetadata(PMPackageMetadata):
 		@param key: the metadata key to catch
 		@type key: string
 		@return: the value of a metadata key, or C{''} when unset
-		@rtype: L{StringWrapper}
+		@rtype: string
 		@raise AttributeError: when invalid metadata key referred
 		@raise NotImplementedError: when not-stringifiable key referred
 		@bug: not all values can be stringified, pretty printing API
@@ -106,12 +106,12 @@ class PaludisMetadata(PMPackageMetadata):
 			raise AttributeError('Unsupported metadata key: %s' % key)
 		m = self._pkg.find_metadata(key)
 		if m is None:
-			return StringWrapper('')
+			return ''
 		m = m.parse_value()
 		if isinstance(m, paludis.StringSetIterable) \
 				or isinstance(m, paludis.KeywordNameIterable):
-			return StringWrapper(' '.join([str(x) for x in m]))
+			return ' '.join([str(x) for x in m])
 		elif isinstance(m, paludis.AllDepSpec):
 			raise NotImplementedError('Parsing %s is not supported yet.' % key)
 		else:
-			return StringWrapper(m)
+			return m

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 89d070c..19d537b 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -90,31 +90,31 @@ class PkgCoreMetadata(PMPackageMetadata):
 		# vdb uses INHERITED
 		# ebuilds use _eclasses_
 		try:
-			return StringWrapper(self._pkg.data['INHERITED'])
+			return self._pkg.data['INHERITED']
 		except KeyError:
 			pass
 		try:
-			return StringWrapper(' '.join(self._pkg.data['_eclasses_'].keys()))
+			return ' '.join(self._pkg.data['_eclasses_'].keys())
 		except KeyError:
-			return StringWrapper('')
+			return ''
 
 	@property
 	def DEPEND(self):
-		return StringWrapper(self._pkg.depends)
+		return str(self._pkg.depends)
 
 	@property
 	def RDEPEND(self):
-		return StringWrapper(self._pkg.rdepends)
+		return str(self._pkg.rdepends)
 
 	@property
 	def PDEPEND(self):
-		return StringWrapper(self._pkg.post_rdepends)
+		return str(self._pkg.post_rdepends)
 
 	def __getattr__(self, key):
 		if key not in self:
 			raise AttributeError('Unsupported metadata key: %s' % key)
 		v = getattr(self._pkg, key.lower())
 		if isinstance(v, tuple) or isinstance(v, frozenset):
-			return StringWrapper(' '.join(v))
+			return ' '.join(v)
 		else:
-			return StringWrapper(v)
+			return v

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index b505f78..b421596 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -28,7 +28,7 @@ class PortagePackageDescription(PMPackageDescription):
 
 	@property
 	def short(self):
-		return self._meta['DESCRIPTION']
+		return StringWrapper(self._meta['DESCRIPTION'])
 
 	@property
 	def long(self):
@@ -68,7 +68,7 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 
 	@property
 	def slot(self):
-		return self.metadata['SLOT'] # XXX
+		return StringWrapper(self.metadata['SLOT']) # XXX
 
 	@property
 	def repository(self):
@@ -135,7 +135,7 @@ class PortageDBMetadata(PMPackageMetadata):
 	def __getattr__(self, key):
 		if key not in self:
 			raise AttributeError('Unsupported metadata key: %s' % key)
-		return StringWrapper(self._dbapi.aux_get(self._cpv, [key])[0])
+		return self._dbapi.aux_get(self._cpv, [key])[0]
 
 class PortageMetadata(PortageDBMetadata):
 	def __init__(self, cpv, dbapi, tree):
@@ -145,5 +145,5 @@ class PortageMetadata(PortageDBMetadata):
 	def __getattr__(self, key):
 		if key not in self:
 			raise AttributeError('Unsupported metadata key: %s' % key)
-		return StringWrapper(self._dbapi.aux_get(self._cpv, [key],
-				mytree = self._tree)[0])
+		return self._dbapi.aux_get(self._cpv, [key],
+				mytree = self._tree)[0]



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-18 17:54 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-18 17:54 UTC (permalink / raw
  To: gentoo-commits

commit:     43444b667821afedd650acf06cf46821206ff88c
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Mon Jul 18 17:55:26 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Jul 18 17:55:26 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=43444b66

Support getting package descriptions.

---
 gentoopm/basepm/pkg.py    |   43 +++++++++++++++++++++++++++++++++++++++++++
 gentoopm/paludispm/pkg.py |   19 ++++++++++++++++++-
 gentoopm/pkgcorepm/pkg.py |   21 ++++++++++++++++++++-
 gentoopm/portagepm/pkg.py |   18 +++++++++++++++++-
 4 files changed, 98 insertions(+), 3 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 51944d9..7fecdff 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -10,6 +10,39 @@ from gentoopm.basepm.atom import PMAtom
 from gentoopm.basepm.environ import PMPackageEnvironment
 from gentoopm.util import ABCObject
 
+class PMPackageDescription(ABCObject):
+	"""
+	Description of a package.
+	"""
+
+	@abstractproperty
+	def short(self):
+		"""
+		The short package description (e.g. C{DESCRIPTION} within the ebuild).
+
+		@type: string
+		"""
+		pass
+
+	@abstractproperty
+	def long(self):
+		"""
+		The long package description (e.g. from C{metadata.xml}).
+
+		@type: string/C{None}
+		"""
+		pass
+
+	def __str__(self):
+		"""
+		Stringify to the best package description. In other words, long package
+		description if available, short otherwise.
+
+		@returns: best package description
+		@rtype: string
+		"""
+		return self.long or self.short
+
 class PMPackage(PMAtom):
 	"""
 	An abstract class representing a single, uniquely-identified package
@@ -91,6 +124,16 @@ class PMPackage(PMAtom):
 		The metadata accessor object for the package.
 
 		@type: L{PMPackageMetadata}
+		@deprecated: inconsistent, please use L{PMPackage} properties instead
+		"""
+		pass
+
+	@abstractproperty
+	def description(self):
+		"""
+		The description of the package.
+
+		@type: L{PMPackageDescription}
 		"""
 		pass
 

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 9f7405e..6ae4f25 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -6,10 +6,23 @@
 import paludis
 
 from gentoopm.basepm.metadata import PMPackageMetadata
-from gentoopm.basepm.pkg import PMPackage
+from gentoopm.basepm.pkg import PMPackage, PMPackageDescription
 from gentoopm.paludispm.atom import PaludisAtom, \
 		PaludisPackageKey, PaludisPackageVersion
 
+class PaludisPackageDescription(PMPackageDescription):
+	def __init__(self, pkg):
+		self._pkg = pkg
+
+	@property
+	def short(self):
+		return self._pkg.short_description_key().parse_value()
+
+	@property
+	def long(self):
+		k = self._pkg.long_description_key()
+		return k.parse_value() if k is not None else None
+
 class PaludisID(PMPackage, PaludisAtom):
 	def __init__(self, pkg, num = 0, enum_id = None, env = None):
 		self._pkg = pkg
@@ -44,6 +57,10 @@ class PaludisID(PMPackage, PaludisAtom):
 		return PaludisPackageVersion(self._pkg.version)
 
 	@property
+	def description(self):
+		return PaludisPackageDescription(self._pkg)
+
+	@property
 	def slot(self):
 		k = self._pkg.slot_key()
 		return str(k.parse_value())

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 4c33ddb..4840d88 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -4,7 +4,7 @@
 # Released under the terms of the 2-clause BSD license.
 
 from gentoopm.basepm.metadata import PMPackageMetadata
-from gentoopm.basepm.pkg import PMPackage
+from gentoopm.basepm.pkg import PMPackage, PMPackageDescription
 from gentoopm.basepm.pkgset import PMPackageSet, PMFilteredPackageSet
 from gentoopm.pkgcorepm.atom import PkgCoreAtom
 
@@ -18,6 +18,21 @@ class PkgCorePackageSet(PMPackageSet):
 class PkgCoreFilteredPackageSet(PkgCorePackageSet, PMFilteredPackageSet):
 	pass
 
+class PkgCorePackageDescription(PMPackageDescription):
+	def __init__(self, pkg):
+		self._pkg = pkg
+
+	@property
+	def short(self):
+		return self._pkg.description
+
+	@property
+	def long(self):
+		if hasattr(self._pkg, 'longdescription'):
+			return self._pkg.longdescription
+		else: # vdb, for example
+			return None
+
 class PkgCorePackage(PMPackage, PkgCoreAtom):
 	def __init__(self, pkg, repo_index = 0):
 		self._pkg = pkg
@@ -32,6 +47,10 @@ class PkgCorePackage(PMPackage, PkgCoreAtom):
 		return self._pkg.path
 
 	@property
+	def description(self):
+		return PkgCorePackageDescription(self._pkg)
+
+	@property
 	def slotted(self):
 		return PkgCoreAtom(self._pkg.slotted_atom)
 

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index a999eec..2454685 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -6,7 +6,7 @@
 from portage.versions import cpv_getkey, cpv_getversion, vercmp
 
 from gentoopm.basepm.metadata import PMPackageMetadata
-from gentoopm.basepm.pkg import PMPackage
+from gentoopm.basepm.pkg import PMPackage, PMPackageDescription
 from gentoopm.basepm.pkgset import PMPackageSet, PMFilteredPackageSet
 from gentoopm.portagepm.atom import PortageAtom, CompletePortageAtom, \
 		PortagePackageKey, PortagePackageVersion, _get_atom
@@ -21,6 +21,18 @@ class PortagePackageSet(PMPackageSet):
 class PortageFilteredPackageSet(PortagePackageSet, PMFilteredPackageSet):
 	pass
 
+class PortagePackageDescription(PMPackageDescription):
+	def __init__(self, meta):
+		self._meta = meta
+
+	@property
+	def short(self):
+		return self._meta['DESCRIPTION']
+
+	@property
+	def long(self):
+		return None # XXX
+
 class PortageDBCPV(PMPackage, CompletePortageAtom):
 	def __init__(self, cpv, dbapi):
 		self._cpv = cpv
@@ -44,6 +56,10 @@ class PortageDBCPV(PMPackage, CompletePortageAtom):
 		return PortagePackageVersion(self._cpv)
 
 	@property
+	def description(self):
+		return PortagePackageDescription(self.metadata) # XXX
+
+	@property
 	def slot(self):
 		return self.metadata['SLOT'] # XXX
 



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-18 14:40 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-18 14:40 UTC (permalink / raw
  To: gentoo-commits

commit:     f34d91de9079ee70851a0b1b2cf8787708b650c9
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Mon Jul 18 14:22:39 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Jul 18 14:22:39 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=f34d91de

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
 
-	@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.
 
 		@type: bool
+		@deprecated: now L{PMPackage} is a subclass of L{PMAtom},
+			and that's the associated atom variant
 		"""
-		pass
+		return False
 
 	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 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
-
-	@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)
 
 	@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
 
-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
 
 	@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.
 
 		@type: hashable
+		@deprecated: use the package itself or its C{hash()} instead
 		"""
-		return self.atom
+		return self
 
-	@abstractproperty
+	@property
 	def atom(self):
 		"""
 		Return an atom matching the package uniquely.
 
 		@type: L{PMAtom}
+		@deprecated: the package is now a subclass of L{PMAtom}
+			and can be used directly as an atom
 		"""
-		pass
+		return self
 
 	@abstractproperty
 	def path(self):
@@ -132,16 +125,41 @@ class PMPackage(ABCObject):
 			return None
 		return PMPackageEnvironment(p)
 
-	def __eq__(self, other):
-		if not isinstance(other, self.__class__):
-			return False
-		return self.id == other.id
+	@abstractproperty
+	def slotted(self):
+		"""
+		Return an atom matching all packages in the same slot as the associated
+		package.
 
-	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.
 
-	def __hash__(self):
-		return hash(self.id)
+		@type: L{PMAtom}
+		"""
+		pass
 
-	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 == 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)
 
-	def __init__(self, s, env, pkg = None):
+	def __init__(self, s, env):
 		self._incomplete = False
 		if isinstance(s, paludis.PackageDepSpec):
 			self._atom = 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, True)
 				self._incomplete = True
-		self._pkg = pkg
 		self._env = env
 
 	def __contains__(self, pkg):
@@ -119,22 +118,6 @@ class PaludisAtom(PMAtom):
 		return not self._incomplete
 
 	@property
-	def associated(self):
-		return self._pkg is not None
-
-	@property
-	def slotted(self):
-		assert(self.associated)
-		cp = str(self.key)
-		slot = 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
 
 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
 
-class PaludisID(PMPackage):
+class PaludisID(PMPackage, PaludisAtom):
 	def __init__(self, pkg, num = 0, enum_id = None, env = None):
 		self._pkg = pkg
 		self._num = num
@@ -25,9 +26,38 @@ class PaludisID(PMPackage):
 		return self._pkg.fs_location_key().parse_value()
 
 	@property
-	def atom(self):
-		return PaludisAtom(self._pkg.uniquely_identifying_spec(),
-				self._env, self)
+	def slotted(self):
+		cp = str(self.key)
+		slot = 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 = 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)
 
 	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]
 
 class PkgCoreAtom(PMAtom):
-	def __init__(self, s, pkg = None):
+	def __init__(self, s):
 		if isinstance(s, atom):
 			self._r = s
 		else:
@@ -95,8 +95,6 @@ class PkgCoreAtom(PMAtom):
 			except ParseError:
 				raise InvalidAtomStringError('Incorrect atom: %s' % s)
 
-		self._pkg = pkg
-
 	def __contains__(self, pkg):
 		return self._r.match(pkg._pkg)
 
@@ -111,20 +109,6 @@ class PkgCoreAtom(PMAtom):
 		return isinstance(self._r, atom)
 
 	@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
 
 from gentoopm.pkgcorepm.atom import PkgCoreAtom
+from gentoopm.pkgcorepm.pkg import PkgCorePackage
 
 def transform_filters(args, kwargs):
 	"""
@@ -21,6 +22,8 @@ def transform_filters(args, kwargs):
 	f = []
 
 	for a in args:
+		if isinstance(a, PkgCorePackage):
+			a = str(a)
 		if isinstance(a, str):
 			a = 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
 
-class PkgCorePackage(PMPackage):
+class PkgCorePackage(PMPackage, PkgCoreAtom):
 	def __init__(self, pkg, repo_index = 0):
 		self._pkg = pkg
 		self._repo_index = repo_index
@@ -32,12 +32,27 @@ class PkgCorePackage(PMPackage):
 		return self._pkg.path
 
 	@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 != 0:
 			s = '%s::%s' % (self._pkg.cpvstr, self._pkg.repo.repo_id)
 		else:
 			s = self._pkg.cpvstr
-		return PkgCoreAtom('=%s' % s, self)
+		return '=%s' % s
 
 	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: '')
 
-class PortageAtom(object):
-	def __new__(self, s, pkg = None):
-		try:
-			a = dep_expand(s, settings = FakeSettings())
-		except pe.InvalidAtom:
-			raise InvalidAtomStringError('Incorrect atom: %s' % s)
+def _get_atom(s):
+	try:
+		return dep_expand(s, settings = FakeSettings())
+	except pe.InvalidAtom:
+		raise InvalidAtomStringError('Incorrect atom: %s' % s)
 
+class PortageAtom(object):
+	def __new__(self, s):
+		a = _get_atom(s)
 		if catsplit(a.cp)[0] == 'null':
-			assert(pkg is None)
 			return UnexpandedPortageAtom(a)
 		else:
-			return CompletePortageAtom(a, pkg)
+			return CompletePortageAtom(a)
 
 class CompletePortageAtom(PMAtom):
-	def __init__(self, a, pkg = None):
+	def __init__(self, a):
 		self._atom = a
-		self._pkg = pkg
 
 	def __contains__(self, pkg):
 		# SLOT matching requires metadata so delay it.
@@ -90,22 +90,6 @@ class CompletePortageAtom(PMAtom):
 		return True
 
 	@property
-	def associated(self):
-		return self._pkg is not None
-
-	@property
-	def slotted(self):
-		assert(self.associated)
-		cp = str(self.key)
-		slot = 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)
 

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
 
 class PortagePackageSet(PMPackageSet):
 	def filter(self, *args, **kwargs):
@@ -20,7 +21,7 @@ class PortagePackageSet(PMPackageSet):
 class PortageFilteredPackageSet(PortagePackageSet, PMFilteredPackageSet):
 	pass
 
-class PortageDBCPV(PMPackage):
+class PortageDBCPV(PMPackage, CompletePortageAtom):
 	def __init__(self, cpv, dbapi):
 		self._cpv = cpv
 		self._dbapi = dbapi
@@ -35,8 +36,37 @@ class PortageDBCPV(PMPackage):
 		return self._dbapi.getpath(self._cpv)
 
 	@property
-	def atom(self):
-		return PortageAtom('=%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 = str(self.key)
+		slot = 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 '=%s' % self._cpv
 
 	def __lt__(self, other):
 		if not isinstance(other, PortageDBCPV):
@@ -60,9 +90,11 @@ class PortageCPV(PortageDBCPV):
 		return self._dbapi.findname(self._cpv, self._tree)
 
 	@property
-	def atom(self):
-		return PortageAtom('=%s::%s' % (self._cpv,
-			self._dbapi.getRepositoryName(self._tree)), self)
+	def repository(self):
+		return self._dbapi.getRepositoryName(self._tree)
+
+	def __str__(self):
+		return '=%s::%s' % (self._cpv, self.repository)
 
 	def __lt__(self, other):
 		if not isinstance(other, PortageCPV):



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-15 22:24 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-15 22:24 UTC (permalink / raw
  To: gentoo-commits

commit:     006e3f6b21e57c997a9fbf67d423d48c8c0b8ddb
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Fri Jul 15 22:23:36 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Fri Jul 15 22:23:36 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=006e3f6b

Use atoms as PMPackage.{key,id}.

---
 gentoopm/basepm/pkg.py    |   12 ++++++------
 gentoopm/paludispm/pkg.py |    8 --------
 gentoopm/pkgcorepm/pkg.py |   15 ++++-----------
 gentoopm/portagepm/pkg.py |   15 ++++-----------
 4 files changed, 14 insertions(+), 36 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 3a4a8b2..6a8b24a 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -52,25 +52,25 @@ class PMPackage(ABCObject):
 
 		return True
 
-	@abstractproperty
+	@property
 	def key(self):
 		"""
 		Return the key identifying the package. This is used by
 		L{PMPackageSet.best}, to check whether the set doesn't reference more
 		than one package.
 
-		@type: string
+		@type: any
 		"""
-		pass
+		return self.atom.unversioned
 
-	@abstractproperty
+	@property
 	def id(self):
 		"""
 		Return an unique identifier for the package.
 
-		@type: string
+		@type: any
 		"""
-		pass
+		return self.atom
 
 	@abstractproperty
 	def atom(self):

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index e1adbdb..e127cd4 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -25,14 +25,6 @@ class PaludisID(PMPackage):
 		return self._pkg.fs_location_key().parse_value()
 
 	@property
-	def key(self):
-		return str(self._pkg.name)
-
-	@property
-	def id(self):
-		return str(self._pkg)
-
-	@property
 	def atom(self):
 		return PaludisAtom(self._pkg.uniquely_identifying_spec(),
 				self._env, self)

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 5355643..7a0ebfd 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -32,19 +32,12 @@ class PkgCorePackage(PMPackage):
 		return self._pkg.path
 
 	@property
-	def key(self):
-		return self._pkg.key
-
-	@property
-	def id(self):
+	def atom(self):
 		if self._repo_index != 0:
-			return '%s::%s' % (self._pkg.cpvstr, self._pkg.repo.repo_id)
+			s = '%s::%s' % (self._pkg.cpvstr, self._pkg.repo.repo_id)
 		else:
-			return self._pkg.cpvstr
-
-	@property
-	def atom(self):
-		return PkgCoreAtom('=%s' % self.id, self)
+			s = self._pkg.cpvstr
+		return PkgCoreAtom('=%s' % s, self)
 
 	def __lt__(self, other):
 		if not isinstance(other, PkgCorePackage):

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index f141df7..fdf1414 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -36,16 +36,8 @@ class PortageDBCPV(PMPackage):
 		return self._dbapi.getpath(self._cpv)
 
 	@property
-	def key(self):
-		return cpv_getkey(self._cpv)
-
-	@property
-	def id(self):
-		return self._cpv
-
-	@property
 	def atom(self):
-		return PortageAtom('=%s' % self.id, self)
+		return PortageAtom('=%s' % self._cpv, self)
 
 	def __lt__(self, other):
 		if not isinstance(other, PortageDBCPV):
@@ -69,8 +61,9 @@ class PortageCPV(PortageDBCPV):
 		return self._dbapi.findname(self._cpv, self._tree)
 
 	@property
-	def id(self):
-		return '%s::%s' % (self._cpv, self._dbapi.getRepositoryName(self._tree))
+	def atom(self):
+		return PortageAtom('=%s::%s' % (self._cpv,
+			self._dbapi.getRepositoryName(self._tree)), self)
 
 	def __lt__(self, other):
 		if not isinstance(other, PortageCPV):



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-15 22:24 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-15 22:24 UTC (permalink / raw
  To: gentoo-commits

commit:     e08574117f8c27923f3edf562b75bdebeb4889d6
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Fri Jul 15 21:58:43 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Fri Jul 15 21:58:43 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=e0857411

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.
 
 import os.path
-from abc import abstractmethod, abstractproperty
+from abc import abstractproperty
 
 from gentoopm.basepm.atom import PMAtom
 from gentoopm.basepm.environ import PMPackageEnvironment
-from gentoopm.exceptions import EmptyPackageSetError, AmbiguousPackageSetError
 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 '==' 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 = sorted(self, reverse = True)
-		try:
-			best = l[0]
-		except IndexError:
-			raise EmptyPackageSetError('.best called on an empty set')
-
-		for p in l:
-			if p.key != 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 match
-		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 = iter(self.filter(filt))
-
-		try:
-			ret = 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 = 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 = src
-		self._args = args
-		self._kwargs = 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=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from abc import abstractmethod
+
+from gentoopm.exceptions import EmptyPackageSetError, AmbiguousPackageSetError
+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 '==' 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 = sorted(self, reverse = True)
+		try:
+			best = l[0]
+		except IndexError:
+			raise EmptyPackageSetError('.best called on an empty set')
+
+		for p in l:
+			if p.key != 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 match
+		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 = iter(self.filter(filt))
+
+		try:
+			ret = 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 = 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 = src
+		self._args = args
+		self._kwargs = 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
 
-from gentoopm.basepm.pkg import PMPackageSet
+from gentoopm.basepm.pkgset import PMPackageSet
 from gentoopm.util import ABCObject
 
 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.
 
 from gentoopm.basepm.repo import PMRepository
-from gentoopm.basepm.pkg import PMPackageSet
+from gentoopm.basepm.pkgset import PMPackageSet
 
 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
 
 from gentoopm.basepm.metadata import PMPackageMetadata
-from gentoopm.basepm.pkg import PMPackageSet, PMPackage, \
-		PMFilteredPackageSet
-from gentoopm.exceptions import EmptyPackageSetError, AmbiguousPackageSetError
+from gentoopm.basepm.pkg import PMPackage
 from gentoopm.paludispm.atom import PaludisAtom
 
-class PaludisPackageSet(PMPackageSet):
-	_sorted = False
-
-	def filter(self, *args, **kwargs):
-		return PaludisFilteredPackageSet(self, args, kwargs)
-
-	@property
-	def best(self):
-		if self._sorted:
-			it = iter(self)
-
-			try:
-				f = next(it)
-			except StopIteration:
-				raise EmptyPackageSetError('.best called on an empty set')
-			for p in it:
-				if p.key != f.key:
-					raise AmbiguousPackageSetError('.best called on a set of differently-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 = pset._sorted
-		PMFilteredPackageSet.__init__(self, pset, args, kwargs)
-
 class PaludisID(PMPackage):
 	def __init__(self, pkg, num = 0, enum_id = None, env = None):
 		self._pkg = 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=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from gentoopm.basepm.pkgset import PMPackageSet, PMFilteredPackageSet
+from gentoopm.exceptions import EmptyPackageSetError, AmbiguousPackageSetError
+
+class PaludisPackageSet(PMPackageSet):
+	_sorted = False
+
+	def filter(self, *args, **kwargs):
+		return PaludisFilteredPackageSet(self, args, kwargs)
+
+	@property
+	def best(self):
+		if self._sorted:
+			it = iter(self)
+
+			try:
+				f = next(it)
+			except StopIteration:
+				raise EmptyPackageSetError('.best called on an empty set')
+			for p in it:
+				if p.key != f.key:
+					raise AmbiguousPackageSetError('.best called on a set of differently-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 = 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
 
 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.
 
 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.pkgcorepm.atom import PkgCoreAtom
 
 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
 
 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
 
 class PortagePackageSet(PMPackageSet):



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-14 14:05 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-14 14:05 UTC (permalink / raw
  To: gentoo-commits

commit:     448a254542c730c3825697ab45cb9a9e2e19de0c
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 14 14:05:49 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 14 14:05:49 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=448a2545

Support getting slotted and unversioned atoms.

---
 gentoopm/basepm/atom.py    |   27 +++++++++++++++++++++++++++
 gentoopm/paludispm/atom.py |   13 +++++++++++++
 gentoopm/pkgcorepm/atom.py |   21 +++++++++++++++++----
 gentoopm/portagepm/atom.py |   12 ++++++++++++
 4 files changed, 69 insertions(+), 4 deletions(-)

diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py
index d9689c2..3090e3e 100644
--- a/gentoopm/basepm/atom.py
+++ b/gentoopm/basepm/atom.py
@@ -87,3 +87,30 @@ class PMAtom(ABCObject):
 			match the atom
 		"""
 		return repo.select(self).atom
+
+	@abstractproperty
+	def slotted(self):
+		"""
+		Return an atom matching all packages in the same slot 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
+
+	@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
+

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
index 63452cb..1680859 100644
--- a/gentoopm/paludispm/atom.py
+++ b/gentoopm/paludispm/atom.py
@@ -35,6 +35,7 @@ class PaludisAtom(PMAtom):
 		else:
 			self._incomplete = False
 		self._pkg = pkg
+		self._env = env
 
 	def __contains__(self, pkg):
 		raise NotImplementedError('Direct atom matching not implemented in Paludis')
@@ -51,3 +52,15 @@ class PaludisAtom(PMAtom):
 	@property
 	def associated(self):
 		return self._pkg is not None
+
+	@property
+	def slotted(self):
+		assert(self.associated)
+		cp = str(self._atom.package)
+		slot = self._pkg.metadata['SLOT']
+		return PaludisAtom('%s:%s' % (cp, slot), self._env)
+
+	@property
+	def unversioned(self):
+		assert(self.associated)
+		return PaludisAtom(str(self._atom.package), self._env)

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
index 01959f2..fa63a9c 100644
--- a/gentoopm/pkgcorepm/atom.py
+++ b/gentoopm/pkgcorepm/atom.py
@@ -11,10 +11,13 @@ from gentoopm.exceptions import InvalidAtomStringError
 
 class PkgCoreAtom(PMAtom):
 	def __init__(self, s, pkg = None):
-		try:
-			self._r = parse_match(s)
-		except ParseError:
-			raise InvalidAtomStringError('Incorrect atom: %s' % s)
+		if isinstance(s, atom):
+			self._r = s
+		else:
+			try:
+				self._r = parse_match(s)
+			except ParseError:
+				raise InvalidAtomStringError('Incorrect atom: %s' % s)
 
 		self._pkg = pkg
 
@@ -34,3 +37,13 @@ class PkgCoreAtom(PMAtom):
 	@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)

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
index f68d136..5867f32 100644
--- a/gentoopm/portagepm/atom.py
+++ b/gentoopm/portagepm/atom.py
@@ -57,6 +57,18 @@ class CompletePortageAtom(PMAtom):
 	def associated(self):
 		return self._pkg is not None
 
+	@property
+	def slotted(self):
+		assert(self.associated)
+		cp = self._atom.cp
+		slot = self._pkg.metadata['SLOT']
+		return PortageAtom('%s:%s' % (cp, slot))
+
+	@property
+	def unversioned(self):
+		assert(self.associated)
+		return PortageAtom(self._atom.cp)
+
 class UncategorisedPackageWrapper(object):
 	def __init__(self, pkg):
 		self._pkg = pkg



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-14 13:31 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-14 13:31 UTC (permalink / raw
  To: gentoo-commits

commit:     be2907d41b5455813101578ec04879574be78241
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 14 12:38:56 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 14 12:38:56 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=be2907d4

Add .complete property to PMAtom.

---
 gentoopm/basepm/atom.py    |   13 +++++++++++++
 gentoopm/paludispm/atom.py |    4 ++++
 gentoopm/pkgcorepm/atom.py |    6 +++++-
 gentoopm/portagepm/atom.py |    8 ++++++++
 4 files changed, 30 insertions(+), 1 deletions(-)

diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py
index 6ad5647..91a368c 100644
--- a/gentoopm/basepm/atom.py
+++ b/gentoopm/basepm/atom.py
@@ -42,3 +42,16 @@ class PMAtom(ABCObject):
 		It can raise an exception then.
 		"""
 		pass
+
+	@abstractproperty
+	def complete(self):
+		"""
+		Whether the atom is complete, i.e. whether the category is specified.
+
+		If an atom is incomplete, it is impossible to stringify it. Using such
+		an atom with L{PMPackageSet.select()} may result
+		in an L{AmbiguousPackageSetError}.
+
+		@type: bool
+		"""
+		pass

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
index 4674b77..c1008e5 100644
--- a/gentoopm/paludispm/atom.py
+++ b/gentoopm/paludispm/atom.py
@@ -43,3 +43,7 @@ class PaludisAtom(PMAtom):
 		if self._incomplete:
 			raise ValueError('Unable to stringify incomplete atom')
 		return str(self._atom)
+
+	@property
+	def complete(self):
+		return not self._incomplete

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
index a765403..7c10925 100644
--- a/gentoopm/pkgcorepm/atom.py
+++ b/gentoopm/pkgcorepm/atom.py
@@ -17,7 +17,11 @@ class PkgCoreAtom(PMAtom):
 		return self._r.match(pkg._pkg)
 
 	def __str__(self):
-		if isinstance(self._r, atom):
+		if self.complete:
 			return str(self._r)
 		else:
 			raise ValueError('Unable to stringify incomplete atom')
+
+	@property
+	def complete(self):
+		return isinstance(self._r, atom)

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
index 70e7629..fbd42d3 100644
--- a/gentoopm/portagepm/atom.py
+++ b/gentoopm/portagepm/atom.py
@@ -48,6 +48,10 @@ class CompletePortageAtom(PMAtom):
 	def __str__(self):
 		return str(self._atom)
 
+	@property
+	def complete(self):
+		return True
+
 class UncategorisedPackageWrapper(object):
 	def __init__(self, pkg):
 		self._pkg = pkg
@@ -68,3 +72,7 @@ class UnexpandedPortageAtom(CompletePortageAtom):
 
 	def __str__(self):
 		raise ValueError('Unable to stringify incomplete atom')
+
+	@property
+	def complete(self):
+		return False



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-14 13:31 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-14 13:31 UTC (permalink / raw
  To: gentoo-commits

commit:     d2e1d0ce238379ee70945410bca50ac2f2b9e30c
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 14 12:44:58 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 14 12:44:58 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=d2e1d0ce

Add PMAtom.associated property.

---
 gentoopm/basepm/atom.py    |   11 +++++++++++
 gentoopm/paludispm/atom.py |    4 ++++
 gentoopm/pkgcorepm/atom.py |    4 ++++
 gentoopm/portagepm/atom.py |    4 ++++
 4 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py
index 91a368c..772b098 100644
--- a/gentoopm/basepm/atom.py
+++ b/gentoopm/basepm/atom.py
@@ -55,3 +55,14 @@ class PMAtom(ABCObject):
 		@type: bool
 		"""
 		pass
+
+	@abstractproperty
+	def associated(self):
+		"""
+		Whether the atom is associated with a package.
+
+		If an atom is unassociated, it is impossible to transform it.
+
+		@type: bool
+		"""
+		pass

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
index c1008e5..63452cb 100644
--- a/gentoopm/paludispm/atom.py
+++ b/gentoopm/paludispm/atom.py
@@ -47,3 +47,7 @@ class PaludisAtom(PMAtom):
 	@property
 	def complete(self):
 		return not self._incomplete
+
+	@property
+	def associated(self):
+		return self._pkg is not None

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
index c3969ab..01959f2 100644
--- a/gentoopm/pkgcorepm/atom.py
+++ b/gentoopm/pkgcorepm/atom.py
@@ -30,3 +30,7 @@ class PkgCoreAtom(PMAtom):
 	@property
 	def complete(self):
 		return isinstance(self._r, atom)
+
+	@property
+	def associated(self):
+		return self._pkg is not None

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
index e98de4d..6e28d3c 100644
--- a/gentoopm/portagepm/atom.py
+++ b/gentoopm/portagepm/atom.py
@@ -53,6 +53,10 @@ class CompletePortageAtom(PMAtom):
 	def complete(self):
 		return True
 
+	@property
+	def associated(self):
+		return self._pkg is not None
+
 class UncategorisedPackageWrapper(object):
 	def __init__(self, pkg):
 		self._pkg = pkg



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-14 12:19 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-14 12:19 UTC (permalink / raw
  To: gentoo-commits

commit:     b5a3e6bf691a9c6bacc62efba83f5ed066db1426
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul 14 12:19:40 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul 14 12:19:40 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=b5a3e6bf

Drop P* properties from metadata.

The CATEGORY property was left. For package name and version matching,
atoms shall be used.

---
 gentoopm/basepm/metadata.py |   22 ++++++++--------------
 gentoopm/paludispm/pkg.py   |   16 ----------------
 gentoopm/pkgcorepm/pkg.py   |   24 ------------------------
 gentoopm/portagepm/pkg.py   |   16 ----------------
 4 files changed, 8 insertions(+), 70 deletions(-)

diff --git a/gentoopm/basepm/metadata.py b/gentoopm/basepm/metadata.py
index f2f6bc8..526c58e 100644
--- a/gentoopm/basepm/metadata.py
+++ b/gentoopm/basepm/metadata.py
@@ -23,8 +23,7 @@ metadata_keys = (
 	'INHERITED', 'DEFINED_PHASES',
 
 	# other useful ebuild vars
-	'CATEGORY', 'PN', 'PV', 'PR',
-	'P', 'PVR', 'PF'
+	'CATEGORY'
 )
 """ A common supported metadata key list. """
 
@@ -75,16 +74,11 @@ class PMPackageMetadata(ABCObject):
 
 	# Other useful ebuild vars.
 
-	CATEGORY = abstractproperty()
-	PN = abstractproperty()
-	PV = abstractproperty()
-	PR = abstractproperty()
-	PVR = abstractproperty()
-
-	@property
-	def P(self):
-		return '%s-%s' % (self.PN, self.PV) # XXX?
+	@abstractproperty
+	def CATEGORY(self):
+		"""
+		Package category.
 
-	@property
-	def PF(self):
-		return '%s-%s' % (self.PN, self.PVR) # XXX?
+		@type: string
+		"""
+		pass

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 5bb8123..5a34802 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -99,19 +99,3 @@ class PaludisMetadata(PMPackageMetadata):
 	@property
 	def CATEGORY(self):
 		return str(self._pkg.name.category)
-
-	@property
-	def PN(self):
-		return str(self._pkg.name.package)
-
-	@property
-	def PV(self):
-		return str(self._pkg.version.remove_revision())
-
-	@property
-	def PR(self):
-		return str(self._pkg.version.revision_only())
-
-	@property
-	def PVR(self):
-		return str(self._pkg.version)

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index f26cdbd..1fc59dc 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -84,27 +84,3 @@ class PkgCoreMetadata(PMPackageMetadata):
 	@property
 	def CATEGORY(self):
 		return self._pkg.category
-
-	@property
-	def PN(self):
-		return self._pkg.PN
-
-	@property
-	def PV(self):
-		return self._pkg.version
-
-	@property
-	def PR(self):
-		return 'r%d' % self._pkg.PR
-
-	@property
-	def P(self):
-		return self._pkg.P
-
-	@property
-	def PVR(self):
-		return self._pkg.fullver
-
-	@property
-	def PF(self):
-		return self._pkg.PF

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index cb17e0e..ff80ae5 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -87,22 +87,6 @@ class PortageDBMetadata(PMPackageMetadata):
 	def CATEGORY(self):
 		return catsplit(self._cpv)[0]
 
-	@property
-	def PN(self):
-		return catpkgsplit(self._cpv)[1]
-
-	@property
-	def PV(self):
-		return pkgsplit(self._cpv)[1]
-
-	@property
-	def PR(self):
-		return pkgsplit(self._cpv)[2]
-
-	@property
-	def PVR(self):
-		return cpv_getversion(self._cpv)
-
 class PortageMetadata(PortageDBMetadata):
 	def __init__(self, cpv, dbapi, tree):
 		PortageDBMetadata.__init__(self, cpv, dbapi)



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-13 16:09 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-13 16:09 UTC (permalink / raw
  To: gentoo-commits

commit:     ac1128977cd963fdd93b809c69c73e0e277a749a
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 13 15:57:55 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jul 13 15:57:55 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=ac112897

Support getting atoms off PMPackages.

---
 gentoopm/basepm/pkg.py     |    9 +++++++++
 gentoopm/paludispm/pkg.py  |    8 +++++++-
 gentoopm/paludispm/repo.py |    2 +-
 gentoopm/pkgcorepm/pkg.py  |    4 ++++
 gentoopm/portagepm/pkg.py  |    4 ++++
 5 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index f91c52f..dc0364b 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -215,6 +215,15 @@ class PMPackage(ABCObject):
 		pass
 
 	@abstractproperty
+	def atom(self):
+		"""
+		Return an atom matching the package uniquely.
+
+		@type: L{PMAtom}
+		"""
+		pass
+
+	@abstractproperty
 	def path(self):
 		"""
 		Return path to the ebuild file (or vardb entry) if appropriate.

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 8907c15..2ba12d8 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -42,10 +42,11 @@ class PaludisFilteredPackageSet(PMFilteredPackageSet, PaludisPackageSet):
 		PMFilteredPackageSet.__init__(self, pset, args, kwargs)
 
 class PaludisID(PMPackage):
-	def __init__(self, pkg, num = 0, enum_id = None):
+	def __init__(self, pkg, num = 0, enum_id = None, env = None):
 		self._pkg = pkg
 		self._num = num
 		self._enum_id = enum_id
+		self._env = env
 
 	@property
 	def metadata(self):
@@ -63,6 +64,11 @@ class PaludisID(PMPackage):
 	def id(self):
 		return str(self._pkg)
 
+	@property
+	def atom(self):
+		# XXX: newer version wraps getting atom
+		return PaludisAtom('=%s' % self.id, self._env)
+
 	def __cmp__(self, other):
 		if not isinstance(other, PaludisID):
 			raise TypeError('Unable to compare %s against %s' % \

diff --git a/gentoopm/paludispm/repo.py b/gentoopm/paludispm/repo.py
index 8296dbb..6a47596 100644
--- a/gentoopm/paludispm/repo.py
+++ b/gentoopm/paludispm/repo.py
@@ -39,7 +39,7 @@ class PaludisRepository(PMRepository, PaludisPackageSet):
 		enum = PaludisEnumID()
 		for i, p in enumerate(self._env[paludis.Selection.AllVersionsSorted(
 				paludis.FilteredGenerator(self._gen, self._filt))]):
-			yield PaludisID(p, i, enum)
+			yield PaludisID(p, i, enum, self._env)
 
 	def filter(self, *args, **kwargs):
 		pset = self

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 8e344d0..d621b70 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -41,6 +41,10 @@ class PkgCorePackage(PMPackage):
 		else:
 			return self._pkg.cpvstr
 
+	@property
+	def atom(self):
+		return PkgCoreAtom('=%s' % self.id)
+
 	def __cmp__(self, other):
 		if not isinstance(other, PkgCorePackage):
 			raise TypeError('Unable to compare %s against %s' % \

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 406ded4..dd48252 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -43,6 +43,10 @@ class PortageDBCPV(PMPackage):
 	def id(self):
 		return self._cpv
 
+	@property
+	def atom(self):
+		return PkgCoreAtom('=%s' % self.id)
+
 class PortageCPV(PortageDBCPV):
 	def __init__(self, cpv, dbapi, tree, repo_prio):
 		PortageDBCPV.__init__(self, cpv, dbapi)



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-13 16:09 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-13 16:09 UTC (permalink / raw
  To: gentoo-commits

commit:     856eed58f9936b1178f262f6f1c8f28ce184bd5c
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 13 15:40:16 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jul 13 15:40:16 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=856eed58

Support stringifying atoms.

---
 gentoopm/basepm/atom.py    |   10 ++++++++++
 gentoopm/paludispm/atom.py |    8 ++++++++
 gentoopm/pkgcorepm/atom.py |    7 +++++++
 gentoopm/portagepm/atom.py |    8 +++++++-
 4 files changed, 32 insertions(+), 1 deletions(-)

diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py
index bd631f8..6ad5647 100644
--- a/gentoopm/basepm/atom.py
+++ b/gentoopm/basepm/atom.py
@@ -32,3 +32,13 @@ class PMAtom(ABCObject):
 		@type pkg: L{PMPackage}
 		"""
 		pass
+
+	@abstractmethod
+	def __str__(self):
+		"""
+		Return the string representation of the atom.
+
+		If the atom is incomplete (misses a category), the result is undefined.
+		It can raise an exception then.
+		"""
+		pass

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
index 38557ce..2b03d41 100644
--- a/gentoopm/paludispm/atom.py
+++ b/gentoopm/paludispm/atom.py
@@ -31,6 +31,14 @@ class PaludisAtom(PMAtom):
 		except InvalidAtomStringError:
 			# try */ for the category
 			self._init_atom(_category_wildcard_re.sub(r'*/\g<0>', s, 1), env, True)
+			self._incomplete = True
+		else:
+			self._incomplete = False
 
 	def __contains__(self, pkg):
 		raise NotImplementedError('Direct atom matching not implemented in Paludis')
+
+	def __str__(self):
+		if self._incomplete:
+			raise ValueError('Unable to stringify incomplete atom')
+		return str(self._atom)

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
index 62043ae..9eb59a6 100644
--- a/gentoopm/pkgcorepm/atom.py
+++ b/gentoopm/pkgcorepm/atom.py
@@ -3,6 +3,7 @@
 # (c) 2011 Michał Górny <mgorny@gentoo.org>
 # Released under the terms of the 2-clause BSD license.
 
+from pkgcore.ebuild.atom import atom
 from pkgcore.util.parserestrict import parse_match
 
 from gentoopm.basepm.atom import PMAtom
@@ -13,3 +14,9 @@ class PkgCoreAtom(PMAtom):
 
 	def __contains__(self, pkg):
 		return self._r.match(pkg._pkg)
+
+	def __str__(self):
+		if isinstance(self._r, atom):
+			return str(self._r)
+		else:
+			raise ValueError('Unable to stringify incomplete atom')

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
index 7614298..63fcbef 100644
--- a/gentoopm/portagepm/atom.py
+++ b/gentoopm/portagepm/atom.py
@@ -44,6 +44,9 @@ class CompletePortageAtom(PMAtom):
 		return not self._atom.slot \
 				or self._atom.slot == pkg.metadata.SLOT
 
+	def __str__(self):
+		return str(self._atom)
+
 class UncategorisedPackageWrapper(object):
 	def __init__(self, pkg):
 		self._pkg = pkg
@@ -52,7 +55,7 @@ class UncategorisedPackageWrapper(object):
 	def id(self):
 		cpv = self._pkg.id
 		return 'null/%s' % catsplit(cpv)[1]
-				
+
 class UnexpandedPortageAtom(CompletePortageAtom):
 	"""
 	An atom without a category specified.
@@ -61,3 +64,6 @@ class UnexpandedPortageAtom(CompletePortageAtom):
 	def __contains__(self, pkg):
 		return CompletePortageAtom.__contains__(self,
 				UncategorisedPackageWrapper(pkg))
+
+	def __str__(self):
+		raise ValueError('Unable to stringify incomplete atom')



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-12  8:31 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-12  8:31 UTC (permalink / raw
  To: gentoo-commits

commit:     ea265082ce8693c15c196cec6e743347b152341e
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Tue Jul 12 08:32:31 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Tue Jul 12 08:32:31 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=ea265082

Add abstract configuration interface.

---
 gentoopm/basepm/__init__.py    |    9 +++++++++
 gentoopm/basepm/config.py      |   11 +++++++++++
 gentoopm/paludispm/__init__.py |    5 +++++
 gentoopm/paludispm/config.py   |   10 ++++++++++
 gentoopm/pkgcorepm/__init__.py |    5 +++++
 gentoopm/pkgcorepm/config.py   |   10 ++++++++++
 gentoopm/portagepm/__init__.py |    5 +++++
 gentoopm/portagepm/config.py   |   10 ++++++++++
 8 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/gentoopm/basepm/__init__.py b/gentoopm/basepm/__init__.py
index 10a727c..2e61d2a 100644
--- a/gentoopm/basepm/__init__.py
+++ b/gentoopm/basepm/__init__.py
@@ -72,3 +72,12 @@ class PackageManager(ABCObject):
 		@type: L{PMAtom}
 		"""
 		pass
+
+	@abstractproperty
+	def config(self):
+		"""
+		The PM config instance.
+
+		@type: L{PMConfig}
+		"""
+		pass

diff --git a/gentoopm/basepm/config.py b/gentoopm/basepm/config.py
new file mode 100644
index 0000000..90dbb67
--- /dev/null
+++ b/gentoopm/basepm/config.py
@@ -0,0 +1,11 @@
+#!/usr/bin/python
+#	vim:fileencoding=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from abc import abstractproperty
+
+from gentoopm.util import ABCObject
+
+class PMConfig(ABCObject):
+	pass

diff --git a/gentoopm/paludispm/__init__.py b/gentoopm/paludispm/__init__.py
index cb7fc69..a64657e 100644
--- a/gentoopm/paludispm/__init__.py
+++ b/gentoopm/paludispm/__init__.py
@@ -7,6 +7,7 @@ import functools, paludis
 
 from gentoopm.basepm import PackageManager
 from gentoopm.paludispm.atom import PaludisAtom
+from gentoopm.paludispm.config import PaludisConfig
 from gentoopm.paludispm.repo import PaludisRepoDict, PaludisInstalledRepo, \
 		PaludisStackRepo
 
@@ -31,3 +32,7 @@ class PaludisPM(PackageManager):
 	@property
 	def Atom(self):
 		return functools.partial(PaludisAtom, env = self._env)
+
+	@property
+	def config(self):
+		return PaludisConfig(self._env)

diff --git a/gentoopm/paludispm/config.py b/gentoopm/paludispm/config.py
new file mode 100644
index 0000000..f58803f
--- /dev/null
+++ b/gentoopm/paludispm/config.py
@@ -0,0 +1,10 @@
+#!/usr/bin/python
+#	vim:fileencoding=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from gentoopm.basepm.config import PMConfig
+
+class PaludisConfig(PMConfig):
+	def __init__(self, env):
+		self._env = env

diff --git a/gentoopm/pkgcorepm/__init__.py b/gentoopm/pkgcorepm/__init__.py
index daf6bf5..10a5390 100644
--- a/gentoopm/pkgcorepm/__init__.py
+++ b/gentoopm/pkgcorepm/__init__.py
@@ -7,6 +7,7 @@ from pkgcore.config import load_config
 
 from gentoopm.basepm import PackageManager
 from gentoopm.pkgcorepm.atom import PkgCoreAtom
+from gentoopm.pkgcorepm.config import PkgCoreConfig
 from gentoopm.pkgcorepm.repo import PkgCoreRepoDict, \
 		PkgCoreInstalledRepo
 
@@ -28,3 +29,7 @@ class PkgCorePM(PackageManager):
 	@property
 	def Atom(self):
 		return PkgCoreAtom
+
+	@property
+	def config(self):
+		return PkgCoreConfig(self._domain)

diff --git a/gentoopm/pkgcorepm/config.py b/gentoopm/pkgcorepm/config.py
new file mode 100644
index 0000000..3056268
--- /dev/null
+++ b/gentoopm/pkgcorepm/config.py
@@ -0,0 +1,10 @@
+#!/usr/bin/python
+#	vim:fileencoding=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from gentoopm.basepm.config import PMConfig
+
+class PkgCoreConfig(PMConfig):
+	def __init__(self, domain):
+		self._domain = domain

diff --git a/gentoopm/portagepm/__init__.py b/gentoopm/portagepm/__init__.py
index 6bade14..797a58b 100644
--- a/gentoopm/portagepm/__init__.py
+++ b/gentoopm/portagepm/__init__.py
@@ -8,6 +8,7 @@ from portage import create_trees
 
 from gentoopm.basepm import PackageManager
 from gentoopm.portagepm.atom import PortageAtom
+from gentoopm.portagepm.config import PortageConfig
 from gentoopm.portagepm.repo import PortageRepoDict, VDBRepository
 
 class PortagePM(PackageManager):
@@ -33,3 +34,7 @@ class PortagePM(PackageManager):
 	@property
 	def Atom(self):
 		return PortageAtom
+
+	@property
+	def config(self):
+		return PortageConfig(self._portdb.settings)

diff --git a/gentoopm/portagepm/config.py b/gentoopm/portagepm/config.py
new file mode 100644
index 0000000..5f80506
--- /dev/null
+++ b/gentoopm/portagepm/config.py
@@ -0,0 +1,10 @@
+#!/usr/bin/python
+#	vim:fileencoding=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from gentoopm.basepm.config import PMConfig
+
+class PortageConfig(PMConfig):
+	def __init__(self, settings):
+		self._settings = settings



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-07 12:52 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-07 12:52 UTC (permalink / raw
  To: gentoo-commits

commit:     6fa4141e824d4a4931297437d51c23c9238c836e
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul  7 12:45:35 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul  7 12:45:35 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=6fa4141e

Introduce an API for getting Atom class.

---
 gentoopm/basepm/__init__.py    |    7 +++++++
 gentoopm/basepm/atom.py        |   14 ++++++++++++++
 gentoopm/paludispm/__init__.py |    5 +++++
 gentoopm/paludispm/atom.py     |    9 +++++++++
 gentoopm/pkgcorepm/__init__.py |    5 +++++
 gentoopm/pkgcorepm/atom.py     |    9 +++++++++
 gentoopm/portagepm/__init__.py |    5 +++++
 gentoopm/portagepm/atom.py     |    9 +++++++++
 8 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/gentoopm/basepm/__init__.py b/gentoopm/basepm/__init__.py
index 832bd5d..9b33f1b 100644
--- a/gentoopm/basepm/__init__.py
+++ b/gentoopm/basepm/__init__.py
@@ -57,3 +57,10 @@ class PackageManager(ABCObject):
 		the repo being the lowest-level key.
 		"""
 		return PMRepoStackWrapper(self.repositories)
+
+	@abstractproperty
+	def Atom(self):
+		"""
+		Return the PM-specific atom class.
+		"""
+		pass

diff --git a/gentoopm/basepm/atom.py b/gentoopm/basepm/atom.py
new file mode 100644
index 0000000..9fa1c41
--- /dev/null
+++ b/gentoopm/basepm/atom.py
@@ -0,0 +1,14 @@
+#!/usr/bin/python
+#	vim:fileencoding=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from abc import abstractmethod, abstractproperty
+
+from gentoopm.util import ABCObject
+
+class PMAtom(ABCObject):
+	"""
+	A base class for PM-specific atom (dependency specification).
+	"""
+	pass

diff --git a/gentoopm/paludispm/__init__.py b/gentoopm/paludispm/__init__.py
index e06b5aa..3a70297 100644
--- a/gentoopm/paludispm/__init__.py
+++ b/gentoopm/paludispm/__init__.py
@@ -6,6 +6,7 @@
 import paludis
 
 from gentoopm.basepm import PackageManager
+from gentoopm.paludispm.atom import PaludisAtom
 from gentoopm.paludispm.repo import PaludisRepoDict, PaludisInstalledRepo, \
 		PaludisStackRepo
 
@@ -26,3 +27,7 @@ class PaludisPM(PackageManager):
 	@property
 	def stack(self):
 		return PaludisStackRepo(self._env)
+
+	@property
+	def Atom(self):
+		return PaludisAtom

diff --git a/gentoopm/paludispm/atom.py b/gentoopm/paludispm/atom.py
new file mode 100644
index 0000000..541470a
--- /dev/null
+++ b/gentoopm/paludispm/atom.py
@@ -0,0 +1,9 @@
+#!/usr/bin/python
+#	vim:fileencoding=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from gentoopm.basepm.atom import PMAtom
+
+class PkgCoreAtom(PMAtom):
+	pass

diff --git a/gentoopm/pkgcorepm/__init__.py b/gentoopm/pkgcorepm/__init__.py
index 5a3695a..daf6bf5 100644
--- a/gentoopm/pkgcorepm/__init__.py
+++ b/gentoopm/pkgcorepm/__init__.py
@@ -6,6 +6,7 @@
 from pkgcore.config import load_config
 
 from gentoopm.basepm import PackageManager
+from gentoopm.pkgcorepm.atom import PkgCoreAtom
 from gentoopm.pkgcorepm.repo import PkgCoreRepoDict, \
 		PkgCoreInstalledRepo
 
@@ -23,3 +24,7 @@ class PkgCorePM(PackageManager):
 	@property
 	def installed(self):
 		return PkgCoreInstalledRepo(self._domain.named_repos['vdb'])
+
+	@property
+	def Atom(self):
+		return PkgCoreAtom

diff --git a/gentoopm/pkgcorepm/atom.py b/gentoopm/pkgcorepm/atom.py
new file mode 100644
index 0000000..541470a
--- /dev/null
+++ b/gentoopm/pkgcorepm/atom.py
@@ -0,0 +1,9 @@
+#!/usr/bin/python
+#	vim:fileencoding=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from gentoopm.basepm.atom import PMAtom
+
+class PkgCoreAtom(PMAtom):
+	pass

diff --git a/gentoopm/portagepm/__init__.py b/gentoopm/portagepm/__init__.py
index 0919916..2ee6bf9 100644
--- a/gentoopm/portagepm/__init__.py
+++ b/gentoopm/portagepm/__init__.py
@@ -7,6 +7,7 @@ import os
 from portage import create_trees
 
 from gentoopm.basepm import PackageManager
+from gentoopm.portagepm.atom import PortageAtom
 from gentoopm.portagepm.repo import PortageRepoDict, VDBRepository
 
 class PortagePM(PackageManager):
@@ -28,3 +29,7 @@ class PortagePM(PackageManager):
 	@property
 	def installed(self):
 		return VDBRepository(self._vardb)
+
+	@property
+	def Atom(self):
+		return PortageAtom

diff --git a/gentoopm/portagepm/atom.py b/gentoopm/portagepm/atom.py
new file mode 100644
index 0000000..541470a
--- /dev/null
+++ b/gentoopm/portagepm/atom.py
@@ -0,0 +1,9 @@
+#!/usr/bin/python
+#	vim:fileencoding=utf-8
+# (c) 2011 Michał Górny <mgorny@gentoo.org>
+# Released under the terms of the 2-clause BSD license.
+
+from gentoopm.basepm.atom import PMAtom
+
+class PkgCoreAtom(PMAtom):
+	pass



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-07  9:51 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-07  9:51 UTC (permalink / raw
  To: gentoo-commits

commit:     50e85c27b5ceb42e7e0cd3a20c0cd8639ba886cf
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Jul  7 09:05:35 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Jul  7 09:05:35 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=50e85c27

Fix .best to check package key matches.

---
 gentoopm/basepm/pkg.py    |   19 ++++++++++++++++---
 gentoopm/paludispm/pkg.py |    4 ++++
 gentoopm/pkgcorepm/pkg.py |    4 ++++
 gentoopm/portagepm/pkg.py |    4 ++++
 4 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 8f94833..9365465 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -40,12 +40,17 @@ class PMPackageSet(ABCObject):
 		Return the best-matching package in the set (i.e. flatten it, sort
 		the results and return the first one).
 		"""
+
+		l = sorted(self, reverse = True)
 		try:
-			return sorted(self, reverse = True)[0]
+			best = l[0]
 		except IndexError:
 			raise TypeError('.best called on an empty set')
-		except TypeError:
-			raise KeyError('.best called on a set of differently-named packages')
+
+		for p in l:
+			if p.key != best.key:
+				raise KeyError('.best called on a set of differently-named packages')
+		return best
 
 	def select(self, *args, **kwargs):
 		"""
@@ -100,6 +105,14 @@ class PMPackage(ABCObject):
 		return True
 
 	@abstractproperty
+	def key(self):
+		"""
+		Return the key identifying the package. This is used by .best, to check
+		whether the set doesn't reference more than one package.
+		"""
+		pass
+
+	@abstractproperty
 	def id(self):
 		"""
 		Return an unique identifier for the package.

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 1ae6fda..017cd07 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -23,6 +23,10 @@ class PaludisID(PMPackage):
 		return self._pkg.fs_location_key().parse_value()
 
 	@property
+	def key(self):
+		return str(self._pkg.name)
+
+	@property
 	def id(self):
 		return str(self._pkg)
 

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 81614a0..5c33a46 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -20,6 +20,10 @@ class PkgCorePackage(PMPackage):
 		return self._pkg.path
 
 	@property
+	def key(self):
+		return self._pkg.key
+
+	@property
 	def id(self):
 		return '%s::%s' % (self._pkg.cpvstr, self._pkg.repo.repo_id)
 

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index b95a0e8..0163bee 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -42,6 +42,10 @@ class PortageCPV(PortageDBCPV):
 		return self._dbapi.findname(self._cpv, self._tree)
 
 	@property
+	def key(self):
+		return cpv_getkey(self._cpv)
+
+	@property
 	def id(self):
 		return '%s::%s' % (self._cpv, self._dbapi.getRepositoryName(self._tree))
 



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-06 20:54 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-06 20:54 UTC (permalink / raw
  To: gentoo-commits

commit:     43815c3325141e955f11c8daf147334329b04480
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jul  6 20:54:01 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jul  6 20:54:01 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=43815c33

Support getting IDs for packages.

---
 gentoopm/basepm/pkg.py    |   10 ++++++++++
 gentoopm/paludispm/pkg.py |    4 ++++
 gentoopm/pkgcorepm/pkg.py |    4 ++++
 gentoopm/portagepm/pkg.py |    8 ++++++++
 4 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 39514cd..4c71c62 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -101,6 +101,13 @@ class PMPackage(ABCObject):
 		yield self
 
 	@abstractproperty
+	def id(self):
+		"""
+		Return an unique identifier for the package.
+		"""
+		pass
+
+	@abstractproperty
 	def path(self):
 		"""
 		Return path to the ebuild file (or vardb entry) if appropriate.
@@ -114,3 +121,6 @@ class PMPackage(ABCObject):
 		Return PMPackageMetadata object for the package.
 		"""
 		pass
+
+	def __repr__(self):
+		return '%s(%s)' % (self.__class__.__name__, repr(self.id))

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index 99fc707..1ae6fda 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -22,6 +22,10 @@ class PaludisID(PMPackage):
 	def path(self):
 		return self._pkg.fs_location_key().parse_value()
 
+	@property
+	def id(self):
+		return str(self._pkg)
+
 	def __cmp__(self, other):
 		if not isinstance(other, PaludisID):
 			raise TypeError('Unable to compare %s against %s' % \

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 8407c7e..81614a0 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -19,6 +19,10 @@ class PkgCorePackage(PMPackage):
 	def path(self):
 		return self._pkg.path
 
+	@property
+	def id(self):
+		return '%s::%s' % (self._pkg.cpvstr, self._pkg.repo.repo_id)
+
 	def __cmp__(self, other):
 		if not isinstance(other, PkgCorePackage):
 			raise TypeError('Unable to compare %s against %s' % \

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index e5e9469..b95a0e8 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -23,6 +23,10 @@ class PortageDBCPV(PMPackage):
 		# .findname() gives .ebuild path
 		return self._dbapi.getpath(self._cpv)
 
+	@property
+	def id(self):
+		return self._cpv
+
 class PortageCPV(PortageDBCPV):
 	def __init__(self, cpv, dbapi, tree, repo_prio):
 		PortageDBCPV.__init__(self, cpv, dbapi)
@@ -37,6 +41,10 @@ class PortageCPV(PortageDBCPV):
 	def path(self):
 		return self._dbapi.findname(self._cpv, self._tree)
 
+	@property
+	def id(self):
+		return '%s::%s' % (self._cpv, self._dbapi.getRepositoryName(self._tree))
+
 	def __cmp__(self, other):
 		if not isinstance(other, PortageCPV):
 			raise TypeError('Unable to compare %s against %s' % \



^ permalink raw reply related	[flat|nested] 37+ messages in thread
* [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/
@ 2011-07-06 16:03 Michał Górny
  0 siblings, 0 replies; 37+ messages in thread
From: Michał Górny @ 2011-07-06 16:03 UTC (permalink / raw
  To: gentoo-commits

commit:     195ba334eec316454996d4e8552afaeb0de1dd4d
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Wed Jul  6 15:29:51 2011 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Wed Jul  6 15:29:51 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=195ba334

Get rid of structured tree, just use flat interface.

---
 gentoopm/basepm/pkg.py         |  154 +++-------------------------------------
 gentoopm/basepm/repo.py        |   19 +----
 gentoopm/basepm/stack.py       |   76 ++------------------
 gentoopm/paludispm/pkg.py      |   42 +----------
 gentoopm/paludispm/repo.py     |   31 +++-----
 gentoopm/pkgcorepm/pkg.py      |   50 +------------
 gentoopm/pkgcorepm/repo.py     |   16 +----
 gentoopm/portagepm/__init__.py |    2 +-
 gentoopm/portagepm/db.py       |   64 +++++++----------
 gentoopm/portagepm/pkg.py      |   57 ++-------------
 gentoopm/portagepm/repo.py     |   13 ++--
 11 files changed, 81 insertions(+), 443 deletions(-)

diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py
index 9b2a796..39514cd 100644
--- a/gentoopm/basepm/pkg.py
+++ b/gentoopm/basepm/pkg.py
@@ -3,58 +3,10 @@
 # (c) 2011 Michał Górny <mgorny@gentoo.org>
 # Released under the terms of the 2-clause BSD license.
 
-import collections
 from abc import abstractmethod, abstractproperty
 
 from gentoopm.util import ABCObject
 
-class PMKeyedPackageBase(ABCObject):
-	"""
-	Base class for key-identified package sets.
-	"""
-
-	def __init__(self, key, parent):
-		self._key_ = key
-		self._parent_ = parent
-
-	@property
-	def _parent(self):
-		"""
-		A parent (higher level) PMKeyedPackageDict or None if top-level.
-		"""
-		return self._parent_
-
-	@property
-	def _key(self):
-		"""
-		The key for this level of PMKeyedPackageDict.
-		"""
-		return self._key_
-
-	@abstractproperty
-	def _key_name(self):
-		"""
-		The metadata key name for this key.
-		"""
-		pass
-
-	@property
-	def key(self):
-		"""
-		The set of keys uniquely identifying the package set (i.e. the parent
-		keys and this one).
-		"""
-		key_names = []
-		keys = []
-		o = self
-		while o and o._key is not None:
-			keys.insert(0, o._key)
-			key_names.insert(0, o._key_name)
-			o = o._parent
-		t = collections.namedtuple('%sKeyTuple' % self.__class__.__name__,
-				' '.join(key_names))
-		return t(*keys)
-
 class PMPackageSet(ABCObject):
 	@abstractmethod
 	def __iter__(self):
@@ -63,13 +15,6 @@ class PMPackageSet(ABCObject):
 		"""
 		pass
 
-	@property
-	def flattened(self):
-		"""
-		Flatten the package set and iterate over it. Yield PMPackages.
-		"""
-		return PMFlattenedPackageSet(iter(self))
-
 	def filter(self, *args, **kwargs):
 		"""
 		Filter the packages based on keys passed as arguments. Positional
@@ -89,32 +34,7 @@ class PMPackageSet(ABCObject):
 		can provide a class with __eq__() redefined as an argument.
 		"""
 
-		myargs = collections.defaultdict(lambda: None, enumerate(args))
-		mykwargs = collections.defaultdict(lambda: None, **kwargs)
-
-		i = 0
-		try:
-			el = next(iter(self))
-		except StopIteration:
-			return PMFilteredPackageSet((), None, None, None)
-		else:
-			k = el._key_name
-			if myargs[i] is not None:
-				if mykwargs[k] is not None:
-					raise TypeError('args[%d] and kwargs[%s] refer to the same key.' % \
-							(i, k))
-				m = myargs[i]
-			else:
-				m = mykwargs[k]
-
-			newargs = args[1:]
-			newkwargs = kwargs.copy()
-			try:
-				del newkwargs[k]
-			except KeyError:
-				pass
-
-			return PMFilteredPackageSet(iter(self), m, newargs, newkwargs)
+		return PMFilteredPackageSet(iter(self), args, kwargs)
 
 	@property
 	def best(self):
@@ -123,7 +43,7 @@ class PMPackageSet(ABCObject):
 		the results and return the first one).
 		"""
 		try:
-			return sorted(self.flattened, reverse = True)[0]
+			return sorted(self, reverse = True)[0]
 		except IndexError:
 			raise TypeError('.best called on an empty set')
 		except TypeError:
@@ -143,76 +63,23 @@ class PMPackageSet(ABCObject):
 			raise ValueError('Ambiguous filter (matches more than a single package name).')
 
 class PMFilteredPackageSet(PMPackageSet):
-	def __init__(self, it, key, newargs, newkwargs):
+	def __init__(self, it, args, kwargs):
 		self._iter = it
-		self._key = key
-		self._newargs = newargs
-		self._newkwargs = newkwargs
+		self._args = args
+		self._kwargs = kwargs
 
 	def __iter__(self):
 		for el in self._iter:
-			if self._key is None or self._key == el._key:
-				if self._newargs or self._newkwargs:
-					for i in el.filter(*self._newargs, **self._newkwargs):
-						yield i
-				else:
-					yield el
-
-class PMFlattenedPackageSet(PMPackageSet):
-	def __init__(self, it):
-		self._iter = it
-	
-	def __iter__(self):
-		for i in self._iter:
-			if isinstance(i, PMKeyedPackageDict):
-				for hi in i.flattened:
-					yield hi
-			else:
-				yield i
-
-class PMKeyedPackageDict(PMKeyedPackageBase, PMPackageSet):
-	"""
-	A dict-like object representing a set of packages matched by a N-level key.
-	If it's a last-level key, the dict evaluates to PMPackage subclass
-	instances. Otherwise, it evaluates to lower-level PMKeyedPackageDicts.
+			for x in el.filter(*self._args, **self._kwargs):
+				yield x
 
-	Usually, the highest level PMKeyedPackageDict is PMRepository. Then dicts
-	refer to the category, package name and finally version (where they
-	transform into PMPackages).
-	"""
-
-	@abstractmethod
-	def __iter__(self):
-		"""
-		Iterate over child PMKeyedPackageDicts or PMPackages when bottom-level.
-		"""
-		pass
-
-	def __getitem__(self, key):
-		"""
-		Get a sub-item matching the key.
-		"""
-		for i in self:
-			if i._key == key:
-				return i
-		else:
-			raise KeyError('No packages match keyset: (%s)' % \
-					', '.join(self.key + [key]))
-
-class PMPackage(PMKeyedPackageBase):
+class PMPackage(ABCObject):
 	"""
 	An abstract class representing a single, uniquely-keyed package
 	in the package tree.
 	"""
 
-	@property
-	def flattened(self):
-		"""
-		A convenience property. Returns the package itself, as an iterator.
-		"""
-		yield self
-
-	def filter(self, *args, **kwargs):
+	def filter(self, **kwargs):
 		"""
 		Filter packages on metadata. This is mostly to extend superclass
 		.filter() method.
@@ -222,9 +89,6 @@ class PMPackage(PMKeyedPackageBase):
 		returns an iterator -- either over the package itself or an empty one.
 		"""
 
-		if args:
-			raise IndexError('Unused positional arguments: %s' % args)
-
 		for k, m in kwargs.items():
 			try:
 				v = self.metadata[k]

diff --git a/gentoopm/basepm/repo.py b/gentoopm/basepm/repo.py
index 80ea4b7..5b1bac0 100644
--- a/gentoopm/basepm/repo.py
+++ b/gentoopm/basepm/repo.py
@@ -6,9 +6,10 @@
 import os.path
 from abc import abstractmethod, abstractproperty
 
-from gentoopm.basepm.pkg import PMKeyedPackageDict
+from gentoopm.basepm.pkg import PMPackageSet
+from gentoopm.util import ABCObject
 
-class PMRepositoryDict(PMKeyedPackageDict):
+class PMRepositoryDict(ABCObject):
 	"""
 	A dict-like object providing access to a set of repositories.
 
@@ -17,10 +18,6 @@ class PMRepositoryDict(PMKeyedPackageDict):
 	subclass.
 	"""
 
-	_key = None
-	_key_name = None
-	_parent = None
-
 	def __getitem__(self, key):
 		"""
 		Get the repository by its name or path. If using a path as a key,
@@ -48,23 +45,15 @@ class PMRepositoryDict(PMKeyedPackageDict):
 		"""
 		pass
 
-class PMRepository(PMKeyedPackageDict):
+class PMRepository(PMPackageSet):
 	"""
 	Base abstract class for a single repository.
 	"""
-	_key_name = None
-	_parent = None
-	_key = None
 
 class PMEbuildRepository(PMRepository):
 	"""
 	Base abstract class for an ebuild repository (on livefs).
 	"""
-	_key_name = 'REPOSITORY'
-
-	@property
-	def _key(self):
-		return self.name
 
 	@abstractproperty
 	def name(self):

diff --git a/gentoopm/basepm/stack.py b/gentoopm/basepm/stack.py
index 4febc07..ab13dd3 100644
--- a/gentoopm/basepm/stack.py
+++ b/gentoopm/basepm/stack.py
@@ -3,77 +3,13 @@
 # (c) 2011 Michał Górny <mgorny@gentoo.org>
 # Released under the terms of the 2-clause BSD license.
 
-import collections
-
-from gentoopm.basepm.pkg import PMKeyedPackageDict, PMPackage
 from gentoopm.basepm.repo import PMRepository
 
-class PMPackageWrapper(PMPackage):
-	_key_name = 'REPOSITORY'
-
-	def __init__(self, wrapped, parent):
-		self._wrapped = wrapped
-		self._parent_ = parent
-
-	@property
-	def metadata(self):
-		return self._wrapped.metadata
-
-	@property
-	def _key(self):
-		return self._repo._key
-
-	@property
-	def _repo(self):
-		p = self._wrapped._parent
-		while p._key_name != 'REPOSITORY':
-			p = p._parent
-		return p
-
-	@property
-	def path(self):
-		return self._wrapped.path
-
-	def __cmp__(self, other):
-		r = cmp(self._wrapped, other._wrapped)
-		if r == 0:
-			return cmp(self._repo, other._repo)
-		return r
-
-class PMStackWrapper(PMKeyedPackageDict):
-	def __init__(self, wrapped, parent):
-		self._wrapped = wrapped
-		self._parent_ = parent
+class PMRepoStackWrapper(PMRepository):
+	def __init__(self, repos):
+		self._repos = repos
 
 	def __iter__(self):
-		keys = collections.defaultdict(list)
-		for r in self._wrapped:
-			if isinstance(r, PMPackage):
-				yield PMPackageWrapper(r, self)
-			else:
-				for wr in r:
-					keys[wr._key].append(wr)
-		for k, l in keys.items():
-			yield PMStackWrapper(l, self)
-
-	@property
-	def _key(self):
-		try:
-			return self._wrapped[0]._key
-		except IndexError:
-			return None
-
-	@property
-	def _key_name(self):
-		try:
-			return self._wrapped[0]._key_name
-		except IndexError:
-			return None
-
-class PMRepoStackWrapper(PMStackWrapper, PMRepository):
-	_key_name = None
-	_key = None
-	_parent = None
-
-	def __init__(self, repos):
-		self._wrapped = repos
+		for r in self._repos:
+			for p in r:
+				yield p

diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py
index e83816f..c816f96 100644
--- a/gentoopm/paludispm/pkg.py
+++ b/gentoopm/paludispm/pkg.py
@@ -6,49 +6,11 @@
 import paludis
 
 from gentoopm.basepm.metadata import PMPackageMetadata
-from gentoopm.basepm.pkg import PMKeyedPackageDict, PMPackage
-from gentoopm.util import IterDictWrapper
-
-class PaludisCategory(PMKeyedPackageDict):
-	_key_name = 'CATEGORY'
-	def __init__(self, category, parent):
-		PMKeyedPackageDict.__init__(self, str(category), parent)
-
-	def __iter__(self):
-		repo = self._parent
-		for p in repo._repo.package_names(self._key, []):
-			yield PaludisPackage(p, self)
-
-	@property
-	def packages(self):
-		"""
-		A convenience wrapper for the package list.
-		"""
-		return IterDictWrapper(self)
-
-class PaludisPackage(PMKeyedPackageDict):
-	_key_name = 'PN'
-	def __init__(self, qpn, parent):
-		PMKeyedPackageDict.__init__(self, str(qpn.package), parent)
-		self._qpn = qpn
-
-	def __iter__(self):
-		repo = self._parent._parent
-		for p in repo._repo.package_ids(self._qpn, []):
-			yield PaludisID(p, self)
-
-	@property
-	def versions(self):
-		"""
-		A convenience wrapper for the version list.
-		"""
-		return IterDictWrapper(self)
+from gentoopm.basepm.pkg import PMPackage
 
 class PaludisID(PMPackage):
-	_key_name = 'PVR'
-	def __init__(self, pkg, parent):
+	def __init__(self, pkg):
 		self._pkg = pkg
-		PMPackage.__init__(self, str(pkg.version), parent)
 
 	@property
 	def metadata(self):

diff --git a/gentoopm/paludispm/repo.py b/gentoopm/paludispm/repo.py
index d29e2ac..71214de 100644
--- a/gentoopm/paludispm/repo.py
+++ b/gentoopm/paludispm/repo.py
@@ -3,42 +3,32 @@
 # (c) 2011 Michał Górny <mgorny@gentoo.org>
 # Released under the terms of the 2-clause BSD license.
 
-import collections, os.path
+import paludis
 
 from gentoopm.basepm.repo import PMRepository, PMRepositoryDict, \
 		PMEbuildRepository
-from gentoopm.paludispm.pkg import PaludisCategory
-from gentoopm.util import IterDictWrapper
+from gentoopm.paludispm.pkg import PaludisID
 
 class PaludisRepoDict(PMRepositoryDict):
 	def __iter__(self):
 		for r in self._env.repositories:
 			if r.format_key().parse_value() == 'e':
-				yield PaludisLivefsRepository(r)
+				yield PaludisLivefsRepository(r, self._env)
 
 	def __init__(self, env):
 		self._env = env
 
 class PaludisRepository(PMRepository):
 	def __iter__(self):
-		for c in self._repo.category_names([]):
-			pc = PaludisCategory(c, self)
-			try:
-				next(iter(pc))
-			except StopIteration: # omit empty categories
-				pass
-			else:
-				yield pc
-
-	@property
-	def categories(self):
-		"""
-		A convenience wrapper for the category list.
-		"""
-		return IterDictWrapper(self)
+		for p in self._env[paludis.Selection.AllVersionsSorted(
+				paludis.FilteredGenerator(
+					paludis.Generator.InRepository(self._repo.name),
+					paludis.Filter.All()))]:
+			yield PaludisID(p)
 
 class PaludisLivefsRepository(PaludisRepository, PMEbuildRepository):
-	def __init__(self, repo_obj):
+	def __init__(self, repo_obj, env):
+		self._env = env
 		self._repo = repo_obj
 
 	@property
@@ -51,6 +41,7 @@ class PaludisLivefsRepository(PaludisRepository, PMEbuildRepository):
 
 class PaludisInstalledRepo(PaludisRepository):
 	def __init__(self, env):
+		self._env = env
 		for r in env.repositories:
 			if str(r.name) == 'installed': # XXX
 				self._repo = r

diff --git a/gentoopm/pkgcorepm/pkg.py b/gentoopm/pkgcorepm/pkg.py
index 30e6bae..559a229 100644
--- a/gentoopm/pkgcorepm/pkg.py
+++ b/gentoopm/pkgcorepm/pkg.py
@@ -3,54 +3,12 @@
 # (c) 2011 Michał Górny <mgorny@gentoo.org>
 # Released under the terms of the 2-clause BSD license.
 
-from pkgcore.restrictions.packages import PackageRestriction, AndRestriction
-from pkgcore.restrictions.values import StrExactMatch
-
 from gentoopm.basepm.metadata import PMPackageMetadata
-from gentoopm.basepm.pkg import PMKeyedPackageDict, PMPackage
-from gentoopm.util import IterDictWrapper
-
-class PkgCoreCategory(PMKeyedPackageDict):
-	_key_name = 'CATEGORY'
-	def __iter__(self):
-		repo = self._parent
-		try:
-			for p in repo._repo.packages[self._key]:
-				yield PkgCorePackage(p, self)
-		except KeyError:
-			pass
+from gentoopm.basepm.pkg import PMPackage
 
-	@property
-	def packages(self):
-		"""
-		A convenience wrapper for the package list.
-		"""
-		return IterDictWrapper(self)
-
-class PkgCorePackage(PMKeyedPackageDict):
-	_key_name = 'PN'
-	def __iter__(self):
-		r = AndRestriction(
-			PackageRestriction("category", StrExactMatch(self._parent._key)),
-			PackageRestriction("package", StrExactMatch(self._key))
-		)
-
-		repo = self._parent._parent
-		for p in repo._repo.itermatch(r):
-			yield PkgCoreEbuild(p, self)
-
-	@property
-	def versions(self):
-		"""
-		A convenience wrapper for the version list.
-		"""
-		return IterDictWrapper(self)
-
-class PkgCoreEbuild(PMPackage):
-	_key_name = 'PVR'
-	def __init__(self, pkg, parent):
+class PkgCorePackage(PMPackage):
+	def __init__(self, pkg):
 		self._pkg = pkg
-		PMPackage.__init__(self, pkg.fullver, parent)
 
 	@property
 	def metadata(self):
@@ -61,7 +19,7 @@ class PkgCoreEbuild(PMPackage):
 		return self._pkg.path
 
 	def __cmp__(self, other):
-		if not isinstance(other, PkgCoreEbuild):
+		if not isinstance(other, PkgCorePackage):
 			raise TypeError('Unable to compare %s against %s' % \
 					self, other)
 		if self._pkg.key != other._pkg.key:

diff --git a/gentoopm/pkgcorepm/repo.py b/gentoopm/pkgcorepm/repo.py
index 7a432a7..b0f0593 100644
--- a/gentoopm/pkgcorepm/repo.py
+++ b/gentoopm/pkgcorepm/repo.py
@@ -3,12 +3,9 @@
 # (c) 2011 Michał Górny <mgorny@gentoo.org>
 # Released under the terms of the 2-clause BSD license.
 
-import os.path
-
 from gentoopm.basepm.repo import PMRepository, PMRepositoryDict, \
 		PMEbuildRepository
-from gentoopm.pkgcorepm.pkg import PkgCoreCategory
-from gentoopm.util import IterDictWrapper
+from gentoopm.pkgcorepm.pkg import PkgCorePackage
 
 class PkgCoreRepoDict(PMRepositoryDict):
 	def __iter__(self):
@@ -23,15 +20,8 @@ class PkgCoreRepository(PMRepository):
 		self._repo = repo_obj
 
 	def __iter__(self):
-		for c in self._repo.categories:
-			yield PkgCoreCategory(c, self)
-
-	@property
-	def categories(self):
-		"""
-		A convenience wrapper for the category list.
-		"""
-		return IterDictWrapper(self)
+		for pkg in self._repo:
+			yield PkgCorePackage(pkg)
 
 class PkgCoreEbuildRepo(PkgCoreRepository, PMEbuildRepository):
 	def __init__(self, repo_obj, index):

diff --git a/gentoopm/portagepm/__init__.py b/gentoopm/portagepm/__init__.py
index 60ffa1c..15a9bec 100644
--- a/gentoopm/portagepm/__init__.py
+++ b/gentoopm/portagepm/__init__.py
@@ -8,7 +8,7 @@ from portage import create_trees
 
 from gentoopm.basepm import PackageManager
 from gentoopm.portagepm.repo import PortageRepoDict
-from gentoopm.portagepm.db import VDBRepository, PortDBRepository
+from gentoopm.portagepm.db import VDBRepository
 
 class PortagePM(PackageManager):
 	name = 'portage'

diff --git a/gentoopm/portagepm/db.py b/gentoopm/portagepm/db.py
index ce7188f..3eae39a 100644
--- a/gentoopm/portagepm/db.py
+++ b/gentoopm/portagepm/db.py
@@ -3,32 +3,16 @@
 # (c) 2011 Michał Górny <mgorny@gentoo.org>
 # Released under the terms of the 2-clause BSD license.
 
-import os.path
 import portage.versions
 
 from gentoopm.basepm.metadata import PMPackageMetadata
-from gentoopm.basepm.pkg import PMKeyedPackageDict, PMPackage
 from gentoopm.basepm.repo import PMRepository
-from gentoopm.portagepm.pkg import PortageCategory, PortagePackage, PortageCPV
-from gentoopm.util import IterDictWrapper
+from gentoopm.portagepm.pkg import PortageCPV
 
-class PortageDBCategory(PortageCategory):
-	def __iter__(self):
-		for p in self._dbapi.cp_all():
-			cat = portage.versions.catsplit(p)[0]
-			if cat == self._key:
-				yield PortageDBPackage(p, self, self._dbapi)
-
-class PortageDBPackage(PortagePackage):
-	def __iter__(self):
-		for p in self._dbapi.cp_list(self._qpn):
-			yield PortageDBCPV(p, self, self._dbapi)
+# XXX: cleanup all this mess!
 
 class PortageDBCPV(PortageCPV):
-	_key_name = 'PVR'
-	def __init__(self, cpv, parent, dbapi):
-		version = portage.versions.cpv_getversion(cpv)
-		PMPackage.__init__(self, version, parent)
+	def __init__(self, cpv, dbapi):
 		self._cpv = cpv
 		self._dbapi = dbapi
 
@@ -46,30 +30,36 @@ class PortageDBMetadata(PMPackageMetadata):
 		self._cpv = cpv
 		self._dbapi = dbapi
 
-	def __getitem__(self, key):
+	def __getattr__(self, key):
 		return self._dbapi.aux_get(self._cpv, [key])[0]
-	
+
+	@property
+	def CATEGORY(self):
+		return portage.versions.catsplit(self._cpv)[0]
+
+	@property
+	def PN(self):
+		return portage.versions.catpkgsplit(self._cpv)[1]
+
+	@property
+	def PV(self):
+		return portage.versions.pkgsplit(self._cpv)[1]
+
+	@property
+	def PR(self):
+		return portage.versions.pkgsplit(self._cpv)[2]
+
+	@property
+	def PVR(self):
+		return portage.versions.cpv_getversion(self._cpv)
+
 class PortDBRepository(PMRepository):
 	def __init__(self, dbapi):
 		self._dbapi = dbapi
 
-	_category_class = PortageDBCategory
 	def __iter__(self):
-		for c in self._dbapi.categories:
-			pc = self._category_class(c, self, self._dbapi)
-			try:
-				next(iter(pc))
-			except StopIteration: # omit empty categories
-				pass
-			else:
-				yield pc
-
-	@property
-	def categories(self):
-		"""
-		A convenience wrapper for the category list.
-		"""
-		return IterDictWrapper(self)
+		for p in self._dbapi.cpv_all(): # XXX
+			yield PortageDBCPV(p, self._dbapi)
 
 class VDBRepository(PortDBRepository):
 	pass

diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py
index 8588208..8696706 100644
--- a/gentoopm/portagepm/pkg.py
+++ b/gentoopm/portagepm/pkg.py
@@ -6,68 +6,23 @@
 import portage.versions
 
 from gentoopm.basepm.metadata import PMPackageMetadata
-from gentoopm.basepm.pkg import PMKeyedPackageDict, PMPackage
-from gentoopm.util import IterDictWrapper
+from gentoopm.basepm.pkg import PMPackage
 
-class PortageCategory(PMKeyedPackageDict):
-	_key_name = 'CATEGORY'
-	def __init__(self, category, parent, dbapi):
-		PMKeyedPackageDict.__init__(self, category, parent)
-		self._dbapi = dbapi
-
-	def __iter__(self):
-		repo = self._parent.path
-
-		for p in self._dbapi.cp_all(categories=(self._key,), trees=(repo,)):
-			yield PortagePackage(p, self, self._dbapi)
-
-	@property
-	def packages(self):
-		"""
-		A convenience wrapper for the package list.
-		"""
-		return IterDictWrapper(self)
-
-class PortagePackage(PMKeyedPackageDict):
-	_key_name = 'PN'
-	def __init__(self, qpn, parent, dbapi):
-		pn = portage.versions.catsplit(qpn)[1]
-		PMKeyedPackageDict.__init__(self, pn, parent)
-		self._qpn = qpn
-		self._dbapi = dbapi
-
-	def __iter__(self):
-		repo = self._parent._parent.path
-
-		for p in self._dbapi.cp_list(self._qpn, mytree=repo):
-			yield PortageCPV(p, self, self._dbapi)
-
-	@property
-	def versions(self):
-		"""
-		A convenience wrapper for the version list.
-		"""
-		return IterDictWrapper(self)
+# XXX: cleanup all this mess!
 
 class PortageCPV(PMPackage):
-	_key_name = 'PVR'
-	def __init__(self, cpv, parent, dbapi):
-		version = portage.versions.cpv_getversion(cpv)
-		PMPackage.__init__(self, version, parent)
+	def __init__(self, cpv, dbapi, tree):
 		self._cpv = cpv
 		self._dbapi = dbapi
-
-	@property
-	def _repo_path(self):
-		return self._parent._parent._parent.path
+		self._tree = tree
 
 	@property
 	def metadata(self):
-		return PortageMetadata(self._cpv, self._dbapi, self._repo_path)
+		return PortageMetadata(self._cpv, self._dbapi, self._tree)
 
 	@property
 	def path(self):
-		return self._dbapi.findname(self._cpv, self._repo_path)
+		return self._dbapi.findname(self._cpv, self._tree)
 
 	def __cmp__(self, other):
 		if not isinstance(other, PortageCPV):

diff --git a/gentoopm/portagepm/repo.py b/gentoopm/portagepm/repo.py
index 3041db0..8203f92 100644
--- a/gentoopm/portagepm/repo.py
+++ b/gentoopm/portagepm/repo.py
@@ -5,10 +5,9 @@
 
 import os.path
 
-from gentoopm.basepm.repo import PMRepository, PMRepositoryDict, PMEbuildRepository
+from gentoopm.basepm.repo import PMRepositoryDict, PMEbuildRepository
 from gentoopm.portagepm.db import PortDBRepository
-from gentoopm.portagepm.pkg import PortageCategory
-from gentoopm.util import IterDictWrapper
+from gentoopm.portagepm.pkg import PortageCPV
 
 class PortageRepoDict(PMRepositoryDict):
 	def __iter__(self):
@@ -35,6 +34,12 @@ class PortageRepository(PortDBRepository, PMEbuildRepository):
 		self._repo = repo_obj
 		PortDBRepository.__init__(self, portdbapi)
 
+	def __iter__(self):
+		path = self.path
+		for cp in self._dbapi.cp_all(trees = (path,)):
+			for p in self._dbapi.cp_list(cp, mytree = path):
+				yield PortageCPV(p, self._dbapi, path)
+
 	@property
 	def name(self):
 		return self._repo.name
@@ -45,5 +50,3 @@ class PortageRepository(PortDBRepository, PMEbuildRepository):
 
 	def __cmp__(self, other):
 		return cmp(self._repo.priority, other._repo.priority)
-
-	_category_class = PortageCategory



^ permalink raw reply related	[flat|nested] 37+ messages in thread

end of thread, other threads:[~2011-09-16  7:39 UTC | newest]

Thread overview: 37+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-21  8:47 [gentoo-commits] proj/gentoopm:master commit in: gentoopm/portagepm/, gentoopm/pkgcorepm/, gentoopm/paludispm/, gentoopm/basepm/ Michał Górny
  -- strict thread matches above, loose matches on Subject: below --
2011-09-16  7:39 Michał Górny
2011-08-15  9:01 Michał Górny
2011-08-15  8:48 Michał Górny
2011-08-15  7:57 Michał Górny
2011-08-14 14:22 Michał Górny
2011-08-12  8:24 Michał Górny
2011-08-01 17:14 Michał Górny
2011-07-30 18:39 Michał Górny
2011-07-30  8:13 Michał Górny
2011-07-28 19:54 Michał Górny
2011-07-28 16:24 Michał Górny
2011-07-28 16:24 Michał Górny
2011-07-28 16:24 Michał Górny
2011-07-28 16:24 Michał Górny
2011-07-27 21:32 Michał Górny
2011-07-27 16:24 Michał Górny
2011-07-27 16:24 Michał Górny
2011-07-23  9:27 Michał Górny
2011-07-20 18:02 Michał Górny
2011-07-20  9:41 Michał Górny
2011-07-19 11:53 Michał Górny
2011-07-18 17:54 Michał Górny
2011-07-18 14:40 Michał Górny
2011-07-15 22:24 Michał Górny
2011-07-15 22:24 Michał Górny
2011-07-14 14:05 Michał Górny
2011-07-14 13:31 Michał Górny
2011-07-14 13:31 Michał Górny
2011-07-14 12:19 Michał Górny
2011-07-13 16:09 Michał Górny
2011-07-13 16:09 Michał Górny
2011-07-12  8:31 Michał Górny
2011-07-07 12:52 Michał Górny
2011-07-07  9:51 Michał Górny
2011-07-06 20:54 Michał Górny
2011-07-06 16:03 Michał Górny

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox