Use a dict for Package.metadata, because it's faster. Thanks to Marat
authorZac Medico <zmedico@gentoo.org>
Sat, 19 Sep 2009 12:58:52 +0000 (12:58 -0000)
committerZac Medico <zmedico@gentoo.org>
Sat, 19 Sep 2009 12:58:52 +0000 (12:58 -0000)
Radchenko <marat@slonopotamus.org> for this patch from bug #276813.

svn path=/main/trunk/; revision=14280

pym/_emerge/Package.py

index 96d5176ed93a3bb8b6ab41f7bb8e09e8f25f9ecf..b1d4a11b395177378927b901f4bab4b79b2c1886 100644 (file)
@@ -5,7 +5,6 @@
 import re
 from itertools import chain
 import portage
-from portage.cache.mappings import slot_dict_class
 from portage.dep import paren_reduce, use_reduce, \
        paren_normalize, paren_enclose
 from _emerge.Task import Task
@@ -151,33 +150,56 @@ _all_metadata_keys = set(x for x in portage.auxdbkeys \
        if not x.startswith("UNUSED_"))
 _all_metadata_keys.discard("CDEPEND")
 _all_metadata_keys.update(Package.metadata_keys)
+_all_metadata_keys = frozenset(_all_metadata_keys)
 
-_PackageMetadataWrapperBase = slot_dict_class(_all_metadata_keys)
-
-class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
+class _PackageMetadataWrapper(dict):
        """
        Detect metadata updates and synchronize Package attributes.
        """
 
        __slots__ = ("_pkg",)
-       _wrapped_keys = frozenset(
-               ["COUNTER", "INHERITED", "IUSE", "SLOT", "_mtime_"])
        _use_conditional_keys = frozenset(
                ['LICENSE', 'PROPERTIES', 'PROVIDE', 'RESTRICT',])
 
        def __init__(self, pkg, metadata):
-               _PackageMetadataWrapperBase.__init__(self)
                self._pkg = pkg
-               """LICENSE with USE conditionals evaluated."""
-
                if not pkg.built:
                        # USE is lazy, but we want it to show up in self.keys().
                        self['USE'] = ''
-
                self.update(metadata)
+               for k, v in self.iteritems():
+                       if k == 'INHERITED':
+                               if isinstance(v, basestring):
+                                       v = frozenset(v.split())
+                               self._pkg.inherited = v
+                       elif k == 'SLOT':
+                               self._pkg.slot = v
+                       elif k == 'IUSE':
+                               self._pkg.iuse = self._pkg._iuse(
+                                       v.split(), self._pkg.root_config.iuse_implicit)
+                       elif k == 'COUNTER':
+                               if isinstance(v, basestring):
+                                       try:
+                                               v = long(v.strip())
+                                       except ValueError:
+                                               v = 0
+                                               self['COUNTER'] = str(v)
+                               self._pkg.counter = v
+                       elif k == '_mtime_':
+                               if isinstance(v, basestring):
+                                       try:
+                                               v = long(v.strip())
+                                       except ValueError:
+                                               v = 0
+                               self._pkg.mtime = v
+                       elif k in self._use_conditional_keys:
+                               try:
+                                       use_reduce(paren_reduce(v), matchall=1)
+                               except portage.exception.InvalidDependString, e:
+                                       self._pkg._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
 
        def __getitem__(self, k):
-               v = _PackageMetadataWrapperBase.__getitem__(self, k)
+               v = dict.__getitem__(self, k)
                if k in self._use_conditional_keys:
                        if self._pkg.root_config.settings.local_config and '?' in v:
                                try:
@@ -201,44 +223,6 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
 
                return v
 
-       def __setitem__(self, k, v):
-               _PackageMetadataWrapperBase.__setitem__(self, k, v)
-               if k in self._wrapped_keys:
-                       getattr(self, "_set_" + k.lower())(k, v)
-               elif k in self._use_conditional_keys:
-                       try:
-                               use_reduce(paren_reduce(v), matchall=1)
-                       except portage.exception.InvalidDependString, e:
-                               self._pkg._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
-
-       def _set_inherited(self, k, v):
-               if isinstance(v, basestring):
-                       v = frozenset(v.split())
-               self._pkg.inherited = v
-
-       def _set_iuse(self, k, v):
-               self._pkg.iuse = self._pkg._iuse(
-                       v.split(), self._pkg.root_config.iuse_implicit)
-
-       def _set_slot(self, k, v):
-               self._pkg.slot = v
-
-       def _set_counter(self, k, v):
-               if isinstance(v, basestring):
-                       try:
-                               v = long(v.strip())
-                       except ValueError:
-                               v = 0
-               self._pkg.counter = v
-
-       def _set__mtime_(self, k, v):
-               if isinstance(v, basestring):
-                       try:
-                               v = long(v.strip())
-                       except ValueError:
-                               v = 0
-               self._pkg.mtime = v
-
        @property
        def properties(self):
                return self['PROPERTIES'].split()