diff --git a/tests/root/contents.txt b/tests/root/contents.txt index 0fbd68236..de60ec6dd 100644 --- a/tests/root/contents.txt +++ b/tests/root/contents.txt @@ -28,7 +28,6 @@ Contents: extensions versioning/index footnote - i18n/index Python diff --git a/tests/roots/test-intl/bom.po b/tests/roots/test-intl/bom.po new file mode 100644 index 000000000..c6025eb1e --- /dev/null +++ b/tests/roots/test-intl/bom.po @@ -0,0 +1,12 @@ +#, fuzzy +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +msgid "File with UTF-8 BOM" +msgstr "Datei mit UTF-8" + +msgid "This file has a UTF-8 \"BOM\"." +msgstr "This file has umlauts: äöü." diff --git a/tests/roots/test-intl/bom.txt b/tests/roots/test-intl/bom.txt new file mode 100644 index 000000000..3fea824f8 --- /dev/null +++ b/tests/roots/test-intl/bom.txt @@ -0,0 +1,5 @@ +File with UTF-8 BOM +=================== + +This file has a UTF-8 "BOM". + diff --git a/tests/roots/test-intl/conf.py b/tests/roots/test-intl/conf.py new file mode 100644 index 000000000..457c5056f --- /dev/null +++ b/tests/roots/test-intl/conf.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +import sys, os + +project = 'Sphinx intl ' +source_suffix = '.txt' +keep_warnings = True diff --git a/tests/root/i18n/index.txt b/tests/roots/test-intl/contents.txt similarity index 86% rename from tests/root/i18n/index.txt rename to tests/roots/test-intl/contents.txt index dfacc0193..45db24cc9 100644 --- a/tests/root/i18n/index.txt +++ b/tests/roots/test-intl/contents.txt @@ -2,6 +2,8 @@ :maxdepth: 2 :numbered: + subdir/contents + bom footnote external_links refs_inconsistency diff --git a/tests/root/i18n/definition_terms.po b/tests/roots/test-intl/definition_terms.po similarity index 100% rename from tests/root/i18n/definition_terms.po rename to tests/roots/test-intl/definition_terms.po diff --git a/tests/root/i18n/definition_terms.txt b/tests/roots/test-intl/definition_terms.txt similarity index 100% rename from tests/root/i18n/definition_terms.txt rename to tests/roots/test-intl/definition_terms.txt diff --git a/tests/root/i18n/external_links.po b/tests/roots/test-intl/external_links.po similarity index 100% rename from tests/root/i18n/external_links.po rename to tests/roots/test-intl/external_links.po diff --git a/tests/root/i18n/external_links.txt b/tests/roots/test-intl/external_links.txt similarity index 100% rename from tests/root/i18n/external_links.txt rename to tests/roots/test-intl/external_links.txt diff --git a/tests/root/i18n/figure_caption.po b/tests/roots/test-intl/figure_caption.po similarity index 100% rename from tests/root/i18n/figure_caption.po rename to tests/roots/test-intl/figure_caption.po diff --git a/tests/root/i18n/figure_caption.txt b/tests/roots/test-intl/figure_caption.txt similarity index 100% rename from tests/root/i18n/figure_caption.txt rename to tests/roots/test-intl/figure_caption.txt diff --git a/tests/root/i18n/footnote.po b/tests/roots/test-intl/footnote.po similarity index 100% rename from tests/root/i18n/footnote.po rename to tests/roots/test-intl/footnote.po diff --git a/tests/root/i18n/footnote.txt b/tests/roots/test-intl/footnote.txt similarity index 100% rename from tests/root/i18n/footnote.txt rename to tests/roots/test-intl/footnote.txt diff --git a/tests/root/i18n/i18n.png b/tests/roots/test-intl/i18n.png similarity index 100% rename from tests/root/i18n/i18n.png rename to tests/roots/test-intl/i18n.png diff --git a/tests/root/i18n/index_entries.po b/tests/roots/test-intl/index_entries.po similarity index 100% rename from tests/root/i18n/index_entries.po rename to tests/roots/test-intl/index_entries.po diff --git a/tests/root/i18n/index_entries.txt b/tests/roots/test-intl/index_entries.txt similarity index 100% rename from tests/root/i18n/index_entries.txt rename to tests/roots/test-intl/index_entries.txt diff --git a/tests/root/i18n/literalblock.po b/tests/roots/test-intl/literalblock.po similarity index 100% rename from tests/root/i18n/literalblock.po rename to tests/roots/test-intl/literalblock.po diff --git a/tests/root/i18n/literalblock.txt b/tests/roots/test-intl/literalblock.txt similarity index 100% rename from tests/root/i18n/literalblock.txt rename to tests/roots/test-intl/literalblock.txt diff --git a/tests/root/i18n/refs_inconsistency.po b/tests/roots/test-intl/refs_inconsistency.po similarity index 100% rename from tests/root/i18n/refs_inconsistency.po rename to tests/roots/test-intl/refs_inconsistency.po diff --git a/tests/root/i18n/refs_inconsistency.txt b/tests/roots/test-intl/refs_inconsistency.txt similarity index 100% rename from tests/root/i18n/refs_inconsistency.txt rename to tests/roots/test-intl/refs_inconsistency.txt diff --git a/tests/roots/test-intl/subdir/contents.txt b/tests/roots/test-intl/subdir/contents.txt new file mode 100644 index 000000000..b6509bafb --- /dev/null +++ b/tests/roots/test-intl/subdir/contents.txt @@ -0,0 +1,2 @@ +subdir contents +=============== diff --git a/tests/test_build_gettext.py b/tests/test_build_gettext.py index dcbff4849..d98cde86c 100644 --- a/tests/test_build_gettext.py +++ b/tests/test_build_gettext.py @@ -20,6 +20,7 @@ from util import SkipTest def teardown_module(): (test_root / '_build').rmtree(True) + (test_roots / 'test-intl' / '_build').rmtree(True), @with_app(buildername='gettext') @@ -83,10 +84,12 @@ def test_gettext(app): @with_app(buildername='gettext', + srcdir=(test_roots / 'test-intl'), + doctreedir=(test_roots / 'test-intl' / '_build' / 'doctree'), confoverrides={'gettext_compact': False}) def test_gettext_index_entries(app): # regression test for #976 - app.builder.build(['i18n/index_entries']) + app.builder.build(['index_entries']) _msgid_getter = re.compile(r'msgid "(.*)"').search def msgid_getter(msgid): @@ -95,7 +98,7 @@ def test_gettext_index_entries(app): return m.groups()[0] return None - pot = (app.outdir / 'i18n' / 'index_entries.pot').text(encoding='utf-8') + pot = (app.outdir / 'index_entries.pot').text(encoding='utf-8') msgids = filter(None, map(msgid_getter, pot.splitlines())) expected_msgids = [ diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 182009b98..abd60bbb5 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -35,7 +35,6 @@ ENV_WARNINGS = """\ %(root)s/autodoc_fodder.py:docstring of autodoc_fodder\\.MarkupError:2: \ WARNING: Explicit markup ends without a blank line; unexpected \ unindent\\.\\n? -%(root)s/i18n/literalblock.txt:13: WARNING: Literal block expected; none found. %(root)s/images.txt:9: WARNING: image file not readable: foo.png %(root)s/images.txt:23: WARNING: nonlocal image URI found: \ http://www.python.org/logo.png diff --git a/tests/test_intl.py b/tests/test_intl.py index 932142999..d828a8517 100644 --- a/tests/test_intl.py +++ b/tests/test_intl.py @@ -22,19 +22,34 @@ from util import SkipTest warnfile = StringIO() +root = test_roots / 'test-intl' +doctreedir = root / '_build' / 'doctree' + + +def with_intl_app(*args, **kw): + default_kw = { + 'srcdir': root, + 'doctreedir': doctreedir, + 'confoverrides': { + 'language': 'xx', 'locale_dirs': ['.'], + 'gettext_compact': False, + }, + } + default_kw.update(kw) + return with_app(*args, **default_kw) def setup_module(): # Delete remnants left over after failed build - (test_root / 'xx').rmtree(True) - (test_root / 'xx' / 'LC_MESSAGES').makedirs() + (root / 'xx').rmtree(True) + (root / 'xx' / 'LC_MESSAGES').makedirs() # Compile all required catalogs into binary format (*.mo). - for dirpath, dirs, files in os.walk(test_root): + for dirpath, dirs, files in os.walk(root): dirpath = path(dirpath) for f in [f for f in files if f.endswith('.po')]: po = dirpath / f - mo = test_root / 'xx' / 'LC_MESSAGES' / ( - relpath(po[:-3], test_root) + '.mo') + mo = root / 'xx' / 'LC_MESSAGES' / ( + relpath(po[:-3], root) + '.mo') if not mo.parent.exists(): mo.parent.makedirs() try: @@ -52,12 +67,11 @@ def setup_module(): def teardown_module(): - (test_root / '_build').rmtree(True) - (test_root / 'xx').rmtree(True) + (root / '_build').rmtree(True) + (root / 'xx').rmtree(True) -@with_app(buildername='text', - confoverrides={'language': 'xx', 'locale_dirs': ['.']}) +@with_intl_app(buildername='text') def test_simple(app): app.builder.build(['bom']) result = (app.outdir / 'bom.txt').text(encoding='utf-8') @@ -67,31 +81,26 @@ def test_simple(app): assert result == expect -@with_app(buildername='text', - confoverrides={'language': 'xx', 'locale_dirs': ['.']}) +@with_intl_app(buildername='text') def test_subdir(app): - app.builder.build(['subdir/includes']) - result = (app.outdir / 'subdir' / 'includes.txt').text(encoding='utf-8') - assert result.startswith(u"\ntranslation\n***********\n\n") + app.builder.build(['subdir/contents']) + result = (app.outdir / 'subdir' / 'contents.txt').text(encoding='utf-8') + assert result.startswith(u"\nsubdir contents\n***************\n") -@with_app(buildername='html', cleanenv=True, - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='html', cleanenv=True) def test_i18n_footnote_break_refid(app): """test for #955 cant-build-html-with-footnotes-when-using""" - app.builder.build(['i18n/footnote']) - result = (app.outdir / 'i18n' / 'footnote.html').text(encoding='utf-8') + app.builder.build(['footnote']) + result = (app.outdir / 'footnote.html').text(encoding='utf-8') # expect no error by build -@with_app(buildername='text', cleanenv=True, - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='text', cleanenv=True) def test_i18n_footnote_regression(app): """regression test for fix #955""" - app.builder.build(['i18n/footnote']) - result = (app.outdir / 'i18n' / 'footnote.txt').text(encoding='utf-8') + app.builder.build(['footnote']) + result = (app.outdir / 'footnote.txt').text(encoding='utf-8') expect = (u"\nI18N WITH FOOTNOTE" u"\n******************\n" # underline matches new translation u"\nI18N WITH FOOTNOTE INCLUDE THIS CONTENTS [ref] [1] [100]\n" @@ -101,13 +110,11 @@ def test_i18n_footnote_regression(app): assert result == expect -@with_app(buildername='html', cleanenv=True, - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='html', cleanenv=True) def test_i18n_footnote_backlink(app): """i18n test for #1058""" - app.builder.build(['i18n/footnote']) - result = (app.outdir / 'i18n' / 'footnote.html').text(encoding='utf-8') + app.builder.build(['footnote']) + result = (app.outdir / 'footnote.html').text(encoding='utf-8') expects = [ '[100]', '[1]', @@ -121,13 +128,11 @@ def test_i18n_footnote_backlink(app): assert len(matches) == 1 -@with_app(buildername='text', warning=warnfile, cleanenv=True, - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='text', warning=warnfile, cleanenv=True) def test_i18n_warn_for_number_of_references_inconsistency(app): app.builddir.rmtree(True) - app.builder.build(['i18n/refs_inconsistency']) - result = (app.outdir / 'i18n' / 'refs_inconsistency.txt').text(encoding='utf-8') + app.builder.build(['refs_inconsistency']) + result = (app.outdir / 'refs_inconsistency.txt').text(encoding='utf-8') expect = (u"\nI18N WITH REFS INCONSISTENCY" u"\n****************************\n" u"\n* FOR FOOTNOTE [ref2].\n" @@ -139,7 +144,7 @@ def test_i18n_warn_for_number_of_references_inconsistency(app): assert result == expect warnings = warnfile.getvalue().replace(os.sep, '/') - warning_fmt = u'.*/i18n/refs_inconsistency.txt:\\d+: ' \ + warning_fmt = u'.*/refs_inconsistency.txt:\\d+: ' \ u'WARNING: inconsistent %s in translated message\n' expected_warning_expr = ( warning_fmt % 'footnote references' + @@ -148,12 +153,10 @@ def test_i18n_warn_for_number_of_references_inconsistency(app): assert re.search(expected_warning_expr, warnings) -@with_app(buildername='html', cleanenv=True, - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='html', cleanenv=True) def test_i18n_link_to_undefined_reference(app): - app.builder.build(['i18n/refs_inconsistency']) - result = (app.outdir / 'i18n' / 'refs_inconsistency.html').text(encoding='utf-8') + app.builder.build(['refs_inconsistency']) + result = (app.outdir / 'refs_inconsistency.html').text(encoding='utf-8') expected_expr = """reference""" assert len(re.findall(expected_expr, result)) == 2 @@ -165,13 +168,11 @@ def test_i18n_link_to_undefined_reference(app): assert len(re.findall(expected_expr, result)) == 1 -@with_app(buildername='html', cleanenv=True, - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='html', cleanenv=True) def test_i18n_keep_external_links(app): """regression test for #1044""" - app.builder.build(['i18n/external_links']) - result = (app.outdir / 'i18n' / 'external_links.html').text(encoding='utf-8') + app.builder.build(['external_links']) + result = (app.outdir / 'external_links.html').text(encoding='utf-8') # external link check expect_line = u"""
  • EXTERNAL LINK TO Python.
  • """ @@ -206,13 +207,11 @@ def test_i18n_keep_external_links(app): assert expect_line == matched_line -@with_app(buildername='text', warning=warnfile, cleanenv=True, - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='text', warning=warnfile, cleanenv=True) def test_i18n_literalblock_warning(app): app.builddir.rmtree(True) #for warnings acceleration - app.builder.build(['i18n/literalblock']) - result = (app.outdir / 'i18n' / 'literalblock.txt').text(encoding='utf-8') + app.builder.build(['literalblock']) + result = (app.outdir / 'literalblock.txt').text(encoding='utf-8') expect = (u"\nI18N WITH LITERAL BLOCK" u"\n***********************\n" u"\nCORRECT LITERAL BLOCK:\n" @@ -223,18 +222,16 @@ def test_i18n_literalblock_warning(app): assert result.startswith(expect) warnings = warnfile.getvalue().replace(os.sep, '/') - expected_warning_expr = u'.*/i18n/literalblock.txt:\\d+: ' \ + expected_warning_expr = u'.*/literalblock.txt:\\d+: ' \ u'WARNING: Literal block expected; none found.' assert re.search(expected_warning_expr, warnings) -@with_app(buildername='text', - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='text') def test_i18n_definition_terms(app): # regression test for #975 - app.builder.build(['i18n/definition_terms']) - result = (app.outdir / 'i18n' / 'definition_terms.txt').text(encoding='utf-8') + app.builder.build(['definition_terms']) + result = (app.outdir / 'definition_terms.txt').text(encoding='utf-8') expect = (u"\nI18N WITH DEFINITION TERMS" u"\n**************************\n" u"\nSOME TERM" @@ -245,13 +242,11 @@ def test_i18n_definition_terms(app): assert result == expect -@with_app(buildername='text', - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='text') def test_i18n_figure_caption(app): # regression test for #940 - app.builder.build(['i18n/figure_caption']) - result = (app.outdir / 'i18n' / 'figure_caption.txt').text(encoding='utf-8') + app.builder.build(['figure_caption']) + result = (app.outdir / 'figure_caption.txt').text(encoding='utf-8') expect = (u"\nI18N WITH FIGURE CAPTION" u"\n************************\n" u"\n [image]MY CAPTION OF THE FIGURE\n" @@ -261,12 +256,10 @@ def test_i18n_figure_caption(app): assert result == expect -@with_app(buildername='html', - confoverrides={'language': 'xx', 'locale_dirs': ['.'], - 'gettext_compact': False}) +@with_intl_app(buildername='html') def test_i18n_index_entries(app): # regression test for #976 - app.builder.build(['i18n/index_entries']) + app.builder.build(['index_entries']) result = (app.outdir / 'genindex.html').text(encoding='utf-8') def wrap(tag, keyword):