* [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-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-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: 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-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-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-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-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: 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-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-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: 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-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-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-08-14 14:22 [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-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-21 8:47 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