def test_parses_options(self): arxivf = bffactory.make_filter('arxiv', '-sMode=eprint --unpublished-mode=unpublished-note') self.assertEqual(str(arxivf.mode), 'eprint') self.assertEqual(str(arxivf.unpublished_mode), 'unpublished-note')
def _parse_config(self): # now, parse the configuration. self._config_data = self._config_data_from_block(self._config) configstream = io.StringIO(unicode(self._config_data)) cmds = [] emptycmd = BibolamaziFileCmd(cmd=None, text="", lineno=-1, linenoend=-1, info={}) latestcmd = emptycmd # all 'src:' commands must be BEFORE any 'filter:' commands. `current_section` # indicates in which command block we are ('src' or 'filter') current_section = 'src' def complete_cmd(): if (latestcmd.cmd is not None): cmds.append(latestcmd) thislineno = self._startconfigdatalineno for cline in configstream: thislineno += 1 if (re.match(r'^\s*%%', cline)): # ignore comments continue if (re.match(r'^\s*$', cline)): # empty line -> forces the state back to an empty state. We now expect a # new 'src:' or 'filter:' keyword complete_cmd() latestcmd = emptycmd continue # try to match to a new command mcmd = re.match(r'^\s{0,1}(src|filter):\s*', cline) if (not mcmd): if (latestcmd.cmd is None): # no command self._raise_parse_error("Expected a bibolamazi command", lineno=thislineno) # simply continue current cmd latestcmd.text += cline latestcmd.linenoend = thislineno continue # we have completed the current cmd complete_cmd() latestcmd = emptycmd # start new cmd cmd = mcmd.group(1) rest = cline[mcmd.end():] info = { } if (cmd == "filter"): current_section = 'filter' # extract filter name mfiltername = re.match('^\s*(?P<filtername>(?:[\w.]+:)?\w+)(\s|$)', rest) if (not mfiltername): self._raise_parse_error("Expected filter name", lineno=thislineno) filtername = mfiltername.group('filtername') rest = rest[mfiltername.end():] info['filtername'] = filtername if cmd == "src" and current_section == 'filter': self._raise_parse_error("'src:' commands must preceed any 'filter:' commands", lineno=thislineno) # and start cumulating stuff latestcmd = BibolamaziFileCmd(cmd=cmd, text=rest, lineno=thislineno, linenoend=thislineno, info=info) # complete the last cmd complete_cmd() # store raw cmds self._cmds = cmds # parse commands self._sources = [] self._source_lists = [] self._filters = [] self._cache_accessors = {} for cmd in cmds: if (cmd.cmd == "src"): thesrc_list = shlex.split(cmd.text) self._source_lists.append(thesrc_list) self._sources.append('') # this will be set later to which source in the # list was actually accessed. logger.debug("Added source list %r" % (thesrc_list)) continue if (cmd.cmd == "filter"): filname = cmd.info['filtername'] filoptions = cmd.text try: filterinstance = factory.make_filter(filname, filoptions) filterinstance.setBibolamaziFile(self) filterinstance.setInvokationName(filname) self._filters.append(filterinstance) except factory.NoSuchFilter as e: self._raise_parse_error(str(e), lineno=cmd.lineno) except factory.NoSuchFilterPackage as e: self._raise_parse_error(str(e), lineno=cmd.lineno) except factory.FilterError as e: import traceback logger.debug("FilterError:\n" + traceback.format_exc()) self._raise_parse_error(unicode(e), lineno=cmd.lineno) # see if we have to register a new cache accessor for req_cache in list(filterinstance.requested_cache_accessors()): if req_cache not in self._cache_accessors: # construct a cache accessor for this cache. try: cache_accessor = req_cache(bibolamazifile=self) self._cache_accessors[req_cache] = cache_accessor except Exception as e: ## ### TODO: ADD STACK TRACE IN VERBOSE OUTPUT raise BibolamaziError( (u"Error in cache %s: Exception while instantiating the class:\n" u"%s: %s") %( req_cache.__name__, e.__class__.__name__, unicode(e) ) ) logger.debug("Added filter '"+filname+"': `"+filoptions.strip()+"'") continue self._raise_parse_error("Unknown command: `%s'" %(cmd.cmd), lineno=cmd.lineno) self._load_state = BIBOLAMAZIFILE_PARSED logger.longdebug("done with _parse_config()") return True
self._source_lists = [] self._filters = [] self._cache_accessors = {} for cmd in cmds: if (cmd.cmd == "src"): thesrc_list = shlex.split(cmd.text) self._source_lists.append(thesrc_list) self._sources.append('') # this will be set later to which source in the # list was actually accessed. logger.debug("Added source list %r" % (thesrc_list)) continue if (cmd.cmd == "filter"): filname = cmd.info['filtername'] filoptions = cmd.text try: filterinstance = factory.make_filter(filname, filoptions) filterinstance.setBibolamaziFile(self) filterinstance.setInvokationName(filname) self._filters.append(filterinstance) except factory.NoSuchFilter as e: self._raise_parse_error(str(e), lineno=cmd.lineno) except factory.NoSuchFilterPackage as e: self._raise_parse_error(str(e), lineno=cmd.lineno) except factory.FilterError as e: import traceback logger.debug("FilterError:\n" + traceback.format_exc()) self._raise_parse_error(unicode(e), lineno=cmd.lineno) # see if we have to register a new cache accessor for req_cache in list(filterinstance.requested_cache_accessors()):