Browse Source

refactor the different find() and set() methods

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/trac405@3452 e5f2f494-b856-4b98-b285-d166d9295462
Jelte Jansen 14 years ago
parent
commit
b72efb5548
1 changed files with 28 additions and 28 deletions
  1. 28 28
      src/lib/python/isc/cc/data.py

+ 28 - 28
src/lib/python/isc/cc/data.py

@@ -55,20 +55,27 @@ def merge(orig, new):
         else:
         else:
             orig[kn] = new[kn]
             orig[kn] = new[kn]
 
 
+def _split_identifier(identifier):
+    if type(identifier) != str:
+        raise DataTypeError("identifier is not a string")
+    id_parts = identifier.split("/")
+    id_parts[:] = (value for value in id_parts if value != "")
+    return id_parts
+
+def _find_child_el(element, id):
+    if type(element) == dict and id in element.keys():
+        return element[id]
+    else:
+        raise DataNotFoundError(id + " in " + str(element))
+
 def find(element, identifier):
 def find(element, identifier):
     """Returns the subelement in the given data element, raises DataNotFoundError if not found"""
     """Returns the subelement in the given data element, raises DataNotFoundError if not found"""
-    if type(identifier) != str or (type(element) != dict and identifier != ""):
+    if (type(element) != dict and identifier != ""):
-        raise DataTypeError("identifier in merge() is not a string")
-    if type(identifier) != str or (type(element) != dict and identifier != ""):
         raise DataTypeError("element in merge() is not a dict")
         raise DataTypeError("element in merge() is not a dict")
-    id_parts = identifier.split("/")
+    id_parts = _split_identifier(identifier)
-    id_parts[:] = (value for value in id_parts if value != "")
     cur_el = element
     cur_el = element
     for id in id_parts:
     for id in id_parts:
-        if type(cur_el) == dict and id in cur_el.keys():
+        cur_el = _find_child_el(cur_el, id)
-            cur_el = cur_el[id]
-        else:
-            raise DataNotFoundError(identifier + " in " + str(element))
     return cur_el
     return cur_el
 
 
 def set(element, identifier, value):
 def set(element, identifier, value):
@@ -81,23 +88,21 @@ def set(element, identifier, value):
        el.set().set().set() is possible)"""
        el.set().set().set() is possible)"""
     if type(element) != dict:
     if type(element) != dict:
         raise DataTypeError("element in set() is not a dict")
         raise DataTypeError("element in set() is not a dict")
-    if type(identifier) != str:
+    id_parts = _split_identifier(identifier)
-        raise DataTypeError("identifier in set() is not a string")
-    id_parts = identifier.split("/")
-    id_parts[:] = (value for value in id_parts if value != "")
     cur_el = element
     cur_el = element
     for id in id_parts[:-1]:
     for id in id_parts[:-1]:
-        if id in cur_el.keys():
+        try:
-            cur_el = cur_el[id]
+            cur_el = _find_child_el(cur_el, id)
-        else:
+        except DataNotFoundError:
-            if value == None:
+            if value is None:
                 # ok we are unsetting a value that wasn't set in
                 # ok we are unsetting a value that wasn't set in
                 # the first place. Simply stop.
                 # the first place. Simply stop.
                 return
                 return
             cur_el[id] = {}
             cur_el[id] = {}
             cur_el = cur_el[id]
             cur_el = cur_el[id]
+
     # value can be an empty list or dict, so check for None eplicitely
     # value can be an empty list or dict, so check for None eplicitely
-    if value != None:
+    if value is not None:
         cur_el[id_parts[-1]] = value
         cur_el[id_parts[-1]] = value
     elif id_parts[-1] in cur_el:
     elif id_parts[-1] in cur_el:
         del cur_el[id_parts[-1]]
         del cur_el[id_parts[-1]]
@@ -115,17 +120,12 @@ def find_no_exc(element, identifier):
     """Returns the subelement in the given data element, returns None
     """Returns the subelement in the given data element, returns None
        if not found, or if an error occurred (i.e. this function should
        if not found, or if an error occurred (i.e. this function should
        never raise an exception)"""
        never raise an exception)"""
-    if type(identifier) != str:
+    try:
+        return find(element, identifier)
+    except DataNotFoundError:
+        return None
+    except DataTypeError:
         return None
         return None
-    id_parts = identifier.split("/")
-    id_parts[:] = (value for value in id_parts if value != "")
-    cur_el = element
-    for id in id_parts:
-        if (type(cur_el) == dict and id in cur_el.keys()) or id=="":
-            cur_el = cur_el[id]
-        else:
-            return None
-    return cur_el
 
 
 def parse_value_str(value_str):
 def parse_value_str(value_str):
     """Parses the given string to a native python object. If the
     """Parses the given string to a native python object. If the