def _det_format_version(self): """Extract the format version from the raw content""" if self.format_version is None: self.format_version = get_format_version(self.rawcontent) if self.format_version is None: self.format_version = FORMAT_DEFAULT_VERSION self.log.debug('No version found, using default %s' % self.format_version)
def parse_pre_section(self, txt): """Parse the text block before the start of the first section""" header_text = [] txt_list = txt.split('\n') header_reg = re.compile(r'^\s*(#.*)?$') # pop lines from txt_list into header_text, until we're not in header anymore while len(txt_list) > 0: line = txt_list.pop(0) format_version = get_format_version(line) if format_version is not None: if not format_version == self.VERSION: raise EasyBuildError("Invalid format version %s for current format class", format_version) else: self.log.info("Valid format version %s found" % format_version) # version is not part of header continue r = header_reg.search(line) if not r: # put the line back, and quit (done with header) txt_list.insert(0, line) break header_text.append(line) self.parse_header('\n'.join(header_text)) self.parse_pyheader('\n'.join(txt_list))
def parse_pre_section(self, txt): """Parse the text block before the start of the first section""" header_text = [] txt_list = txt.split('\n') header_reg = re.compile(r'^\s*(#.*)?$') # pop lines from txt_list into header_text, until we're not in header anymore while len(txt_list) > 0: line = txt_list.pop(0) format_version = get_format_version(line) if format_version is not None: if not format_version == self.VERSION: raise EasyBuildError("Invalid format version %s for current format class", format_version) else: self.log.info("Valid format version %s found" % format_version) # version is not part of header continue r = header_reg.search(line) if not r: # put the line back, and quit (done with header) txt_list.insert(0, line) break header_text.append(line) self.parse_header('\n'.join(header_text)) self.parse_pyheader('\n'.join(txt_list))
def _det_format_version(self): """Extract the format version from the raw content""" if self.format_version is None: self.format_version = get_format_version(self.rawcontent) if self.format_version is None: self.format_version = FORMAT_DEFAULT_VERSION self.log.debug('No version found, using default %s' % self.format_version)
reg_block = re.compile(r"^\s*\[([\w.-]+)\]\s*$", re.M) reg_dep_block = re.compile(r"^\s*block\s*=(\s*.*?)\s*$", re.M) spec_fn = os.path.basename(spec) try: txt = open(spec).read() except IOError, err: raise EasyBuildError("Failed to read file %s: %s", spec, err) # split into blocks using regex pieces = reg_block.split(txt) # the first block contains common statements common = pieces.pop(0) # determine version of easyconfig format ec_format_version = get_format_version(txt) if ec_format_version is None: ec_format_version = FORMAT_DEFAULT_VERSION _log.debug( "retrieve_blocks_in_spec: derived easyconfig format version: %s" % ec_format_version) # blocks in easyconfigs are only supported in easyconfig format 1.0 if pieces and ec_format_version == EasyVersion('1.0'): # make a map of blocks blocks = [] while pieces: block_name = pieces.pop(0) block_contents = pieces.pop(0) if block_name in [b['name'] for b in blocks]:
reg_block = re.compile(r"^\s*\[([\w.-]+)\]\s*$", re.M) reg_dep_block = re.compile(r"^\s*block\s*=(\s*.*?)\s*$", re.M) spec_fn = os.path.basename(spec) try: txt = open(spec).read() except IOError, err: _log.error("Failed to read file %s: %s" % (spec, err)) # split into blocks using regex pieces = reg_block.split(txt) # the first block contains common statements common = pieces.pop(0) # determine version of easyconfig format ec_format_version = get_format_version(txt) if ec_format_version is None: ec_format_version = FORMAT_DEFAULT_VERSION _log.debug("retrieve_blocks_in_spec: derived easyconfig format version: %s" % ec_format_version) # blocks in easyconfigs are only supported in format versions prior to 2.0 if pieces and ec_format_version < EasyVersion('2.0'): # make a map of blocks blocks = [] while pieces: block_name = pieces.pop(0) block_contents = pieces.pop(0) if block_name in [b['name'] for b in blocks]: msg = "Found block %s twice in %s." % (block_name, spec) _log.error(msg)
def retrieve_blocks_in_spec(spec, only_blocks, silent=False): """ Easyconfigs can contain blocks (headed by a [Title]-line) which contain commands specific to that block. Commands in the beginning of the file above any block headers are common and shared between each block. """ reg_block = re.compile(r"^\s*\[([\w.-]+)\]\s*$", re.M) reg_dep_block = re.compile(r"^\s*block\s*=(\s*.*?)\s*$", re.M) spec_fn = os.path.basename(spec) txt = read_file(spec) # split into blocks using regex pieces = reg_block.split(txt) # the first block contains common statements common = pieces.pop(0) # determine version of easyconfig format ec_format_version = get_format_version(txt) if ec_format_version is None: ec_format_version = FORMAT_DEFAULT_VERSION _log.debug( "retrieve_blocks_in_spec: derived easyconfig format version: %s" % ec_format_version) # blocks in easyconfigs are only supported in easyconfig format 1.0 if pieces and ec_format_version == EasyVersion('1.0'): # make a map of blocks blocks = [] while pieces: block_name = pieces.pop(0) block_contents = pieces.pop(0) if block_name in [b['name'] for b in blocks]: raise EasyBuildError("Found block %s twice in %s.", block_name, spec) block = {'name': block_name, 'contents': block_contents} # dependency block dep_block = reg_dep_block.search(block_contents) if dep_block: dependencies = eval(dep_block.group(1)) if type(dependencies) == list: block['dependencies'] = dependencies else: block['dependencies'] = [dependencies] blocks.append(block) # make a new easyconfig for each block # they will be processed in the same order as they are all described in the original file specs = [] for block in blocks: name = block['name'] if only_blocks and not (name in only_blocks): print_msg("Skipping block %s-%s" % (spec_fn, name), silent=silent) continue (fd, block_path) = tempfile.mkstemp(prefix='easybuild-', suffix='%s-%s' % (spec_fn, name)) os.close(fd) txt = common if 'dependencies' in block: for dep in block['dependencies']: if dep not in [b['name'] for b in blocks]: raise EasyBuildError( "Block %s depends on %s, but block was not found.", name, dep) dep = [b for b in blocks if b['name'] == dep][0] txt += "\n# Dependency block %s" % (dep['name']) txt += dep['contents'] txt += "\n# Main block %s" % name txt += block['contents'] write_file(block_path, txt) specs.append(block_path) _log.debug("Found %s block(s) in %s" % (len(specs), spec)) return specs else: # no blocks, one file return [spec]
def retrieve_blocks_in_spec(spec, only_blocks, silent=False): """ Easyconfigs can contain blocks (headed by a [Title]-line) which contain commands specific to that block. Commands in the beginning of the file above any block headers are common and shared between each block. """ reg_block = re.compile(r"^\s*\[([\w.-]+)\]\s*$", re.M) reg_dep_block = re.compile(r"^\s*block\s*=(\s*.*?)\s*$", re.M) spec_fn = os.path.basename(spec) txt = read_file(spec) # split into blocks using regex pieces = reg_block.split(txt) # the first block contains common statements common = pieces.pop(0) # determine version of easyconfig format ec_format_version = get_format_version(txt) if ec_format_version is None: ec_format_version = FORMAT_DEFAULT_VERSION _log.debug("retrieve_blocks_in_spec: derived easyconfig format version: %s" % ec_format_version) # blocks in easyconfigs are only supported in easyconfig format 1.0 if pieces and ec_format_version == EasyVersion('1.0'): # make a map of blocks blocks = [] while pieces: block_name = pieces.pop(0) block_contents = pieces.pop(0) if block_name in [b['name'] for b in blocks]: raise EasyBuildError("Found block %s twice in %s.", block_name, spec) block = {'name': block_name, 'contents': block_contents} # dependency block dep_block = reg_dep_block.search(block_contents) if dep_block: dependencies = eval(dep_block.group(1)) if type(dependencies) == list: block['dependencies'] = dependencies else: block['dependencies'] = [dependencies] blocks.append(block) # make a new easyconfig for each block # they will be processed in the same order as they are all described in the original file specs = [] for block in blocks: name = block['name'] if only_blocks and not (name in only_blocks): print_msg("Skipping block %s-%s" % (spec_fn, name), silent=silent) continue (fd, block_path) = tempfile.mkstemp(prefix='easybuild-', suffix='%s-%s' % (spec_fn, name)) os.close(fd) txt = common if 'dependencies' in block: for dep in block['dependencies']: if dep not in [b['name'] for b in blocks]: raise EasyBuildError("Block %s depends on %s, but block was not found.", name, dep) dep = [b for b in blocks if b['name'] == dep][0] txt += "\n# Dependency block %s" % (dep['name']) txt += dep['contents'] txt += "\n# Main block %s" % name txt += block['contents'] write_file(block_path, txt) specs.append(block_path) _log.debug("Found %s block(s) in %s" % (len(specs), spec)) return specs else: # no blocks, one file return [spec]