summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-07-26 22:47:23 -0700
committerZac Medico <zmedico@gentoo.org>2010-07-26 22:47:23 -0700
commited854d3de2fce3b5e78a67afc18763901aa66272 (patch)
tree9f92dd32cf76161dee2470971dad20a8bd430e42
parentd0e0abf9314bf0e2baa6b11a152751a2231fcd5e (diff)
downloadportage-ed854d3de2fce3b5e78a67afc18763901aa66272.tar.gz
portage-ed854d3de2fce3b5e78a67afc18763901aa66272.tar.bz2
portage-ed854d3de2fce3b5e78a67afc18763901aa66272.zip
Fix ExtendedAtomDict so get() and __getitem__() behave consistently,
since otherwise it can be quite confusing.
-rw-r--r--pym/portage/dep/__init__.py40
-rw-r--r--pym/portage/tests/dep/testExtendedAtomDict.py2
2 files changed, 28 insertions, 14 deletions
diff --git a/pym/portage/dep/__init__.py b/pym/portage/dep/__init__.py
index 25cad8fd8..12e32c36d 100644
--- a/pym/portage/dep/__init__.py
+++ b/pym/portage/dep/__init__.py
@@ -791,10 +791,17 @@ class ExtendedAtomDict(portage.cache.mappings.MutableMapping):
else:
return self._normal.setdefault(cp, default)
- def get(self, cp):
+ def __getitem__(self, cp):
+
+ if not isinstance(cp, basestring):
+ raise KeyError(cp)
+
ret = self._value_class()
normal_match = self._normal.get(cp)
+ match = False
+
if normal_match is not None:
+ match = True
if hasattr(ret, "update"):
ret.update(normal_match)
elif hasattr(ret, "extend"):
@@ -802,14 +809,29 @@ class ExtendedAtomDict(portage.cache.mappings.MutableMapping):
else:
raise NotImplementedError()
- for extended_cp in self._extended:
- if extended_cp_match(extended_cp, cp):
+ if '*' in cp:
+ v = self._extended.get(cp)
+ if v is not None:
+ match = True
if hasattr(ret, "update"):
- ret.update(self._extended[extended_cp])
+ ret.update(v)
elif hasattr(ret, "extend"):
- ret.extend(self._extended[extended_cp])
+ ret.extend(v)
else:
raise NotImplementedError()
+ else:
+ for extended_cp in self._extended:
+ if extended_cp_match(extended_cp, cp):
+ match = True
+ if hasattr(ret, "update"):
+ ret.update(self._extended[extended_cp])
+ elif hasattr(ret, "extend"):
+ ret.extend(self._extended[extended_cp])
+ else:
+ raise NotImplementedError()
+
+ if not match:
+ raise KeyError(cp)
return ret
@@ -819,14 +841,6 @@ class ExtendedAtomDict(portage.cache.mappings.MutableMapping):
else:
self._normal[cp] = val
- def __getitem__(self, cp):
- if not isinstance(cp, basestring):
- raise KeyError(cp)
- if "*" in cp:
- return self._extended[cp]
- else:
- return self._normal[cp]
-
def clear(self):
self._extended.clear()
self._normal.clear()
diff --git a/pym/portage/tests/dep/testExtendedAtomDict.py b/pym/portage/tests/dep/testExtendedAtomDict.py
index 702bec196..69d092e38 100644
--- a/pym/portage/tests/dep/testExtendedAtomDict.py
+++ b/pym/portage/tests/dep/testExtendedAtomDict.py
@@ -15,4 +15,4 @@ class TestExtendedAtomDict(TestCase):
self.assertEqual(d.get("dev-libs/A"), { "test1": "x", "test2": "y" })
self.assertEqual(d.get("sys-apps/portage"), { "test1": "x", "test3": "z" })
self.assertEqual(d["dev-libs/*"], { "test2": "y" })
- self.assertEqual(d["sys-apps/portage"], { "test3": "z" })
+ self.assertEqual(d["sys-apps/portage"], {'test1': 'x', 'test3': 'z'})