Ejemplo n.º 1
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)