fakedbapi: use _pkg_str more
authorZac Medico <zmedico@gentoo.org>
Fri, 22 Jun 2012 09:45:36 +0000 (02:45 -0700)
committerZac Medico <zmedico@gentoo.org>
Fri, 22 Jun 2012 09:45:36 +0000 (02:45 -0700)
pym/portage/dbapi/virtual.py
pym/portage/tests/dbapi/test_fakedbapi.py

index da15983eec21d447601c18c444cce6988ba6840e..213708c93e5afc0739df868fbfe65ae38545f32e 100644 (file)
@@ -74,30 +74,55 @@ class fakedbapi(dbapi):
                @param metadata: dict
                """
                self._clear_cache()
-               if not hasattr(mycpv, 'cp'):
+
+               try:
+                       mycp = mycpv.cp
+               except AttributeError:
+                       mycp = None
+               try:
+                       myslot = mycpv.slot
+               except AttributeError:
+                       myslot = None
+
+               if mycp is None or \
+                       (myslot is None and metadata is not None and metadata.get('SLOT')):
                        if metadata is None:
                                mycpv = _pkg_str(mycpv)
                        else:
                                mycpv = _pkg_str(mycpv, slot=metadata.get('SLOT'),
-                                       repo=metadata.get('repository'))
-               mycp = mycpv.cp
+                                       repo=metadata.get('repository'), eapi=metadata.get('EAPI'))
+
+                       mycp = mycpv.cp
+                       try:
+                               myslot = mycpv.slot
+                       except AttributeError:
+                               pass
+
                self.cpvdict[mycpv] = metadata
-               myslot = None
-               if self._exclusive_slots and metadata:
-                       myslot = metadata.get("SLOT", None)
+               if not self._exclusive_slots:
+                       myslot = None
                if myslot and mycp in self.cpdict:
                        # If necessary, remove another package in the same SLOT.
                        for cpv in self.cpdict[mycp]:
                                if mycpv != cpv:
-                                       other_metadata = self.cpvdict[cpv]
-                                       if other_metadata:
-                                               if myslot == other_metadata.get("SLOT", None):
+                                       try:
+                                               other_slot = cpv.slot
+                                       except AttributeError:
+                                               pass
+                                       else:
+                                               if myslot == other_slot:
                                                        self.cpv_remove(cpv)
                                                        break
-               if mycp not in self.cpdict:
-                       self.cpdict[mycp] = []
-               if not mycpv in self.cpdict[mycp]:
-                       self.cpdict[mycp].append(mycpv)
+
+               cp_list = self.cpdict.get(mycp)
+               if cp_list is None:
+                       cp_list = []
+                       self.cpdict[mycp] = cp_list
+               try:
+                       cp_list.remove(mycpv)
+               except ValueError:
+                       pass
+               cp_list.append(mycpv)
 
        def cpv_remove(self,mycpv):
                """Removes a cpv from the list of available packages."""
index bce824530fa4762358aa0d14a4c7e93c5c33d21e..e3843f0a4485751b557fbad848dd4eda3fb9ad49 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2011 Gentoo Foundation
+# Copyright 2011-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 import tempfile
@@ -53,6 +53,9 @@ class TestFakedbapi(TestCase):
                                fakedb.cpv_inject(cpv, metadata=metadata)
 
                        for atom, expected_result in match_tests:
-                               self.assertEqual( fakedb.match(atom), expected_result )
+                               result = fakedb.match(atom)
+                               self.assertEqual(fakedb.match(atom), expected_result,
+                                       "fakedb.match('%s') = %s != %s" %
+                                       (atom, result, expected_result))
                finally:
                        shutil.rmtree(tempdir)