Ejemplo n.º 1
0
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']
Ejemplo n.º 2
0
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']]
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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')
Ejemplo n.º 8
0
    def getDirDepth(self):

        dirDepth = len(self.fileName.split('/')) - len(
            uniIo.getTopDirectory().split('/')) - 1

        return dirDepth
Ejemplo n.º 9
0
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)