summaryrefslogtreecommitdiff
path: root/src/zope/i18n/compile.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/zope/i18n/compile.py')
-rw-r--r--src/zope/i18n/compile.py87
1 files changed, 47 insertions, 40 deletions
diff --git a/src/zope/i18n/compile.py b/src/zope/i18n/compile.py
index 88de796..e4f3be2 100644
--- a/src/zope/i18n/compile.py
+++ b/src/zope/i18n/compile.py
@@ -1,54 +1,61 @@
-from contextlib import closing
+
import logging
-import os
-from os.path import join
-from stat import ST_MTIME
+logger = logging.getLogger('zope.i18n')
+
+def _cannot_compile_mo_file(domain, lc_messages_path):
+ logger.critical("Unable to compile messages: Python `gettext` library missing.")
+ return
-HAS_PYTHON_GETTEXT = True
try:
from pythongettext.msgfmt import Msgfmt
from pythongettext.msgfmt import PoSyntaxError
-except ImportError:
+except ImportError: # pragma: no cover
HAS_PYTHON_GETTEXT = False
+ compile_mo_file = _cannot_compile_mo_file
+else:
+ from contextlib import closing
+ import os.path
+ from os.path import join
-logger = logging.getLogger('zope.i18n')
+ HAS_PYTHON_GETTEXT = True
+ def _safe_mtime(path):
+ try:
+ return os.path.getmtime(path)
+ except (IOError, OSError):
+ return None
-def compile_mo_file(domain, lc_messages_path):
- """Creates or updates a mo file in the locales folder."""
- if not HAS_PYTHON_GETTEXT:
- logger.critical("Unable to compile messages: Python `gettext` library missing.")
- return
+ def compile_mo_file(domain, lc_messages_path):
+ """Creates or updates a mo file in the locales folder."""
- base = join(lc_messages_path, domain)
- pofile = str(base + '.po')
- mofile = str(base + '.mo')
+ base = join(lc_messages_path, domain)
+ pofile = str(base + '.po')
+ mofile = str(base + '.mo')
- po_mtime = 0
- try:
- po_mtime = os.stat(pofile)[ST_MTIME]
- except (IOError, OSError):
- return
+ po_mtime = _safe_mtime(pofile)
+ mo_mtime = _safe_mtime(mofile) if os.path.exists(mofile) else 0
- mo_mtime = 0
- if os.path.exists(mofile):
- # Update mo file?
- try:
- mo_mtime = os.stat(mofile)[ST_MTIME]
- except (IOError, OSError):
+ if po_mtime is None or mo_mtime is None:
+ logger.debug("Unable to access either %s (%s) or %s (%s)",
+ pofile, po_mtime, mofile, mo_mtime)
return
- if po_mtime > mo_mtime:
- try:
- # Msgfmt.getAsFile returns io.BytesIO on Python 3, and cStringIO.StringIO
- # on Python 2; sadly StringIO isn't a proper context manager, so we have to
- # wrap it with `closing`. Also, Msgfmt doesn't properly close a file
- # it opens for reading if you pass the path, but it does if you pass
- # the file.
- with closing(Msgfmt(open(pofile, 'rb'), domain).getAsFile()) as mo:
- with open(mofile, 'wb') as fd:
- fd.write(mo.read())
- except PoSyntaxError as err:
- logger.warning('Syntax error while compiling %s (%s).', pofile, err.msg)
- except (IOError, OSError) as err:
- logger.warning('Error while compiling %s (%s).', pofile, err)
+ if po_mtime > mo_mtime:
+ try:
+ # Msgfmt.getAsFile returns io.BytesIO on Python 3, and cStringIO.StringIO
+ # on Python 2; sadly StringIO isn't a proper context manager, so we have to
+ # wrap it with `closing`. Also, Msgfmt doesn't properly close a file
+ # it opens for reading if you pass the path, but it does if you pass
+ # the file.
+ with open(pofile, 'rb') as pofd:
+ with closing(Msgfmt(pofd, domain).getAsFile()) as mo:
+ with open(mofile, 'wb') as fd:
+ fd.write(mo.read())
+ # For testing we return distinct values for each scenario
+ return True
+ except PoSyntaxError as err:
+ logger.warning('Syntax error while compiling %s (%s).', pofile, err.msg)
+ return 0
+ except (IOError, OSError) as err:
+ logger.warning('Error while compiling %s (%s).', pofile, err)
+ return False