Пример #1
0
 def getDefaultLoader(self):
     with cd(self.defAbsDir):
         defPath = [Path(p).absolute().as_posix() for p in self.defPath]
     with cd(self.cfgAbsDir):
         cfgPath = [Path(p).absolute().as_posix() for p in self.cfgPath]
     loader = ChoiceLoader([
         FileSystemLoader(cfgPath),
         FileSystemLoader(defPath)])
     return loader
Пример #2
0
 def getDefaultLoader(self):
     with cd(self.defAbsDir):
         defPath = [Path(p).absolute().as_posix() for p in self.defPath]
     with cd(self.cfgAbsDir):
         cfgPath = [Path(p).absolute().as_posix() for p in self.cfgPath]
     loader = ChoiceLoader(
         [FileSystemLoader(cfgPath),
          FileSystemLoader(defPath)])
     return loader
Пример #3
0
    def templateExists(self, filename):
        '''
        Test if a template exists in this segement.

        :param Path filename: relative filename of template file.
        :returns: True if exists.
        :rtype: boolean
        '''
        with cd(self.absDirname):
            with cd(self.properties.defaultTemplatePath):
                absDst = filename.absolute()
        return absDst.exists()
Пример #4
0
    def deleteTemplate(self, filename):
        '''
        Delete a template from this segment.

        :param Path filename: relative filename of template file.
        :returns: True if success.
        :rtype: boolean
        '''
        with cd(self.absDirname):
            with cd(self.properties.defaultTemplatePath):
                absDst = filename.absolute()
        if absDst.exists():
            absDst.unlink()
        return True
Пример #5
0
 def test_findModuleDefinitions(self, tmp_path):
     '''Test finding segment xform files.'''
     fashionHome = Path(__file__).resolve().parent.parent / "fashion"
     segPath = fashionHome / "warehouse" / "fashion.core"
     with cd(segPath):
         seg = Segment.load(Path("segment.json"))
         xformModules = seg.findModuleDefinitions()
Пример #6
0
def nab(args):
    '''Create a template and xform from a file.'''
    global portfolio
    if not setup(args):
        return
    filename = portfolio.normalizeFilename(args.filename)
    with cd(portfolio.projectPath):
        if not filename.exists():
            print("{0} not found.".format(filename))
            return
        tp = portfolio.warehouse.getDefaultsTemplatePath()
        seg = portfolio.defaultSegment()
        xformName = filename.stem
        model = {
            "template": filename.as_posix(),
            "targetFile": filename.as_posix()
        }
        tplFile = "defaultNabXformTemplate.py"
        if seg.templateExists(filename):
            if query_yes_no("Are you sure you want to overwrite the template?", "no"):
                seg.deleteTemplate(filename)
            else:
                return

        if seg.xformExists(xformName):
            if query_yes_no("Are you sure you want to overwrite the xform?", "no"):
                seg.deleteXform(str(filename))
            else:
                return
        seg.createTemplate(filename)
        seg.createXform(xformName, tp, templateFile=tplFile, model=model)
Пример #7
0
    def createXform(self, xformName, templatePath, templateFile="defaultXformTemplate.py", model={}, moduleName=None):
        '''
        Create an xform module in this segment.

        :param string xformName: name of xform to create.
        :param list(string) templatePath: ordered list of search paths for template files.
        :param string templateFile: the template to use to generate the xform code.
        :param dictionary model: the model passed to the xform source code generator.
        :param string moduleName: the moduleName for this xform module, else default is same as xformName.
        :returns: True if succeeded.
        :rtype: boolean
        '''
        with cd(self.absDirname):
            filename = Path(xformName + ".py")
            targetFile = Path(self.properties.defaultXformPath) / filename
            if moduleName is None:
                moduleName = filename.stem
            if not createDefaultXform(templatePath, targetFile, templateFile=templateFile, model=model):
                print("Failed!")
            else:
                self.properties.xformModules.append({
                    "moduleName": moduleName,
                    "filename": targetFile.as_posix(),
                    "inputKinds": [],
                    "outputKinds": [],
                    "tags": []
                })
                self.properties.xformConfig.append({
                    "moduleName": self.properties.name + "." + moduleName,
                    "parameters": {},
                    "tags": []
                })
                self.save()
        return True
Пример #8
0
 def loadSchemas(self):
     '''Load all schemas from the warehouse.'''
     self.schemaDefs = self.warehouse.getSchemaDefintions()
     for _, schDef in self.schemaDefs.items():
         # TODO: insert schema definition record into database
         with cd(schDef.absDirname):
             self.schemaRepo.addFromDescription(schDef)
Пример #9
0
def deleteTemplate(args):
    global portfolio
    if not setup(args):
        return
    filename = portfolio.normalizeFilename(args.name)
    with cd(portfolio.projectPath):
        seg = portfolio.defaultSegment()
        seg.deleteTemplate(filename)
Пример #10
0
def createTemplate(args):
    global portfolio
    if not setup(args):
        return
    filename = portfolio.normalizeFilename(args.name)
    with cd(portfolio.projectPath):
        tp = portfolio.warehouse.getDefaultsTemplatePath()
        seg = portfolio.defaultSegment()
        seg.createTemplate(filename, tp)
Пример #11
0
 def test_saveLoad(self, tmp_path):
     logging.basicConfig(level=logging.DEBUG)
     with cd(tmp_path):
         pf = Portfolio(tmp_path)
         pf.create()
         pf.save()
         pf.db.close()
         pf2 = Portfolio(tmp_path)
         assert pf2.properties.name == "fashion"
Пример #12
0
    def createTemplate(self, filename):
        '''
        Create a template in this segment from a file.

        :param Path filename: filename of template file, relative to portfolio project directory.
        :returns: True if success.
        :rtype: boolean
        '''
        absFn = filename.absolute()
        with cd(self.absDirname):
            with cd(self.properties.defaultTemplatePath):
                absDst = filename.absolute()
        try:
            absDst.parent.mkdir(parents=True, exist_ok=True)
        except:
            pass
        shutil.copy(absFn.as_posix(), absDst.as_posix())
        return True
Пример #13
0
    def importSegment(self, zipfilename):
        '''
        Import a segment from a zip file.

        :param string zipfilename: filename of export.
        '''
        with zipfile.ZipFile(zipfilename, mode='r') as zip:
            with cd(self.dir):
                zip.extractall()
Пример #14
0
 def test_createDelete(self, tmp_path):
     logging.basicConfig(level=logging.DEBUG)
     with cd(tmp_path):
         pf = Portfolio(tmp_path)
         assert pf is not None
         assert pf.exists() == False
         pf.create()
         assert pf.exists() == True
         pf.delete()
         assert pf.exists() == False
Пример #15
0
def build(args):
    '''Build the output.'''
    global portfolio
    if not setup(args):
        return
    print("building...")
    with cd(portfolio.projectPath):
        r = portfolio.getRunway()
        r.plan()
        r.execute()
Пример #16
0
    def getAbsPath(self, filename):
        '''
        Translate filename relative to this segment.

        :param Path filename: the relative filename to translate.
        :returns: the absolute path of the filename.
        :rtype: Path
        '''
        with cd(self.absDirname):
            return filename.absolute()
Пример #17
0
    def listSegments(self):
        '''
        List names of segments in this warehouse.

        :returns: a list of segment names in this warehouse.
        :rtype: list(string)
        '''
        # Return the named subdirectories.
        with cd(self.dir):
            return [d.name for d in self.dir.iterdir() if d.is_dir()]
Пример #18
0
    def xformExists(self, xformName):
        '''
        Test if an xform exists in this segment.

        :param string xformName: name of xform to test.
        :returns: True if xform exists.
        :rtype: boolean
        '''
        filename = Path(xformName + ".py")
        targetFile = Path(self.properties.defaultXformPath) / filename
        with cd(self.absDirname):
            return targetFile.exists()
Пример #19
0
 def initModules(self, tags=None):
     '''Initialize modules from their configs.'''
     self.moduleCfgs = self.warehouse.getModuleConfigs(self.dba, self.modules)
     verbose = self.dba.isVerbose()
     for cfg in self.moduleCfgs:
         with cd(cfg.absDirname):
             with ModelAccess(self.dba, self.schemaRepo, cfg) as mdb:
                 self.setMdb(mdb)
                 mod = self.modules[cfg.moduleName]
                 if verbose:
                     print("Initializing module {0}".format(
                         mod.properties.moduleName))
                 self.codeRegistry.setObjectConfig(cfg)
                 mod.init(cfg, self.codeRegistry, tags)
Пример #20
0
    def exportSegment(self, segname, db):
        '''
        Export a segment to a zip file.

        :param string segname: name of segment to export.
        '''
        seg = self.loadSegment(segname, db)
        exportName = segname + "_v" + seg.properties.version + ".zip"
        dirName = seg.absDirname.parent.resolve()
        with zipfile.ZipFile(exportName, mode='w') as zip:
            with cd(dirName):
                for root, _, files in os.walk(segname):
                    if os.path.basename(root) != '__pycache__':
                        for file in files:
                            zip.write(os.path.join(root, file))
Пример #21
0
 def test_ctor(self, tmp_path):
     '''Test Segment ctor.'''
     with cd(tmp_path):
         s1 = Segment(Path("segment.json"))
         assert s1.absFilename is not None
         assert s1.absDirname is not None
         assert s1.properties.templatePath[0] == "./template"
         assert len(s1.properties.segmentRefs) == 1
         s1.save()
         s2 = Segment.load(Path("segment.json"))
         assert s1.properties.templatePath == s2.properties.templatePath
         assert s1.properties.xformConfig == s2.properties.xformConfig
         assert s1.properties.segmentRefs == s2.properties.segmentRefs
         assert s1.properties.extraFiles == s2.properties.extraFiles
         assert s1.absFilename == s2.absFilename
Пример #22
0
 def loadModules(self, tags=None):
     '''Load all xform module code.'''
     self.moduleDefs = self.warehouse.getModuleDefinitions(self.dba, tags)
     verbose = self.dba.isVerbose()
     self.dba.table('fashion.core.module.definition').purge()
     for modName, modDef in self.moduleDefs.items():
         with cd(modDef.absDirname):
             if verbose:
                 print("Loading module {0}".format(modDef.moduleName))
             mod = XformModule(modDef)
             if mod.loadModuleCode():
                 self.modules[modName] = mod
                 self.dba.table('fashion.core.module.definition').insert(modDef)
             else:
                 # TODO: file not found, etc.
                 pass
Пример #23
0
    def createSchema(self, kind, schema):
        '''
        Create a JSON schema file for a model kind.

        :param string kind: model kind for schema.
        :param JSONobject schema: the schema for model kind.
        '''
        filename = Path(self.properties.defaultSchemaPath) / \
            Path(kind + ".json")
        with cd(self.absDirname):
            with filename.open(mode="w") as fp:
                json.dump(schema, fp, indent=4)
        self.properties.schema.append({
            "kind": kind,
            "filename": str(filename)
        })
        self.save()
Пример #24
0
    def test_create(self, tmp_path):
        '''Test creating a new segment.'''
        with cd(tmp_path):
            s1 = Segment.create(tmp_path, "testseg")
            assert s1.absFilename is not None
            assert s1.absDirname is not None
            assert s1.absFilename.exists()
            p = s1.absDirname
            assert p.exists()
            modelDir = p / "model"
            assert modelDir.exists()

            s2 = Segment.load(Path("segment.json"))
            assert s1.properties.templatePath == s2.properties.templatePath
            assert s1.properties.xformConfig == s2.properties.xformConfig
            assert s1.properties.segmentRefs == s2.properties.segmentRefs
            assert s1.properties.extraFiles == s2.properties.extraFiles
            assert str(s1.absFilename) == str(s2.absFilename)
Пример #25
0
 def findModuleDefinitions(self):
     xformModules = []
     with cd(self.absDirname / "xform"):
         for root, _, files in os.walk("."):
             if os.path.basename(root) != '__pycache__':
                 for file in files:
                     p = Path(root) / Path(file)
                     filename = Path("xform") / p
                     mod = [self.properties.name]
                     mod.extend(p.parts[0:-1])
                     mod.append(p.stem)
                     modName = ".".join(mod)
                     modDef = {
                         "moduleName": modName,
                         "filename": str(filename.as_posix()),
                         "templatePath": self.properties.templatePath
                     }
                     xformModules.append(modDef)
     return xformModules
Пример #26
0
    def deleteXform(self, xformName):
        '''
        Delete an xform from this segment.

        :param string xformName: name of xform to delete.
        '''
        filename = Path(xformName + ".py")
        targetFile = Path(self.properties.defaultXformPath) / filename
        with cd(self.absDirname):
            if targetFile.exists():
                targetFile.unlink()
        moduleName = xformName
        modDefs = [
            x for x in self.properties.xformModules if x.moduleName != moduleName]
        self.properties.xformModules = modDefs
        moduleName = self.properties.name + "." + xformName
        modCfgs = [
            x for x in self.properties.xformConfig if x.moduleName != moduleName]
        self.properties.xformConfig = modCfgs
        self.save()
Пример #27
0
 def test_init(self, tmp_path):
     logging.basicConfig(level=logging.DEBUG)
     with cd(tmp_path):
         pf = Portfolio(tmp_path)
         assert pf is not None
         assert pf.exists() == False