mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
181 lines
5.3 KiB
Python
181 lines
5.3 KiB
Python
"""
|
|
test_build_gettext
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
Test the build process with gettext builder with the test root.
|
|
|
|
:copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
|
|
:license: BSD, see LICENSE for details.
|
|
"""
|
|
|
|
import gettext
|
|
import os
|
|
import re
|
|
from subprocess import Popen, PIPE
|
|
|
|
import pytest
|
|
|
|
from sphinx.util.osutil import cd
|
|
|
|
|
|
@pytest.mark.sphinx('gettext', srcdir='root-gettext')
|
|
def test_build_gettext(app):
|
|
# Generic build; should fail only when the builder is horribly broken.
|
|
app.builder.build_all()
|
|
|
|
# Do messages end up in the correct location?
|
|
# top-level documents end up in a message catalog
|
|
assert (app.outdir / 'extapi.pot').isfile()
|
|
# directory items are grouped into sections
|
|
assert (app.outdir / 'subdir.pot').isfile()
|
|
|
|
# regression test for issue #960
|
|
catalog = (app.outdir / 'markup.pot').text()
|
|
assert 'msgid "something, something else, something more"' in catalog
|
|
|
|
|
|
@pytest.mark.sphinx('gettext', srcdir='root-gettext')
|
|
def test_msgfmt(app):
|
|
app.builder.build_all()
|
|
(app.outdir / 'en' / 'LC_MESSAGES').makedirs()
|
|
with cd(app.outdir):
|
|
try:
|
|
p = Popen(['msginit', '--no-translator', '-i', 'markup.pot',
|
|
'--locale', 'en_US'],
|
|
stdout=PIPE, stderr=PIPE)
|
|
except OSError:
|
|
pytest.skip() # most likely msginit was not found
|
|
else:
|
|
stdout, stderr = p.communicate()
|
|
if p.returncode != 0:
|
|
print(stdout)
|
|
print(stderr)
|
|
assert False, 'msginit exited with return code %s' % \
|
|
p.returncode
|
|
assert (app.outdir / 'en_US.po').isfile(), 'msginit failed'
|
|
try:
|
|
p = Popen(['msgfmt', 'en_US.po', '-o',
|
|
os.path.join('en', 'LC_MESSAGES', 'test_root.mo')],
|
|
stdout=PIPE, stderr=PIPE)
|
|
except OSError:
|
|
pytest.skip() # most likely msgfmt was not found
|
|
else:
|
|
stdout, stderr = p.communicate()
|
|
if p.returncode != 0:
|
|
print(stdout)
|
|
print(stderr)
|
|
assert False, 'msgfmt exited with return code %s' % \
|
|
p.returncode
|
|
mo = app.outdir / 'en' / 'LC_MESSAGES' / 'test_root.mo'
|
|
assert mo.isfile(), 'msgfmt failed'
|
|
|
|
_ = gettext.translation('test_root', app.outdir, languages=['en']).gettext
|
|
assert _("Testing various markup") == "Testing various markup"
|
|
|
|
|
|
@pytest.mark.sphinx(
|
|
'gettext', testroot='intl', srcdir='gettext',
|
|
confoverrides={'gettext_compact': False})
|
|
def test_gettext_index_entries(app):
|
|
# regression test for #976
|
|
app.builder.build(['index_entries'])
|
|
|
|
_msgid_getter = re.compile(r'msgid "(.*)"').search
|
|
|
|
def msgid_getter(msgid):
|
|
m = _msgid_getter(msgid)
|
|
if m:
|
|
return m.groups()[0]
|
|
return None
|
|
|
|
pot = (app.outdir / 'index_entries.pot').text()
|
|
msgids = [_f for _f in map(msgid_getter, pot.splitlines()) if _f]
|
|
|
|
expected_msgids = [
|
|
"i18n with index entries",
|
|
"index target section",
|
|
"this is :index:`Newsletter` target paragraph.",
|
|
"various index entries",
|
|
"That's all.",
|
|
"Mailing List",
|
|
"Newsletter",
|
|
"Recipients List",
|
|
"First",
|
|
"Second",
|
|
"Third",
|
|
"Entry",
|
|
"See",
|
|
"Module",
|
|
"Keyword",
|
|
"Operator",
|
|
"Object",
|
|
"Exception",
|
|
"Statement",
|
|
"Builtin",
|
|
]
|
|
for expect in expected_msgids:
|
|
assert expect in msgids
|
|
msgids.remove(expect)
|
|
|
|
# unexpected msgid existent
|
|
assert msgids == []
|
|
|
|
|
|
@pytest.mark.sphinx(
|
|
'gettext', testroot='intl', srcdir='gettext',
|
|
confoverrides={'gettext_compact': False,
|
|
'gettext_additional_targets': []})
|
|
def test_gettext_disable_index_entries(app):
|
|
# regression test for #976
|
|
app.builder.build(['index_entries'])
|
|
|
|
_msgid_getter = re.compile(r'msgid "(.*)"').search
|
|
|
|
def msgid_getter(msgid):
|
|
m = _msgid_getter(msgid)
|
|
if m:
|
|
return m.groups()[0]
|
|
return None
|
|
|
|
pot = (app.outdir / 'index_entries.pot').text()
|
|
msgids = [_f for _f in map(msgid_getter, pot.splitlines()) if _f]
|
|
|
|
expected_msgids = [
|
|
"i18n with index entries",
|
|
"index target section",
|
|
"this is :index:`Newsletter` target paragraph.",
|
|
"various index entries",
|
|
"That's all.",
|
|
]
|
|
for expect in expected_msgids:
|
|
assert expect in msgids
|
|
msgids.remove(expect)
|
|
|
|
# unexpected msgid existent
|
|
assert msgids == []
|
|
|
|
|
|
@pytest.mark.sphinx('gettext', testroot='intl', srcdir='gettext')
|
|
def test_gettext_template(app):
|
|
app.builder.build_all()
|
|
assert (app.outdir / 'sphinx.pot').isfile()
|
|
|
|
result = (app.outdir / 'sphinx.pot').text()
|
|
assert "Welcome" in result
|
|
assert "Sphinx %(version)s" in result
|
|
|
|
|
|
@pytest.mark.sphinx('gettext', testroot='gettext-template')
|
|
def test_gettext_template_msgid_order_in_sphinxpot(app):
|
|
app.builder.build_all()
|
|
assert (app.outdir / 'sphinx.pot').isfile()
|
|
|
|
result = (app.outdir / 'sphinx.pot').text()
|
|
assert re.search(
|
|
('msgid "Template 1".*'
|
|
'msgid "This is Template 1\\.".*'
|
|
'msgid "Template 2".*'
|
|
'msgid "This is Template 2\\.".*'),
|
|
result,
|
|
flags=re.S)
|