changeset 97:debd9ac3bb4d

Fix for #11 (use local timezone in timestamps of generated POT).
author cmlenz
date Tue, 12 Jun 2007 18:40:39 +0000
parents 6c07c38e23aa
children fb9109dd9070
files babel/messages/catalog.py babel/messages/frontend.py babel/messages/tests/catalog.py babel/util.py
diffstat 4 files changed, 60 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/babel/messages/catalog.py
+++ b/babel/messages/catalog.py
@@ -24,7 +24,7 @@
 from babel import __version__ as VERSION
 from babel.core import Locale
 from babel.messages.plurals import PLURALS
-from babel.util import odict, UTC
+from babel.util import odict, LOCAL, UTC
 
 __all__ = ['Message', 'Catalog']
 __docformat__ = 'restructuredtext en'
@@ -132,23 +132,19 @@
         self.project = project or 'PROJECT' #: the project name
         self.version = version or 'VERSION' #: the project version
         self.msgid_bugs_address = msgid_bugs_address or 'EMAIL@ADDRESS'
+        self.last_translator = last_translator #: last translator name + email
+        self.charset = charset or 'utf-8'
 
         if creation_date is None:
-            creation_date = time.localtime()
-        elif isinstance(creation_date, datetime):
-            if creation_date.tzinfo is None:
-                creation_date = creation_date.replace(tzinfo=UTC)
-            creation_date = creation_date.timetuple()
+            creation_date = datetime.now(LOCAL)
+        elif isinstance(creation_date, datetime) and not creation_date.tzinfo:
+            creation_date = creation_date.replace(tzinfo=LOCAL)
         self.creation_date = creation_date #: creation date of the template
         if revision_date is None:
-            revision_date = time.localtime()
-        elif isinstance(revision_date, datetime):
-            if revision_date.tzinfo is None:
-                revision_date = revision_date.replace(tzinfo=UTC)
-            revision_date = revision_date.timetuple()
+            revision_date = datetime.now(LOCAL)
+        elif isinstance(revision_date, datetime) and not revision_date.tzinfo:
+            revision_date = revision_date.replace(tzinfo=LOCAL)
         self.revision_date = revision_date #: last revision date of the catalog
-        self.last_translator = last_translator #: last translator name + email
-        self.charset = charset or 'utf-8'
 
     def headers(self):
         headers = []
@@ -156,14 +152,14 @@
                         '%s %s' % (self.project, self.version)))
         headers.append(('Report-Msgid-Bugs-To', self.msgid_bugs_address))
         headers.append(('POT-Creation-Date',
-                        time.strftime('%Y-%m-%d %H:%M%z', self.creation_date)))
+                        self.creation_date.strftime('%Y-%m-%d %H:%M%z')))
         if self.locale is None:
             headers.append(('PO-Revision-Date', 'YEAR-MO-DA HO:MI+ZONE'))
             headers.append(('Last-Translator', 'FULL NAME <EMAIL@ADDRESS>'))
             headers.append(('Language-Team', 'LANGUAGE <LL@li.org>'))
         else:
             headers.append(('PO-Revision-Date',
-                            time.strftime('%Y-%m-%d %H:%M%z', self.revision_date)))
+                            self.revision_date.strftime('%Y-%m-%d %H:%M%z')))
             headers.append(('Last-Translator', self.last_translator))
             headers.append(('Language-Team', '%s <LL@li.org>' % self.locale))
             headers.append(('Plural-Forms', self.plural_forms))
@@ -182,8 +178,9 @@
     
     Here's an example of the output for such a catalog template:
     
+    >>> created = datetime(1990, 4, 1, 15, 30, tzinfo=UTC)
     >>> catalog = Catalog(project='Foobar', version='1.0',
-    ...                   creation_date=datetime(1990, 4, 1, 15, 30))
+    ...                   creation_date=created)
     >>> for name, value in catalog.headers:
     ...     print '%s: %s' % (name, value)
     Project-Id-Version: Foobar 1.0
@@ -199,9 +196,9 @@
     
     And here's an example of the output when the locale is set:
     
+    >>> revised = datetime(1990, 8, 3, 12, 0, tzinfo=UTC)
     >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0',
-    ...                   creation_date=datetime(1990, 4, 1, 15, 30),
-    ...                   revision_date=datetime(1990, 8, 3, 12, 0),
+    ...                   creation_date=created, revision_date=revised,
     ...                   last_translator='John Doe <jd@example.com>')
     >>> for name, value in catalog.headers:
     ...     print '%s: %s' % (name, value)
--- a/babel/messages/frontend.py
+++ b/babel/messages/frontend.py
@@ -114,7 +114,7 @@
         self.msgid_bugs_address = None
         self.copyright_holder = None
         self.add_comments = None
-        self._add_comments = None
+        self._add_comments = []
 
     def finalize_options(self):
         if self.no_default_keywords and not self.keywords:
@@ -133,7 +133,7 @@
             self.width = None
         else:
             self.width = int(self.width)
-            
+
         if self.sort_output and self.sort_by_file:
             raise DistutilsOptionError("'--sort-output' and '--sort-by-file' "
                                        "are mutually exclusive")
@@ -142,7 +142,7 @@
             self.input_dirs = dict.fromkeys([k.split('.',1)[0] 
                 for k in self.distribution.packages 
             ]).keys()
-            
+
         if self.add_comments:
             self._add_comments = self.add_comments.split(',')
 
@@ -424,7 +424,7 @@
                           help='set report address for msgid')
         parser.add_option('--copyright-holder', dest='copyright_holder',
                           help='set copyright holder in output')
-        parser.add_option('--add-comments', '-c', dest='add_comments',
+        parser.add_option('--add-comments', '-c', dest='comment_tags',
                           metavar='TAG', action='append',
                           help='place comment block with TAG (or those '
                                'preceding keyword lines) in output file. One '
@@ -434,7 +434,7 @@
                             no_default_keywords=False, no_location=False,
                             omit_header = False, width=76, no_wrap=False,
                             sort_output=False, sort_by_file=False,
-                            add_comments=[])
+                            comment_tags=[])
         options, args = parser.parse_args(argv)
         if not args:
             parser.error('incorrect number of arguments')
@@ -479,9 +479,8 @@
             for dirname in args:
                 if not os.path.isdir(dirname):
                     parser.error('%r is not a directory' % dirname)
-                extracted = extract_from_dir(dirname, method_map,
-                                             options_map, keywords,
-                                             comment_tags=options.add_comments)
+                extracted = extract_from_dir(dirname, method_map, options_map,
+                                             keywords, options.comment_tags)
                 for filename, lineno, message, comments in extracted:
                     filepath = os.path.normpath(os.path.join(dirname, filename))
                     catalog.add(message, None, [(filepath, lineno)], 
--- a/babel/messages/tests/catalog.py
+++ b/babel/messages/tests/catalog.py
@@ -42,7 +42,7 @@
         cat.add('foo')
         cat.add(('foo', 'foos'))
         self.assertEqual(1, len(cat))
-        
+
     def test_update_message_updates_comments(self):
         cat = catalog.Catalog()
         cat[u'foo'] = catalog.Message('foo', locations=[('main.py', 5)])
--- a/babel/util.py
+++ b/babel/util.py
@@ -16,8 +16,9 @@
 from datetime import timedelta, tzinfo
 import os
 import re
+import time
 
-__all__ = ['pathmatch', 'relpath', 'UTC']
+__all__ = ['pathmatch', 'relpath', 'UTC', 'LOCAL']
 __docformat__ = 'restructuredtext en'
 
 def pathmatch(pattern, filename):
@@ -169,3 +170,38 @@
     
     :type: `tzinfo`
     """
+
+STDOFFSET = timedelta(seconds = -time.timezone)
+if time.daylight:
+    DSTOFFSET = timedelta(seconds = -time.altzone)
+else:
+    DSTOFFSET = STDOFFSET
+
+DSTDIFF = DSTOFFSET - STDOFFSET
+
+class LocalTimezone(tzinfo):
+
+    def utcoffset(self, dt):
+        if self._isdst(dt):
+            return DSTOFFSET
+        else:
+            return STDOFFSET
+
+    def dst(self, dt):
+        if self._isdst(dt):
+            return DSTDIFF
+        else:
+            return ZERO
+
+    def tzname(self, dt):
+        return time.tzname[self._isdst(dt)]
+
+    def _isdst(self, dt):
+        tt = (dt.year, dt.month, dt.day,
+              dt.hour, dt.minute, dt.second,
+              dt.weekday(), 0, -1)
+        stamp = time.mktime(tt)
+        tt = time.localtime(stamp)
+        return tt.tm_isdst > 0
+
+LOCAL = LocalTimezone()
Copyright (C) 2012-2017 Edgewall Software