PATH_PIECES = 'pieces.txt'
CHAR_NEWLINE = '\n'
-CHAR_SPACE = ' '
-CHAR_PLUS = '+'
-CHAR_MINUS = '-'
-CHAR_COMMA = ','
-CHAR_EQ = '='
-CHAR_UNDER = '_'
-CHAR_HASH = '#'
-CHAR_IN = '+'
-CHAR_OUT = '-'
-CHAR_INACTIVE = CHAR_HASH
-CHAR_COMMENT = CHAR_HASH
-CHAR_SEPARATOR_COLUMN = CHAR_MINUS
-CHAR_SEPARATOR_PAGE = CHAR_EQ
-
+CHAR_SEP_TOKEN = ' '
+CHAR_COMMENT = '#'
+CHAR_DESIGN_ALT = '='
+CHAR_DESIGN_DESC = '_'
+CHAR_COLL_INDENT = ' '
+CHAR_COLL_IN = '+'
+CHAR_COLL_OUT = '-'
+CHAR_COLL_INACTIVE = '#'
+CHAR_COLL_SEP_COLUMN = '-'
+CHAR_COLL_SEP_PAGE = '='
+CHAR_COL_SOLID = '+'
+CHAR_COL_TRANSPARENT = '-'
BOX_PREFIX = 'box:'
PieceListing = tuple[int, str, str]
if len(collected) == len_expected - 1:
tok = body
else:
- assert CHAR_SPACE in body, body
- tok, body = body.split(CHAR_SPACE, maxsplit=1)
+ assert CHAR_SEP_TOKEN in body, body
+ tok, body = body.split(CHAR_SEP_TOKEN, maxsplit=1)
collected += [tok]
return tuple(collected)
class WithDb(ABC):
+ 'Add db:Optional[BricksDB] field to __init__, setting ._db.'
def __init__(
self,
collected = {}
for id_, desc in [cls.tokify(line, 2) for line in cls.lines_of(path)]:
assert len(desc) > 1
- assert desc[0] in {CHAR_PLUS, CHAR_MINUS}
- collected[id_] = cls(id_, desc[0] == CHAR_PLUS, desc[1:])
+ assert desc[0] in {CHAR_COL_SOLID, CHAR_COL_TRANSPARENT}
+ collected[id_] = cls(id_, desc[0] == CHAR_COL_SOLID, desc[1:])
return collected
def __str__(
self
) -> str:
return (f'{self.id_:>3} '
- f'{CHAR_PLUS if self.solid else CHAR_MINUS}{self.wavelength}')
+ + (CHAR_COL_SOLID if self.solid else CHAR_COL_TRANSPARENT)
+ + self.wavelength)
class Design(Textfiled):
for line in cls.lines_of(path)]:
assert len(body) > 1
char_type, body = body[0], body[1:]
- assert char_type in {CHAR_EQ, CHAR_UNDER}
- if char_type == CHAR_EQ:
+ assert char_type in {CHAR_DESIGN_ALT, CHAR_DESIGN_DESC}
+ if char_type == CHAR_DESIGN_ALT:
alts[body] = alts.get(body, set())
alts[body].add(design_id)
- else: # == CHAR_UNDER
+ else: # == CHAR_DESIGN_DESC
collected[design_id] = cls(design_id, body)
for id_, alternatives in alts.items():
collected[id_].alternates = alternatives
collected = {}
for toks in [cls.tokify(line, 3) for line in cls.lines_of(path)]:
piece_id, design_id = toks[:2]
- color_id, comment = (toks[-1].split(CHAR_SPACE, maxsplit=1)
+ color_id, comment = (toks[-1].split(CHAR_SEP_TOKEN, maxsplit=1)
+ [''])[:2]
collected[piece_id] = cls(piece_id, design_id, color_id, comment)
return collected
collected = {}
i_listings: list[list[list[PieceListing]]] = [[[]]]
for line in cls.lines_of(path):
- if not line.startswith(CHAR_SPACE):
+ if not line.startswith(CHAR_COLL_INDENT):
id_, metadata = cls.tokify(line, 2)
assert metadata
- assert metadata[0] in {CHAR_IN, CHAR_OUT, CHAR_INACTIVE}
- is_in = (None if metadata[0] == CHAR_INACTIVE
- else metadata[0] == CHAR_IN)
+ assert metadata[0] in {CHAR_COLL_IN,
+ CHAR_COLL_OUT,
+ CHAR_COLL_INACTIVE}
+ is_in = (None if metadata[0] == CHAR_COLL_INACTIVE
+ else metadata[0] == CHAR_COLL_IN)
i_listings = [[[]]]
collected[id_] = is_in, metadata[1:], i_listings
- elif line[1:2] == CHAR_SEPARATOR_COLUMN:
+ elif line[1:2] == CHAR_COLL_SEP_COLUMN:
i_listings[-1] += [[]]
- elif line[1:2] == CHAR_SEPARATOR_PAGE:
+ elif line[1:2] == CHAR_COLL_SEP_PAGE:
i_listings += [[[]]]
else:
count, remainder = cls.tokify(line, 2)
assert count.isdigit()
- id_, comment = (remainder.split(CHAR_SPACE, maxsplit=1)
+ id_, comment = (remainder.split(CHAR_SEP_TOKEN, maxsplit=1)
+ [''])[:2]
assert len(id_) > 0
i_listings[-1][-1] += [(int(count), id_, comment)]
def __str__(
self
) -> str:
- is_in_str = (CHAR_INACTIVE if self.is_in is None
- else (CHAR_IN if self.is_in else CHAR_OUT))
+ is_in_str = (CHAR_COLL_INACTIVE if self.is_in is None
+ else (CHAR_COLL_IN if self.is_in else CHAR_COLL_OUT))
return (f'\n{self.id_} {is_in_str}{self.description}\n'
+ self._format_paginated(lambda count, p_id, comment:
f' {count:2} {p_id:>7} {comment}'))
for count, piece_id, _ in self.piece_listings_flat():
box_listing, description = self._db.piece_to_box_listing(piece_id)
color = str(self._db.colors[self._db.pieces[piece_id].color_id]
- ).lstrip().split(CHAR_SPACE, maxsplit=1)[1]
+ ).lstrip().split(CHAR_SEP_TOKEN, maxsplit=1)[1]
lines += [f'{box_listing} {count}× {color} {description}']
for line in sorted(lines):
print(line)