# HG changeset patch # User cmlenz # Date 1181935595 0 # Node ID e1dffa3423a04569d24dfe97f9f160d63ca219dd # Parent 1984cdac1ddb72d2dafd6c8230a0faedba4221a0 Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts. diff --git a/babel/messages/frontend.py b/babel/messages/frontend.py --- a/babel/messages/frontend.py +++ b/babel/messages/frontend.py @@ -101,7 +101,8 @@ def initialize_options(self): self.charset = 'utf-8' - self.keywords = self._keywords = DEFAULT_KEYWORDS.copy() + self.keywords = '' + self._keywords = DEFAULT_KEYWORDS.copy() self.no_default_keywords = False self.mapping_file = None self.no_location = False @@ -123,10 +124,11 @@ 'disable the default ones') if self.no_default_keywords: self._keywords = {} - if isinstance(self.keywords, basestring): + if self.keywords: self._keywords.update(parse_keywords(self.keywords.split())) - self.keywords = self._keywords + if not self.output_file: + raise DistutilsOptionError('no output file specified') if self.no_wrap and self.width: raise DistutilsOptionError("'--no-wrap' and '--width' are mutually " "exclusive") @@ -170,7 +172,7 @@ % (filepath, optstr)) extracted = extract_from_dir(dirname, method_map, options_map, - keywords=self.keywords, + keywords=self._keywords, comment_tags=self._add_comments, callback=callback) for filename, lineno, message, comments in extracted: diff --git a/babel/messages/tests/data/mapping.cfg b/babel/messages/tests/data/mapping.cfg --- a/babel/messages/tests/data/mapping.cfg +++ b/babel/messages/tests/data/mapping.cfg @@ -3,7 +3,3 @@ # Extraction from Python source files [python: **.py] - -# Ignore extraction from HTML and XHTML templates -[ignore: **/templates/**.html] -[ignore: **/templates/**.xhtml] diff --git a/babel/messages/tests/data/project/templates/index.html b/babel/messages/tests/data/project/templates/index.html deleted file mode 100644 --- a/babel/messages/tests/data/project/templates/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - Just a Tests Test - - - - - - diff --git a/babel/messages/tests/data/project/templates/index.xhtml b/babel/messages/tests/data/project/templates/index.xhtml deleted file mode 100644 --- a/babel/messages/tests/data/project/templates/index.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Just a Tests Test - - - - - - diff --git a/babel/messages/tests/data/project/templates/layout.html b/babel/messages/tests/data/project/templates/layout.html deleted file mode 100644 --- a/babel/messages/tests/data/project/templates/layout.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - Just a Tests Test - - - - - - diff --git a/babel/messages/tests/data/project/templates/layout.xhtml b/babel/messages/tests/data/project/templates/layout.xhtml deleted file mode 100644 --- a/babel/messages/tests/data/project/templates/layout.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Just a Tests Test - - - - - - diff --git a/babel/messages/tests/data/setup.cfg b/babel/messages/tests/data/setup.cfg --- a/babel/messages/tests/data/setup.cfg +++ b/babel/messages/tests/data/setup.cfg @@ -3,4 +3,3 @@ copyright_holder = FooBar, TM add_comments = TRANSLATOR:,TRANSLATORS: output_file = project/i18n/project.pot - diff --git a/babel/messages/tests/frontend.py b/babel/messages/tests/frontend.py --- a/babel/messages/tests/frontend.py +++ b/babel/messages/tests/frontend.py @@ -11,33 +11,67 @@ # individuals. For the exact contribution history, see the revision # history and logs, available at http://babel.edgewall.org/log/. +from distutils.dist import Distribution +from distutils.errors import DistutilsOptionError, DistutilsSetupError +from distutils.log import _global_log import doctest +import os +import time import unittest -import os -import subprocess -from babel.messages import frontend from babel import __version__ as VERSION -import time +from babel.messages import frontend -class TestDistutilsSetuptoolsFrontend(unittest.TestCase): - + +class ExtractMessagesTestCase(unittest.TestCase): + def setUp(self): self.olddir = os.getcwd() self.datadir = os.path.join(os.path.dirname(__file__), 'data') os.chdir(self.datadir) - # Do we need to run egg_info? - if not os.path.exists(os.path.join(self.datadir, - 'TestProject.egg-info')): - subprocess.call(['./setup.py', 'egg_info']) - - def test_extracted_pot_no_mapping(self): - subprocess.call([os.path.join(self.datadir, 'setup.py'), - 'extract_messages']) + _global_log.threshold = 5 # shut up distutils logging + + self.dist = Distribution(dict( + name='TestProject', + version='0.1', + packages=['project'] + )) + self.cmd = frontend.extract_messages(self.dist) + self.cmd.initialize_options() + + def tearDown(self): + pot_file = os.path.join(self.datadir, 'project', 'i18n', 'messages.pot') + if os.path.isfile(pot_file): + os.unlink(pot_file) + + os.chdir(self.olddir) + + def test_neither_default_nor_custom_keywords(self): + self.cmd.output_file = 'foobar' + self.cmd.no_default_keywords = True + self.assertRaises(DistutilsOptionError, self.cmd.finalize_options) + + def test_no_output_file_specified(self): + self.assertRaises(DistutilsOptionError, self.cmd.finalize_options) + + def test_both_sort_output_and_sort_by_file(self): + self.cmd.output_file = 'foobar' + self.cmd.sort_output = True + self.cmd.sort_by_file = True + self.assertRaises(DistutilsOptionError, self.cmd.finalize_options) + + def test_extraction_with_default_mapping(self): + self.cmd.copyright_holder = 'FooBar, Inc.' + self.cmd.msgid_bugs_address = 'bugs.address@email.tld' + self.cmd.output_file = 'project/i18n/messages.pot' + self.cmd.add_comments = 'TRANSLATOR:,TRANSLATORS:' + + self.cmd.finalize_options() + self.cmd.run() self.assertEqual(open(os.path.join(self.datadir, 'project', 'i18n', - 'project.pot'), 'r').read(), \ + 'messages.pot'), 'U').read(), r"""# Translations template for TestProject. -# Copyright (C) %(year)s FooBar, TM +# Copyright (C) %(year)s FooBar, Inc. # This file is distributed under the same license as the TestProject # project. # FIRST AUTHOR , %(year)s. @@ -77,15 +111,20 @@ """ % {'version': VERSION, 'year': time.strftime('%Y'), 'date': time.strftime('%Y-%m-%d %H:%M%z')}) - - def test_extracted_pot_with_mapping(self): - subprocess.call([os.path.join(self.datadir, 'setup.py'), - 'extract_messages', '-F', - os.path.join(self.datadir, 'mapping.cfg')]) + + def test_extraction_with_mapping_file(self): + self.cmd.copyright_holder = 'FooBar, Inc.' + self.cmd.msgid_bugs_address = 'bugs.address@email.tld' + self.cmd.mapping_file = 'mapping.cfg' + self.cmd.output_file = 'project/i18n/messages.pot' + self.cmd.add_comments = 'TRANSLATOR:,TRANSLATORS:' + + self.cmd.finalize_options() + self.cmd.run() self.assertEqual(open(os.path.join(self.datadir, 'project', 'i18n', - 'project.pot'), 'r').read(), + 'messages.pot'), 'r').read(), r"""# Translations template for TestProject. -# Copyright (C) %(year)s FooBar, TM +# Copyright (C) %(year)s FooBar, Inc. # This file is distributed under the same license as the TestProject # project. # FIRST AUTHOR , %(year)s. @@ -118,16 +157,65 @@ """ % {'version': VERSION, 'year': time.strftime('%Y'), - 'date': time.strftime('%Y-%m-%d %H:%M%z')}) - - def tearDown(self): - os.chdir(self.olddir) + 'date': time.strftime('%Y-%m-%d %H:%M%z')}) + + def test_extraction_with_mapping_dict(self): + self.dist.message_extractors = { + 'project': [ + ('**/CVS/**.*', 'ignore', None), + ('**.py', 'python', None), + ] + } + self.cmd.copyright_holder = 'FooBar, Inc.' + self.cmd.msgid_bugs_address = 'bugs.address@email.tld' + self.cmd.output_file = 'project/i18n/messages.pot' + self.cmd.add_comments = 'TRANSLATOR:,TRANSLATORS:' + + self.cmd.finalize_options() + self.cmd.run() + self.assertEqual(open(os.path.join(self.datadir, 'project', 'i18n', + 'messages.pot'), 'r').read(), +r"""# Translations template for TestProject. +# Copyright (C) %(year)s FooBar, Inc. +# This file is distributed under the same license as the TestProject +# project. +# FIRST AUTHOR , %(year)s. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: TestProject 0.1\n" +"Report-Msgid-Bugs-To: bugs.address@email.tld\n" +"POT-Creation-Date: %(date)s\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel %(version)s\n" + +#. This will be a translator coment, +#. that will include several lines +#: project/file1.py:8 +msgid "bar" +msgstr "" + +#: project/file2.py:9 +msgid "foobar" +msgid_plural "foobars" +msgstr[0] "" +msgstr[1] "" + +""" % {'version': VERSION, + 'year': time.strftime('%Y'), + 'date': time.strftime('%Y-%m-%d %H:%M%z')}) def suite(): suite = unittest.TestSuite() suite.addTest(doctest.DocTestSuite(frontend)) - suite.addTest(unittest.makeSuite(TestDistutilsSetuptoolsFrontend)) + suite.addTest(unittest.makeSuite(ExtractMessagesTestCase)) return suite if __name__ == '__main__': diff --git a/doc/setup.txt b/doc/setup.txt --- a/doc/setup.txt +++ b/doc/setup.txt @@ -74,9 +74,9 @@ message_extractors = { 'foobar': [ - ('**.py', ('python', None), - ('**/templates/**.html', ('genshi', None), - ('**/templates/**.txt', ('genshi', { + ('**.py', 'python', None), + ('**/templates/**.html', 'genshi', None), + ('**/templates/**.txt', 'genshi', { 'template_class': 'genshi.template.text.TextTemplate' }) ],