#18128: use standard +NNNN timezone format in POT-Creation-Date header.

Patch by Michael McFadden, with a few small style tweaks.
This commit is contained in:
R David Murray 2015-04-16 12:15:09 -04:00
parent 29fbd21d73
commit 2b78129b3a
5 changed files with 77 additions and 3 deletions

View File

@ -814,6 +814,10 @@ Changes in the Python API
* The :mod:`socket` module now exports the CAN_RAW_FD_FRAMES constant on linux * The :mod:`socket` module now exports the CAN_RAW_FD_FRAMES constant on linux
3.6 and greater. 3.6 and greater.
* The `pygettext.py` Tool now uses the standard +NNNN format for timezones in
the POT-Creation-Date header.
Changes in the C API Changes in the C API
-------------------- --------------------

View File

@ -0,0 +1,68 @@
"""Tests to cover the Tools/i18n package"""
import os
import unittest
from test.script_helper import assert_python_ok
from test.test_tools import toolsdir
from test.support import temp_cwd
class Test_pygettext(unittest.TestCase):
"""Tests for the pygettext.py tool"""
script = os.path.join(toolsdir,'i18n', 'pygettext.py')
def get_header(self, data):
""" utility: return the header of a .po file as a dictionary """
headers = {}
for line in data.split('\n'):
if not line or line.startswith(('#', 'msgid','msgstr')):
continue
line = line.strip('"')
key, val = line.split(':',1)
headers[key] = val.strip()
return headers
def test_header(self):
"""Make sure the required fields are in the header, according to:
http://www.gnu.org/software/gettext/manual/gettext.html#Header-Entry
"""
with temp_cwd(None) as cwd:
assert_python_ok(self.script)
with open('messages.pot') as fp:
data = fp.read()
header = self.get_header(data)
self.assertIn("Project-Id-Version", header)
self.assertIn("POT-Creation-Date", header)
self.assertIn("PO-Revision-Date", header)
self.assertIn("Last-Translator", header)
self.assertIn("Language-Team", header)
self.assertIn("MIME-Version", header)
self.assertIn("Content-Type", header)
self.assertIn("Content-Transfer-Encoding", header)
self.assertIn("Generated-By", header)
# not clear if these should be required in POT (template) files
#self.assertIn("Report-Msgid-Bugs-To", header)
#self.assertIn("Language", header)
#"Plural-Forms" is optional
def test_POT_Creation_Date(self):
""" Match the date format from xgettext for POT-Creation-Date """
from datetime import datetime
with temp_cwd(None) as cwd:
assert_python_ok(self.script)
with open('messages.pot') as fp:
data = fp.read()
header = self.get_header(data)
creationDate = header['POT-Creation-Date']
# peel off the escaped newline at the end of string
if creationDate.endswith('\\n'):
creationDate = creationDate[:-len('\\n')]
# This will raise if the date format does not exactly match.
datetime.strptime(creationDate, '%Y-%m-%d %H:%M%z')

View File

@ -911,6 +911,7 @@ Jack McCracken
Rebecca McCreary Rebecca McCreary
Kirk McDonald Kirk McDonald
Chris McDonough Chris McDonough
Michael McFadden
Greg McFarlane Greg McFarlane
Alan McIntyre Alan McIntyre
Jessica McKellar Jessica McKellar

View File

@ -187,6 +187,9 @@ Tests
Tools/Demos Tools/Demos
----------- -----------
- Issue #18128: pygettext now uses standard +NNNN format in the
POT-Creation-Date header.
- Issue #23935: Argument Clinic's understanding of format units - Issue #23935: Argument Clinic's understanding of format units
accepting bytes, bytearrays, and buffers is now consistent with accepting bytes, bytearrays, and buffers is now consistent with
both the documentation and the implementation. both the documentation and the implementation.

View File

@ -441,9 +441,7 @@ class TokenEater:
def write(self, fp): def write(self, fp):
options = self.__options options = self.__options
timestamp = time.strftime('%Y-%m-%d %H:%M+%Z') timestamp = time.strftime('%Y-%m-%d %H:%M%z')
# The time stamp in the header doesn't have the same format as that
# generated by xgettext...
encoding = fp.encoding if fp.encoding else 'UTF-8' encoding = fp.encoding if fp.encoding else 'UTF-8'
print(pot_header % {'time': timestamp, 'version': __version__, print(pot_header % {'time': timestamp, 'version': __version__,
'charset': encoding, 'charset': encoding,