def apply(self): self.document.settings.rep_base_url = 'http://ros.org/reps/' if not len(self.document): # @@@ replace these DataErrors with proper system messages raise DataError('Document tree is empty.') header = self.document[0] if not isinstance(header, nodes.field_list) or \ 'rfc2822' not in header['classes']: raise DataError('Document does not begin with an RFC-2822 ' 'header; it is not a REP.') rep = None for field in header: if field[0].astext().lower() == 'rep': # should be the first field value = field[1].astext() try: rep = int(value) repo_url = self.rep_git_url % rep except ValueError: rep = value repo_url = None msg = self.document.reporter.warning( '"REP" header must contain an integer; "%s" is an ' 'invalid value.' % rep, base_node=field) msgid = self.document.set_id(msg) prb = nodes.problematic(value, value or '(none)', refid=msgid) prbid = self.document.set_id(prb) msg.add_backref(prbid) if len(field[1]): field[1][0][:] = [prb] else: field[1] += nodes.paragraph('', '', prb) break if rep is None: raise DataError('Document does not contain an RFC-2822 "REP" ' 'header.') if rep == 0: # Special processing for REP 0. pending = nodes.pending(REPZero) self.document.insert(1, pending) self.document.note_pending(pending) if len(header) < 2 or header[1][0].astext().lower() != 'title': raise DataError('No title!') for field in header: name = field[0].astext().lower() body = field[1] if len(body) > 1: raise DataError('REP header field body contains multiple ' 'elements:\n%s' % field.pformat(level=1)) elif len(body) == 1: if not isinstance(body[0], nodes.paragraph): raise DataError('REP header field body may only contain ' 'a single paragraph:\n%s' % field.pformat(level=1)) elif name == 'last-modified': date = time.strftime( '%d-%b-%Y', time.localtime(os.stat(self.document['source'])[8])) if repo_url: body += nodes.paragraph( '', '', nodes.reference('', date, refuri=repo_url)) else: # empty continue para = body[0] if name == 'author': for node in para: if isinstance(node, nodes.reference): node.replace_self(mask_email(node)) elif name == 'discussions-to': for node in para: if isinstance(node, nodes.reference): node.replace_self(mask_email(node, rep)) elif name in ('replaces', 'replaced-by', 'requires'): newbody = [] space = nodes.Text(' ') for refrep in re.split(',?\s+', body.astext()): repno = int(refrep) newbody.append( nodes.reference( refrep, refrep, refuri=(self.document.settings.rep_base_url + self.rep_url % repno))) newbody.append(space) para[:] = newbody[:-1] # drop trailing space elif name == 'last-modified': utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions) if repo_url: date = para.astext() para[:] = [nodes.reference('', date, refuri=repo_url)] elif name == 'content-type': rep_type = para.astext() uri = self.document.settings.rep_base_url + self.rep_url % 12 para[:] = [nodes.reference('', rep_type, refuri=uri)] elif name == 'version' and len(body): utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)
def __init__(self, *args, **kwargs): self.offset = kwargs.pop('offset', 0) DataError.__init__(self, *args)
def assert_attached_to(node, parent_class): if find_parent(node, parent_class) is None: raise DataError("'{}' blocks must appear in '{}' blocks.".format( node.__class__.__name__, parent_class.__name__))
def clean_modname(name): modname = Artifact.MODNAME_FORBIDDEN_RE.sub("", name) if not modname: raise DataError( "Can't make an F* module name from '{}'".format(name)) return modname[0].upper() + modname[1:]
def apply(self): if not len(self.document): # @@@ replace these DataErrors with proper system messages raise DataError("Document tree is empty.") header = self.document[0] if ( not isinstance(header, nodes.field_list) or "rfc2822" not in header["classes"] ): raise DataError( "Document does not begin with an RFC-2822 " "header; it is not a PEP." ) pep = None for field in header: if field[0].astext().lower() == "pep": # should be the first field value = field[1].astext() try: pep = int(value) cvs_url = self.pep_cvs_url % pep except ValueError: pep = value cvs_url = None msg = self.document.reporter.warning( '"PEP" header must contain an integer; "%s" is an ' "invalid value." % pep, base_node=field, ) msgid = self.document.set_id(msg) prb = nodes.problematic(value, value or "(none)", refid=msgid) prbid = self.document.set_id(prb) msg.add_backref(prbid) if len(field[1]): field[1][0][:] = [prb] else: field[1] += nodes.paragraph("", "", prb) break if pep is None: raise DataError('Document does not contain an RFC-2822 "PEP" ' "header.") if pep == 0: # Special processing for PEP 0. pending = nodes.pending(PEPZero) self.document.insert(1, pending) self.document.note_pending(pending) if len(header) < 2 or header[1][0].astext().lower() != "title": raise DataError("No title!") for field in header: name = field[0].astext().lower() body = field[1] if len(body) > 1: raise DataError( "PEP header field body contains multiple " "elements:\n%s" % field.pformat(level=1) ) elif len(body) == 1: if not isinstance(body[0], nodes.paragraph): raise DataError( "PEP header field body may only contain " "a single paragraph:\n%s" % field.pformat(level=1) ) elif name == "last-modified": date = time.strftime( "%d-%b-%Y", time.localtime(os.stat(self.document["source"])[8]) ) if cvs_url: body += nodes.paragraph( "", "", nodes.reference("", date, refuri=cvs_url) ) else: # empty continue para = body[0] if name == "author": for node in para: if isinstance(node, nodes.reference): node.replace_self(mask_email(node)) elif name == "discussions-to": for node in para: if isinstance(node, nodes.reference): node.replace_self(mask_email(node, pep)) elif name in ("replaces", "replaced-by", "requires"): newbody = [] space = nodes.Text(" ") for refpep in re.split(r",?\s+", body.astext()): pepno = int(refpep) newbody.append( nodes.reference( refpep, refpep, refuri=( self.document.settings.pep_base_url + self.pep_url % pepno ), ) ) newbody.append(space) para[:] = newbody[:-1] # drop trailing space elif name == "last-modified": utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions) if cvs_url: date = para.astext() para[:] = [nodes.reference("", date, refuri=cvs_url)] elif name == "content-type": pep_type = para.astext() uri = self.document.settings.pep_base_url + self.pep_url % 12 para[:] = [nodes.reference("", pep_type, refuri=uri)] elif name == "version" and len(body): utils.clean_rcs_keywords(para, self.rcs_keyword_substitutions)