Merge branch '1.7-release'

This commit is contained in:
Takeshi KOMIYA
2018-02-10 15:46:48 +09:00
22 changed files with 327 additions and 190 deletions

View File

@@ -14,6 +14,9 @@ install:
- C:\Python%PYTHON%\python.exe -m pip install -U pip setuptools
- C:\Python%PYTHON%\python.exe -m pip install .[test,websupport]
cache:
- '%LOCALAPPDATA%\pip\Cache'
# No automatic build, just run python tests
build: off
@@ -39,3 +42,17 @@ test_script:
after_test:
- ps: (New-Object System.Net.WebClient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path (Join-Path tests .junit.xml)))
after_build:
# Remove old or huge cache files to hopefully not exceed the 1GB cache limit.
#
# If the cache limit is reached, the cache will not be updated (of not even
# created in the first run). So this is a trade of between keeping the cache
# current and having a cache at all.
# NB: This is done only `on_success` since the cache in uploaded only on
# success anyway.
- C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -type f -mtime +360 -delete
- C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -type f -size +10M -delete
- C:\cygwin\bin\find "%LOCALAPPDATA%\pip" -empty -delete
# Show size of cache
- C:\cygwin\bin\du -hs "%LOCALAPPDATA%\pip\Cache"

5
.gitignore vendored
View File

@@ -11,8 +11,9 @@
.ropeproject/
TAGS
.tags
.tox
.venv
.tox/
.tx/
.venv/
.coverage
htmlcov
.DS_Store

View File

@@ -33,12 +33,6 @@ matrix:
- python: '2.7'
env: TOXENV=flake8
addons:
apt:
packages:
- graphviz
- imagemagick
install:
- pip install -U tox codecov

View File

@@ -34,6 +34,7 @@ Other contributors, listed alphabetically, are:
* Hernan Grecco -- search improvements
* Horst Gutmann -- internationalization support
* Martin Hans -- autodoc improvements
* Zac Hatfield-Dodds -- doctest reporting improvements
* Doug Hellmann -- graphviz improvements
* Tim Hoffmann -- theme improvements
* Timotheus Kampik - JS theme & search enhancements

21
CHANGES
View File

@@ -64,6 +64,9 @@ Bugs fixed
* #4531: autosummary: methods are not treated as attributes
* #4538: autodoc: ``sphinx.ext.autodoc.Options`` has been moved
* #4539: autodoc emits warnings for partialmethods
* #4223: doctest: failing tests reported in wrong file, at wrong line
* i18n: message catalogs are not compiled if specific filenames are given for
``sphinx-build`` as arguments (refs: #4560)
Testing
--------
@@ -234,7 +237,7 @@ Bugs fixed
* #3962: sphinx-apidoc does not recognize implicit namespace packages correctly
* #4094: C++, allow empty template argument lists.
* C++, also hyperlink types in the name of declarations with qualified names.
* C++, do not add index entries for declarations inside concepts.
* C++, do not add index entries for declarations inside concepts.
* C++, support the template disambiguator for dependent names.
* #4314: For PDF 'howto' documents, numbering of code-blocks differs from the
one of figures and tables
@@ -251,7 +254,7 @@ Testing
* Add support for docutils 0.14
* Add tests for the ``sphinx.ext.inheritance_diagram`` extension.
Release 1.6.7 (in development)
Release 1.6.8 (in development)
==============================
Dependencies
@@ -269,6 +272,15 @@ Features added
Bugs fixed
----------
Testing
--------
Release 1.6.7 (released Feb 04, 2018)
=====================================
Bugs fixed
----------
* #1922: html search: Upper characters problem in French
* #4412: Updated jQuery version from 3.1.0 to 3.2.1
* #4438: math: math with labels with whitespace cause html error
@@ -285,9 +297,6 @@ Bugs fixed
* #2372: autosummary: invalid signatures are shown for type annotated functions
* #3942: html: table is not aligned to center even if ``:align: center``
Testing
--------
Release 1.6.6 (released Jan 08, 2018)
=====================================
@@ -322,7 +331,7 @@ Bugs fixed
* #1421: Respect the quiet flag in sphinx-quickstart
* #4281: Race conditions when creating output directory
* #4315: For PDF 'howto' documents, ``latex_toplevel_sectioning='part'`` generates
``\chapter`` commands
``\chapter`` commands
* #4214: Two todolist directives break sphinx-1.6.5
* Fix links to external option docs with intersphinx (refs: #3769)
* #4091: Private members not documented without :undoc-members:

View File

@@ -61,8 +61,8 @@ of the core developers before it is merged into the main repository.
#. If you feel uncomfortable or uncertain about an issue or your changes, feel
free to email the *sphinx-dev* mailing list.
#. Fork `the repository`_ on GitHub to start making your changes to the
**master** branch for next major version, or **stable** branch for next
minor version.
``master`` branch for next major version, or ``X.Y`` branch for next
minor version (see `Branch Model`_).
#. Write a test which shows that the bug was fixed or that the feature works
as expected.
#. Send a pull request and bug the maintainer until it gets merged and
@@ -92,12 +92,13 @@ These are the basic steps needed to start developing on Sphinx.
#. Checkout the appropriate branch.
For changes that should be included in the next minor release (namely bug
fixes), use the ``stable`` branch. ::
fixes), use the ``X.Y`` branch. ::
git checkout stable
git checkout X.Y
For new features or other substantial changes that should wait until the
next major release, use the ``master`` branch.
next major release, use the ``master`` branch (see `Branch Model`_ for
detail).
#. Setup a virtual environment.
@@ -187,7 +188,7 @@ These are the basic steps needed to start developing on Sphinx.
git push origin feature-xyz
#. Submit a pull request from your branch to the respective branch (``master``
or ``stable``) on ``sphinx-doc/sphinx`` using the GitHub interface.
or ``X.Y``).
#. Wait for a core developer to review your changes.
@@ -304,6 +305,24 @@ Debugging Tips
$ npm install
$ node_modules/.bin/grunt build # -> dest/*.global.js
Branch Model
------------
Sphinx project uses following branches for developing.
``master``
Used for main development. All improvement and refactoring, bug fixes
are allowed.
``X.Y``
Where ``X.Y`` is the ``MAJOR.MINOR`` release. Used to maintain current
stable release. Only bug fixes and stable changes are allowed. Only the
most recent stable release is currently retained. When a new version is
released, the old release branch will be deleted and replaced by an
equivalent tag.
Deprecating a feature
---------------------

View File

@@ -141,7 +141,6 @@ Documentation using the nature theme
Documentation using another builtin theme
-----------------------------------------
* Arcade: http://arcade.academy/ (sphinx_rtd_theme)
* Breathe: https://breathe.readthedocs.io/ (haiku)
* MPipe: https://vmlaker.github.io/mpipe/ (sphinx13)
* NLTK: http://www.nltk.org/ (agogo)
@@ -159,6 +158,8 @@ Documentation using sphinx_rtd_theme
* Annotator: http://docs.annotatorjs.org/
* Ansible: https://docs.ansible.com/ (customized)
* Arcade: http://arcade.academy/
* aria2: https://aria2.github.io/manual/en/html/
* ASE: https://wiki.fysik.dtu.dk/ase/
* Autofac: http://docs.autofac.org/
* BigchainDB: https://docs.bigchaindb.com/

View File

@@ -1141,18 +1141,23 @@ class Sphinx(object):
"""
if typ == 'read':
attrname = 'parallel_read_safe'
message = __("the %s extension does not declare if it is safe "
"for parallel reading, assuming it isn't - please "
"ask the extension author to check and make it "
"explicit")
elif typ == 'write':
attrname = 'parallel_write_safe'
message = __("the %s extension does not declare if it is safe "
"for parallel writing, assuming it isn't - please "
"ask the extension author to check and make it "
"explicit")
else:
raise ValueError('parallel type %s is not supported' % typ)
for ext in itervalues(self.extensions):
allowed = getattr(ext, attrname, None)
if allowed is None:
logger.warning(__("the %s extension does not declare if it is safe "
"for parallel %sing, assuming it isn't - please "
"ask the extension author to check and make it "
"explicit"), ext.name, typ)
logger.warning(message, ext.name)
logger.warning('doing serial %s', typ)
return False
elif not allowed:

View File

@@ -16,7 +16,7 @@ from docutils import nodes
from sphinx.deprecation import RemovedInSphinx20Warning
from sphinx.environment.adapters.asset import ImageAdapter
from sphinx.util import i18n, import_object, path_stabilize, logging, status_iterator
from sphinx.util import i18n, import_object, logging, status_iterator
from sphinx.util.console import bold # type: ignore
from sphinx.util.i18n import find_catalog
from sphinx.util.osutil import SEP, ensuredir, relative_uri
@@ -257,11 +257,14 @@ class Builder(object):
# type: (List[unicode]) -> None
def to_domain(fpath):
# type: (unicode) -> unicode
docname, _ = path.splitext(path_stabilize(fpath))
dom = find_catalog(docname, self.config.gettext_compact)
return dom
docname = self.env.path2doc(path.abspath(fpath))
if docname:
return find_catalog(docname, self.config.gettext_compact)
else:
return None
specified_domains = set(map(to_domain, specified_files))
specified_domains.discard(None)
catalogs = i18n.find_catalog_source_files(
[path.join(self.srcdir, x) for x in self.config.locale_dirs],
self.config.language,

View File

@@ -9,7 +9,6 @@
:license: BSD, see LICENSE for details.
"""
import fnmatch
import os
import re
import sys
@@ -45,7 +44,7 @@ from sphinx.util.websupport import is_commentable
if False:
# For type annotation
from typing import Any, Callable, Dict, IO, Iterator, List, Pattern, Set, Tuple, Type, Union, Generator # NOQA
from typing import Any, Callable, Dict, IO, Iterator, List, Optional, Pattern, Set, Tuple, Type, Union, Generator # NOQA
from docutils import nodes # NOQA
from sphinx.application import Sphinx # NOQA
from sphinx.builders import Builder # NOQA
@@ -350,17 +349,16 @@ class BuildEnvironment(object):
app.emit('env-merge-info', self, docnames, other)
def path2doc(self, filename):
# type: (unicode) -> unicode
# type: (unicode) -> Optional[unicode]
"""Return the docname for the filename if the file is document.
*filename* should be absolute or relative to the source directory.
"""
if filename.startswith(self.srcdir):
filename = filename[len(self.srcdir) + 1:]
filename = os.path.relpath(filename, self.srcdir)
for suffix in self.config.source_suffix:
if fnmatch.fnmatch(filename, '*' + suffix):
if filename.endswith(suffix):
return filename[:-len(suffix)]
# the file does not have docname
return None
def doc2path(self, docname, base=True, suffix=None):
@@ -374,15 +372,13 @@ class BuildEnvironment(object):
"""
docname = docname.replace(SEP, path.sep)
if suffix is None:
candidate_suffix = None # type: unicode
# Use first candidate if there is not a file for any suffix
suffix = next(iter(self.config.source_suffix))
for candidate_suffix in self.config.source_suffix:
if path.isfile(path.join(self.srcdir, docname) +
candidate_suffix):
suffix = candidate_suffix
break
else:
# document does not exist
suffix = list(self.config.source_suffix)[0]
if base is True:
return path.join(self.srcdir, docname) + suffix
elif base is None:

View File

@@ -34,7 +34,7 @@ from sphinx.util.osutil import fs_encoding
if False:
# For type annotation
from typing import Any, Callable, Dict, IO, Iterable, List, Sequence, Set, Tuple # NOQA
from typing import Any, Callable, Dict, IO, Iterable, List, Optional, Sequence, Set, Tuple # NOQA
from sphinx.application import Sphinx # NOQA
logger = logging.getLogger(__name__)
@@ -223,17 +223,18 @@ class TestGroup(object):
class TestCode(object):
def __init__(self, code, type, lineno, options=None):
# type: (unicode, unicode, int, Dict) -> None
def __init__(self, code, type, filename, lineno, options=None):
# type: (unicode, unicode, Optional[str], int, Optional[Dict]) -> None
self.code = code
self.type = type
self.filename = filename
self.lineno = lineno
self.options = options or {}
def __repr__(self): # type: ignore
# type: () -> unicode
return 'TestCode(%r, %r, %r, options=%r)' % (
self.code, self.type, self.lineno, self.options)
return 'TestCode(%r, %r, filename=%r, lineno=%r, options=%r)' % (
self.code, self.type, self.filename, self.lineno, self.options)
class SphinxDocTestRunner(doctest.DocTestRunner):
@@ -366,6 +367,36 @@ Doctest summary
doctree = self.env.get_doctree(docname)
self.test_doc(docname, doctree)
def get_filename_for_node(self, node, docname):
# type: (nodes.Node, unicode) -> str
"""Try to get the file which actually contains the doctest, not the
filename of the document it's included in."""
try:
filename = path.relpath(node.source, self.env.srcdir)\
.rsplit(':docstring of ', maxsplit=1)[0]
except Exception:
filename = self.env.doc2path(docname, base=None)
if PY2:
return filename.encode(fs_encoding)
return filename
@staticmethod
def get_line_number(node):
# type: (nodes.Node) -> Optional[int]
"""Get the real line number or admit we don't know."""
# TODO: Work out how to store or calculate real (file-relative)
# line numbers for doctest blocks in docstrings.
if ':docstring of ' in path.basename(node.source or ''):
# The line number is given relative to the stripped docstring,
# not the file. This is correct where it is set, in
# `docutils.nodes.Node.setup_child`, but Sphinx should report
# relative to the file, not the docstring.
return None
if node.line is not None:
# TODO: find the root cause of this off by one error.
return node.line - 1
return None
def test_doc(self, docname, doctree):
# type: (unicode, nodes.Node) -> None
groups = {} # type: Dict[unicode, TestGroup]
@@ -392,13 +423,16 @@ Doctest summary
return isinstance(node, (nodes.literal_block, nodes.comment)) \
and 'testnodetype' in node
for node in doctree.traverse(condition):
source = 'test' in node and node['test'] or node.astext()
source = node['test'] if 'test' in node else node.astext()
filename = self.get_filename_for_node(node, docname)
line_number = self.get_line_number(node)
if not source:
logger.warning('no code/output in %s block at %s:%s',
node.get('testnodetype', 'doctest'),
self.env.doc2path(docname), node.line)
filename, line_number)
code = TestCode(source, type=node.get('testnodetype', 'doctest'),
lineno=node.line, options=node.get('options'))
filename=filename, lineno=line_number,
options=node.get('options'))
node_groups = node.get('groups', ['default'])
if '*' in node_groups:
add_to_all_groups.append(code)
@@ -412,12 +446,12 @@ Doctest summary
group.add_code(code)
if self.config.doctest_global_setup:
code = TestCode(self.config.doctest_global_setup,
'testsetup', lineno=0)
'testsetup', filename=None, lineno=0)
for group in itervalues(groups):
group.add_code(code, prepend=True)
if self.config.doctest_global_cleanup:
code = TestCode(self.config.doctest_global_cleanup,
'testcleanup', lineno=0)
'testcleanup', filename=None, lineno=0)
for group in itervalues(groups):
group.add_code(code)
if not groups:
@@ -426,7 +460,7 @@ Doctest summary
self._out('\nDocument: %s\n----------%s\n' %
(docname, '-' * len(docname)))
for group in itervalues(groups):
self.test_group(group, self.env.doc2path(docname, base=None))
self.test_group(group)
# Separately count results from setup code
res_f, res_t = self.setup_runner.summarize(self._out, verbose=False)
self.setup_failures += res_f
@@ -445,13 +479,8 @@ Doctest summary
# type: (unicode, unicode, unicode, Any, bool) -> Any
return compile(code, name, self.type, flags, dont_inherit)
def test_group(self, group, filename):
# type: (TestGroup, unicode) -> None
if PY2:
filename_str = filename.encode(fs_encoding)
else:
filename_str = filename
def test_group(self, group):
# type: (TestGroup) -> None
ns = {} # type: Dict
def run_setup_cleanup(runner, testcodes, what):
@@ -466,7 +495,7 @@ Doctest summary
# simulate a doctest with the code
sim_doctest = doctest.DocTest(examples, {},
'%s (%s code)' % (group.name, what),
filename_str, 0, None)
testcodes[0].filename, 0, None)
sim_doctest.globs = ns
old_f = runner.failures
self.type = 'exec' # the snippet may contain multiple statements
@@ -487,10 +516,10 @@ Doctest summary
try:
test = parser.get_doctest( # type: ignore
doctest_encode(code[0].code, self.env.config.source_encoding), {}, # type: ignore # NOQA
group.name, filename_str, code[0].lineno)
group.name, code[0].filename, code[0].lineno)
except Exception:
logger.warning('ignoring invalid doctest code: %r', code[0].code,
location=(filename, code[0].lineno))
location=(code[0].filename, code[0].lineno))
continue
if not test.examples:
continue
@@ -518,7 +547,7 @@ Doctest summary
lineno=code[0].lineno,
options=options)
test = doctest.DocTest([example], {}, group.name, # type: ignore
filename_str, code[0].lineno, None)
code[0].filename, code[0].lineno, None)
self.type = 'exec' # multiple statements again
# DocTest.__init__ copies the globs namespace, which we don't want
test.globs = ns

View File

@@ -52,7 +52,7 @@ def verify_needs_extensions(app, config):
for extname, reqversion in iteritems(config.needs_extensions):
extension = app.extensions.get(extname)
if extension is None:
logger.warning(__('The %s extension is required by needs_extensions settings,'
logger.warning(__('The %s extension is required by needs_extensions settings, '
'but it is not loaded.'), extname)
continue

View File

@@ -6,110 +6,118 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Sphinx 1.7\n"
"Project-Id-Version: Sphinx 1.7.0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2018-01-15 21:58+0900\n"
"POT-Creation-Date: 2018-02-07 09:08+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.5.1\n"
"Generated-By: Babel 2.5.3\n"
#: sphinx/application.py:177
#: sphinx/application.py:176
#, python-format
msgid ""
"This project needs at least Sphinx v%s and therefore cannot be built with"
" this version."
msgstr ""
#: sphinx/application.py:208
#: sphinx/application.py:207
msgid ""
"'setup' as currently defined in conf.py isn't a Python callable. Please "
"modify its definition to make it a callable function. This is needed for "
"conf.py to behave as a Sphinx extension."
msgstr ""
#: sphinx/application.py:222
#: sphinx/application.py:221
#, python-format
msgid "primary_domain %r not found, ignored."
msgstr ""
#: sphinx/application.py:259 sphinx/application.py:287
#: sphinx/application.py:258 sphinx/application.py:286
msgid "done"
msgstr ""
#: sphinx/application.py:280
#: sphinx/application.py:279
msgid "loading pickled environment... "
msgstr ""
#: sphinx/application.py:290
#: sphinx/application.py:289
msgid "not yet created"
msgstr ""
#: sphinx/application.py:292
#: sphinx/application.py:291
#, python-format
msgid "failed: %s"
msgstr ""
#: sphinx/application.py:302
#: sphinx/application.py:301
msgid "No builder selected, using default: html"
msgstr ""
#: sphinx/application.py:334
#: sphinx/application.py:333
msgid "succeeded"
msgstr ""
#: sphinx/application.py:334
#: sphinx/application.py:333
msgid "finished with problems"
msgstr ""
#: sphinx/application.py:336
#: sphinx/application.py:335
#, python-format
msgid "build %s, %s warning."
msgstr ""
#: sphinx/application.py:340
#: sphinx/application.py:339
#, python-format
msgid "build %s."
msgstr ""
#: sphinx/application.py:461
#: sphinx/application.py:460
#, python-format
msgid "Config value %r already present"
msgstr ""
#: sphinx/application.py:480
#: sphinx/application.py:479
#, python-format
msgid ""
"while setting up extension %s: node class %r is already registered, its "
"visitors will be overridden"
msgstr ""
#: sphinx/application.py:489
#: sphinx/application.py:488
#, python-format
msgid "Value for key %r must be a (visit, depart) function tuple"
msgstr ""
#: sphinx/application.py:529
#: sphinx/application.py:528
#, python-format
msgid ""
"while setting up extension %s: directive %r is already registered, it "
"will be overridden"
msgstr ""
#: sphinx/application.py:540 sphinx/application.py:552
#: sphinx/application.py:539 sphinx/application.py:551
#, python-format
msgid ""
"while setting up extension %s: role %r is already registered, it will be "
"overridden"
msgstr ""
#: sphinx/application.py:699
#: sphinx/application.py:690
#, python-format
msgid ""
"the %s extension does not declare if it is safe for parallel %sing, "
"the %s extension does not declare if it is safe for parallel reading, "
"assuming it isn't - please ask the extension author to check and make it "
"explicit"
msgstr ""
#: sphinx/application.py:696
#, python-format
msgid ""
"the %s extension does not declare if it is safe for parallel writing, "
"assuming it isn't - please ask the extension author to check and make it "
"explicit"
msgstr ""
@@ -337,35 +345,35 @@ msgstr ""
msgid "Module level"
msgstr ""
#: sphinx/builders/html.py:399 sphinx/transforms/__init__.py:126
#: sphinx/builders/html.py:443 sphinx/transforms/__init__.py:127
#: sphinx/writers/latex.py:583 sphinx/writers/manpage.py:110
#: sphinx/writers/texinfo.py:241
#: sphinx/writers/texinfo.py:240
#, python-format
msgid "%b %d, %Y"
msgstr ""
#: sphinx/builders/html.py:417 sphinx/themes/basic/defindex.html:30
#: sphinx/builders/html.py:461 sphinx/themes/basic/defindex.html:30
msgid "General Index"
msgstr ""
#: sphinx/builders/html.py:417
#: sphinx/builders/html.py:461
msgid "index"
msgstr ""
#: sphinx/builders/html.py:481
#: sphinx/builders/html.py:525
msgid "next"
msgstr ""
#: sphinx/builders/html.py:490
#: sphinx/builders/html.py:534
msgid "previous"
msgstr ""
#: sphinx/builders/html.py:1386
#: sphinx/builders/html.py:1424
#, python-format
msgid "%s %s documentation"
msgstr ""
#: sphinx/builders/latex.py:205 sphinx/builders/texinfo.py:224
#: sphinx/builders/latex.py:204 sphinx/builders/texinfo.py:224
msgid " (in "
msgstr ""
@@ -409,19 +417,19 @@ msgstr ""
msgid "Line spec %r: no lines pulled from include file %r"
msgstr ""
#: sphinx/directives/other.py:158
#: sphinx/directives/other.py:157
msgid "Section author: "
msgstr ""
#: sphinx/directives/other.py:160
#: sphinx/directives/other.py:159
msgid "Module author: "
msgstr ""
#: sphinx/directives/other.py:162
#: sphinx/directives/other.py:161
msgid "Code author: "
msgstr ""
#: sphinx/directives/other.py:164
#: sphinx/directives/other.py:163
msgid "Author: "
msgstr ""
@@ -430,18 +438,18 @@ msgstr ""
msgid "%s %s"
msgstr ""
#: sphinx/domains/c.py:65 sphinx/domains/cpp.py:5441
#: sphinx/domains/python.py:177
#: sphinx/domains/c.py:65 sphinx/domains/cpp.py:5440
#: sphinx/domains/python.py:176
msgid "Parameters"
msgstr ""
#: sphinx/domains/c.py:68 sphinx/domains/cpp.py:5450
#: sphinx/domains/javascript.py:210 sphinx/domains/python.py:189
#: sphinx/domains/c.py:68 sphinx/domains/cpp.py:5449
#: sphinx/domains/javascript.py:210 sphinx/domains/python.py:188
msgid "Returns"
msgstr ""
#: sphinx/domains/c.py:70 sphinx/domains/javascript.py:212
#: sphinx/domains/python.py:191
#: sphinx/domains/python.py:190
msgid "Return type"
msgstr ""
@@ -470,12 +478,12 @@ msgstr ""
msgid "%s (C variable)"
msgstr ""
#: sphinx/domains/c.py:257 sphinx/domains/cpp.py:5864
#: sphinx/domains/javascript.py:299 sphinx/domains/python.py:706
#: sphinx/domains/c.py:257 sphinx/domains/cpp.py:5863
#: sphinx/domains/javascript.py:299 sphinx/domains/python.py:705
msgid "function"
msgstr ""
#: sphinx/domains/c.py:258 sphinx/domains/cpp.py:5865
#: sphinx/domains/c.py:258 sphinx/domains/cpp.py:5864
msgid "member"
msgstr ""
@@ -483,7 +491,7 @@ msgstr ""
msgid "macro"
msgstr ""
#: sphinx/domains/c.py:260 sphinx/domains/cpp.py:5866
#: sphinx/domains/c.py:260 sphinx/domains/cpp.py:5865
msgid "type"
msgstr ""
@@ -491,72 +499,72 @@ msgstr ""
msgid "variable"
msgstr ""
#: sphinx/domains/cpp.py:5444
#: sphinx/domains/cpp.py:5443
msgid "Template Parameters"
msgstr ""
#: sphinx/domains/cpp.py:5447 sphinx/domains/javascript.py:207
#: sphinx/domains/cpp.py:5446 sphinx/domains/javascript.py:207
msgid "Throws"
msgstr ""
#: sphinx/domains/cpp.py:5629
#: sphinx/domains/cpp.py:5628
#, python-format
msgid "%s (C++ type)"
msgstr ""
#: sphinx/domains/cpp.py:5639
#: sphinx/domains/cpp.py:5638
#, python-format
msgid "%s (C++ concept)"
msgstr ""
#: sphinx/domains/cpp.py:5649
#: sphinx/domains/cpp.py:5648
#, python-format
msgid "%s (C++ member)"
msgstr ""
#: sphinx/domains/cpp.py:5659
#: sphinx/domains/cpp.py:5658
#, python-format
msgid "%s (C++ function)"
msgstr ""
#: sphinx/domains/cpp.py:5669
#: sphinx/domains/cpp.py:5668
#, python-format
msgid "%s (C++ class)"
msgstr ""
#: sphinx/domains/cpp.py:5679
#: sphinx/domains/cpp.py:5678
#, python-format
msgid "%s (C++ enum)"
msgstr ""
#: sphinx/domains/cpp.py:5699
#: sphinx/domains/cpp.py:5698
#, python-format
msgid "%s (C++ enumerator)"
msgstr ""
#: sphinx/domains/cpp.py:5863 sphinx/domains/javascript.py:301
#: sphinx/domains/python.py:708
#: sphinx/domains/cpp.py:5862 sphinx/domains/javascript.py:301
#: sphinx/domains/python.py:707
msgid "class"
msgstr ""
#: sphinx/domains/cpp.py:5867
#: sphinx/domains/cpp.py:5866
msgid "concept"
msgstr ""
#: sphinx/domains/cpp.py:5868
#: sphinx/domains/cpp.py:5867
msgid "enum"
msgstr ""
#: sphinx/domains/cpp.py:5869
#: sphinx/domains/cpp.py:5868
msgid "enumerator"
msgstr ""
#: sphinx/domains/javascript.py:131 sphinx/domains/python.py:396
#: sphinx/domains/javascript.py:131 sphinx/domains/python.py:395
#, python-format
msgid "%s() (built-in function)"
msgstr ""
#: sphinx/domains/javascript.py:132 sphinx/domains/python.py:461
#: sphinx/domains/javascript.py:132 sphinx/domains/python.py:460
#, python-format
msgid "%s() (%s method)"
msgstr ""
@@ -571,7 +579,7 @@ msgstr ""
msgid "%s (global variable or constant)"
msgstr ""
#: sphinx/domains/javascript.py:138 sphinx/domains/python.py:499
#: sphinx/domains/javascript.py:138 sphinx/domains/python.py:498
#, python-format
msgid "%s (%s attribute)"
msgstr ""
@@ -580,117 +588,117 @@ msgstr ""
msgid "Arguments"
msgstr ""
#: sphinx/domains/javascript.py:266 sphinx/domains/python.py:576
#: sphinx/domains/javascript.py:266 sphinx/domains/python.py:575
#, python-format
msgid "%s (module)"
msgstr ""
#: sphinx/domains/javascript.py:300 sphinx/domains/python.py:710
#: sphinx/domains/javascript.py:300 sphinx/domains/python.py:709
msgid "method"
msgstr ""
#: sphinx/domains/javascript.py:302 sphinx/domains/python.py:707
#: sphinx/domains/javascript.py:302 sphinx/domains/python.py:706
msgid "data"
msgstr ""
#: sphinx/domains/javascript.py:303 sphinx/domains/python.py:713
#: sphinx/domains/javascript.py:303 sphinx/domains/python.py:712
msgid "attribute"
msgstr ""
#: sphinx/domains/javascript.py:304 sphinx/domains/python.py:714
#: sphinx/domains/javascript.py:304 sphinx/domains/python.py:713
#: sphinx/locale/__init__.py:218
msgid "module"
msgstr ""
#: sphinx/domains/python.py:182
#: sphinx/domains/python.py:181
msgid "Variables"
msgstr ""
#: sphinx/domains/python.py:186
#: sphinx/domains/python.py:185
msgid "Raises"
msgstr ""
#: sphinx/domains/python.py:397 sphinx/domains/python.py:455
#: sphinx/domains/python.py:467 sphinx/domains/python.py:480
#: sphinx/domains/python.py:396 sphinx/domains/python.py:454
#: sphinx/domains/python.py:466 sphinx/domains/python.py:479
#, python-format
msgid "%s() (in module %s)"
msgstr ""
#: sphinx/domains/python.py:400
#: sphinx/domains/python.py:399
#, python-format
msgid "%s (built-in variable)"
msgstr ""
#: sphinx/domains/python.py:401 sphinx/domains/python.py:493
#: sphinx/domains/python.py:400 sphinx/domains/python.py:492
#, python-format
msgid "%s (in module %s)"
msgstr ""
#: sphinx/domains/python.py:421
#: sphinx/domains/python.py:420
#, python-format
msgid "%s (built-in class)"
msgstr ""
#: sphinx/domains/python.py:422
#: sphinx/domains/python.py:421
#, python-format
msgid "%s (class in %s)"
msgstr ""
#: sphinx/domains/python.py:459
#: sphinx/domains/python.py:458
#, python-format
msgid "%s() (%s.%s method)"
msgstr ""
#: sphinx/domains/python.py:471
#: sphinx/domains/python.py:470
#, python-format
msgid "%s() (%s.%s static method)"
msgstr ""
#: sphinx/domains/python.py:474
#: sphinx/domains/python.py:473
#, python-format
msgid "%s() (%s static method)"
msgstr ""
#: sphinx/domains/python.py:484
#: sphinx/domains/python.py:483
#, python-format
msgid "%s() (%s.%s class method)"
msgstr ""
#: sphinx/domains/python.py:487
#: sphinx/domains/python.py:486
#, python-format
msgid "%s() (%s class method)"
msgstr ""
#: sphinx/domains/python.py:497
#: sphinx/domains/python.py:496
#, python-format
msgid "%s (%s.%s attribute)"
msgstr ""
#: sphinx/domains/python.py:635
#: sphinx/domains/python.py:634
msgid "Python Module Index"
msgstr ""
#: sphinx/domains/python.py:636
#: sphinx/domains/python.py:635
msgid "modules"
msgstr ""
#: sphinx/domains/python.py:684
#: sphinx/domains/python.py:683
msgid "Deprecated"
msgstr ""
#: sphinx/domains/python.py:709 sphinx/locale/__init__.py:222
#: sphinx/domains/python.py:708 sphinx/locale/__init__.py:222
msgid "exception"
msgstr ""
#: sphinx/domains/python.py:711
#: sphinx/domains/python.py:710
msgid "class method"
msgstr ""
#: sphinx/domains/python.py:712
#: sphinx/domains/python.py:711
msgid "static method"
msgstr ""
#: sphinx/domains/python.py:884
#: sphinx/domains/python.py:883
msgid " (deprecated)"
msgstr ""
@@ -712,55 +720,55 @@ msgstr ""
msgid "role"
msgstr ""
#: sphinx/domains/std.py:84 sphinx/domains/std.py:101
#: sphinx/domains/std.py:83 sphinx/domains/std.py:100
#, python-format
msgid "environment variable; %s"
msgstr ""
#: sphinx/domains/std.py:200
#: sphinx/domains/std.py:199
#, python-format
msgid "%scommand line option; %s"
msgstr ""
#: sphinx/domains/std.py:455
#: sphinx/domains/std.py:454
msgid "glossary term"
msgstr ""
#: sphinx/domains/std.py:456
#: sphinx/domains/std.py:455
msgid "grammar token"
msgstr ""
#: sphinx/domains/std.py:457
#: sphinx/domains/std.py:456
msgid "reference label"
msgstr ""
#: sphinx/domains/std.py:459
#: sphinx/domains/std.py:458
msgid "environment variable"
msgstr ""
#: sphinx/domains/std.py:460
#: sphinx/domains/std.py:459
msgid "program option"
msgstr ""
#: sphinx/domains/std.py:461
#: sphinx/domains/std.py:460
msgid "document"
msgstr ""
#: sphinx/domains/std.py:498 sphinx/themes/basic/genindex-single.html:30
#: sphinx/domains/std.py:497 sphinx/themes/basic/genindex-single.html:30
#: sphinx/themes/basic/genindex-single.html:55
#: sphinx/themes/basic/genindex-split.html:11
#: sphinx/themes/basic/genindex-split.html:14
#: sphinx/themes/basic/genindex.html:30 sphinx/themes/basic/genindex.html:33
#: sphinx/themes/basic/genindex.html:66 sphinx/themes/basic/layout.html:147
#: sphinx/writers/latex.py:550 sphinx/writers/texinfo.py:517
#: sphinx/writers/latex.py:550 sphinx/writers/texinfo.py:516
msgid "Index"
msgstr ""
#: sphinx/domains/std.py:499
#: sphinx/domains/std.py:498
msgid "Module Index"
msgstr ""
#: sphinx/domains/std.py:500 sphinx/themes/basic/defindex.html:25
#: sphinx/domains/std.py:499 sphinx/themes/basic/defindex.html:25
msgid "Search Page"
msgstr ""
@@ -778,42 +786,42 @@ msgstr ""
msgid "Symbols"
msgstr ""
#: sphinx/ext/doctest.py:134
#: sphinx/ext/doctest.py:132
#, python-format
msgid "missing '+' or '-' in '%s' option."
msgstr ""
#: sphinx/ext/doctest.py:139
#: sphinx/ext/doctest.py:137
#, python-format
msgid "'%s' is not a valid option."
msgstr ""
#: sphinx/ext/doctest.py:152
#: sphinx/ext/doctest.py:151
#, python-format
msgid "'%s' is not a valid pyversion option"
msgstr ""
#: sphinx/ext/graphviz.py:96
#: sphinx/ext/graphviz.py:136
msgid "Graphviz directive cannot have both content and a filename argument"
msgstr ""
#: sphinx/ext/graphviz.py:107
#: sphinx/ext/graphviz.py:147
#, python-format
msgid "External Graphviz file %r not found or reading it failed"
msgstr ""
#: sphinx/ext/graphviz.py:113
#: sphinx/ext/graphviz.py:153
msgid "Ignoring \"graphviz\" directive without content."
msgstr ""
#: sphinx/ext/graphviz.py:204
#: sphinx/ext/graphviz.py:244
#, python-format
msgid ""
"dot command %r cannot be run (needed for graphviz output), check the "
"graphviz_dot setting"
msgstr ""
#: sphinx/ext/graphviz.py:222
#: sphinx/ext/graphviz.py:262
#, python-format
msgid ""
"dot exited with error:\n"
@@ -823,7 +831,7 @@ msgid ""
"%s"
msgstr ""
#: sphinx/ext/graphviz.py:225
#: sphinx/ext/graphviz.py:265
#, python-format
msgid ""
"dot did not produce an output file:\n"
@@ -833,17 +841,17 @@ msgid ""
"%s"
msgstr ""
#: sphinx/ext/graphviz.py:236
#: sphinx/ext/graphviz.py:276
#, python-format
msgid "graphviz_output_format must be one of 'png', 'svg', but is %r"
msgstr ""
#: sphinx/ext/graphviz.py:338 sphinx/ext/graphviz.py:347
#: sphinx/ext/graphviz.py:377 sphinx/ext/graphviz.py:386
#, python-format
msgid "[graph: %s]"
msgstr ""
#: sphinx/ext/graphviz.py:340 sphinx/ext/graphviz.py:349
#: sphinx/ext/graphviz.py:379 sphinx/ext/graphviz.py:388
msgid "[graph]"
msgstr ""
@@ -862,20 +870,25 @@ msgid ""
"%s"
msgstr ""
#: sphinx/ext/imgmath.py:339 sphinx/ext/jsmath.py:41 sphinx/ext/mathjax.py:42
#: sphinx/ext/imgmath.py:338 sphinx/ext/jsmath.py:41 sphinx/ext/mathjax.py:42
msgid "Permalink to this equation"
msgstr ""
#: sphinx/ext/intersphinx.py:320
#: sphinx/ext/intersphinx.py:339
#, python-format
msgid "(in %s v%s)"
msgstr ""
#: sphinx/ext/linkcode.py:75 sphinx/ext/viewcode.py:112
#: sphinx/ext/intersphinx.py:341
#, python-format
msgid "(in %s)"
msgstr ""
#: sphinx/ext/linkcode.py:75 sphinx/ext/viewcode.py:111
msgid "[source]"
msgstr ""
#: sphinx/ext/mathbase.py:123
#: sphinx/ext/mathbase.py:124
#, python-format
msgid "duplicate label of equation %s, other instance in %s"
msgstr ""
@@ -897,33 +910,33 @@ msgstr ""
msgid "original entry"
msgstr ""
#: sphinx/ext/viewcode.py:180
#: sphinx/ext/viewcode.py:179
msgid "[docs]"
msgstr ""
#: sphinx/ext/viewcode.py:194
#: sphinx/ext/viewcode.py:193
msgid "Module code"
msgstr ""
#: sphinx/ext/viewcode.py:200
#: sphinx/ext/viewcode.py:199
#, python-format
msgid "<h1>Source code for %s</h1>"
msgstr ""
#: sphinx/ext/viewcode.py:226
#: sphinx/ext/viewcode.py:225
msgid "Overview: module code"
msgstr ""
#: sphinx/ext/viewcode.py:227
#: sphinx/ext/viewcode.py:226
msgid "<h1>All modules for which code is available</h1>"
msgstr ""
#: sphinx/ext/autodoc/__init__.py:1109
#: sphinx/ext/autodoc/__init__.py:1120
#, python-format
msgid "Bases: %s"
msgstr ""
#: sphinx/ext/autodoc/__init__.py:1164
#: sphinx/ext/autodoc/__init__.py:1181
#, python-format
msgid "alias of :class:`%s`"
msgstr ""
@@ -1285,7 +1298,7 @@ msgstr ""
msgid "%r reference target not found: %%(target)s"
msgstr ""
#: sphinx/util/docutils.py:217
#: sphinx/util/docutils.py:202
msgid "when adding directive classes, no additional arguments may be given"
msgstr ""
@@ -1323,16 +1336,16 @@ msgid "Unknown configure key: latex_elements[%r] is ignored."
msgstr ""
#: sphinx/writers/latex.py:1317 sphinx/writers/manpage.py:275
#: sphinx/writers/texinfo.py:670
#: sphinx/writers/texinfo.py:669
msgid "Footnotes"
msgstr ""
#: sphinx/writers/manpage.py:331 sphinx/writers/text.py:714
#: sphinx/writers/manpage.py:331 sphinx/writers/text.py:713
#, python-format
msgid "[image: %s]"
msgstr ""
#: sphinx/writers/manpage.py:332 sphinx/writers/text.py:715
#: sphinx/writers/manpage.py:332 sphinx/writers/text.py:714
msgid "[image]"
msgstr ""

View File

@@ -0,0 +1,8 @@
from os import path
import sys
sys.path.insert(0, path.abspath(path.dirname(__file__)))
project = 'test project for doctest + autodoc reporting'
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest']
master_doc = 'index'

View File

@@ -0,0 +1,4 @@
"""
>>> 'dir/bar.py:2'
"""

View File

@@ -0,0 +1,4 @@
>>> 'dir/inner.rst:1'
.. automodule:: dir.bar
:members:

View File

@@ -0,0 +1,5 @@
"""
>>> 'foo.py:3'
"""

View File

@@ -0,0 +1,4 @@
.. automodule:: foo
:members:
>>> 'index.rst:4'

View File

@@ -108,7 +108,8 @@ def test_add_is_parallel_allowed(app, status, warning):
app.setup_extension('write_parallel')
assert app.is_parallel_allowed('read') is False
assert app.is_parallel_allowed('write') is True
assert 'the write_parallel extension does not declare' in warning.getvalue()
assert ("the write_parallel extension does not declare if it is safe "
"for parallel reading, assuming it isn't - please ") in warning.getvalue()
app.extensions.pop('write_parallel')
warning.truncate(0) # reset warnings
@@ -121,6 +122,7 @@ def test_add_is_parallel_allowed(app, status, warning):
app.setup_extension('write_serial')
assert app.is_parallel_allowed('read') is False
assert app.is_parallel_allowed('write') is False
assert 'the write_serial extension does not declare' in warning.getvalue()
assert ("the write_serial extension does not declare if it is safe "
"for parallel reading, assuming it isn't - please ") in warning.getvalue()
app.extensions.pop('write_serial')
warning.truncate(0) # reset warnings

View File

@@ -65,7 +65,7 @@ def test_compile_specific_catalogs(app, status, warning):
return set(find_files(catalog_dir, '.mo'))
actual_on_boot = get_actual() # sphinx.mo might be included
app.builder.compile_specific_catalogs(['admonitions'])
app.builder.compile_specific_catalogs([app.srcdir / 'admonitions.txt'])
actual = get_actual() - actual_on_boot
assert actual == set(['admonitions.mo'])

View File

@@ -9,6 +9,7 @@
:license: BSD, see LICENSE for details.
"""
import pytest
from six import PY2
from sphinx.ext.doctest import is_allowed_version
from packaging.version import InvalidVersion
from packaging.specifiers import InvalidSpecifier
@@ -55,3 +56,24 @@ def test_is_allowed_version():
def cleanup_call():
global cleanup_called
cleanup_called += 1
@pytest.mark.xfail(
PY2, reason='node.source points to document instead of filename',
)
@pytest.mark.sphinx('doctest', testroot='ext-doctest-with-autodoc')
def test_reporting_with_autodoc(app, status, warning, capfd):
# Patch builder to get a copy of the output
written = []
app.builder._warn_out = written.append
app.builder.build_all()
lines = '\n'.join(written).split('\n')
failures = [l for l in lines if l.startswith('File')]
expected = [
'File "dir/inner.rst", line 1, in default',
'File "dir/bar.py", line ?, in default',
'File "foo.py", line ?, in default',
'File "index.rst", line 4, in default',
]
for location in expected:
assert location in failures