From 3e3b596f68957f46efa5af4b957c8add50fca8b6 Mon Sep 17 00:00:00 2001 From: Jason Gerard DeRose Date: Fri, 15 Aug 2008 01:46:11 +0000 Subject: [PATCH] 173: NameSpace now subclasses from DictProxy --- ipalib/plugable.py | 62 +++++------------------------------ ipalib/tests/test_plugable.py | 4 +-- 2 files changed, 11 insertions(+), 55 deletions(-) diff --git a/ipalib/plugable.py b/ipalib/plugable.py index 4661aa1e6..7d42d4a00 100644 --- a/ipalib/plugable.py +++ b/ipalib/plugable.py @@ -434,7 +434,7 @@ def check_name(name): return name -class NameSpace(ReadOnly): +class NameSpace(DictProxy): """ A read-only namespace with handy container behaviours. @@ -483,10 +483,9 @@ class NameSpace(ReadOnly): """ :param members: An iterable providing the members. """ - self.__d = dict() - self.__names = tuple(self.__member_iter(members)) - lock(self) - assert set(self.__d) == set(self.__names) + super(NameSpace, self).__init__( + dict(self.__member_iter(members)) + ) def __member_iter(self, members): """ @@ -496,56 +495,16 @@ class NameSpace(ReadOnly): """ for member in members: name = check_name(member.name) - assert not ( - name in self.__d or hasattr(self, name) - ), 'already has member named %r' % name - self.__d[name] = member + assert not hasattr(self, name), 'already has attribute %r' % name setattr(self, name, member) - yield name - - def __len__(self): - """ - Returns the number of members in this NameSpace. - """ - return len(self.__d) - - def __contains__(self, name): - """ - Returns True if instance contains a member named ``name``, otherwise - False. - - :param name: The name of a potential member - """ - return name in self.__d - - def __getitem__(self, name): - """ - Returns the member named ``name``. - - Raises KeyError if this NameSpace does not contain a member named - ``name``. - - :param name: The name of member to retrieve - """ - if name in self.__d: - return self.__d[name] - raise KeyError('NameSpace has no member named %r' % name) - - def __iter__(self): - """ - Iterates through the member names in the same order as the members - were passed to the constructor. - """ - for name in self.__names: - yield name + yield (name, member) def __call__(self): """ - Iterates through the members in the same order they were passed to the - constructor. + Iterates through the members of this NameSpace. """ - for name in self.__names: - yield self.__d[name] + for key in self: + yield self[key] def __repr__(self): """ @@ -555,9 +514,6 @@ class NameSpace(ReadOnly): return '%s(<%d members>)' % (self.__class__.__name__, len(self)) - - - class Registrar(ReadOnly): """ Collects plugin classes as they are registered. diff --git a/ipalib/tests/test_plugable.py b/ipalib/tests/test_plugable.py index 6f2385c92..00d20cc90 100644 --- a/ipalib/tests/test_plugable.py +++ b/ipalib/tests/test_plugable.py @@ -560,7 +560,7 @@ class test_NameSpace(ClassChecker): _cls = plugable.NameSpace def test_class(self): - assert self.cls.__bases__ == (plugable.ReadOnly,) + assert self.cls.__bases__ == (plugable.DictProxy,) def test_namespace(self): class base(object): @@ -583,7 +583,7 @@ class test_NameSpace(ClassChecker): for i in xrange(n): yield plugable.Proxy(base, plugin(get_name(i))) - cnt = 20 + cnt = 10 ns = self.cls(get_proxies(cnt)) assert ns.__islocked__() is True