https://bugs.gentoo.org/892213 https://sourceforge.net/p/docutils/patches/201/ --- a/test/test_parsers/test_rst/test_directives/test_code.py +++ b/test/test_parsers/test_rst/test_directives/test_code.py @@ -10,14 +10,20 @@ Test the 'code' directive in parsers/rst if __name__ == '__main__': import __init__ # noqa: F401 +from packaging.version import Version from test_parsers import DocutilsTestSupport -from docutils.utils.code_analyzer import with_pygments +from docutils.utils.code_analyzer import with_pygments, pygments_version def suite(): s = DocutilsTestSupport.ParserTestSuite() if not with_pygments: del(totest['code-parsing']) + del(totest['code-parsing-2-14']) + elif pygments_version >= Version('2.14.0'): + del(totest['code-parsing']) + else: + del(totest['code-parsing-2-14']) s.generateTests(totest) return s @@ -170,6 +176,165 @@ totest['code-parsing'] = [ \n\ print + + ( + + 8 + + / + + 2 + + ) +"""], +["""\ +.. code:: latex + :class: testclass + + hello \\emph{world} % emphasize +""", +"""\ + + + hello \n\ + + \\emph + + { + world + + } + \n\ + + % emphasize"""], +["""\ +.. code:: rst + :number-lines: + + This is a code block with text. +""", +"""\ + + + + 1 \n\ + This is a code block with text. +"""], +["""\ +Code not parsed but warning silenced in ParserTestCase. + +.. code:: s-lang + + % abc.sl + autoload("abc_mode", "abc"); +""", +"""\ + + + Code not parsed but warning silenced in ParserTestCase. + + % abc.sl + autoload("abc_mode", "abc"); +"""], +["""\ +Place the language name in a class argument to avoid the no-lexer warning: + +.. code:: + :class: s-lang + + % abc.sl + autoload("abc_mode", "abc"); +""", +"""\ + + + Place the language name in a class argument to avoid the no-lexer warning: + + % abc.sl + autoload("abc_mode", "abc"); +"""], +] + +totest['code-parsing-2-14'] = [ +["""\ +.. code:: python3 + :class: testclass + + print('hello world') # to stdout +""", +"""\ + + + \n\ + + print + + ( + + 'hello world' + + ) + \n\ + + # to stdout +"""], +["""\ +.. code:: python3 + :class: testclass + :name: my_function + :number-lines: 7 + + def my_function(): + '''Test the lexer. + ''' + + # and now for something completely different + print(8/2) +""", +"""\ + + + + 7 \n\ + + def + \n\ + + my_function + + (): + + \n\ + + 8 \n\ + + \n\ + + \'\'\'Test the lexer. + + 9 \n\ + + \'\'\' + + \n\ + + 10 \n\ + + \n\ + + 11 \n\ + + \n\ + + # and now for something completely different + + \n\ + + 12 \n\ + + \n\ + + print ( --- a/test/test_parsers/test_rst/test_directives/test_code_long.py +++ b/test/test_parsers/test_rst/test_directives/test_code_long.py @@ -10,15 +10,22 @@ Test the 'code' directive in body.py wit if __name__ == '__main__': import __init__ # noqa: F401 +from packaging.version import Version from test_parsers import DocutilsTestSupport -from docutils.utils.code_analyzer import with_pygments +from docutils.utils.code_analyzer import with_pygments, pygments_version def suite(): settings = {'syntax_highlight': 'long'} s = DocutilsTestSupport.ParserTestSuite(suite_settings=settings) if with_pygments: + if pygments_version >= Version('2.14.0'): + del(totest['code-parsing-long']) + else: + del(totest['code-parsing-long-2-14']) + s.generateTests(totest) + return s @@ -73,6 +80,94 @@ totest['code-parsing-long'] = [ \n\ print + + ( + + 8 + + / + + 2 + + ) +"""], +["""\ +.. code:: latex + + hello \\emph{world} % emphasize +""", +"""\ + + + hello \n\ + + \\emph + + { + world + + } + \n\ + + % emphasize"""], +] + +totest['code-parsing-long-2-14'] = [ +["""\ +.. code:: python3 + :number-lines: 7 + + def my_function(): + '''Test the lexer. + ''' + + # and now for something completely different + print(8/2) +""", +"""\ + + + + 7 \n\ + + def + \n\ + + my_function + + (): + + \n\ + + 8 \n\ + + \n\ + + \'\'\'Test the lexer. + + 9 \n\ + + \'\'\' + + \n\ + + 10 \n\ + + \n\ + + 11 \n\ + + \n\ + + # and now for something completely different + + \n\ + + 12 \n\ + + \n\ + + print ( --- a/test/test_parsers/test_rst/test_directives/test_include.py +++ b/test/test_parsers/test_rst/test_directives/test_include.py @@ -10,9 +10,10 @@ Tests for misc.py "include" directive. import os.path if __name__ == '__main__': import __init__ # noqa: F401 +from packaging.version import Version from test_parsers import DocutilsTestSupport from docutils import parsers -from docutils.utils.code_analyzer import with_pygments +from docutils.utils.code_analyzer import with_pygments, pygments_version # optional 3rd-party markdown parser md_parser_name = 'recommonmark' @@ -27,6 +28,11 @@ def suite(): # eventually skip optional parts: if not with_pygments: del(totest['include-code']) + del(totest['include-code-2-14']) + elif pygments_version >= Version('2.14.0'): + del(totest['include-code']) + else: + del(totest['include-code-2-14']) if not md_parser_class: del(totest['include-markdown']) s.generateTests(totest) @@ -1191,6 +1197,313 @@ Including includes/include14.txt .. \n\ + + include + + :: + ../sibling/include7.txt +""" % reldir(include6)], +["""\ +Circular inclusion + +.. include:: %s +""" % include15, +"""\ + + + Circular inclusion + + File "include15.txt": example of rekursive inclusion. + + File "include16.txt": example of rekursive inclusion. + + + circular inclusion in "include" directive: + %s + > %s + > %s + > test data + + .. include:: include15.txt + + No loop when clipping before the "include" directive: + + File "include15.txt": example of rekursive inclusion. +""" % (reldir(include16), reldir(include15), + reldir(include16), reldir(include15))], +["""\ +Circular inclusion with clipping. + +.. include:: %s + :start-line: 2 +""" % include16, +"""\ + + + Circular inclusion with clipping. + + File "include15.txt": example of rekursive inclusion. + + File "include16.txt": example of rekursive inclusion. + + + circular inclusion in "include" directive: + %s + > %s + > %s + > %s + > test data + + .. include:: include15.txt + + No loop when clipping before the "include" directive: + + File "include15.txt": example of rekursive inclusion. + + No loop when clipping before the "include" directive: + + File "include15.txt": example of rekursive inclusion. +""" % (reldir(include16), reldir(include15), reldir(include16), + reldir(include15), reldir(include16))], +["""\ +Circular inclusion with specified parser. + +.. include:: %s + :parser: rst +""" % include15, +"""\ + + + Circular inclusion with specified parser. + + File "include15.txt": example of rekursive inclusion. + + File "include16.txt": example of rekursive inclusion. + + + circular inclusion in "include" directive: + %s + > %s + > %s + > test data + + .. include:: include15.txt + + No loop when clipping before the "include" directive: + + File "include15.txt": example of rekursive inclusion. +""" % (reldir(include16), reldir(include15), + reldir(include16), reldir(include15))], +["""\ +No circular inclusion. + +============================= ============================= +.. include:: data/include.txt .. include:: data/include.txt +============================= ============================= +""", +"""\ + + + No circular inclusion. + + + + + + + + + Some include text. + + + Some include text."""], +] + +totest['include-code-2-14'] = [ +["""\ +Included code + +.. include:: %s + :code: rst +""" % include1, +"""\ + + + Included code + + + Inclusion 1 + \n\ + + ----------- + \n\ + + \n\ + This file is used by \n\ + + ``test_include.py`` + . +""" % reldir(include1)], +["""\ +Included code + +.. include:: %s + :code: rst + :number-lines: +""" % include1, +"""\ + + + Included code + + + 1 \n\ + + Inclusion 1 + \n\ + + 2 \n\ + + ----------- + \n\ + + 3 \n\ + + \n\ + + 4 \n\ + + This file is used by \n\ + + ``test_include.py`` + . +""" % reldir(include1)], +["""\ +TAB expansion with included code: + +.. include:: %s + :code: rst +""" % include_literal, +"""\ + + + TAB expansion with included code: + + Literal included this should \n\ + + **not** + be \n\ + + *marked* + \n\ + + `up` + . + + \n\ + <- leading raw tab. + + \n\ + \n\ + Newlines + + \n\ + are + + \n\ + normalized. +""" % include_literal], +["""\ +Custom TAB expansion with included code: + +.. include:: %s + :code: rst + :tab-width: 2 +""" % include_literal, +"""\ + + + Custom TAB expansion with included code: + + Literal included this should \n\ + + **not** + be \n\ + + *marked* + \n\ + + `up` + . + + \n\ + <- leading raw tab. + + \n\ + \n\ + Newlines + + \n\ + are + + \n\ + normalized. +""" % include_literal], +["""\ +Custom TAB expansion with included code: + +.. include:: %s + :code: rst + :tab-width: -1 +""" % include_literal, +"""\ + + + Custom TAB expansion with included code: + + Literal included this should \n\ + + **not** + be \n\ + + *marked* + \n\ + + `up` + . + + \n\ + \t<- leading raw tab. + + \n\ + \n\ + Newlines + + \n\ + are + + \n\ + normalized. +""" % include_literal], +["""\ +Including includes/include14.txt + +.. include:: %s +""" % include14, +"""\ + + + Including includes/include14.txt + + Including more/include6.txt as rst-code from includes/include14.txt: + + In includes/more/include6.txt + + \n\ + \n\ + + .. + \n\ include --- a/docutils/utils/code_analyzer.py +++ b/docutils/utils/code_analyzer.py @@ -9,11 +9,14 @@ from docutils import ApplicationError try: import pygments + from packaging.version import Version from pygments.lexers import get_lexer_by_name from pygments.formatters.html import _get_ttype_class with_pygments = True + pygments_version = Version(pygments.__version__) except ImportError: with_pygments = False + pygments_version = '0' # Filter the following token types from the list of class arguments: unstyled_tokens = ['token', # Token (base token type)