def parse(self): ''' override ''' f = open(self.filename) logging.debug('parsing file "%s"' % self.filename) header = utils.read_header(f) info = utils.parse_header(header) info.site = utils.get_instr_site_fromtxt(header) dfine = utils.read_define_comp(f) name, setpar, defpar, outpar = utils.parse_define_comp(dfine) info.name = name info.category = utils.get_comp_category(self.filename) # basically just for debug use info.params = setpar + defpar + outpar # these are used by CompDocWriter info.setparams = setpar info.defparams = defpar info.outparams = outpar self.info = info return self.info
def _parse_legacy(self): ''' parses the given file ''' f = open(self.filename) logging.debug('parsing file "%s"' % self.filename) header = utils.read_header(f) info = utils.parse_header(header) info.site = utils.get_instr_site_fromtxt(header) dfine = utils.read_define_instr(f) info.name, info.params = utils.parse_define_instr(dfine) self.info = info
def repair_instr(localdir): ''' Dev function used to alter instr file headers. ''' local_instr_files, local_comp_files = utils.get_instr_comp_files(localdir) files = [] rows = [] for filename in local_instr_files: try: print("parsing... %s" % filename) info = InstrParser(filename).parse() files.append(filename) rows.append(info) except: print("failed parsing instr file: %s" % filename) quit() cnt = 0 for filename in local_instr_files: f = open(filename, 'r') # read the first two instr file sections header = utils.read_header(f) define = utils.read_define_instr(f) # doc lines print('*****') print(filename) print() seen_P = False par_docs = [] idxs = [] idxs_remove = [] lines = header.splitlines() for i in range(len(lines)): l = lines[i] # remove unwanted lines m = re.match('\* Release:', l) if m: idxs_remove.append(i) continue m = re.match('\* Version:', l) if m: idxs_remove.append(i) continue m = re.match('\* INPUT PARAMETERS:', l) if m: idxs_remove.append(i) continue # fast-forward to %P / %Parameters tag if not seen_P and re.match('\* \%Parameters', l): seen_P = True elif not seen_P: continue # exit if we reach %L / %Link tag if re.match('\* \%L', l): break l = l.lstrip('*').strip() m = re.match( '(\w+):[ \t]*\[([ \w\/\(\)\\\~\-.,\":\%\^\|\{\};\*]+)\][ \t]*(.*)', l) if m: healthy_par_doc = (m.group(1), m.group(2), m.group(3).strip()) par_docs.append(healthy_par_doc) idxs.append(i) continue elif re.match('(\w+):', l): # empty docstrings m3 = re.match('(\w+):[ \t]*$', l) if m3: empty_par_doc = (m3.group(1), '', '') par_docs.append(empty_par_doc) idxs.append(i) continue # no-unit docstrings m4 = re.match( '(\w+):[ \t]*([ \t\w,.\-\(\)\=\^\/:\"\'\%\<\>\|\{\};\*]+)$', l) if m4: limp_par_doc = (m4.group(1), '', m4.group(2).strip()) par_docs.append(limp_par_doc) idxs.append(i) continue # "inversed" docstrings m2 = re.match( '(\w+):[ \t]*(.*)[ \t]*\[([ \w\/\(\)\\\~\-.,\":\%\|\{\}]+)\]', l) if m2: par_doc = (m2.group(1), m2.group(3).strip(), m2.group(2)) par_docs.append(par_doc) idxs.append(i) continue # edit par doc lines, remove superfluous if True: if len(par_docs) == 0: continue l01 = max([len(p[0]) + len(p[1]) for p in par_docs]) name, real_pars = utils.parse_define_instr(define) real_parnames = [par[1] for par in real_pars] # rewrite par doc lines, remove "bonus" doc lines without a parameter to document for i in range(len(par_docs)): p = par_docs[i] idx = idxs[i] # reorganize the docstring line format_str = '* %s: %-' + str(l01 - len(p[0]) + 3) + 's %s' l = format_str % (p[0], '[' + p[1] + ']', p[2]) print(l) # replace l in lines: lines[idx] = l # flag superfluous doc lines for removal if p[0] not in real_parnames: # (!!!!) # TODO: take care of the ordering of idxs_remove. Today, we know that all previuosly # removed lines are above, but this may change # (!!!!) idxs_remove.append(idx) # add a stub par doc line for each par that isn't represented (WARNING: do not use while removing lines! if False: print() extra_pardoc_lines = [] par_doc_names = [q[0] for q in par_docs] for i in range(len(real_pars)): par_name = real_pars[i][1] if par_name not in par_doc_names: l = '* %s:' % par_name print(l) extra_pardoc_lines.append(l) # insert those extra lines ... good_idx = idxs[-1] for i in range(len(extra_pardoc_lines)): l = extra_pardoc_lines[i] lines.insert(good_idx + i + 1, l) # append/read-append remaining lines for l in define.splitlines(): lines.append(l) for l in f: lines.append(l.rstrip('\n')) # remove unwanted lines: for idx in reversed(idxs_remove): del lines[idx] for l in lines: print(l) continue f.close() f = open(filename, 'w') f.write('\n'.join(lines) + '\n') f.close() cnt += 1 print(cnt) quit()