Commit e5e6bc68 authored by Georg Brandl's avatar Georg Brandl

Merged revisions 85276 via svnmerge from

svn+ssh://svn.python.org/python/branches/py3k

........
  r85276 | georg.brandl | 2010-10-06 12:35:24 +0200 (Mi, 06 Okt 2010) | 1 line

  Fix the suspicious builder not to write CRLF, update suspicious file and add instructions to Makefile.
........
parent d098c3d9
...@@ -86,13 +86,14 @@ changes: build ...@@ -86,13 +86,14 @@ changes: build
linkcheck: BUILDER = linkcheck linkcheck: BUILDER = linkcheck
linkcheck: build linkcheck: build
@echo "Link check complete; look for any errors in the above output " \ @echo "Link check complete; look for any errors in the above output" \
"or in build/$(BUILDER)/output.txt" "or in build/$(BUILDER)/output.txt"
suspicious: BUILDER = suspicious suspicious: BUILDER = suspicious
suspicious: build suspicious: build
@echo "Suspicious check complete; look for any errors in the above output " \ @echo "Suspicious check complete; look for any errors in the above output" \
"or in build/$(BUILDER)/suspicious.txt" "or in build/$(BUILDER)/suspicious.csv. If all issues are false" \
"positives, append that file to tools/sphinxext/susp-ignored.csv."
coverage: BUILDER = coverage coverage: BUILDER = coverage
coverage: build coverage: build
...@@ -100,12 +101,12 @@ coverage: build ...@@ -100,12 +101,12 @@ coverage: build
doctest: BUILDER = doctest doctest: BUILDER = doctest
doctest: build doctest: build
@echo "Testing of doctests in the sources finished, look at the " \ @echo "Testing of doctests in the sources finished, look at the" \
"results in build/doctest/output.txt" "results in build/doctest/output.txt"
pydoc-topics: BUILDER = pydoc-topics pydoc-topics: BUILDER = pydoc-topics
pydoc-topics: build pydoc-topics: build
@echo "Building finished; now copy build/pydoc-topics/topics.py " \ @echo "Building finished; now copy build/pydoc-topics/topics.py" \
"to Lib/pydoc_data/topics.py" "to Lib/pydoc_data/topics.py"
htmlview: html htmlview: html
......
...@@ -142,7 +142,7 @@ are always available. They are listed here in alphabetical order. ...@@ -142,7 +142,7 @@ are always available. They are listed here in alphabetical order.
.. function:: compile(source, filename, mode, flags=0, dont_inherit=False) .. function:: compile(source, filename, mode, flags=0, dont_inherit=False)
Compile the *source* into a code or AST object. Code objects can be executed Compile the *source* into a code or AST object. Code objects can be executed
by:func:`exec` or :func:`eval`. *source* can either be a string or an AST by :func:`exec` or :func:`eval`. *source* can either be a string or an AST
object. Refer to the :mod:`ast` module documentation for information on how object. Refer to the :mod:`ast` module documentation for information on how
to work with AST objects. to work with AST objects.
......
...@@ -164,3 +164,149 @@ whatsnew/2.4,,:System, ...@@ -164,3 +164,149 @@ whatsnew/2.4,,:System,
whatsnew/2.5,,:memory,:memory: whatsnew/2.5,,:memory,:memory:
whatsnew/2.5,,:step,[start:stop:step] whatsnew/2.5,,:step,[start:stop:step]
whatsnew/2.5,,:stop,[start:stop:step] whatsnew/2.5,,:stop,[start:stop:step]
distutils/examples,267,`,This is the description of the ``foobar`` package.
documenting/fromlatex,39,:func,:func:`str(object)`
documenting/fromlatex,39,`,:func:`str(object)`
documenting/fromlatex,39,`,``str(object)``
documenting/fromlatex,55,.. deprecated:,.. deprecated:: 2.5
documenting/fromlatex,66,.. note:,.. note::
documenting/fromlatex,76,:samp,":samp:`open({filename}, {mode})`"
documenting/fromlatex,76,`,":samp:`open({filename}, {mode})`"
documenting/fromlatex,80,`,``'c'``
documenting/fromlatex,80,`,`Title <URL>`_
documenting/fromlatex,80,`,``code``
documenting/fromlatex,80,`,`Title <URL>`_
documenting/fromlatex,99,:file,:file:`C:\\Temp\\my.tmp`
documenting/fromlatex,99,`,:file:`C:\\Temp\\my.tmp`
documenting/fromlatex,99,`,"``open(""C:\Temp\my.tmp"")``"
documenting/fromlatex,129,.. function:,.. function:: do_foo(bar)
documenting/fromlatex,141,.. function:,".. function:: open(filename[, mode[, buffering]])"
documenting/fromlatex,152,.. function:,.. function:: foo_*
documenting/fromlatex,152,:noindex,:noindex:
documenting/fromlatex,162,.. describe:,.. describe:: a == b
documenting/fromlatex,168,.. cmdoption:,.. cmdoption:: -O
documenting/fromlatex,168,.. envvar:,.. envvar:: PYTHONINSPECT
documenting/rest,33,`,``text``
documenting/rest,47,:rolename,:rolename:`content`
documenting/rest,47,`,:rolename:`content`
documenting/rest,103,::,This is a normal text paragraph. The next paragraph is a code sample::
documenting/rest,130,`,`Link text <http://target>`_
documenting/rest,187,.. function:,.. function:: foo(x)
documenting/rest,187,:bar,:bar: no
documenting/rest,208,.. rubric:,.. rubric:: Footnotes
faq/programming,762,:reduce,"print((lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,"
faq/programming,762,:reduce,"Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,"
faq/programming,762,:chr,">=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr("
faq/programming,1047,::,for x in sequence[::-1]:
faq/windows,229,:EOF,@setlocal enableextensions & python -x %~f0 %* & goto :EOF
faq/windows,393,:REG,.py :REG_SZ: c:\<path to python>\python.exe -u %s %s
library/bisect,32,:hi,all(val >= x for val in a[i:hi])
library/bisect,42,:hi,all(val > x for val in a[i:hi])
library/http.client,52,:port,host:port
library/nntplib,272,:bytes,:bytes
library/nntplib,272,:lines,:lines
library/nntplib,272,:lines,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']"
library/nntplib,272,:bytes,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']"
library/pickle,567,:memory,"conn = sqlite3.connect("":memory:"")"
library/profile,293,:lineno,"(sort by filename:lineno),"
library/socket,261,::,"(10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]"
library/stdtypes,1026,:end,s[start:end]
library/stdtypes,1195,:end,s[start:end]
library/urllib.request,64,:close,Connection:close
library/urllib.request,901,:password,"""joe:password@python.org"""
library/urllib.request,1064,:lang,"xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">\n\n<head>\n"
library/xmlrpc.client,103,:pass,http://user:pass@host:port/path
library/xmlrpc.client,103,:port,http://user:pass@host:port/path
library/xmlrpc.client,103,:pass,user:pass
license,717,`,* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
license,717,`,* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
license,879,`,"``Software''), to deal in the Software without restriction, including"
license,879,`,"THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,"
reference/lexical_analysis,704,`,$ ? `
whatsnew/2.7,735,:Sunday,'2009:4:Sunday'
whatsnew/2.7,862,::,"export PYTHONWARNINGS=all,error:::Cookie:0"
whatsnew/2.7,862,:Cookie,"export PYTHONWARNINGS=all,error:::Cookie:0"
whatsnew/2.7,1619,::,>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo')
whatsnew/2.7,1619,::,"ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]',"
documenting/markup,33,.. sectionauthor:,.. sectionauthor:: Guido van Rossum <guido@python.org>
documenting/markup,42,:mod,:mod:`parrot` -- Dead parrot access
documenting/markup,42,`,:mod:`parrot` -- Dead parrot access
documenting/markup,42,.. module:,.. module:: parrot
documenting/markup,42,:platform,":platform: Unix, Windows"
documenting/markup,42,:synopsis,:synopsis: Analyze and reanimate dead parrots.
documenting/markup,42,.. moduleauthor:,.. moduleauthor:: Eric Cleese <eric@python.invalid>
documenting/markup,42,.. moduleauthor:,.. moduleauthor:: John Idle <john@python.invalid>
documenting/markup,88,:noindex,:noindex:
documenting/markup,95,.. function:,.. function:: spam(eggs)
documenting/markup,95,:noindex,:noindex:
documenting/markup,101,.. method:,.. method:: FileInput.input(...)
documenting/markup,121,.. cfunction:,".. cfunction:: PyObject* PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)"
documenting/markup,131,.. cmember:,.. cmember:: PyObject* PyTypeObject.tp_bases
documenting/markup,150,.. cvar:,.. cvar:: PyObject* PyClass_Type
documenting/markup,179,.. function:,".. function:: Timer.repeat([repeat=3[, number=1000000]])"
documenting/markup,209,.. cmdoption:,.. cmdoption:: -m <module>
documenting/markup,227,.. describe:,.. describe:: opcode
documenting/markup,256,.. highlightlang:,.. highlightlang:: c
documenting/markup,276,.. literalinclude:,.. literalinclude:: example.py
documenting/markup,291,:rolename,:rolename:`content`
documenting/markup,291,`,:rolename:`content`
documenting/markup,296,:role,:role:`title <target>`
documenting/markup,296,`,:role:`title <target>`
documenting/markup,302,:meth,:meth:`~Queue.Queue.get`
documenting/markup,302,`,:meth:`~Queue.Queue.get`
documenting/markup,350,:func,:func:`filter`
documenting/markup,350,`,:func:`filter`
documenting/markup,350,:func,:func:`foo.filter`
documenting/markup,350,`,:func:`foo.filter`
documenting/markup,356,:func,:func:`open`
documenting/markup,356,`,:func:`open`
documenting/markup,356,:func,:func:`.open`
documenting/markup,356,`,:func:`.open`
documenting/markup,435,:file,... is installed in :file:`/usr/lib/python2.{x}/site-packages` ...
documenting/markup,435,`,... is installed in :file:`/usr/lib/python2.{x}/site-packages` ...
documenting/markup,454,:kbd,:kbd:`C-x C-f`
documenting/markup,454,`,:kbd:`C-x C-f`
documenting/markup,454,:kbd,:kbd:`Control-x Control-f`
documenting/markup,454,`,:kbd:`Control-x Control-f`
documenting/markup,468,:mailheader,:mailheader:`Content-Type`
documenting/markup,468,`,:mailheader:`Content-Type`
documenting/markup,477,:manpage,:manpage:`ls(1)`
documenting/markup,477,`,:manpage:`ls(1)`
documenting/markup,493,:menuselection,:menuselection:`Start --> Programs`
documenting/markup,493,`,:menuselection:`Start --> Programs`
documenting/markup,508,`,``code``
documenting/markup,526,:file,:file:
documenting/markup,526,`,``code``
documenting/markup,561,:ref,:ref:`label-name`
documenting/markup,561,`,:ref:`label-name`
documenting/markup,565,:ref,"It refers to the section itself, see :ref:`my-reference-label`."
documenting/markup,565,`,"It refers to the section itself, see :ref:`my-reference-label`."
documenting/markup,574,:ref,:ref:
documenting/markup,595,.. note:,.. note::
documenting/markup,622,.. versionadded:,.. versionadded:: 3.1
documenting/markup,647,::,.. impl-detail::
documenting/markup,647,::,.. impl-detail:: This shortly mentions an implementation detail.
documenting/markup,667,.. seealso:,.. seealso::
documenting/markup,667,:mod,Module :mod:`zipfile`
documenting/markup,667,`,Module :mod:`zipfile`
documenting/markup,667,:mod,Documentation of the :mod:`zipfile` standard module.
documenting/markup,667,`,Documentation of the :mod:`zipfile` standard module.
documenting/markup,667,`,"`GNU tar manual, Basic Tar Format <http://link>`_"
documenting/markup,681,.. centered:,.. centered::
documenting/markup,726,.. toctree:,.. toctree::
documenting/markup,726,:maxdepth,:maxdepth: 2
documenting/markup,742,.. index:,.. index::
documenting/markup,772,.. index:,".. index:: BNF, grammar, syntax, notation"
documenting/markup,803,`,"unaryneg ::= ""-"" `integer`"
documenting/markup,808,.. productionlist:,.. productionlist::
documenting/markup,808,`,"try1_stmt: ""try"" "":"" `suite`"
documenting/markup,808,`,": (""except"" [`expression` ["","" `target`]] "":"" `suite`)+"
documenting/markup,808,`,": [""else"" "":"" `suite`]"
documenting/markup,808,`,": [""finally"" "":"" `suite`]"
documenting/markup,808,`,"try2_stmt: ""try"" "":"" `suite`"
documenting/markup,808,`,": ""finally"" "":"" `suite`"
library/importlib,396,`,The keys are the module names -- packages must end in ``.__init__``.
library/importlib,396,`,"name with ``.__init__`` appended to it."""""""
library/importlib,396,`,# ``__init__``.
library/socket,249,::,"(10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]"
library/stdtypes,860,:end,s[start:end]
...@@ -41,9 +41,11 @@ Copyright 2009 Gabriel A. Genellina ...@@ -41,9 +41,11 @@ Copyright 2009 Gabriel A. Genellina
""" """
import os, sys import os
import csv
import re import re
import csv
import sys
from docutils import nodes from docutils import nodes
from sphinx.builders import Builder from sphinx.builders import Builder
...@@ -54,9 +56,10 @@ detect_all = re.compile(ur''' ...@@ -54,9 +56,10 @@ detect_all = re.compile(ur'''
(?<!\.)\.\.[ \t]*\w+: # .. foo: (but NOT ... else:) (?<!\.)\.\.[ \t]*\w+: # .. foo: (but NOT ... else:)
''', re.UNICODE | re.VERBOSE).finditer ''', re.UNICODE | re.VERBOSE).finditer
class Rule: class Rule:
def __init__(self, docname, lineno, issue, line): def __init__(self, docname, lineno, issue, line):
"A rule for ignoring issues" """A rule for ignoring issues"""
self.docname = docname # document to which this rule applies self.docname = docname # document to which this rule applies
self.lineno = lineno # line number in the original source; self.lineno = lineno # line number in the original source;
# this rule matches only near that. # this rule matches only near that.
...@@ -65,9 +68,15 @@ class Rule: ...@@ -65,9 +68,15 @@ class Rule:
self.line = line # text of the container element (single line only) self.line = line # text of the container element (single line only)
class dialect(csv.excel):
"""Our dialect: uses only linefeed as newline."""
lineterminator = '\n'
class CheckSuspiciousMarkupBuilder(Builder): class CheckSuspiciousMarkupBuilder(Builder):
""" """
Checks for possibly invalid markup that may leak into the output Checks for possibly invalid markup that may leak into the output.
""" """
name = 'suspicious' name = 'suspicious'
...@@ -76,7 +85,8 @@ class CheckSuspiciousMarkupBuilder(Builder): ...@@ -76,7 +85,8 @@ class CheckSuspiciousMarkupBuilder(Builder):
self.log_file_name = os.path.join(self.outdir, 'suspicious.csv') self.log_file_name = os.path.join(self.outdir, 'suspicious.csv')
open(self.log_file_name, 'w').close() open(self.log_file_name, 'w').close()
# load database of previously ignored issues # load database of previously ignored issues
self.load_rules(os.path.join(os.path.dirname(__file__), 'susp-ignored.csv')) self.load_rules(os.path.join(os.path.dirname(__file__),
'susp-ignored.csv'))
def get_outdated_docs(self): def get_outdated_docs(self):
return self.env.found_docs return self.env.found_docs
...@@ -85,14 +95,11 @@ class CheckSuspiciousMarkupBuilder(Builder): ...@@ -85,14 +95,11 @@ class CheckSuspiciousMarkupBuilder(Builder):
return '' return ''
def prepare_writing(self, docnames): def prepare_writing(self, docnames):
### PYTHON PROJECT SPECIFIC ### pass
for name in set(docnames):
if name.split('/', 1)[0] == 'documenting':
docnames.remove(name)
### PYTHON PROJECT SPECIFIC ###
def write_doc(self, docname, doctree): def write_doc(self, docname, doctree):
self.any_issue = False # set when any issue is encountered in this document # set when any issue is encountered in this document
self.any_issue = False
self.docname = docname self.docname = docname
visitor = SuspiciousVisitor(doctree, self) visitor = SuspiciousVisitor(doctree, self)
doctree.walk(visitor) doctree.walk(visitor)
...@@ -105,8 +112,7 @@ class CheckSuspiciousMarkupBuilder(Builder): ...@@ -105,8 +112,7 @@ class CheckSuspiciousMarkupBuilder(Builder):
self.report_issue(line, lineno, issue) self.report_issue(line, lineno, issue)
def is_ignored(self, line, lineno, issue): def is_ignored(self, line, lineno, issue):
"""Determine whether this issue should be ignored. """Determine whether this issue should be ignored."""
"""
docname = self.docname docname = self.docname
for rule in self.rules: for rule in self.rules:
if rule.docname != docname: continue if rule.docname != docname: continue
...@@ -139,12 +145,11 @@ class CheckSuspiciousMarkupBuilder(Builder): ...@@ -139,12 +145,11 @@ class CheckSuspiciousMarkupBuilder(Builder):
def write_log_entry(self, lineno, issue, text): def write_log_entry(self, lineno, issue, text):
f = open(self.log_file_name, 'ab') f = open(self.log_file_name, 'ab')
writer = csv.writer(f) writer = csv.writer(f, dialect)
writer.writerow([self.docname.encode('utf-8'), writer.writerow([self.docname.encode('utf-8'),
lineno, lineno,
issue.encode('utf-8'), issue.encode('utf-8'),
text.strip().encode('utf-8')]) text.strip().encode('utf-8')])
del writer
f.close() f.close()
def load_rules(self, filename): def load_rules(self, filename):
...@@ -159,7 +164,8 @@ class CheckSuspiciousMarkupBuilder(Builder): ...@@ -159,7 +164,8 @@ class CheckSuspiciousMarkupBuilder(Builder):
except IOError: return except IOError: return
for i, row in enumerate(csv.reader(f)): for i, row in enumerate(csv.reader(f)):
if len(row) != 4: if len(row) != 4:
raise ValueError, "wrong format in %s, line %d: %s" % (filename, i+1, row) raise ValueError(
"wrong format in %s, line %d: %s" % (filename, i+1, row))
docname, lineno, issue, text = row docname, lineno, issue, text = row
docname = docname.decode('utf-8') docname = docname.decode('utf-8')
if lineno: lineno = int(lineno) if lineno: lineno = int(lineno)
...@@ -173,7 +179,7 @@ class CheckSuspiciousMarkupBuilder(Builder): ...@@ -173,7 +179,7 @@ class CheckSuspiciousMarkupBuilder(Builder):
def get_lineno(node): def get_lineno(node):
"Obtain line number information for a node" """Obtain line number information for a node."""
lineno = None lineno = None
while lineno is None and node: while lineno is None and node:
node = node.parent node = node.parent
...@@ -198,7 +204,8 @@ def extract_line(text, index): ...@@ -198,7 +204,8 @@ def extract_line(text, index):
""" """
p = text.rfind('\n', 0, index) + 1 p = text.rfind('\n', 0, index) + 1
q = text.find('\n', index) q = text.find('\n', index)
if q<0: q = len(text) if q < 0:
q = len(text)
return text[p:q] return text[p:q]
...@@ -217,7 +224,6 @@ class SuspiciousVisitor(nodes.GenericNodeVisitor): ...@@ -217,7 +224,6 @@ class SuspiciousVisitor(nodes.GenericNodeVisitor):
self.lastlineno = lineno = max(get_lineno(node) or 0, self.lastlineno) self.lastlineno = lineno = max(get_lineno(node) or 0, self.lastlineno)
seen = set() # don't report the same issue more than only once per line seen = set() # don't report the same issue more than only once per line
for match in detect_all(text): for match in detect_all(text):
#import pdb; pdb.set_trace()
issue = match.group() issue = match.group()
line = extract_line(text, match.start()) line = extract_line(text, match.start())
if (issue, line) not in seen: if (issue, line) not in seen:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment