Merge branch '1.7'

This commit is contained in:
Takeshi KOMIYA 2018-05-19 14:25:23 +09:00
commit 057152e9e7
11 changed files with 53 additions and 20 deletions

13
CHANGES
View File

@ -145,10 +145,17 @@ Bugs fixed
* #4924: html search: Upper characters problem in any other languages * #4924: html search: Upper characters problem in any other languages
* #4932: apidoc: some subpackage is ignored if sibling subpackage contains a * #4932: apidoc: some subpackage is ignored if sibling subpackage contains a
module starting with underscore module starting with underscore
* #4938, #4939: i18n doesn't handle node.title correctly tat used for contents, * #4863, #4938, #4939: i18n doesn't handle node.title correctly tat used for
topic, admonition, table and section. contents, topic, admonition, table and section.
* #4913: i18n: literal blocks in bullet list are not translated * #4913: i18n: literal blocks in bullet list are not translated
* #4962: cpp domain: raises TypeError on duplicate declaration * #4962: C++, raised TypeError on duplicate declaration.
* #4825: C++, properly parse expr roles and give better error messages when
(escaped) line breaks are present.
* C++, properly use ``desc_addname`` nodes for prefixes of names.
* #4915, #4916: links on search page are broken when using dirhtml builder
* #4969: autodoc: constructor method should not have return annotation
* latex: deeply nested enumerated list which is beginning with non-1 causes
LaTeX engine crashed
Testing Testing
-------- --------

View File

@ -190,7 +190,7 @@ class Epub3Builder(_epub_base.EpubBuilder):
navstack[-1].children.append(navpoint) navstack[-1].children.append(navpoint)
navstack.append(navpoint) navstack.append(navpoint)
else: else:
raise raise RuntimeError('Should never reach here. It might be a bug.')
return navstack[0].children return navstack[0].children

View File

@ -12,7 +12,7 @@
import re import re
from copy import deepcopy from copy import deepcopy
from docutils import nodes from docutils import nodes, utils
from docutils.parsers.rst import directives from docutils.parsers.rst import directives
from six import iteritems, text_type from six import iteritems, text_type
@ -1967,26 +1967,34 @@ class ASTNestedName(ASTBase):
prefix = '' # type: unicode prefix = '' # type: unicode
first = True first = True
names = self.names[:-1] if mode == 'lastIsName' else self.names names = self.names[:-1] if mode == 'lastIsName' else self.names
# If lastIsName, then wrap all of the prefix in a desc_addname,
# else append directly to signode.
# NOTE: Breathe relies on the prefix being in the desc_addname node,
# so it can remove it in inner declarations.
dest = signode
if mode == 'lastIsName':
dest = addnodes.desc_addname()
for i in range(len(names)): for i in range(len(names)):
name = names[i] name = names[i]
template = self.templates[i] template = self.templates[i]
if not first: if not first:
signode += nodes.Text('::') dest += nodes.Text('::')
prefix += '::' prefix += '::'
if template: if template:
signode += nodes.Text("template ") dest += nodes.Text("template ")
first = False first = False
if name != '': if name != '':
if (name.templateArgs and # type: ignore if (name.templateArgs and # type: ignore
iTemplateParams < len(templateParams)): iTemplateParams < len(templateParams)):
templateParamsPrefix += text_type(templateParams[iTemplateParams]) templateParamsPrefix += text_type(templateParams[iTemplateParams])
iTemplateParams += 1 iTemplateParams += 1
name.describe_signature(signode, 'markType', # type: ignore name.describe_signature(dest, 'markType', # type: ignore
env, templateParamsPrefix + prefix, symbol) env, templateParamsPrefix + prefix, symbol)
prefix += text_type(name) prefix += text_type(name)
if mode == 'lastIsName': if mode == 'lastIsName':
if len(self.names) > 1: if len(self.names) > 1:
signode += addnodes.desc_addname('::', '::') dest += addnodes.desc_addname('::', '::')
signode += dest
if self.templates[-1]: if self.templates[-1]:
signode += nodes.Text("template ") signode += nodes.Text("template ")
self.names[-1].describe_signature(signode, mode, env, '', symbol) self.names[-1].describe_signature(signode, mode, env, '', symbol)
@ -5961,7 +5969,7 @@ class CPPExprRole(object):
class Warner(object): class Warner(object):
def warn(self, msg): def warn(self, msg):
inliner.reporter.warning(msg, line=lineno) inliner.reporter.warning(msg, line=lineno)
text = utils.unescape(text).replace('\n', ' ')
env = inliner.document.settings.env env = inliner.document.settings.env
parser = DefinitionParser(text, Warner(), env.config) parser = DefinitionParser(text, Warner(), env.config)
try: try:

View File

@ -1035,9 +1035,11 @@ class FunctionDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # typ
# typing) we try to use the constructor signature as function # typing) we try to use the constructor signature as function
# signature without the first argument. # signature without the first argument.
try: try:
args = Signature(self.object.__new__, bound_method=True).format_args() sig = Signature(self.object.__new__, bound_method=True, has_retval=False)
args = sig.format_args()
except TypeError: except TypeError:
args = Signature(self.object.__init__, bound_method=True).format_args() sig = Signature(self.object.__init__, bound_method=True, has_retval=False)
args = sig.format_args()
# escape backslashes for reST # escape backslashes for reST
args = args.replace('\\', '\\\\') args = args.replace('\\', '\\\\')
@ -1090,7 +1092,7 @@ class ClassDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # type:
not(inspect.ismethod(initmeth) or inspect.isfunction(initmeth)): not(inspect.ismethod(initmeth) or inspect.isfunction(initmeth)):
return None return None
try: try:
return Signature(initmeth, bound_method=True).format_args() return Signature(initmeth, bound_method=True, has_retval=False).format_args()
except TypeError: except TypeError:
# still not possible: happens e.g. for old-style classes # still not possible: happens e.g. for old-style classes
# with __init__ in C # with __init__ in C

View File

@ -87,7 +87,7 @@
{%- endmacro %} {%- endmacro %}
{%- macro script() %} {%- macro script() %}
<script type="text/javascript" src="{{ pathto('_static/documentation_options.js', 1) }}"></script> <script type="text/javascript" id="documentation_options" data-url_root="{{ pathto('', 1) }}" src="{{ pathto('_static/documentation_options.js', 1) }}"></script>
{%- for scriptfile in script_files %} {%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script> <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %} {%- endfor %}

View File

@ -1,5 +1,5 @@
var DOCUMENTATION_OPTIONS = { var DOCUMENTATION_OPTIONS = {
URL_ROOT: '{{ url_root }}', URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '{{ release|e }}', VERSION: '{{ release|e }}',
LANGUAGE: '{{ language }}', LANGUAGE: '{{ language }}',
COLLAPSE_INDEX: false, COLLAPSE_INDEX: false,

View File

@ -309,8 +309,8 @@ class Signature(object):
its return annotation. its return annotation.
""" """
def __init__(self, subject, bound_method=False): def __init__(self, subject, bound_method=False, has_retval=True):
# type: (Callable, bool) -> None # type: (Callable, bool, bool) -> None
# check subject is not a built-in class (ex. int, str) # check subject is not a built-in class (ex. int, str)
if (isinstance(subject, type) and if (isinstance(subject, type) and
is_builtin_class_method(subject, "__new__") and is_builtin_class_method(subject, "__new__") and
@ -318,6 +318,7 @@ class Signature(object):
raise TypeError("can't compute signature for built-in type {}".format(subject)) raise TypeError("can't compute signature for built-in type {}".format(subject))
self.subject = subject self.subject = subject
self.has_retval = has_retval
self.partialmethod_with_noargs = False self.partialmethod_with_noargs = False
if PY3: if PY3:
@ -386,7 +387,10 @@ class Signature(object):
def return_annotation(self): def return_annotation(self):
# type: () -> Any # type: () -> Any
if PY3 and self.signature: if PY3 and self.signature:
return self.signature.return_annotation if self.has_retval:
return self.signature.return_annotation
else:
return inspect.Parameter.empty
else: else:
return None return None

View File

@ -19,6 +19,7 @@ from collections import defaultdict
from os import path from os import path
from docutils import nodes, writers from docutils import nodes, writers
from docutils.utils.roman import toRoman
from docutils.writers.latex2e import Babel from docutils.writers.latex2e import Babel
from six import itervalues, text_type from six import itervalues, text_type
@ -1500,8 +1501,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append('\\begin{enumerate}\n') self.body.append('\\begin{enumerate}\n')
if 'start' in node: if 'start' in node:
nested = get_nested_level(node) enum_depth = "enum%s" % toRoman(get_nested_level(node)).lower()
self.body.append('\\setcounter{enum%s}{%d}\n' % ('i' * nested, node['start'] - 1)) self.body.append('\\setcounter{%s}{%d}\n' % (enum_depth, node['start'] - 1))
if self.table: if self.table:
self.table.has_problematic = True self.table.has_problematic = True

View File

@ -9,6 +9,12 @@ nested-enumerated-list
10) Pyramid 10) Pyramid
11) Nile River 11) Nile River
(x) Atbara
(y) Blue Nile
(#) Sobat
(#) Semliki
(#) Kagera
6. Markup 6. Markup
iii. reStructuredText iii. reStructuredText

View File

@ -1231,6 +1231,7 @@ def test_latex_nested_enumerated_list(app, status, warning):
assert r'\setcounter{enumi}{4}' in result assert r'\setcounter{enumi}{4}' in result
assert r'\setcounter{enumii}{3}' in result assert r'\setcounter{enumii}{3}' in result
assert r'\setcounter{enumiii}{9}' in result assert r'\setcounter{enumiii}{9}' in result
assert r'\setcounter{enumiv}{23}' in result
assert r'\setcounter{enumii}{2}' in result assert r'\setcounter{enumii}{2}' in result

View File

@ -280,6 +280,10 @@ def test_Signature_annotations():
sig = inspect.Signature(f11).format_args() sig = inspect.Signature(f11).format_args()
assert sig == '(x: CustomAnnotation, y: 123) -> None' assert sig == '(x: CustomAnnotation, y: 123) -> None'
# has_retval=False
sig = inspect.Signature(f11, has_retval=False).format_args()
assert sig == '(x: CustomAnnotation, y: 123)'
def test_safe_getattr_with_default(): def test_safe_getattr_with_default():
class Foo(object): class Foo(object):