merge with 3.4

This commit is contained in:
Georg Brandl 2014-10-30 22:56:04 +01:00
commit e075f1617f

View file

@ -9,15 +9,32 @@
:license: Python license. :license: Python license.
""" """
ISSUE_URI = 'https://bugs.python.org/issue%s' import re
SOURCE_URI = 'https://hg.python.org/cpython/file/default/%s' import codecs
from os import path
from time import asctime
from pprint import pformat
from docutils.io import StringOutput
from docutils.utils import new_document
from docutils import nodes, utils from docutils import nodes, utils
from sphinx import addnodes
from sphinx.builders import Builder
from sphinx.util.nodes import split_explicit_title from sphinx.util.nodes import split_explicit_title
from sphinx.util.compat import Directive from sphinx.util.compat import Directive
from sphinx.writers.html import HTMLTranslator from sphinx.writers.html import HTMLTranslator
from sphinx.writers.text import TextWriter
from sphinx.writers.latex import LaTeXTranslator from sphinx.writers.latex import LaTeXTranslator
from sphinx.domains.python import PyModulelevel, PyClassmember
# Support for checking for suspicious markup
import suspicious
ISSUE_URI = 'https://bugs.python.org/issue%s'
SOURCE_URI = 'https://hg.python.org/cpython/file/default/%s'
# monkey-patch reST parser to disable alphabetic and roman enumerated lists # monkey-patch reST parser to disable alphabetic and roman enumerated lists
from docutils.parsers.rst.states import Body from docutils.parsers.rst.states import Body
@ -29,6 +46,9 @@
# monkey-patch HTML and LaTeX translators to keep doctest blocks in the # monkey-patch HTML and LaTeX translators to keep doctest blocks in the
# doctest docs themselves # doctest docs themselves
orig_visit_literal_block = HTMLTranslator.visit_literal_block orig_visit_literal_block = HTMLTranslator.visit_literal_block
orig_depart_literal_block = LaTeXTranslator.depart_literal_block
def new_visit_literal_block(self, node): def new_visit_literal_block(self, node):
meta = self.builder.env.metadata[self.builder.current_docname] meta = self.builder.env.metadata[self.builder.current_docname]
old_trim_doctest_flags = self.highlighter.trim_doctest_flags old_trim_doctest_flags = self.highlighter.trim_doctest_flags
@ -39,9 +59,7 @@ def new_visit_literal_block(self, node):
finally: finally:
self.highlighter.trim_doctest_flags = old_trim_doctest_flags self.highlighter.trim_doctest_flags = old_trim_doctest_flags
HTMLTranslator.visit_literal_block = new_visit_literal_block
orig_depart_literal_block = LaTeXTranslator.depart_literal_block
def new_depart_literal_block(self, node): def new_depart_literal_block(self, node):
meta = self.builder.env.metadata[self.curfilestack[-1]] meta = self.builder.env.metadata[self.curfilestack[-1]]
old_trim_doctest_flags = self.highlighter.trim_doctest_flags old_trim_doctest_flags = self.highlighter.trim_doctest_flags
@ -52,8 +70,11 @@ def new_depart_literal_block(self, node):
finally: finally:
self.highlighter.trim_doctest_flags = old_trim_doctest_flags self.highlighter.trim_doctest_flags = old_trim_doctest_flags
HTMLTranslator.visit_literal_block = new_visit_literal_block
LaTeXTranslator.depart_literal_block = new_depart_literal_block LaTeXTranslator.depart_literal_block = new_depart_literal_block
# Support for marking up and linking to bugs.python.org issues # Support for marking up and linking to bugs.python.org issues
def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]):
@ -101,9 +122,6 @@ def run(self):
# Support for documenting decorators # Support for documenting decorators
from sphinx import addnodes
from sphinx.domains.python import PyModulelevel, PyClassmember
class PyDecoratorMixin(object): class PyDecoratorMixin(object):
def handle_signature(self, sig, signode): def handle_signature(self, sig, signode):
ret = super(PyDecoratorMixin, self).handle_signature(sig, signode) ret = super(PyDecoratorMixin, self).handle_signature(sig, signode)
@ -113,12 +131,14 @@ def handle_signature(self, sig, signode):
def needs_arglist(self): def needs_arglist(self):
return False return False
class PyDecoratorFunction(PyDecoratorMixin, PyModulelevel): class PyDecoratorFunction(PyDecoratorMixin, PyModulelevel):
def run(self): def run(self):
# a decorator function is a function after all # a decorator function is a function after all
self.name = 'py:function' self.name = 'py:function'
return PyModulelevel.run(self) return PyModulelevel.run(self)
class PyDecoratorMethod(PyDecoratorMixin, PyClassmember): class PyDecoratorMethod(PyDecoratorMixin, PyClassmember):
def run(self): def run(self):
self.name = 'py:method' self.name = 'py:method'
@ -162,7 +182,8 @@ def run(self):
classes=['versionmodified'])) classes=['versionmodified']))
else: else:
para = nodes.paragraph('', '', para = nodes.paragraph('', '',
nodes.inline('', '%s.' % text, classes=['versionmodified'])) nodes.inline('', '%s.' % text,
classes=['versionmodified']))
if len(node): if len(node):
node.insert(0, para) node.insert(0, para)
else: else:
@ -174,12 +195,10 @@ def run(self):
# Support for including Misc/NEWS # Support for including Misc/NEWS
import re
import codecs
issue_re = re.compile('([Ii])ssue #([0-9]+)') issue_re = re.compile('([Ii])ssue #([0-9]+)')
whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$")
class MiscNews(Directive): class MiscNews(Directive):
has_content = False has_content = False
required_arguments = 1 required_arguments = 1
@ -233,15 +252,6 @@ def run(self):
'typesseq', 'typesseq-mutable', 'unary', 'while', 'with', 'yield' 'typesseq', 'typesseq-mutable', 'unary', 'while', 'with', 'yield'
] ]
from os import path
from time import asctime
from pprint import pformat
from docutils.io import StringOutput
from docutils.utils import new_document
from sphinx.builders import Builder
from sphinx.writers.text import TextWriter
class PydocTopicsBuilder(Builder): class PydocTopicsBuilder(Builder):
name = 'pydoc-topics' name = 'pydoc-topics'
@ -281,17 +291,11 @@ def finish(self):
f.close() f.close()
# Support for checking for suspicious markup
import suspicious
# Support for documenting Opcodes # Support for documenting Opcodes
import re
opcode_sig_re = re.compile(r'(\w+(?:\+\d)?)(?:\s*\((.*)\))?') opcode_sig_re = re.compile(r'(\w+(?:\+\d)?)(?:\s*\((.*)\))?')
def parse_opcode_signature(env, sig, signode): def parse_opcode_signature(env, sig, signode):
"""Transform an opcode signature into RST nodes.""" """Transform an opcode signature into RST nodes."""
m = opcode_sig_re.match(sig) m = opcode_sig_re.match(sig)
@ -311,12 +315,13 @@ def parse_opcode_signature(env, sig, signode):
pdbcmd_sig_re = re.compile(r'([a-z()!]+)\s*(.*)') pdbcmd_sig_re = re.compile(r'([a-z()!]+)\s*(.*)')
# later... # later...
#pdbargs_tokens_re = re.compile(r'''[a-zA-Z]+ | # identifiers # pdbargs_tokens_re = re.compile(r'''[a-zA-Z]+ | # identifiers
# [.,:]+ | # punctuation # [.,:]+ | # punctuation
# [\[\]()] | # parens # [\[\]()] | # parens
# \s+ # whitespace # \s+ # whitespace
# ''', re.X) # ''', re.X)
def parse_pdb_command(env, sig, signode): def parse_pdb_command(env, sig, signode):
"""Transform a pdb command signature into RST nodes.""" """Transform a pdb command signature into RST nodes."""
m = pdbcmd_sig_re.match(sig) m = pdbcmd_sig_re.match(sig)