1 |
Author: zmedico |
2 |
Date: 2008-06-25 06:38:15 +0000 (Wed, 25 Jun 2008) |
3 |
New Revision: 10776 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
main/trunk/pym/portage/__init__.py |
8 |
Log: |
9 |
For the Package.metadata attribute, only implement the dict interface |
10 |
instead of actually inheriting from dict. This slightly decreases the |
11 |
memory footprint by defining __slots__ and storing items as object |
12 |
attributes. |
13 |
|
14 |
|
15 |
Modified: main/trunk/pym/_emerge/__init__.py |
16 |
=================================================================== |
17 |
--- main/trunk/pym/_emerge/__init__.py 2008-06-25 04:24:31 UTC (rev 10775) |
18 |
+++ main/trunk/pym/_emerge/__init__.py 2008-06-25 06:38:15 UTC (rev 10776) |
19 |
@@ -1285,7 +1285,7 @@ |
20 |
def __init__(self, **kwargs): |
21 |
Task.__init__(self, **kwargs) |
22 |
self.root = self.root_config.root |
23 |
- self.metadata = self._metadata_wrapper(self, self.metadata) |
24 |
+ self.metadata = _PackageMetadataWrapper(self, self.metadata) |
25 |
self.cp = portage.cpv_getkey(self.cpv) |
26 |
self.slot_atom = portage.dep.Atom("%s:%s" % (self.cp, self.slot)) |
27 |
self.category, self.pf = portage.catsplit(self.cpv) |
28 |
@@ -1332,60 +1332,6 @@ |
29 |
chain((re.escape(x) for x in all), iuse_implicit))) |
30 |
return object.__getattribute__(self, name) |
31 |
|
32 |
- class _metadata_wrapper(dict): |
33 |
- """ |
34 |
- Detect metadata updates and synchronize Package attributes. |
35 |
- """ |
36 |
- _wrapped_keys = frozenset( |
37 |
- ["COUNTER", "INHERITED", "IUSE", "SLOT", "USE", "_mtime_"]) |
38 |
- |
39 |
- def __init__(self, pkg, metadata): |
40 |
- dict.__init__(self) |
41 |
- self._pkg = pkg |
42 |
- i = getattr(metadata, "iteritems", None) |
43 |
- if i is None: |
44 |
- i = metadata |
45 |
- else: |
46 |
- i = i() |
47 |
- for k, v in i: |
48 |
- self[k] = v |
49 |
- |
50 |
- def __setitem__(self, k, v): |
51 |
- dict.__setitem__(self, k, v) |
52 |
- if k in self._wrapped_keys: |
53 |
- getattr(self, "_set_" + k.lower())(k, v) |
54 |
- |
55 |
- def _set_inherited(self, k, v): |
56 |
- if isinstance(v, basestring): |
57 |
- v = frozenset(v.split()) |
58 |
- self._pkg.inherited = v |
59 |
- |
60 |
- def _set_iuse(self, k, v): |
61 |
- self._pkg.iuse = self._pkg._iuse( |
62 |
- v.split(), self._pkg.root_config.iuse_implicit) |
63 |
- |
64 |
- def _set_slot(self, k, v): |
65 |
- self._pkg.slot = v |
66 |
- |
67 |
- def _set_use(self, k, v): |
68 |
- self._pkg.use = self._pkg._use(v.split()) |
69 |
- |
70 |
- def _set_counter(self, k, v): |
71 |
- if isinstance(v, basestring): |
72 |
- try: |
73 |
- v = int(v.strip()) |
74 |
- except ValueError: |
75 |
- v = 0 |
76 |
- self._pkg.counter = v |
77 |
- |
78 |
- def _set__mtime_(self, k, v): |
79 |
- if isinstance(v, basestring): |
80 |
- try: |
81 |
- v = float(v.strip()) |
82 |
- except ValueError: |
83 |
- v = 0 |
84 |
- self._pkg.mtime = v |
85 |
- |
86 |
def _get_hash_key(self): |
87 |
hash_key = getattr(self, "_hash_key", None) |
88 |
if hash_key is None: |
89 |
@@ -1425,6 +1371,112 @@ |
90 |
return True |
91 |
return False |
92 |
|
93 |
+class _PackageMetadataWrapper(object): |
94 |
+ """ |
95 |
+ Detect metadata updates and synchronize Package attributes. |
96 |
+ """ |
97 |
+ _keys = Package.metadata_keys |
98 |
+ __slots__ = ("__weakref__", "_pkg") + tuple("_val_" + k for k in _keys) |
99 |
+ _wrapped_keys = frozenset( |
100 |
+ ["COUNTER", "INHERITED", "IUSE", "SLOT", "USE", "_mtime_"]) |
101 |
+ |
102 |
+ def __init__(self, pkg, metadata): |
103 |
+ self._pkg = pkg |
104 |
+ self.update(metadata) |
105 |
+ |
106 |
+ def __iter__(self): |
107 |
+ for k, v in self.iteritems(): |
108 |
+ yield k |
109 |
+ |
110 |
+ def __len__(self): |
111 |
+ l = 0 |
112 |
+ for i in self.iteritems(): |
113 |
+ l += 1 |
114 |
+ return l |
115 |
+ |
116 |
+ def keys(self): |
117 |
+ return list(self) |
118 |
+ |
119 |
+ def iteritems(self): |
120 |
+ for k in self._keys: |
121 |
+ try: |
122 |
+ yield (k, getattr(self, "_val_" + k)) |
123 |
+ except AttributeError: |
124 |
+ pass |
125 |
+ |
126 |
+ def items(self): |
127 |
+ return list(self.iteritems()) |
128 |
+ |
129 |
+ def itervalues(self): |
130 |
+ for k, v in self.itervalues(): |
131 |
+ yield v |
132 |
+ |
133 |
+ def values(self): |
134 |
+ return list(self.itervalues()) |
135 |
+ |
136 |
+ def __delitem__(self, k): |
137 |
+ try: |
138 |
+ delattr(self, "_val_" + k) |
139 |
+ except AttributeError: |
140 |
+ raise KeyError(k) |
141 |
+ |
142 |
+ def __setitem__(self, k, v): |
143 |
+ setattr(self, "_val_" + k, v) |
144 |
+ if k in self._wrapped_keys: |
145 |
+ getattr(self, "_set_" + k.lower())(k, v) |
146 |
+ |
147 |
+ def update(self, d): |
148 |
+ i = getattr(d, "iteritems", None) |
149 |
+ if i is None: |
150 |
+ i = d |
151 |
+ else: |
152 |
+ i = i() |
153 |
+ for k, v in i: |
154 |
+ self[k] = v |
155 |
+ |
156 |
+ def __getitem__(self, k): |
157 |
+ try: |
158 |
+ return getattr(self, "_val_" + k) |
159 |
+ except AttributeError: |
160 |
+ raise KeyError(k) |
161 |
+ |
162 |
+ def get(self, key, default=None): |
163 |
+ try: |
164 |
+ return self[key] |
165 |
+ except KeyError: |
166 |
+ return default |
167 |
+ |
168 |
+ def _set_inherited(self, k, v): |
169 |
+ if isinstance(v, basestring): |
170 |
+ v = frozenset(v.split()) |
171 |
+ self._pkg.inherited = v |
172 |
+ |
173 |
+ def _set_iuse(self, k, v): |
174 |
+ self._pkg.iuse = self._pkg._iuse( |
175 |
+ v.split(), self._pkg.root_config.iuse_implicit) |
176 |
+ |
177 |
+ def _set_slot(self, k, v): |
178 |
+ self._pkg.slot = v |
179 |
+ |
180 |
+ def _set_use(self, k, v): |
181 |
+ self._pkg.use = self._pkg._use(v.split()) |
182 |
+ |
183 |
+ def _set_counter(self, k, v): |
184 |
+ if isinstance(v, basestring): |
185 |
+ try: |
186 |
+ v = int(v.strip()) |
187 |
+ except ValueError: |
188 |
+ v = 0 |
189 |
+ self._pkg.counter = v |
190 |
+ |
191 |
+ def _set__mtime_(self, k, v): |
192 |
+ if isinstance(v, basestring): |
193 |
+ try: |
194 |
+ v = float(v.strip()) |
195 |
+ except ValueError: |
196 |
+ v = 0 |
197 |
+ self._pkg.mtime = v |
198 |
+ |
199 |
class DependencyArg(object): |
200 |
def __init__(self, arg=None, root_config=None): |
201 |
self.arg = arg |
202 |
|
203 |
Modified: main/trunk/pym/portage/__init__.py |
204 |
=================================================================== |
205 |
--- main/trunk/pym/portage/__init__.py 2008-06-25 04:24:31 UTC (rev 10775) |
206 |
+++ main/trunk/pym/portage/__init__.py 2008-06-25 06:38:15 UTC (rev 10776) |
207 |
@@ -1940,7 +1940,7 @@ |
208 |
pkginternaluse = "" |
209 |
iuse = "" |
210 |
if mydb: |
211 |
- if isinstance(mydb, dict): |
212 |
+ if not hasattr(mydb, "aux_get"): |
213 |
slot = mydb["SLOT"] |
214 |
iuse = mydb["IUSE"] |
215 |
else: |
216 |
@@ -2414,7 +2414,7 @@ |
217 |
if len(self.virtuals) == 0: |
218 |
self.getvirtuals() |
219 |
# Grab the virtuals this package provides and add them into the tree virtuals. |
220 |
- if isinstance(mydbapi, dict): |
221 |
+ if not hasattr(mydbapi, "aux_get"): |
222 |
provides = mydbapi["PROVIDE"] |
223 |
else: |
224 |
provides = mydbapi.aux_get(mycpv, ["PROVIDE"])[0] |
225 |
@@ -2423,7 +2423,7 @@ |
226 |
if isinstance(mydbapi, portdbapi): |
227 |
self.setcpv(mycpv, mydb=mydbapi) |
228 |
myuse = self["PORTAGE_USE"] |
229 |
- elif isinstance(mydbapi, dict): |
230 |
+ elif not hasattr(mydbapi, "aux_get"): |
231 |
myuse = mydbapi["USE"] |
232 |
else: |
233 |
myuse = mydbapi.aux_get(mycpv, ["USE"])[0] |
234 |
|
235 |
-- |
236 |
gentoo-commits@l.g.o mailing list |