home · contact · privacy
For tables consistency check, collect and display _all_ issues. master
authorPlom Heller <plom@plomlompom.com>
Sat, 2 May 2026 03:56:02 +0000 (05:56 +0200)
committerPlom Heller <plom@plomlompom.com>
Sat, 2 May 2026 03:56:02 +0000 (05:56 +0200)
bricksplom.py

index f9143efac68a6d3026e032b3fd2d96442964f5ad..e3b3ecc61c3c5f86ee1a9515e04b58a7d1524f3a 100755 (executable)
@@ -406,46 +406,52 @@ class BricksDb:
     def _check_consistencies_between_tables(
             self
             ) -> None:
     def _check_consistencies_between_tables(
             self
             ) -> None:
+        fails = []
 
         # check all items listed in collections recorded in pieces
         for coll in self.collections.values():
 
         # check all items listed in collections recorded in pieces
         for coll in self.collections.values():
-            for _, piece_id, _ in coll.piece_listings_flat():
-                assert piece_id in self.pieces, piece_id
+            for piece_id in [t[1] for t in coll.piece_listings_flat()
+                             if t[1] not in self.pieces]:
+                fails += [f'missing Piece of ID: {piece_id}']
 
         # check all designs listed in boxes recorded in designs
         for design_ids in [b.designs for b in self.boxes().values()]:
 
         # check all designs listed in boxes recorded in designs
         for design_ids in [b.designs for b in self.boxes().values()]:
-            for design_id in design_ids:
-                assert design_id in self.designs, design_id
+            for design_id in [d_id for d_id in design_ids
+                              if d_id not in self.designs]:
+                fails += [f'missing Design of ID: {design_id}']
 
         # check all pieces' designs recorded in designs
 
         # check all pieces' designs recorded in designs
-        for design_id in [piece.design_id for piece in self.pieces.values()]:
-            assert Design.possibly_by_alt(design_id, self.designs), design_id
+        for d_id in [p.design_id for p in self.pieces.values()
+                     if not Design.possibly_by_alt(p.design_id, self.designs)]:
+            fails += [f'missing Design of ID: {d_id}']
 
         # check all recorded designs have matching pieces (at least via alts)
         for design_id, alts in [(k, v.alternates)
                                 for k, v in self.designs.items()]:
 
         # check all recorded designs have matching pieces (at least via alts)
         for design_id, alts in [(k, v.alternates)
                                 for k, v in self.designs.items()]:
-            pieces_found = False
-            for id_ in [id_ for id_ in {design_id} | alts
-                        if id_ in [piece.design_id
-                                   for piece in self.pieces.values()]]:
-                pieces_found = True
-                break
-            assert pieces_found, design_id
+            if not [id_ for id_ in {design_id} | alts
+                    if id_ in [p.design_id for p in self.pieces.values()]]:
+                fails += [f'missing Pieces for design of ID: {design_id}']
 
         # check all pieces' colors are recorded
 
         # check all pieces' colors are recorded
-        for color_id in [v.color_id for v in self.pieces.values()]:
-            assert color_id in self.colors, color_id
+        for color_id in [v.color_id for v in self.pieces.values()
+                         if v.color_id not in self.colors]:
+            fails += [f'missing Color of ID: {color_id}']
 
         # check collections in-out directions even out
         counts: dict[str, int] = {}
 
         # check collections in-out directions even out
         counts: dict[str, int] = {}
-        for coll in self.collections.values():
-            if coll.is_in is None:
-                continue
+        for coll in [coll for coll in self.collections.values()
+                     if coll.is_in is not None]:
             for count, piece_id, _ in coll.piece_listings_flat():
                 counts[piece_id] = (counts.get(piece_id, 0)
                                     + ((1 if coll.is_in else (-1)) * count))
             for count, piece_id, _ in coll.piece_listings_flat():
                 counts[piece_id] = (counts.get(piece_id, 0)
                                     + ((1 if coll.is_in else (-1)) * count))
-        for piece_id, count in counts.items():
-            assert count == 0, (piece_id, count)
+        for piece_id, count in [(k, v) for k, v in counts.items()
+                                if v != 0]:
+            fails += [f'invalid count for Piece of ID: {piece_id} ({count})']
+
+        # print, and crash on, collected fails, if any
+        for fail in fails:
+            print(fail)
+        assert not fails
 
     def lookup(
             self,
 
     def lookup(
             self,