mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
173: NameSpace now subclasses from DictProxy
This commit is contained in:
parent
1a92bdf29b
commit
3e3b596f68
@ -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.
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user