diff options
author | rcoh <rcoh@mit.edu> | 2010-12-26 14:38:25 -0500 |
---|---|---|
committer | rcoh <rcoh@mit.edu> | 2010-12-26 14:38:25 -0500 |
commit | bbb31f8213d61b7c91d8b17c543d12491dd2df1b (patch) | |
tree | 587be5cb3b64fb5797dc311ac082e3e7503635c2 /util | |
parent | b09a41f0891c041ad4fcecca59d03f52fe9ee9e8 (diff) |
a bugfix in APL. Support and a unit test for behavior inheritance. It now happens automatically
when the config is loaded. Simply use Config.loadConfigFile(fileName) to leverage the
functionality.
Diffstat (limited to 'util')
-rw-r--r-- | util/Config.py | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/util/Config.py b/util/Config.py index 36ff104..33e6fee 100644 --- a/util/Config.py +++ b/util/Config.py @@ -8,23 +8,28 @@ def loadParamRequirementDict(className): if not className in classArgsMem: #WOO CACHING classArgsMem[className] = fileToDict(CONFIG_PATH + className) return classArgsMem[className] +#Loads a config file. If its an xml file, inheritances are automatically resolved. def loadConfigFile(fileName): #TODO: error handling etc. #try: - fileName = CONFIG_PATH + fileName + #fileName = CONFIG_PATH + fileName if '.params' in fileName: return fileToDict(fileName) if '.xml' in fileName: config = ElementTree() #use .fromstring, and resolve xincludes config.parse(fileName) + config = ElementTree(resolveConfigInheritance(config.getroot())) return config #except: return None +#Takes an Element or an ElementTree. If it is a tree, it returns its root. Otherwise, just returns +#it def getElement(el): if xml.etree.ElementTree.iselement(el): return el elif el.__class__ == ElementTree: return el.getroot() -def compositeXMLTrees(parentTree, overridingTree): +def compositeXMLTrees(parentTree, overridingTree): #TODO: break up into sub-methods, change it to +#use .find() #type checking -- convert ElementTrees to their root elements parentTree = getElement(parentTree) overridingTree = getElement(overridingTree) @@ -45,12 +50,18 @@ def compositeXMLTrees(parentTree, overridingTree): if Strings.OVERRIDE_BEHAVIOR in interEl.attrib: mode = interEl.attrib[Strings.OVERRIDE_BEHAVIOR] if mode != 'Replace' and mode != 'Merge': - print 'Bad Mode. Replacing' + print 'Bad Mode. Choosing to replace.' mode = 'Replace' if mode == 'Replace': pass #we don't need to do anything if mode == 'Merge': interEl = compositeXMLTrees(item, interEl) + for item in overrideItems: #resolve appendages + if item.tag == 'APPEND': + children = item.getchildren() + for child in children: + overrideItems.insert(-1, child) + overrideItems.remove(item) return overridingTree def findElementsByTag(tag, eList): return [el for el in eList if el.tag == tag] @@ -89,3 +100,11 @@ def generateArgDict(parentNode, recurse=False): if len(args.keys()) == 1 and recurse: return args[args.keys()[0]] return args + +def resolveConfigInheritance(el): + parentClass = el.find('InheritsFrom') + if parentClass != None: + parentTree = loadConfigFile(parentClass.text) + el = compositeXMLTrees(el, parentTree) + el.remove(parentClass) #get rid of the inheritance flag + return el |