home · contact · privacy
Improve argparse usage structuring, TABLE choices usage help. master
authorPlom Heller <plom@plomlompom.com>
Mon, 27 Jul 2026 20:01:40 +0000 (22:01 +0200)
committerPlom Heller <plom@plomlompom.com>
Mon, 27 Jul 2026 20:01:40 +0000 (22:01 +0200)
bricksplom.py

index 21264f2097fca4fa5627183a8541c9daca4770f7..36be587986d125edebce59ff9407b88064836c7f 100755 (executable)
@@ -1,7 +1,11 @@
 #!/usr/bin/env python3
 'Data structures for managing/sorting bricks of a certain kind.'
 from abc import ABC, abstractmethod
-from argparse import ArgumentError, ArgumentParser
+from argparse import (
+        ArgumentError,
+        ArgumentParser,
+        Namespace as ArgumentNamespace,
+        )
 from dataclasses import dataclass
 from os import environ
 from pathlib import Path
@@ -812,30 +816,40 @@ class BricksDb:
 def main(
         ) -> None:
     'Load tables from BRICKSPLOM_DIR and put out in reproducible listings.'
-    def add_abbrev_choices_arg(
-            parser: ArgumentParser,
-            argname: str,
-            choices: set[str]
-            ) -> None:
-        def complete(
-                arg: str
-                ) -> str:
-            candidates = tuple(c for c in choices if c.startswith(arg))
-            if len(candidates) > 1:
-                raise ArgumentError(
-                    action,
-                    f'{arg} – ambiguous, could match: {", ".join(candidates)}')
-            return (candidates + (arg, ))[0]
-        action = parser.add_argument(argname, choices=choices, type=complete)
-
-    parser = ArgumentParser()
-    add_abbrev_choices_arg(parser, 'table', set(BricksDb.lookupable))
-    parser.add_argument('item_id', nargs='?', metavar='ITEM_ID')
-    parser.add_argument('-r', '--raw', action='store_true')
-    parser.add_argument('-m', '--match-by', action='store')
-    parser.add_argument('-s', '--sort-by', action='store', default=TOK_SORT_ID)
-    parser.add_argument('-l', '--ldraw', action='store', default='')
-    args = parser.parse_args()
+    def parse_args(
+            ) -> ArgumentNamespace:
+        def add_abbreviable_table_arg(
+                ) -> None:
+            def complete(
+                    arg: str
+                    ) -> str:
+                candidates = tuple(c for c in choices if c.startswith(arg))
+                if len(candidates) > 1:
+                    raise ArgumentError(
+                        action,
+                        f'{arg} – ambiguous, matches: {", ".join(candidates)}')
+                return (candidates + (arg, ))[0]
+            choices = BricksDb.lookupable
+            msg = 'one of: ' + ', '.join(sorted(list(choices)))
+            msg += '; NB: abbreviable to first unambiguous character sequence'
+            action = parser.add_argument(
+                   'table',
+                   choices=choices, type=complete, metavar='TABLE', help=msg)
+        parser = ArgumentParser()
+        add_abbreviable_table_arg()
+        parser.add_argument('item_id',
+                            nargs='?', metavar='ITEM_ID')
+        parser.add_argument('-r', '--raw',
+                            action='store_true')
+        parser.add_argument('-m', '--match-by',
+                            action='store')
+        parser.add_argument('-s', '--sort-by',
+                            action='store', default=TOK_SORT_ID)
+        parser.add_argument('-l', '--ldraw',
+                            action='store', default='')
+        return parser.parse_args()
+
+    args = parse_args()
     db = BricksDb(environ.get(NAME_ENV_DIRNAME, '.'),
                   environ.get(NAME_ENV_LDRAW, ''),
                   args.ldraw)