1 |
commit: 448e5a4f8a9bd934048145b094c4faee3bb7769a |
2 |
Author: Michał Górny <mgorny <AT> gentoo <DOT> org> |
3 |
AuthorDate: Thu Jul 28 19:39:31 2011 +0000 |
4 |
Commit: Michał Górny <mgorny <AT> gentoo <DOT> org> |
5 |
CommitDate: Thu Jul 28 19:39:31 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoopm.git;a=commit;h=448e5a4f |
7 |
|
8 |
Introduce PMRequiredUseAtom type. |
9 |
|
10 |
--- |
11 |
gentoopm/basepm/depend.py | 44 +++++++++++++++++++++++++++++++++++++++++- |
12 |
gentoopm/basepm/pkg.py | 9 ++++++++ |
13 |
gentoopm/paludispm/depend.py | 6 +++- |
14 |
gentoopm/paludispm/pkg.py | 4 ++- |
15 |
gentoopm/pkgcorepm/depend.py | 4 +- |
16 |
gentoopm/portagepm/pkg.py | 3 +- |
17 |
6 files changed, 63 insertions(+), 7 deletions(-) |
18 |
|
19 |
diff --git a/gentoopm/basepm/depend.py b/gentoopm/basepm/depend.py |
20 |
index 923cdbf..307d32d 100644 |
21 |
--- a/gentoopm/basepm/depend.py |
22 |
+++ b/gentoopm/basepm/depend.py |
23 |
@@ -5,7 +5,49 @@ |
24 |
|
25 |
from abc import abstractmethod, abstractproperty |
26 |
|
27 |
-from gentoopm.util import ABCObject |
28 |
+from gentoopm.util import ABCObject, StringCompat |
29 |
+ |
30 |
+class PMRequiredUseAtom(StringCompat): |
31 |
+ """ |
32 |
+ An atom for C{REQUIRED_USE} specification. |
33 |
+ """ |
34 |
+ |
35 |
+ def __init__(self, s): |
36 |
+ self._blocks = s.startswith('!') |
37 |
+ if self._blocks: |
38 |
+ s = s[1:] |
39 |
+ self._flag = s |
40 |
+ |
41 |
+ @property |
42 |
+ def name(self): |
43 |
+ """ |
44 |
+ Relevant USE flag name. |
45 |
+ |
46 |
+ @type: string |
47 |
+ """ |
48 |
+ return self._flag |
49 |
+ |
50 |
+ @property |
51 |
+ def blocking(self): |
52 |
+ """ |
53 |
+ Whether the atom blocks the USE flag (requires it not to be set). |
54 |
+ |
55 |
+ @type: bool |
56 |
+ """ |
57 |
+ return self._blocks |
58 |
+ |
59 |
+ @property |
60 |
+ def requiring(self): |
61 |
+ """ |
62 |
+ Whether the atom requires the USE flag to be set. |
63 |
+ |
64 |
+ @type: bool |
65 |
+ """ |
66 |
+ return not self._blocks |
67 |
+ |
68 |
+ def __str__(self): |
69 |
+ return '%s%s' % ('!' if self._blocks else '', |
70 |
+ self.name) |
71 |
|
72 |
class PMBaseDep(ABCObject): |
73 |
""" |
74 |
|
75 |
diff --git a/gentoopm/basepm/pkg.py b/gentoopm/basepm/pkg.py |
76 |
index 33a4435..397ff7f 100644 |
77 |
--- a/gentoopm/basepm/pkg.py |
78 |
+++ b/gentoopm/basepm/pkg.py |
79 |
@@ -318,6 +318,15 @@ class PMPackage(PMAtom, FillMissingComparisons): |
80 |
pass |
81 |
|
82 |
@abstractproperty |
83 |
+ def required_use(self): |
84 |
+ """ |
85 |
+ Get the C{REQUIRED_USE} specification. |
86 |
+ |
87 |
+ @type: L{PMPackageDepSet} |
88 |
+ """ |
89 |
+ pass |
90 |
+ |
91 |
+ @abstractproperty |
92 |
def slotted(self): |
93 |
""" |
94 |
Return an atom matching all packages in the same slot as the associated |
95 |
|
96 |
diff --git a/gentoopm/paludispm/depend.py b/gentoopm/paludispm/depend.py |
97 |
index 9084f3d..c16b3d0 100644 |
98 |
--- a/gentoopm/paludispm/depend.py |
99 |
+++ b/gentoopm/paludispm/depend.py |
100 |
@@ -20,8 +20,10 @@ class PaludisBaseDep(PMBaseDep): |
101 |
def __iter__(self): |
102 |
for d in self._deps: |
103 |
if isinstance(d, paludis.PackageDepSpec): |
104 |
+ assert(self._args.cls is None) |
105 |
yield PaludisAtom(d, self._args.env) |
106 |
elif isinstance(d, paludis.BlockDepSpec): |
107 |
+ assert(self._args.cls is None) |
108 |
yield PaludisAtom(d.blocking, self._args.env, |
109 |
block = _block_re.match(d.text).group(0)) |
110 |
elif isinstance(d, paludis.AnyDepSpec): |
111 |
@@ -33,8 +35,8 @@ class PaludisBaseDep(PMBaseDep): |
112 |
elif isinstance(d, paludis.ConditionalDepSpec): |
113 |
yield PaludisConditionalDep(d, self._args) |
114 |
elif isinstance(d, paludis.PlainTextDepSpec): |
115 |
- # XXX: this is in REQUIRED_USE as well |
116 |
- yield str(d) |
117 |
+ assert(self._args.cls is not None) |
118 |
+ yield self._args.cls(str(d)) |
119 |
else: |
120 |
raise NotImplementedError('Unable to parse %s' % repr(d)) |
121 |
|
122 |
|
123 |
diff --git a/gentoopm/paludispm/pkg.py b/gentoopm/paludispm/pkg.py |
124 |
index c29c0d7..151cd92 100644 |
125 |
--- a/gentoopm/paludispm/pkg.py |
126 |
+++ b/gentoopm/paludispm/pkg.py |
127 |
@@ -5,6 +5,7 @@ |
128 |
|
129 |
import paludis |
130 |
|
131 |
+from gentoopm.basepm.depend import PMRequiredUseAtom |
132 |
from gentoopm.basepm.metadata import PMPackageMetadata |
133 |
from gentoopm.basepm.pkg import PMPackage, PMPackageDescription, \ |
134 |
PMInstallablePackage, PMInstalledPackage, PMBoundPackageKey, \ |
135 |
@@ -141,7 +142,8 @@ class PaludisID(PMPackage, PaludisAtom): |
136 |
k = self._pkg.find_metadata('REQUIRED_USE') |
137 |
if k is None: |
138 |
return None |
139 |
- return PaludisPackageDepSet(k.parse_value(), self) |
140 |
+ return PaludisPackageDepSet(k.parse_value(), self, |
141 |
+ PMRequiredUseAtom) |
142 |
|
143 |
@property |
144 |
def use(self): |
145 |
|
146 |
diff --git a/gentoopm/pkgcorepm/depend.py b/gentoopm/pkgcorepm/depend.py |
147 |
index fd3dcce..3f25576 100644 |
148 |
--- a/gentoopm/pkgcorepm/depend.py |
149 |
+++ b/gentoopm/pkgcorepm/depend.py |
150 |
@@ -10,7 +10,7 @@ from pkgcore.restrictions.packages import Conditional |
151 |
from pkgcore.restrictions.values import ContainmentMatch |
152 |
|
153 |
from gentoopm.basepm.depend import PMPackageDepSet, PMConditionalDep, \ |
154 |
- PMAnyOfDep, PMAllOfDep, PMExactlyOneOfDep, PMBaseDep |
155 |
+ PMAnyOfDep, PMAllOfDep, PMExactlyOneOfDep, PMBaseDep, PMRequiredUseAtom |
156 |
from gentoopm.pkgcorepm.atom import PkgCoreAtom |
157 |
|
158 |
class PkgCoreBaseDep(PMBaseDep): |
159 |
@@ -24,7 +24,7 @@ class PkgCoreBaseDep(PMBaseDep): |
160 |
yield PkgCoreAtom(d) |
161 |
elif isinstance(d, ContainmentMatch): # REQUIRED_USE |
162 |
assert(len(d.vals) == 1) |
163 |
- yield next(iter(d.vals)) |
164 |
+ yield PMRequiredUseAtom(next(iter(d.vals))) |
165 |
elif isinstance(d, OrRestriction): |
166 |
yield PkgCoreAnyOfDep(d, self._pkg) |
167 |
elif isinstance(d, AndRestriction): |
168 |
|
169 |
diff --git a/gentoopm/portagepm/pkg.py b/gentoopm/portagepm/pkg.py |
170 |
index 5af125a..9653262 100644 |
171 |
--- a/gentoopm/portagepm/pkg.py |
172 |
+++ b/gentoopm/portagepm/pkg.py |
173 |
@@ -5,6 +5,7 @@ |
174 |
|
175 |
from portage.versions import cpv_getkey, cpv_getversion, vercmp |
176 |
|
177 |
+from gentoopm.basepm.depend import PMRequiredUseAtom |
178 |
from gentoopm.basepm.metadata import PMPackageMetadata |
179 |
from gentoopm.basepm.pkg import PMPackage, PMPackageDescription, \ |
180 |
PMInstalledPackage, PMInstallablePackage, PMBoundPackageKey, \ |
181 |
@@ -186,7 +187,7 @@ class PortageDBCPV(PMPackage, CompletePortageAtom): |
182 |
@property |
183 |
def required_use(self): |
184 |
return PortagePackageDepSet(self._aux_get('REQUIRED_USE'), |
185 |
- self._applied_use, str) # XXX |
186 |
+ self._applied_use, PMRequiredUseAtom) |
187 |
|
188 |
def __str__(self): |
189 |
return '=%s' % self._cpv |