From 46dc80fb340b9df148d9c856a145507f1eb30efc Mon Sep 17 00:00:00 2001 From: Nicholas Karlson Date: Fri, 16 Jan 2026 17:16:45 -0800 Subject: [PATCH] Fix: refresh workbook starter zip for Matplotlib tick_labels compat --- src/pystatsv1/assets/workbook_starter.zip | Bin 56371 -> 58136 bytes tests/test_workbook_starter_zip_mpl_compat.py | 47 ++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 tests/test_workbook_starter_zip_mpl_compat.py diff --git a/src/pystatsv1/assets/workbook_starter.zip b/src/pystatsv1/assets/workbook_starter.zip index 8ffecd6902bbd4a545837b96acee195e7694e9fc..35845bbe3fbd30b17dc3597e38201c8f3584d0df 100644 GIT binary patch delta 9135 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 T`7l`ltbk_NiIN<@N!|YdjS+Hm delta 7264 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 f{r&SZ82&q$a36Gdi4TJoL<>5)-Gb None: + zip_path = Path("src") / "pystatsv1" / "assets" / "workbook_starter.zip" + assert zip_path.exists(), f"Missing starter zip at: {zip_path}" + + with zipfile.ZipFile(zip_path, "r") as z: + names = set(z.namelist()) + + assert "scripts/_mpl_compat.py" in names + + +def test_workbook_starter_zip_has_no_legacy_boxplot_labels_calls() -> None: + zip_path = Path("src") / "pystatsv1" / "assets" / "workbook_starter.zip" + assert zip_path.exists(), f"Missing starter zip at: {zip_path}" + + # We only check the known scripts that use boxplots today. + scripts = [ + "scripts/intro_stats_01_descriptives.py", + "scripts/intro_stats_03_distributions_outliers.py", + "scripts/psych_ch19_problem_set.py", + ] + + # Detect any Axes.boxplot(... labels=...) usage. + legacy_call = re.compile(r"\bboxplot\s*\(.*?\blabels\s*=", re.DOTALL) + + with zipfile.ZipFile(zip_path, "r") as z: + for member in scripts: + text = z.read(member).decode("utf-8") + assert not legacy_call.search(text), f"Found legacy labels= call in {member}" + assert "ax_boxplot" in text, f"Expected ax_boxplot wrapper in {member}"