Decode from UTF-8 explicitly when reading a text file in makemessages.

This shows itself with Python 3 under Windows where UTF-8 usually isn't
the default file I/O encoding and caused one failure and three errors
in our test suite under that platform setup.
This commit is contained in:
Ramiro Morales 2013-10-21 00:22:32 -03:00
parent a098bee1b9
commit b5f52647fe
2 changed files with 11 additions and 7 deletions

View File

@ -1,5 +1,6 @@
import fnmatch import fnmatch
import glob import glob
import io
import os import os
import re import re
import sys import sys
@ -10,6 +11,7 @@ import django
from django.core.management.base import CommandError, NoArgsCommand from django.core.management.base import CommandError, NoArgsCommand
from django.core.management.utils import (handle_extensions, find_command, from django.core.management.utils import (handle_extensions, find_command,
popen_wrapper) popen_wrapper)
from django.utils.encoding import force_str
from django.utils.functional import total_ordering from django.utils.functional import total_ordering
from django.utils.text import get_text_list from django.utils.text import get_text_list
from django.utils.jslex import prepare_js_for_gettext from django.utils.jslex import prepare_js_for_gettext
@ -402,16 +404,17 @@ class Command(NoArgsCommand):
for domain in domains: for domain in domains:
django_po = os.path.join(django_dir, 'conf', 'locale', locale, 'LC_MESSAGES', '%s.po' % domain) django_po = os.path.join(django_dir, 'conf', 'locale', locale, 'LC_MESSAGES', '%s.po' % domain)
if os.path.exists(django_po): if os.path.exists(django_po):
with open(django_po, 'rU') as fp: with io.open(django_po, 'rU', encoding='utf-8') as fp:
m = plural_forms_re.search(fp.read()) m = plural_forms_re.search(fp.read())
if m: if m:
plural_form_line = force_str(m.group('value'))
if self.verbosity > 1: if self.verbosity > 1:
self.stdout.write("copying plural forms: %s\n" % m.group('value')) self.stdout.write("copying plural forms: %s\n" % plural_form_line)
lines = [] lines = []
found = False found = False
for line in msgs.split('\n'): for line in msgs.split('\n'):
if not found and (not line or plural_forms_re.search(line)): if not found and (not line or plural_forms_re.search(line)):
line = '%s\n' % m.group('value') line = '%s\n' % plural_form_line
found = True found = True
lines.append(line) lines.append(line)
msgs = '\n'.join(lines) msgs = '\n'.join(lines)

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
import io
import os import os
import re import re
import shutil import shutil
@ -65,8 +66,8 @@ class BasicExtractorTests(ExtractorTests):
os.chdir(self.test_dir) os.chdir(self.test_dir)
management.call_command('makemessages', locale=LOCALE, verbosity=0) management.call_command('makemessages', locale=LOCALE, verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE)) self.assertTrue(os.path.exists(self.PO_FILE))
with open(self.PO_FILE, 'r') as fp: with io.open(self.PO_FILE, 'r', encoding='utf-8') as fp:
po_contents = force_text(fp.read()) po_contents = fp.read()
self.assertTrue('#. Translators: This comment should be extracted' in po_contents) self.assertTrue('#. Translators: This comment should be extracted' in po_contents)
self.assertTrue('This comment should not be extracted' not in po_contents) self.assertTrue('This comment should not be extracted' not in po_contents)
# Comments in templates # Comments in templates
@ -363,8 +364,8 @@ class CopyPluralFormsExtractorTests(ExtractorTests):
os.chdir(self.test_dir) os.chdir(self.test_dir)
management.call_command('makemessages', locale='es', extensions=['djtpl'], verbosity=0) management.call_command('makemessages', locale='es', extensions=['djtpl'], verbosity=0)
self.assertTrue(os.path.exists(self.PO_FILE_ES)) self.assertTrue(os.path.exists(self.PO_FILE_ES))
with open(self.PO_FILE_ES, 'r') as fp: with io.open(self.PO_FILE_ES, 'r', encoding='utf-8') as fp:
po_contents = force_text(fp.read()) po_contents = fp.read()
found = re.findall(r'^(?P<value>"Plural-Forms.+?\\n")\s*$', po_contents, re.MULTILINE | re.DOTALL) found = re.findall(r'^(?P<value>"Plural-Forms.+?\\n")\s*$', po_contents, re.MULTILINE | re.DOTALL)
self.assertEqual(1, len(found)) self.assertEqual(1, len(found))