357 |
357 |
"""Manage (initialize and update) an ArgumentParser object"""
|
358 |
358 |
|
359 |
359 |
parser = ArgumentParser(add_help=False)
|
360 |
|
arguments = None
|
|
360 |
_arguments = None
|
|
361 |
_parser_modified = False
|
|
362 |
_parsed = None
|
|
363 |
_unparsed = None
|
361 |
364 |
|
362 |
365 |
def __init__(self, exe, arguments=None):
|
363 |
366 |
"""
|
... | ... | |
366 |
369 |
:param arguments: (dict) if given, overrides the global _argument as
|
367 |
370 |
the parsers arguments specification
|
368 |
371 |
"""
|
|
372 |
self.syntax = '%s <cmd_group> [<cmd_subbroup> ...] <cmd>' % exe
|
369 |
373 |
if arguments:
|
370 |
374 |
self.arguments = arguments
|
371 |
375 |
else:
|
372 |
376 |
global _arguments
|
373 |
377 |
self.arguments = _arguments
|
374 |
378 |
|
375 |
|
self.syntax = '%s <cmd_group> [<cmd_subbroup> ...] <cmd>' % exe
|
376 |
|
self.update_parser()
|
377 |
379 |
|
378 |
380 |
@property
|
379 |
381 |
def syntax(self):
|
|
382 |
"""The command syntax (useful for help messages, descriptions, etc)"""
|
380 |
383 |
return self.parser.prog
|
381 |
384 |
|
382 |
385 |
@syntax.setter
|
383 |
386 |
def syntax(self, new_syntax):
|
384 |
387 |
self.parser.prog = new_syntax
|
385 |
388 |
|
|
389 |
@property
|
|
390 |
def arguments(self):
|
|
391 |
"""(dict) arguments the parser should be aware of"""
|
|
392 |
return self._arguments
|
|
393 |
|
|
394 |
@arguments.setter
|
|
395 |
def arguments(self, new_arguments):
|
|
396 |
if new_arguments:
|
|
397 |
assert isinstance(new_arguments, dict)
|
|
398 |
self._arguments = new_arguments
|
|
399 |
self.update_parser()
|
|
400 |
|
|
401 |
@property
|
|
402 |
def parsed(self):
|
|
403 |
"""(ArgumentList) parser-matched terms"""
|
|
404 |
if self._parser_modified:
|
|
405 |
self.parse()
|
|
406 |
return self._parsed
|
|
407 |
|
|
408 |
@property
|
|
409 |
def unparsed(self):
|
|
410 |
"""(list) parser-unmatched terms"""
|
|
411 |
if self._parser_modified:
|
|
412 |
self.parse()
|
|
413 |
return self._unparsed
|
|
414 |
|
386 |
415 |
def update_parser(self, arguments=None):
|
387 |
416 |
"""Load argument specifications to parser
|
388 |
417 |
|
389 |
418 |
:param arguments: if not given, update self.arguments instead
|
390 |
419 |
"""
|
391 |
420 |
if not arguments:
|
392 |
|
arguments = self.arguments
|
|
421 |
arguments = self._arguments
|
393 |
422 |
|
394 |
423 |
for name, arg in arguments.items():
|
395 |
424 |
try:
|
396 |
425 |
arg.update_parser(self.parser, name)
|
|
426 |
self._parser_modified = True
|
397 |
427 |
except ArgumentError:
|
398 |
428 |
pass
|
399 |
429 |
|
|
430 |
def parse(self):
|
|
431 |
self._parsed, unparsed = self.parser.parse_known_args()
|
|
432 |
for name, arg in self.arguments.items():
|
|
433 |
arg.value = getattr(self._parsed, name, arg.default)
|
|
434 |
self._unparsed = []
|
|
435 |
for term in unparsed:
|
|
436 |
self._unparsed += split_input(' \'%s\' ' % term)
|
|
437 |
self._parser_modified = False
|
|
438 |
|
400 |
439 |
|
401 |
440 |
def parse_known_args(parser, arguments=None):
|
402 |
441 |
"""Fill in arguments from user input"""
|