mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-01-23 23:03:19 -06:00
Finished doodle with stricter version of Environment
This commit is contained in:
parent
59a2cffff4
commit
2ec0312eb6
@ -28,6 +28,7 @@ methods, such as DNS.
|
|||||||
from ConfigParser import SafeConfigParser, ParsingError
|
from ConfigParser import SafeConfigParser, ParsingError
|
||||||
import types
|
import types
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
from errors import check_isinstance, raise_TypeError
|
from errors import check_isinstance, raise_TypeError
|
||||||
|
|
||||||
@ -126,6 +127,92 @@ class Environment(object):
|
|||||||
return default
|
return default
|
||||||
|
|
||||||
|
|
||||||
|
class Env(object):
|
||||||
|
"""
|
||||||
|
A mapping object used to store the environment variables.
|
||||||
|
"""
|
||||||
|
|
||||||
|
__locked = False
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
object.__setattr__(self, '_Env__d', {})
|
||||||
|
|
||||||
|
def __lock__(self):
|
||||||
|
"""
|
||||||
|
Prevent further changes to environment.
|
||||||
|
"""
|
||||||
|
if self.__locked is True:
|
||||||
|
raise StandardError(
|
||||||
|
'%s.__lock__() already called' % self.__class__.__name__
|
||||||
|
)
|
||||||
|
object.__setattr__(self, '_Env__locked', True)
|
||||||
|
|
||||||
|
def __getattr__(self, name):
|
||||||
|
"""
|
||||||
|
Return the attribute named ``name``.
|
||||||
|
"""
|
||||||
|
if name in self.__d:
|
||||||
|
return self[name]
|
||||||
|
raise AttributeError('%s.%s' %
|
||||||
|
(self.__class__.__name__, name)
|
||||||
|
)
|
||||||
|
|
||||||
|
def __setattr__(self, name, value):
|
||||||
|
"""
|
||||||
|
Set the attribute named ``name`` to ``value``.
|
||||||
|
"""
|
||||||
|
self[name] = value
|
||||||
|
|
||||||
|
def __delattr__(self, name):
|
||||||
|
"""
|
||||||
|
Raise AttributeError (deletion is not allowed).
|
||||||
|
"""
|
||||||
|
raise AttributeError('cannot del %s.%s' %
|
||||||
|
(self.__class__.__name__, name)
|
||||||
|
)
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
"""
|
||||||
|
Return the value corresponding to ``key``.
|
||||||
|
"""
|
||||||
|
if key not in self.__d:
|
||||||
|
raise KeyError(key)
|
||||||
|
value = self.__d[key]
|
||||||
|
if callable(value):
|
||||||
|
return value()
|
||||||
|
return value
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
"""
|
||||||
|
Set ``key`` to ``value``.
|
||||||
|
"""
|
||||||
|
if self.__locked:
|
||||||
|
raise AttributeError('locked: cannot set %s.%s to %r' %
|
||||||
|
(self.__class__.__name__, key, value)
|
||||||
|
)
|
||||||
|
if key in self.__d or hasattr(self, key):
|
||||||
|
raise AttributeError('cannot overwrite %s.%s with %r' %
|
||||||
|
(self.__class__.__name__, key, value)
|
||||||
|
)
|
||||||
|
self.__d[key] = value
|
||||||
|
if not callable(value):
|
||||||
|
assert type(value) in (str, int, bool)
|
||||||
|
object.__setattr__(self, key, value)
|
||||||
|
|
||||||
|
def __contains__(self, key):
|
||||||
|
"""
|
||||||
|
Return True if instance contains ``key``; otherwise return False.
|
||||||
|
"""
|
||||||
|
return key in self.__d
|
||||||
|
|
||||||
|
def __iter__(self): # Fix
|
||||||
|
"""
|
||||||
|
Iterate through keys in ascending order.
|
||||||
|
"""
|
||||||
|
for key in sorted(self.__d):
|
||||||
|
yield key
|
||||||
|
|
||||||
|
|
||||||
def set_default_env(env):
|
def set_default_env(env):
|
||||||
"""
|
"""
|
||||||
Set default values for ``env``.
|
Set default values for ``env``.
|
||||||
|
@ -23,8 +23,8 @@ Test the `ipalib.config` module.
|
|||||||
|
|
||||||
import types
|
import types
|
||||||
|
|
||||||
from tests.util import raises, setitem, delitem
|
from tests.util import raises, setitem, delitem, ClassChecker
|
||||||
#from tests.util import getitem, setitem, delitem
|
from tests.util import getitem, setitem, delitem
|
||||||
from ipalib import config
|
from ipalib import config
|
||||||
|
|
||||||
|
|
||||||
@ -112,6 +112,124 @@ def test_Environment():
|
|||||||
assert env.a != 1000
|
assert env.a != 1000
|
||||||
|
|
||||||
|
|
||||||
|
class test_Env(ClassChecker):
|
||||||
|
"""
|
||||||
|
Test the `ipalib.config.Env` class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
_cls = config.Env
|
||||||
|
|
||||||
|
def test_init(self):
|
||||||
|
"""
|
||||||
|
Test the `ipalib.config.Env.__init__` method.
|
||||||
|
"""
|
||||||
|
o = self.cls()
|
||||||
|
|
||||||
|
def test_lock(self):
|
||||||
|
"""
|
||||||
|
Test the `ipalib.config.Env.__lock__` method.
|
||||||
|
"""
|
||||||
|
o = self.cls()
|
||||||
|
assert o._Env__locked is False
|
||||||
|
o.__lock__()
|
||||||
|
assert o._Env__locked is True
|
||||||
|
e = raises(StandardError, o.__lock__)
|
||||||
|
assert str(e) == 'Env.__lock__() already called'
|
||||||
|
|
||||||
|
def test_getattr(self):
|
||||||
|
"""
|
||||||
|
Test the `ipalib.config.Env.__getattr__` method.
|
||||||
|
|
||||||
|
Also tests the `ipalib.config.Env.__getitem__` method.
|
||||||
|
"""
|
||||||
|
o = self.cls()
|
||||||
|
value = 'some value'
|
||||||
|
o.key = value
|
||||||
|
assert o.key is value
|
||||||
|
assert o['key'] is value
|
||||||
|
o.call = lambda: 'whatever'
|
||||||
|
assert o.call == 'whatever'
|
||||||
|
assert o['call'] == 'whatever'
|
||||||
|
for name in ('one', 'two'):
|
||||||
|
e = raises(AttributeError, getattr, o, name)
|
||||||
|
assert str(e) == 'Env.%s' % name
|
||||||
|
e = raises(KeyError, getitem, o, name)
|
||||||
|
assert str(e) == repr(name)
|
||||||
|
|
||||||
|
def test_setattr(self):
|
||||||
|
"""
|
||||||
|
Test the `ipalib.config.Env.__setattr__` method.
|
||||||
|
|
||||||
|
Also tests the `ipalib.config.Env.__setitem__` method.
|
||||||
|
"""
|
||||||
|
items = [
|
||||||
|
('one', 1),
|
||||||
|
('two', lambda: 2),
|
||||||
|
('three', 3),
|
||||||
|
('four', lambda: 4),
|
||||||
|
]
|
||||||
|
for setvar in (setattr, setitem):
|
||||||
|
o = self.cls()
|
||||||
|
for (i, (name, value)) in enumerate(items):
|
||||||
|
setvar(o, name, value)
|
||||||
|
assert getattr(o, name) == i + 1
|
||||||
|
assert o[name] == i + 1
|
||||||
|
if callable(value):
|
||||||
|
assert name not in dir(o)
|
||||||
|
else:
|
||||||
|
assert name in dir(o)
|
||||||
|
e = raises(AttributeError, setvar, o, name, 42)
|
||||||
|
assert str(e) == 'cannot overwrite Env.%s with 42' % name
|
||||||
|
o = self.cls()
|
||||||
|
o.__lock__()
|
||||||
|
for (name, value) in items:
|
||||||
|
e = raises(AttributeError, setvar, o, name, value)
|
||||||
|
assert str(e) == \
|
||||||
|
'locked: cannot set Env.%s to %r' % (name, value)
|
||||||
|
|
||||||
|
def test_delattr(self):
|
||||||
|
"""
|
||||||
|
Test the `ipalib.config.Env.__delattr__` method.
|
||||||
|
|
||||||
|
This also tests that ``__delitem__`` is not implemented.
|
||||||
|
"""
|
||||||
|
o = self.cls()
|
||||||
|
o.one = 1
|
||||||
|
assert o.one == 1
|
||||||
|
for key in ('one', 'two'):
|
||||||
|
e = raises(AttributeError, delattr, o, key)
|
||||||
|
assert str(e) == 'cannot del Env.%s' % key
|
||||||
|
e = raises(AttributeError, delitem, o, key)
|
||||||
|
assert str(e) == '__delitem__'
|
||||||
|
|
||||||
|
def test_contains(self):
|
||||||
|
"""
|
||||||
|
Test the `ipalib.config.Env.__contains__` method.
|
||||||
|
"""
|
||||||
|
o = self.cls()
|
||||||
|
items = [
|
||||||
|
('one', 1),
|
||||||
|
('two', lambda: 2),
|
||||||
|
('three', 3),
|
||||||
|
('four', lambda: 4),
|
||||||
|
]
|
||||||
|
for (key, value) in items:
|
||||||
|
assert key not in o
|
||||||
|
o[key] = value
|
||||||
|
assert key in o
|
||||||
|
|
||||||
|
def test_iter(self):
|
||||||
|
"""
|
||||||
|
Test the `ipalib.config.Env.__iter__` method.
|
||||||
|
"""
|
||||||
|
o = self.cls()
|
||||||
|
assert list(o) == []
|
||||||
|
keys = ('one', 'two', 'three', 'four', 'five')
|
||||||
|
for key in keys:
|
||||||
|
o[key] = 'the value'
|
||||||
|
assert list(o) == sorted(keys)
|
||||||
|
|
||||||
|
|
||||||
def test_set_default_env():
|
def test_set_default_env():
|
||||||
"""
|
"""
|
||||||
Test the `ipalib.config.set_default_env` function.
|
Test the `ipalib.config.set_default_env` function.
|
||||||
|
Loading…
Reference in New Issue
Block a user