annotate 0.8.x/babel/messages/frontend.py @ 142:4a7af44e6695 stable

Create branch for 0.8.x releases.
author cmlenz
date Wed, 20 Jun 2007 10:09:07 +0000
parents
children 32a242175da5
rev   line source
142
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
1 #!/usr/bin/env python
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
2 # -*- coding: utf-8 -*-
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
3 #
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
4 # Copyright (C) 2007 Edgewall Software
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
5 # All rights reserved.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
6 #
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
7 # This software is licensed as described in the file COPYING, which
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
8 # you should have received as part of this distribution. The terms
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
9 # are also available at http://babel.edgewall.org/wiki/License.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
10 #
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
11 # This software consists of voluntary contributions made by many
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
12 # individuals. For the exact contribution history, see the revision
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
13 # history and logs, available at http://babel.edgewall.org/log/.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
14
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
15 """Frontends for the message extraction functionality."""
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
16
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
17 from ConfigParser import RawConfigParser
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
18 from datetime import datetime
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
19 from distutils import log
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
20 from distutils.cmd import Command
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
21 from distutils.errors import DistutilsOptionError, DistutilsSetupError
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
22 from optparse import OptionParser
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
23 import os
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
24 import re
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
25 from StringIO import StringIO
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
26 import sys
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
27
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
28 from babel import __version__ as VERSION
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
29 from babel import Locale
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
30 from babel.core import UnknownLocaleError
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
31 from babel.messages.catalog import Catalog
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
32 from babel.messages.extract import extract_from_dir, DEFAULT_KEYWORDS, \
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
33 DEFAULT_MAPPING
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
34 from babel.messages.pofile import read_po, write_po
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
35 from babel.messages.plurals import PLURALS
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
36 from babel.util import odict, LOCALTZ
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
37
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
38 __all__ = ['CommandLineInterface', 'extract_messages',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
39 'check_message_extractors', 'main']
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
40 __docformat__ = 'restructuredtext en'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
41
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
42
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
43 class extract_messages(Command):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
44 """Message extraction command for use in ``setup.py`` scripts.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
45
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
46 If correctly installed, this command is available to Setuptools-using
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
47 setup scripts automatically. For projects using plain old ``distutils``,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
48 the command needs to be registered explicitly in ``setup.py``::
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
49
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
50 from babel.messages.frontend import extract_messages
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
51
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
52 setup(
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
53 ...
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
54 cmdclass = {'extract_messages': extract_messages}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
55 )
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
56
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
57 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
58 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
59 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
60
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
61 description = 'extract localizable strings from the project code'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
62 user_options = [
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
63 ('charset=', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
64 'charset to use in the output file'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
65 ('keywords=', 'k',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
66 'space-separated list of keywords to look for in addition to the '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
67 'defaults'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
68 ('no-default-keywords', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
69 'do not include the default keywords'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
70 ('mapping-file=', 'F',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
71 'path to the mapping configuration file'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
72 ('no-location', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
73 'do not include location comments with filename and line number'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
74 ('omit-header', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
75 'do not include msgid "" entry in header'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
76 ('output-file=', 'o',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
77 'name of the output file'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
78 ('width=', 'w',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
79 'set output line width (default 76)'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
80 ('no-wrap', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
81 'do not break long message lines, longer than the output line width, '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
82 'into several lines'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
83 ('sort-output', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
84 'generate sorted output (default False)'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
85 ('sort-by-file', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
86 'sort output by file location (default False)'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
87 ('msgid-bugs-address=', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
88 'set report address for msgid'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
89 ('copyright-holder=', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
90 'set copyright holder in output'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
91 ('add-comments=', 'c',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
92 'place comment block with TAG (or those preceding keyword lines) in '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
93 'output file. Seperate multiple TAGs with commas(,)'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
94 ('input-dirs=', None,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
95 'directories that should be scanned for messages'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
96 ]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
97 boolean_options = [
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
98 'no-default-keywords', 'no-location', 'omit-header', 'no-wrap',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
99 'sort-output', 'sort-by-file'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
100 ]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
101
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
102 def initialize_options(self):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
103 self.charset = 'utf-8'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
104 self.keywords = ''
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
105 self._keywords = DEFAULT_KEYWORDS.copy()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
106 self.no_default_keywords = False
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
107 self.mapping_file = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
108 self.no_location = False
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
109 self.omit_header = False
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
110 self.output_file = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
111 self.input_dirs = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
112 self.width = 76
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
113 self.no_wrap = False
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
114 self.sort_output = False
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
115 self.sort_by_file = False
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
116 self.msgid_bugs_address = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
117 self.copyright_holder = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
118 self.add_comments = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
119 self._add_comments = []
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
120
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
121 def finalize_options(self):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
122 if self.no_default_keywords and not self.keywords:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
123 raise DistutilsOptionError('you must specify new keywords if you '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
124 'disable the default ones')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
125 if self.no_default_keywords:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
126 self._keywords = {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
127 if self.keywords:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
128 self._keywords.update(parse_keywords(self.keywords.split()))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
129
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
130 if not self.output_file:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
131 raise DistutilsOptionError('no output file specified')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
132 if self.no_wrap and self.width:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
133 raise DistutilsOptionError("'--no-wrap' and '--width' are mutually "
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
134 "exclusive")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
135 if self.no_wrap:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
136 self.width = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
137 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
138 self.width = int(self.width)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
139
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
140 if self.sort_output and self.sort_by_file:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
141 raise DistutilsOptionError("'--sort-output' and '--sort-by-file' "
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
142 "are mutually exclusive")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
143
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
144 if not self.input_dirs:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
145 self.input_dirs = dict.fromkeys([k.split('.',1)[0]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
146 for k in self.distribution.packages
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
147 ]).keys()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
148
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
149 if self.add_comments:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
150 self._add_comments = self.add_comments.split(',')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
151
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
152 def run(self):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
153 mappings = self._get_mappings()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
154 outfile = open(self.output_file, 'w')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
155 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
156 catalog = Catalog(project=self.distribution.get_name(),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
157 version=self.distribution.get_version(),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
158 msgid_bugs_address=self.msgid_bugs_address,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
159 copyright_holder=self.copyright_holder,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
160 charset=self.charset)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
161
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
162 for dirname, (method_map, options_map) in mappings.items():
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
163 def callback(filename, method, options):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
164 if method == 'ignore':
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
165 return
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
166 filepath = os.path.normpath(os.path.join(dirname, filename))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
167 optstr = ''
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
168 if options:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
169 optstr = ' (%s)' % ', '.join(['%s="%s"' % (k, v) for
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
170 k, v in options.items()])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
171 log.info('extracting messages from %s%s'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
172 % (filepath, optstr))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
173
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
174 extracted = extract_from_dir(dirname, method_map, options_map,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
175 keywords=self._keywords,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
176 comment_tags=self._add_comments,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
177 callback=callback)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
178 for filename, lineno, message, comments in extracted:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
179 filepath = os.path.normpath(os.path.join(dirname, filename))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
180 catalog.add(message, None, [(filepath, lineno)],
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
181 auto_comments=comments)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
182
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
183 log.info('writing PO template file to %s' % self.output_file)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
184 write_po(outfile, catalog, width=self.width,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
185 no_location=self.no_location,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
186 omit_header=self.omit_header,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
187 sort_output=self.sort_output,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
188 sort_by_file=self.sort_by_file)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
189 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
190 outfile.close()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
191
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
192 def _get_mappings(self):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
193 mappings = {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
194
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
195 if self.mapping_file:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
196 fileobj = open(self.mapping_file, 'U')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
197 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
198 method_map, options_map = parse_mapping(fileobj)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
199 for dirname in self.input_dirs:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
200 mappings[dirname] = method_map, options_map
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
201 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
202 fileobj.close()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
203
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
204 elif getattr(self.distribution, 'message_extractors', None):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
205 message_extractors = self.distribution.message_extractors
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
206 for dirname, mapping in message_extractors.items():
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
207 if isinstance(mapping, basestring):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
208 method_map, options_map = parse_mapping(StringIO(mapping))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
209 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
210 method_map, options_map = [], {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
211 for pattern, method, options in mapping:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
212 method_map.append((pattern, method))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
213 options_map[pattern] = options or {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
214 mappings[dirname] = method_map, options_map
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
215
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
216 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
217 for dirname in self.input_dirs:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
218 mappings[dirname] = DEFAULT_MAPPING, {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
219
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
220 return mappings
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
221
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
222
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
223 def check_message_extractors(dist, name, value):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
224 """Validate the ``message_extractors`` keyword argument to ``setup()``.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
225
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
226 :param dist: the distutils/setuptools ``Distribution`` object
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
227 :param name: the name of the keyword argument (should always be
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
228 "message_extractors")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
229 :param value: the value of the keyword argument
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
230 :raise `DistutilsSetupError`: if the value is not valid
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
231 :see: `Adding setup() arguments
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
232 <http://peak.telecommunity.com/DevCenter/setuptools#adding-setup-arguments>`_
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
233 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
234 assert name == 'message_extractors'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
235 if not isinstance(value, dict):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
236 raise DistutilsSetupError('the value of the "message_extractors" '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
237 'parameter must be a dictionary')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
238
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
239
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
240 class new_catalog(Command):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
241 """New catalog command for use in ``setup.py`` scripts.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
242
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
243 If correctly installed, this command is available to Setuptools-using
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
244 setup scripts automatically. For projects using plain old ``distutils``,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
245 the command needs to be registered explicitly in ``setup.py``::
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
246
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
247 from babel.messages.frontend import new_catalog
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
248
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
249 setup(
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
250 ...
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
251 cmdclass = {'new_catalog': new_catalog}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
252 )
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
253
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
254 :see: `Integrating new distutils commands <http://docs.python.org/dist/node32.html>`_
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
255 :see: `setuptools <http://peak.telecommunity.com/DevCenter/setuptools>`_
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
256 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
257
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
258 description = 'create new catalogs based on a catalog template'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
259 user_options = [
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
260 ('domain=', 'D',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
261 "domain of PO file (default 'messages')"),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
262 ('input-file=', 'i',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
263 'name of the input file'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
264 ('output-dir=', 'd',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
265 'path to output directory'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
266 ('output-file=', 'o',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
267 "name of the output file (default "
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
268 "'<output_dir>/<locale>/LC_MESSAGES/<domain>.po')"),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
269 ('locale=', 'l',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
270 'locale for the new localized catalog'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
271 ]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
272
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
273 def initialize_options(self):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
274 self.output_dir = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
275 self.output_file = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
276 self.input_file = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
277 self.locale = None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
278 self.domain = 'messages'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
279
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
280 def finalize_options(self):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
281 if not self.input_file:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
282 raise DistutilsOptionError('you must specify the input file')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
283
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
284 if not self.locale:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
285 raise DistutilsOptionError('you must provide a locale for the '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
286 'new catalog')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
287 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
288 self._locale = Locale.parse(self.locale)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
289 except UnknownLocaleError, e:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
290 raise DistutilsOptionError(e)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
291
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
292 if not self.output_file and not self.output_dir:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
293 raise DistutilsOptionError('you must specify the output directory')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
294 if not self.output_file:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
295 self.output_file = os.path.join(self.output_dir, self.locale,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
296 'LC_MESSAGES', self.domain + '.po')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
297
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
298 if not os.path.exists(os.path.dirname(self.output_file)):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
299 os.makedirs(os.path.dirname(self.output_file))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
300
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
301 def run(self):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
302 log.info('creating catalog %r based on %r', self.output_file,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
303 self.input_file)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
304
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
305 infile = open(self.input_file, 'r')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
306 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
307 catalog = read_po(infile)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
308 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
309 infile.close()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
310
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
311 catalog.locale = self._locale
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
312
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
313 outfile = open(self.output_file, 'w')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
314 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
315 write_po(outfile, catalog)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
316 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
317 outfile.close()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
318
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
319
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
320 class CommandLineInterface(object):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
321 """Command-line interface.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
322
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
323 This class provides a simple command-line interface to the message
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
324 extraction and PO file generation functionality.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
325 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
326
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
327 usage = '%%prog %s [options] %s'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
328 version = '%%prog %s' % VERSION
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
329 commands = ['extract', 'init']
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
330 command_descriptions = {
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
331 'extract': 'extract messages from source files and generate a POT file',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
332 'init': 'create new message catalogs from a template'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
333 }
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
334
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
335 def run(self, argv=sys.argv):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
336 """Main entry point of the command-line interface.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
337
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
338 :param argv: list of arguments passed on the command-line
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
339 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
340 self.parser = OptionParser(usage=self.usage % ('command', '[args]'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
341 version=self.version)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
342 self.parser.disable_interspersed_args()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
343 self.parser.print_help = self._help
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
344 options, args = self.parser.parse_args(argv[1:])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
345 if not args:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
346 self.parser.error('incorrect number of arguments')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
347
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
348 cmdname = args[0]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
349 if cmdname not in self.commands:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
350 self.parser.error('unknown command "%s"' % cmdname)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
351
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
352 getattr(self, cmdname)(args[1:])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
353
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
354 def _help(self):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
355 print self.parser.format_help()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
356 print "commands:"
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
357 longest = max([len(command) for command in self.commands])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
358 format = " %%-%ds %%s" % max(11, longest)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
359 self.commands.sort()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
360 for command in self.commands:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
361 print format % (command, self.command_descriptions[command])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
362
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
363 def extract(self, argv):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
364 """Subcommand for extracting messages from source files and generating
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
365 a POT file.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
366
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
367 :param argv: the command arguments
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
368 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
369 parser = OptionParser(usage=self.usage % ('extract', 'dir1 <dir2> ...'),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
370 description=self.command_descriptions['extract'])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
371 parser.add_option('--charset', dest='charset',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
372 help='charset to use in the output')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
373 parser.add_option('-k', '--keyword', dest='keywords', action='append',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
374 help='keywords to look for in addition to the '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
375 'defaults. You can specify multiple -k flags on '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
376 'the command line.')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
377 parser.add_option('--no-default-keywords', dest='no_default_keywords',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
378 action='store_true',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
379 help="do not include the default keywords")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
380 parser.add_option('--mapping', '-F', dest='mapping_file',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
381 help='path to the extraction mapping file')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
382 parser.add_option('--no-location', dest='no_location',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
383 action='store_true',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
384 help='do not include location comments with filename '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
385 'and line number')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
386 parser.add_option('--omit-header', dest='omit_header',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
387 action='store_true',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
388 help='do not include msgid "" entry in header')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
389 parser.add_option('-o', '--output', dest='output',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
390 help='path to the output POT file')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
391 parser.add_option('-w', '--width', dest='width', type='int',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
392 help="set output line width (default %default)")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
393 parser.add_option('--no-wrap', dest='no_wrap', action = 'store_true',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
394 help='do not break long message lines, longer than '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
395 'the output line width, into several lines')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
396 parser.add_option('--sort-output', dest='sort_output',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
397 action='store_true',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
398 help='generate sorted output (default False)')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
399 parser.add_option('--sort-by-file', dest='sort_by_file',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
400 action='store_true',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
401 help='sort output by file location (default False)')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
402 parser.add_option('--msgid-bugs-address', dest='msgid_bugs_address',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
403 metavar='EMAIL@ADDRESS',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
404 help='set report address for msgid')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
405 parser.add_option('--copyright-holder', dest='copyright_holder',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
406 help='set copyright holder in output')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
407 parser.add_option('--add-comments', '-c', dest='comment_tags',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
408 metavar='TAG', action='append',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
409 help='place comment block with TAG (or those '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
410 'preceding keyword lines) in output file. One '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
411 'TAG per argument call')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
412
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
413 parser.set_defaults(charset='utf-8', keywords=[],
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
414 no_default_keywords=False, no_location=False,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
415 omit_header = False, width=76, no_wrap=False,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
416 sort_output=False, sort_by_file=False,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
417 comment_tags=[])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
418 options, args = parser.parse_args(argv)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
419 if not args:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
420 parser.error('incorrect number of arguments')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
421
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
422 if options.output not in (None, '-'):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
423 outfile = open(options.output, 'w')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
424 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
425 outfile = sys.stdout
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
426
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
427 keywords = DEFAULT_KEYWORDS.copy()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
428 if options.no_default_keywords:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
429 if not options.keywords:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
430 parser.error('you must specify new keywords if you disable the '
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
431 'default ones')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
432 keywords = {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
433 if options.keywords:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
434 keywords.update(parse_keywords(options.keywords))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
435
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
436 if options.mapping_file:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
437 fileobj = open(options.mapping_file, 'U')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
438 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
439 method_map, options_map = parse_mapping(fileobj)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
440 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
441 fileobj.close()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
442 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
443 method_map = DEFAULT_MAPPING
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
444 options_map = {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
445
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
446 if options.width and options.no_wrap:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
447 parser.error("'--no-wrap' and '--width' are mutually exclusive.")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
448 elif not options.width and not options.no_wrap:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
449 options.width = 76
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
450 elif not options.width and options.no_wrap:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
451 options.width = 0
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
452
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
453 if options.sort_output and options.sort_by_file:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
454 parser.error("'--sort-output' and '--sort-by-file' are mutually "
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
455 "exclusive")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
456
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
457 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
458 catalog = Catalog(msgid_bugs_address=options.msgid_bugs_address,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
459 copyright_holder=options.copyright_holder,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
460 charset=options.charset)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
461
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
462 for dirname in args:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
463 if not os.path.isdir(dirname):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
464 parser.error('%r is not a directory' % dirname)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
465 extracted = extract_from_dir(dirname, method_map, options_map,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
466 keywords, options.comment_tags)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
467 for filename, lineno, message, comments in extracted:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
468 filepath = os.path.normpath(os.path.join(dirname, filename))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
469 catalog.add(message, None, [(filepath, lineno)],
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
470 auto_comments=comments)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
471
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
472 write_po(outfile, catalog, width=options.width,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
473 no_location=options.no_location,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
474 omit_header=options.omit_header,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
475 sort_output=options.sort_output,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
476 sort_by_file=options.sort_by_file)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
477 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
478 if options.output:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
479 outfile.close()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
480
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
481 def init(self, argv):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
482 """Subcommand for creating new message catalogs from a template.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
483
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
484 :param argv: the command arguments
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
485 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
486 parser = OptionParser(usage=self.usage % ('init',''),
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
487 description=self.command_descriptions['init'])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
488 parser.add_option('--domain', '-D', dest='domain',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
489 help="domain of PO file (default '%default')")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
490 parser.add_option('--input-file', '-i', dest='input_file',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
491 metavar='FILE', help='name of the input file')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
492 parser.add_option('--output-dir', '-d', dest='output_dir',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
493 metavar='DIR', help='path to output directory')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
494 parser.add_option('--output-file', '-o', dest='output_file',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
495 metavar='FILE',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
496 help="name of the output file (default "
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
497 "'<output_dir>/<locale>/LC_MESSAGES/"
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
498 "<domain>.po')")
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
499 parser.add_option('--locale', '-l', dest='locale', metavar='LOCALE',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
500 help='locale for the new localized catalog')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
501
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
502 parser.set_defaults(domain='messages')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
503 options, args = parser.parse_args(argv)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
504
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
505 if not options.locale:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
506 parser.error('you must provide a locale for the new catalog')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
507 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
508 locale = Locale.parse(options.locale)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
509 except UnknownLocaleError, e:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
510 parser.error(e)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
511
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
512 if not options.input_file:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
513 parser.error('you must specify the input file')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
514
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
515 if not options.output_file and not options.output_dir:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
516 parser.error('you must specify the output file or directory')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
517
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
518 if not options.output_file:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
519 options.output_file = os.path.join(options.output_dir,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
520 options.locale, 'LC_MESSAGES',
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
521 options.domain + '.po')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
522 if not os.path.exists(os.path.dirname(options.output_file)):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
523 os.makedirs(os.path.dirname(options.output_file))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
524
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
525 infile = open(options.input_file, 'r')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
526 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
527 catalog = read_po(infile)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
528 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
529 infile.close()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
530
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
531 catalog.locale = locale
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
532 catalog.revision_date = datetime.now(LOCALTZ)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
533
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
534 print 'creating catalog %r based on %r' % (options.output_file,
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
535 options.input_file)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
536
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
537 outfile = open(options.output_file, 'w')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
538 try:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
539 write_po(outfile, catalog)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
540 finally:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
541 outfile.close()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
542
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
543 def main():
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
544 CommandLineInterface().run(sys.argv)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
545
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
546 def parse_mapping(fileobj, filename=None):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
547 """Parse an extraction method mapping from a file-like object.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
548
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
549 >>> buf = StringIO('''
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
550 ... # Python source files
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
551 ... [python: **.py]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
552 ...
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
553 ... # Genshi templates
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
554 ... [genshi: **/templates/**.html]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
555 ... include_attrs =
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
556 ... [genshi: **/templates/**.txt]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
557 ... template_class = genshi.template.text.TextTemplate
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
558 ... encoding = latin-1
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
559 ... ''')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
560
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
561 >>> method_map, options_map = parse_mapping(buf)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
562
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
563 >>> method_map[0]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
564 ('**.py', 'python')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
565 >>> options_map['**.py']
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
566 {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
567 >>> method_map[1]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
568 ('**/templates/**.html', 'genshi')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
569 >>> options_map['**/templates/**.html']['include_attrs']
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
570 ''
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
571 >>> method_map[2]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
572 ('**/templates/**.txt', 'genshi')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
573 >>> options_map['**/templates/**.txt']['template_class']
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
574 'genshi.template.text.TextTemplate'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
575 >>> options_map['**/templates/**.txt']['encoding']
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
576 'latin-1'
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
577
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
578 :param fileobj: a readable file-like object containing the configuration
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
579 text to parse
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
580 :return: a `(method_map, options_map)` tuple
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
581 :rtype: `tuple`
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
582 :see: `extract_from_directory`
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
583 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
584 method_map = []
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
585 options_map = {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
586
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
587 parser = RawConfigParser()
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
588 parser._sections = odict(parser._sections) # We need ordered sections
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
589 parser.readfp(fileobj, filename)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
590 for section in parser.sections():
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
591 method, pattern = [part.strip() for part in section.split(':', 1)]
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
592 method_map.append((pattern, method))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
593 options_map[pattern] = dict(parser.items(section))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
594
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
595 return (method_map, options_map)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
596
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
597 def parse_keywords(strings=[]):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
598 """Parse keywords specifications from the given list of strings.
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
599
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
600 >>> kw = parse_keywords(['_', 'dgettext:2', 'dngettext:2,3'])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
601 >>> for keyword, indices in sorted(kw.items()):
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
602 ... print (keyword, indices)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
603 ('_', None)
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
604 ('dgettext', (2,))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
605 ('dngettext', (2, 3))
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
606 """
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
607 keywords = {}
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
608 for string in strings:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
609 if ':' in string:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
610 funcname, indices = string.split(':')
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
611 else:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
612 funcname, indices = string, None
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
613 if funcname not in keywords:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
614 if indices:
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
615 indices = tuple([(int(x)) for x in indices.split(',')])
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
616 keywords[funcname] = indices
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
617 return keywords
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
618
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
619
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
620 if __name__ == '__main__':
4a7af44e6695 Create branch for 0.8.x releases.
cmlenz
parents:
diff changeset
621 main()
Copyright (C) 2012-2017 Edgewall Software