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
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')
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)
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
def _toUse(files, originalExtensions, useExtension): return [ Environment.getWorkerFileName(replaceExtension( f, useExtension)) for f in sources if extension(f) in originalExtensions ]