Merge commit '6694981dd6939ab876b27d4e20a8128561c307ac'

This commit is contained in:
Takeshi KOMIYA 2018-03-15 02:02:21 +09:00
commit 4cebc4399c
16 changed files with 42 additions and 17 deletions

View File

@ -79,6 +79,12 @@ Bugs fixed
* #4669: sphinx.build_main and sphinx.make_main throw NameError * #4669: sphinx.build_main and sphinx.make_main throw NameError
* #4685: autosummary emits meaningless warnings * #4685: autosummary emits meaningless warnings
* autodoc: crashed when invalid options given
* pydomain: always strip parenthesis if empty (refs: #1042)
* #4689: autosummary: unexpectedly strips docstrings containing "i.e."
* #4701: viewcode: Misplaced ``<div>`` in viewcode html output
* #4444: Don't require numfig to use :numref: on sections
* #4727: Option clash for package textcomp
Testing Testing
-------- --------

View File

@ -222,6 +222,7 @@ setup(
'build_sphinx = sphinx.setup_command:BuildDoc', 'build_sphinx = sphinx.setup_command:BuildDoc',
], ],
}, },
python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
install_requires=install_requires, install_requires=install_requires,
extras_require=extras_require, extras_require=extras_require,
cmdclass=cmdclass, cmdclass=cmdclass,

View File

@ -39,7 +39,7 @@ logger = logging.getLogger(__name__)
py_sig_re = re.compile( py_sig_re = re.compile(
r'''^ ([\w.]*\.)? # class name(s) r'''^ ([\w.]*\.)? # class name(s)
(\w+) \s* # thing name (\w+) \s* # thing name
(?: \((.*)\) # optional: arguments (?: \(\s*(.*)\s*\) # optional: arguments
(?:\s* -> \s* (.*))? # return annotation (?:\s* -> \s* (.*))? # return annotation
)? $ # and nothing more )? $ # and nothing more
''', re.VERBOSE) ''', re.VERBOSE)

View File

@ -725,15 +725,15 @@ class StandardDomain(Domain):
if not docname: if not docname:
return None return None
if env.config.numfig is False:
logger.warning(__('numfig is disabled. :numref: is ignored.'), location=node)
return contnode
target_node = env.get_doctree(docname).ids.get(labelid) target_node = env.get_doctree(docname).ids.get(labelid)
figtype = self.get_figtype(target_node) figtype = self.get_figtype(target_node)
if figtype is None: if figtype is None:
return None return None
if figtype != 'section' and env.config.numfig is False:
logger.warning(__('numfig is disabled. :numref: is ignored.'), location=node)
return contnode
try: try:
fignumber = self.get_fignumber(env, builder, figtype, docname, target_node) fignumber = self.get_fignumber(env, builder, figtype, docname, target_node)
if fignumber is None: if fignumber is None:

View File

@ -58,7 +58,7 @@ class DocumenterBridge(object):
def warn(self, msg): def warn(self, msg):
# type: (unicode) -> None # type: (unicode) -> None
logger.warning(msg, line=self.lineno) logger.warning(msg, location=(self.env.docname, self.lineno))
def process_documenter_options(documenter, config, options): def process_documenter_options(documenter, config, options):
@ -125,7 +125,7 @@ class AutodocDirective(Directive):
except (KeyError, ValueError, TypeError) as exc: except (KeyError, ValueError, TypeError) as exc:
# an option is either unknown or has a wrong type # an option is either unknown or has a wrong type
logger.error('An option to %s is either unknown or has an invalid value: %s' % logger.error('An option to %s is either unknown or has an invalid value: %s' %
(self.name, exc), line=lineno) (self.name, exc), location=(source, lineno))
return [] return []
# generate the output # generate the output

View File

@ -91,6 +91,9 @@ if TYPE_CHECKING:
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
periods_re = re.compile('\.(?:\s+)')
# -- autosummary_toc node ------------------------------------------------------ # -- autosummary_toc node ------------------------------------------------------
class autosummary_toc(nodes.comment): class autosummary_toc(nodes.comment):
@ -469,7 +472,7 @@ def extract_summary(doc, document):
break break
# Try to find the "first sentence", which may span multiple lines # Try to find the "first sentence", which may span multiple lines
sentences = " ".join(doc).split('.') sentences = periods_re.split(" ".join(doc)) # type: ignore
if len(sentences) == 1: if len(sentences) == 1:
summary = sentences[0].strip() summary = sentences[0].strip()
else: else:

View File

@ -178,7 +178,7 @@ def collect_pages(app):
'<div class="viewcode-block" id="%s"><a class="viewcode-back" ' '<div class="viewcode-block" id="%s"><a class="viewcode-back" '
'href="%s">%s</a>' % (name, backlink, _('[docs]')) + 'href="%s">%s</a>' % (name, backlink, _('[docs]')) +
lines[start]) lines[start])
lines[min(end - 1, maxindex)] += '</div>' lines[min(end, maxindex)] += '</div>'
# try to find parents (for submodules) # try to find parents (for submodules)
parents = [] parents = []
parent = modname parent = modname

View File

@ -1331,7 +1331,7 @@ msgstr "Release"
#: sphinx/writers/latex.py:714 #: sphinx/writers/latex.py:714
msgid "continues on next page" msgid "continues on next page"
msgstr "" msgstr "Fortsetzung auf der nächsten Seite"
#: sphinx/writers/latex.py:718 #: sphinx/writers/latex.py:718
msgid "page" msgid "page"

View File

@ -14,6 +14,7 @@
\let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen \let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen
\fi \sphinxpxdimen=<%= pxunit %>\relax \fi \sphinxpxdimen=<%= pxunit %>\relax
<%= passoptionstopackages %> <%= passoptionstopackages %>
\PassOptionsToPackage{warn}{textcomp}
<%= inputenc %> <%= inputenc %>
<%= utf8extra %> <%= utf8extra %>
<%= cmappkg %> <%= cmappkg %>

View File

@ -6,7 +6,7 @@
% %
\NeedsTeXFormat{LaTeX2e}[1995/12/01] \NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{sphinx}[2017/12/12 v1.7 LaTeX package (Sphinx markup)] \ProvidesPackage{sphinx}[2018/03/11 v1.7.2 LaTeX package (Sphinx markup)]
% provides \ltx@ifundefined % provides \ltx@ifundefined
% (many packages load ltxcmds: graphicx does for pdftex and lualatex but % (many packages load ltxcmds: graphicx does for pdftex and lualatex but
@ -39,7 +39,7 @@
\@ifclassloaded{memoir}{}{\RequirePackage{fancyhdr}} \@ifclassloaded{memoir}{}{\RequirePackage{fancyhdr}}
% for \text macro and \iffirstchoice@ conditional even if amsmath not loaded % for \text macro and \iffirstchoice@ conditional even if amsmath not loaded
\RequirePackage{amstext} \RequirePackage{amstext}
\RequirePackage[warn]{textcomp} \RequirePackage{textcomp}% "warn" option issued from template
\RequirePackage{titlesec} \RequirePackage{titlesec}
\@ifpackagelater{titlesec}{2016/03/15}% \@ifpackagelater{titlesec}{2016/03/15}%
{\@ifpackagelater{titlesec}{2016/03/21}% {\@ifpackagelater{titlesec}{2016/03/21}%

View File

@ -267,7 +267,7 @@ def test_run_epubcheck(app):
epubcheck = os.environ.get('EPUBCHECK_PATH', '/usr/share/java/epubcheck.jar') epubcheck = os.environ.get('EPUBCHECK_PATH', '/usr/share/java/epubcheck.jar')
if runnable('java') and os.path.exists(epubcheck): if runnable('java') and os.path.exists(epubcheck):
p = Popen(['java', '-jar', epubcheck, app.outdir / 'Sphinx.epub'], p = Popen(['java', '-jar', epubcheck, app.outdir / 'SphinxTests.epub'],
stdout=PIPE, stderr=PIPE) stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate() stdout, stderr = p.communicate()
if p.returncode != 0: if p.returncode != 0:

View File

@ -506,7 +506,6 @@ def test_numfig_disabled_warn(app, warning):
app.build() app.build()
warnings = warning.getvalue() warnings = warning.getvalue()
assert 'index.rst:47: WARNING: numfig is disabled. :numref: is ignored.' in warnings assert 'index.rst:47: WARNING: numfig is disabled. :numref: is ignored.' in warnings
assert 'index.rst:55: WARNING: no number is assigned for section: index' not in warnings
assert 'index.rst:56: WARNING: invalid numfig_format: invalid' not in warnings assert 'index.rst:56: WARNING: invalid numfig_format: invalid' not in warnings
assert 'index.rst:57: WARNING: invalid numfig_format: Fig %s %s' not in warnings assert 'index.rst:57: WARNING: invalid numfig_format: Fig %s %s' not in warnings
@ -524,10 +523,10 @@ def test_numfig_disabled_warn(app, warning):
(".//li/code/span", '^Table:%s$', True), (".//li/code/span", '^Table:%s$', True),
(".//li/code/span", '^CODE_1$', True), (".//li/code/span", '^CODE_1$', True),
(".//li/code/span", '^Code-%s$', True), (".//li/code/span", '^Code-%s$', True),
(".//li/code/span", '^foo$', True), (".//li/a/span", '^Section 1$', True),
(".//li/code/span", '^bar_a$', True), (".//li/a/span", '^Section 2.1$', True),
(".//li/code/span", '^Fig.{number}$', True), (".//li/code/span", '^Fig.{number}$', True),
(".//li/code/span", '^Sect.{number}$', True), (".//li/a/span", '^Sect.1 Foo$', True),
], ],
'foo.html': [ 'foo.html': [
(".//div[@class='figure']/p[@class='caption']/" (".//div[@class='figure']/p[@class='caption']/"

View File

@ -77,6 +77,10 @@ def test_extract_summary(capsys):
'it does not break sentence.'] 'it does not break sentence.']
assert extract_summary(doc, document) == ' '.join(doc) assert extract_summary(doc, document) == ' '.join(doc)
# abbreviations
doc = ['Blabla, i.e. bla.']
assert extract_summary(doc, document) == 'Blabla, i.e.'
_, err = capsys.readouterr() _, err = capsys.readouterr()
assert err == '' assert err == ''

View File

@ -38,6 +38,17 @@ def test_viewcode(app, status, warning):
# the next assert fails, until the autodoc bug gets fixed # the next assert fails, until the autodoc bug gets fixed
assert result.count('this is the class attribute class_attr') == 2 assert result.count('this is the class attribute class_attr') == 2
result = (app.outdir / '_modules/spam/mod1.html').text(encoding='utf-8')
result = re.sub('<span class=".*?">', '<span>', result) # filter pygments classes
assert ('<div class="viewcode-block" id="Class1"><a class="viewcode-back" '
'href="../../index.html#spam.Class1">[docs]</a>'
'<span>@decorator</span>\n'
'<span>class</span> <span>Class1</span>'
'<span>(</span><span>object</span><span>):</span>\n'
' <span>&quot;&quot;&quot;</span>\n'
'<span> this is Class1</span>\n'
'<span> &quot;&quot;&quot;</span></div>\n') in result
@pytest.mark.sphinx(testroot='ext-viewcode', tags=['test_linkcode']) @pytest.mark.sphinx(testroot='ext-viewcode', tags=['test_linkcode'])
def test_linkcode(app, status, warning): def test_linkcode(app, status, warning):