You've already forked etude_lego_jurassic_world
Ajoute le genre des personnages et colore les graphiques
This commit is contained in:
@@ -12,11 +12,11 @@ matplotlib.use("Agg")
|
||||
def test_plot_character_spans(tmp_path: Path) -> None:
|
||||
"""Génère le graphique de span des personnages."""
|
||||
spans_path = tmp_path / "minifig_character_spans.csv"
|
||||
destination = tmp_path / "figures" / "step23" / "minifig_character_spans.png"
|
||||
destination = tmp_path / "figures" / "step24" / "minifig_character_spans.png"
|
||||
spans_path.write_text(
|
||||
"known_character,start_year,end_year,total_minifigs\n"
|
||||
"Owen Grady,2020,2022,3\n"
|
||||
"Figurant,2019,2020,2\n"
|
||||
"known_character,start_year,end_year,total_minifigs,gender\n"
|
||||
"Owen Grady,2020,2022,3,male\n"
|
||||
"Figurant,2019,2020,2,unknown\n"
|
||||
)
|
||||
|
||||
plot_character_spans(spans_path, destination)
|
||||
|
||||
@@ -15,18 +15,54 @@ def test_aggregate_by_character_counts_unique_figs() -> None:
|
||||
"""Compter les minifigs distinctes par personnage en excluant les noms vides."""
|
||||
aggregates = aggregate_by_character(
|
||||
[
|
||||
{"set_num": "123-1", "part_num": "head-a", "known_character": "Owen Grady", "fig_num": "fig-owen-1"},
|
||||
{"set_num": "124-1", "part_num": "head-b", "known_character": "Owen Grady", "fig_num": "fig-owen-1"},
|
||||
{"set_num": "125-1", "part_num": "head-c", "known_character": "Owen Grady", "fig_num": "fig-owen-2"},
|
||||
{"set_num": "126-1", "part_num": "head-d", "known_character": "Figurant", "fig_num": "fig-guard-1"},
|
||||
{"set_num": "128-1", "part_num": "head-f", "known_character": "Figurant", "fig_num": "fig-guard-1"},
|
||||
{"set_num": "129-1", "part_num": "head-g", "known_character": "", "fig_num": "fig-guard-2"},
|
||||
{
|
||||
"set_num": "123-1",
|
||||
"part_num": "head-a",
|
||||
"known_character": "Owen Grady",
|
||||
"fig_num": "fig-owen-1",
|
||||
"gender": "male",
|
||||
},
|
||||
{
|
||||
"set_num": "124-1",
|
||||
"part_num": "head-b",
|
||||
"known_character": "Owen Grady",
|
||||
"fig_num": "fig-owen-1",
|
||||
"gender": "male",
|
||||
},
|
||||
{
|
||||
"set_num": "125-1",
|
||||
"part_num": "head-c",
|
||||
"known_character": "Owen Grady",
|
||||
"fig_num": "fig-owen-2",
|
||||
"gender": "male",
|
||||
},
|
||||
{
|
||||
"set_num": "126-1",
|
||||
"part_num": "head-d",
|
||||
"known_character": "Figurant",
|
||||
"fig_num": "fig-guard-1",
|
||||
"gender": "unknown",
|
||||
},
|
||||
{
|
||||
"set_num": "128-1",
|
||||
"part_num": "head-f",
|
||||
"known_character": "Figurant",
|
||||
"fig_num": "fig-guard-1",
|
||||
"gender": "unknown",
|
||||
},
|
||||
{
|
||||
"set_num": "129-1",
|
||||
"part_num": "head-g",
|
||||
"known_character": "",
|
||||
"fig_num": "fig-guard-2",
|
||||
"gender": "unknown",
|
||||
},
|
||||
]
|
||||
)
|
||||
|
||||
assert aggregates == [
|
||||
{"known_character": "Owen Grady", "minifig_count": 2},
|
||||
{"known_character": "Figurant", "minifig_count": 1},
|
||||
{"known_character": "Owen Grady", "gender": "male", "minifig_count": 2},
|
||||
{"known_character": "Figurant", "gender": "unknown", "minifig_count": 1},
|
||||
]
|
||||
|
||||
|
||||
@@ -34,13 +70,13 @@ def test_write_character_counts_outputs_csv(tmp_path: Path) -> None:
|
||||
"""Écrit le CSV des comptes par personnage."""
|
||||
destination = tmp_path / "counts.csv"
|
||||
rows = [
|
||||
{"known_character": "A", "minifig_count": 2},
|
||||
{"known_character": "B", "minifig_count": 1},
|
||||
{"known_character": "A", "gender": "male", "minifig_count": 2},
|
||||
{"known_character": "B", "gender": "female", "minifig_count": 1},
|
||||
]
|
||||
|
||||
write_character_counts(destination, rows)
|
||||
|
||||
assert destination.read_text() == "known_character,minifig_count\nA,2\nB,1\n"
|
||||
assert destination.read_text() == "known_character,gender,minifig_count\nA,male,2\nB,female,1\n"
|
||||
|
||||
|
||||
def test_aggregate_presence_by_year_excludes_figurants(tmp_path: Path) -> None:
|
||||
@@ -52,8 +88,20 @@ def test_aggregate_presence_by_year_excludes_figurants(tmp_path: Path) -> None:
|
||||
"124-1,2021\n"
|
||||
)
|
||||
minifigs_rows = [
|
||||
{"set_num": "123-1", "known_character": "Owen Grady", "fig_num": "fig-owen", "part_num": "head-a"},
|
||||
{"set_num": "124-1", "known_character": "Figurant", "fig_num": "fig-guard", "part_num": "head-b"},
|
||||
{
|
||||
"set_num": "123-1",
|
||||
"known_character": "Owen Grady",
|
||||
"fig_num": "fig-owen",
|
||||
"part_num": "head-a",
|
||||
"gender": "male",
|
||||
},
|
||||
{
|
||||
"set_num": "124-1",
|
||||
"known_character": "Figurant",
|
||||
"fig_num": "fig-guard",
|
||||
"part_num": "head-b",
|
||||
"gender": "unknown",
|
||||
},
|
||||
]
|
||||
sets_years = load_sets_enriched(sets_path)
|
||||
|
||||
@@ -76,13 +124,31 @@ def test_aggregate_character_spans_excludes_figurants(tmp_path: Path) -> None:
|
||||
)
|
||||
sets_years = load_sets_enriched(sets_path)
|
||||
minifigs_rows = [
|
||||
{"set_num": "123-1", "known_character": "Owen Grady", "fig_num": "fig-owen", "part_num": "head-a"},
|
||||
{"set_num": "124-1", "known_character": "Owen Grady", "fig_num": "fig-owen", "part_num": "head-a"},
|
||||
{"set_num": "125-1", "known_character": "Figurant", "fig_num": "fig-guard", "part_num": "head-b"},
|
||||
{
|
||||
"set_num": "123-1",
|
||||
"known_character": "Owen Grady",
|
||||
"fig_num": "fig-owen",
|
||||
"part_num": "head-a",
|
||||
"gender": "male",
|
||||
},
|
||||
{
|
||||
"set_num": "124-1",
|
||||
"known_character": "Owen Grady",
|
||||
"fig_num": "fig-owen",
|
||||
"part_num": "head-a",
|
||||
"gender": "male",
|
||||
},
|
||||
{
|
||||
"set_num": "125-1",
|
||||
"known_character": "Figurant",
|
||||
"fig_num": "fig-guard",
|
||||
"part_num": "head-b",
|
||||
"gender": "unknown",
|
||||
},
|
||||
]
|
||||
|
||||
spans = aggregate_character_spans(minifigs_rows, sets_years, excluded_characters=["Figurant"])
|
||||
|
||||
assert spans == [
|
||||
{"known_character": "Owen Grady", "start_year": "2020", "end_year": "2021", "total_minifigs": "2"},
|
||||
{"known_character": "Owen Grady", "start_year": "2020", "end_year": "2021", "total_minifigs": "2", "gender": "male"},
|
||||
]
|
||||
|
||||
@@ -14,9 +14,9 @@ def test_plot_minifigs_per_character(tmp_path: Path) -> None:
|
||||
counts_path = tmp_path / "counts.csv"
|
||||
destination = tmp_path / "figures" / "step22" / "minifig_characters.png"
|
||||
counts_path.write_text(
|
||||
"known_character,minifig_count\n"
|
||||
"Owen Grady,2\n"
|
||||
"Figurant,1\n"
|
||||
"known_character,gender,minifig_count\n"
|
||||
"Owen Grady,male,2\n"
|
||||
"Figurant,unknown,1\n"
|
||||
)
|
||||
|
||||
plot_minifigs_per_character(counts_path, destination)
|
||||
|
||||
@@ -71,6 +71,13 @@ def test_build_minifigs_by_set_filters_spares_and_deduplicates(tmp_path) -> None
|
||||
"alias,canonical\n"
|
||||
"Guard in Helmet with Trans-Brown Visor,Figurant\n",
|
||||
)
|
||||
genders_path = tmp_path / "known_character_genders.csv"
|
||||
write_csv(
|
||||
genders_path,
|
||||
"known_character,gender\n"
|
||||
"Owen Grady,male\n"
|
||||
"Figurant,unknown\n",
|
||||
)
|
||||
destination_path = tmp_path / "minifigs_by_set.csv"
|
||||
|
||||
build_minifigs_by_set(
|
||||
@@ -81,12 +88,13 @@ def test_build_minifigs_by_set_filters_spares_and_deduplicates(tmp_path) -> None
|
||||
inventory_minifigs_path,
|
||||
minifigs_path,
|
||||
aliases_path,
|
||||
genders_path,
|
||||
destination_path,
|
||||
)
|
||||
|
||||
assert destination_path.read_text() == (
|
||||
"set_num,part_num,known_character,fig_num\n"
|
||||
"123-1,head-a,Owen Grady,fig-owen\n"
|
||||
"123-1,head-b,Figurant,fig-guard\n"
|
||||
"124-1,head-b,Figurant,fig-guard\n"
|
||||
"set_num,part_num,known_character,fig_num,gender\n"
|
||||
"123-1,head-a,Owen Grady,fig-owen,male\n"
|
||||
"123-1,head-b,Figurant,fig-guard,unknown\n"
|
||||
"124-1,head-b,Figurant,fig-guard,unknown\n"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user