annotate babel/messages/frontend.py @ 179:6138ea7ef7a8

* Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified. * The `--use-fuzzy` option works again from the command-line.
author cmlenz
date Wed, 27 Jun 2007 14:29:17 +0000
parents 51fffa0a51ac
children 7e88950ab661
rev   line source
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
1 #!/usr/bin/env python
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
2 # -*- coding: utf-8 -*-
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
3 #
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2007 Edgewall Software
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
5 # All rights reserved.
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
6 #
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
9 # are also available at http://babel.edgewall.org/wiki/License.
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
10 #
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://babel.edgewall.org/log/.
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
14
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
15 """Frontends for the message extraction functionality."""
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
16
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
17 from ConfigParser import RawConfigParser
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
18 from datetime import datetime
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
19 from distutils import log
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
20 from distutils.cmd import Command
51
3664c93860f1 Support a `message_extractors` keyword argument directly in `setup()`. Closes #4.
cmlenz
parents: 50
diff changeset
21 from distutils.errors import DistutilsOptionError, DistutilsSetupError
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
22 from optparse import OptionParser
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
23 import os
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
24 import re
51
3664c93860f1 Support a `message_extractors` keyword argument directly in `setup()`. Closes #4.
cmlenz
parents: 50
diff changeset
25 from StringIO import StringIO
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
26 import sys
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
27
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
28 from babel import __version__ as VERSION
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
29 from babel import Locale
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
30 from babel.core import UnknownLocaleError
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 57
diff changeset
31 from babel.messages.catalog import Catalog
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
32 from babel.messages.extract import extract_from_dir, DEFAULT_KEYWORDS, \
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
33 DEFAULT_MAPPING
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
34 from babel.messages.mofile import write_mo
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
35 from babel.messages.pofile import read_po, write_po
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
36 from babel.messages.plurals import PLURALS
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
37 from babel.util import odict, LOCALTZ
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
38
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
39 __all__ = ['CommandLineInterface', 'extract_messages',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
40 'check_message_extractors', 'main']
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
41 __docformat__ = 'restructuredtext en'
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
42
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
43
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
44 class compile_catalog(Command):
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
45 """Catalog compilation command for use in ``setup.py`` scripts.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
46
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
47 If correctly installed, this command is available to Setuptools-using
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
48 setup scripts automatically. For projects using plain old ``distutils``,
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
49 the command needs to be registered explicitly in ``setup.py``::
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
50
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
51 from babel.messages.frontend import compile_catalog
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
52
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
53 setup(
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
54 ...
171
d8106be26e52 Typo fix.
palgarvio
parents: 167
diff changeset
55 cmdclass = {'compile_catalog': compile_catalog}
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
56 )
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
57
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
58 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
59 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
60 """
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
61
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
62 description = 'compile a catalog to a binary MO file'
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
63 user_options = [
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
64 ('domain=', 'D',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
65 "domain of PO file (default 'messages')"),
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
66 ('directory=', 'd',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
67 'path to base directory containing the catalogs'),
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
68 ('input-file=', 'i',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
69 'name of the input file'),
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
70 ('output-file=', 'o',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
71 "name of the output file (default "
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
72 "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"),
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
73 ('locale=', 'l',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
74 'locale of the catalog to compile'),
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
75 ('use-fuzzy', 'f',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
76 'also include fuzzy translations'),
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
77 ]
172
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
78 boolean_options = ['use-fuzzy', 'compile-all']
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
79
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
80 def initialize_options(self):
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
81 self.domain = 'messages'
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
82 self.directory = None
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
83 self.input_file = None
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
84 self.output_file = None
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
85 self.locale = None
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
86 self.use_fuzzy = False
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
87
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
88 def finalize_options(self):
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
89 if not self.input_file and not self.directory:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
90 raise DistutilsOptionError('you must specify either the input file '
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
91 'or the base directory')
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
92 if not self.output_file and not self.directory:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
93 raise DistutilsOptionError('you must specify either the input file '
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
94 'or the base directory')
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
95
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
96 def run(self):
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
97 po_files = []
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
98 mo_files = []
177
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 172
diff changeset
99
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
100 if not self.input_file:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
101 if self.locale:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
102 po_files.append(os.path.join(self.directory, self.locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
103 'LC_MESSAGES',
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
104 self.domain + '.po'))
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
105 mo_files.append(os.path.join(self.directory, self.locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
106 'LC_MESSAGES',
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
107 self.domain + '.mo'))
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
108 else:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
109 for locale in os.listdir(self.directory):
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
110 po_file = os.path.join(self.directory, locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
111 'LC_MESSAGES', self.domain + '.po')
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
112 if os.path.exists(po_file):
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
113 po_files.append(po_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
114 mo_files.append(os.path.join(self.directory, locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
115 'LC_MESSAGES',
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
116 self.domain + '.mo'))
172
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
117 else:
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
118 po_files.append(self.output_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
119 if self.output_file:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
120 mo_files.append(self.output_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
121 else:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
122 mo_files.append(os.path.join(self.directory, locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
123 'LC_MESSAGES',
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
124 self.domain + '.mo'))
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
125
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
126 for idx, po_file in enumerate(po_files):
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
127 mo_file = mo_files[idx]
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
128 infile = open(po_file, 'r')
172
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
129 try:
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
130 catalog = read_po(infile)
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
131 finally:
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
132 infile.close()
177
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 172
diff changeset
133
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
134 if catalog.fuzzy and not self.use_fuzzy:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
135 print 'catalog %r is marked as fuzzy, skipping' % (po_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
136 continue
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
137
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
138 print 'compiling catalog %r to %r' % (po_file, mo_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
139
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
140 outfile = open(mo_file, 'w')
172
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
141 try:
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
142 write_mo(outfile, catalog, use_fuzzy=self.use_fuzzy)
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
143 finally:
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
144 outfile.close()
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
145
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
146
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
147 class extract_messages(Command):
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
148 """Message extraction command for use in ``setup.py`` scripts.
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
149
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
150 If correctly installed, this command is available to Setuptools-using
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
151 setup scripts automatically. For projects using plain old ``distutils``,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
152 the command needs to be registered explicitly in ``setup.py``::
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
153
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
154 from babel.messages.frontend import extract_messages
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
155
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
156 setup(
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
157 ...
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
158 cmdclass = {'extract_messages': extract_messages}
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
159 )
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
160
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
161 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
162 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
163 """
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
164
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
165 description = 'extract localizable strings from the project code'
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
166 user_options = [
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
167 ('charset=', None,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
168 'charset to use in the output file'),
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
169 ('keywords=', 'k',
12
0ce673c24cb1 Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents: 9
diff changeset
170 'space-separated list of keywords to look for in addition to the '
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
171 'defaults'),
12
0ce673c24cb1 Both Babel's [source:trunk/babel/catalog/frontend.py frontend] and [source:trunk/babel/catalog/extract.py extract] now handle keyword indices. Also added an extra boolean flag so that the default keywords defined by Babel are not included in the keywords to search for when extracting strings.
palgarvio
parents: 9
diff changeset
172 ('no-default-keywords', None,
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
173 'do not include the default keywords'),
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
174 ('mapping-file=', 'F',
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
175 'path to the mapping configuration file'),
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
176 ('no-location', None,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
177 'do not include location comments with filename and line number'),
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
178 ('omit-header', None,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
179 'do not include msgid "" entry in header'),
7
8d7b3077e6d1 * The creation-date header in generated PO files now includes the timezone offset.
cmlenz
parents: 3
diff changeset
180 ('output-file=', 'o',
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
181 'name of the output file'),
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
182 ('width=', 'w',
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
183 'set output line width (default 76)'),
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
184 ('no-wrap', None,
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
185 'do not break long message lines, longer than the output line width, '
60
341d04297f24 Fix typo in [58].
cmlenz
parents: 59
diff changeset
186 'into several lines'),
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
187 ('sort-output', None,
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
188 'generate sorted output (default False)'),
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
189 ('sort-by-file', None,
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
190 'sort output by file location (default False)'),
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
191 ('msgid-bugs-address=', None,
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
192 'set report address for msgid'),
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
193 ('copyright-holder=', None,
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
194 'set copyright holder in output'),
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
195 ('add-comments=', 'c',
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
196 'place comment block with TAG (or those preceding keyword lines) in '
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
197 'output file. Seperate multiple TAGs with commas(,)'),
61
477cf09c22e5 Fix 2nd typo of [58].
palgarvio
parents: 60
diff changeset
198 ('input-dirs=', None,
59
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
199 'directories that should be scanned for messages'),
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
200 ]
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
201 boolean_options = [
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
202 'no-default-keywords', 'no-location', 'omit-header', 'no-wrap',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
203 'sort-output', 'sort-by-file'
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
204 ]
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
205
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
206 def initialize_options(self):
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
207 self.charset = 'utf-8'
119
c84f629da9de Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents: 114
diff changeset
208 self.keywords = ''
c84f629da9de Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents: 114
diff changeset
209 self._keywords = DEFAULT_KEYWORDS.copy()
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
210 self.no_default_keywords = False
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
211 self.mapping_file = None
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
212 self.no_location = False
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
213 self.omit_header = False
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
214 self.output_file = None
59
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
215 self.input_dirs = None
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
216 self.width = 76
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
217 self.no_wrap = False
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
218 self.sort_output = False
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
219 self.sort_by_file = False
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
220 self.msgid_bugs_address = None
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
221 self.copyright_holder = None
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
222 self.add_comments = None
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
223 self._add_comments = []
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
224
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
225 def finalize_options(self):
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
226 if self.no_default_keywords and not self.keywords:
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
227 raise DistutilsOptionError('you must specify new keywords if you '
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
228 'disable the default ones')
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
229 if self.no_default_keywords:
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
230 self._keywords = {}
119
c84f629da9de Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents: 114
diff changeset
231 if self.keywords:
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
232 self._keywords.update(parse_keywords(self.keywords.split()))
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
233
119
c84f629da9de Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents: 114
diff changeset
234 if not self.output_file:
c84f629da9de Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents: 114
diff changeset
235 raise DistutilsOptionError('no output file specified')
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
236 if self.no_wrap and self.width:
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
237 raise DistutilsOptionError("'--no-wrap' and '--width' are mutually "
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
238 "exclusive")
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
239 if self.no_wrap:
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
240 self.width = None
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
241 else:
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
242 self.width = int(self.width)
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
243
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
244 if self.sort_output and self.sort_by_file:
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
245 raise DistutilsOptionError("'--sort-output' and '--sort-by-file' "
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
246 "are mutually exclusive")
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
247
59
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
248 if not self.input_dirs:
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
249 self.input_dirs = dict.fromkeys([k.split('.',1)[0]
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
250 for k in self.distribution.packages
59
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
251 ]).keys()
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
252
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
253 if self.add_comments:
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
254 self._add_comments = self.add_comments.split(',')
59
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
255
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
256 def run(self):
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
257 mappings = self._get_mappings()
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
258 outfile = open(self.output_file, 'w')
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
259 try:
104
57d2f21a1fcc Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents: 97
diff changeset
260 catalog = Catalog(project=self.distribution.get_name(),
57d2f21a1fcc Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents: 97
diff changeset
261 version=self.distribution.get_version(),
57d2f21a1fcc Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents: 97
diff changeset
262 msgid_bugs_address=self.msgid_bugs_address,
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
263 copyright_holder=self.copyright_holder,
104
57d2f21a1fcc Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents: 97
diff changeset
264 charset=self.charset)
57d2f21a1fcc Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents: 97
diff changeset
265
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
266 for dirname, (method_map, options_map) in mappings.items():
59
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
267 def callback(filename, method, options):
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
268 if method == 'ignore':
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
269 return
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
270 filepath = os.path.normpath(os.path.join(dirname, filename))
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
271 optstr = ''
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
272 if options:
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
273 optstr = ' (%s)' % ', '.join(['%s="%s"' % (k, v) for
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
274 k, v in options.items()])
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
275 log.info('extracting messages from %s%s'
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
276 % (filepath, optstr))
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
277
59
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
278 extracted = extract_from_dir(dirname, method_map, options_map,
119
c84f629da9de Made new frontend tests more ''unit-y'', i.e. calling the APIs directly instead of launching the scripts.
cmlenz
parents: 114
diff changeset
279 keywords=self._keywords,
86
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
280 comment_tags=self._add_comments,
59
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
281 callback=callback)
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
282 for filename, lineno, message, comments in extracted:
59
e68fd956ebce * The `extract_messages` distutils command now operators on configurable input directories again, instead of the complete current directory. The `input_dirs` default to the package directories.
cmlenz
parents: 58
diff changeset
283 filepath = os.path.normpath(os.path.join(dirname, filename))
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
284 catalog.add(message, None, [(filepath, lineno)],
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
285 auto_comments=comments)
26
93eaa2f4a0a2 Reimplement line wrapping for PO writing (as the `textwrap` module is too destructive with white space) and move it to the `normalize` function (which was already doing some handling of line breaks).
cmlenz
parents: 25
diff changeset
286
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
287 log.info('writing PO template file to %s' % self.output_file)
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
288 write_po(outfile, catalog, width=self.width,
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
289 no_location=self.no_location,
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
290 omit_header=self.omit_header,
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
291 sort_output=self.sort_output,
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
292 sort_by_file=self.sort_by_file)
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
293 finally:
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
294 outfile.close()
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
295
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
296 def _get_mappings(self):
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
297 mappings = {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
298
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
299 if self.mapping_file:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
300 fileobj = open(self.mapping_file, 'U')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
301 try:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
302 method_map, options_map = parse_mapping(fileobj)
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
303 for dirname in self.input_dirs:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
304 mappings[dirname] = method_map, options_map
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
305 finally:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
306 fileobj.close()
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
307
125
0053443e7cb2 Make the check for the `message_extractors` setup keyword more robst.
cmlenz
parents: 122
diff changeset
308 elif getattr(self.distribution, 'message_extractors', None):
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
309 message_extractors = self.distribution.message_extractors
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
310 for dirname, mapping in message_extractors.items():
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
311 if isinstance(mapping, basestring):
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
312 method_map, options_map = parse_mapping(StringIO(mapping))
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
313 else:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
314 method_map, options_map = [], {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
315 for pattern, method, options in mapping:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
316 method_map.append((pattern, method))
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
317 options_map[pattern] = options or {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
318 mappings[dirname] = method_map, options_map
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
319
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
320 else:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
321 for dirname in self.input_dirs:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
322 mappings[dirname] = DEFAULT_MAPPING, {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
323
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
324 return mappings
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
325
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
326
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
327 def check_message_extractors(dist, name, value):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
328 """Validate the ``message_extractors`` keyword argument to ``setup()``.
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
329
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
330 :param dist: the distutils/setuptools ``Distribution`` object
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
331 :param name: the name of the keyword argument (should always be
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
332 "message_extractors")
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
333 :param value: the value of the keyword argument
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
334 :raise `DistutilsSetupError`: if the value is not valid
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
335 :see: `Adding setup() arguments
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
336 <http://peak.telecommunity.com/DevCenter/setuptools#adding-setup-arguments>`_
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
337 """
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
338 assert name == 'message_extractors'
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
339 if not isinstance(value, dict):
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
340 raise DistutilsSetupError('the value of the "message_extractors" '
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
341 'parameter must be a dictionary')
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
342
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
343
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
344 class new_catalog(Command):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
345 """New catalog command for use in ``setup.py`` scripts.
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
346
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
347 If correctly installed, this command is available to Setuptools-using
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
348 setup scripts automatically. For projects using plain old ``distutils``,
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
349 the command needs to be registered explicitly in ``setup.py``::
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
350
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
351 from babel.messages.frontend import new_catalog
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
352
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
353 setup(
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
354 ...
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
355 cmdclass = {'new_catalog': new_catalog}
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
356 )
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
357
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
358 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
359 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
360 """
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
361
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
362 description = 'create new catalogs based on a catalog template'
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
363 user_options = [
57
e7080996fc46 `new_catalog` now accepts another argument, `--domain`, which is used to build the output file path, which now is of the form `<output_dir>/<locale>/<domain>.po`, the correct form.
palgarvio
parents: 56
diff changeset
364 ('domain=', 'D',
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
365 "domain of PO file (default 'messages')"),
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
366 ('input-file=', 'i',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
367 'name of the input file'),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
368 ('output-dir=', 'd',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
369 'path to output directory'),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
370 ('output-file=', 'o',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
371 "name of the output file (default "
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
372 "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"),
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
373 ('locale=', 'l',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
374 'locale for the new localized catalog'),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
375 ]
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
376
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
377 def initialize_options(self):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
378 self.output_dir = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
379 self.output_file = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
380 self.input_file = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
381 self.locale = None
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
382 self.domain = 'messages'
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
383
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
384 def finalize_options(self):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
385 if not self.input_file:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
386 raise DistutilsOptionError('you must specify the input file')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
387
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
388 if not self.locale:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
389 raise DistutilsOptionError('you must provide a locale for the '
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
390 'new catalog')
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
391 try:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
392 self._locale = Locale.parse(self.locale)
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
393 except UnknownLocaleError, e:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
394 raise DistutilsOptionError(e)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
395
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
396 if not self.output_file and not self.output_dir:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
397 raise DistutilsOptionError('you must specify the output directory')
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
398 if not self.output_file:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
399 self.output_file = os.path.join(self.output_dir, self.locale,
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
400 'LC_MESSAGES', self.domain + '.po')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
401
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
402 if not os.path.exists(os.path.dirname(self.output_file)):
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
403 os.makedirs(os.path.dirname(self.output_file))
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
404
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
405 def run(self):
92
6d1a7777003e Some doc improvements on distutils integration.
cmlenz
parents: 90
diff changeset
406 log.info('creating catalog %r based on %r', self.output_file,
57
e7080996fc46 `new_catalog` now accepts another argument, `--domain`, which is used to build the output file path, which now is of the form `<output_dir>/<locale>/<domain>.po`, the correct form.
palgarvio
parents: 56
diff changeset
407 self.input_file)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
408
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
409 infile = open(self.input_file, 'r')
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
410 try:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
411 catalog = read_po(infile)
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
412 finally:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
413 infile.close()
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
414
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
415 catalog.locale = self._locale
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
416
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
417 outfile = open(self.output_file, 'w')
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
418 try:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
419 write_po(outfile, catalog)
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
420 finally:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
421 outfile.close()
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
422
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
423
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
424 class CommandLineInterface(object):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
425 """Command-line interface.
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
426
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
427 This class provides a simple command-line interface to the message
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
428 extraction and PO file generation functionality.
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
429 """
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
430
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
431 usage = '%%prog %s [options] %s'
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
432 version = '%%prog %s' % VERSION
163
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
433 commands = {
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
434 'compile': 'compile message catalogs to MO files',
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
435 'extract': 'extract messages from source files and generate a POT file',
167
533baef258bb Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents: 163
diff changeset
436 'init': 'create new message catalogs from a template',
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
437 }
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
438
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
439 def run(self, argv=sys.argv):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
440 """Main entry point of the command-line interface.
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
441
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
442 :param argv: list of arguments passed on the command-line
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
443 """
129
d6aef0675953 Add a couple of CLI tests.
cmlenz
parents: 125
diff changeset
444 self.parser = OptionParser(usage=self.usage % ('command', '[args]'),
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
445 version=self.version)
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
446 self.parser.disable_interspersed_args()
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
447 self.parser.print_help = self._help
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
448 options, args = self.parser.parse_args(argv[1:])
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
449 if not args:
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
450 self.parser.error('incorrect number of arguments')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
451
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
452 cmdname = args[0]
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
453 if cmdname not in self.commands:
129
d6aef0675953 Add a couple of CLI tests.
cmlenz
parents: 125
diff changeset
454 self.parser.error('unknown command "%s"' % cmdname)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
455
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
456 getattr(self, cmdname)(args[1:])
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
457
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
458 def _help(self):
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
459 print self.parser.format_help()
129
d6aef0675953 Add a couple of CLI tests.
cmlenz
parents: 125
diff changeset
460 print "commands:"
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
461 longest = max([len(command) for command in self.commands])
129
d6aef0675953 Add a couple of CLI tests.
cmlenz
parents: 125
diff changeset
462 format = " %%-%ds %%s" % max(11, longest)
163
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
463 commands = self.commands.items()
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
464 commands.sort()
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
465 for name, description in commands:
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
466 print format % (name, description)
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
467
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
468 def compile(self, argv):
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
469 """Subcommand for compiling a message catalog to a MO file.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
470
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
471 :param argv: the command arguments
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
472 """
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
473 parser = OptionParser(usage=self.usage % ('compile', ''),
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
474 description=self.commands['compile'])
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
475 parser.add_option('--domain', '-D', dest='domain',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
476 help="domain of MO and PO files (default '%default')")
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
477 parser.add_option('--directory', '-d', dest='directory',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
478 metavar='DIR', help='base directory of catalog files')
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
479 parser.add_option('--locale', '-l', dest='locale', metavar='LOCALE',
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
480 help='locale of the catalog')
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
481 parser.add_option('--input-file', '-i', dest='input_file',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
482 metavar='FILE', help='name of the input file')
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
483 parser.add_option('--output-file', '-o', dest='output_file',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
484 metavar='FILE',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
485 help="name of the output file (default "
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
486 "'<output_dir>/<locale>/LC_MESSAGES/"
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
487 "<domain>.mo')")
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
488 parser.add_option('--use-fuzzy', '-f', dest='use_fuzzy',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
489 action='store_true',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
490 help='also include fuzzy translations (default '
172
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
491 '%default)'),
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
492
172
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
493 parser.set_defaults(domain='messages', use_fuzzy=False,
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
494 compile_all=False)
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
495 options, args = parser.parse_args(argv)
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
496
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
497 po_files = []
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
498 mo_files = []
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
499 if not options.input_file:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
500 if not options.directory:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
501 parser.error('you must specify either the input file or the '
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
502 'base directory')
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
503 if options.locale:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
504 po_files.append(os.path.join(options.directory, options.locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
505 'LC_MESSAGES',
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
506 options.domain + '.po'))
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
507 mo_files.append(os.path.join(options.directory, options.locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
508 'LC_MESSAGES',
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
509 options.domain + '.mo'))
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
510 else:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
511 for locale in os.listdir(options.directory):
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
512 po_file = os.path.join(options.directory, locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
513 'LC_MESSAGES', options.domain + '.po')
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
514 if os.path.exists(po_file):
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
515 po_files.append(po_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
516 mo_files.append(os.path.join(options.directory, locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
517 'LC_MESSAGES',
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
518 options.domain + '.mo'))
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
519 else:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
520 po_files.append(options.output_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
521 if options.output_file:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
522 mo_files.append(options.output_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
523 else:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
524 if not options.directory:
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
525 parser.error('you must specify either the input file or '
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
526 'the base directory')
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
527 mo_files.append(os.path.join(options.directory, locale,
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
528 'LC_MESSAGES',
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
529 options.domain + '.mo'))
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
530
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
531 for idx, po_file in enumerate(po_files):
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
532 mo_file = mo_files[idx]
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
533 infile = open(po_file, 'r')
172
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
534 try:
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
535 catalog = read_po(infile)
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
536 finally:
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
537 infile.close()
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
538
177
47f6c31e9a24 Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents: 172
diff changeset
539 if catalog.fuzzy and not options.use_fuzzy:
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
540 print 'catalog %r is marked as fuzzy, skipping' % (po_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
541 continue
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
542
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
543 print 'compiling catalog %r to %r' % (po_file, mo_file)
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
544
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
545 outfile = open(mo_file, 'w')
172
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
546 try:
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
547 write_mo(outfile, catalog, use_fuzzy=options.use_fuzzy)
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
548 finally:
91396d14e0b8 Allow the compile catalog frontends to compile all available locales.
palgarvio
parents: 171
diff changeset
549 outfile.close()
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
550
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
551 def extract(self, argv):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
552 """Subcommand for extracting messages from source files and generating
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
553 a POT file.
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
554
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
555 :param argv: the command arguments
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
556 """
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
557 parser = OptionParser(usage=self.usage % ('extract', 'dir1 <dir2> ...'),
163
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
558 description=self.commands['extract'])
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
559 parser.add_option('--charset', dest='charset',
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
560 help='charset to use in the output (default '
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents: 146
diff changeset
561 '"%default")')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
562 parser.add_option('-k', '--keyword', dest='keywords', action='append',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
563 help='keywords to look for in addition to the '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
564 'defaults. You can specify multiple -k flags on '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
565 'the command line.')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
566 parser.add_option('--no-default-keywords', dest='no_default_keywords',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
567 action='store_true',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
568 help="do not include the default keywords")
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
569 parser.add_option('--mapping', '-F', dest='mapping_file',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
570 help='path to the extraction mapping file')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
571 parser.add_option('--no-location', dest='no_location',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
572 action='store_true',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
573 help='do not include location comments with filename '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
574 'and line number')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
575 parser.add_option('--omit-header', dest='omit_header',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
576 action='store_true',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
577 help='do not include msgid "" entry in header')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
578 parser.add_option('-o', '--output', dest='output',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
579 help='path to the output POT file')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
580 parser.add_option('-w', '--width', dest='width', type='int',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
581 help="set output line width (default %default)")
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
582 parser.add_option('--no-wrap', dest='no_wrap', action = 'store_true',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
583 help='do not break long message lines, longer than '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
584 'the output line width, into several lines')
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
585 parser.add_option('--sort-output', dest='sort_output',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
586 action='store_true',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
587 help='generate sorted output (default False)')
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
588 parser.add_option('--sort-by-file', dest='sort_by_file',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
589 action='store_true',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
590 help='sort output by file location (default False)')
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
591 parser.add_option('--msgid-bugs-address', dest='msgid_bugs_address',
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
592 metavar='EMAIL@ADDRESS',
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 73
diff changeset
593 help='set report address for msgid')
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
594 parser.add_option('--copyright-holder', dest='copyright_holder',
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
595 help='set copyright holder in output')
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
596 parser.add_option('--add-comments', '-c', dest='comment_tags',
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
597 metavar='TAG', action='append',
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
598 help='place comment block with TAG (or those '
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
599 'preceding keyword lines) in output file. One '
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
600 'TAG per argument call')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
601
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
602 parser.set_defaults(charset='utf-8', keywords=[],
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
603 no_default_keywords=False, no_location=False,
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
604 omit_header = False, width=76, no_wrap=False,
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
605 sort_output=False, sort_by_file=False,
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
606 comment_tags=[])
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
607 options, args = parser.parse_args(argv)
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
608 if not args:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
609 parser.error('incorrect number of arguments')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
610
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
611 if options.output not in (None, '-'):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
612 outfile = open(options.output, 'w')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
613 else:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
614 outfile = sys.stdout
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
615
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
616 keywords = DEFAULT_KEYWORDS.copy()
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
617 if options.no_default_keywords:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
618 if not options.keywords:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
619 parser.error('you must specify new keywords if you disable the '
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
620 'default ones')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
621 keywords = {}
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
622 if options.keywords:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
623 keywords.update(parse_keywords(options.keywords))
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
624
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
625 if options.mapping_file:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
626 fileobj = open(options.mapping_file, 'U')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
627 try:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
628 method_map, options_map = parse_mapping(fileobj)
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
629 finally:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
630 fileobj.close()
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
631 else:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
632 method_map = DEFAULT_MAPPING
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
633 options_map = {}
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
634
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
635 if options.width and options.no_wrap:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
636 parser.error("'--no-wrap' and '--width' are mutually exclusive.")
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
637 elif not options.width and not options.no_wrap:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
638 options.width = 76
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
639 elif not options.width and options.no_wrap:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
640 options.width = 0
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
641
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
642 if options.sort_output and options.sort_by_file:
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
643 parser.error("'--sort-output' and '--sort-by-file' are mutually "
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
644 "exclusive")
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
645
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
646 try:
104
57d2f21a1fcc Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents: 97
diff changeset
647 catalog = Catalog(msgid_bugs_address=options.msgid_bugs_address,
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
648 copyright_holder=options.copyright_holder,
104
57d2f21a1fcc Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents: 97
diff changeset
649 charset=options.charset)
57d2f21a1fcc Project name and version, and the charset are available via the `Catalog` object, and do not need to be passed to `write_pot()`.
cmlenz
parents: 97
diff changeset
650
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
651 for dirname in args:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
652 if not os.path.isdir(dirname):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
653 parser.error('%r is not a directory' % dirname)
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
654 extracted = extract_from_dir(dirname, method_map, options_map,
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
655 keywords, options.comment_tags)
82
f421e5576d26 Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents: 81
diff changeset
656 for filename, lineno, message, comments in extracted:
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
657 filepath = os.path.normpath(os.path.join(dirname, filename))
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
658 catalog.add(message, None, [(filepath, lineno)],
112
5cafc4203de1 fixed old comments kwarg to auto_comments
pjenvey
parents: 107
diff changeset
659 auto_comments=comments)
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents: 57
diff changeset
660
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
661 write_po(outfile, catalog, width=options.width,
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
662 no_location=options.no_location,
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
663 omit_header=options.omit_header,
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
664 sort_output=options.sort_output,
114
eeed857fa3d5 copyright_holder arg is no longer needed for write_po
pjenvey
parents: 112
diff changeset
665 sort_by_file=options.sort_by_file)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
666 finally:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
667 if options.output:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
668 outfile.close()
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
669
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
670 def init(self, argv):
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
671 """Subcommand for creating new message catalogs from a template.
179
6138ea7ef7a8 * Instead of an extra `compile-all` option on the `compile` (or `compile_catalog`) command, compilation of all catalogs is performed when neither an `input_file` nor a `locale` is specified.
cmlenz
parents: 178
diff changeset
672
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
673 :param argv: the command arguments
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
674 """
167
533baef258bb Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents: 163
diff changeset
675 parser = OptionParser(usage=self.usage % ('init', ''),
163
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
676 description=self.commands['init'])
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
677 parser.add_option('--domain', '-D', dest='domain',
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
678 help="domain of PO file (default '%default')")
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
679 parser.add_option('--input-file', '-i', dest='input_file',
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
680 metavar='FILE', help='name of the input file')
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
681 parser.add_option('--output-dir', '-d', dest='output_dir',
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
682 metavar='DIR', help='path to output directory')
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
683 parser.add_option('--output-file', '-o', dest='output_file',
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
684 metavar='FILE',
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
685 help="name of the output file (default "
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
686 "'<output_dir>/<locale>/LC_MESSAGES/"
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
687 "<domain>.po')")
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
688 parser.add_option('--locale', '-l', dest='locale', metavar='LOCALE',
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
689 help='locale for the new localized catalog')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
690
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
691 parser.set_defaults(domain='messages')
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
692 options, args = parser.parse_args(argv)
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
693
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
694 if not options.locale:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
695 parser.error('you must provide a locale for the new catalog')
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
696 try:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
697 locale = Locale.parse(options.locale)
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
698 except UnknownLocaleError, e:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
699 parser.error(e)
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
700
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
701 if not options.input_file:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
702 parser.error('you must specify the input file')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
703
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
704 if not options.output_file and not options.output_dir:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
705 parser.error('you must specify the output file or directory')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
706
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
707 if not options.output_file:
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
708 options.output_file = os.path.join(options.output_dir,
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
709 options.locale, 'LC_MESSAGES',
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
710 options.domain + '.po')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
711 if not os.path.exists(os.path.dirname(options.output_file)):
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
712 os.makedirs(os.path.dirname(options.output_file))
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
713
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
714 infile = open(options.input_file, 'r')
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
715 try:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
716 catalog = read_po(infile)
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
717 finally:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
718 infile.close()
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
719
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
720 catalog.locale = locale
134
71211d69626e Set explicit local timezone for CLI `init` command.
cmlenz
parents: 129
diff changeset
721 catalog.revision_date = datetime.now(LOCALTZ)
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
722
92
6d1a7777003e Some doc improvements on distutils integration.
cmlenz
parents: 90
diff changeset
723 print 'creating catalog %r based on %r' % (options.output_file,
6d1a7777003e Some doc improvements on distutils integration.
cmlenz
parents: 90
diff changeset
724 options.input_file)
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
725
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
726 outfile = open(options.output_file, 'w')
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
727 try:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
728 write_po(outfile, catalog)
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
729 finally:
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
730 outfile.close()
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
731
167
533baef258bb Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents: 163
diff changeset
732
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
733 def main():
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
734 CommandLineInterface().run(sys.argv)
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
735
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
736 def parse_mapping(fileobj, filename=None):
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
737 """Parse an extraction method mapping from a file-like object.
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
738
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
739 >>> buf = StringIO('''
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
740 ... # Python source files
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
741 ... [python: **.py]
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
742 ...
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
743 ... # Genshi templates
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
744 ... [genshi: **/templates/**.html]
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
745 ... include_attrs =
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
746 ... [genshi: **/templates/**.txt]
146
24b5de939850 Some doc fixes.
cmlenz
parents: 134
diff changeset
747 ... template_class = genshi.template:TextTemplate
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
748 ... encoding = latin-1
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
749 ... ''')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
750
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
751 >>> method_map, options_map = parse_mapping(buf)
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
752
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
753 >>> method_map[0]
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
754 ('**.py', 'python')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
755 >>> options_map['**.py']
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
756 {}
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
757 >>> method_map[1]
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
758 ('**/templates/**.html', 'genshi')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
759 >>> options_map['**/templates/**.html']['include_attrs']
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
760 ''
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
761 >>> method_map[2]
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
762 ('**/templates/**.txt', 'genshi')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
763 >>> options_map['**/templates/**.txt']['template_class']
146
24b5de939850 Some doc fixes.
cmlenz
parents: 134
diff changeset
764 'genshi.template:TextTemplate'
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
765 >>> options_map['**/templates/**.txt']['encoding']
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
766 'latin-1'
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
767
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
768 :param fileobj: a readable file-like object containing the configuration
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
769 text to parse
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
770 :return: a `(method_map, options_map)` tuple
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
771 :rtype: `tuple`
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
772 :see: `extract_from_directory`
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
773 """
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
774 method_map = []
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
775 options_map = {}
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
776
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
777 parser = RawConfigParser()
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
778 parser._sections = odict(parser._sections) # We need ordered sections
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
779 parser.readfp(fileobj, filename)
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
780 for section in parser.sections():
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
781 method, pattern = [part.strip() for part in section.split(':', 1)]
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
782 method_map.append((pattern, method))
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
783 options_map[pattern] = dict(parser.items(section))
49
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
784
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
785 return (method_map, options_map)
9979a409589e Support passing extraction method mapping and options from the frontends (see #4). No distutils/setuptools keyword supported yet, but the rest seems to be working okay.
cmlenz
parents: 26
diff changeset
786
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
787 def parse_keywords(strings=[]):
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
788 """Parse keywords specifications from the given list of strings.
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
789
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
790 >>> kw = parse_keywords(['_', 'dgettext:2', 'dngettext:2,3'])
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
791 >>> for keyword, indices in sorted(kw.items()):
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
792 ... print (keyword, indices)
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
793 ('_', None)
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
794 ('dgettext', (2,))
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
795 ('dngettext', (2, 3))
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
796 """
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
797 keywords = {}
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
798 for string in strings:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
799 if ':' in string:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
800 funcname, indices = string.split(':')
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
801 else:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
802 funcname, indices = string, None
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
803 if funcname not in keywords:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
804 if indices:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
805 indices = tuple([(int(x)) for x in indices.split(',')])
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
806 keywords[funcname] = indices
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
807 return keywords
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
808
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
809
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
810 if __name__ == '__main__':
57
e7080996fc46 `new_catalog` now accepts another argument, `--domain`, which is used to build the output file path, which now is of the form `<output_dir>/<locale>/<domain>.po`, the correct form.
palgarvio
parents: 56
diff changeset
811 main()
Copyright (C) 2012-2017 Edgewall Software