home · contact · privacy
Don't crash --ldraw fill_paths for non-existing ones. master
authorPlom Heller <plom@plomlompom.com>
Fri, 7 Aug 2026 12:46:53 +0000 (14:46 +0200)
committerPlom Heller <plom@plomlompom.com>
Fri, 7 Aug 2026 12:46:53 +0000 (14:46 +0200)
src/bricksplom/ldraw.py
src/bricksplom/misc.py

index 29432ce55277acf34f4a80f2abb501da94d3e6c7..bb57901ed205ec09de114944fd17ac7a141c5533 100644 (file)
@@ -14,6 +14,7 @@ LDRAW_STUDS = {
     'stud6a.dat',
     'stud10.dat',
     'stud15.dat',
     'stud6a.dat',
     'stud10.dat',
     'stud15.dat',
+    # mini-figs
     'hipstud.dat',
     's/973s01.dat'
 }
     'hipstud.dat',
     's/973s01.dat'
 }
@@ -21,9 +22,12 @@ LDRAW_STUDS = {
 
 LdrawRefsTree = tuple[Path, '_SubRefs']
 _SubRefs = dict[str, LdrawRefsTree]
 
 LdrawRefsTree = tuple[Path, '_SubRefs']
 _SubRefs = dict[str, LdrawRefsTree]
+_N_TOKS_PER_REFLINE = 15
 
 
 
 
-_N_TOKS_PER_REFLINE = 15
+class LdrawPathFailure(Exception):
+    'For when no proper .dat file found to filename.'
+    pass
 
 
 class LdrawDb:
 
 
 class LdrawDb:
@@ -44,7 +48,7 @@ class LdrawDb:
             path = self._root.joinpath(prefix, filename)
             if path.exists():
                 return path
             path = self._root.joinpath(prefix, filename)
             if path.exists():
                 return path
-        raise Exception(f'invalid ldraw reference: {filename}')
+        raise LdrawPathFailure(f'invalid ldraw reference: {filename}')
 
     def _walk_tree(
             self,
 
     def _walk_tree(
             self,
index 0a4c4a209cfe0b5d6ed3e1b8f6532663de4518f5..274b8f3eeb54108f98d900a166f97c25fb85da49 100644 (file)
@@ -7,7 +7,7 @@ from pathlib import Path
 from typing import Callable, Optional, Self
 # ourselves
 from bricksplom.constants import CHAR_NEWLINE
 from typing import Callable, Optional, Self
 # ourselves
 from bricksplom.constants import CHAR_NEWLINE
-from bricksplom.ldraw import LdrawDb, LdrawRefsTree
+from bricksplom.ldraw import LdrawDb, LdrawPathFailure, LdrawRefsTree
 
 CHAR_SEP_TOKEN = ' '
 CHAR_COMMENT = '#'
 
 CHAR_SEP_TOKEN = ' '
 CHAR_COMMENT = '#'
@@ -418,7 +418,7 @@ class BrickDesign(Textfiled, WithDb, Lookupable):
                     a_key, a_val_str = attr.split(CHAR_ATTR_EQ, maxsplit=1)
                     assert a_key in annos
                     if annos[a_key] is int:
                     a_key, a_val_str = attr.split(CHAR_ATTR_EQ, maxsplit=1)
                     assert a_key in annos
                     if annos[a_key] is int:
-                        assert a_val_str.isdigit()
+                        assert a_val_str.isdigit(), a_val_str
                         setattr(attrs, a_key, int(a_val_str))
                     else:
                         setattr(attrs, a_key, a_val_str)
                         setattr(attrs, a_key, int(a_val_str))
                     else:
                         setattr(attrs, a_key, a_val_str)
@@ -734,7 +734,12 @@ class BricksDb:
             for design in [design for design in self.designs.values()
                            if not (design.alternate_to or design.ldraw)]:
                 filename = f'{design.id_}.dat'
             for design in [design for design in self.designs.values()
                            if not (design.alternate_to or design.ldraw)]:
                 filename = f'{design.id_}.dat'
-                if self.ldraw.path(filename).exists():
+                exists = False
+                try:
+                    exists = self.ldraw.path(filename).exists()
+                except LdrawPathFailure:
+                    pass
+                if exists:
                     assert design.direct_attrs is not None
                     design.direct_attrs.ldraw = filename
         self._check_consistencies()
                     assert design.direct_attrs is not None
                     design.direct_attrs.ldraw = filename
         self._check_consistencies()