def parsePulProgName(name, fileLocation=None): """ Input: pulse program name to be parsed location of pulse program map file - if not given use standard file Output: List of (expName,isReversed) tuples expName can be either an NmrExpPrototype name or a RefExperiment name. isReversed can be True, False, or None (meaning not set). Caches pulse program parsing map """ global pulProgNameMap # get pulse program name translation map if fileLocation is None: if pulProgNameMap is None: fileLocation = uniIo.joinPath(uniIo.getTopDirectory(), 'data', 'ccp', 'bruker', 'BrukerPulseProgMap.xml') parseInfo = ccpGenUtil.loadAllParseInfo(fileLocation) pulProgNameMap = ccpGenUtil.convertParseInfo(parseInfo) else: parseInfo = ccpGenUtil.loadAllParseInfo(fileLocation) pulProgNameMap = ccpGenUtil.convertParseInfo(parseInfo) # get match result matchMap = matchName(name, pulProgNameMap, specialCases) dd = matchMap return matchMap['matches']
def testNameParsing(dirPath): """ Frame code to run name testing """ # set of imput info stdInfoFile = uniIo.joinPath(uniIo.getTopDirectory(), 'data', 'ccp', 'bruker', 'BrukerPulseProgMap.xml') fileNames = os.listdir(dirPath) fileNames.sort() parseInfo = ccpGenUtil.loadAllParseInfo(stdInfoFile) useInfo = ccpGenUtil.convertParseInfo(parseInfo) # set up mapId:list dictionary matchByMap = {} notmatched = [] skipped = [] for expNameMap in parseInfo['expNameMaps']: matchByMap[id(expNameMap)] = [] # match filenames and store by matchDict for fname in fileNames: dd = matchName(fname, useInfo, specialCases) dd['fname'] = fname expNameMap = dd.get('expNameMap') if (dd.get('status') == 'skip' or not os.path.isfile(uniIo.joinPath(dirPath,fname))): skipped.append(dd) elif expNameMap is None: notmatched.append(dd) else: matchByMap[id(expNameMap)].append(dd) #print fname, dd['matches'], dd['names'], dd['unused'] # print result print '\nSKIPPED:' for dd in skipped: print ' - ', dd['fname'], dd.get('usenames'), dd.get('prefixes'), dd.get('unused') print '\nNO MATCH:' for dd in notmatched: print ' - ', dd['fname'], dd.get('usenames'), dd.get('prefixes'), dd.get('unused') unused = [] for xmap in parseInfo['expNameMaps']: ll = matchByMap[id(xmap)] prototypes = [(x.get('name'), x.get('isReversed')) for x in xmap['expPrototypes']] if ll: print '\nMATCH:', xmap.get('namesStartWith'), xmap.get('hasnames'), xmap.get('hasprefixes') print ' ', prototypes for dd in ll: if dd.get('unused'): ss = ' NB - ' else: ss = ' - ' print ss, dd['fname'], dd.get('usenames'), dd.get('prefixes'), dd.get('unused') for xmap in unused: print '\nUNUSED', xmap.get('namesStartWith'), xmap.get('hasnames'), xmap.get('hasprefixes') print ' ', [(x.get('name'), x.get('isReversed')) for x in xmap['expPrototypes']]
def setLicenses(directory=None, licenseDir='license', warnSkippedFiles=(not 0), mode='act'): """ wrapper - set license header for 'directory' and all subdirectories licenseDir is the relative path from 'directory' to the directory with license texts """ # necessary as the first directory may be a relative directory name, # playing havoc with import commands firstLookupDir = sys.path[0] sys.path[0] = '' try: global testInfo testInfo = {} if directory is None: directory = uniIo.getTopDirectory() else: directory = os.path.abspath(directory) doSetLicenses(directory, licenseDir, None, 0, warnSkippedFiles, mode) if mode == 'test': print showTestInfo() finally: sys.path[0] = firstLookupDir
def __init__(self): """ parameters are mandatoryInitParams, optionalInitParams and the special optional """ for tag in TextWriter_py_2_1.mandatoryAttributes: if not hasattr(self, tag): raise MemopsError(" TextWriter lacks mandatory %s attribute" % tag) super(TextWriter, self).__init__() # special parameters: optional with default values if self.rootFileName is None: self.rootFileName = ImpConstants.rootPackageDirName if self.rootDirName is None: self.rootDirName = uniIo.getTopDirectory() self.fp = None self.fileName = '' self.indent = 0 self.indents = [] self.errorMsg = '' self.previousLineEmpty = False # used so that do not print out two '\n' in a row
def getDataPath(*args): """ Gives location of data path. Extra args are added on as extra directories Result ends with the last arg (which might be either a file or a dictionary) """ dataPath = uniIo.joinPath(uniIo.getTopDirectory(), 'data', *args) return dataPath
def __init__(self, **kw): """To make this work under python 2.1 we need to inline the inits of several other files. """ # set input attributes for (tag, val) in kw.items(): if not hasattr(self, tag): setattr(self, tag, val) # in-line set xml settings (in lieu of Language init) settings = TextWriter_py_2_1.settings['xmlmodel'] for (tag, val) in settings.items(): if not hasattr(self, tag): setattr(self, tag, val) # in-line version of TextWriter init for tag in TextWriter_py_2_1.mandatoryAttributes: if not hasattr(self, tag): raise MemopsError(" TextWriter lacks mandatory %s attribute" % tag) # special parameters: optional with default values if self.rootFileName is None: self.rootFileName = ImpConstants.rootPackageDirName if self.rootDirName is None: self.rootDirName = uniIo.getTopDirectory() # process self.includePackageNames, including container names inclNames = self.includePackageNames if inclNames: for name in inclNames: ll = name.split('.') for ii in range(1, len(ll)): ss = '.'.join(ll[:ii]) if ss not in inclNames: inclNames.append(ss) self.fp = None self.fileName = '' self.indent = 0 self.indents = [] self.errorMsg = '' self.previousLineEmpty = False # used so that do not print out two '\n' in a row
def __init__(self, **kw): """To make this work under python 2.1 we need to inline the inits of several other files. """ # XmlModelGen init self.addModelFlavour('language', 'xmlmodel') for (tag, val) in kw.items(): if not hasattr(self, tag): setattr(self, tag, val) # TopObject and DataRoot for us below ic = ImpConstants Impl = self.modelPortal.metaObjFromQualName('.'.join( [ic.modellingPackageName, ic.implementationPackageName])) self.DataRoot = Impl.getElement(ic.dataRootName) self.TopObject = Impl.getElement(ic.topObjClassName) # in-line set xml settings (in lieu of Language init) settings = TextWriter_py_2_1.settings['xmlmodel'] for (tag, val) in settings.items(): if not hasattr(self, tag): setattr(self, tag, val) # in-line version of TextWriter init for tag in TextWriter_py_2_1.mandatoryAttributes: if not hasattr(self, tag): raise MemopsError(" TextWriter lacks mandatory %s attribute" % tag) # special parameters: optional with default values if self.rootFileName is None: self.rootFileName = ImpConstants.rootPackageDirName if self.rootDirName is None: self.rootDirName = uniIo.getTopDirectory() if self.skipImplicit is None: self.skipImplicit = True self.fp = None self.fileName = '' self.indent = 0 self.indents = [] self.errorMsg = '' self.previousLineEmpty = False # used so that do not print out two '\n' in a row # in-line version of ModelTraverse init for tag in ModelTraverse_py_2_1.mandatoryAttributes: if not hasattr(self, tag): raise MemopsError( " ModelTraverse lacks mandatory %s attribute" % tag) # has to be done this way to allow for different initialisation orders if not hasattr(self, 'modelFlavours'): self.modelFlavours = {} # input check if not isinstance(self.modelPortal, ModelPortal): raise MemopsError("ModelTraverse input %s is not a ModelPortal" % self.modelPortal) # link varNames for easier access, and check modelPortal has been processed. # NBNB check if needed if hasattr(self, 'varNames'): # this must have been called from ModelAdapt pass elif hasattr(self.modelPortal, 'varNames'): self.varNames = self.modelPortal.varNames self.operationData = self.modelPortal.operationData # make repositoryTag and repositoryId dictionary # for every qualifiedName get previous repository ID information # In this way you can use the previous info for newly generated models self.oldRepData = oldRepData = {} try: dd = kw.copy() del dd['scriptName'] del dd['scriptRevision'] del dd['releaseVersion'] oldTop = readModel(checkValidity=False, **dd) oldPackages = [oldTop] while oldPackages: package = oldPackages.pop() pName = package.qualifiedName() # set dict entry ff = package._MetaModelElement__dataDict['taggedValues'].get x1, x2 = ff('repositoryId'), ff('repositoryTag') if x1 or x2: oldRepData[pName] = (x1, x2) ll = package.containedPackages if ll: # add contained packages to loop oldPackages.extend(ll) else: # set dict entries for contents for tag in ('dataTypes', 'constants', 'exceptions', 'dataObjTypes', 'classes'): for metaObj in getattr(package, tag): ff = metaObj._MetaModelElement__dataDict[ 'taggedValues'].get x1, x2 = ff('repositoryId'), ff('repositoryTag') if x1 or x2: ss = '%s.%s' % (pName, metaObj.name) oldRepData[ss] = (x1, x2) except: pass # set xml tag lists self._xmlInfo = { 'xmlAttrs': {}, 'stringDictElements': {}, 'plainElements': {}, 'listElements': {}, } for clazz in MetaModel.nonAbstractClasses: xmlAttrs = self._xmlInfo['xmlAttrs'][clazz] = [] stringDictElements = self._xmlInfo['stringDictElements'][ clazz] = [] plainElements = self._xmlInfo['plainElements'][clazz] = [] listElements = self._xmlInfo['listElements'][clazz] = [] parameterData = clazz.parameterData for tag, parData in parameterData.items(): parType = parData.get('type') if tag in self._xmlSpecialTags: # special handling continue elif parData.get('setterFunc') == 'unsettable': # ignore continue elif parType == 'content': # ignore continue elif parType == 'StringDict': stringDictElements.append(tag) elif parData.get('hicard', 1) != 1: listElements.append(tag) elif parData.get('isLink'): plainElements.append(tag) else: # xml attribute xmlAttrs.append(tag) # adapt results xmlAttrs.sort() stringDictElements.sort() listElements.sort() plainElements.sort() plainElements.insert(0, 'documentation')
def getDirDepth(self): dirDepth = len(self.fileName.split('/')) - len( uniIo.getTopDirectory().split('/')) - 1 return dirDepth
def getOldData(oldPath, oldTag, currentVersionStr, oldName=None): import os from memops.universal import Io as uniIo from memops.metamodel.Util import topologicalSortSubgraph # find old implementation top directory and change temporarily to it. currentTopDir = uniIo.getTopDirectory() ss1, lastdir = os.path.split(currentTopDir) ss2, newTag = os.path.split(ss1) prevTopDir = os.path.join(ss2, oldTag, lastdir) uniIo.setTopDirectory(prevTopDir) # NB these things are put inside the function to avoid problems with # the uniIo.setTopDirectory approach def getCurrentVersionStr(): """ Encapsulated to get import out of main. Hoping to fix import problem. """ from memops.general.Constants import currentModelVersion return str(currentModelVersion) def downlinkTagsByImport(root, sorter=topologicalSortSubgraph): """ downlink tags from MemopsRoot object for leafPackages in import order This is the post-v2.0 version """ leafPackages = [] packages = [root.metaclass.container.topPackage()] for pp in packages: childPackages = pp.containedPackages if childPackages: packages.extend(childPackages) else: leafPackages.append(pp) # sort leafPackages by import (imported before importing) leafPackages = sorter(leafPackages, 'accessedPackages') tags = [] for pp in leafPackages: cc = pp.topObjectClass if cc is not None: pr = cc.parentRole if pr is not None: tags.append(pr.otherRole.name) # return tags try: # get old version as string oldVersionStr = getCurrentVersionStr() from memops.general import Io as oldIo # post-version-2 behaviour - get repository dir and project name if oldName is None: head, tail = os.path.split(oldPath) oldName = os.path.splitext(tail)[0] oldPath = os.path.dirname(os.path.dirname(head)) # get root Object and force load all contents oldRoot = oldIo.loadProject(oldPath, projectName=oldName) if oldVersionStr != currentVersionStr: # We do have to convert - force load all TopObjects tags = downlinkTagsByImport(oldRoot) for tag in tags: for topObj in getattr(oldRoot, tag): if not topObj.isLoaded: topObj.load() finally: # set path back to current uniIo.setTopDirectory(currentTopDir) return (oldRoot, oldVersionStr, tags)