From b79daef8676df78fabb70a686374aebeccdd6db0 Mon Sep 17 00:00:00 2001 From: Ramiro Morales Date: Sun, 10 Oct 2010 22:19:01 +0000 Subject: Consolidated i18n commands test with the rest of the i18n tests. git-svn-id: http://code.djangoproject.com/svn/django/trunk@14133 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/regressiontests/i18n/commands/__init__.py | 0 tests/regressiontests/i18n/commands/compilation.py | 35 ++++++++ tests/regressiontests/i18n/commands/extraction.py | 98 ++++++++++++++++++++++ .../i18n/commands/ignore_dir/ignored.html | 2 + tests/regressiontests/i18n/commands/javascript.js | 4 + tests/regressiontests/i18n/commands/locale/dummy | 0 .../commands/locale/es_AR/LC_MESSAGES/django.po | 20 +++++ .../i18n/commands/templates/test.html | 2 + tests/regressiontests/i18n/commands/tests.py | 43 ++++++++++ tests/regressiontests/i18n/tests.py | 2 + tests/regressiontests/makemessages/__init__.py | 0 tests/regressiontests/makemessages/compilation.py | 35 -------- tests/regressiontests/makemessages/extraction.py | 98 ---------------------- .../makemessages/ignore_dir/ignored.html | 2 - tests/regressiontests/makemessages/javascript.js | 4 - tests/regressiontests/makemessages/locale/dummy | 0 .../locale/es_AR/LC_MESSAGES/django.po | 20 ----- tests/regressiontests/makemessages/models.py | 0 .../makemessages/templates/test.html | 2 - tests/regressiontests/makemessages/tests.py | 43 ---------- 20 files changed, 206 insertions(+), 204 deletions(-) create mode 100644 tests/regressiontests/i18n/commands/__init__.py create mode 100644 tests/regressiontests/i18n/commands/compilation.py create mode 100644 tests/regressiontests/i18n/commands/extraction.py create mode 100644 tests/regressiontests/i18n/commands/ignore_dir/ignored.html create mode 100644 tests/regressiontests/i18n/commands/javascript.js create mode 100644 tests/regressiontests/i18n/commands/locale/dummy create mode 100644 tests/regressiontests/i18n/commands/locale/es_AR/LC_MESSAGES/django.po create mode 100644 tests/regressiontests/i18n/commands/templates/test.html create mode 100644 tests/regressiontests/i18n/commands/tests.py delete mode 100644 tests/regressiontests/makemessages/__init__.py delete mode 100644 tests/regressiontests/makemessages/compilation.py delete mode 100644 tests/regressiontests/makemessages/extraction.py delete mode 100644 tests/regressiontests/makemessages/ignore_dir/ignored.html delete mode 100644 tests/regressiontests/makemessages/javascript.js delete mode 100644 tests/regressiontests/makemessages/locale/dummy delete mode 100644 tests/regressiontests/makemessages/locale/es_AR/LC_MESSAGES/django.po delete mode 100644 tests/regressiontests/makemessages/models.py delete mode 100644 tests/regressiontests/makemessages/templates/test.html delete mode 100644 tests/regressiontests/makemessages/tests.py diff --git a/tests/regressiontests/i18n/commands/__init__.py b/tests/regressiontests/i18n/commands/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/i18n/commands/compilation.py b/tests/regressiontests/i18n/commands/compilation.py new file mode 100644 index 0000000000..3ca2d57138 --- /dev/null +++ b/tests/regressiontests/i18n/commands/compilation.py @@ -0,0 +1,35 @@ +import os +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +from django.core.management import CommandError +from django.core.management.commands.compilemessages import compile_messages +from django.test import TestCase + +LOCALE='es_AR' + + +class MessageCompilationTests(TestCase): + + MO_FILE='locale/%s/LC_MESSAGES/django.mo' % LOCALE + + def setUp(self): + self._cwd = os.getcwd() + self.test_dir = os.path.abspath(os.path.dirname(__file__)) + + def tearDown(self): + os.chdir(self._cwd) + + +class PoFileTests(MessageCompilationTests): + + def test_bom_rejection(self): + os.chdir(self.test_dir) + # We don't use the django.core.management intrastructure (call_command() + # et al) because CommandError's cause exit(1) there. We test the + # underlying compile_messages function instead + out = StringIO() + self.assertRaises(CommandError, compile_messages, out, locale=LOCALE) + self.failIf(os.path.exists(self.MO_FILE)) diff --git a/tests/regressiontests/i18n/commands/extraction.py b/tests/regressiontests/i18n/commands/extraction.py new file mode 100644 index 0000000000..4b4fa1b07e --- /dev/null +++ b/tests/regressiontests/i18n/commands/extraction.py @@ -0,0 +1,98 @@ +import os +import re +import shutil +from django.test import TestCase +from django.core import management + +LOCALE='de' + +class ExtractorTests(TestCase): + + PO_FILE='locale/%s/LC_MESSAGES/django.po' % LOCALE + + def setUp(self): + self._cwd = os.getcwd() + self.test_dir = os.path.abspath(os.path.dirname(__file__)) + + def _rmrf(self, dname): + if os.path.commonprefix([self.test_dir, os.path.abspath(dname)]) != self.test_dir: + return + shutil.rmtree(dname) + + def tearDown(self): + os.chdir(self.test_dir) + try: + self._rmrf('locale/%s' % LOCALE) + except OSError: + pass + os.chdir(self._cwd) + + def assertMsgId(self, msgid, s): + return self.assert_(re.search('^msgid "%s"' % msgid, s, re.MULTILINE)) + + def assertNotMsgId(self, msgid, s): + return self.assert_(not re.search('^msgid "%s"' % msgid, s, re.MULTILINE)) + + +class JavascriptExtractorTests(ExtractorTests): + + PO_FILE='locale/%s/LC_MESSAGES/djangojs.po' % LOCALE + + def test_javascript_literals(self): + os.chdir(self.test_dir) + management.call_command('makemessages', domain='djangojs', locale=LOCALE, verbosity=0) + self.assert_(os.path.exists(self.PO_FILE)) + po_contents = open(self.PO_FILE, 'r').read() + self.assertMsgId('This literal should be included.', po_contents) + self.assertMsgId('This one as well.', po_contents) + + +class IgnoredExtractorTests(ExtractorTests): + + def test_ignore_option(self): + os.chdir(self.test_dir) + management.call_command('makemessages', locale=LOCALE, verbosity=0, ignore_patterns=['ignore_dir/*']) + self.assert_(os.path.exists(self.PO_FILE)) + po_contents = open(self.PO_FILE, 'r').read() + self.assertMsgId('This literal should be included.', po_contents) + self.assertNotMsgId('This should be ignored.', po_contents) + + +class SymlinkExtractorTests(ExtractorTests): + + def setUp(self): + self._cwd = os.getcwd() + self.test_dir = os.path.abspath(os.path.dirname(__file__)) + self.symlinked_dir = os.path.join(self.test_dir, 'templates_symlinked') + + def tearDown(self): + super(SymlinkExtractorTests, self).tearDown() + os.chdir(self.test_dir) + try: + os.remove(self.symlinked_dir) + except OSError: + pass + os.chdir(self._cwd) + + def test_symlink(self): + if hasattr(os, 'symlink'): + if os.path.exists(self.symlinked_dir): + self.assert_(os.path.islink(self.symlinked_dir)) + else: + os.symlink(os.path.join(self.test_dir, 'templates'), self.symlinked_dir) + os.chdir(self.test_dir) + management.call_command('makemessages', locale=LOCALE, verbosity=0, symlinks=True) + self.assert_(os.path.exists(self.PO_FILE)) + po_contents = open(self.PO_FILE, 'r').read() + self.assertMsgId('This literal should be included.', po_contents) + self.assert_('templates_symlinked/test.html' in po_contents) + + +class CopyPluralFormsExtractorTests(ExtractorTests): + + def test_copy_plural_forms(self): + os.chdir(self.test_dir) + management.call_command('makemessages', locale=LOCALE, verbosity=0) + self.assert_(os.path.exists(self.PO_FILE)) + po_contents = open(self.PO_FILE, 'r').read() + self.assert_('Plural-Forms: nplurals=2; plural=(n != 1)' in po_contents) diff --git a/tests/regressiontests/i18n/commands/ignore_dir/ignored.html b/tests/regressiontests/i18n/commands/ignore_dir/ignored.html new file mode 100644 index 0000000000..6a296787ef --- /dev/null +++ b/tests/regressiontests/i18n/commands/ignore_dir/ignored.html @@ -0,0 +1,2 @@ +{% load i18n %} +{% trans "This should be ignored." %} diff --git a/tests/regressiontests/i18n/commands/javascript.js b/tests/regressiontests/i18n/commands/javascript.js new file mode 100644 index 0000000000..bc5ec87957 --- /dev/null +++ b/tests/regressiontests/i18n/commands/javascript.js @@ -0,0 +1,4 @@ +// ' +gettext('This literal should be included.') +// ' +gettext('This one as well.') diff --git a/tests/regressiontests/i18n/commands/locale/dummy b/tests/regressiontests/i18n/commands/locale/dummy new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/regressiontests/i18n/commands/locale/es_AR/LC_MESSAGES/django.po b/tests/regressiontests/i18n/commands/locale/es_AR/LC_MESSAGES/django.po new file mode 100644 index 0000000000..7f74a4ef4a --- /dev/null +++ b/tests/regressiontests/i18n/commands/locale/es_AR/LC_MESSAGES/django.po @@ -0,0 +1,20 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR +# +msgid "" +msgstr "" +"Project-Id-Version: Django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-01-05 20:25-0300\n" +"PO-Revision-Date: 2010-02-22 00:14-0300\n" +"Last-Translator: Translator \n" +"Language-Team: Django-I18N \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: path/file.py:1 +msgid "This file has a UTF-8 BOM an should be rejected by the Django makemessages command." +msgstr "" diff --git a/tests/regressiontests/i18n/commands/templates/test.html b/tests/regressiontests/i18n/commands/templates/test.html new file mode 100644 index 0000000000..2c38b3e4e6 --- /dev/null +++ b/tests/regressiontests/i18n/commands/templates/test.html @@ -0,0 +1,2 @@ +{% load i18n %} +{% trans "This literal should be included." %} \ No newline at end of file diff --git a/tests/regressiontests/i18n/commands/tests.py b/tests/regressiontests/i18n/commands/tests.py new file mode 100644 index 0000000000..c3be2178e4 --- /dev/null +++ b/tests/regressiontests/i18n/commands/tests.py @@ -0,0 +1,43 @@ +import os +import re +from subprocess import Popen, PIPE + +def find_command(cmd, path=None, pathext=None): + if path is None: + path = os.environ.get('PATH', []).split(os.pathsep) + if isinstance(path, basestring): + path = [path] + # check if there are funny path extensions for executables, e.g. Windows + if pathext is None: + pathext = os.environ.get('PATHEXT', '.COM;.EXE;.BAT;.CMD').split(os.pathsep) + # don't use extensions if the command ends with one of them + for ext in pathext: + if cmd.endswith(ext): + pathext = [''] + break + # check if we find the command on PATH + for p in path: + f = os.path.join(p, cmd) + if os.path.isfile(f): + return f + for ext in pathext: + fext = f + ext + if os.path.isfile(fext): + return fext + return None + +# checks if it can find xgettext on the PATH and +# imports the extraction tests if yes +xgettext_cmd = find_command('xgettext') +if xgettext_cmd: + p = Popen('%s --version' % xgettext_cmd, shell=True, stdout=PIPE, stderr=PIPE, close_fds=os.name != 'nt', universal_newlines=True) + output = p.communicate()[0] + match = re.search(r'(?P\d+)\.(?P\d+)', output) + if match: + xversion = (int(match.group('major')), int(match.group('minor'))) + if xversion >= (0, 15): + from extraction import * + del p + +if find_command('msgfmt'): + from compilation import * diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py index f58c69e9b6..4aa52b6b55 100644 --- a/tests/regressiontests/i18n/tests.py +++ b/tests/regressiontests/i18n/tests.py @@ -18,6 +18,8 @@ from django.utils.importlib import import_module from forms import I18nForm, SelectDateForm, SelectDateWidget, CompanyForm from models import Company, TestModel +from commands.tests import * + class TranslationTests(TestCase): diff --git a/tests/regressiontests/makemessages/__init__.py b/tests/regressiontests/makemessages/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/regressiontests/makemessages/compilation.py b/tests/regressiontests/makemessages/compilation.py deleted file mode 100644 index 3ca2d57138..0000000000 --- a/tests/regressiontests/makemessages/compilation.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO - -from django.core.management import CommandError -from django.core.management.commands.compilemessages import compile_messages -from django.test import TestCase - -LOCALE='es_AR' - - -class MessageCompilationTests(TestCase): - - MO_FILE='locale/%s/LC_MESSAGES/django.mo' % LOCALE - - def setUp(self): - self._cwd = os.getcwd() - self.test_dir = os.path.abspath(os.path.dirname(__file__)) - - def tearDown(self): - os.chdir(self._cwd) - - -class PoFileTests(MessageCompilationTests): - - def test_bom_rejection(self): - os.chdir(self.test_dir) - # We don't use the django.core.management intrastructure (call_command() - # et al) because CommandError's cause exit(1) there. We test the - # underlying compile_messages function instead - out = StringIO() - self.assertRaises(CommandError, compile_messages, out, locale=LOCALE) - self.failIf(os.path.exists(self.MO_FILE)) diff --git a/tests/regressiontests/makemessages/extraction.py b/tests/regressiontests/makemessages/extraction.py deleted file mode 100644 index 4b4fa1b07e..0000000000 --- a/tests/regressiontests/makemessages/extraction.py +++ /dev/null @@ -1,98 +0,0 @@ -import os -import re -import shutil -from django.test import TestCase -from django.core import management - -LOCALE='de' - -class ExtractorTests(TestCase): - - PO_FILE='locale/%s/LC_MESSAGES/django.po' % LOCALE - - def setUp(self): - self._cwd = os.getcwd() - self.test_dir = os.path.abspath(os.path.dirname(__file__)) - - def _rmrf(self, dname): - if os.path.commonprefix([self.test_dir, os.path.abspath(dname)]) != self.test_dir: - return - shutil.rmtree(dname) - - def tearDown(self): - os.chdir(self.test_dir) - try: - self._rmrf('locale/%s' % LOCALE) - except OSError: - pass - os.chdir(self._cwd) - - def assertMsgId(self, msgid, s): - return self.assert_(re.search('^msgid "%s"' % msgid, s, re.MULTILINE)) - - def assertNotMsgId(self, msgid, s): - return self.assert_(not re.search('^msgid "%s"' % msgid, s, re.MULTILINE)) - - -class JavascriptExtractorTests(ExtractorTests): - - PO_FILE='locale/%s/LC_MESSAGES/djangojs.po' % LOCALE - - def test_javascript_literals(self): - os.chdir(self.test_dir) - management.call_command('makemessages', domain='djangojs', locale=LOCALE, verbosity=0) - self.assert_(os.path.exists(self.PO_FILE)) - po_contents = open(self.PO_FILE, 'r').read() - self.assertMsgId('This literal should be included.', po_contents) - self.assertMsgId('This one as well.', po_contents) - - -class IgnoredExtractorTests(ExtractorTests): - - def test_ignore_option(self): - os.chdir(self.test_dir) - management.call_command('makemessages', locale=LOCALE, verbosity=0, ignore_patterns=['ignore_dir/*']) - self.assert_(os.path.exists(self.PO_FILE)) - po_contents = open(self.PO_FILE, 'r').read() - self.assertMsgId('This literal should be included.', po_contents) - self.assertNotMsgId('This should be ignored.', po_contents) - - -class SymlinkExtractorTests(ExtractorTests): - - def setUp(self): - self._cwd = os.getcwd() - self.test_dir = os.path.abspath(os.path.dirname(__file__)) - self.symlinked_dir = os.path.join(self.test_dir, 'templates_symlinked') - - def tearDown(self): - super(SymlinkExtractorTests, self).tearDown() - os.chdir(self.test_dir) - try: - os.remove(self.symlinked_dir) - except OSError: - pass - os.chdir(self._cwd) - - def test_symlink(self): - if hasattr(os, 'symlink'): - if os.path.exists(self.symlinked_dir): - self.assert_(os.path.islink(self.symlinked_dir)) - else: - os.symlink(os.path.join(self.test_dir, 'templates'), self.symlinked_dir) - os.chdir(self.test_dir) - management.call_command('makemessages', locale=LOCALE, verbosity=0, symlinks=True) - self.assert_(os.path.exists(self.PO_FILE)) - po_contents = open(self.PO_FILE, 'r').read() - self.assertMsgId('This literal should be included.', po_contents) - self.assert_('templates_symlinked/test.html' in po_contents) - - -class CopyPluralFormsExtractorTests(ExtractorTests): - - def test_copy_plural_forms(self): - os.chdir(self.test_dir) - management.call_command('makemessages', locale=LOCALE, verbosity=0) - self.assert_(os.path.exists(self.PO_FILE)) - po_contents = open(self.PO_FILE, 'r').read() - self.assert_('Plural-Forms: nplurals=2; plural=(n != 1)' in po_contents) diff --git a/tests/regressiontests/makemessages/ignore_dir/ignored.html b/tests/regressiontests/makemessages/ignore_dir/ignored.html deleted file mode 100644 index 6a296787ef..0000000000 --- a/tests/regressiontests/makemessages/ignore_dir/ignored.html +++ /dev/null @@ -1,2 +0,0 @@ -{% load i18n %} -{% trans "This should be ignored." %} diff --git a/tests/regressiontests/makemessages/javascript.js b/tests/regressiontests/makemessages/javascript.js deleted file mode 100644 index bc5ec87957..0000000000 --- a/tests/regressiontests/makemessages/javascript.js +++ /dev/null @@ -1,4 +0,0 @@ -// ' -gettext('This literal should be included.') -// ' -gettext('This one as well.') diff --git a/tests/regressiontests/makemessages/locale/dummy b/tests/regressiontests/makemessages/locale/dummy deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/regressiontests/makemessages/locale/es_AR/LC_MESSAGES/django.po b/tests/regressiontests/makemessages/locale/es_AR/LC_MESSAGES/django.po deleted file mode 100644 index 7f74a4ef4a..0000000000 --- a/tests/regressiontests/makemessages/locale/es_AR/LC_MESSAGES/django.po +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR -# -msgid "" -msgstr "" -"Project-Id-Version: Django\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-01-05 20:25-0300\n" -"PO-Revision-Date: 2010-02-22 00:14-0300\n" -"Last-Translator: Translator \n" -"Language-Team: Django-I18N \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: path/file.py:1 -msgid "This file has a UTF-8 BOM an should be rejected by the Django makemessages command." -msgstr "" diff --git a/tests/regressiontests/makemessages/models.py b/tests/regressiontests/makemessages/models.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/regressiontests/makemessages/templates/test.html b/tests/regressiontests/makemessages/templates/test.html deleted file mode 100644 index 2c38b3e4e6..0000000000 --- a/tests/regressiontests/makemessages/templates/test.html +++ /dev/null @@ -1,2 +0,0 @@ -{% load i18n %} -{% trans "This literal should be included." %} \ No newline at end of file diff --git a/tests/regressiontests/makemessages/tests.py b/tests/regressiontests/makemessages/tests.py deleted file mode 100644 index c3be2178e4..0000000000 --- a/tests/regressiontests/makemessages/tests.py +++ /dev/null @@ -1,43 +0,0 @@ -import os -import re -from subprocess import Popen, PIPE - -def find_command(cmd, path=None, pathext=None): - if path is None: - path = os.environ.get('PATH', []).split(os.pathsep) - if isinstance(path, basestring): - path = [path] - # check if there are funny path extensions for executables, e.g. Windows - if pathext is None: - pathext = os.environ.get('PATHEXT', '.COM;.EXE;.BAT;.CMD').split(os.pathsep) - # don't use extensions if the command ends with one of them - for ext in pathext: - if cmd.endswith(ext): - pathext = [''] - break - # check if we find the command on PATH - for p in path: - f = os.path.join(p, cmd) - if os.path.isfile(f): - return f - for ext in pathext: - fext = f + ext - if os.path.isfile(fext): - return fext - return None - -# checks if it can find xgettext on the PATH and -# imports the extraction tests if yes -xgettext_cmd = find_command('xgettext') -if xgettext_cmd: - p = Popen('%s --version' % xgettext_cmd, shell=True, stdout=PIPE, stderr=PIPE, close_fds=os.name != 'nt', universal_newlines=True) - output = p.communicate()[0] - match = re.search(r'(?P\d+)\.(?P\d+)', output) - if match: - xversion = (int(match.group('major')), int(match.group('minor'))) - if xversion >= (0, 15): - from extraction import * - del p - -if find_command('msgfmt'): - from compilation import * -- cgit v1.3