def __init__(self, inputFile): """ Constructor @ In, inputFile, string, input file name @ Out, None """ self.printTag = 'RAVEN_PARSER' # print tag self.inputFile = inputFile # input file name self.outStreamsNames = { } # {'outStreamName':[DataObjectName,DataObjectType]} self.varGroups = {} # variable groups, names and values if not os.path.exists(inputFile): raise IOError(self.printTag + ' ERROR: Not found RAVEN input file') try: tree = ET.parse(open(inputFile, 'r')) except IOError as e: raise IOError(self.printTag + ' ERROR: Input Parsing error!\n' + str(e) + '\n') self.tree = tree.getroot() # expand the ExteranlXML nodes cwd = os.path.dirname(inputFile) xmlUtils.expandExternalXML(self.tree, cwd) # get the NAMES of the variable groups variableGroupNode = self.tree.find('VariableGroups') if variableGroupNode is not None: # make a messageHandler and messageUsesr to handle variable group creation ## if made generally available to this parser, this can be relocated and used generally messageHandler = MessageHandler.MessageHandler() messageHandler.initialize({'verbosity': 'quiet'}) messageUser = MessageHandler.MessageUser() self.varGroups = xmlUtils.readVariableGroups( variableGroupNode, messageHandler, messageUser) # do some sanity checks sequence = [ step.strip() for step in self.tree.find('.//RunInfo/Sequence').text.split(",") ] # firstly no multiple sublevels of RAVEN can be handled now for code in self.tree.findall('.//Models/Code'): if 'subType' not in code.attrib: raise IOError( self.printTag + ' ERROR: Not found subType attribute in <Code> XML blocks!' ) if code.attrib['subType'].strip() == 'RAVEN': raise IOError( self.printTag + ' ERROR: Only one level of RAVEN runs are allowed (Not a chain of RAVEN runs). Found a <Code> of subType RAVEN!' ) # find steps and check if there are active outstreams (Print) foundOutStreams = False for step in self.tree.find('.//Steps'): if step.attrib['name'] in sequence: for role in step: if role.tag.strip() == 'Output': mainClass, subType = role.attrib['class'].strip( ), role.attrib['type'].strip() if mainClass == 'OutStreams' and subType == 'Print': outStream = self.tree.find( './/OutStreams/Print[@name="' + role.text.strip() + '"]' + '/source') if outStream is None: raise IOError( self.printTag + ' ERROR: The OutStream of type "Print" named "' + role.text.strip() + '" has not been found!') dataObjectType = None linkedDataObjectPointSet = self.tree.find( './/DataObjects/PointSet[@name="' + outStream.text.strip() + '"]') if linkedDataObjectPointSet is None: linkedDataObjectHistorySet = self.tree.find( './/DataObjects/HistorySet[@name="' + outStream.text.strip() + '"]') if linkedDataObjectHistorySet is None: # try dataset linkedDataObjectHistorySet = self.tree.find( './/DataObjects/DataSet[@name="' + outStream.text.strip() + '"]') if linkedDataObjectHistorySet is None: raise IOError( self.printTag + ' ERROR: The OutStream of type "Print" named "' + role.text.strip() + '" is linked to not existing DataObject!' ) dataObjectType, xmlNode = "HistorySet", linkedDataObjectHistorySet else: dataObjectType, xmlNode = "PointSet", linkedDataObjectPointSet self.outStreamsNames[role.text.strip()] = [ outStream.text.strip(), dataObjectType, xmlNode ] foundOutStreams = True if not foundOutStreams: raise IOError( self.printTag + ' ERROR: at least one <OutStreams> of type "Print" needs to be inputted in the active Steps!!' ) # Now we grep the paths of all the inputs the SLAVE RAVEN contains in the workind directory. self.workingDir = self.tree.find('.//RunInfo/WorkingDir').text.strip() # Find the Files self.slaveInputFiles = [] filesNode = self.tree.find('.//Files') if filesNode is not None: for child in self.tree.find('.//Files'): subDirectory = child.attrib.get('subDirectory', '') self.slaveInputFiles.append( os.path.expanduser( os.path.join(self.workingDir, subDirectory, child.text.strip()))) externalModels = self.tree.findall('.//Models/ExternalModel') if len(externalModels) > 0: for extModel in externalModels: if 'ModuleToLoad' in extModel.attrib: moduleToLoad = extModel.attrib['ModuleToLoad'] if not moduleToLoad.endswith("py"): moduleToLoad += ".py" if self.workingDir not in moduleToLoad: self.slaveInputFiles.append( os.path.expanduser( os.path.join(self.workingDir, moduleToLoad))) else: self.slaveInputFiles.append( os.path.expanduser(moduleToLoad)) else: if 'subType' not in extModel.attrib or len( extModel.attrib['subType']) == 0: raise IOError( self.printTag + ' ERROR: ExternalModel "' + extModel.attrib['name'] + '" does not have any attribute named "ModuleToLoad" or "subType" with an available plugin name!' ) externalFunctions = self.tree.findall('.//Functions/External') if len(externalFunctions) > 0: for extFunct in externalFunctions: if 'file' in extFunct.attrib: moduleToLoad = extFunct.attrib['file'] if not moduleToLoad.endswith("py"): moduleToLoad += ".py" if self.workingDir not in moduleToLoad: self.slaveInputFiles.append( os.path.expanduser( os.path.join(self.workingDir, moduleToLoad))) else: self.slaveInputFiles.append( os.path.expanduser(moduleToLoad)) else: raise IOError( self.printTag + ' ERROR: Functions/External ' + extFunct.attrib['name'] + ' does not have any attribute named "file"!!')
def __init__(self, inputFile): """ Constructor @ In, inputFile, string, input file name @ Out, None """ self.printTag = 'RAVEN_PARSER' # print tag self.inputFile = inputFile # input file name self.outStreamsNames = {} # {'outStreamName':[DataObjectName,DataObjectType]} self.databases = {} # {name: full rel path to file with filename} self.varGroups = {} # variable groups, names and values if not os.path.exists(inputFile): raise IOError(self.printTag+' ERROR: Not found RAVEN input file') try: tree = ET.parse(open(inputFile,'r')) except IOError as e: raise IOError(self.printTag+' ERROR: Input Parsing error!\n' +str(e)+'\n') self.tree = tree.getroot() # expand the ExteranlXML nodes cwd = os.path.dirname(inputFile) xmlUtils.expandExternalXML(self.tree,cwd) # get the NAMES of the variable groups variableGroupNode = self.tree.find('VariableGroups') if variableGroupNode is not None: # make a messageHandler and messageUsesr to handle variable group creation ## if made generally available to this parser, this can be relocated and used generally messageHandler = MessageHandler.MessageHandler() messageHandler.initialize({'verbosity':'quiet'}) messageUser = MessageHandler.MessageUser() self.varGroups = mathUtils.readVariableGroups(variableGroupNode,messageHandler,messageUser) # do some sanity checks sequence = [step.strip() for step in self.tree.find('.//RunInfo/Sequence').text.split(",")] # firstly no multiple sublevels of RAVEN can be handled now for code in self.tree.findall('.//Models/Code'): if 'subType' not in code.attrib: raise IOError(self.printTag+' ERROR: Not found subType attribute in <Code> XML blocks!') if code.attrib['subType'].strip() == 'RAVEN': raise IOError(self.printTag+' ERROR: Only one level of RAVEN runs are allowed (Not a chain of RAVEN runs). Found a <Code> of subType RAVEN!') # find steps and check if there are active outstreams (Print) foundOutStreams = False foundDatabases = False for step in self.tree.find('.//Steps'): if step.attrib['name'] in sequence: for role in step: if role.tag.strip() == 'Output': mainClass, subType = role.attrib['class'].strip(), role.attrib['type'].strip() if mainClass == 'OutStreams' and subType == 'Print': outStream = self.tree.find('.//OutStreams/Print[@name="'+role.text.strip()+ '"]'+'/source') if outStream is None: continue # can have an outstream in inner but still use database return dataObjectType = None linkedDataObjectPointSet = self.tree.find('.//DataObjects/PointSet[@name="'+outStream.text.strip()+ '"]') if linkedDataObjectPointSet is None: linkedDataObjectHistorySet = self.tree.find('.//DataObjects/HistorySet[@name="'+outStream.text.strip()+ '"]') if linkedDataObjectHistorySet is None: # try dataset linkedDataObjectHistorySet = self.tree.find('.//DataObjects/DataSet[@name="'+outStream.text.strip()+ '"]') if linkedDataObjectHistorySet is None: raise IOError(self.printTag+' ERROR: The OutStream of type "Print" named "'+role.text.strip()+'" is linked to not existing DataObject!') dataObjectType, xmlNode = "HistorySet", linkedDataObjectHistorySet else: dataObjectType, xmlNode = "PointSet", linkedDataObjectPointSet self.outStreamsNames[role.text.strip()] = [outStream.text.strip(),dataObjectType,xmlNode] foundOutStreams = True elif mainClass == 'Databases' and subType == 'NetCDF': rName = role.text.strip() db = self.tree.find(f'.//Databases/NetCDF[@name="{rName}"]') if db is None: continue # can have a database in inner but still use outsream return if db.attrib['readMode'] == 'overwrite': dirs = db.attrib.get('directory', 'DatabaseStorage') name = db.attrib.get('filename', db.attrib['name']+'.nc') full = os.path.join(dirs, name) self.databases[rName] = full foundDatabases = True if not foundOutStreams and not foundDatabases: raise IOError(self.printTag+' ERROR: No <OutStreams><Print> or <Databases><NetCDF readMode="overwrite"> found in the active <Steps> of inner RAVEN!') # Now we grep the paths of all the inputs the SLAVE RAVEN contains in the workind directory. self.workingDir = self.tree.find('.//RunInfo/WorkingDir').text.strip() # Find the Files self.slaveInputFiles = self.findSlaveFiles(self.tree, self.workingDir)
# See the License for the specific language governing permissions and # limitations under the License. import sys import os #establish required paths for importing MessageHandler frameworkDir = os.path.abspath( os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', '..', '..', 'framework')) sys.path.append(frameworkDir) sys.path.append(os.path.join(frameworkDir, 'utils')) import MessageHandler #establish a basic message user user = MessageHandler.MessageUser() user.printTag = 'MessageUser' user.messageHandler = MessageHandler.MessageHandler() user.messageHandler.initialize({'verbosity': 'all'}) #test that exceptions raised through raiseAnError can be caught try: user.raiseAnError(RuntimeError, 'An example error') except RuntimeError: user.raiseAMessage('Error catching works as expected.') """ <TestInfo> <name>framework.test_trycatch</name> <author>talbpaul</author> <created>2016-02-26</created> <classesTested>MessageHandler</classesTested>