annotate babel/messages/frontend.py @ 122:03f106700f02

Added tests for `new_catalog` distutils command.
author cmlenz
date Fri, 15 Jun 2007 22:18:59 +0000
parents c84f629da9de
children 0053443e7cb2
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
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
34 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
35 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
36 from babel.util import odict, LOCALTZ
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
37
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
38 __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
39 'check_message_extractors', 'main']
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
40 __docformat__ = 'restructuredtext en'
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
41
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
42
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
43 class extract_messages(Command):
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
44 """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
45
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
46 If correctly installed, this command is available to Setuptools-using
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
47 setup scripts automatically. For projects using plain old ``distutils``,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
48 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
49
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
50 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
51
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
52 setup(
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
53 ...
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
54 cmdclass = {'extract_messages': extract_messages}
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
55 )
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
56
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
57 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
58 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
59 """
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
60
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
61 description = 'extract localizable strings from the project code'
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
62 user_options = [
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
63 ('charset=', None,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
64 'charset to use in the output file'),
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
65 ('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
66 'space-separated list of keywords to look for in addition to the '
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
67 '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
68 ('no-default-keywords', None,
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
69 '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
70 ('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
71 'path to the mapping configuration file'),
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
72 ('no-location', None,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
73 'do not include location comments with filename and line number'),
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
74 ('omit-header', None,
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
75 '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
76 ('output-file=', 'o',
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
77 'name of the output file'),
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
78 ('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
79 'set output line width (default 76)'),
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
80 ('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
81 'do not break long message lines, longer than the output line width, '
60
341d04297f24 Fix typo in [58].
cmlenz
parents: 59
diff changeset
82 'into several lines'),
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
83 ('sort-output', None,
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
84 'generate sorted output (default False)'),
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
85 ('sort-by-file', None,
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
86 '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
87 ('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
88 'set report address for msgid'),
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
89 ('copyright-holder=', None,
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
90 '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
91 ('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
92 '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
93 'output file. Seperate multiple TAGs with commas(,)'),
61
477cf09c22e5 Fix 2nd typo of [58].
palgarvio
parents: 60
diff changeset
94 ('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
95 'directories that should be scanned for messages'),
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
96 ]
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
97 boolean_options = [
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
98 'no-default-keywords', 'no-location', 'omit-header', 'no-wrap',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
99 'sort-output', 'sort-by-file'
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
100 ]
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
101
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
102 def initialize_options(self):
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
103 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
104 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
105 self._keywords = DEFAULT_KEYWORDS.copy()
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
106 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
107 self.mapping_file = None
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
108 self.no_location = False
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
109 self.omit_header = False
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
110 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
111 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
112 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
113 self.no_wrap = False
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
114 self.sort_output = False
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
115 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
116 self.msgid_bugs_address = None
81
51f73a110a84 Implemented item 4 from #12. Set the copyright holder in the output.
palgarvio
parents: 80
diff changeset
117 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
118 self.add_comments = None
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
119 self._add_comments = []
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
120
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
121 def finalize_options(self):
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
122 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
123 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
124 'disable the default ones')
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
125 if self.no_default_keywords:
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
126 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
127 if self.keywords:
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
128 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
129
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
130 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
131 raise DistutilsOptionError('no output file specified')
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
132 if self.no_wrap and self.width:
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
133 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
134 "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
135 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
136 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
137 else:
25
ee33990f6e83 Added line-wrap support for `write_po`.
palgarvio
parents: 14
diff changeset
138 self.width = int(self.width)
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
139
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
140 if self.sort_output and self.sort_by_file:
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
141 raise DistutilsOptionError("'--sort-output' and '--sort-by-file' "
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
142 "are mutually exclusive")
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
143
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
144 if not self.input_dirs:
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
145 self.input_dirs = dict.fromkeys([k.split('.',1)[0]
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
146 for k in self.distribution.packages
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
147 ]).keys()
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
148
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
149 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
150 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
151
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
152 def run(self):
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
153 mappings = self._get_mappings()
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
154 outfile = open(self.output_file, 'w')
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
155 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
156 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
157 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
158 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
159 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
160 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
161
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
162 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
163 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
164 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
165 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
166 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
167 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
168 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
169 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
170 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
171 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
172 % (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
173
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
174 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
175 keywords=self._keywords,
86
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
176 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
177 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
178 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
179 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
180 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
181 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
182
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
183 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
184 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
185 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
186 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
187 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
188 sort_by_file=self.sort_by_file)
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
189 finally:
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
190 outfile.close()
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
191
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
192 def _get_mappings(self):
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
193 mappings = {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
194
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
195 if self.mapping_file:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
196 fileobj = open(self.mapping_file, 'U')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
197 try:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
198 method_map, options_map = parse_mapping(fileobj)
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
199 for dirname in self.input_dirs:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
200 mappings[dirname] = method_map, options_map
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
201 finally:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
202 fileobj.close()
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
203
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
204 elif self.distribution.message_extractors:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
205 message_extractors = self.distribution.message_extractors
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
206 for dirname, mapping in message_extractors.items():
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
207 if isinstance(mapping, basestring):
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
208 method_map, options_map = parse_mapping(StringIO(mapping))
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
209 else:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
210 method_map, options_map = [], {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
211 for pattern, method, options in mapping:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
212 method_map.append((pattern, method))
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
213 options_map[pattern] = options or {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
214 mappings[dirname] = method_map, options_map
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
215
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
216 else:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
217 for dirname in self.input_dirs:
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
218 mappings[dirname] = DEFAULT_MAPPING, {}
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
219
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
220 return mappings
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
221
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
222
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
223 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
224 """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
225
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
226 :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
227 :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
228 "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
229 :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
230 :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
231 :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
232 <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
233 """
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
234 assert name == 'message_extractors'
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
235 if not isinstance(value, dict):
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
236 raise DistutilsSetupError('the value of the "message_extractors" '
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
237 'parameter must be a dictionary')
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
238
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
239
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
240 class new_catalog(Command):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
241 """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
242
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
243 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
244 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
245 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
246
56
27d55a07c897 Rename the `babel.catalog` package to `babel.messages` for consistency with the other package names.
cmlenz
parents: 54
diff changeset
247 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
248
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
249 setup(
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
250 ...
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
251 cmdclass = {'new_catalog': new_catalog}
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
252 )
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
253
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
254 :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
255 :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
256 """
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
257
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
258 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
259 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
260 ('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
261 "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
262 ('input-file=', 'i',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
263 'name of the input file'),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
264 ('output-dir=', 'd',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
265 'path to output directory'),
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
266 ('output-file=', 'o',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
267 "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
268 "'<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
269 ('locale=', 'l',
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
270 '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
271 ]
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
272
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
273 def initialize_options(self):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
274 self.output_dir = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
275 self.output_file = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
276 self.input_file = None
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
277 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
278 self.domain = 'messages'
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
279
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
280 def finalize_options(self):
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
281 if not self.input_file:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
282 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
283
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
284 if not self.locale:
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
285 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
286 '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
287 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
288 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
289 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
290 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
291
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
292 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
293 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
294 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
295 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
296 '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
297
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
298 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
299 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
300
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
301 def run(self):
92
6d1a7777003e Some doc improvements on distutils integration.
cmlenz
parents: 90
diff changeset
302 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
303 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
304
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
305 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
306 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
307 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
308 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
309 infile.close()
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
310
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
311 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
312
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
313 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
314 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
315 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
316 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
317 outfile.close()
53
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
318
52dbebdd3789 Fixed a bug regarding plural msgid's handling when writing the `.pot` file.
palgarvio
parents: 51
diff changeset
319
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
320 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
321 """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
322
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
323 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
324 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
325 """
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
326
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
327 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
328 version = '%%prog %s' % VERSION
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
329 commands = ['extract', 'init']
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
330 command_descriptions = {
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
331 'extract': 'extract messages from source files and generate a POT file',
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
332 'init': 'create new message catalogs from a template'
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
333 }
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
334
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
335 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
336 """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
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 :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
339 """
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
340 self.parser = OptionParser(usage=self.usage % ('subcommand', '[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
341 version=self.version)
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
342 self.parser.disable_interspersed_args()
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
343 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
344 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
345 if not args:
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
346 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
347
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
348 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
349 if cmdname not in self.commands:
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
350 self.parser.error('unknown subcommand "%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
351
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
352 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
353
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
354 def _help(self):
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
355 print self.parser.format_help()
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
356 print "Subcommands:"
65
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
357 longest = max([len(command) for command in self.commands])
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
358 format = " %" + str(longest) + "s %s"
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
359 self.commands.sort()
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
360 for command in self.commands:
b7b61e0fd23e Added the available commands list to the `--help` output of Babel's binary.
palgarvio
parents: 64
diff changeset
361 print format % (command, self.command_descriptions[command])
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
362
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
363 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
364 """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
365 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
366
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
367 :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
368 """
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
369 parser = OptionParser(usage=self.usage % ('extract', 'dir1 <dir2> ...'),
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
370 description=self.command_descriptions['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
371 parser.add_option('--charset', dest='charset',
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
372 help='charset to use in the output')
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
373 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
374 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
375 '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
376 '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
377 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
378 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
379 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
380 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
381 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
382 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
383 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
384 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
385 '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
386 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
387 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
388 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
389 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
390 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
391 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
392 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
393 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
394 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
395 'the output line width, into several lines')
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
396 parser.add_option('--sort-output', dest='sort_output',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
397 action='store_true',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
398 help='generate sorted output (default False)')
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
399 parser.add_option('--sort-by-file', dest='sort_by_file',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
400 action='store_true',
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
401 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
402 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
403 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
404 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
405 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
406 help='set copyright holder in output')
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 92
diff changeset
407 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
408 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
409 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
410 '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
411 '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
412
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
413 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
414 no_default_keywords=False, no_location=False,
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
415 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
416 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
417 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
418 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
419 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
420 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
421
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
422 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
423 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
424 else:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
425 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
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 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
428 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
429 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
430 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
431 '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
432 keywords = {}
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
433 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
434 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
435
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
436 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
437 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
438 try:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
439 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
440 finally:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
441 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
442 else:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
443 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
444 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
445
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
446 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
447 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
448 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
449 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
450 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
451 options.width = 0
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
452
73
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
453 if options.sort_output and options.sort_by_file:
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
454 parser.error("'--sort-output' and '--sort-by-file' are mutually "
5d8e87acdcc7 Implemented message sorting, see #7.
palgarvio
parents: 68
diff changeset
455 "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
456
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
457 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
458 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
459 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
460 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
461
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
462 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
463 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
464 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
465 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
466 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
467 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
468 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
469 catalog.add(message, None, [(filepath, lineno)],
112
5cafc4203de1 fixed old comments kwarg to auto_comments
pjenvey
parents: 107
diff changeset
470 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
471
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
472 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
473 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
474 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
475 sort_output=options.sort_output,
114
eeed857fa3d5 copyright_holder arg is no longer needed for write_po
pjenvey
parents: 112
diff changeset
476 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
477 finally:
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
478 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
479 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
480
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
481 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
482 """Subcommand for creating new message catalogs from a template.
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
483
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
484 :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
485 """
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
486 parser = OptionParser(usage=self.usage % ('init',''),
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
487 description=self.command_descriptions['init'])
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
488 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
489 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
490 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
491 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
492 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
493 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
494 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
495 metavar='FILE',
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
496 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
497 "'<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
498 "<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
499 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
500 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
501
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
502 parser.set_defaults(domain='messages')
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
503 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
504
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
505 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
506 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
507 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
508 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
509 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
510 parser.error(e)
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
511
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
512 if not options.input_file:
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
513 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
514
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
515 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
516 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
517
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
518 if not options.output_file:
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
519 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
520 options.locale, 'LC_MESSAGES',
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
521 options.domain + '.po')
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
522 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
523 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
524
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
525 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
526 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
527 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
528 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
529 infile.close()
89
31519c52c0fe Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents: 88
diff changeset
530
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
531 catalog.locale = 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
532 catalog.revision_date = datetime.now()
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
533
92
6d1a7777003e Some doc improvements on distutils integration.
cmlenz
parents: 90
diff changeset
534 print 'creating catalog %r based on %r' % (options.output_file,
6d1a7777003e Some doc improvements on distutils integration.
cmlenz
parents: 90
diff changeset
535 options.input_file)
68
22e30e5a6736 Implemented the `init` subcommand, aka, `new_catalog` for the distutils/setuptools implmentation.
palgarvio
parents: 65
diff changeset
536
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
537 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
538 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
539 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
540 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
541 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
542
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
543 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
544 CommandLineInterface().run(sys.argv)
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
545
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
546 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
547 """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
548
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
549 >>> 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
550 ... # Python source files
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
551 ... [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
552 ...
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
553 ... # Genshi templates
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
554 ... [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
555 ... include_attrs =
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
556 ... [genshi: **/templates/**.txt]
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
557 ... template_class = genshi.template.text.TextTemplate
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
558 ... 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
559 ... ''')
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
560
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
561 >>> 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
562
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
563 >>> method_map[0]
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
564 ('**.py', 'python')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
565 >>> 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
566 {}
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
567 >>> method_map[1]
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
568 ('**/templates/**.html', 'genshi')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
569 >>> 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
570 ''
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
571 >>> method_map[2]
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
572 ('**/templates/**.txt', 'genshi')
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
573 >>> options_map['**/templates/**.txt']['template_class']
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
574 'genshi.template.text.TextTemplate'
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
575 >>> 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
576 '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
577
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
578 :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
579 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
580 :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
581 :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
582 :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
583 """
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
584 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
585 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
586
50
b6497cfd06d6 Move the mapping configuration file format to `ConfigParser`, and add some more documentation about it.
cmlenz
parents: 49
diff changeset
587 parser = RawConfigParser()
64
7eb6fea17864 The order of extraction methods is now preserved (see #10).
cmlenz
parents: 61
diff changeset
588 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
589 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
590 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
591 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
592 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
593 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
594
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
595 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
596
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
597 def parse_keywords(strings=[]):
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
598 """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
599
14
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
600 >>> kw = parse_keywords(['_', 'dgettext:2', 'dngettext:2,3'])
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
601 >>> for keyword, indices in sorted(kw.items()):
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
602 ... print (keyword, indices)
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
603 ('_', None)
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
604 ('dgettext', (2,))
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
605 ('dngettext', (2, 3))
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
606 """
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
607 keywords = {}
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
608 for string in strings:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
609 if ':' in string:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
610 funcname, indices = string.split(':')
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
611 else:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
612 funcname, indices = string, None
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
613 if funcname not in keywords:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
614 if indices:
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
615 indices = tuple([(int(x)) for x in indices.split(',')])
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
616 keywords[funcname] = indices
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
617 return keywords
29ef15a6fd75 * Removed pkg_resources/setuptools requirement from various places.
cmlenz
parents: 12
diff changeset
618
54
cc3c6cfe909d Support sub-commands in command-line interface, and renamed the generated script wrapper to `babel`. See #9.
cmlenz
parents: 53
diff changeset
619
3
e9eaddab598e Import of initial code base.
cmlenz
parents:
diff changeset
620 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
621 main()
Copyright (C) 2012-2017 Edgewall Software