示例#1
0
    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)
示例#2
0
 def __init__(self, *args, **kwargs):
     self.offset = kwargs.pop('offset', 0)
     DataError.__init__(self, *args)
示例#3
0
 def __init__(self, *args, **kwargs):
         self.offset = kwargs.pop('offset', 0)
         DataError.__init__(self, *args)
示例#4
0
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__))
示例#5
0
 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:]
示例#6
0
 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)