Author: pekka.klarck
Date: Tue Mar 24 01:23:17 2009
New Revision: 1492
Modified:
trunk/src/robot/utils/normalizing.py
trunk/utest/utils/test_normalizing.py
Log:
NormalizeDict now keeps original keys so that nd.keys() and nd.items()
return them correctly.
Modified: trunk/src/robot/utils/normalizing.py
==============================================================================
--- trunk/src/robot/utils/normalizing.py (original)
+++ trunk/src/robot/utils/normalizing.py Tue Mar 24 01:23:17 2009
@@ -42,9 +42,9 @@
def normalize_list(list_, ignore=[], caseless=True, spaceless=True):
"""Normalize list, sort it and remove empty values"""
- d = NormalizedDict(ignore=ignore, caseless=caseless,
spaceless=spaceless)
+ d = {}
for item in list_:
- d[item] = 1
+ d[normalize(item, ignore, caseless, spaceless)] = 1
ret = [ k for k in d.keys() if k != '' ]
ret.sort()
return ret
@@ -69,19 +69,25 @@
def __init__(self, initial={}, ignore=[], caseless=True,
spaceless=True):
UserDict.__init__(self)
- self._ignore = ignore
- self._caseless = caseless
- self._spaceless = spaceless
+ self._keys = {}
+ self._normalize = lambda s: normalize(s, ignore, caseless,
spaceless)
for key, value in initial.items():
- self.__setitem__(key, value)
+ self[key] = value
def __setitem__(self, key, value):
- self.data[self._normalize(key)] = value
+ nkey = self._normalize(key)
+ self._keys.setdefault(nkey, key)
+ self.data[nkey] = value
set = __setitem__
def __getitem__(self, key):
return self.data[self._normalize(key)]
+
+ def __delitem__(self, key):
+ nkey = self._normalize(key)
+ del self.data[nkey]
+ del self._keys[nkey]
def get(self, key, default=None):
try:
@@ -94,5 +100,13 @@
__contains__ = has_key
- def _normalize(self, item):
- return normalize(item, self._ignore, self._caseless,
self._spaceless)
+ def keys(self):
+ return self._keys.values()
+
+ def items(self):
+ return [ (key, self[key]) for key in self.keys() ]
+
+ def copy(self):
+ copy = UserDict.copy(self)
+ copy._keys = self._keys.copy()
+ return copy
Modified: trunk/utest/utils/test_normalizing.py
==============================================================================
--- trunk/utest/utils/test_normalizing.py (original)
+++ trunk/utest/utils/test_normalizing.py Tue Mar 24 01:23:17 2009
@@ -104,13 +104,57 @@
assert_false(nd.has_key(key))
assert_equals(nd['F o o B AR'], 'value')
- def test_has_key(self):
+ def test_has_key_and_contains(self):
+ nd = NormalizedDict({'Foo': 'bar'})
+ fail_unless(nd.has_key('Foo') and nd.has_key(' f O o '))
+ fail_unless('Foo' in nd and 'foo' in nd and 'FOO' in nd)
+
+ def test_original_keys_are_kept(self):
nd = NormalizedDict()
- nd['Foo'] = 'bar'
- fail_unless(nd.has_key('Foo'))
- fail_unless(nd.has_key(' f O o '))
-
-
+ nd['Foo'] = nd['a b c'] = nd['UP'] = 1
+ keys = nd.keys()
+ items = nd.items()
+ keys.sort()
+ items.sort()
+ assert_equals(keys, ['Foo', 'UP', 'a b c'])
+ assert_equals(items, [('Foo', 1), ('UP', 1), ('a b c', 1)])
+
+ def test_removing_values(self):
+ nd = NormalizedDict({'A':1, 'b':2})
+ del nd['a']
+ del nd['B']
+ assert_equals(nd.data, {})
+ assert_false(nd.has_key('a') or nd.has_key('b'))
+
+ def test_removing_values_removes_also_original_keys(self):
+ nd = NormalizedDict({'a':1})
+ del nd['a']
+ assert_equals(nd.data, {})
+ assert_equals(nd.keys(), [])
+
+ def test_keys_values_and_items_are_returned_in_same_order(self):
+ nd = NormalizedDict()
+ for i, c in enumerate('abcdefghijklmnopqrstuvwxyz'):
+ nd[c.upper()] = i
+ nd[c+str(i)] = 1
+ items = nd.items()
+ keys = nd.keys()
+ values = nd.values()
+ assert_equals(items, zip(keys, values))
+
+ def test_copy(self):
+ nd = NormalizedDict({'a': 1, 'B': 1})
+ cd = nd.copy()
+ assert_equals(nd, cd)
+ assert_equals(nd.data, cd.data)
+ assert_equals(nd._keys, cd._keys)
+ assert_equals(nd._normalize, cd._normalize)
+ nd['C'] = 1
+ cd['b'] = 2
+ assert_equals(nd._keys, {'a': 'a', 'b': 'B', 'c': 'C'})
+ assert_equals(cd._keys, {'a': 'a', 'b': 'B'})
+
+
if __name__ == '__main__':
unittest.main()