deepgetitem: try string index before int 07/39307/2
authorRoss Brattain <ross.b.brattain@intel.com>
Tue, 15 Aug 2017 03:30:39 +0000 (20:30 -0700)
committerRoss Brattain <ross.b.brattain@intel.com>
Tue, 15 Aug 2017 05:13:38 +0000 (05:13 +0000)
Change-Id: I3b353c5887db0ebbe33e37db505e72b85167b54e
Signed-off-by: Ross Brattain <ross.b.brattain@intel.com>
tests/unit/network_services/vnf_generic/test_vnfdgen.py
yardstick/network_services/vnf_generic/vnfdgen.py

index be51e4a..44d9058 100644 (file)
@@ -193,6 +193,14 @@ class TestVnfdGen(unittest.TestCase):
         d = {'a': 1, 'b': 2}
         self.assertEqual(vnfdgen.deepgetitem(d, "a"), 1)
 
+    def test_dict_flatten_str_int_key_first(self):
+        d = {'0': 1, 0: 24, 'b': 2}
+        self.assertEqual(vnfdgen.deepgetitem(d, "0"), 1)
+
+    def test_dict_flatten_int_key_fallback(self):
+        d = {0: 1, 'b': 2}
+        self.assertEqual(vnfdgen.deepgetitem(d, "0"), 1)
+
     def test_dict_flatten_list(self):
         d = {'a': 1, 'b': list(range(2))}
         self.assertEqual(vnfdgen.deepgetitem(d, "b.0"), 0)
@@ -201,6 +209,11 @@ class TestVnfdGen(unittest.TestCase):
         d = {'a': 1, 'b': {x: x for x in list(range(2))}}
         self.assertEqual(vnfdgen.deepgetitem(d, "b.0"), 0)
 
+    def test_dict_flatten_only_str_key(self):
+        d = {'0': 1, 0: 24, 'b': 2}
+        self.assertRaises(AttributeError, vnfdgen.deepgetitem, d, 0)
+
+
     def test_generate_tp_single_var(self):
         """ Function to verify traffic profile generation with imix """
 
index 0120b49..474403d 100644 (file)
@@ -73,19 +73,24 @@ def deepgetitem(obj, item, default=None):
 
     add try_int to work with sequences
 
-    >>> d = {'snl_final': {'about': {'_icsd': {'icsd_id': 1, 'fr': [2, 3]}}}}
+    >>> d = {'snl_final': {'about': {'_icsd': {'icsd_id': 1, 'fr': [2, 3], '0': 24, 0: 4}}}}
     >>> deepgetitem(d, 'snl_final.about._icsd.icsd_id')
     1
     >>> deepgetitem(d, 'snl_final.about._sandbox.sbx_id')
     >>>
     >>> deepgetitem(d, 'snl_final.about._icsd.fr.1')
     3
+    >>> deepgetitem(d, 'snl_final.about._icsd.0')
+    24
     """
     def getitem(obj, name):
-        # if integer then list index
-        name = try_int(name)
+        # try string then convert to int
         try:
             return obj[name]
         except (KeyError, TypeError, IndexError):
-            return default
+            name = try_int(name)
+            try:
+                return obj[name]
+            except (KeyError, TypeError, IndexError):
+                return default
     return reduce(getitem, item.split('.'), obj)