1

Liste les nouveaux personnages par année

This commit is contained in:
2025-12-03 22:41:06 +01:00
parent f9e1555ecb
commit 871539c4f7
4 changed files with 235 additions and 5 deletions

View File

@@ -5,16 +5,20 @@ from pathlib import Path
from lib.rebrickable.minifig_characters import (
aggregate_by_character,
aggregate_by_gender,
aggregate_new_character_sets,
aggregate_new_characters_by_year,
aggregate_variations_and_totals,
aggregate_character_spans,
aggregate_presence_by_year,
load_sets_enriched,
write_character_counts,
write_new_character_sets_csv,
write_new_character_sets_markdown,
write_new_characters_by_year,
write_character_variations_totals,
write_gender_counts,
)
from lib.rebrickable.minifig_character_sets import load_sets
def test_aggregate_by_character_counts_unique_figs() -> None:
@@ -143,11 +147,11 @@ def test_aggregate_new_characters_by_year_limits_range(tmp_path: Path) -> None:
"""Compter les nouveaux personnages par année en respectant la plage."""
sets_path = tmp_path / "sets_enriched.csv"
sets_path.write_text(
"set_num,year\n"
"123-1,2015\n"
"124-1,2016\n"
"125-1,2017\n"
"126-1,2014\n"
"set_num,name,year,theme_id,num_parts,img_url,set_id,rebrickable_url,in_collection\n"
"123-1,Set A,2015,0,0,,-,http://r/123-1,true\n"
"124-1,Set B,2016,0,0,,-,http://r/124-1,true\n"
"125-1,Set C,2017,0,0,,-,http://r/125-1,true\n"
"126-1,Set D,2014,0,0,,-,http://r/126-1,true\n"
)
sets_years = load_sets_enriched(sets_path)
minifigs_rows = [
@@ -172,6 +176,59 @@ def test_aggregate_new_characters_by_year_limits_range(tmp_path: Path) -> None:
]
def test_aggregate_new_character_sets_returns_intro_sets(tmp_path: Path) -> None:
"""Lister les personnages introduits avec les sets de l'année d'introduction."""
sets_path = tmp_path / "sets_enriched.csv"
sets_path.write_text(
"set_num,name,year,theme_id,num_parts,img_url,set_id,rebrickable_url,in_collection\n"
"123-1,Set A,2015,0,0,,123,http://r/123-1,true\n"
"124-1,Set B,2015,0,0,,124,http://r/124-1,true\n"
"125-1,Set C,2016,0,0,,125,http://r/125-1,true\n"
)
sets_lookup = load_sets(sets_path)
minifigs_rows = [
{"set_num": "123-1", "known_character": "Owen Grady", "fig_num": "fig-owen-1", "part_num": "head-a"},
{"set_num": "124-1", "known_character": "Owen Grady", "fig_num": "fig-owen-2", "part_num": "head-b"},
{"set_num": "125-1", "known_character": "Owen Grady", "fig_num": "fig-owen-3", "part_num": "head-c"},
{"set_num": "125-1", "known_character": "Ellie Sattler", "fig_num": "fig-ellie-1", "part_num": "head-d"},
]
rows = aggregate_new_character_sets(
minifigs_rows,
sets_lookup,
excluded_characters=["Figurant"],
start_year=2015,
end_year=2016,
)
assert rows == [
{
"year": "2015",
"known_character": "Owen Grady",
"set_num": "123-1",
"set_id": "123",
"set_name": "Set A",
"rebrickable_url": "http://r/123-1",
},
{
"year": "2015",
"known_character": "Owen Grady",
"set_num": "124-1",
"set_id": "124",
"set_name": "Set B",
"rebrickable_url": "http://r/124-1",
},
{
"year": "2016",
"known_character": "Ellie Sattler",
"set_num": "125-1",
"set_id": "125",
"set_name": "Set C",
"rebrickable_url": "http://r/125-1",
},
]
def test_write_character_counts_outputs_csv(tmp_path: Path) -> None:
"""Écrit le CSV des comptes par personnage."""
destination = tmp_path / "counts.csv"
@@ -224,6 +281,42 @@ def test_write_new_characters_by_year_outputs_csv(tmp_path: Path) -> None:
assert destination.read_text() == "year,new_characters\n2015,3\n2016,1\n"
def test_write_new_character_sets_markdown_outputs_md(tmp_path: Path) -> None:
"""Écrit le Markdown listant les nouveaux personnages et leurs sets."""
destination = tmp_path / "new_characters.md"
rows = [
{
"year": "2015",
"known_character": "Owen Grady",
"set_num": "123-1",
"set_id": "123",
"set_name": "Set A",
"rebrickable_url": "http://r/123-1",
},
{
"year": "2016",
"known_character": "Ellie Sattler",
"set_num": "125-1",
"set_id": "125",
"set_name": "Set C",
"rebrickable_url": "http://r/125-1",
},
]
write_new_character_sets_markdown(destination, rows)
assert destination.read_text() == (
"##### 2015\n\n"
"- Owen Grady\n"
" - [123](http://r/123-1) - Set A\n"
"\n"
"##### 2016\n\n"
"- Ellie Sattler\n"
" - [125](http://r/125-1) - Set C\n"
"\n"
)
def test_aggregate_presence_by_year_excludes_figurants(tmp_path: Path) -> None:
"""Calcule le total annuel en excluant les figurants."""
sets_path = tmp_path / "sets_enriched.csv"