summaryrefslogtreecommitdiff
path: root/babel/messages/frontend.py
diff options
context:
space:
mode:
Diffstat (limited to 'babel/messages/frontend.py')
-rw-r--r--babel/messages/frontend.py70
1 files changed, 40 insertions, 30 deletions
diff --git a/babel/messages/frontend.py b/babel/messages/frontend.py
index c7e921d..ab094ec 100644
--- a/babel/messages/frontend.py
+++ b/babel/messages/frontend.py
@@ -8,6 +8,7 @@
:license: BSD, see LICENSE for more details.
"""
+import datetime
import fnmatch
import logging
import optparse
@@ -18,14 +19,19 @@ import sys
import tempfile
from collections import OrderedDict
from configparser import RawConfigParser
-import datetime
from io import StringIO
+from typing import Iterable
-from babel import __version__ as VERSION
from babel import Locale, localedata
+from babel import __version__ as VERSION
from babel.core import UnknownLocaleError
-from babel.messages.catalog import Catalog, DEFAULT_HEADER
-from babel.messages.extract import DEFAULT_KEYWORDS, DEFAULT_MAPPING, check_and_call_extract_file, extract_from_dir
+from babel.messages.catalog import DEFAULT_HEADER, Catalog
+from babel.messages.extract import (
+ DEFAULT_KEYWORDS,
+ DEFAULT_MAPPING,
+ check_and_call_extract_file,
+ extract_from_dir,
+)
from babel.messages.mofile import write_mo
from babel.messages.pofile import read_po, write_po
from babel.util import LOCALTZ
@@ -38,15 +44,16 @@ try:
distutils_log = log # "distutils.log → (no replacement yet)"
try:
- from setuptools.errors import OptionError, SetupError, BaseError
+ from setuptools.errors import BaseError, OptionError, SetupError
except ImportError: # Error aliases only added in setuptools 59 (2021-11).
OptionError = SetupError = BaseError = Exception
except ImportError:
from distutils import log as distutils_log
from distutils.cmd import Command as _Command
- from distutils.errors import DistutilsOptionError as OptionError, DistutilsSetupError as SetupError, DistutilsError as BaseError
-
+ from distutils.errors import DistutilsError as BaseError
+ from distutils.errors import DistutilsOptionError as OptionError
+ from distutils.errors import DistutilsSetupError as SetupError
def listify_value(arg, split=None):
@@ -188,7 +195,7 @@ class compile_catalog(Command):
def run(self):
n_errors = 0
for domain in self.domain:
- for catalog, errors in self._run_domain(domain).items():
+ for errors in self._run_domain(domain).values():
n_errors += len(errors)
if n_errors:
self.log.error('%d errors encountered.', n_errors)
@@ -472,6 +479,27 @@ class extract_messages(Command):
else:
self.directory_filter = None
+ def _build_callback(self, path: str):
+ def callback(filename: str, method: str, options: dict):
+ if method == 'ignore':
+ return
+
+ # If we explicitly provide a full filepath, just use that.
+ # Otherwise, path will be the directory path and filename
+ # is the relative path from that dir to the file.
+ # So we can join those to get the full filepath.
+ if os.path.isfile(path):
+ filepath = path
+ else:
+ filepath = os.path.normpath(os.path.join(path, filename))
+
+ optstr = ''
+ if options:
+ opt_values = ", ".join(f'{k}="{v}"' for k, v in options.items())
+ optstr = f" ({opt_values})"
+ self.log.info('extracting messages from %s%s', filepath, optstr)
+ return callback
+
def run(self):
mappings = self._get_mappings()
with open(self.output_file, 'wb') as outfile:
@@ -483,25 +511,7 @@ class extract_messages(Command):
header_comment=(self.header_comment or DEFAULT_HEADER))
for path, method_map, options_map in mappings:
- def callback(filename, method, options):
- if method == 'ignore':
- return
-
- # If we explicitly provide a full filepath, just use that.
- # Otherwise, path will be the directory path and filename
- # is the relative path from that dir to the file.
- # So we can join those to get the full filepath.
- if os.path.isfile(path):
- filepath = path
- else:
- filepath = os.path.normpath(os.path.join(path, filename))
-
- optstr = ''
- if options:
- opt_values = ", ".join(f'{k}="{v}"' for k, v in options.items())
- optstr = f" ({opt_values})"
- self.log.info('extracting messages from %s%s', filepath, optstr)
-
+ callback = self._build_callback(path)
if os.path.isfile(path):
current_dir = os.getcwd()
extracted = check_and_call_extract_file(
@@ -842,7 +852,7 @@ class update_catalog(Command):
omit_header=self.omit_header,
ignore_obsolete=self.ignore_obsolete,
include_previous=self.previous, width=self.width)
- except:
+ except Exception:
os.remove(tmpname)
raise
@@ -937,7 +947,7 @@ class CommandLineInterface:
identifiers = localedata.locale_identifiers()
longest = max(len(identifier) for identifier in identifiers)
identifiers.sort()
- format = u'%%-%ds %%s' % (longest + 1)
+ format = '%%-%ds %%s' % (longest + 1)
for identifier in identifiers:
locale = Locale.parse(identifier)
print(format % (identifier, locale.english_name))
@@ -1105,7 +1115,7 @@ def parse_mapping(fileobj, filename=None):
return method_map, options_map
-def parse_keywords(strings=[]):
+def parse_keywords(strings: Iterable[str] = ()):
"""Parse keywords specifications from the given list of strings.
>>> kw = sorted(parse_keywords(['_', 'dgettext:2', 'dngettext:2,3', 'pgettext:1c,2']).items())