* [for-master][PATCH 0/4] A few argparse_oe changes/fixes
@ 2016-04-27 23:23 Christopher Larson
2016-04-27 23:23 ` [for-master][PATCH 1/4] scripts/lib/argparse_oe: show self.prog in the error message Christopher Larson
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Christopher Larson @ 2016-04-27 23:23 UTC (permalink / raw)
To: openembedded-core; +Cc: Christopher Larson
From: Christopher Larson <chris_larson@mentor.com>
The following changes since commit e2dbe5eb869b8336b91023b83d7ca866197efa73:
license.bbclass: make sure that image manifest dir exists (2016-04-22 16:28:47 +0100)
are available in the git repository at:
git://github.com/kergoth/openembedded-core argparse-oe-fixes
https://github.com/kergoth/openembedded-core/tree/argparse-oe-fixes
Christopher Larson (4):
scripts/lib/argparse_oe: show self.prog in the error message
scripts/lib/argparse_oe: show subparser help for unrecognized args
scripts/lib/argparse_oe: simplify options title change
scripts/lib/argparse_oe: also change 'positional arguments' to
'arguments'
scripts/lib/argparse_oe.py | 64 +++++++++++++++++++++++++++++++++++++---------
1 file changed, 52 insertions(+), 12 deletions(-)
--
2.8.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [for-master][PATCH 1/4] scripts/lib/argparse_oe: show self.prog in the error message
2016-04-27 23:23 [for-master][PATCH 0/4] A few argparse_oe changes/fixes Christopher Larson
@ 2016-04-27 23:23 ` Christopher Larson
2016-04-27 23:23 ` [for-master][PATCH 2/4] scripts/lib/argparse_oe: show subparser help for unrecognized args Christopher Larson
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Christopher Larson @ 2016-04-27 23:23 UTC (permalink / raw)
To: openembedded-core; +Cc: Christopher Larson
From: Christopher Larson <chris_larson@mentor.com>
This aligns our subclassed error() with that in the original class, using
_print_message and self.prog. Also add a docstring based on the original.
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
---
scripts/lib/argparse_oe.py | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/scripts/lib/argparse_oe.py b/scripts/lib/argparse_oe.py
index bf3ebad..95b42e7 100644
--- a/scripts/lib/argparse_oe.py
+++ b/scripts/lib/argparse_oe.py
@@ -16,8 +16,13 @@ class ArgumentParser(argparse.ArgumentParser):
super(ArgumentParser, self).__init__(*args, **kwargs)
def error(self, message):
- sys.stderr.write('ERROR: %s\n' % message)
- self.print_help()
+ """error(message: string)
+
+ Prints a help message incorporating the message to stderr and
+ exits.
+ """
+ self._print_message('%s: error: %s\n' % (self.prog, message), sys.stderr)
+ self.print_help(sys.stderr)
sys.exit(2)
def error_subcommand(self, message, subcommand):
--
2.8.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [for-master][PATCH 2/4] scripts/lib/argparse_oe: show subparser help for unrecognized args
2016-04-27 23:23 [for-master][PATCH 0/4] A few argparse_oe changes/fixes Christopher Larson
2016-04-27 23:23 ` [for-master][PATCH 1/4] scripts/lib/argparse_oe: show self.prog in the error message Christopher Larson
@ 2016-04-27 23:23 ` Christopher Larson
2016-04-27 23:24 ` [for-master][PATCH 3/4] scripts/lib/argparse_oe: simplify options title change Christopher Larson
2016-04-27 23:24 ` [for-master][PATCH 4/4] scripts/lib/argparse_oe: also change 'positional arguments' to 'arguments' Christopher Larson
3 siblings, 0 replies; 5+ messages in thread
From: Christopher Larson @ 2016-04-27 23:23 UTC (permalink / raw)
To: openembedded-core; +Cc: Christopher Larson
From: Christopher Larson <chris_larson@mentor.com>
As an example, `recipetool create foo bar baz` shows `recipetool: error:
unrecognized arguments: bar baz` and then displays the main help, not the help
for the create command. Fix by saving the subparser name and using it in
parse_args() to look up the subparser.
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
---
scripts/lib/argparse_oe.py | 49 ++++++++++++++++++++++++++++++++++++++++------
1 file changed, 43 insertions(+), 6 deletions(-)
diff --git a/scripts/lib/argparse_oe.py b/scripts/lib/argparse_oe.py
index 95b42e7..75002d0 100644
--- a/scripts/lib/argparse_oe.py
+++ b/scripts/lib/argparse_oe.py
@@ -27,15 +27,20 @@ class ArgumentParser(argparse.ArgumentParser):
def error_subcommand(self, message, subcommand):
if subcommand:
- for action in self._actions:
- if isinstance(action, argparse._SubParsersAction):
- for choice, subparser in action.choices.items():
- if choice == subcommand:
- subparser.error(message)
- return
+ action = self._get_subparser_action()
+ try:
+ subparser = action._name_parser_map[subcommand]
+ except KeyError:
+ self.error('no subparser for name "%s"' % subcommand)
+ else:
+ subparser.error(message)
+
self.error(message)
def add_subparsers(self, *args, **kwargs):
+ if 'dest' not in kwargs:
+ kwargs['dest'] = '_subparser_name'
+
ret = super(ArgumentParser, self).add_subparsers(*args, **kwargs)
# Need a way of accessing the parent parser
ret._parent_parser = self
@@ -48,6 +53,38 @@ class ArgumentParser(argparse.ArgumentParser):
def add_subparser_group(self, groupname, groupdesc, order=0):
self._subparser_groups[groupname] = (groupdesc, order)
+ def parse_args(self, args=None, namespace=None):
+ """Parse arguments, using the correct subparser to show the error."""
+ args, argv = self.parse_known_args(args, namespace)
+ if argv:
+ message = 'unrecognized arguments: %s' % ' '.join(argv)
+ if self._subparsers:
+ subparser = self._get_subparser(args)
+ subparser.error(message)
+ else:
+ self.error(message)
+ sys.exit(2)
+ return args
+
+ def _get_subparser(self, args):
+ action = self._get_subparser_action()
+ if action.dest == argparse.SUPPRESS:
+ self.error('cannot get subparser, the subparser action dest is suppressed')
+
+ name = getattr(args, action.dest)
+ try:
+ return action._name_parser_map[name]
+ except KeyError:
+ self.error('no subparser for name "%s"' % name)
+
+ def _get_subparser_action(self):
+ if not self._subparsers:
+ self.error('cannot return the subparser action, no subparsers added')
+
+ for action in self._subparsers._group_actions:
+ if isinstance(action, argparse._SubParsersAction):
+ return action
+
class ArgumentSubParser(ArgumentParser):
def __init__(self, *args, **kwargs):
--
2.8.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [for-master][PATCH 3/4] scripts/lib/argparse_oe: simplify options title change
2016-04-27 23:23 [for-master][PATCH 0/4] A few argparse_oe changes/fixes Christopher Larson
2016-04-27 23:23 ` [for-master][PATCH 1/4] scripts/lib/argparse_oe: show self.prog in the error message Christopher Larson
2016-04-27 23:23 ` [for-master][PATCH 2/4] scripts/lib/argparse_oe: show subparser help for unrecognized args Christopher Larson
@ 2016-04-27 23:24 ` Christopher Larson
2016-04-27 23:24 ` [for-master][PATCH 4/4] scripts/lib/argparse_oe: also change 'positional arguments' to 'arguments' Christopher Larson
3 siblings, 0 replies; 5+ messages in thread
From: Christopher Larson @ 2016-04-27 23:24 UTC (permalink / raw)
To: openembedded-core; +Cc: Christopher Larson
From: Christopher Larson <chris_larson@mentor.com>
There's no need to iterate over the action groups here, as self._optionals and
self._positionals are available.
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
---
scripts/lib/argparse_oe.py | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/scripts/lib/argparse_oe.py b/scripts/lib/argparse_oe.py
index 75002d0..2185a66 100644
--- a/scripts/lib/argparse_oe.py
+++ b/scripts/lib/argparse_oe.py
@@ -14,6 +14,7 @@ class ArgumentParser(argparse.ArgumentParser):
kwargs.setdefault('formatter_class', OeHelpFormatter)
self._subparser_groups = OrderedDict()
super(ArgumentParser, self).__init__(*args, **kwargs)
+ self._optionals.title = 'options'
def error(self, message):
"""error(message: string)
@@ -93,10 +94,6 @@ class ArgumentSubParser(ArgumentParser):
if 'order' in kwargs:
self._order = kwargs.pop('order')
super(ArgumentSubParser, self).__init__(*args, **kwargs)
- for agroup in self._action_groups:
- if agroup.title == 'optional arguments':
- agroup.title = 'options'
- break
def parse_known_args(self, args=None, namespace=None):
# This works around argparse not handling optional positional arguments being
--
2.8.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [for-master][PATCH 4/4] scripts/lib/argparse_oe: also change 'positional arguments' to 'arguments'
2016-04-27 23:23 [for-master][PATCH 0/4] A few argparse_oe changes/fixes Christopher Larson
` (2 preceding siblings ...)
2016-04-27 23:24 ` [for-master][PATCH 3/4] scripts/lib/argparse_oe: simplify options title change Christopher Larson
@ 2016-04-27 23:24 ` Christopher Larson
3 siblings, 0 replies; 5+ messages in thread
From: Christopher Larson @ 2016-04-27 23:24 UTC (permalink / raw)
To: openembedded-core; +Cc: Christopher Larson
From: Christopher Larson <chris_larson@mentor.com>
This aligns with our existing 'optional arguments' to 'options' change, and
seems more intuitive for users.
Signed-off-by: Christopher Larson <chris_larson@mentor.com>
---
scripts/lib/argparse_oe.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/scripts/lib/argparse_oe.py b/scripts/lib/argparse_oe.py
index 2185a66..bf6eb17 100644
--- a/scripts/lib/argparse_oe.py
+++ b/scripts/lib/argparse_oe.py
@@ -14,6 +14,7 @@ class ArgumentParser(argparse.ArgumentParser):
kwargs.setdefault('formatter_class', OeHelpFormatter)
self._subparser_groups = OrderedDict()
super(ArgumentParser, self).__init__(*args, **kwargs)
+ self._positionals.title = 'arguments'
self._optionals.title = 'options'
def error(self, message):
--
2.8.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-04-27 23:24 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-27 23:23 [for-master][PATCH 0/4] A few argparse_oe changes/fixes Christopher Larson
2016-04-27 23:23 ` [for-master][PATCH 1/4] scripts/lib/argparse_oe: show self.prog in the error message Christopher Larson
2016-04-27 23:23 ` [for-master][PATCH 2/4] scripts/lib/argparse_oe: show subparser help for unrecognized args Christopher Larson
2016-04-27 23:24 ` [for-master][PATCH 3/4] scripts/lib/argparse_oe: simplify options title change Christopher Larson
2016-04-27 23:24 ` [for-master][PATCH 4/4] scripts/lib/argparse_oe: also change 'positional arguments' to 'arguments' Christopher Larson
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.