Example #1
0
    def executeSoilFileAsTrace(cls, useFile, soilFile, prequelFileName=None):
        """
        Standard execution of a .soil file with a .use file.
        The result is saved in a temp .stc file whose name is returned
        """
        if prequelFileName is None:
            prequelFileName = soilFile
        abs_prequel_file = os.path.realpath(prequelFileName)
        abs_use_file = os.path.realpath(useFile)
        abs_soil_file = os.path.realpath(soilFile)
        # worker_file_label=Environment.pathToLabel(abs_soil_file)

        # create the driver file
        driver_sequence = "open '%s' \nquit\n" % abs_soil_file
        # (f, driver_filename) = tempfile.mkstemp(suffix='.soil', text=True)
        # os.close(f)
        driver_filename = Environment.getWorkerFileName(
            basicFileName=replaceExtension(abs_prequel_file, '.driver.soil'))

        with open(driver_filename, 'w') as f:
            f.write(driver_sequence)

        # execute  use
        cls._execute(abs_use_file,
                     driver_filename,
                     basicFileName=replaceExtension(abs_prequel_file, '.use'),
                     errWithOut=True)

        # save the result in a temp file
        # (f, trace_filename) = tempfile.mkstemp(suffix='.stc', text=True)
        # os.close(f)
        trace_filename = Environment.getWorkerFileName(
            basicFileName=replaceExtension(abs_prequel_file, '.stc'))
        # print('NN'*10, type(cls.outAndErr))
        with open(trace_filename, 'w') as f:
            f.write(cls.outAndErr)
        return trace_filename
Example #2
0
 def __init__(self,
              soilNumberedFile,
              traceNumberedFile,
              prequelFileName,
              sexFileName=None):
     self.soil = soilNumberedFile
     self.trace = traceNumberedFile
     self.prequelFileName = prequelFileName
     self.sexLines = []
     if sexFileName is not None:
         self.sexFileName = sexFileName
     else:
         self.sexFileName = Environment.getWorkerFileName(
             basicFileName=replaceExtension(prequelFileName, '.sex'))
         # (f, sexFileName) = tempfile.mkstemp(suffix='.sex', text=True)
         # os.close(f)
     self.sexFileHandler = open(self.sexFileName, 'w')
Example #3
0
    def do(self, issueOrigin, filename):
        if Config.preprocessorPrint>=1 or DEBUG>=1:
            print('\nPRE: '+'='*30+' preprocessing'+'='*30)
        lines=readFileLines(
            file=filename,
            issueOrigin=issueOrigin,
            message=
                'Cannot read '+self.sourceText+' %s.')
        new_lines=[
            self.preprocessLine(l) for l in lines ]

        if Config.preprocessorPrint>=1 or DEBUG>=1:
            print('PRE: ' + '=' * 30 + ' end preprocessing ' + '=' * 30)
        return Environment.writeWorkerFileLines(
            lines=new_lines,
            basicFileName=replaceExtension(filename, self.targetExtension),
            issueOrigin=issueOrigin)
Example #4
0
    def executeSoilFileAsSex(cls, useFile, soilFile, prequelFileName=None):
        #type: (Text, Text, Optional[Text]) -> Text
        """
        Execute a .soil file with a .use file and get the result
        as a .sex file, that is, the file with the evaluation result
        embedded. Change outAndErr just like if the engine returned
        the text.

        The implementation is:
        1. first create the trace (.stc) with executeSoilFileAsTrace
        2. merge the soil file and trace file with merge
        If the file contains no soil statements at all the content is
        copied directly to the .sex file with 00001 like marker to
        mimics what happend with the regular process.
        """
        def is_empty_soil(abs_soil_file):
            """
            Indicates if there is at least a useful soil statement
            that is a line starting with ! ou ?.
            Check is not in the list because if there is no ! there
            is nothing to check anyway. Additionaly this is necessary
            since the scn preprocessor generate check for end statement
            so that there is check even in the case of just usecase or
            textual scenario.
            :param abs_soil_file:
            :return:
            """
            lines = readFileLines(file=abs_soil_file, issueOrigin=None)
            for line in lines:
                if re.match('^ *(!|\?)', line):
                    return False
            return True

        def empty_soil_to_sex(abs_soil_file, sex_filename):

            lines = readFileLines(file=abs_soil_file, issueOrigin=None)
            out_lines = []
            for (no, line) in enumerate(lines):
                out_lines.append('%05i:%s' % (no, line))
            writeFileLines(out_lines, sex_filename)

        def trace_and_merge_to_sex(prequel_file_name, abs_use_file,
                                   abs_soil_file, sex_filename):
            """
            Create a trace (-> .stc) and then perform a merge (-> .sex)
            """
            if DEBUG >= 3:
                print('USE: executeSoilFileAsSex: Soil file: %s' %
                      abs_soil_file)
                displayFileContent(abs_soil_file)
                print('USE: executeSoilFileAsSex: executeSoilFileAsTrace')
            trace_filename = cls.executeSoilFileAsTrace(
                abs_use_file, abs_soil_file, prequelFileName=prequel_file_name)
            if DEBUG >= 3:
                print('USE: executeSoilFileAsSex: '
                      'TRACE RESULT saved in %s' % trace_filename)
                displayFileContent(trace_filename, prefix='USE:    ')
                print('USE: executeSoilFileAsSex: now merging')
            from modelscripts.use.engine.merger import merge
            merge(abs_soil_file,
                  trace_filename,
                  prequelFileName=prequel_file_name)
            if DEBUG >= 3:
                print('USE: executeSoilFileAsSex: '
                      'SEX FILE saved in %s' % sex_filename)
                displayFileContent(sex_filename)
            return sex_filename

        if DEBUG >= 2:
            print('USE: ' + ' executeSoilFileAsSex '.center(80, '#'))
        if prequelFileName is None:
            prequelFileName = soilFile
        abs_use_file = os.path.realpath(useFile)
        abs_soil_file = os.path.realpath(soilFile)
        sex_filename = Environment.getWorkerFileName(
            basicFileName=replaceExtension(prequelFileName, '.sex'))
        if is_empty_soil(abs_soil_file):
            empty_soil_to_sex(abs_soil_file=abs_soil_file,
                              sex_filename=sex_filename)
        else:
            trace_and_merge_to_sex(prequel_file_name=prequelFileName,
                                   abs_use_file=abs_use_file,
                                   abs_soil_file=abs_soil_file,
                                   sex_filename=sex_filename)
        with open(sex_filename, 'rU') as f:
            cls.outAndErr = f.read()
        if DEBUG >= 2:
            print('USE: ' + ' END executeSoilFileAsSex '.center(80, '#'))
        return sex_filename
Example #5
0
 def _toUse(files, originalExtensions, useExtension):
     return [
         Environment.getWorkerFileName(replaceExtension(
             f, useExtension)) for f in sources
         if extension(f) in originalExtensions
     ]