Hello community, here is the log from the commit of package python-Sphinx for openSUSE:Factory checked in at 2017-11-01 11:08:42 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-Sphinx (Old) and /work/SRC/openSUSE:Factory/.python-Sphinx.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-Sphinx" Wed Nov 1 11:08:42 2017 rev:45 rq:537523 version:1.6.5 Changes: -------- --- /work/SRC/openSUSE:Factory/python-Sphinx/python-Sphinx-doc.changes 2017-10-07 17:47:29.803661953 +0200 +++ /work/SRC/openSUSE:Factory/.python-Sphinx.new/python-Sphinx-doc.changes 2017-11-01 11:08:41.851835144 +0100 @@ -1,0 +2,37 @@ +Fri Oct 27 16:13:16 UTC 2017 - arun@gmx.de + +- update to version 1.6.5: + * Features added + + #4107: Make searchtools.js compatible with pre-Sphinx1.5 + templates + + #4112: Don't override the smart_quotes setting if it was already + set + + #4125: Display reference texts of original and translated + passages on i18n warning message + + #4147: Include the exception when logging PO/MO file read/write + * Bugs fixed + + #4085: Failed PDF build from image in parsed-literal using + ":align:" option + + #4100: Remove debug print from autodoc extension + + #3987: Changing theme from alabaster causes HTML build to fail + + #4096: C++, don't crash when using the wrong role type. Thanks + to mitya57. + + #4070, #4111: crashes when the warning message contains format + strings (again) + + #4108: Search word highlighting breaks SVG images + + #3692: Unable to build HTML if writing .buildinfo failed + + #4152: HTML writer crashes if a field list is placed on top of + the document + + #4063: Sphinx crashes when labeling directive ".. todolist::" + + #4134: [doc] :file:`docutils.conf` is not documented explicitly + + #4169: Chinese language doesn't trigger Chinese search + automatically + + #1020: ext.todo todolist not linking to the page in pdflatex + + #3965: New quickstart generates wrong SPHINXBUILD in Makefile + + #3739: ":module:" option is ignored at content of pyobjects + + #4149: Documentation: Help choosing :confval:`latex_engine` + + #4090: [doc] :confval:`latex_additional_files` with extra LaTeX + macros should not use ".tex" extension + + Failed to convert reST parser error to warning (refs: #4132) + +------------------------------------------------------------------- python-Sphinx.changes: same change Old: ---- Sphinx-1.6.4.tar.gz New: ---- Sphinx-1.6.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-Sphinx-doc.spec ++++++ --- /var/tmp/diff_new_pack.NEEQdK/_old 2017-11-01 11:08:42.775801393 +0100 +++ /var/tmp/diff_new_pack.NEEQdK/_new 2017-11-01 11:08:42.779801246 +0100 @@ -24,7 +24,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-Sphinx-doc -Version: 1.6.4 +Version: 1.6.5 Release: 0 Url: http://sphinx-doc.org Summary: Documentation for python-Sphinx ++++++ python-Sphinx.spec ++++++ --- /var/tmp/diff_new_pack.NEEQdK/_old 2017-11-01 11:08:42.799800515 +0100 +++ /var/tmp/diff_new_pack.NEEQdK/_new 2017-11-01 11:08:42.803800370 +0100 @@ -25,7 +25,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define oldpython python Name: python-Sphinx -Version: 1.6.4 +Version: 1.6.5 Release: 0 Url: http://sphinx-doc.org Summary: Python documentation generator ++++++ Sphinx-1.6.4.tar.gz -> Sphinx-1.6.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/AUTHORS new/Sphinx-1.6.5/AUTHORS --- old/Sphinx-1.6.4/AUTHORS 2017-09-25 18:28:59.000000000 +0200 +++ new/Sphinx-1.6.5/AUTHORS 2017-10-23 05:17:39.000000000 +0200 @@ -29,6 +29,7 @@ * Kevin Dunn -- MathJax extension * Josip Dzolonga -- coverage builder * Buck Evan -- dummy builder +* Matthew Fernandez -- todo extension fix * Hernan Grecco -- search improvements * Horst Gutmann -- internationalization support * Martin Hans -- autodoc improvements diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/CHANGES new/Sphinx-1.6.5/CHANGES --- old/Sphinx-1.6.4/CHANGES 2017-09-26 02:45:04.000000000 +0200 +++ new/Sphinx-1.6.5/CHANGES 2017-10-23 05:19:47.000000000 +0200 @@ -1,3 +1,37 @@ +Release 1.6.5 (released Oct 23, 2017) +===================================== + +Features added +-------------- + +* #4107: Make searchtools.js compatible with pre-Sphinx1.5 templates +* #4112: Don't override the smart_quotes setting if it was already set +* #4125: Display reference texts of original and translated passages on + i18n warning message +* #4147: Include the exception when logging PO/MO file read/write + +Bugs fixed +---------- + +* #4085: Failed PDF build from image in parsed-literal using ``:align:`` option +* #4100: Remove debug print from autodoc extension +* #3987: Changing theme from alabaster causes HTML build to fail +* #4096: C++, don't crash when using the wrong role type. Thanks to mitya57. +* #4070, #4111: crashes when the warning message contains format strings (again) +* #4108: Search word highlighting breaks SVG images +* #3692: Unable to build HTML if writing .buildinfo failed +* #4152: HTML writer crashes if a field list is placed on top of the document +* #4063: Sphinx crashes when labeling directive ``.. todolist::`` +* #4134: [doc] :file:`docutils.conf` is not documented explicitly +* #4169: Chinese language doesn't trigger Chinese search automatically +* #1020: ext.todo todolist not linking to the page in pdflatex +* #3965: New quickstart generates wrong SPHINXBUILD in Makefile +* #3739: ``:module:`` option is ignored at content of pyobjects +* #4149: Documentation: Help choosing :confval:`latex_engine` +* #4090: [doc] :confval:`latex_additional_files` with extra LaTeX macros should + not use ``.tex`` extension +* Failed to convert reST parser error to warning (refs: #4132) + Release 1.6.4 (released Sep 26, 2017) ===================================== diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/EXAMPLES new/Sphinx-1.6.5/EXAMPLES --- old/Sphinx-1.6.4/EXAMPLES 2017-09-25 18:28:59.000000000 +0200 +++ new/Sphinx-1.6.5/EXAMPLES 2017-10-23 05:17:39.000000000 +0200 @@ -218,7 +218,7 @@ http://www.amazon.co.jp/dp/4048689525/ * "Python Professional Programming" (in Japanese): http://www.amazon.co.jp/dp/4798032948/ -* "Die Wahrheit des Sehens. Der DEKALOG von Krzysztof Kie?lowski": +* "Die Wahrheit des Sehens. Der DEKALOG von Krzysztof Kieślowski": http://www.hasecke.eu/Dekalog/ * The "Varnish Book": http://book.varnish-software.com/4.0/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/PKG-INFO new/Sphinx-1.6.5/PKG-INFO --- old/Sphinx-1.6.4/PKG-INFO 2017-09-26 02:45:55.000000000 +0200 +++ new/Sphinx-1.6.5/PKG-INFO 2017-10-23 05:20:35.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Sphinx -Version: 1.6.4 +Version: 1.6.5 Summary: Python documentation generator Home-page: http://sphinx-doc.org/ Author: Georg Brandl diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/Sphinx.egg-info/PKG-INFO new/Sphinx-1.6.5/Sphinx.egg-info/PKG-INFO --- old/Sphinx-1.6.4/Sphinx.egg-info/PKG-INFO 2017-09-26 02:45:52.000000000 +0200 +++ new/Sphinx-1.6.5/Sphinx.egg-info/PKG-INFO 2017-10-23 05:20:32.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Sphinx -Version: 1.6.4 +Version: 1.6.5 Summary: Python documentation generator Home-page: http://sphinx-doc.org/ Author: Georg Brandl diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/Sphinx.egg-info/SOURCES.txt new/Sphinx-1.6.5/Sphinx.egg-info/SOURCES.txt --- old/Sphinx-1.6.4/Sphinx.egg-info/SOURCES.txt 2017-09-26 02:45:52.000000000 +0200 +++ new/Sphinx-1.6.5/Sphinx.egg-info/SOURCES.txt 2017-10-23 05:20:32.000000000 +0200 @@ -756,6 +756,7 @@ tests/roots/test-domain-cpp/conf.py tests/roots/test-domain-cpp/index.rst tests/roots/test-domain-cpp/roles.rst +tests/roots/test-domain-cpp/roles2.rst tests/roots/test-domain-js/conf.py tests/roots/test-domain-js/index.rst tests/roots/test-domain-js/module.rst @@ -763,6 +764,7 @@ tests/roots/test-domain-py/conf.py tests/roots/test-domain-py/index.rst tests/roots/test-domain-py/module.rst +tests/roots/test-domain-py/module_option.rst tests/roots/test-domain-py/roles.rst tests/roots/test-double-inheriting-theme/conf.py tests/roots/test-double-inheriting-theme/index.rst @@ -836,6 +838,9 @@ tests/roots/test-html_assets/subdir/_build/index.html tests/roots/test-html_entity/conf.py tests/roots/test-html_entity/index.rst +tests/roots/test-image-in-parsed-literal/conf.py +tests/roots/test-image-in-parsed-literal/index.rst +tests/roots/test-image-in-parsed-literal/pic.png tests/roots/test-image-in-section/conf.py tests/roots/test-image-in-section/index.rst tests/roots/test-image-in-section/pic.png diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/doc/config.rst new/Sphinx-1.6.5/doc/config.rst --- old/Sphinx-1.6.4/doc/config.rst 2017-09-25 18:28:59.000000000 +0200 +++ new/Sphinx-1.6.5/doc/config.rst 2017-10-23 05:17:39.000000000 +0200 @@ -9,8 +9,20 @@ :synopsis: Build configuration file. The :term:`configuration directory` must contain a file named :file:`conf.py`. -This file (containing Python code) is called the "build configuration file" and -contains all configuration needed to customize Sphinx input and output behavior. +This file (containing Python code) is called the "build configuration file" +and contains (almost) all configuration needed to customize Sphinx input +and output behavior. + + An optional file `docutils.conf`_ can be added to the configuration + directory to adjust `Docutils`_ configuration if not otherwise overriden or + set by Sphinx; this applies in particular to the `Docutils smart_quotes + setting`_ (Note that Sphinx applies smart quotes transform by default.) + + .. _`docutils`: http://docutils.sourceforge.net/ + + .. _`docutils.conf`: http://docutils.sourceforge.net/docs/user/config.html + + .. _`Docutils smart_quotes setting`: http://docutils.sourceforge.net/docs/user/config.html#smart-quotes The configuration file is executed as Python code at build time (using :func:`execfile`, and with the current directory set to its containing @@ -769,8 +781,8 @@ entities. Default: ``True``. .. deprecated:: 1.6 - Use the `smart_quotes option`_ in the Docutils configuration file - (``docutils.conf``) instead. + To disable or customize smart quotes, use the Docutils configuration file + (``docutils.conf``) instead to set there its `smart_quotes option`_. .. _`smart_quotes option`: http://docutils.sourceforge.net/docs/user/config.html#smart-quotes @@ -1530,6 +1542,25 @@ * ``'lualatex'`` -- LuaLaTeX * ``'platex'`` -- pLaTeX (default if :confval:`language` is ``'ja'``) + PDFLaTeX's support for Unicode characters covers those from the document + language (the LaTeX ``babel`` and ``inputenc`` packages map them to glyph + slots in the document font, at various encodings allowing each only 256 + characters; Sphinx uses by default (except for Cyrillic languages) the + ``times`` package), but stray characters from other scripts or special + symbols may require adding extra LaTeX packages or macros to the LaTeX + preamble. + + If your project uses such extra Unicode characters, switching the engine to + XeLaTeX or LuaLaTeX often provides a quick fix. They only work with UTF-8 + encoded sources and can (in fact, should) use OpenType fonts, either from + the system or the TeX install tree. Recent LaTeX releases will default with + these engines to the Latin Modern OpenType font, which has good coverage of + Latin and Cyrillic scripts (it is provided by standard LaTeX installation), + and Sphinx does not modify this default. Refer to the documentation of the + LaTeX ``polyglossia`` package to see how to instruct LaTeX to use some + other OpenType font if Unicode coverage proves insufficient (or use + directly ``\setmainfont`` et. al. as in :ref:`this example <latex-basic>`.) + .. confval:: latex_documents This value determines how to group the document tree into LaTeX source files. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/doc/latex.rst new/Sphinx-1.6.5/doc/latex.rst --- old/Sphinx-1.6.4/doc/latex.rst 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/doc/latex.rst 2017-10-23 05:17:39.000000000 +0200 @@ -29,6 +29,7 @@ cautionBgColor={named}{LightCyan}} \relax +.. _latex-basic: Basic customization ------------------- @@ -61,17 +62,17 @@ .. highlight:: latex If the size of the ``'preamble'`` contents becomes inconvenient, one may move -all needed macros into some file :file:`mystyle.tex` of the project source +all needed macros into some file :file:`mystyle.tex.txt` of the project source repertory, and get LaTeX to import it at run time:: - 'preamble': r'\input{mystyle.tex}', + 'preamble': r'\input{mystyle.tex.txt}', # or, if the \ProvidesPackage LaTeX macro is used in a file mystyle.sty 'preamble': r'\usepackage{mystyle}', It is needed to set appropriately :confval:`latex_additional_files`, for example:: - latex_additional_files = ["mystyle.tex"] + latex_additional_files = ["mystyle.sty"] .. _latexsphinxsetup: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/__init__.py new/Sphinx-1.6.5/sphinx/__init__.py --- old/Sphinx-1.6.4/sphinx/__init__.py 2017-09-26 02:44:23.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/__init__.py 2017-10-23 05:19:27.000000000 +0200 @@ -34,13 +34,13 @@ warnings.filterwarnings('ignore', "'U' mode is deprecated", DeprecationWarning, module='docutils.io') -__version__ = '1.6.4' -__released__ = '1.6.4' # used when Sphinx builds its own docs +__version__ = '1.6.5' +__released__ = '1.6.5' # used when Sphinx builds its own docs # version info for better programmatic use # possible values for 3rd element: 'alpha', 'beta', 'rc', 'final' # 'final' has 0 as the last element -version_info = (1, 6, 4, 'final', 0) +version_info = (1, 6, 5, 'final', 0) package_dir = path.abspath(path.dirname(__file__)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/builders/html.py new/Sphinx-1.6.5/sphinx/builders/html.py --- old/Sphinx-1.6.4/sphinx/builders/html.py 2017-09-25 18:29:12.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/builders/html.py 2017-10-23 05:17:39.000000000 +0200 @@ -776,12 +776,15 @@ def write_buildinfo(self): # type: () -> None # write build info file - with open(path.join(self.outdir, '.buildinfo'), 'w') as fp: - fp.write('# Sphinx build info version 1\n' - '# This file hashes the configuration used when building' - ' these files. When it is not found, a full rebuild will' - ' be done.\nconfig: %s\ntags: %s\n' % - (self.config_hash, self.tags_hash)) + try: + with open(path.join(self.outdir, '.buildinfo'), 'w') as fp: + fp.write('# Sphinx build info version 1\n' + '# This file hashes the configuration used when building' + ' these files. When it is not found, a full rebuild will' + ' be done.\nconfig: %s\ntags: %s\n' % + (self.config_hash, self.tags_hash)) + except IOError as exc: + logger.warning('Failed to write build info file: %r', exc) def cleanup(self): # type: () -> None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/domains/cpp.py new/Sphinx-1.6.5/sphinx/domains/cpp.py --- old/Sphinx-1.6.4/sphinx/domains/cpp.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/domains/cpp.py 2017-10-23 05:17:39.000000000 +0200 @@ -4963,8 +4963,8 @@ if declTyp == 'templateParam': return True objtypes = self.objtypes_for_role(typ) - if objtypes and declTyp in objtypes: - return True + if objtypes: + return declTyp in objtypes print("Type is %s, declType is %s" % (typ, declTyp)) assert False if not checkType(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/domains/python.py new/Sphinx-1.6.5/sphinx/domains/python.py --- old/Sphinx-1.6.4/sphinx/domains/python.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/domains/python.py 2017-10-23 05:17:39.000000000 +0200 @@ -348,6 +348,10 @@ if self.allow_nesting: classes = self.env.ref_context.setdefault('py:classes', []) classes.append(prefix) + if 'module' in self.options: + modules = self.env.ref_context.setdefault('py:modules', []) + modules.append(self.env.ref_context.get('py:module')) + self.env.ref_context['py:module'] = self.options['module'] def after_content(self): # type: () -> None @@ -368,6 +372,12 @@ pass self.env.ref_context['py:class'] = (classes[-1] if len(classes) > 0 else None) + if 'module' in self.options: + modules = self.env.ref_context.setdefault('py:modules', []) + if modules: + self.env.ref_context['py:module'] = modules.pop() + else: + self.env.ref_context.pop('py:module') class PyModulelevel(PyObject): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/environment/__init__.py new/Sphinx-1.6.5/sphinx/environment/__init__.py --- old/Sphinx-1.6.4/sphinx/environment/__init__.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/environment/__init__.py 2017-10-23 05:17:39.000000000 +0200 @@ -676,19 +676,20 @@ language = self.config.language or 'en' self.settings['language_code'] = language - self.settings['smart_quotes'] = True - if self.config.html_use_smartypants is not None: - warnings.warn("html_use_smartypants option is deprecated. Smart " - "quotes are on by default; if you want to disable " - "or customize them, use the smart_quotes option in " - "docutils.conf.", - RemovedInSphinx17Warning) - self.settings['smart_quotes'] = self.config.html_use_smartypants - for tag in normalize_language_tag(language): - if tag in smartchars.quotes: - break - else: - self.settings['smart_quotes'] = False + if 'smart_quotes' not in self.settings: + self.settings['smart_quotes'] = True + if self.config.html_use_smartypants is not None: + warnings.warn("html_use_smartypants option is deprecated. Smart " + "quotes are on by default; if you want to disable " + "or customize them, use the smart_quotes option in " + "docutils.conf.", + RemovedInSphinx17Warning) + self.settings['smart_quotes'] = self.config.html_use_smartypants + for tag in normalize_language_tag(language): + if tag in smartchars.quotes: + break + else: + self.settings['smart_quotes'] = False docutilsconf = path.join(self.srcdir, 'docutils.conf') # read docutils.conf from source dir, not from current dir diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/ext/autodoc.py new/Sphinx-1.6.5/sphinx/ext/autodoc.py --- old/Sphinx-1.6.4/sphinx/ext/autodoc.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/ext/autodoc.py 2017-10-23 05:17:39.000000000 +0200 @@ -368,7 +368,7 @@ Displaying complex types from ``typing`` relies on its private API. """ - if typing and isinstance(annotation, typing.TypeVar): # type: ignore + if typing and isinstance(annotation, typing.TypeVar): return annotation.__name__ if annotation == Ellipsis: return '...' @@ -971,7 +971,6 @@ # keep documented attributes keep = True isattr = True - print(membername, keep) elif want_all and membername.startswith('_'): # ignore members whose name starts with _ by default keep = self.options.private_members and \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/ext/intersphinx.py new/Sphinx-1.6.5/sphinx/ext/intersphinx.py --- old/Sphinx-1.6.4/sphinx/ext/intersphinx.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/ext/intersphinx.py 2017-10-23 05:17:39.000000000 +0200 @@ -217,7 +217,7 @@ if isinstance(value, (list, tuple)): # new format - name, (uri, inv) = key, value # type: ignore + name, (uri, inv) = key, value if not isinstance(name, string_types): logger.warning('intersphinx identifier %r is not string. Ignored', name) continue diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/ext/todo.py new/Sphinx-1.6.5/sphinx/ext/todo.py --- old/Sphinx-1.6.4/sphinx/ext/todo.py 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/ext/todo.py 2017-10-23 05:17:39.000000000 +0200 @@ -69,6 +69,8 @@ env = self.state.document.settings.env targetid = 'index-%s' % env.new_serialno('index') + # Stash the target to be retrieved later in latex_visit_todo_node. + todo['targetref'] = '%s:%s' % (env.docname, targetid) targetnode = nodes.target('', '', ids=[targetid]) return [targetnode, todo] @@ -137,12 +139,15 @@ env.todo_all_todos = [] # type: ignore for node in doctree.traverse(todolist): + if node.get('ids'): + content = [nodes.target()] + else: + content = [] + if not app.config['todo_include_todos']: - node.replace_self([]) + node.replace_self(content) continue - content = [] - for todo_info in env.todo_all_todos: # type: ignore para = nodes.paragraph(classes=['todo-source']) if app.config['todo_link_only']: @@ -170,8 +175,12 @@ para += newnode para += nodes.Text(desc2, desc2) - # (Recursively) resolve references in the todo content todo_entry = todo_info['todo'] + # Remove targetref from the (copied) node to avoid emitting a + # duplicate label of the original entry when we walk this node. + del todo_entry['targetref'] + + # (Recursively) resolve references in the todo content env.resolve_references(todo_entry, todo_info['docname'], app.builder) @@ -213,7 +222,13 @@ def latex_visit_todo_node(self, node): # type: (nodes.NodeVisitor, todo_node) -> None title = node.pop(0).astext().translate(tex_escape_map) - self.body.append(u'\n\\begin{sphinxadmonition}{note}{%s:}' % title) + self.body.append(u'\n\\begin{sphinxadmonition}{note}{') + # If this is the original todo node, emit a label that will be referenced by + # a hyperref in the todolist. + target = node.get('targetref') + if target is not None: + self.body.append(u'\\label{%s}' % target) + self.body.append('%s:}' % title) def latex_depart_todo_node(self, node): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/quickstart.py new/Sphinx-1.6.5/sphinx/quickstart.py --- old/Sphinx-1.6.4/sphinx/quickstart.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/quickstart.py 2017-10-23 05:17:39.000000000 +0200 @@ -534,7 +534,7 @@ if not path.isdir(dir): return False - if set(['Makefile', 'make.bat']) & set(os.listdir(dir)): + if set(['Makefile', 'make.bat']) & set(os.listdir(dir)): # type: ignore return False if d['sep']: @@ -550,7 +550,7 @@ d['dot'] + 'templates', d['master'] + d['suffix'], ] - if set(reserved_names) & set(os.listdir(dir)): + if set(reserved_names) & set(os.listdir(dir)): # type: ignore return False return True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/search/__init__.py new/Sphinx-1.6.5/sphinx/search/__init__.py --- old/Sphinx-1.6.4/sphinx/search/__init__.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/search/__init__.py 2017-10-23 05:17:39.000000000 +0200 @@ -265,6 +265,11 @@ # objtype index -> (domain, type, objname (localized)) lang_class = languages.get(lang) # type: Type[SearchLanguage] # add language-specific SearchLanguage instance + + # fallback; try again with language-code + if lang_class is None and '_' in lang: + lang_class = languages.get(lang.split('_')[0]) + if lang_class is None: self.lang = SearchEnglish(options) # type: SearchLanguage elif isinstance(lang_class, str): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/templates/quickstart/Makefile.new_t new/Sphinx-1.6.5/sphinx/templates/quickstart/Makefile.new_t --- old/Sphinx-1.6.4/sphinx/templates/quickstart/Makefile.new_t 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/templates/quickstart/Makefile.new_t 2017-10-23 05:17:39.000000000 +0200 @@ -3,7 +3,7 @@ # You can set these variables from the command line. SPHINXOPTS = -SPHINXBUILD = python -msphinx +SPHINXBUILD = sphinx-build SPHINXPROJ = {{ project_fn }} SOURCEDIR = {{ rsrcdir }} BUILDDIR = {{ rbuilddir }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/templates/quickstart/Makefile_t new/Sphinx-1.6.5/sphinx/templates/quickstart/Makefile_t --- old/Sphinx-1.6.4/sphinx/templates/quickstart/Makefile_t 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/templates/quickstart/Makefile_t 2017-10-23 05:17:39.000000000 +0200 @@ -2,9 +2,9 @@ # # You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = python -msphinx -PAPER = +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +PAPER ?= BUILDDIR = {{ rbuilddir }} # Internal variables. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/templates/quickstart/conf.py_t new/Sphinx-1.6.5/sphinx/templates/quickstart/conf.py_t --- old/Sphinx-1.6.4/sphinx/templates/quickstart/conf.py_t 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/templates/quickstart/conf.py_t 2017-10-23 05:17:39.000000000 +0200 @@ -114,11 +114,8 @@ # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars html_sidebars = { '**': [ - 'about.html', - 'navigation.html', 'relations.html', # needs 'show_related': True theme option to display 'searchbox.html', - 'donate.html', ] } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/templates/quickstart/make.bat.new_t new/Sphinx-1.6.5/sphinx/templates/quickstart/make.bat.new_t --- old/Sphinx-1.6.4/sphinx/templates/quickstart/make.bat.new_t 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/templates/quickstart/make.bat.new_t 2017-10-23 05:17:39.000000000 +0200 @@ -5,7 +5,7 @@ REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx + set SPHINXBUILD=sphinx-build ) set SOURCEDIR={{ rsrcdir }} set BUILDDIR={{ rbuilddir }} @@ -16,10 +16,10 @@ %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/templates/quickstart/make.bat_t new/Sphinx-1.6.5/sphinx/templates/quickstart/make.bat_t --- old/Sphinx-1.6.4/sphinx/templates/quickstart/make.bat_t 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/templates/quickstart/make.bat_t 2017-10-23 05:17:39.000000000 +0200 @@ -5,7 +5,7 @@ pushd %~dp0 if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx + set SPHINXBUILD=sphinx-build ) set BUILDDIR={{ rbuilddir }} set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% {{ rsrcdir }} @@ -52,20 +52,29 @@ ) -REM Check if sphinx-build is available +REM Check if sphinx-build is available and fallback to Python version if any %SPHINXBUILD% 1>NUL 2>NUL -if errorlevel 1 ( +if errorlevel 9009 goto sphinx_python +goto sphinx_ok + +:sphinx_python + +set SPHINXBUILD=python -m sphinx.__init__ +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.Sphinx directory to PATH. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) +:sphinx_ok + if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/themes/basic/static/basic.css_t new/Sphinx-1.6.5/sphinx/themes/basic/static/basic.css_t --- old/Sphinx-1.6.4/sphinx/themes/basic/static/basic.css_t 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/themes/basic/static/basic.css_t 2017-10-22 13:19:57.000000000 +0200 @@ -445,10 +445,14 @@ margin-left: 30px; } -dt:target, .highlighted { +dt:target, span.highlighted { background-color: #fbe54e; } +rect.highlighted { + fill: #fbe54e; +} + dl.glossary dt { font-weight: bold; font-size: 1.1em; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/themes/basic/static/doctools.js_t new/Sphinx-1.6.5/sphinx/themes/basic/static/doctools.js_t --- old/Sphinx-1.6.4/sphinx/themes/basic/static/doctools.js_t 2017-08-29 17:11:19.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/themes/basic/static/doctools.js_t 2017-10-22 13:19:57.000000000 +0200 @@ -45,7 +45,7 @@ * it will always return arrays of strings for the value parts. */ jQuery.getQueryParameters = function(s) { - if (typeof s == 'undefined') + if (typeof s === 'undefined') s = document.location.search; var parts = s.substr(s.indexOf('?') + 1).split('&'); var result = {}; @@ -66,29 +66,53 @@ * span elements with the given class name. */ jQuery.fn.highlightText = function(text, className) { - function highlight(node) { - if (node.nodeType == 3) { + function highlight(node, addItems) { + if (node.nodeType === 3) { var val = node.nodeValue; var pos = val.toLowerCase().indexOf(text); if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { - var span = document.createElement("span"); - span.className = className; + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var bbox = span.getBBox(); + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + var parentOfText = node.parentNode.parentNode; + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { - highlight(this); + highlight(this, addItems); }); } } - return this.each(function() { - highlight(this); + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; }; /* @@ -133,21 +157,21 @@ * i18n support */ TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated == 'undefined') + if (typeof translated === 'undefined') return string; - return (typeof translated == 'string') ? translated : translated[0]; + return (typeof translated === 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated == 'undefined') + if (typeof translated === 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, @@ -218,7 +242,7 @@ var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) == 'minus.png') + if (src.substr(-9) === 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); @@ -250,7 +274,7 @@ var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this == '..') + if (this === '..') parts.pop(); }); var url = parts.join('/'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/themes/basic/static/searchtools.js_t new/Sphinx-1.6.5/sphinx/themes/basic/static/searchtools.js_t --- old/Sphinx-1.6.4/sphinx/themes/basic/static/searchtools.js_t 2017-08-29 17:11:19.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/themes/basic/static/searchtools.js_t 2017-10-22 13:19:57.000000000 +0200 @@ -269,6 +269,9 @@ }); } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { var suffix = DOCUMENTATION_OPTIONS.SOURCELINK_SUFFIX; + if (suffix === undefined) { + suffix = '.txt'; + } $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[5] + (item[5].slice(-suffix.length) === suffix ? '' : suffix), dataType: "text", complete: function(jqxhr, textstatus) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/transforms/i18n.py new/Sphinx-1.6.5/sphinx/transforms/i18n.py --- old/Sphinx-1.6.4/sphinx/transforms/i18n.py 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/transforms/i18n.py 2017-10-22 13:19:57.000000000 +0200 @@ -273,7 +273,11 @@ old_foot_refs = node.traverse(is_autonumber_footnote_ref) new_foot_refs = patch.traverse(is_autonumber_footnote_ref) if len(old_foot_refs) != len(new_foot_refs): - logger.warning('inconsistent footnote references in translated message', + old_foot_ref_rawsources = [ref.rawsource for ref in old_foot_refs] + new_foot_ref_rawsources = [ref.rawsource for ref in new_foot_refs] + logger.warning('inconsistent footnote references in translated message.' + + ' original: {0}, translated: {1}' + .format(old_foot_ref_rawsources, new_foot_ref_rawsources), location=node) old_foot_namerefs = {} # type: Dict[unicode, List[nodes.footnote_reference]] for r in old_foot_refs: @@ -309,7 +313,11 @@ old_refs = node.traverse(is_refnamed_ref) new_refs = patch.traverse(is_refnamed_ref) if len(old_refs) != len(new_refs): - logger.warning('inconsistent references in translated message', + old_ref_rawsources = [ref.rawsource for ref in old_refs] + new_ref_rawsources = [ref.rawsource for ref in new_refs] + logger.warning('inconsistent references in translated message.' + + ' original: {0}, translated: {1}' + .format(old_ref_rawsources, new_ref_rawsources), location=node) old_ref_names = [r['refname'] for r in old_refs] new_ref_names = [r['refname'] for r in new_refs] @@ -327,22 +335,46 @@ self.document.note_refname(new) - # refnamed footnote and citation should use original 'ids'. + # refnamed footnote should use original 'ids'. def is_refnamed_footnote_ref(node): # type: (nodes.Node) -> bool - footnote_ref_classes = (nodes.footnote_reference, - nodes.citation_reference) - return isinstance(node, footnote_ref_classes) and \ + return isinstance(node, nodes.footnote_reference) and \ 'refname' in node - old_refs = node.traverse(is_refnamed_footnote_ref) - new_refs = patch.traverse(is_refnamed_footnote_ref) + old_foot_refs = node.traverse(is_refnamed_footnote_ref) + new_foot_refs = patch.traverse(is_refnamed_footnote_ref) refname_ids_map = {} - if len(old_refs) != len(new_refs): - logger.warning('inconsistent references in translated message', + if len(old_foot_refs) != len(new_foot_refs): + old_foot_ref_rawsources = [ref.rawsource for ref in old_foot_refs] + new_foot_ref_rawsources = [ref.rawsource for ref in new_foot_refs] + logger.warning('inconsistent footnote references in translated message.' + + ' original: {0}, translated: {1}' + .format(old_foot_ref_rawsources, new_foot_ref_rawsources), location=node) - for old in old_refs: + for old in old_foot_refs: refname_ids_map[old["refname"]] = old["ids"] - for new in new_refs: + for new in new_foot_refs: + refname = new["refname"] + if refname in refname_ids_map: + new["ids"] = refname_ids_map[refname] + + # citation should use original 'ids'. + def is_citation_ref(node): + # type: (nodes.Node) -> bool + return isinstance(node, nodes.citation_reference) and \ + 'refname' in node + old_cite_refs = node.traverse(is_citation_ref) + new_cite_refs = patch.traverse(is_citation_ref) + refname_ids_map = {} + if len(old_cite_refs) != len(new_cite_refs): + old_cite_ref_rawsources = [ref.rawsource for ref in old_cite_refs] + new_cite_ref_rawsources = [ref.rawsource for ref in new_cite_refs] + logger.warning('inconsistent citation references in translated message.' + + ' original: {0}, translated: {1}' + .format(old_cite_ref_rawsources, new_cite_ref_rawsources), + location=node) + for old in old_cite_refs: + refname_ids_map[old["refname"]] = old["ids"] + for new in new_cite_refs: refname = new["refname"] if refname in refname_ids_map: new["ids"] = refname_ids_map[refname] @@ -354,7 +386,11 @@ new_refs = patch.traverse(addnodes.pending_xref) xref_reftarget_map = {} if len(old_refs) != len(new_refs): - logger.warning('inconsistent term references in translated message', + old_ref_rawsources = [ref.rawsource for ref in old_refs] + new_ref_rawsources = [ref.rawsource for ref in new_refs] + logger.warning('inconsistent term references in translated message.' + + ' original: {0}, translated: {1}' + .format(old_ref_rawsources, new_ref_rawsources), location=node) def get_ref_key(node): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/util/docutils.py new/Sphinx-1.6.5/sphinx/util/docutils.py --- old/Sphinx-1.6.4/sphinx/util/docutils.py 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/util/docutils.py 2017-10-23 05:17:39.000000000 +0200 @@ -26,8 +26,7 @@ from sphinx.util import logging logger = logging.getLogger(__name__) -report_re = re.compile('^(.+?:(?:\\d+)?): \\((DEBUG|INFO|WARNING|ERROR|SEVERE)/(\\d+)?\\) ' - '(.+?)\n?$') +report_re = re.compile('^(.+?:(?:\\d+)?): \\((DEBUG|INFO|WARNING|ERROR|SEVERE)/(\\d+)?\\) ') if False: # For type annotation @@ -162,7 +161,8 @@ if not matched: logger.warning(text.rstrip("\r\n")) else: - location, type, level, message = matched.groups() + location, type, level = matched.groups() + message = report_re.sub('', text).rstrip() # type: ignore logger.log(type, message, location=location) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/util/i18n.py new/Sphinx-1.6.5/sphinx/util/i18n.py --- old/Sphinx-1.6.4/sphinx/util/i18n.py 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/util/i18n.py 2017-10-22 13:19:57.000000000 +0200 @@ -67,15 +67,15 @@ with io.open(self.po_path, 'rt', encoding=self.charset) as file_po: try: po = read_po(file_po, locale) - except Exception: - logger.warning('reading error: %s', self.po_path) + except Exception as exc: + logger.warning('reading error: %s, %s', self.po_path, exc) return with io.open(self.mo_path, 'wb') as file_mo: try: write_mo(file_mo, po) - except Exception: - logger.warning('writing error: %s', self.mo_path) + except Exception as exc: + logger.warning('writing error: %s, %s', self.mo_path, exc) def find_catalog(docname, compaction): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/util/logging.py new/Sphinx-1.6.5/sphinx/util/logging.py --- old/Sphinx-1.6.4/sphinx/util/logging.py 2017-09-24 16:19:58.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/util/logging.py 2017-10-23 05:17:37.000000000 +0200 @@ -136,13 +136,13 @@ # type: (logging.LogRecord) -> None try: self.acquire() - stream = self.stream # type: ignore + stream = self.stream if getattr(record, 'nonl', False): # remove return code forcely when nonl=True self.stream = StringIO() super(NewLineStreamHandlerPY2, self).emit(record) - stream.write(self.stream.getvalue()[:-1]) - stream.flush() + stream.write(self.stream.getvalue()[:-1]) # type: ignore + stream.flush() # type: ignore else: super(NewLineStreamHandlerPY2, self).emit(record) finally: @@ -356,11 +356,15 @@ return True elif self.app.warningiserror: location = getattr(record, 'location', '') - message = record.msg.replace('%', '%%') + try: + message = record.msg % record.args + except TypeError: + message = record.msg # use record.msg itself + if location: - raise SphinxWarning(location + ":" + message % record.args) + raise SphinxWarning(location + ":" + message) else: - raise SphinxWarning(message % record.args) + raise SphinxWarning(message) else: return True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/util/matching.py new/Sphinx-1.6.5/sphinx/util/matching.py --- old/Sphinx-1.6.4/sphinx/util/matching.py 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/util/matching.py 2017-10-22 13:19:57.000000000 +0200 @@ -96,7 +96,7 @@ def patmatch(name, pat): - # type: (unicode, unicode) -> re.Match + # type: (unicode, unicode) -> Match[unicode] """Return if name matches pat. Adapted from fnmatch module.""" if pat not in _pat_cache: _pat_cache[pat] = re.compile(_translate_pattern(pat)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/util/pycompat.py new/Sphinx-1.6.5/sphinx/util/pycompat.py --- old/Sphinx-1.6.4/sphinx/util/pycompat.py 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/util/pycompat.py 2017-10-22 13:19:57.000000000 +0200 @@ -36,7 +36,7 @@ from io import TextIOWrapper else: def TextIOWrapper(stream, encoding): - # type: (file, str) -> unicode + # type: (file, str) -> Any return codecs.lookup(encoding or 'ascii')[2](stream) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/writers/html.py new/Sphinx-1.6.5/sphinx/writers/html.py --- old/Sphinx-1.6.4/sphinx/writers/html.py 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/writers/html.py 2017-10-22 13:19:57.000000000 +0200 @@ -89,6 +89,7 @@ self.param_separator = '' self.optional_param_level = 0 self._table_row_index = 0 + self._fieldlist_row_index = 0 self.required_params_left = 0 def visit_start_of_file(self, node): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/sphinx/writers/latex.py new/Sphinx-1.6.5/sphinx/writers/latex.py --- old/Sphinx-1.6.4/sphinx/writers/latex.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/sphinx/writers/latex.py 2017-10-23 05:17:39.000000000 +0200 @@ -1702,9 +1702,6 @@ pre = [] # type: List[unicode] # in reverse order post = [] # type: List[unicode] - if self.in_parsed_literal: - pre = ['\\begingroup\\sphinxunactivateextrasandspace\\relax '] - post = ['\\endgroup '] include_graphics_options = [] is_inline = self.is_inline(node) if 'width' in attrs: @@ -1744,6 +1741,9 @@ post.append(align_prepost[is_inline, attrs['align']][1]) except KeyError: pass + if self.in_parsed_literal: + pre.append('{\\sphinxunactivateextrasandspace ') + post.append('}') if not is_inline: pre.append('\n\\noindent') post.append('\n') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/roots/test-domain-cpp/roles2.rst new/Sphinx-1.6.5/tests/roots/test-domain-cpp/roles2.rst --- old/Sphinx-1.6.4/tests/roots/test-domain-cpp/roles2.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/Sphinx-1.6.5/tests/roots/test-domain-cpp/roles2.rst 2017-10-22 13:19:57.000000000 +0200 @@ -0,0 +1,5 @@ +Check that we don't crash just because we misuse a role. + +.. cpp:class:: A + +:cpp:func:`A` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/roots/test-domain-py/module_option.rst new/Sphinx-1.6.5/tests/roots/test-domain-py/module_option.rst --- old/Sphinx-1.6.4/tests/roots/test-domain-py/module_option.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/Sphinx-1.6.5/tests/roots/test-domain-py/module_option.rst 2017-10-23 05:17:39.000000000 +0200 @@ -0,0 +1,25 @@ +module_option +============= + +.. py:class:: B + :module: test.extra + + This is also a test. + + + .. py:method:: B.baz() + :module: test.extra + + Does something similar to :meth:`foo`. + + + .. py:method:: B.foo() + :module: test.extra + + Does something. + + + .. py:method:: B.test() + :module: test.extra + + Does something completely unrelated to :meth:`foo` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/roots/test-ext-todo/conf.py new/Sphinx-1.6.5/tests/roots/test-ext-todo/conf.py --- old/Sphinx-1.6.4/tests/roots/test-ext-todo/conf.py 2017-08-29 17:11:19.000000000 +0200 +++ new/Sphinx-1.6.5/tests/roots/test-ext-todo/conf.py 2017-10-23 05:17:39.000000000 +0200 @@ -2,3 +2,8 @@ extensions = ['sphinx.ext.todo'] master_doc = 'index' + +latex_documents = [ + (master_doc, 'TodoTests.tex', 'Todo Tests Documentation', + 'Robin Banks', 'manual'), +] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/roots/test-image-in-parsed-literal/conf.py new/Sphinx-1.6.5/tests/roots/test-image-in-parsed-literal/conf.py --- old/Sphinx-1.6.4/tests/roots/test-image-in-parsed-literal/conf.py 1970-01-01 01:00:00.000000000 +0100 +++ new/Sphinx-1.6.5/tests/roots/test-image-in-parsed-literal/conf.py 2017-10-22 13:19:57.000000000 +0200 @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +master_doc = 'index' +exclude_patterns = ['_build'] + +rst_epilog = ''' +.. |picture| image:: pic.png + :height: 1cm + :scale: 200% + :align: middle + :alt: alternative_text +''' + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/roots/test-image-in-parsed-literal/index.rst new/Sphinx-1.6.5/tests/roots/test-image-in-parsed-literal/index.rst --- old/Sphinx-1.6.4/tests/roots/test-image-in-parsed-literal/index.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/Sphinx-1.6.5/tests/roots/test-image-in-parsed-literal/index.rst 2017-10-22 13:19:57.000000000 +0200 @@ -0,0 +1,9 @@ +test-image-in-parsed-literal +============================ + +Dummy text + +.. parsed-literal:: + + |picture|\ AFTER + Binary files old/Sphinx-1.6.4/tests/roots/test-image-in-parsed-literal/pic.png and new/Sphinx-1.6.5/tests/roots/test-image-in-parsed-literal/pic.png differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/roots/test-intl/refs_inconsistency.po new/Sphinx-1.6.5/tests/roots/test-intl/refs_inconsistency.po --- old/Sphinx-1.6.4/tests/roots/test-intl/refs_inconsistency.po 2017-08-29 17:11:19.000000000 +0200 +++ new/Sphinx-1.6.5/tests/roots/test-intl/refs_inconsistency.po 2017-10-22 13:19:57.000000000 +0200 @@ -19,8 +19,8 @@ msgid "i18n with refs inconsistency" msgstr "I18N WITH REFS INCONSISTENCY" -msgid "[100]_ for [#]_ footnote [ref2]_." -msgstr "FOR FOOTNOTE [ref2]_." +msgid "[100]_ for [#]_ citation [ref2]_." +msgstr "FOR CITATION [ref3]_." msgid "for reference_." msgstr "reference_ FOR reference_." @@ -31,8 +31,8 @@ msgid "This is a auto numbered footnote." msgstr "THIS IS A AUTO NUMBERED FOOTNOTE." -msgid "This is a named footnote." -msgstr "THIS IS A NAMED FOOTNOTE." +msgid "This is a citation." +msgstr "THIS IS A CITATION." msgid "This is a numbered footnote." msgstr "THIS IS A NUMBERED FOOTNOTE." diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/roots/test-intl/refs_inconsistency.txt new/Sphinx-1.6.5/tests/roots/test-intl/refs_inconsistency.txt --- old/Sphinx-1.6.4/tests/roots/test-intl/refs_inconsistency.txt 2017-08-29 17:11:19.000000000 +0200 +++ new/Sphinx-1.6.5/tests/roots/test-intl/refs_inconsistency.txt 2017-10-22 13:19:57.000000000 +0200 @@ -3,11 +3,11 @@ i18n with refs inconsistency ============================= -* [100]_ for [#]_ footnote [ref2]_. +* [100]_ for [#]_ citation [ref2]_. * for reference_. * normal text. .. [#] This is a auto numbered footnote. -.. [ref2] This is a named footnote. +.. [ref2] This is a citation. .. [100] This is a numbered footnote. .. _reference: http://www.example.com diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/test_build_latex.py new/Sphinx-1.6.5/tests/test_build_latex.py --- old/Sphinx-1.6.4/tests/test_build_latex.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/tests/test_build_latex.py 2017-10-23 05:17:39.000000000 +0200 @@ -1029,3 +1029,13 @@ result = (app.outdir / 'Python.tex').text(encoding='utf8') assert 'A \\index{famous}famous \\index{equation}equation:\n' in result assert '\n\\index{Einstein}\\index{relativity}\\ignorespaces \nand' in result + + +@pytest.mark.sphinx('latex', testroot='image-in-parsed-literal') +def test_latex_image_in_parsed_literal(app, status, warning): + app.builder.build_all() + + result = (app.outdir / 'Python.tex').text(encoding='utf8') + assert ('{\\sphinxunactivateextrasandspace \\raisebox{-0.5\height}' + '{\\scalebox{2.000000}{\\sphinxincludegraphics[height=1cm]{{pic}.png}}}' + '}AFTER') in result diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/test_domain_cpp.py new/Sphinx-1.6.5/tests/test_domain_cpp.py --- old/Sphinx-1.6.4/tests/test_domain_cpp.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/tests/test_domain_cpp.py 2017-10-23 05:17:39.000000000 +0200 @@ -508,6 +508,13 @@ # raise DefinitionError("") +@pytest.mark.sphinx(testroot='domain-cpp') +def test_build_domain_cpp_misuse_of_roles(app, status, warning): + app.builder.build_all() + + # TODO: properly check for the warnings we expect + + @pytest.mark.sphinx(testroot='domain-cpp', confoverrides={'add_function_parentheses': True}) def test_build_domain_cpp_with_add_function_parentheses_is_True(app, status, warning): app.builder.build_all() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/test_domain_py.py new/Sphinx-1.6.5/tests/test_domain_py.py --- old/Sphinx-1.6.4/tests/test_domain_py.py 2017-09-25 18:29:00.000000000 +0200 +++ new/Sphinx-1.6.5/tests/test_domain_py.py 2017-10-23 05:17:39.000000000 +0200 @@ -115,6 +115,15 @@ assert_refnode(refnodes[10], False, False, 'float', 'obj') assert len(refnodes) == 11 + doctree = app.env.get_doctree('module_option') + refnodes = list(doctree.traverse(addnodes.pending_xref)) + print(refnodes) + print(refnodes[0]) + print(refnodes[1]) + assert_refnode(refnodes[0], 'test.extra', 'B', 'foo', 'meth') + assert_refnode(refnodes[1], 'test.extra', 'B', 'foo', 'meth') + assert len(refnodes) == 2 + @pytest.mark.sphinx('dummy', testroot='domain-py') def test_domain_py_objects(app, status, warning): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/test_ext_todo.py new/Sphinx-1.6.5/tests/test_ext_todo.py --- old/Sphinx-1.6.4/tests/test_ext_todo.py 2017-08-29 17:11:19.000000000 +0200 +++ new/Sphinx-1.6.5/tests/test_ext_todo.py 2017-10-23 05:17:39.000000000 +0200 @@ -84,3 +84,31 @@ # check handled event assert len(todos) == 2 assert set(todo[1].astext() for todo in todos) == set(['todo in foo', 'todo in bar']) + +@pytest.mark.sphinx('latex', testroot='ext-todo', freshenv=True, + confoverrides={'todo_include_todos': True, 'todo_emit_warnings': True}) +def test_todo_valid_link(app, status, warning): + """ + Test that the inserted "original entry" links for todo items have a target + that exists in the LaTeX output. The target was previously incorrectly + omitted (GitHub issue #1020). + """ + + # Ensure the LaTeX output is built. + app.builder.build_all() + + content = (app.outdir / 'TodoTests.tex').text() + + # Look for the link to foo. We could equally well look for the link to bar. + link = r'\{\\hyperref\[\\detokenize\{(.*?foo.*?)}]\{\\sphinxcrossref{' \ + r'\\sphinxstyleemphasis{original entry}}}}' + m = re.findall(link, content) + assert len(m) == 1 + target = m[0] + + # Look for the targets of this link. + labels = [m for m in re.findall(r'\\label\{([^}]*)}', content) + if m == target] + + # If everything is correct we should have exactly one target. + assert len(labels) == 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/test_intl.py new/Sphinx-1.6.5/tests/test_intl.py --- old/Sphinx-1.6.4/tests/test_intl.py 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/tests/test_intl.py 2017-10-22 13:19:57.000000000 +0200 @@ -182,23 +182,45 @@ result = (app.outdir / 'refs_inconsistency.txt').text(encoding='utf-8') expect = (u"I18N WITH REFS INCONSISTENCY" u"\n****************************\n" - u"\n* FOR FOOTNOTE [ref2].\n" + u"\n* FOR CITATION [ref3].\n" u"\n* reference FOR reference.\n" u"\n* ORPHAN REFERENCE: I18N WITH REFS INCONSISTENCY.\n" u"\n[1] THIS IS A AUTO NUMBERED FOOTNOTE.\n" - u"\n[ref2] THIS IS A NAMED FOOTNOTE.\n" + u"\n[ref2] THIS IS A CITATION.\n" u"\n[100] THIS IS A NUMBERED FOOTNOTE.\n") assert result == expect warnings = getwarning(warning) warning_fmt = u'.*/refs_inconsistency.txt:\\d+: ' \ - u'WARNING: inconsistent %s in translated message\n' + u'WARNING: inconsistent %(reftype)s in translated message.' \ + u' original: %(original)s, translated: %(translated)s\n' expected_warning_expr = ( - warning_fmt % 'footnote references' + - warning_fmt % 'references' + - warning_fmt % 'references') + warning_fmt % { + u'reftype': u'footnote references', + u'original': u"\[u?'\[#\]_'\]", + u'translated': u"\[\]" + } + + warning_fmt % { + u'reftype': u'footnote references', + u'original': u"\[u?'\[100\]_'\]", + u'translated': u"\[\]" + } + + warning_fmt % { + u'reftype': u'references', + u'original': u"\[u?'reference_'\]", + u'translated': u"\[u?'reference_', u?'reference_'\]" + } + + warning_fmt % { + u'reftype': u'references', + u'original': u"\[\]", + u'translated': u"\[u?'`I18N WITH REFS INCONSISTENCY`_'\]" + }) assert_re_search(expected_warning_expr, warnings) + expected_citation_warning_expr = ( + u'.*/refs_inconsistency.txt:\\d+: WARNING: Citation \[ref2\] is not referenced.\n' + + u'.*/refs_inconsistency.txt:\\d+: WARNING: citation not found: ref3') + assert_re_search(expected_citation_warning_expr, warnings) @sphinx_intl @pytest.mark.sphinx('text') @@ -277,7 +299,9 @@ warnings = getwarning(warning) expected_warning_expr = ( u'.*/glossary_terms_inconsistency.txt:\\d+: ' - u'WARNING: inconsistent term references in translated message\n') + u'WARNING: inconsistent term references in translated message.' + u" original: \[u?':term:`Some term`', u?':term:`Some other term`'\]," + u" translated: \[u?':term:`SOME NEW TERM`'\]\n") assert_re_search(expected_warning_expr, warnings) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/test_search.py new/Sphinx-1.6.5/tests/test_search.py --- old/Sphinx-1.6.4/tests/test_search.py 2017-08-29 17:11:19.000000000 +0200 +++ new/Sphinx-1.6.5/tests/test_search.py 2017-10-22 13:19:57.000000000 +0200 @@ -228,3 +228,15 @@ } assert index._objtypes == {('dummy', 'objtype'): 0} assert index._objnames == {0: ('dummy', 'objtype', 'objtype')} + + +def test_IndexBuilder_lookup(): + env = DummyEnvironment('1.0', {}) + + # zh + index = IndexBuilder(env, 'zh', {}, None) + assert index.lang.lang == 'zh' + + # zh_CN + index = IndexBuilder(env, 'zh_CN', {}, None) + assert index.lang.lang == 'zh' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/test_util_logging.py new/Sphinx-1.6.5/tests/test_util_logging.py --- old/Sphinx-1.6.4/tests/test_util_logging.py 2017-09-24 14:18:13.000000000 +0200 +++ new/Sphinx-1.6.5/tests/test_util_logging.py 2017-10-22 13:19:57.000000000 +0200 @@ -165,7 +165,11 @@ # if True, warning raises SphinxWarning exception app.warningiserror = True with pytest.raises(SphinxWarning): - logger.warning('message') + logger.warning('message: %s', 'arg') + + # message contains format string (refs: #4070) + with pytest.raises(SphinxWarning): + logger.warning('%s') def test_warning_location(app, status, warning): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Sphinx-1.6.4/tests/test_writer_latex.py new/Sphinx-1.6.5/tests/test_writer_latex.py --- old/Sphinx-1.6.4/tests/test_writer_latex.py 2017-08-29 17:11:19.000000000 +0200 +++ new/Sphinx-1.6.5/tests/test_writer_latex.py 2017-10-23 05:17:39.000000000 +0200 @@ -27,7 +27,7 @@ assert rstdim_to_latexdim('30%') == '0.300\\linewidth' assert rstdim_to_latexdim('160') == '160\\sphinxpxdimen' - # flaot values + # float values assert rstdim_to_latexdim('160.0em') == '160.0em' assert rstdim_to_latexdim('.5em') == '.5em'