From bb4a92d7845878b2ce0c4a5ca154cb4db22f7bad Mon Sep 17 00:00:00 2001 From: Ilja Maas Date: Sun, 16 Nov 2014 22:16:41 +0100 Subject: [PATCH] Fixed #23840 -- Fixed makemessages find_files method Changed the handling of extensions to be used for gettext. Now obeying the --extension argument. find_files now only find the given or default extensions and puts only these in the TranslatableFiles. As a result there are no more confusing messages for filetypes (extension) not handled by makemessages. --- .../core/management/commands/makemessages.py | 15 ++++++------ tests/i18n/test_extraction.py | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/django/core/management/commands/makemessages.py b/django/core/management/commands/makemessages.py index 77e7e62493..ae6b72e946 100644 --- a/django/core/management/commands/makemessages.py +++ b/django/core/management/commands/makemessages.py @@ -61,8 +61,8 @@ class TranslatableFile(object): if command.verbosity > 1: command.stdout.write('processing file %s in %s\n' % (self.file, self.dirpath)) - _, file_ext = os.path.splitext(self.file) - if domain == 'djangojs' and file_ext in command.extensions: + file_ext = os.path.splitext(self.file)[1] + if domain == 'djangojs': orig_file = os.path.join(self.dirpath, self.file) work_file = orig_file is_templatized = command.gettext_version < (0, 18, 3) @@ -85,10 +85,10 @@ class TranslatableFile(object): '--output=-' ] + command.xgettext_options args.append(work_file) - elif domain == 'django' and (file_ext == '.py' or file_ext in command.extensions): + elif domain == 'django': orig_file = os.path.join(self.dirpath, self.file) work_file = orig_file - is_templatized = file_ext in command.extensions + is_templatized = file_ext != '.py' if is_templatized: with io.open(orig_file, encoding=settings.FILE_CHARSET) as fp: src_data = fp.read() @@ -250,8 +250,8 @@ class Command(BaseCommand): if self.domain == 'djangojs': exts = extensions if extensions else ['js'] else: - exts = extensions if extensions else ['html', 'txt'] - self.extensions = handle_extensions(exts) + exts = extensions if extensions else ['html', 'txt', 'py'] + self.extensions = handle_extensions(exts, ignored=()) if (locale is None and not exclude and not process_all) or self.domain is None: raise CommandError("Type '%s help %s' for usage information." % ( @@ -394,7 +394,8 @@ class Command(BaseCommand): self.locale_paths.insert(0, os.path.join(os.path.abspath(dirpath), dirname)) for filename in filenames: file_path = os.path.normpath(os.path.join(dirpath, filename)) - if is_ignored(file_path, self.ignore_patterns): + file_ext = os.path.splitext(filename)[1] + if not (file_ext in self.extensions) or is_ignored(file_path, self.ignore_patterns): if self.verbosity > 1: self.stdout.write('ignoring file %s in %s\n' % (filename, dirpath)) else: diff --git a/tests/i18n/test_extraction.py b/tests/i18n/test_extraction.py index b2972105c7..ded627e941 100644 --- a/tests/i18n/test_extraction.py +++ b/tests/i18n/test_extraction.py @@ -344,6 +344,30 @@ class BasicExtractorTests(ExtractorTests): self.assertMsgId("Translatable literal #9j", po_contents) + def test_makemessages_find_files(self): + """ + Test that find_files only discover files having the proper extensions. + """ + from django.core.management.commands.makemessages import Command + cmd = Command() + cmd.ignore_patterns = ['CVS', '.*', '*~', '*.pyc'] + cmd.symlinks = False + cmd.domain = 'django' + cmd.extensions = ['html', 'txt', 'py'] + cmd.verbosity = 0 + cmd.locale_paths = [] + cmd.default_locale_path = os.path.join(self.test_dir, 'locale') + found_files = cmd.find_files(self.test_dir) + found_exts = set([os.path.splitext(tfile.file)[1] for tfile in found_files]) + self.assertEqual(found_exts.difference({'.py', '.html', '.txt'}), set()) + + cmd.extensions = ['js'] + cmd.domain = 'djangojs' + found_files = cmd.find_files(self.test_dir) + found_exts = set([os.path.splitext(tfile.file)[1] for tfile in found_files]) + self.assertEqual(found_exts.difference({'.js'}), set()) + + class JavascriptExtractorTests(ExtractorTests): PO_FILE = 'locale/%s/LC_MESSAGES/djangojs.po' % LOCALE