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()

Reply via email to