4 # Authors: Engelbert Gruber <grubert@users.sourceforge.net>;
5 # David Goodger <goodger@python.org>
6 # Copyright: This module has been placed in the public domain.
9 Tests for language module completeness.
11 Specify a language code (e.g. "de") as a command-line parameter to test only
15 from pathlib
import Path
21 if __name__
== '__main__':
22 # prepend the "docutils root" to the Python library path
23 # so we import the local `docutils` package.
24 sys
.path
.insert(0, str(Path(__file__
).resolve().parents
[1]))
27 from docutils
import frontend
, languages
, utils
28 from docutils
.parsers
.rst
import languages
as rst_languages
29 from docutils
.parsers
.rst
.directives
import _directive_registry
# NoQA
30 from docutils
.parsers
.rst
.roles
import _role_registry
# NoQA
32 LANGUAGE_MODULE_PATTERN
= re
.compile(r
'^([a-z]{2,3}(_[a-z]{2,8})*)\.py$')
33 REPORTER
= utils
.new_reporter('', frontend
.get_default_settings())
34 REF
= languages
.get_language('en', REPORTER
)
39 Get installed language translations from docutils.languages and from
40 docutils.parsers.rst.languages.
43 for mod
in (os
.listdir(languages
.__path
__[0])
44 + os
.listdir(rst_languages
.__path
__[0])):
45 match
= LANGUAGE_MODULE_PATTERN
.match(mod
)
47 translations
.add(match
.group(1))
48 language_list
= list(translations
)
49 # test language tag normalization:
50 language_list
+= ['en_gb', 'en_US', 'en-CA', 'de-DE', 'de-AT-1901',
52 # test that locally created language files are also loaded.
53 # requires local_dummy_lang.py in test directory (testroot)
54 # The local_dummy_lang.py contains all the fields from both
55 # the docutils language tags and the parser.rst language tags
56 language_list
+= ['test.local_dummy_lang']
60 class LanguageTestCase(unittest
.TestCase
):
63 def test_labels(self
):
64 ref_labels
= {*REF
.labels
}
65 for language
in get_languages():
66 with self
.subTest(id=f
'{language}.py'):
68 module
= languages
.get_language(language
, REPORTER
)
70 mod
= f
'docutils.languages.{language}'
71 raise AssertionError(f
'No {mod} module.')
72 self
.assertIsNotNone(module
)
73 self
.assertSetEqual({*module
.labels
}, ref_labels
)
75 def test_bibliographic_fields(self
):
76 ref_fields
= {*REF
.bibliographic_fields
.values()}
77 for language
in get_languages():
78 with self
.subTest(id=f
'{language}.py'):
80 module
= languages
.get_language(language
, REPORTER
)
82 mod
= f
'docutils.languages.{language}'
83 raise AssertionError(f
'No {mod} module.')
84 self
.assertIsNotNone(module
)
85 mod_fields
= {*module
.bibliographic_fields
.values()}
86 self
.assertSetEqual(mod_fields
, ref_fields
)
88 def test_directives(self
):
89 for language
in get_languages():
90 with self
.subTest(id=f
'{language}.py'):
92 module
= rst_languages
.get_language(language
)
94 mod
= f
'docutils.parsers.rst.languages.{language}'
95 raise AssertionError(f
'No {mod} module.')
96 self
.assertIsNotNone(module
)
97 for d
in module
.directives
.values():
98 self
.assertIn(d
, _directive_registry
)
99 for name
in _directive_registry
:
100 if name
!= 'restructuredtext-test-directive':
101 self
.assertIn(name
, set(module
.directives
.values()))
103 def test_roles(self
):
104 for language
in get_languages():
105 with self
.subTest(id=f
'{language}.py'):
107 module
= rst_languages
.get_language(language
)
109 mod
= f
'docutils.parsers.rst.languages.{language}'
110 raise AssertionError(f
'No {mod} module.')
111 self
.assertIsNotNone(module
)
112 for d
in module
.roles
.values():
113 self
.assertIn(d
, _role_registry
)
114 for name
in _role_registry
:
115 if name
!= 'restructuredtext-unimplemented-role':
116 self
.assertIn(name
, set(module
.roles
.values()))
119 if __name__
== '__main__':