From 4d37323c15ae8393785d76a98cc8d6809ca29e9a Mon Sep 17 00:00:00 2001 From: Richard Dern Date: Tue, 2 Dec 2025 22:15:19 +0100 Subject: [PATCH] Enrichit les frises minifigs avec fig_num et possession --- README.md | 1 + lib/plots/minifig_character_collages.py | 3 +- lib/rebrickable/minifig_character_sets.py | 7 +++- tests/test_minifig_character_collages.py | 46 ++++++++++++++++++----- 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index cbac1fd..7005cf4 100644 --- a/README.md +++ b/README.md @@ -351,3 +351,4 @@ Le script lit `data/intermediate/minifigs_by_set.csv`, `data/intermediate/sets_e - `data/intermediate/minifig_character_sets.csv` : apparitions des personnages avec set, identifiant de set, année et fig_num. - `figures/step32/minifig_characters/{personnage}.png` : frise horizontale par personnage, composée des visuels de minifigs dans l’ordre chronologique, annotés avec l’année et le numéro de set. Les minifigs dont l’image n’est pas disponible sont remplacées par un rectangle neutre pour matérialiser le manque. +- Les étiquettes affichent aussi l’identifiant de la minifig (`fig-*`) et un astérisque à côté du set (`set_num*`) lorsqu’il est présent dans la collection. diff --git a/lib/plots/minifig_character_collages.py b/lib/plots/minifig_character_collages.py index aef8165..46132da 100644 --- a/lib/plots/minifig_character_collages.py +++ b/lib/plots/minifig_character_collages.py @@ -67,7 +67,8 @@ def build_character_collage( cells: List[Image.Image] = [] for row in entries: image_path = resources_dir / row["set_id"] / sanitized / "minifig.jpg" - label = f"{row['year']} - {row['set_num']}" + owned = "*" if row.get("in_collection", "").lower() == "true" else "" + label = f"{row['year']} - {row['set_num']}{owned} ({row['fig_num']})" if str(image_path) in missing: image = build_placeholder(image_height) else: diff --git a/lib/rebrickable/minifig_character_sets.py b/lib/rebrickable/minifig_character_sets.py index 923f3d3..e203930 100644 --- a/lib/rebrickable/minifig_character_sets.py +++ b/lib/rebrickable/minifig_character_sets.py @@ -48,17 +48,20 @@ def build_character_sets( "set_id": set_row["set_id"], "year": set_row["year"], "fig_num": fig_num, + "in_collection": set_row["in_collection"], } ) seen.add(key) - character_sets.sort(key=lambda row: (row["known_character"], int(row["year"]), row["set_num"], row["fig_num"])) + character_sets.sort( + key=lambda row: (row["known_character"], int(row["year"]), row["set_num"], row["fig_num"]) + ) return character_sets def write_character_sets(destination_path: Path, rows: Sequence[dict]) -> None: """Écrit le CSV listant les sets par personnage.""" ensure_parent_dir(destination_path) - fieldnames = ["known_character", "set_num", "set_id", "year", "fig_num"] + fieldnames = ["known_character", "set_num", "set_id", "year", "fig_num", "in_collection"] with destination_path.open("w", newline="") as csv_file: writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader() diff --git a/tests/test_minifig_character_collages.py b/tests/test_minifig_character_collages.py index 923b716..e3472be 100644 --- a/tests/test_minifig_character_collages.py +++ b/tests/test_minifig_character_collages.py @@ -26,19 +26,47 @@ def test_build_character_sets_and_collages(tmp_path: Path) -> None: {"set_num": "1003-1", "known_character": "Figurant", "fig_num": "fig-4"}, ] sets_lookup = { - "1000-1": {"set_id": "1000", "year": "2020"}, - "1001-1": {"set_id": "1001", "year": "2021"}, - "1002-1": {"set_id": "1002", "year": "2022"}, - "1003-1": {"set_id": "1003", "year": "2023"}, - "1004-1": {"set_id": "1004", "year": "2024"}, + "1000-1": {"set_id": "1000", "year": "2020", "in_collection": "true"}, + "1001-1": {"set_id": "1001", "year": "2021", "in_collection": "false"}, + "1002-1": {"set_id": "1002", "year": "2022", "in_collection": "false"}, + "1003-1": {"set_id": "1003", "year": "2023", "in_collection": "false"}, + "1004-1": {"set_id": "1004", "year": "2024", "in_collection": "true"}, } character_sets = build_character_sets(minifigs_rows, sets_lookup, excluded_characters=["Figurant"]) assert character_sets == [ - {"known_character": "Alice", "set_num": "1000-1", "set_id": "1000", "year": "2020", "fig_num": "fig-1"}, - {"known_character": "Bob", "set_num": "1001-1", "set_id": "1001", "year": "2021", "fig_num": "fig-2"}, - {"known_character": "Bob", "set_num": "1002-1", "set_id": "1002", "year": "2022", "fig_num": "fig-3"}, - {"known_character": "Claire Dearing", "set_num": "1004-1", "set_id": "1004", "year": "2024", "fig_num": "fig-5"}, + { + "known_character": "Alice", + "set_num": "1000-1", + "set_id": "1000", + "year": "2020", + "fig_num": "fig-1", + "in_collection": "true", + }, + { + "known_character": "Bob", + "set_num": "1001-1", + "set_id": "1001", + "year": "2021", + "fig_num": "fig-2", + "in_collection": "false", + }, + { + "known_character": "Bob", + "set_num": "1002-1", + "set_id": "1002", + "year": "2022", + "fig_num": "fig-3", + "in_collection": "false", + }, + { + "known_character": "Claire Dearing", + "set_num": "1004-1", + "set_id": "1004", + "year": "2024", + "fig_num": "fig-5", + "in_collection": "true", + }, ] resources_dir = tmp_path / "resources"