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 = [
'',
'',
@@ -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):