Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: reviewbot/third_party/google-api-python-client/gflags.py

Issue 20515002: Add google-api-python-client in third_party/ (Closed) Base URL: https://src.chromium.org/chrome/trunk/tools/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 #
3 # Copyright (c) 2002, Google Inc.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are
8 # met:
9 #
10 # * Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # * Redistributions in binary form must reproduce the above
13 # copyright notice, this list of conditions and the following disclaimer
14 # in the documentation and/or other materials provided with the
15 # distribution.
16 # * Neither the name of Google Inc. nor the names of its
17 # contributors may be used to endorse or promote products derived from
18 # this software without specific prior written permission.
19 #
20 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #
32 # ---
33 # Author: Chad Lester
34 # Design and style contributions by:
35 # Amit Patel, Bogdan Cocosel, Daniel Dulitz, Eric Tiedemann,
36 # Eric Veach, Laurence Gonsalves, Matthew Springer
37 # Code reorganized a bit by Craig Silverstein
38
39 """This module is used to define and parse command line flags.
40
41 This module defines a *distributed* flag-definition policy: rather than
42 an application having to define all flags in or near main(), each python
43 module defines flags that are useful to it. When one python module
44 imports another, it gains access to the other's flags. (This is
45 implemented by having all modules share a common, global registry object
46 containing all the flag information.)
47
48 Flags are defined through the use of one of the DEFINE_xxx functions.
49 The specific function used determines how the flag is parsed, checked,
50 and optionally type-converted, when it's seen on the command line.
51
52
53 IMPLEMENTATION: DEFINE_* creates a 'Flag' object and registers it with a
54 'FlagValues' object (typically the global FlagValues FLAGS, defined
55 here). The 'FlagValues' object can scan the command line arguments and
56 pass flag arguments to the corresponding 'Flag' objects for
57 value-checking and type conversion. The converted flag values are
58 available as attributes of the 'FlagValues' object.
59
60 Code can access the flag through a FlagValues object, for instance
61 gflags.FLAGS.myflag. Typically, the __main__ module passes the command
62 line arguments to gflags.FLAGS for parsing.
63
64 At bottom, this module calls getopt(), so getopt functionality is
65 supported, including short- and long-style flags, and the use of -- to
66 terminate flags.
67
68 Methods defined by the flag module will throw 'FlagsError' exceptions.
69 The exception argument will be a human-readable string.
70
71
72 FLAG TYPES: This is a list of the DEFINE_*'s that you can do. All flags
73 take a name, default value, help-string, and optional 'short' name
74 (one-letter name). Some flags have other arguments, which are described
75 with the flag.
76
77 DEFINE_string: takes any input, and interprets it as a string.
78
79 DEFINE_bool or
80 DEFINE_boolean: typically does not take an argument: say --myflag to
81 set FLAGS.myflag to true, or --nomyflag to set
82 FLAGS.myflag to false. Alternately, you can say
83 --myflag=true or --myflag=t or --myflag=1 or
84 --myflag=false or --myflag=f or --myflag=0
85
86 DEFINE_float: takes an input and interprets it as a floating point
87 number. Takes optional args lower_bound and upper_bound;
88 if the number specified on the command line is out of
89 range, it will raise a FlagError.
90
91 DEFINE_integer: takes an input and interprets it as an integer. Takes
92 optional args lower_bound and upper_bound as for floats.
93
94 DEFINE_enum: takes a list of strings which represents legal values. If
95 the command-line value is not in this list, raise a flag
96 error. Otherwise, assign to FLAGS.flag as a string.
97
98 DEFINE_list: Takes a comma-separated list of strings on the commandline.
99 Stores them in a python list object.
100
101 DEFINE_spaceseplist: Takes a space-separated list of strings on the
102 commandline. Stores them in a python list object.
103 Example: --myspacesepflag "foo bar baz"
104
105 DEFINE_multistring: The same as DEFINE_string, except the flag can be
106 specified more than once on the commandline. The
107 result is a python list object (list of strings),
108 even if the flag is only on the command line once.
109
110 DEFINE_multi_int: The same as DEFINE_integer, except the flag can be
111 specified more than once on the commandline. The
112 result is a python list object (list of ints), even if
113 the flag is only on the command line once.
114
115
116 SPECIAL FLAGS: There are a few flags that have special meaning:
117 --help prints a list of all the flags in a human-readable fashion
118 --helpshort prints a list of all key flags (see below).
119 --helpxml prints a list of all flags, in XML format. DO NOT parse
120 the output of --help and --helpshort. Instead, parse
121 the output of --helpxml. For more info, see
122 "OUTPUT FOR --helpxml" below.
123 --flagfile=foo read flags from file foo.
124 --undefok=f1,f2 ignore unrecognized option errors for f1,f2.
125 For boolean flags, you should use --undefok=boolflag, and
126 --boolflag and --noboolflag will be accepted. Do not use
127 --undefok=noboolflag.
128 -- as in getopt(), terminates flag-processing
129
130
131 FLAGS VALIDATORS: If your program:
132 - requires flag X to be specified
133 - needs flag Y to match a regular expression
134 - or requires any more general constraint to be satisfied
135 then validators are for you!
136
137 Each validator represents a constraint over one flag, which is enforced
138 starting from the initial parsing of the flags and until the program
139 terminates.
140
141 Also, lower_bound and upper_bound for numerical flags are enforced using flag
142 validators.
143
144 Howto:
145 If you want to enforce a constraint over one flag, use
146
147 gflags.RegisterValidator(flag_name,
148 checker,
149 message='Flag validation failed',
150 flag_values=FLAGS)
151
152 After flag values are initially parsed, and after any change to the specified
153 flag, method checker(flag_value) will be executed. If constraint is not
154 satisfied, an IllegalFlagValue exception will be raised. See
155 RegisterValidator's docstring for a detailed explanation on how to construct
156 your own checker.
157
158
159 EXAMPLE USAGE:
160
161 FLAGS = gflags.FLAGS
162
163 gflags.DEFINE_integer('my_version', 0, 'Version number.')
164 gflags.DEFINE_string('filename', None, 'Input file name', short_name='f')
165
166 gflags.RegisterValidator('my_version',
167 lambda value: value % 2 == 0,
168 message='--my_version must be divisible by 2')
169 gflags.MarkFlagAsRequired('filename')
170
171
172 NOTE ON --flagfile:
173
174 Flags may be loaded from text files in addition to being specified on
175 the commandline.
176
177 Any flags you don't feel like typing, throw them in a file, one flag per
178 line, for instance:
179 --myflag=myvalue
180 --nomyboolean_flag
181 You then specify your file with the special flag '--flagfile=somefile'.
182 You CAN recursively nest flagfile= tokens OR use multiple files on the
183 command line. Lines beginning with a single hash '#' or a double slash
184 '//' are comments in your flagfile.
185
186 Any flagfile=<file> will be interpreted as having a relative path from
187 the current working directory rather than from the place the file was
188 included from:
189 myPythonScript.py --flagfile=config/somefile.cfg
190
191 If somefile.cfg includes further --flagfile= directives, these will be
192 referenced relative to the original CWD, not from the directory the
193 including flagfile was found in!
194
195 The caveat applies to people who are including a series of nested files
196 in a different dir than they are executing out of. Relative path names
197 are always from CWD, not from the directory of the parent include
198 flagfile. We do now support '~' expanded directory names.
199
200 Absolute path names ALWAYS work!
201
202
203 EXAMPLE USAGE:
204
205
206 FLAGS = gflags.FLAGS
207
208 # Flag names are globally defined! So in general, we need to be
209 # careful to pick names that are unlikely to be used by other libraries.
210 # If there is a conflict, we'll get an error at import time.
211 gflags.DEFINE_string('name', 'Mr. President', 'your name')
212 gflags.DEFINE_integer('age', None, 'your age in years', lower_bound=0)
213 gflags.DEFINE_boolean('debug', False, 'produces debugging output')
214 gflags.DEFINE_enum('gender', 'male', ['male', 'female'], 'your gender')
215
216 def main(argv):
217 try:
218 argv = FLAGS(argv) # parse flags
219 except gflags.FlagsError, e:
220 print '%s\\nUsage: %s ARGS\\n%s' % (e, sys.argv[0], FLAGS)
221 sys.exit(1)
222 if FLAGS.debug: print 'non-flag arguments:', argv
223 print 'Happy Birthday', FLAGS.name
224 if FLAGS.age is not None:
225 print 'You are a %d year old %s' % (FLAGS.age, FLAGS.gender)
226
227 if __name__ == '__main__':
228 main(sys.argv)
229
230
231 KEY FLAGS:
232
233 As we already explained, each module gains access to all flags defined
234 by all the other modules it transitively imports. In the case of
235 non-trivial scripts, this means a lot of flags ... For documentation
236 purposes, it is good to identify the flags that are key (i.e., really
237 important) to a module. Clearly, the concept of "key flag" is a
238 subjective one. When trying to determine whether a flag is key to a
239 module or not, assume that you are trying to explain your module to a
240 potential user: which flags would you really like to mention first?
241
242 We'll describe shortly how to declare which flags are key to a module.
243 For the moment, assume we know the set of key flags for each module.
244 Then, if you use the app.py module, you can use the --helpshort flag to
245 print only the help for the flags that are key to the main module, in a
246 human-readable format.
247
248 NOTE: If you need to parse the flag help, do NOT use the output of
249 --help / --helpshort. That output is meant for human consumption, and
250 may be changed in the future. Instead, use --helpxml; flags that are
251 key for the main module are marked there with a <key>yes</key> element.
252
253 The set of key flags for a module M is composed of:
254
255 1. Flags defined by module M by calling a DEFINE_* function.
256
257 2. Flags that module M explictly declares as key by using the function
258
259 DECLARE_key_flag(<flag_name>)
260
261 3. Key flags of other modules that M specifies by using the function
262
263 ADOPT_module_key_flags(<other_module>)
264
265 This is a "bulk" declaration of key flags: each flag that is key for
266 <other_module> becomes key for the current module too.
267
268 Notice that if you do not use the functions described at points 2 and 3
269 above, then --helpshort prints information only about the flags defined
270 by the main module of our script. In many cases, this behavior is good
271 enough. But if you move part of the main module code (together with the
272 related flags) into a different module, then it is nice to use
273 DECLARE_key_flag / ADOPT_module_key_flags and make sure --helpshort
274 lists all relevant flags (otherwise, your code refactoring may confuse
275 your users).
276
277 Note: each of DECLARE_key_flag / ADOPT_module_key_flags has its own
278 pluses and minuses: DECLARE_key_flag is more targeted and may lead a
279 more focused --helpshort documentation. ADOPT_module_key_flags is good
280 for cases when an entire module is considered key to the current script.
281 Also, it does not require updates to client scripts when a new flag is
282 added to the module.
283
284
285 EXAMPLE USAGE 2 (WITH KEY FLAGS):
286
287 Consider an application that contains the following three files (two
288 auxiliary modules and a main module)
289
290 File libfoo.py:
291
292 import gflags
293
294 gflags.DEFINE_integer('num_replicas', 3, 'Number of replicas to start')
295 gflags.DEFINE_boolean('rpc2', True, 'Turn on the usage of RPC2.')
296
297 ... some code ...
298
299 File libbar.py:
300
301 import gflags
302
303 gflags.DEFINE_string('bar_gfs_path', '/gfs/path',
304 'Path to the GFS files for libbar.')
305 gflags.DEFINE_string('email_for_bar_errors', 'bar-team@google.com',
306 'Email address for bug reports about module libbar.')
307 gflags.DEFINE_boolean('bar_risky_hack', False,
308 'Turn on an experimental and buggy optimization.')
309
310 ... some code ...
311
312 File myscript.py:
313
314 import gflags
315 import libfoo
316 import libbar
317
318 gflags.DEFINE_integer('num_iterations', 0, 'Number of iterations.')
319
320 # Declare that all flags that are key for libfoo are
321 # key for this module too.
322 gflags.ADOPT_module_key_flags(libfoo)
323
324 # Declare that the flag --bar_gfs_path (defined in libbar) is key
325 # for this module.
326 gflags.DECLARE_key_flag('bar_gfs_path')
327
328 ... some code ...
329
330 When myscript is invoked with the flag --helpshort, the resulted help
331 message lists information about all the key flags for myscript:
332 --num_iterations, --num_replicas, --rpc2, and --bar_gfs_path.
333
334 Of course, myscript uses all the flags declared by it (in this case,
335 just --num_replicas) or by any of the modules it transitively imports
336 (e.g., the modules libfoo, libbar). E.g., it can access the value of
337 FLAGS.bar_risky_hack, even if --bar_risky_hack is not declared as a key
338 flag for myscript.
339
340
341 OUTPUT FOR --helpxml:
342
343 The --helpxml flag generates output with the following structure:
344
345 <?xml version="1.0"?>
346 <AllFlags>
347 <program>PROGRAM_BASENAME</program>
348 <usage>MAIN_MODULE_DOCSTRING</usage>
349 (<flag>
350 [<key>yes</key>]
351 <file>DECLARING_MODULE</file>
352 <name>FLAG_NAME</name>
353 <meaning>FLAG_HELP_MESSAGE</meaning>
354 <default>DEFAULT_FLAG_VALUE</default>
355 <current>CURRENT_FLAG_VALUE</current>
356 <type>FLAG_TYPE</type>
357 [OPTIONAL_ELEMENTS]
358 </flag>)*
359 </AllFlags>
360
361 Notes:
362
363 1. The output is intentionally similar to the output generated by the
364 C++ command-line flag library. The few differences are due to the
365 Python flags that do not have a C++ equivalent (at least not yet),
366 e.g., DEFINE_list.
367
368 2. New XML elements may be added in the future.
369
370 3. DEFAULT_FLAG_VALUE is in serialized form, i.e., the string you can
371 pass for this flag on the command-line. E.g., for a flag defined
372 using DEFINE_list, this field may be foo,bar, not ['foo', 'bar'].
373
374 4. CURRENT_FLAG_VALUE is produced using str(). This means that the
375 string 'false' will be represented in the same way as the boolean
376 False. Using repr() would have removed this ambiguity and simplified
377 parsing, but would have broken the compatibility with the C++
378 command-line flags.
379
380 5. OPTIONAL_ELEMENTS describe elements relevant for certain kinds of
381 flags: lower_bound, upper_bound (for flags that specify bounds),
382 enum_value (for enum flags), list_separator (for flags that consist of
383 a list of values, separated by a special token).
384
385 6. We do not provide any example here: please use --helpxml instead.
386
387 This module requires at least python 2.2.1 to run.
388 """
389
390 import cgi
391 import getopt
392 import os
393 import re
394 import string
395 import struct
396 import sys
397 # pylint: disable-msg=C6204
398 try:
399 import fcntl
400 except ImportError:
401 fcntl = None
402 try:
403 # Importing termios will fail on non-unix platforms.
404 import termios
405 except ImportError:
406 termios = None
407
408 import gflags_validators
409 # pylint: enable-msg=C6204
410
411
412 # Are we running under pychecker?
413 _RUNNING_PYCHECKER = 'pychecker.python' in sys.modules
414
415
416 def _GetCallingModuleObjectAndName():
417 """Returns the module that's calling into this module.
418
419 We generally use this function to get the name of the module calling a
420 DEFINE_foo... function.
421 """
422 # Walk down the stack to find the first globals dict that's not ours.
423 for depth in range(1, sys.getrecursionlimit()):
424 if not sys._getframe(depth).f_globals is globals():
425 globals_for_frame = sys._getframe(depth).f_globals
426 module, module_name = _GetModuleObjectAndName(globals_for_frame)
427 if module_name is not None:
428 return module, module_name
429 raise AssertionError("No module was found")
430
431
432 def _GetCallingModule():
433 """Returns the name of the module that's calling into this module."""
434 return _GetCallingModuleObjectAndName()[1]
435
436
437 def _GetThisModuleObjectAndName():
438 """Returns: (module object, module name) for this module."""
439 return _GetModuleObjectAndName(globals())
440
441
442 # module exceptions:
443 class FlagsError(Exception):
444 """The base class for all flags errors."""
445 pass
446
447
448 class DuplicateFlag(FlagsError):
449 """Raised if there is a flag naming conflict."""
450 pass
451
452 class CantOpenFlagFileError(FlagsError):
453 """Raised if flagfile fails to open: doesn't exist, wrong permissions, etc."""
454 pass
455
456
457 class DuplicateFlagCannotPropagateNoneToSwig(DuplicateFlag):
458 """Special case of DuplicateFlag -- SWIG flag value can't be set to None.
459
460 This can be raised when a duplicate flag is created. Even if allow_override is
461 True, we still abort if the new value is None, because it's currently
462 impossible to pass None default value back to SWIG. See FlagValues.SetDefault
463 for details.
464 """
465 pass
466
467
468 class DuplicateFlagError(DuplicateFlag):
469 """A DuplicateFlag whose message cites the conflicting definitions.
470
471 A DuplicateFlagError conveys more information than a DuplicateFlag,
472 namely the modules where the conflicting definitions occur. This
473 class was created to avoid breaking external modules which depend on
474 the existing DuplicateFlags interface.
475 """
476
477 def __init__(self, flagname, flag_values, other_flag_values=None):
478 """Create a DuplicateFlagError.
479
480 Args:
481 flagname: Name of the flag being redefined.
482 flag_values: FlagValues object containing the first definition of
483 flagname.
484 other_flag_values: If this argument is not None, it should be the
485 FlagValues object where the second definition of flagname occurs.
486 If it is None, we assume that we're being called when attempting
487 to create the flag a second time, and we use the module calling
488 this one as the source of the second definition.
489 """
490 self.flagname = flagname
491 first_module = flag_values.FindModuleDefiningFlag(
492 flagname, default='<unknown>')
493 if other_flag_values is None:
494 second_module = _GetCallingModule()
495 else:
496 second_module = other_flag_values.FindModuleDefiningFlag(
497 flagname, default='<unknown>')
498 msg = "The flag '%s' is defined twice. First from %s, Second from %s" % (
499 self.flagname, first_module, second_module)
500 DuplicateFlag.__init__(self, msg)
501
502
503 class IllegalFlagValue(FlagsError):
504 """The flag command line argument is illegal."""
505 pass
506
507
508 class UnrecognizedFlag(FlagsError):
509 """Raised if a flag is unrecognized."""
510 pass
511
512
513 # An UnrecognizedFlagError conveys more information than an UnrecognizedFlag.
514 # Since there are external modules that create DuplicateFlags, the interface to
515 # DuplicateFlag shouldn't change. The flagvalue will be assigned the full value
516 # of the flag and its argument, if any, allowing handling of unrecognized flags
517 # in an exception handler.
518 # If flagvalue is the empty string, then this exception is an due to a
519 # reference to a flag that was not already defined.
520 class UnrecognizedFlagError(UnrecognizedFlag):
521 def __init__(self, flagname, flagvalue=''):
522 self.flagname = flagname
523 self.flagvalue = flagvalue
524 UnrecognizedFlag.__init__(
525 self, "Unknown command line flag '%s'" % flagname)
526
527 # Global variable used by expvar
528 _exported_flags = {}
529 _help_width = 80 # width of help output
530
531
532 def GetHelpWidth():
533 """Returns: an integer, the width of help lines that is used in TextWrap."""
534 if (not sys.stdout.isatty()) or (termios is None) or (fcntl is None):
535 return _help_width
536 try:
537 data = fcntl.ioctl(sys.stdout, termios.TIOCGWINSZ, '1234')
538 columns = struct.unpack('hh', data)[1]
539 # Emacs mode returns 0.
540 # Here we assume that any value below 40 is unreasonable
541 if columns >= 40:
542 return columns
543 # Returning an int as default is fine, int(int) just return the int.
544 return int(os.getenv('COLUMNS', _help_width))
545
546 except (TypeError, IOError, struct.error):
547 return _help_width
548
549
550 def CutCommonSpacePrefix(text):
551 """Removes a common space prefix from the lines of a multiline text.
552
553 If the first line does not start with a space, it is left as it is and
554 only in the remaining lines a common space prefix is being searched
555 for. That means the first line will stay untouched. This is especially
556 useful to turn doc strings into help texts. This is because some
557 people prefer to have the doc comment start already after the
558 apostrophe and then align the following lines while others have the
559 apostrophes on a separate line.
560
561 The function also drops trailing empty lines and ignores empty lines
562 following the initial content line while calculating the initial
563 common whitespace.
564
565 Args:
566 text: text to work on
567
568 Returns:
569 the resulting text
570 """
571 text_lines = text.splitlines()
572 # Drop trailing empty lines
573 while text_lines and not text_lines[-1]:
574 text_lines = text_lines[:-1]
575 if text_lines:
576 # We got some content, is the first line starting with a space?
577 if text_lines[0] and text_lines[0][0].isspace():
578 text_first_line = []
579 else:
580 text_first_line = [text_lines.pop(0)]
581 # Calculate length of common leading whitespace (only over content lines)
582 common_prefix = os.path.commonprefix([line for line in text_lines if line])
583 space_prefix_len = len(common_prefix) - len(common_prefix.lstrip())
584 # If we have a common space prefix, drop it from all lines
585 if space_prefix_len:
586 for index in xrange(len(text_lines)):
587 if text_lines[index]:
588 text_lines[index] = text_lines[index][space_prefix_len:]
589 return '\n'.join(text_first_line + text_lines)
590 return ''
591
592
593 def TextWrap(text, length=None, indent='', firstline_indent=None, tabs=' '):
594 """Wraps a given text to a maximum line length and returns it.
595
596 We turn lines that only contain whitespace into empty lines. We keep
597 new lines and tabs (e.g., we do not treat tabs as spaces).
598
599 Args:
600 text: text to wrap
601 length: maximum length of a line, includes indentation
602 if this is None then use GetHelpWidth()
603 indent: indent for all but first line
604 firstline_indent: indent for first line; if None, fall back to indent
605 tabs: replacement for tabs
606
607 Returns:
608 wrapped text
609
610 Raises:
611 FlagsError: if indent not shorter than length
612 FlagsError: if firstline_indent not shorter than length
613 """
614 # Get defaults where callee used None
615 if length is None:
616 length = GetHelpWidth()
617 if indent is None:
618 indent = ''
619 if len(indent) >= length:
620 raise FlagsError('Indent must be shorter than length')
621 # In line we will be holding the current line which is to be started
622 # with indent (or firstline_indent if available) and then appended
623 # with words.
624 if firstline_indent is None:
625 firstline_indent = ''
626 line = indent
627 else:
628 line = firstline_indent
629 if len(firstline_indent) >= length:
630 raise FlagsError('First line indent must be shorter than length')
631
632 # If the callee does not care about tabs we simply convert them to
633 # spaces If callee wanted tabs to be single space then we do that
634 # already here.
635 if not tabs or tabs == ' ':
636 text = text.replace('\t', ' ')
637 else:
638 tabs_are_whitespace = not tabs.strip()
639
640 line_regex = re.compile('([ ]*)(\t*)([^ \t]+)', re.MULTILINE)
641
642 # Split the text into lines and the lines with the regex above. The
643 # resulting lines are collected in result[]. For each split we get the
644 # spaces, the tabs and the next non white space (e.g. next word).
645 result = []
646 for text_line in text.splitlines():
647 # Store result length so we can find out whether processing the next
648 # line gave any new content
649 old_result_len = len(result)
650 # Process next line with line_regex. For optimization we do an rstrip().
651 # - process tabs (changes either line or word, see below)
652 # - process word (first try to squeeze on line, then wrap or force wrap)
653 # Spaces found on the line are ignored, they get added while wrapping as
654 # needed.
655 for spaces, current_tabs, word in line_regex.findall(text_line.rstrip()):
656 # If tabs weren't converted to spaces, handle them now
657 if current_tabs:
658 # If the last thing we added was a space anyway then drop
659 # it. But let's not get rid of the indentation.
660 if (((result and line != indent) or
661 (not result and line != firstline_indent)) and line[-1] == ' '):
662 line = line[:-1]
663 # Add the tabs, if that means adding whitespace, just add it at
664 # the line, the rstrip() code while shorten the line down if
665 # necessary
666 if tabs_are_whitespace:
667 line += tabs * len(current_tabs)
668 else:
669 # if not all tab replacement is whitespace we prepend it to the word
670 word = tabs * len(current_tabs) + word
671 # Handle the case where word cannot be squeezed onto current last line
672 if len(line) + len(word) > length and len(indent) + len(word) <= length:
673 result.append(line.rstrip())
674 line = indent + word
675 word = ''
676 # No space left on line or can we append a space?
677 if len(line) + 1 >= length:
678 result.append(line.rstrip())
679 line = indent
680 else:
681 line += ' '
682 # Add word and shorten it up to allowed line length. Restart next
683 # line with indent and repeat, or add a space if we're done (word
684 # finished) This deals with words that cannot fit on one line
685 # (e.g. indent + word longer than allowed line length).
686 while len(line) + len(word) >= length:
687 line += word
688 result.append(line[:length])
689 word = line[length:]
690 line = indent
691 # Default case, simply append the word and a space
692 if word:
693 line += word + ' '
694 # End of input line. If we have content we finish the line. If the
695 # current line is just the indent but we had content in during this
696 # original line then we need to add an empty line.
697 if (result and line != indent) or (not result and line != firstline_indent):
698 result.append(line.rstrip())
699 elif len(result) == old_result_len:
700 result.append('')
701 line = indent
702
703 return '\n'.join(result)
704
705
706 def DocToHelp(doc):
707 """Takes a __doc__ string and reformats it as help."""
708
709 # Get rid of starting and ending white space. Using lstrip() or even
710 # strip() could drop more than maximum of first line and right space
711 # of last line.
712 doc = doc.strip()
713
714 # Get rid of all empty lines
715 whitespace_only_line = re.compile('^[ \t]+$', re.M)
716 doc = whitespace_only_line.sub('', doc)
717
718 # Cut out common space at line beginnings
719 doc = CutCommonSpacePrefix(doc)
720
721 # Just like this module's comment, comments tend to be aligned somehow.
722 # In other words they all start with the same amount of white space
723 # 1) keep double new lines
724 # 2) keep ws after new lines if not empty line
725 # 3) all other new lines shall be changed to a space
726 # Solution: Match new lines between non white space and replace with space.
727 doc = re.sub('(?<=\S)\n(?=\S)', ' ', doc, re.M)
728
729 return doc
730
731
732 def _GetModuleObjectAndName(globals_dict):
733 """Returns the module that defines a global environment, and its name.
734
735 Args:
736 globals_dict: A dictionary that should correspond to an environment
737 providing the values of the globals.
738
739 Returns:
740 A pair consisting of (1) module object and (2) module name (a
741 string). Returns (None, None) if the module could not be
742 identified.
743 """
744 # The use of .items() (instead of .iteritems()) is NOT a mistake: if
745 # a parallel thread imports a module while we iterate over
746 # .iteritems() (not nice, but possible), we get a RuntimeError ...
747 # Hence, we use the slightly slower but safer .items().
748 for name, module in sys.modules.items():
749 if getattr(module, '__dict__', None) is globals_dict:
750 if name == '__main__':
751 # Pick a more informative name for the main module.
752 name = sys.argv[0]
753 return (module, name)
754 return (None, None)
755
756
757 def _GetMainModule():
758 """Returns: string, name of the module from which execution started."""
759 # First, try to use the same logic used by _GetCallingModuleObjectAndName(),
760 # i.e., call _GetModuleObjectAndName(). For that we first need to
761 # find the dictionary that the main module uses to store the
762 # globals.
763 #
764 # That's (normally) the same dictionary object that the deepest
765 # (oldest) stack frame is using for globals.
766 deepest_frame = sys._getframe(0)
767 while deepest_frame.f_back is not None:
768 deepest_frame = deepest_frame.f_back
769 globals_for_main_module = deepest_frame.f_globals
770 main_module_name = _GetModuleObjectAndName(globals_for_main_module)[1]
771 # The above strategy fails in some cases (e.g., tools that compute
772 # code coverage by redefining, among other things, the main module).
773 # If so, just use sys.argv[0]. We can probably always do this, but
774 # it's safest to try to use the same logic as _GetCallingModuleObjectAndName()
775 if main_module_name is None:
776 main_module_name = sys.argv[0]
777 return main_module_name
778
779
780 class FlagValues:
781 """Registry of 'Flag' objects.
782
783 A 'FlagValues' can then scan command line arguments, passing flag
784 arguments through to the 'Flag' objects that it owns. It also
785 provides easy access to the flag values. Typically only one
786 'FlagValues' object is needed by an application: gflags.FLAGS
787
788 This class is heavily overloaded:
789
790 'Flag' objects are registered via __setitem__:
791 FLAGS['longname'] = x # register a new flag
792
793 The .value attribute of the registered 'Flag' objects can be accessed
794 as attributes of this 'FlagValues' object, through __getattr__. Both
795 the long and short name of the original 'Flag' objects can be used to
796 access its value:
797 FLAGS.longname # parsed flag value
798 FLAGS.x # parsed flag value (short name)
799
800 Command line arguments are scanned and passed to the registered 'Flag'
801 objects through the __call__ method. Unparsed arguments, including
802 argv[0] (e.g. the program name) are returned.
803 argv = FLAGS(sys.argv) # scan command line arguments
804
805 The original registered Flag objects can be retrieved through the use
806 of the dictionary-like operator, __getitem__:
807 x = FLAGS['longname'] # access the registered Flag object
808
809 The str() operator of a 'FlagValues' object provides help for all of
810 the registered 'Flag' objects.
811 """
812
813 def __init__(self):
814 # Since everything in this class is so heavily overloaded, the only
815 # way of defining and using fields is to access __dict__ directly.
816
817 # Dictionary: flag name (string) -> Flag object.
818 self.__dict__['__flags'] = {}
819 # Dictionary: module name (string) -> list of Flag objects that are defined
820 # by that module.
821 self.__dict__['__flags_by_module'] = {}
822 # Dictionary: module id (int) -> list of Flag objects that are defined by
823 # that module.
824 self.__dict__['__flags_by_module_id'] = {}
825 # Dictionary: module name (string) -> list of Flag objects that are
826 # key for that module.
827 self.__dict__['__key_flags_by_module'] = {}
828
829 # Set if we should use new style gnu_getopt rather than getopt when parsing
830 # the args. Only possible with Python 2.3+
831 self.UseGnuGetOpt(False)
832
833 def UseGnuGetOpt(self, use_gnu_getopt=True):
834 """Use GNU-style scanning. Allows mixing of flag and non-flag arguments.
835
836 See http://docs.python.org/library/getopt.html#getopt.gnu_getopt
837
838 Args:
839 use_gnu_getopt: wether or not to use GNU style scanning.
840 """
841 self.__dict__['__use_gnu_getopt'] = use_gnu_getopt
842
843 def IsGnuGetOpt(self):
844 return self.__dict__['__use_gnu_getopt']
845
846 def FlagDict(self):
847 return self.__dict__['__flags']
848
849 def FlagsByModuleDict(self):
850 """Returns the dictionary of module_name -> list of defined flags.
851
852 Returns:
853 A dictionary. Its keys are module names (strings). Its values
854 are lists of Flag objects.
855 """
856 return self.__dict__['__flags_by_module']
857
858 def FlagsByModuleIdDict(self):
859 """Returns the dictionary of module_id -> list of defined flags.
860
861 Returns:
862 A dictionary. Its keys are module IDs (ints). Its values
863 are lists of Flag objects.
864 """
865 return self.__dict__['__flags_by_module_id']
866
867 def KeyFlagsByModuleDict(self):
868 """Returns the dictionary of module_name -> list of key flags.
869
870 Returns:
871 A dictionary. Its keys are module names (strings). Its values
872 are lists of Flag objects.
873 """
874 return self.__dict__['__key_flags_by_module']
875
876 def _RegisterFlagByModule(self, module_name, flag):
877 """Records the module that defines a specific flag.
878
879 We keep track of which flag is defined by which module so that we
880 can later sort the flags by module.
881
882 Args:
883 module_name: A string, the name of a Python module.
884 flag: A Flag object, a flag that is key to the module.
885 """
886 flags_by_module = self.FlagsByModuleDict()
887 flags_by_module.setdefault(module_name, []).append(flag)
888
889 def _RegisterFlagByModuleId(self, module_id, flag):
890 """Records the module that defines a specific flag.
891
892 Args:
893 module_id: An int, the ID of the Python module.
894 flag: A Flag object, a flag that is key to the module.
895 """
896 flags_by_module_id = self.FlagsByModuleIdDict()
897 flags_by_module_id.setdefault(module_id, []).append(flag)
898
899 def _RegisterKeyFlagForModule(self, module_name, flag):
900 """Specifies that a flag is a key flag for a module.
901
902 Args:
903 module_name: A string, the name of a Python module.
904 flag: A Flag object, a flag that is key to the module.
905 """
906 key_flags_by_module = self.KeyFlagsByModuleDict()
907 # The list of key flags for the module named module_name.
908 key_flags = key_flags_by_module.setdefault(module_name, [])
909 # Add flag, but avoid duplicates.
910 if flag not in key_flags:
911 key_flags.append(flag)
912
913 def _GetFlagsDefinedByModule(self, module):
914 """Returns the list of flags defined by a module.
915
916 Args:
917 module: A module object or a module name (a string).
918
919 Returns:
920 A new list of Flag objects. Caller may update this list as he
921 wishes: none of those changes will affect the internals of this
922 FlagValue object.
923 """
924 if not isinstance(module, str):
925 module = module.__name__
926
927 return list(self.FlagsByModuleDict().get(module, []))
928
929 def _GetKeyFlagsForModule(self, module):
930 """Returns the list of key flags for a module.
931
932 Args:
933 module: A module object or a module name (a string)
934
935 Returns:
936 A new list of Flag objects. Caller may update this list as he
937 wishes: none of those changes will affect the internals of this
938 FlagValue object.
939 """
940 if not isinstance(module, str):
941 module = module.__name__
942
943 # Any flag is a key flag for the module that defined it. NOTE:
944 # key_flags is a fresh list: we can update it without affecting the
945 # internals of this FlagValues object.
946 key_flags = self._GetFlagsDefinedByModule(module)
947
948 # Take into account flags explicitly declared as key for a module.
949 for flag in self.KeyFlagsByModuleDict().get(module, []):
950 if flag not in key_flags:
951 key_flags.append(flag)
952 return key_flags
953
954 def FindModuleDefiningFlag(self, flagname, default=None):
955 """Return the name of the module defining this flag, or default.
956
957 Args:
958 flagname: Name of the flag to lookup.
959 default: Value to return if flagname is not defined. Defaults
960 to None.
961
962 Returns:
963 The name of the module which registered the flag with this name.
964 If no such module exists (i.e. no flag with this name exists),
965 we return default.
966 """
967 for module, flags in self.FlagsByModuleDict().iteritems():
968 for flag in flags:
969 if flag.name == flagname or flag.short_name == flagname:
970 return module
971 return default
972
973 def FindModuleIdDefiningFlag(self, flagname, default=None):
974 """Return the ID of the module defining this flag, or default.
975
976 Args:
977 flagname: Name of the flag to lookup.
978 default: Value to return if flagname is not defined. Defaults
979 to None.
980
981 Returns:
982 The ID of the module which registered the flag with this name.
983 If no such module exists (i.e. no flag with this name exists),
984 we return default.
985 """
986 for module_id, flags in self.FlagsByModuleIdDict().iteritems():
987 for flag in flags:
988 if flag.name == flagname or flag.short_name == flagname:
989 return module_id
990 return default
991
992 def AppendFlagValues(self, flag_values):
993 """Appends flags registered in another FlagValues instance.
994
995 Args:
996 flag_values: registry to copy from
997 """
998 for flag_name, flag in flag_values.FlagDict().iteritems():
999 # Each flags with shortname appears here twice (once under its
1000 # normal name, and again with its short name). To prevent
1001 # problems (DuplicateFlagError) with double flag registration, we
1002 # perform a check to make sure that the entry we're looking at is
1003 # for its normal name.
1004 if flag_name == flag.name:
1005 try:
1006 self[flag_name] = flag
1007 except DuplicateFlagError:
1008 raise DuplicateFlagError(flag_name, self,
1009 other_flag_values=flag_values)
1010
1011 def RemoveFlagValues(self, flag_values):
1012 """Remove flags that were previously appended from another FlagValues.
1013
1014 Args:
1015 flag_values: registry containing flags to remove.
1016 """
1017 for flag_name in flag_values.FlagDict():
1018 self.__delattr__(flag_name)
1019
1020 def __setitem__(self, name, flag):
1021 """Registers a new flag variable."""
1022 fl = self.FlagDict()
1023 if not isinstance(flag, Flag):
1024 raise IllegalFlagValue(flag)
1025 if not isinstance(name, type("")):
1026 raise FlagsError("Flag name must be a string")
1027 if len(name) == 0:
1028 raise FlagsError("Flag name cannot be empty")
1029 # If running under pychecker, duplicate keys are likely to be
1030 # defined. Disable check for duplicate keys when pycheck'ing.
1031 if (name in fl and not flag.allow_override and
1032 not fl[name].allow_override and not _RUNNING_PYCHECKER):
1033 module, module_name = _GetCallingModuleObjectAndName()
1034 if (self.FindModuleDefiningFlag(name) == module_name and
1035 id(module) != self.FindModuleIdDefiningFlag(name)):
1036 # If the flag has already been defined by a module with the same name,
1037 # but a different ID, we can stop here because it indicates that the
1038 # module is simply being imported a subsequent time.
1039 return
1040 raise DuplicateFlagError(name, self)
1041 short_name = flag.short_name
1042 if short_name is not None:
1043 if (short_name in fl and not flag.allow_override and
1044 not fl[short_name].allow_override and not _RUNNING_PYCHECKER):
1045 raise DuplicateFlagError(short_name, self)
1046 fl[short_name] = flag
1047 fl[name] = flag
1048 global _exported_flags
1049 _exported_flags[name] = flag
1050
1051 def __getitem__(self, name):
1052 """Retrieves the Flag object for the flag --name."""
1053 return self.FlagDict()[name]
1054
1055 def __getattr__(self, name):
1056 """Retrieves the 'value' attribute of the flag --name."""
1057 fl = self.FlagDict()
1058 if name not in fl:
1059 raise AttributeError(name)
1060 return fl[name].value
1061
1062 def __setattr__(self, name, value):
1063 """Sets the 'value' attribute of the flag --name."""
1064 fl = self.FlagDict()
1065 fl[name].value = value
1066 self._AssertValidators(fl[name].validators)
1067 return value
1068
1069 def _AssertAllValidators(self):
1070 all_validators = set()
1071 for flag in self.FlagDict().itervalues():
1072 for validator in flag.validators:
1073 all_validators.add(validator)
1074 self._AssertValidators(all_validators)
1075
1076 def _AssertValidators(self, validators):
1077 """Assert if all validators in the list are satisfied.
1078
1079 Asserts validators in the order they were created.
1080 Args:
1081 validators: Iterable(gflags_validators.Validator), validators to be
1082 verified
1083 Raises:
1084 AttributeError: if validators work with a non-existing flag.
1085 IllegalFlagValue: if validation fails for at least one validator
1086 """
1087 for validator in sorted(
1088 validators, key=lambda validator: validator.insertion_index):
1089 try:
1090 validator.Verify(self)
1091 except gflags_validators.Error, e:
1092 message = validator.PrintFlagsWithValues(self)
1093 raise IllegalFlagValue('%s: %s' % (message, str(e)))
1094
1095 def _FlagIsRegistered(self, flag_obj):
1096 """Checks whether a Flag object is registered under some name.
1097
1098 Note: this is non trivial: in addition to its normal name, a flag
1099 may have a short name too. In self.FlagDict(), both the normal and
1100 the short name are mapped to the same flag object. E.g., calling
1101 only "del FLAGS.short_name" is not unregistering the corresponding
1102 Flag object (it is still registered under the longer name).
1103
1104 Args:
1105 flag_obj: A Flag object.
1106
1107 Returns:
1108 A boolean: True iff flag_obj is registered under some name.
1109 """
1110 flag_dict = self.FlagDict()
1111 # Check whether flag_obj is registered under its long name.
1112 name = flag_obj.name
1113 if flag_dict.get(name, None) == flag_obj:
1114 return True
1115 # Check whether flag_obj is registered under its short name.
1116 short_name = flag_obj.short_name
1117 if (short_name is not None and
1118 flag_dict.get(short_name, None) == flag_obj):
1119 return True
1120 # The flag cannot be registered under any other name, so we do not
1121 # need to do a full search through the values of self.FlagDict().
1122 return False
1123
1124 def __delattr__(self, flag_name):
1125 """Deletes a previously-defined flag from a flag object.
1126
1127 This method makes sure we can delete a flag by using
1128
1129 del flag_values_object.<flag_name>
1130
1131 E.g.,
1132
1133 gflags.DEFINE_integer('foo', 1, 'Integer flag.')
1134 del gflags.FLAGS.foo
1135
1136 Args:
1137 flag_name: A string, the name of the flag to be deleted.
1138
1139 Raises:
1140 AttributeError: When there is no registered flag named flag_name.
1141 """
1142 fl = self.FlagDict()
1143 if flag_name not in fl:
1144 raise AttributeError(flag_name)
1145
1146 flag_obj = fl[flag_name]
1147 del fl[flag_name]
1148
1149 if not self._FlagIsRegistered(flag_obj):
1150 # If the Flag object indicated by flag_name is no longer
1151 # registered (please see the docstring of _FlagIsRegistered), then
1152 # we delete the occurrences of the flag object in all our internal
1153 # dictionaries.
1154 self.__RemoveFlagFromDictByModule(self.FlagsByModuleDict(), flag_obj)
1155 self.__RemoveFlagFromDictByModule(self.FlagsByModuleIdDict(), flag_obj)
1156 self.__RemoveFlagFromDictByModule(self.KeyFlagsByModuleDict(), flag_obj)
1157
1158 def __RemoveFlagFromDictByModule(self, flags_by_module_dict, flag_obj):
1159 """Removes a flag object from a module -> list of flags dictionary.
1160
1161 Args:
1162 flags_by_module_dict: A dictionary that maps module names to lists of
1163 flags.
1164 flag_obj: A flag object.
1165 """
1166 for unused_module, flags_in_module in flags_by_module_dict.iteritems():
1167 # while (as opposed to if) takes care of multiple occurrences of a
1168 # flag in the list for the same module.
1169 while flag_obj in flags_in_module:
1170 flags_in_module.remove(flag_obj)
1171
1172 def SetDefault(self, name, value):
1173 """Changes the default value of the named flag object."""
1174 fl = self.FlagDict()
1175 if name not in fl:
1176 raise AttributeError(name)
1177 fl[name].SetDefault(value)
1178 self._AssertValidators(fl[name].validators)
1179
1180 def __contains__(self, name):
1181 """Returns True if name is a value (flag) in the dict."""
1182 return name in self.FlagDict()
1183
1184 has_key = __contains__ # a synonym for __contains__()
1185
1186 def __iter__(self):
1187 return iter(self.FlagDict())
1188
1189 def __call__(self, argv):
1190 """Parses flags from argv; stores parsed flags into this FlagValues object.
1191
1192 All unparsed arguments are returned. Flags are parsed using the GNU
1193 Program Argument Syntax Conventions, using getopt:
1194
1195 http://www.gnu.org/software/libc/manual/html_mono/libc.html#Getopt
1196
1197 Args:
1198 argv: argument list. Can be of any type that may be converted to a list.
1199
1200 Returns:
1201 The list of arguments not parsed as options, including argv[0]
1202
1203 Raises:
1204 FlagsError: on any parsing error
1205 """
1206 # Support any sequence type that can be converted to a list
1207 argv = list(argv)
1208
1209 shortopts = ""
1210 longopts = []
1211
1212 fl = self.FlagDict()
1213
1214 # This pre parses the argv list for --flagfile=<> options.
1215 argv = argv[:1] + self.ReadFlagsFromFiles(argv[1:], force_gnu=False)
1216
1217 # Correct the argv to support the google style of passing boolean
1218 # parameters. Boolean parameters may be passed by using --mybool,
1219 # --nomybool, --mybool=(true|false|1|0). getopt does not support
1220 # having options that may or may not have a parameter. We replace
1221 # instances of the short form --mybool and --nomybool with their
1222 # full forms: --mybool=(true|false).
1223 original_argv = list(argv) # list() makes a copy
1224 shortest_matches = None
1225 for name, flag in fl.items():
1226 if not flag.boolean:
1227 continue
1228 if shortest_matches is None:
1229 # Determine the smallest allowable prefix for all flag names
1230 shortest_matches = self.ShortestUniquePrefixes(fl)
1231 no_name = 'no' + name
1232 prefix = shortest_matches[name]
1233 no_prefix = shortest_matches[no_name]
1234
1235 # Replace all occurrences of this boolean with extended forms
1236 for arg_idx in range(1, len(argv)):
1237 arg = argv[arg_idx]
1238 if arg.find('=') >= 0: continue
1239 if arg.startswith('--'+prefix) and ('--'+name).startswith(arg):
1240 argv[arg_idx] = ('--%s=true' % name)
1241 elif arg.startswith('--'+no_prefix) and ('--'+no_name).startswith(arg):
1242 argv[arg_idx] = ('--%s=false' % name)
1243
1244 # Loop over all of the flags, building up the lists of short options
1245 # and long options that will be passed to getopt. Short options are
1246 # specified as a string of letters, each letter followed by a colon
1247 # if it takes an argument. Long options are stored in an array of
1248 # strings. Each string ends with an '=' if it takes an argument.
1249 for name, flag in fl.items():
1250 longopts.append(name + "=")
1251 if len(name) == 1: # one-letter option: allow short flag type also
1252 shortopts += name
1253 if not flag.boolean:
1254 shortopts += ":"
1255
1256 longopts.append('undefok=')
1257 undefok_flags = []
1258
1259 # In case --undefok is specified, loop to pick up unrecognized
1260 # options one by one.
1261 unrecognized_opts = []
1262 args = argv[1:]
1263 while True:
1264 try:
1265 if self.__dict__['__use_gnu_getopt']:
1266 optlist, unparsed_args = getopt.gnu_getopt(args, shortopts, longopts)
1267 else:
1268 optlist, unparsed_args = getopt.getopt(args, shortopts, longopts)
1269 break
1270 except getopt.GetoptError, e:
1271 if not e.opt or e.opt in fl:
1272 # Not an unrecognized option, re-raise the exception as a FlagsError
1273 raise FlagsError(e)
1274 # Remove offender from args and try again
1275 for arg_index in range(len(args)):
1276 if ((args[arg_index] == '--' + e.opt) or
1277 (args[arg_index] == '-' + e.opt) or
1278 (args[arg_index].startswith('--' + e.opt + '='))):
1279 unrecognized_opts.append((e.opt, args[arg_index]))
1280 args = args[0:arg_index] + args[arg_index+1:]
1281 break
1282 else:
1283 # We should have found the option, so we don't expect to get
1284 # here. We could assert, but raising the original exception
1285 # might work better.
1286 raise FlagsError(e)
1287
1288 for name, arg in optlist:
1289 if name == '--undefok':
1290 flag_names = arg.split(',')
1291 undefok_flags.extend(flag_names)
1292 # For boolean flags, if --undefok=boolflag is specified, then we should
1293 # also accept --noboolflag, in addition to --boolflag.
1294 # Since we don't know the type of the undefok'd flag, this will affect
1295 # non-boolean flags as well.
1296 # NOTE: You shouldn't use --undefok=noboolflag, because then we will
1297 # accept --nonoboolflag here. We are choosing not to do the conversion
1298 # from noboolflag -> boolflag because of the ambiguity that flag names
1299 # can start with 'no'.
1300 undefok_flags.extend('no' + name for name in flag_names)
1301 continue
1302 if name.startswith('--'):
1303 # long option
1304 name = name[2:]
1305 short_option = 0
1306 else:
1307 # short option
1308 name = name[1:]
1309 short_option = 1
1310 if name in fl:
1311 flag = fl[name]
1312 if flag.boolean and short_option: arg = 1
1313 flag.Parse(arg)
1314
1315 # If there were unrecognized options, raise an exception unless
1316 # the options were named via --undefok.
1317 for opt, value in unrecognized_opts:
1318 if opt not in undefok_flags:
1319 raise UnrecognizedFlagError(opt, value)
1320
1321 if unparsed_args:
1322 if self.__dict__['__use_gnu_getopt']:
1323 # if using gnu_getopt just return the program name + remainder of argv.
1324 ret_val = argv[:1] + unparsed_args
1325 else:
1326 # unparsed_args becomes the first non-flag detected by getopt to
1327 # the end of argv. Because argv may have been modified above,
1328 # return original_argv for this region.
1329 ret_val = argv[:1] + original_argv[-len(unparsed_args):]
1330 else:
1331 ret_val = argv[:1]
1332
1333 self._AssertAllValidators()
1334 return ret_val
1335
1336 def Reset(self):
1337 """Resets the values to the point before FLAGS(argv) was called."""
1338 for f in self.FlagDict().values():
1339 f.Unparse()
1340
1341 def RegisteredFlags(self):
1342 """Returns: a list of the names and short names of all registered flags."""
1343 return list(self.FlagDict())
1344
1345 def FlagValuesDict(self):
1346 """Returns: a dictionary that maps flag names to flag values."""
1347 flag_values = {}
1348
1349 for flag_name in self.RegisteredFlags():
1350 flag = self.FlagDict()[flag_name]
1351 flag_values[flag_name] = flag.value
1352
1353 return flag_values
1354
1355 def __str__(self):
1356 """Generates a help string for all known flags."""
1357 return self.GetHelp()
1358
1359 def GetHelp(self, prefix=''):
1360 """Generates a help string for all known flags."""
1361 helplist = []
1362
1363 flags_by_module = self.FlagsByModuleDict()
1364 if flags_by_module:
1365
1366 modules = sorted(flags_by_module)
1367
1368 # Print the help for the main module first, if possible.
1369 main_module = _GetMainModule()
1370 if main_module in modules:
1371 modules.remove(main_module)
1372 modules = [main_module] + modules
1373
1374 for module in modules:
1375 self.__RenderOurModuleFlags(module, helplist)
1376
1377 self.__RenderModuleFlags('gflags',
1378 _SPECIAL_FLAGS.FlagDict().values(),
1379 helplist)
1380
1381 else:
1382 # Just print one long list of flags.
1383 self.__RenderFlagList(
1384 self.FlagDict().values() + _SPECIAL_FLAGS.FlagDict().values(),
1385 helplist, prefix)
1386
1387 return '\n'.join(helplist)
1388
1389 def __RenderModuleFlags(self, module, flags, output_lines, prefix=""):
1390 """Generates a help string for a given module."""
1391 if not isinstance(module, str):
1392 module = module.__name__
1393 output_lines.append('\n%s%s:' % (prefix, module))
1394 self.__RenderFlagList(flags, output_lines, prefix + " ")
1395
1396 def __RenderOurModuleFlags(self, module, output_lines, prefix=""):
1397 """Generates a help string for a given module."""
1398 flags = self._GetFlagsDefinedByModule(module)
1399 if flags:
1400 self.__RenderModuleFlags(module, flags, output_lines, prefix)
1401
1402 def __RenderOurModuleKeyFlags(self, module, output_lines, prefix=""):
1403 """Generates a help string for the key flags of a given module.
1404
1405 Args:
1406 module: A module object or a module name (a string).
1407 output_lines: A list of strings. The generated help message
1408 lines will be appended to this list.
1409 prefix: A string that is prepended to each generated help line.
1410 """
1411 key_flags = self._GetKeyFlagsForModule(module)
1412 if key_flags:
1413 self.__RenderModuleFlags(module, key_flags, output_lines, prefix)
1414
1415 def ModuleHelp(self, module):
1416 """Describe the key flags of a module.
1417
1418 Args:
1419 module: A module object or a module name (a string).
1420
1421 Returns:
1422 string describing the key flags of a module.
1423 """
1424 helplist = []
1425 self.__RenderOurModuleKeyFlags(module, helplist)
1426 return '\n'.join(helplist)
1427
1428 def MainModuleHelp(self):
1429 """Describe the key flags of the main module.
1430
1431 Returns:
1432 string describing the key flags of a module.
1433 """
1434 return self.ModuleHelp(_GetMainModule())
1435
1436 def __RenderFlagList(self, flaglist, output_lines, prefix=" "):
1437 fl = self.FlagDict()
1438 special_fl = _SPECIAL_FLAGS.FlagDict()
1439 flaglist = [(flag.name, flag) for flag in flaglist]
1440 flaglist.sort()
1441 flagset = {}
1442 for (name, flag) in flaglist:
1443 # It's possible this flag got deleted or overridden since being
1444 # registered in the per-module flaglist. Check now against the
1445 # canonical source of current flag information, the FlagDict.
1446 if fl.get(name, None) != flag and special_fl.get(name, None) != flag:
1447 # a different flag is using this name now
1448 continue
1449 # only print help once
1450 if flag in flagset: continue
1451 flagset[flag] = 1
1452 flaghelp = ""
1453 if flag.short_name: flaghelp += "-%s," % flag.short_name
1454 if flag.boolean:
1455 flaghelp += "--[no]%s" % flag.name + ":"
1456 else:
1457 flaghelp += "--%s" % flag.name + ":"
1458 flaghelp += " "
1459 if flag.help:
1460 flaghelp += flag.help
1461 flaghelp = TextWrap(flaghelp, indent=prefix+" ",
1462 firstline_indent=prefix)
1463 if flag.default_as_str:
1464 flaghelp += "\n"
1465 flaghelp += TextWrap("(default: %s)" % flag.default_as_str,
1466 indent=prefix+" ")
1467 if flag.parser.syntactic_help:
1468 flaghelp += "\n"
1469 flaghelp += TextWrap("(%s)" % flag.parser.syntactic_help,
1470 indent=prefix+" ")
1471 output_lines.append(flaghelp)
1472
1473 def get(self, name, default):
1474 """Returns the value of a flag (if not None) or a default value.
1475
1476 Args:
1477 name: A string, the name of a flag.
1478 default: Default value to use if the flag value is None.
1479 """
1480
1481 value = self.__getattr__(name)
1482 if value is not None: # Can't do if not value, b/c value might be '0' or ""
1483 return value
1484 else:
1485 return default
1486
1487 def ShortestUniquePrefixes(self, fl):
1488 """Returns: dictionary; maps flag names to their shortest unique prefix."""
1489 # Sort the list of flag names
1490 sorted_flags = []
1491 for name, flag in fl.items():
1492 sorted_flags.append(name)
1493 if flag.boolean:
1494 sorted_flags.append('no%s' % name)
1495 sorted_flags.sort()
1496
1497 # For each name in the sorted list, determine the shortest unique
1498 # prefix by comparing itself to the next name and to the previous
1499 # name (the latter check uses cached info from the previous loop).
1500 shortest_matches = {}
1501 prev_idx = 0
1502 for flag_idx in range(len(sorted_flags)):
1503 curr = sorted_flags[flag_idx]
1504 if flag_idx == (len(sorted_flags) - 1):
1505 next = None
1506 else:
1507 next = sorted_flags[flag_idx+1]
1508 next_len = len(next)
1509 for curr_idx in range(len(curr)):
1510 if (next is None
1511 or curr_idx >= next_len
1512 or curr[curr_idx] != next[curr_idx]):
1513 # curr longer than next or no more chars in common
1514 shortest_matches[curr] = curr[:max(prev_idx, curr_idx) + 1]
1515 prev_idx = curr_idx
1516 break
1517 else:
1518 # curr shorter than (or equal to) next
1519 shortest_matches[curr] = curr
1520 prev_idx = curr_idx + 1 # next will need at least one more char
1521 return shortest_matches
1522
1523 def __IsFlagFileDirective(self, flag_string):
1524 """Checks whether flag_string contain a --flagfile=<foo> directive."""
1525 if isinstance(flag_string, type("")):
1526 if flag_string.startswith('--flagfile='):
1527 return 1
1528 elif flag_string == '--flagfile':
1529 return 1
1530 elif flag_string.startswith('-flagfile='):
1531 return 1
1532 elif flag_string == '-flagfile':
1533 return 1
1534 else:
1535 return 0
1536 return 0
1537
1538 def ExtractFilename(self, flagfile_str):
1539 """Returns filename from a flagfile_str of form -[-]flagfile=filename.
1540
1541 The cases of --flagfile foo and -flagfile foo shouldn't be hitting
1542 this function, as they are dealt with in the level above this
1543 function.
1544 """
1545 if flagfile_str.startswith('--flagfile='):
1546 return os.path.expanduser((flagfile_str[(len('--flagfile=')):]).strip())
1547 elif flagfile_str.startswith('-flagfile='):
1548 return os.path.expanduser((flagfile_str[(len('-flagfile=')):]).strip())
1549 else:
1550 raise FlagsError('Hit illegal --flagfile type: %s' % flagfile_str)
1551
1552 def __GetFlagFileLines(self, filename, parsed_file_list):
1553 """Returns the useful (!=comments, etc) lines from a file with flags.
1554
1555 Args:
1556 filename: A string, the name of the flag file.
1557 parsed_file_list: A list of the names of the files we have
1558 already read. MUTATED BY THIS FUNCTION.
1559
1560 Returns:
1561 List of strings. See the note below.
1562
1563 NOTE(springer): This function checks for a nested --flagfile=<foo>
1564 tag and handles the lower file recursively. It returns a list of
1565 all the lines that _could_ contain command flags. This is
1566 EVERYTHING except whitespace lines and comments (lines starting
1567 with '#' or '//').
1568 """
1569 line_list = [] # All line from flagfile.
1570 flag_line_list = [] # Subset of lines w/o comments, blanks, flagfile= tags.
1571 try:
1572 file_obj = open(filename, 'r')
1573 except IOError, e_msg:
1574 raise CantOpenFlagFileError('ERROR:: Unable to open flagfile: %s' % e_msg)
1575
1576 line_list = file_obj.readlines()
1577 file_obj.close()
1578 parsed_file_list.append(filename)
1579
1580 # This is where we check each line in the file we just read.
1581 for line in line_list:
1582 if line.isspace():
1583 pass
1584 # Checks for comment (a line that starts with '#').
1585 elif line.startswith('#') or line.startswith('//'):
1586 pass
1587 # Checks for a nested "--flagfile=<bar>" flag in the current file.
1588 # If we find one, recursively parse down into that file.
1589 elif self.__IsFlagFileDirective(line):
1590 sub_filename = self.ExtractFilename(line)
1591 # We do a little safety check for reparsing a file we've already done.
1592 if not sub_filename in parsed_file_list:
1593 included_flags = self.__GetFlagFileLines(sub_filename,
1594 parsed_file_list)
1595 flag_line_list.extend(included_flags)
1596 else: # Case of hitting a circularly included file.
1597 sys.stderr.write('Warning: Hit circular flagfile dependency: %s\n' %
1598 (sub_filename,))
1599 else:
1600 # Any line that's not a comment or a nested flagfile should get
1601 # copied into 2nd position. This leaves earlier arguments
1602 # further back in the list, thus giving them higher priority.
1603 flag_line_list.append(line.strip())
1604 return flag_line_list
1605
1606 def ReadFlagsFromFiles(self, argv, force_gnu=True):
1607 """Processes command line args, but also allow args to be read from file.
1608
1609 Args:
1610 argv: A list of strings, usually sys.argv[1:], which may contain one or
1611 more flagfile directives of the form --flagfile="./filename".
1612 Note that the name of the program (sys.argv[0]) should be omitted.
1613 force_gnu: If False, --flagfile parsing obeys normal flag semantics.
1614 If True, --flagfile parsing instead follows gnu_getopt semantics.
1615 *** WARNING *** force_gnu=False may become the future default!
1616
1617 Returns:
1618
1619 A new list which has the original list combined with what we read
1620 from any flagfile(s).
1621
1622 References: Global gflags.FLAG class instance.
1623
1624 This function should be called before the normal FLAGS(argv) call.
1625 This function scans the input list for a flag that looks like:
1626 --flagfile=<somefile>. Then it opens <somefile>, reads all valid key
1627 and value pairs and inserts them into the input list between the
1628 first item of the list and any subsequent items in the list.
1629
1630 Note that your application's flags are still defined the usual way
1631 using gflags DEFINE_flag() type functions.
1632
1633 Notes (assuming we're getting a commandline of some sort as our input):
1634 --> Flags from the command line argv _should_ always take precedence!
1635 --> A further "--flagfile=<otherfile.cfg>" CAN be nested in a flagfile.
1636 It will be processed after the parent flag file is done.
1637 --> For duplicate flags, first one we hit should "win".
1638 --> In a flagfile, a line beginning with # or // is a comment.
1639 --> Entirely blank lines _should_ be ignored.
1640 """
1641 parsed_file_list = []
1642 rest_of_args = argv
1643 new_argv = []
1644 while rest_of_args:
1645 current_arg = rest_of_args[0]
1646 rest_of_args = rest_of_args[1:]
1647 if self.__IsFlagFileDirective(current_arg):
1648 # This handles the case of -(-)flagfile foo. In this case the
1649 # next arg really is part of this one.
1650 if current_arg == '--flagfile' or current_arg == '-flagfile':
1651 if not rest_of_args:
1652 raise IllegalFlagValue('--flagfile with no argument')
1653 flag_filename = os.path.expanduser(rest_of_args[0])
1654 rest_of_args = rest_of_args[1:]
1655 else:
1656 # This handles the case of (-)-flagfile=foo.
1657 flag_filename = self.ExtractFilename(current_arg)
1658 new_argv.extend(
1659 self.__GetFlagFileLines(flag_filename, parsed_file_list))
1660 else:
1661 new_argv.append(current_arg)
1662 # Stop parsing after '--', like getopt and gnu_getopt.
1663 if current_arg == '--':
1664 break
1665 # Stop parsing after a non-flag, like getopt.
1666 if not current_arg.startswith('-'):
1667 if not force_gnu and not self.__dict__['__use_gnu_getopt']:
1668 break
1669
1670 if rest_of_args:
1671 new_argv.extend(rest_of_args)
1672
1673 return new_argv
1674
1675 def FlagsIntoString(self):
1676 """Returns a string with the flags assignments from this FlagValues object.
1677
1678 This function ignores flags whose value is None. Each flag
1679 assignment is separated by a newline.
1680
1681 NOTE: MUST mirror the behavior of the C++ CommandlineFlagsIntoString
1682 from http://code.google.com/p/google-gflags
1683 """
1684 s = ''
1685 for flag in self.FlagDict().values():
1686 if flag.value is not None:
1687 s += flag.Serialize() + '\n'
1688 return s
1689
1690 def AppendFlagsIntoFile(self, filename):
1691 """Appends all flags assignments from this FlagInfo object to a file.
1692
1693 Output will be in the format of a flagfile.
1694
1695 NOTE: MUST mirror the behavior of the C++ AppendFlagsIntoFile
1696 from http://code.google.com/p/google-gflags
1697 """
1698 out_file = open(filename, 'a')
1699 out_file.write(self.FlagsIntoString())
1700 out_file.close()
1701
1702 def WriteHelpInXMLFormat(self, outfile=None):
1703 """Outputs flag documentation in XML format.
1704
1705 NOTE: We use element names that are consistent with those used by
1706 the C++ command-line flag library, from
1707 http://code.google.com/p/google-gflags
1708 We also use a few new elements (e.g., <key>), but we do not
1709 interfere / overlap with existing XML elements used by the C++
1710 library. Please maintain this consistency.
1711
1712 Args:
1713 outfile: File object we write to. Default None means sys.stdout.
1714 """
1715 outfile = outfile or sys.stdout
1716
1717 outfile.write('<?xml version=\"1.0\"?>\n')
1718 outfile.write('<AllFlags>\n')
1719 indent = ' '
1720 _WriteSimpleXMLElement(outfile, 'program', os.path.basename(sys.argv[0]),
1721 indent)
1722
1723 usage_doc = sys.modules['__main__'].__doc__
1724 if not usage_doc:
1725 usage_doc = '\nUSAGE: %s [flags]\n' % sys.argv[0]
1726 else:
1727 usage_doc = usage_doc.replace('%s', sys.argv[0])
1728 _WriteSimpleXMLElement(outfile, 'usage', usage_doc, indent)
1729
1730 # Get list of key flags for the main module.
1731 key_flags = self._GetKeyFlagsForModule(_GetMainModule())
1732
1733 # Sort flags by declaring module name and next by flag name.
1734 flags_by_module = self.FlagsByModuleDict()
1735 all_module_names = list(flags_by_module.keys())
1736 all_module_names.sort()
1737 for module_name in all_module_names:
1738 flag_list = [(f.name, f) for f in flags_by_module[module_name]]
1739 flag_list.sort()
1740 for unused_flag_name, flag in flag_list:
1741 is_key = flag in key_flags
1742 flag.WriteInfoInXMLFormat(outfile, module_name,
1743 is_key=is_key, indent=indent)
1744
1745 outfile.write('</AllFlags>\n')
1746 outfile.flush()
1747
1748 def AddValidator(self, validator):
1749 """Register new flags validator to be checked.
1750
1751 Args:
1752 validator: gflags_validators.Validator
1753 Raises:
1754 AttributeError: if validators work with a non-existing flag.
1755 """
1756 for flag_name in validator.GetFlagsNames():
1757 flag = self.FlagDict()[flag_name]
1758 flag.validators.append(validator)
1759
1760 # end of FlagValues definition
1761
1762
1763 # The global FlagValues instance
1764 FLAGS = FlagValues()
1765
1766
1767 def _StrOrUnicode(value):
1768 """Converts value to a python string or, if necessary, unicode-string."""
1769 try:
1770 return str(value)
1771 except UnicodeEncodeError:
1772 return unicode(value)
1773
1774
1775 def _MakeXMLSafe(s):
1776 """Escapes <, >, and & from s, and removes XML 1.0-illegal chars."""
1777 s = cgi.escape(s) # Escape <, >, and &
1778 # Remove characters that cannot appear in an XML 1.0 document
1779 # (http://www.w3.org/TR/REC-xml/#charsets).
1780 #
1781 # NOTE: if there are problems with current solution, one may move to
1782 # XML 1.1, which allows such chars, if they're entity-escaped (&#xHH;).
1783 s = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f]', '', s)
1784 # Convert non-ascii characters to entities. Note: requires python >=2.3
1785 s = s.encode('ascii', 'xmlcharrefreplace') # u'\xce\x88' -> 'u&#904;'
1786 return s
1787
1788
1789 def _WriteSimpleXMLElement(outfile, name, value, indent):
1790 """Writes a simple XML element.
1791
1792 Args:
1793 outfile: File object we write the XML element to.
1794 name: A string, the name of XML element.
1795 value: A Python object, whose string representation will be used
1796 as the value of the XML element.
1797 indent: A string, prepended to each line of generated output.
1798 """
1799 value_str = _StrOrUnicode(value)
1800 if isinstance(value, bool):
1801 # Display boolean values as the C++ flag library does: no caps.
1802 value_str = value_str.lower()
1803 safe_value_str = _MakeXMLSafe(value_str)
1804 outfile.write('%s<%s>%s</%s>\n' % (indent, name, safe_value_str, name))
1805
1806
1807 class Flag:
1808 """Information about a command-line flag.
1809
1810 'Flag' objects define the following fields:
1811 .name - the name for this flag
1812 .default - the default value for this flag
1813 .default_as_str - default value as repr'd string, e.g., "'true'" (or None)
1814 .value - the most recent parsed value of this flag; set by Parse()
1815 .help - a help string or None if no help is available
1816 .short_name - the single letter alias for this flag (or None)
1817 .boolean - if 'true', this flag does not accept arguments
1818 .present - true if this flag was parsed from command line flags.
1819 .parser - an ArgumentParser object
1820 .serializer - an ArgumentSerializer object
1821 .allow_override - the flag may be redefined without raising an error
1822
1823 The only public method of a 'Flag' object is Parse(), but it is
1824 typically only called by a 'FlagValues' object. The Parse() method is
1825 a thin wrapper around the 'ArgumentParser' Parse() method. The parsed
1826 value is saved in .value, and the .present attribute is updated. If
1827 this flag was already present, a FlagsError is raised.
1828
1829 Parse() is also called during __init__ to parse the default value and
1830 initialize the .value attribute. This enables other python modules to
1831 safely use flags even if the __main__ module neglects to parse the
1832 command line arguments. The .present attribute is cleared after
1833 __init__ parsing. If the default value is set to None, then the
1834 __init__ parsing step is skipped and the .value attribute is
1835 initialized to None.
1836
1837 Note: The default value is also presented to the user in the help
1838 string, so it is important that it be a legal value for this flag.
1839 """
1840
1841 def __init__(self, parser, serializer, name, default, help_string,
1842 short_name=None, boolean=0, allow_override=0):
1843 self.name = name
1844
1845 if not help_string:
1846 help_string = '(no help available)'
1847
1848 self.help = help_string
1849 self.short_name = short_name
1850 self.boolean = boolean
1851 self.present = 0
1852 self.parser = parser
1853 self.serializer = serializer
1854 self.allow_override = allow_override
1855 self.value = None
1856 self.validators = []
1857
1858 self.SetDefault(default)
1859
1860 def __hash__(self):
1861 return hash(id(self))
1862
1863 def __eq__(self, other):
1864 return self is other
1865
1866 def __lt__(self, other):
1867 if isinstance(other, Flag):
1868 return id(self) < id(other)
1869 return NotImplemented
1870
1871 def __GetParsedValueAsString(self, value):
1872 if value is None:
1873 return None
1874 if self.serializer:
1875 return repr(self.serializer.Serialize(value))
1876 if self.boolean:
1877 if value:
1878 return repr('true')
1879 else:
1880 return repr('false')
1881 return repr(_StrOrUnicode(value))
1882
1883 def Parse(self, argument):
1884 try:
1885 self.value = self.parser.Parse(argument)
1886 except ValueError, e: # recast ValueError as IllegalFlagValue
1887 raise IllegalFlagValue("flag --%s=%s: %s" % (self.name, argument, e))
1888 self.present += 1
1889
1890 def Unparse(self):
1891 if self.default is None:
1892 self.value = None
1893 else:
1894 self.Parse(self.default)
1895 self.present = 0
1896
1897 def Serialize(self):
1898 if self.value is None:
1899 return ''
1900 if self.boolean:
1901 if self.value:
1902 return "--%s" % self.name
1903 else:
1904 return "--no%s" % self.name
1905 else:
1906 if not self.serializer:
1907 raise FlagsError("Serializer not present for flag %s" % self.name)
1908 return "--%s=%s" % (self.name, self.serializer.Serialize(self.value))
1909
1910 def SetDefault(self, value):
1911 """Changes the default value (and current value too) for this Flag."""
1912 # We can't allow a None override because it may end up not being
1913 # passed to C++ code when we're overriding C++ flags. So we
1914 # cowardly bail out until someone fixes the semantics of trying to
1915 # pass None to a C++ flag. See swig_flags.Init() for details on
1916 # this behavior.
1917 # TODO(olexiy): Users can directly call this method, bypassing all flags
1918 # validators (we don't have FlagValues here, so we can not check
1919 # validators).
1920 # The simplest solution I see is to make this method private.
1921 # Another approach would be to store reference to the corresponding
1922 # FlagValues with each flag, but this seems to be an overkill.
1923 if value is None and self.allow_override:
1924 raise DuplicateFlagCannotPropagateNoneToSwig(self.name)
1925
1926 self.default = value
1927 self.Unparse()
1928 self.default_as_str = self.__GetParsedValueAsString(self.value)
1929
1930 def Type(self):
1931 """Returns: a string that describes the type of this Flag."""
1932 # NOTE: we use strings, and not the types.*Type constants because
1933 # our flags can have more exotic types, e.g., 'comma separated list
1934 # of strings', 'whitespace separated list of strings', etc.
1935 return self.parser.Type()
1936
1937 def WriteInfoInXMLFormat(self, outfile, module_name, is_key=False, indent=''):
1938 """Writes common info about this flag, in XML format.
1939
1940 This is information that is relevant to all flags (e.g., name,
1941 meaning, etc.). If you defined a flag that has some other pieces of
1942 info, then please override _WriteCustomInfoInXMLFormat.
1943
1944 Please do NOT override this method.
1945
1946 Args:
1947 outfile: File object we write to.
1948 module_name: A string, the name of the module that defines this flag.
1949 is_key: A boolean, True iff this flag is key for main module.
1950 indent: A string that is prepended to each generated line.
1951 """
1952 outfile.write(indent + '<flag>\n')
1953 inner_indent = indent + ' '
1954 if is_key:
1955 _WriteSimpleXMLElement(outfile, 'key', 'yes', inner_indent)
1956 _WriteSimpleXMLElement(outfile, 'file', module_name, inner_indent)
1957 # Print flag features that are relevant for all flags.
1958 _WriteSimpleXMLElement(outfile, 'name', self.name, inner_indent)
1959 if self.short_name:
1960 _WriteSimpleXMLElement(outfile, 'short_name', self.short_name,
1961 inner_indent)
1962 if self.help:
1963 _WriteSimpleXMLElement(outfile, 'meaning', self.help, inner_indent)
1964 # The default flag value can either be represented as a string like on the
1965 # command line, or as a Python object. We serialize this value in the
1966 # latter case in order to remain consistent.
1967 if self.serializer and not isinstance(self.default, str):
1968 default_serialized = self.serializer.Serialize(self.default)
1969 else:
1970 default_serialized = self.default
1971 _WriteSimpleXMLElement(outfile, 'default', default_serialized, inner_indent)
1972 _WriteSimpleXMLElement(outfile, 'current', self.value, inner_indent)
1973 _WriteSimpleXMLElement(outfile, 'type', self.Type(), inner_indent)
1974 # Print extra flag features this flag may have.
1975 self._WriteCustomInfoInXMLFormat(outfile, inner_indent)
1976 outfile.write(indent + '</flag>\n')
1977
1978 def _WriteCustomInfoInXMLFormat(self, outfile, indent):
1979 """Writes extra info about this flag, in XML format.
1980
1981 "Extra" means "not already printed by WriteInfoInXMLFormat above."
1982
1983 Args:
1984 outfile: File object we write to.
1985 indent: A string that is prepended to each generated line.
1986 """
1987 # Usually, the parser knows the extra details about the flag, so
1988 # we just forward the call to it.
1989 self.parser.WriteCustomInfoInXMLFormat(outfile, indent)
1990 # End of Flag definition
1991
1992
1993 class _ArgumentParserCache(type):
1994 """Metaclass used to cache and share argument parsers among flags."""
1995
1996 _instances = {}
1997
1998 def __call__(mcs, *args, **kwargs):
1999 """Returns an instance of the argument parser cls.
2000
2001 This method overrides behavior of the __new__ methods in
2002 all subclasses of ArgumentParser (inclusive). If an instance
2003 for mcs with the same set of arguments exists, this instance is
2004 returned, otherwise a new instance is created.
2005
2006 If any keyword arguments are defined, or the values in args
2007 are not hashable, this method always returns a new instance of
2008 cls.
2009
2010 Args:
2011 args: Positional initializer arguments.
2012 kwargs: Initializer keyword arguments.
2013
2014 Returns:
2015 An instance of cls, shared or new.
2016 """
2017 if kwargs:
2018 return type.__call__(mcs, *args, **kwargs)
2019 else:
2020 instances = mcs._instances
2021 key = (mcs,) + tuple(args)
2022 try:
2023 return instances[key]
2024 except KeyError:
2025 # No cache entry for key exists, create a new one.
2026 return instances.setdefault(key, type.__call__(mcs, *args))
2027 except TypeError:
2028 # An object in args cannot be hashed, always return
2029 # a new instance.
2030 return type.__call__(mcs, *args)
2031
2032
2033 class ArgumentParser(object):
2034 """Base class used to parse and convert arguments.
2035
2036 The Parse() method checks to make sure that the string argument is a
2037 legal value and convert it to a native type. If the value cannot be
2038 converted, it should throw a 'ValueError' exception with a human
2039 readable explanation of why the value is illegal.
2040
2041 Subclasses should also define a syntactic_help string which may be
2042 presented to the user to describe the form of the legal values.
2043
2044 Argument parser classes must be stateless, since instances are cached
2045 and shared between flags. Initializer arguments are allowed, but all
2046 member variables must be derived from initializer arguments only.
2047 """
2048 __metaclass__ = _ArgumentParserCache
2049
2050 syntactic_help = ""
2051
2052 def Parse(self, argument):
2053 """Default implementation: always returns its argument unmodified."""
2054 return argument
2055
2056 def Type(self):
2057 return 'string'
2058
2059 def WriteCustomInfoInXMLFormat(self, outfile, indent):
2060 pass
2061
2062
2063 class ArgumentSerializer:
2064 """Base class for generating string representations of a flag value."""
2065
2066 def Serialize(self, value):
2067 return _StrOrUnicode(value)
2068
2069
2070 class ListSerializer(ArgumentSerializer):
2071
2072 def __init__(self, list_sep):
2073 self.list_sep = list_sep
2074
2075 def Serialize(self, value):
2076 return self.list_sep.join([_StrOrUnicode(x) for x in value])
2077
2078
2079 # Flags validators
2080
2081
2082 def RegisterValidator(flag_name,
2083 checker,
2084 message='Flag validation failed',
2085 flag_values=FLAGS):
2086 """Adds a constraint, which will be enforced during program execution.
2087
2088 The constraint is validated when flags are initially parsed, and after each
2089 change of the corresponding flag's value.
2090 Args:
2091 flag_name: string, name of the flag to be checked.
2092 checker: method to validate the flag.
2093 input - value of the corresponding flag (string, boolean, etc.
2094 This value will be passed to checker by the library). See file's
2095 docstring for examples.
2096 output - Boolean.
2097 Must return True if validator constraint is satisfied.
2098 If constraint is not satisfied, it should either return False or
2099 raise gflags_validators.Error(desired_error_message).
2100 message: error text to be shown to the user if checker returns False.
2101 If checker raises gflags_validators.Error, message from the raised
2102 Error will be shown.
2103 flag_values: FlagValues
2104 Raises:
2105 AttributeError: if flag_name is not registered as a valid flag name.
2106 """
2107 flag_values.AddValidator(gflags_validators.SimpleValidator(flag_name,
2108 checker,
2109 message))
2110
2111
2112 def MarkFlagAsRequired(flag_name, flag_values=FLAGS):
2113 """Ensure that flag is not None during program execution.
2114
2115 Registers a flag validator, which will follow usual validator
2116 rules.
2117 Args:
2118 flag_name: string, name of the flag
2119 flag_values: FlagValues
2120 Raises:
2121 AttributeError: if flag_name is not registered as a valid flag name.
2122 """
2123 RegisterValidator(flag_name,
2124 lambda value: value is not None,
2125 message='Flag --%s must be specified.' % flag_name,
2126 flag_values=flag_values)
2127
2128
2129 def _RegisterBoundsValidatorIfNeeded(parser, name, flag_values):
2130 """Enforce lower and upper bounds for numeric flags.
2131
2132 Args:
2133 parser: NumericParser (either FloatParser or IntegerParser). Provides lower
2134 and upper bounds, and help text to display.
2135 name: string, name of the flag
2136 flag_values: FlagValues
2137 """
2138 if parser.lower_bound is not None or parser.upper_bound is not None:
2139
2140 def Checker(value):
2141 if value is not None and parser.IsOutsideBounds(value):
2142 message = '%s is not %s' % (value, parser.syntactic_help)
2143 raise gflags_validators.Error(message)
2144 return True
2145
2146 RegisterValidator(name,
2147 Checker,
2148 flag_values=flag_values)
2149
2150
2151 # The DEFINE functions are explained in mode details in the module doc string.
2152
2153
2154 def DEFINE(parser, name, default, help, flag_values=FLAGS, serializer=None,
2155 **args):
2156 """Registers a generic Flag object.
2157
2158 NOTE: in the docstrings of all DEFINE* functions, "registers" is short
2159 for "creates a new flag and registers it".
2160
2161 Auxiliary function: clients should use the specialized DEFINE_<type>
2162 function instead.
2163
2164 Args:
2165 parser: ArgumentParser that is used to parse the flag arguments.
2166 name: A string, the flag name.
2167 default: The default value of the flag.
2168 help: A help string.
2169 flag_values: FlagValues object the flag will be registered with.
2170 serializer: ArgumentSerializer that serializes the flag value.
2171 args: Dictionary with extra keyword args that are passes to the
2172 Flag __init__.
2173 """
2174 DEFINE_flag(Flag(parser, serializer, name, default, help, **args),
2175 flag_values)
2176
2177
2178 def DEFINE_flag(flag, flag_values=FLAGS):
2179 """Registers a 'Flag' object with a 'FlagValues' object.
2180
2181 By default, the global FLAGS 'FlagValue' object is used.
2182
2183 Typical users will use one of the more specialized DEFINE_xxx
2184 functions, such as DEFINE_string or DEFINE_integer. But developers
2185 who need to create Flag objects themselves should use this function
2186 to register their flags.
2187 """
2188 # copying the reference to flag_values prevents pychecker warnings
2189 fv = flag_values
2190 fv[flag.name] = flag
2191 # Tell flag_values who's defining the flag.
2192 if isinstance(flag_values, FlagValues):
2193 # Regarding the above isinstance test: some users pass funny
2194 # values of flag_values (e.g., {}) in order to avoid the flag
2195 # registration (in the past, there used to be a flag_values ==
2196 # FLAGS test here) and redefine flags with the same name (e.g.,
2197 # debug). To avoid breaking their code, we perform the
2198 # registration only if flag_values is a real FlagValues object.
2199 module, module_name = _GetCallingModuleObjectAndName()
2200 flag_values._RegisterFlagByModule(module_name, flag)
2201 flag_values._RegisterFlagByModuleId(id(module), flag)
2202
2203
2204 def _InternalDeclareKeyFlags(flag_names,
2205 flag_values=FLAGS, key_flag_values=None):
2206 """Declares a flag as key for the calling module.
2207
2208 Internal function. User code should call DECLARE_key_flag or
2209 ADOPT_module_key_flags instead.
2210
2211 Args:
2212 flag_names: A list of strings that are names of already-registered
2213 Flag objects.
2214 flag_values: A FlagValues object that the flags listed in
2215 flag_names have registered with (the value of the flag_values
2216 argument from the DEFINE_* calls that defined those flags).
2217 This should almost never need to be overridden.
2218 key_flag_values: A FlagValues object that (among possibly many
2219 other things) keeps track of the key flags for each module.
2220 Default None means "same as flag_values". This should almost
2221 never need to be overridden.
2222
2223 Raises:
2224 UnrecognizedFlagError: when we refer to a flag that was not
2225 defined yet.
2226 """
2227 key_flag_values = key_flag_values or flag_values
2228
2229 module = _GetCallingModule()
2230
2231 for flag_name in flag_names:
2232 if flag_name not in flag_values:
2233 raise UnrecognizedFlagError(flag_name)
2234 flag = flag_values.FlagDict()[flag_name]
2235 key_flag_values._RegisterKeyFlagForModule(module, flag)
2236
2237
2238 def DECLARE_key_flag(flag_name, flag_values=FLAGS):
2239 """Declares one flag as key to the current module.
2240
2241 Key flags are flags that are deemed really important for a module.
2242 They are important when listing help messages; e.g., if the
2243 --helpshort command-line flag is used, then only the key flags of the
2244 main module are listed (instead of all flags, as in the case of
2245 --help).
2246
2247 Sample usage:
2248
2249 gflags.DECLARED_key_flag('flag_1')
2250
2251 Args:
2252 flag_name: A string, the name of an already declared flag.
2253 (Redeclaring flags as key, including flags implicitly key
2254 because they were declared in this module, is a no-op.)
2255 flag_values: A FlagValues object. This should almost never
2256 need to be overridden.
2257 """
2258 if flag_name in _SPECIAL_FLAGS:
2259 # Take care of the special flags, e.g., --flagfile, --undefok.
2260 # These flags are defined in _SPECIAL_FLAGS, and are treated
2261 # specially during flag parsing, taking precedence over the
2262 # user-defined flags.
2263 _InternalDeclareKeyFlags([flag_name],
2264 flag_values=_SPECIAL_FLAGS,
2265 key_flag_values=flag_values)
2266 return
2267 _InternalDeclareKeyFlags([flag_name], flag_values=flag_values)
2268
2269
2270 def ADOPT_module_key_flags(module, flag_values=FLAGS):
2271 """Declares that all flags key to a module are key to the current module.
2272
2273 Args:
2274 module: A module object.
2275 flag_values: A FlagValues object. This should almost never need
2276 to be overridden.
2277
2278 Raises:
2279 FlagsError: When given an argument that is a module name (a
2280 string), instead of a module object.
2281 """
2282 # NOTE(salcianu): an even better test would be if not
2283 # isinstance(module, types.ModuleType) but I didn't want to import
2284 # types for such a tiny use.
2285 if isinstance(module, str):
2286 raise FlagsError('Received module name %s; expected a module object.'
2287 % module)
2288 _InternalDeclareKeyFlags(
2289 [f.name for f in flag_values._GetKeyFlagsForModule(module.__name__)],
2290 flag_values=flag_values)
2291 # If module is this flag module, take _SPECIAL_FLAGS into account.
2292 if module == _GetThisModuleObjectAndName()[0]:
2293 _InternalDeclareKeyFlags(
2294 # As we associate flags with _GetCallingModuleObjectAndName(), the
2295 # special flags defined in this module are incorrectly registered with
2296 # a different module. So, we can't use _GetKeyFlagsForModule.
2297 # Instead, we take all flags from _SPECIAL_FLAGS (a private
2298 # FlagValues, where no other module should register flags).
2299 [f.name for f in _SPECIAL_FLAGS.FlagDict().values()],
2300 flag_values=_SPECIAL_FLAGS,
2301 key_flag_values=flag_values)
2302
2303
2304 #
2305 # STRING FLAGS
2306 #
2307
2308
2309 def DEFINE_string(name, default, help, flag_values=FLAGS, **args):
2310 """Registers a flag whose value can be any string."""
2311 parser = ArgumentParser()
2312 serializer = ArgumentSerializer()
2313 DEFINE(parser, name, default, help, flag_values, serializer, **args)
2314
2315
2316 #
2317 # BOOLEAN FLAGS
2318 #
2319
2320
2321 class BooleanParser(ArgumentParser):
2322 """Parser of boolean values."""
2323
2324 def Convert(self, argument):
2325 """Converts the argument to a boolean; raise ValueError on errors."""
2326 if type(argument) == str:
2327 if argument.lower() in ['true', 't', '1']:
2328 return True
2329 elif argument.lower() in ['false', 'f', '0']:
2330 return False
2331
2332 bool_argument = bool(argument)
2333 if argument == bool_argument:
2334 # The argument is a valid boolean (True, False, 0, or 1), and not just
2335 # something that always converts to bool (list, string, int, etc.).
2336 return bool_argument
2337
2338 raise ValueError('Non-boolean argument to boolean flag', argument)
2339
2340 def Parse(self, argument):
2341 val = self.Convert(argument)
2342 return val
2343
2344 def Type(self):
2345 return 'bool'
2346
2347
2348 class BooleanFlag(Flag):
2349 """Basic boolean flag.
2350
2351 Boolean flags do not take any arguments, and their value is either
2352 True (1) or False (0). The false value is specified on the command
2353 line by prepending the word 'no' to either the long or the short flag
2354 name.
2355
2356 For example, if a Boolean flag was created whose long name was
2357 'update' and whose short name was 'x', then this flag could be
2358 explicitly unset through either --noupdate or --nox.
2359 """
2360
2361 def __init__(self, name, default, help, short_name=None, **args):
2362 p = BooleanParser()
2363 Flag.__init__(self, p, None, name, default, help, short_name, 1, **args)
2364 if not self.help: self.help = "a boolean value"
2365
2366
2367 def DEFINE_boolean(name, default, help, flag_values=FLAGS, **args):
2368 """Registers a boolean flag.
2369
2370 Such a boolean flag does not take an argument. If a user wants to
2371 specify a false value explicitly, the long option beginning with 'no'
2372 must be used: i.e. --noflag
2373
2374 This flag will have a value of None, True or False. None is possible
2375 if default=None and the user does not specify the flag on the command
2376 line.
2377 """
2378 DEFINE_flag(BooleanFlag(name, default, help, **args), flag_values)
2379
2380
2381 # Match C++ API to unconfuse C++ people.
2382 DEFINE_bool = DEFINE_boolean
2383
2384
2385 class HelpFlag(BooleanFlag):
2386 """
2387 HelpFlag is a special boolean flag that prints usage information and
2388 raises a SystemExit exception if it is ever found in the command
2389 line arguments. Note this is called with allow_override=1, so other
2390 apps can define their own --help flag, replacing this one, if they want.
2391 """
2392 def __init__(self):
2393 BooleanFlag.__init__(self, "help", 0, "show this help",
2394 short_name="?", allow_override=1)
2395 def Parse(self, arg):
2396 if arg:
2397 doc = sys.modules["__main__"].__doc__
2398 flags = str(FLAGS)
2399 print doc or ("\nUSAGE: %s [flags]\n" % sys.argv[0])
2400 if flags:
2401 print "flags:"
2402 print flags
2403 sys.exit(1)
2404 class HelpXMLFlag(BooleanFlag):
2405 """Similar to HelpFlag, but generates output in XML format."""
2406 def __init__(self):
2407 BooleanFlag.__init__(self, 'helpxml', False,
2408 'like --help, but generates XML output',
2409 allow_override=1)
2410 def Parse(self, arg):
2411 if arg:
2412 FLAGS.WriteHelpInXMLFormat(sys.stdout)
2413 sys.exit(1)
2414 class HelpshortFlag(BooleanFlag):
2415 """
2416 HelpshortFlag is a special boolean flag that prints usage
2417 information for the "main" module, and rasies a SystemExit exception
2418 if it is ever found in the command line arguments. Note this is
2419 called with allow_override=1, so other apps can define their own
2420 --helpshort flag, replacing this one, if they want.
2421 """
2422 def __init__(self):
2423 BooleanFlag.__init__(self, "helpshort", 0,
2424 "show usage only for this module", allow_override=1)
2425 def Parse(self, arg):
2426 if arg:
2427 doc = sys.modules["__main__"].__doc__
2428 flags = FLAGS.MainModuleHelp()
2429 print doc or ("\nUSAGE: %s [flags]\n" % sys.argv[0])
2430 if flags:
2431 print "flags:"
2432 print flags
2433 sys.exit(1)
2434
2435 #
2436 # Numeric parser - base class for Integer and Float parsers
2437 #
2438
2439
2440 class NumericParser(ArgumentParser):
2441 """Parser of numeric values.
2442
2443 Parsed value may be bounded to a given upper and lower bound.
2444 """
2445
2446 def IsOutsideBounds(self, val):
2447 return ((self.lower_bound is not None and val < self.lower_bound) or
2448 (self.upper_bound is not None and val > self.upper_bound))
2449
2450 def Parse(self, argument):
2451 val = self.Convert(argument)
2452 if self.IsOutsideBounds(val):
2453 raise ValueError("%s is not %s" % (val, self.syntactic_help))
2454 return val
2455
2456 def WriteCustomInfoInXMLFormat(self, outfile, indent):
2457 if self.lower_bound is not None:
2458 _WriteSimpleXMLElement(outfile, 'lower_bound', self.lower_bound, indent)
2459 if self.upper_bound is not None:
2460 _WriteSimpleXMLElement(outfile, 'upper_bound', self.upper_bound, indent)
2461
2462 def Convert(self, argument):
2463 """Default implementation: always returns its argument unmodified."""
2464 return argument
2465
2466 # End of Numeric Parser
2467
2468 #
2469 # FLOAT FLAGS
2470 #
2471
2472
2473 class FloatParser(NumericParser):
2474 """Parser of floating point values.
2475
2476 Parsed value may be bounded to a given upper and lower bound.
2477 """
2478 number_article = "a"
2479 number_name = "number"
2480 syntactic_help = " ".join((number_article, number_name))
2481
2482 def __init__(self, lower_bound=None, upper_bound=None):
2483 super(FloatParser, self).__init__()
2484 self.lower_bound = lower_bound
2485 self.upper_bound = upper_bound
2486 sh = self.syntactic_help
2487 if lower_bound is not None and upper_bound is not None:
2488 sh = ("%s in the range [%s, %s]" % (sh, lower_bound, upper_bound))
2489 elif lower_bound == 0:
2490 sh = "a non-negative %s" % self.number_name
2491 elif upper_bound == 0:
2492 sh = "a non-positive %s" % self.number_name
2493 elif upper_bound is not None:
2494 sh = "%s <= %s" % (self.number_name, upper_bound)
2495 elif lower_bound is not None:
2496 sh = "%s >= %s" % (self.number_name, lower_bound)
2497 self.syntactic_help = sh
2498
2499 def Convert(self, argument):
2500 """Converts argument to a float; raises ValueError on errors."""
2501 return float(argument)
2502
2503 def Type(self):
2504 return 'float'
2505 # End of FloatParser
2506
2507
2508 def DEFINE_float(name, default, help, lower_bound=None, upper_bound=None,
2509 flag_values=FLAGS, **args):
2510 """Registers a flag whose value must be a float.
2511
2512 If lower_bound or upper_bound are set, then this flag must be
2513 within the given range.
2514 """
2515 parser = FloatParser(lower_bound, upper_bound)
2516 serializer = ArgumentSerializer()
2517 DEFINE(parser, name, default, help, flag_values, serializer, **args)
2518 _RegisterBoundsValidatorIfNeeded(parser, name, flag_values=flag_values)
2519
2520 #
2521 # INTEGER FLAGS
2522 #
2523
2524
2525 class IntegerParser(NumericParser):
2526 """Parser of an integer value.
2527
2528 Parsed value may be bounded to a given upper and lower bound.
2529 """
2530 number_article = "an"
2531 number_name = "integer"
2532 syntactic_help = " ".join((number_article, number_name))
2533
2534 def __init__(self, lower_bound=None, upper_bound=None):
2535 super(IntegerParser, self).__init__()
2536 self.lower_bound = lower_bound
2537 self.upper_bound = upper_bound
2538 sh = self.syntactic_help
2539 if lower_bound is not None and upper_bound is not None:
2540 sh = ("%s in the range [%s, %s]" % (sh, lower_bound, upper_bound))
2541 elif lower_bound == 1:
2542 sh = "a positive %s" % self.number_name
2543 elif upper_bound == -1:
2544 sh = "a negative %s" % self.number_name
2545 elif lower_bound == 0:
2546 sh = "a non-negative %s" % self.number_name
2547 elif upper_bound == 0:
2548 sh = "a non-positive %s" % self.number_name
2549 elif upper_bound is not None:
2550 sh = "%s <= %s" % (self.number_name, upper_bound)
2551 elif lower_bound is not None:
2552 sh = "%s >= %s" % (self.number_name, lower_bound)
2553 self.syntactic_help = sh
2554
2555 def Convert(self, argument):
2556 __pychecker__ = 'no-returnvalues'
2557 if type(argument) == str:
2558 base = 10
2559 if len(argument) > 2 and argument[0] == "0" and argument[1] == "x":
2560 base = 16
2561 return int(argument, base)
2562 else:
2563 return int(argument)
2564
2565 def Type(self):
2566 return 'int'
2567
2568
2569 def DEFINE_integer(name, default, help, lower_bound=None, upper_bound=None,
2570 flag_values=FLAGS, **args):
2571 """Registers a flag whose value must be an integer.
2572
2573 If lower_bound, or upper_bound are set, then this flag must be
2574 within the given range.
2575 """
2576 parser = IntegerParser(lower_bound, upper_bound)
2577 serializer = ArgumentSerializer()
2578 DEFINE(parser, name, default, help, flag_values, serializer, **args)
2579 _RegisterBoundsValidatorIfNeeded(parser, name, flag_values=flag_values)
2580
2581
2582 #
2583 # ENUM FLAGS
2584 #
2585
2586
2587 class EnumParser(ArgumentParser):
2588 """Parser of a string enum value (a string value from a given set).
2589
2590 If enum_values (see below) is not specified, any string is allowed.
2591 """
2592
2593 def __init__(self, enum_values=None):
2594 super(EnumParser, self).__init__()
2595 self.enum_values = enum_values
2596
2597 def Parse(self, argument):
2598 if self.enum_values and argument not in self.enum_values:
2599 raise ValueError("value should be one of <%s>" %
2600 "|".join(self.enum_values))
2601 return argument
2602
2603 def Type(self):
2604 return 'string enum'
2605
2606
2607 class EnumFlag(Flag):
2608 """Basic enum flag; its value can be any string from list of enum_values."""
2609
2610 def __init__(self, name, default, help, enum_values=None,
2611 short_name=None, **args):
2612 enum_values = enum_values or []
2613 p = EnumParser(enum_values)
2614 g = ArgumentSerializer()
2615 Flag.__init__(self, p, g, name, default, help, short_name, **args)
2616 if not self.help: self.help = "an enum string"
2617 self.help = "<%s>: %s" % ("|".join(enum_values), self.help)
2618
2619 def _WriteCustomInfoInXMLFormat(self, outfile, indent):
2620 for enum_value in self.parser.enum_values:
2621 _WriteSimpleXMLElement(outfile, 'enum_value', enum_value, indent)
2622
2623
2624 def DEFINE_enum(name, default, enum_values, help, flag_values=FLAGS,
2625 **args):
2626 """Registers a flag whose value can be any string from enum_values."""
2627 DEFINE_flag(EnumFlag(name, default, help, enum_values, ** args),
2628 flag_values)
2629
2630
2631 #
2632 # LIST FLAGS
2633 #
2634
2635
2636 class BaseListParser(ArgumentParser):
2637 """Base class for a parser of lists of strings.
2638
2639 To extend, inherit from this class; from the subclass __init__, call
2640
2641 BaseListParser.__init__(self, token, name)
2642
2643 where token is a character used to tokenize, and name is a description
2644 of the separator.
2645 """
2646
2647 def __init__(self, token=None, name=None):
2648 assert name
2649 super(BaseListParser, self).__init__()
2650 self._token = token
2651 self._name = name
2652 self.syntactic_help = "a %s separated list" % self._name
2653
2654 def Parse(self, argument):
2655 if isinstance(argument, list):
2656 return argument
2657 elif argument == '':
2658 return []
2659 else:
2660 return [s.strip() for s in argument.split(self._token)]
2661
2662 def Type(self):
2663 return '%s separated list of strings' % self._name
2664
2665
2666 class ListParser(BaseListParser):
2667 """Parser for a comma-separated list of strings."""
2668
2669 def __init__(self):
2670 BaseListParser.__init__(self, ',', 'comma')
2671
2672 def WriteCustomInfoInXMLFormat(self, outfile, indent):
2673 BaseListParser.WriteCustomInfoInXMLFormat(self, outfile, indent)
2674 _WriteSimpleXMLElement(outfile, 'list_separator', repr(','), indent)
2675
2676
2677 class WhitespaceSeparatedListParser(BaseListParser):
2678 """Parser for a whitespace-separated list of strings."""
2679
2680 def __init__(self):
2681 BaseListParser.__init__(self, None, 'whitespace')
2682
2683 def WriteCustomInfoInXMLFormat(self, outfile, indent):
2684 BaseListParser.WriteCustomInfoInXMLFormat(self, outfile, indent)
2685 separators = list(string.whitespace)
2686 separators.sort()
2687 for ws_char in string.whitespace:
2688 _WriteSimpleXMLElement(outfile, 'list_separator', repr(ws_char), indent)
2689
2690
2691 def DEFINE_list(name, default, help, flag_values=FLAGS, **args):
2692 """Registers a flag whose value is a comma-separated list of strings."""
2693 parser = ListParser()
2694 serializer = ListSerializer(',')
2695 DEFINE(parser, name, default, help, flag_values, serializer, **args)
2696
2697
2698 def DEFINE_spaceseplist(name, default, help, flag_values=FLAGS, **args):
2699 """Registers a flag whose value is a whitespace-separated list of strings.
2700
2701 Any whitespace can be used as a separator.
2702 """
2703 parser = WhitespaceSeparatedListParser()
2704 serializer = ListSerializer(' ')
2705 DEFINE(parser, name, default, help, flag_values, serializer, **args)
2706
2707
2708 #
2709 # MULTI FLAGS
2710 #
2711
2712
2713 class MultiFlag(Flag):
2714 """A flag that can appear multiple time on the command-line.
2715
2716 The value of such a flag is a list that contains the individual values
2717 from all the appearances of that flag on the command-line.
2718
2719 See the __doc__ for Flag for most behavior of this class. Only
2720 differences in behavior are described here:
2721
2722 * The default value may be either a single value or a list of values.
2723 A single value is interpreted as the [value] singleton list.
2724
2725 * The value of the flag is always a list, even if the option was
2726 only supplied once, and even if the default value is a single
2727 value
2728 """
2729
2730 def __init__(self, *args, **kwargs):
2731 Flag.__init__(self, *args, **kwargs)
2732 self.help += ';\n repeat this option to specify a list of values'
2733
2734 def Parse(self, arguments):
2735 """Parses one or more arguments with the installed parser.
2736
2737 Args:
2738 arguments: a single argument or a list of arguments (typically a
2739 list of default values); a single argument is converted
2740 internally into a list containing one item.
2741 """
2742 if not isinstance(arguments, list):
2743 # Default value may be a list of values. Most other arguments
2744 # will not be, so convert them into a single-item list to make
2745 # processing simpler below.
2746 arguments = [arguments]
2747
2748 if self.present:
2749 # keep a backup reference to list of previously supplied option values
2750 values = self.value
2751 else:
2752 # "erase" the defaults with an empty list
2753 values = []
2754
2755 for item in arguments:
2756 # have Flag superclass parse argument, overwriting self.value reference
2757 Flag.Parse(self, item) # also increments self.present
2758 values.append(self.value)
2759
2760 # put list of option values back in the 'value' attribute
2761 self.value = values
2762
2763 def Serialize(self):
2764 if not self.serializer:
2765 raise FlagsError("Serializer not present for flag %s" % self.name)
2766 if self.value is None:
2767 return ''
2768
2769 s = ''
2770
2771 multi_value = self.value
2772
2773 for self.value in multi_value:
2774 if s: s += ' '
2775 s += Flag.Serialize(self)
2776
2777 self.value = multi_value
2778
2779 return s
2780
2781 def Type(self):
2782 return 'multi ' + self.parser.Type()
2783
2784
2785 def DEFINE_multi(parser, serializer, name, default, help, flag_values=FLAGS,
2786 **args):
2787 """Registers a generic MultiFlag that parses its args with a given parser.
2788
2789 Auxiliary function. Normal users should NOT use it directly.
2790
2791 Developers who need to create their own 'Parser' classes for options
2792 which can appear multiple times can call this module function to
2793 register their flags.
2794 """
2795 DEFINE_flag(MultiFlag(parser, serializer, name, default, help, **args),
2796 flag_values)
2797
2798
2799 def DEFINE_multistring(name, default, help, flag_values=FLAGS, **args):
2800 """Registers a flag whose value can be a list of any strings.
2801
2802 Use the flag on the command line multiple times to place multiple
2803 string values into the list. The 'default' may be a single string
2804 (which will be converted into a single-element list) or a list of
2805 strings.
2806 """
2807 parser = ArgumentParser()
2808 serializer = ArgumentSerializer()
2809 DEFINE_multi(parser, serializer, name, default, help, flag_values, **args)
2810
2811
2812 def DEFINE_multi_int(name, default, help, lower_bound=None, upper_bound=None,
2813 flag_values=FLAGS, **args):
2814 """Registers a flag whose value can be a list of arbitrary integers.
2815
2816 Use the flag on the command line multiple times to place multiple
2817 integer values into the list. The 'default' may be a single integer
2818 (which will be converted into a single-element list) or a list of
2819 integers.
2820 """
2821 parser = IntegerParser(lower_bound, upper_bound)
2822 serializer = ArgumentSerializer()
2823 DEFINE_multi(parser, serializer, name, default, help, flag_values, **args)
2824
2825
2826 def DEFINE_multi_float(name, default, help, lower_bound=None, upper_bound=None,
2827 flag_values=FLAGS, **args):
2828 """Registers a flag whose value can be a list of arbitrary floats.
2829
2830 Use the flag on the command line multiple times to place multiple
2831 float values into the list. The 'default' may be a single float
2832 (which will be converted into a single-element list) or a list of
2833 floats.
2834 """
2835 parser = FloatParser(lower_bound, upper_bound)
2836 serializer = ArgumentSerializer()
2837 DEFINE_multi(parser, serializer, name, default, help, flag_values, **args)
2838
2839
2840 # Now register the flags that we want to exist in all applications.
2841 # These are all defined with allow_override=1, so user-apps can use
2842 # these flagnames for their own purposes, if they want.
2843 DEFINE_flag(HelpFlag())
2844 DEFINE_flag(HelpshortFlag())
2845 DEFINE_flag(HelpXMLFlag())
2846
2847 # Define special flags here so that help may be generated for them.
2848 # NOTE: Please do NOT use _SPECIAL_FLAGS from outside this module.
2849 _SPECIAL_FLAGS = FlagValues()
2850
2851
2852 DEFINE_string(
2853 'flagfile', "",
2854 "Insert flag definitions from the given file into the command line.",
2855 _SPECIAL_FLAGS)
2856
2857 DEFINE_string(
2858 'undefok', "",
2859 "comma-separated list of flag names that it is okay to specify "
2860 "on the command line even if the program does not define a flag "
2861 "with that name. IMPORTANT: flags in this list that have "
2862 "arguments MUST use the --flag=value format.", _SPECIAL_FLAGS)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698