home · contact · privacy
Overhaul structuring, erroring on -m/-s/-f.
authorPlom Heller <plom@plomlompom.com>
Sat, 1 Aug 2026 04:56:03 +0000 (06:56 +0200)
committerPlom Heller <plom@plomlompom.com>
Sat, 1 Aug 2026 04:56:03 +0000 (06:56 +0200)
bricksplom.py

index 167a87c1d5b9ae6f04df6b5aad839cb232eca391..4ee57a05be2acb87feef573d57bc9e7a9249bfef 100755 (executable)
@@ -30,6 +30,7 @@ CHAR_SEP_TOKEN = ' '
 CHAR_COMMENT = '#'
 CHAR_DESIGN_ALT = '='
 CHAR_ATTR_EQ = '='
+CHAR_TEXTCONTAINS = ':'
 SEP_DESIGN_DESC = ' #'
 SEP_DESIGN_ATTR = '|'
 CHAR_COLL_INDENT = ' '
@@ -43,8 +44,10 @@ CHAR_COL_SOLID = '+'
 CHAR_COL_TRANSPARENT = '-'
 BOX_PREFIX = 'box:'
 
+ARG_Q_MARK = '?'
 PARAM_Q_ID = f'id{CHAR_ATTR_EQ}'
-PARAM_Q_TEXT = 'text:'
+PARAM_Q_TEXT = f'text{CHAR_TEXTCONTAINS}'
+PARAM_Q_DELIMITERS = {CHAR_ATTR_EQ, CHAR_TEXTCONTAINS}
 TOK_SORT_BOX = 'box'
 TOK_SORT_ID = 'id'
 
@@ -807,34 +810,31 @@ class BricksDb:
     def lookup(
             self,
             table_name: str,
-            item_id: str,
             formatter: str,
             match_by: str,
             sort_by: str
             ) -> str:
-        'Return result of inquiry on table of table_name.'
+        'Return formatted result of inquiry on table of table_name.'
         assert table_name in self.lookupables
+        match_key = match_val = ''
+        for idx, c in enumerate(match_by):
+            match_key += c
+            if c in PARAM_Q_DELIMITERS:
+                match_val = match_by[idx+1:]
+                break
         cls = self.lookupables[table_name]
-        for argument, keys in [(arg, m().keys())
-                               for arg, m in ((match_by, cls.matchers),
-                                              (sort_by, cls.sorters),
-                                              (formatter, cls.formatters))]:
-            if argument == '?':
+        for arg_key, keys in [(arg, m().keys())
+                              for arg, m in ((match_key, cls.matchers),
+                                             (sort_by, cls.sorters),
+                                             (formatter, cls.formatters))]:
+            if arg_key == ARG_Q_MARK:
                 return CHAR_NEWLINE.join(keys)
-        table = getattr(self, table_name)
-        if item_id:
-            match_by = PARAM_Q_ID + item_id
-        items = tuple(table.values())
+            assert (not arg_key) or arg_key in keys, (arg_key, keys)
+        items = tuple(getattr(self, table_name).values())
         if items and sort_by:
             items = cls.sorters()[sort_by](self, items)
         if items and match_by:
-            p_key = ''
-            for p_key in [p_key for p_key in cls.matchers()
-                          if match_by.startswith(p_key)]:
-                break
-            assert p_key
-            p_val = match_by[len(p_key):]
-            items = tuple(item for item in items if item.match(p_key, p_val))
+            items = tuple(x for x in items if x.match(match_key, match_val))
         return CHAR_NEWLINE.join([cls.formatters()[formatter](item)
                                   for item in items])
 
@@ -863,7 +863,7 @@ def main(
                    choices=choices, type=complete, metavar='TABLE', help=msg)
         parser = ArgumentParser()
         add_abbreviable_table_arg()
-        hint_qmark = 'use "?" to see what be available for chosen table'
+        hint_qmark = f'use "{ARG_Q_MARK}" to list options for chosen table'
         hint_ldraw = 'allowed: ' + ', '.join(sorted(list(LDRAW_MODES)))
         parser.add_argument(
                 'item_id',
@@ -872,10 +872,10 @@ def main(
                 '-f', '--format',
                 action='store', help=hint_qmark, default='default')
         parser.add_argument(
-                '-m', '--match-by',
-                action='store', help=hint_qmark)
+                '-m', '--match',
+                action='store', help=hint_qmark, default='')
         parser.add_argument(
-                '-s', '--sort-by',
+                '-s', '--sort',
                 action='store', help=hint_qmark, default=TOK_SORT_ID)
         action_ldraw = parser.add_argument(
                 '-l', '--ldraw',
@@ -885,6 +885,8 @@ def main(
         for _ in [m for m in args.ldraw.split(CHAR_SEP_LDRAW_MODES)
                   if m and m not in LDRAW_MODES]:
             parser.error(str(ArgumentError(action_ldraw, hint_ldraw)))
+        if args.match_by != ARG_Q_MARK and args.item_id:
+            args.match_by = PARAM_Q_ID + args.item_id
         return args
 
     args = parse_args()
@@ -894,10 +896,9 @@ def main(
     print(
         db.lookup(
             table_name=args.table,
-            item_id=args.item_id,
             formatter=args.format,
-            match_by=args.match_by,
-            sort_by=args.sort_by
+            match_by=args.match,
+            sort_by=args.sort
         ).rstrip())