'Data structures for managing/sorting bricks of a certain kind.'
from abc import ABC, abstractmethod
from pathlib import Path
-from typing import Self
+from typing import Optional, Self
PATH_BOXES = 'boxes.txt'
PATH_COLLECTIONS = 'collections.txt'
collected[id_].alternates = alternatives
return collected
- def __str__(self) -> str:
+ def __str__(
+ self
+ ) -> str:
return '\n'.join([f'{self.id_:>6} _{self.description}']
+ [f'{a:>6} ={self.id_}' for a in self.alternates])
+ @classmethod
+ def possibly_by_alt(
+ cls,
+ id_queried: str,
+ designs: dict[str, Self]
+ ) -> Optional[Self]:
+ 'In designs find one of id_queried, by way of alternates if necessary.'
+ if id_queried in designs:
+ return designs[id_queried]
+ for design in designs.values():
+ if id_queried in design.alternates:
+ return design
+ return None
+
class Piece(Textfiled):
'Individual configuration of design and color.'
collected[piece_id] = cls(piece_id, design_id, color_id, comment)
return collected
- def __str__(self) -> str:
+ def __str__(
+ self
+ ) -> str:
return (f'{self.id_:>7} {self.design_id:>6} '
f'{self.color_id:>3} {self.comment}').rstrip()
collected += [p_id for _, p_id, _ in column]
return tuple(sorted(collected))
- def __str__(self) -> str:
+ def __str__(
+ self
+ ) -> str:
pages = []
for page in self.piece_listings:
columns = []
for id_, order in [cls.tokify(line, 2)
for line in cls.lines_of(path)]}
- def __str__(self) -> str:
+ def __str__(
+ self
+ ) -> str:
return f'{self.id_:>2} {",".join(self.designs)}'
# check all pieces' designs recorded in designs
for design_id in [piece.design_id for piece in pieces.values()]:
- if design_id not in designs:
- for replacement in [k for k, v in designs.items()
- if design_id in v.alternates]:
- design_id = replacement
- break
- assert design_id in designs, design_id
+ assert Design.possibly_by_alt(design_id, designs) is not None
# check all recorded designs have matching pieces (at least via alts)
for design_id, alts in [(k, v.alternates) for k, v in designs.items()]: