changeset 39100:9085df917421

parser: simplify mode parsing; fix --help error
author Dmitry Selyutin <ghostmansd@gmail.com>
date Sun, 21 Jan 2018 20:43:31 +0300
parents d81c260851f0
children 915fae496f3c
files pygnulib/parser.py
diffstat 1 files changed, 14 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/pygnulib/parser.py	Wed Jan 17 23:51:24 2018 +0300
+++ b/pygnulib/parser.py	Sun Jan 21 20:43:31 2018 +0300
@@ -94,11 +94,9 @@
             super().__init__(default=_argparse.SUPPRESS, *args, **kwargs)
 
         def __call__(self, parser, namespace, value, option=None):
-            if option == "--help":
-                setattr(namespace, self.dest, CommandLine._HELP)
-                return
             if hasattr(namespace, "mode"):
                 mode = getattr(namespace, "mode")
+                mode = mode if option != "--help" else CommandLine._HELP
                 if mode and not (self.__flags & mode) and (mode != CommandLine._HELP):
                     mode = "--" + {k:v for (k, v, _) in CommandLine._MODES}[mode]
                     fmt = "argument {0}: not allowed with {1}"
@@ -148,29 +146,20 @@
             super().__init__(*args, **kwargs)
 
         def __call__(self, parser, namespace, value, option=None):
-            if not hasattr(namespace, self.dest):
-                setattr(namespace, self.dest, 0)
-            old_option = None
-            new_option = option
-            new_mode = None
-            old_mode = getattr(namespace, self.dest)
+            mode_option = {}
+            option_mode = {}
             for (mode, name, _) in CommandLine._MODES:
-                option = ("--" + name)
-                if mode == old_mode:
-                    old_option = option
-                if option == new_option:
-                    new_mode = mode
-                if old_option and new_mode:
-                    break
-            if new_mode == CommandLine._HELP:
-                old_mode = new_mode
-            if old_mode != CommandLine._HELP and old_mode != new_mode:
-                if old_mode != 0:
-                    fmt = "argument {0}: not allowed with {1}"
-                    parser.error(fmt.format(new_option, old_option))
-            if new_mode != CommandLine._UPDATE:
-                setattr(namespace, "modules", set(value))
-            value = new_mode
+                name = "--{}".format(name)
+                mode_option[mode] = name
+                option_mode[name] = mode
+            modules = value
+            new_option = option
+            new_mode = value = option_mode[option]
+            old_mode = getattr(namespace, self.dest, 0)
+            old_option = mode_option[old_mode] if old_mode != 0 else ""
+            if (new_mode & (CommandLine._UPDATE | CommandLine._HELP)) == 0:
+                setattr(namespace, "modules", set(modules))
+            value = CommandLine._HELP if CommandLine._HELP in {old_mode, new_mode} else new_mode
             super().__call__(parser, namespace, value, option)