home · contact · privacy
Restructure item-filtering syntax.
authorPlom Heller <plom@plomlompom.com>
Sun, 31 May 2026 23:47:56 +0000 (01:47 +0200)
committerPlom Heller <plom@plomlompom.com>
Sun, 31 May 2026 23:47:56 +0000 (01:47 +0200)
bricksplom.py

index b4f69aa10f0272b773eec9418f5f041789f4bb6d..f8ae1f9b0cc8f58bdc1a4f259f2aa96a92dd96e9 100755 (executable)
@@ -25,7 +25,7 @@ CHAR_COLL_SEP_COLUMN = '-'
 CHAR_COLL_SEP_PAGE = '='
 CHAR_COL_SOLID = '+'
 CHAR_COL_TRANSPARENT = '-'
-CHAR_Q_EQ_ID = ':'
+CHAR_Q_ID = '='
 CHAR_Q_STUDS = 's'
 CHAR_Q_TEXT = '?'
 BOX_PREFIX = 'box:'
@@ -128,6 +128,7 @@ class Lookupable:
             ) -> dict[str, Callable[[str], bool]]:
         'Available lookup matchers.'
         return {
+            CHAR_Q_ID: lambda q_body: self.id_ == q_body,
             CHAR_Q_TEXT: lambda q_body: q_body.upper() in str(self).upper()
             }
 
@@ -137,7 +138,7 @@ class Lookupable:
             query_body: str
             ) -> bool:
         'Return if self matches query.'
-        assert query_char in self.matchers
+        assert query_char in self.matchers, query_char
         return self.matchers[query_char](query_body)
 
 
@@ -595,21 +596,22 @@ class BricksDb:
     def lookup(
             self,
             table_name: str,
-            inquiry: str,
-            show_raw: bool
+            item_id: str,
+            show_raw: bool,
+            filter_by: str
             ) -> str:
         'Return result of inquiry on table of table_name.'
         assert table_name in self.lookupable
         maybe_dict = getattr(self, table_name)
         table = maybe_dict if isinstance(maybe_dict, dict) else maybe_dict()
-        query_char, query_body = inquiry[0], inquiry[1:]
-        if query_char == CHAR_Q_EQ_ID:
-            item = table[query_body]
-            return item.raw() if show_raw else item.show()
-        return CHAR_NEWLINE.join(
-                [(r.raw() if show_raw else str(r)) for
-                 r in sorted(table.values(), key=lambda r: r.id_indented())
-                 if r.match(query_char, query_body)])
+        if item_id:
+            filter_by = CHAR_Q_ID + item_id
+        items = sorted(table.values(), key=lambda x: x.id_indented())
+        if filter_by:
+            items = [item for item in items
+                     if item.match(filter_by[0], filter_by[1:])]
+        return CHAR_NEWLINE.join([(item.raw() if show_raw else str(item))
+                                  for item in items])
 
 
 def main(
@@ -634,10 +636,17 @@ def main(
     db = BricksDb(environ.get(NAME_ENV_DIRNAME, '.'))
     parser = ArgumentParser()
     add_abbrev_choices_arg(parser, 'table', set(db.lookupable))
-    parser.add_argument('inquiry', nargs='?', default=CHAR_Q_TEXT)
-    parser.add_argument('--raw', action='store_true')
+    parser.add_argument('item_id', nargs='?', metavar='ITEM_ID')
+    parser.add_argument('-r', '--raw', action='store_true')
+    parser.add_argument('-f', '--filter-by', action='store')
     args = parser.parse_args()
-    print(db.lookup(args.table, args.inquiry, args.raw).rstrip())
+    print(
+        db.lookup(
+            table_name=args.table,
+            item_id=args.item_id,
+            show_raw=args.raw,
+            filter_by=args.filter_by
+        ).rstrip())
 
 
 if __name__ == '__main__':