From a439586e00e54a4953c2e4f500a33724caab901e Mon Sep 17 00:00:00 2001 From: Nicholas Karlson Date: Sat, 17 Jan 2026 22:41:59 -0800 Subject: [PATCH] Workbook: Track D student UX (d00_setup_data + d01..d23 wrappers) --- scripts/d00_peek_data.py | 1 + scripts/d00_setup_data.py | 102 ++++++++++++++++++++++ src/pystatsv1/assets/workbook_track_d.zip | Bin 153852 -> 167718 bytes src/pystatsv1/cli.py | 49 ++++++----- tests/test_workbook_track_d_zip_smoke.py | 68 +++++++++------ 5 files changed, 169 insertions(+), 51 deletions(-) create mode 100644 scripts/d00_setup_data.py diff --git a/scripts/d00_peek_data.py b/scripts/d00_peek_data.py index 6b337b2..aca760a 100644 --- a/scripts/d00_peek_data.py +++ b/scripts/d00_peek_data.py @@ -114,6 +114,7 @@ def main(argv: list[str] | None = None) -> int: report.write_text("\n".join(sections).rstrip() + "\n", encoding="utf-8") print(f"\n✅ Wrote summary: {report}") + print("Tip: If you edited data/synthetic, run: pystatsv1 workbook run d00_setup_data --force") return 0 diff --git a/scripts/d00_setup_data.py b/scripts/d00_setup_data.py new file mode 100644 index 0000000..c7a9c25 --- /dev/null +++ b/scripts/d00_setup_data.py @@ -0,0 +1,102 @@ +# SPDX-License-Identifier: MIT +"""Track D workbook helper: (re)generate the synthetic datasets. + +Normally you do **not** need this because Track D canonical datasets (seed=123) +are shipped and extracted during: + + pystatsv1 workbook init --track d + +Use this script if you deleted/modified files under data/synthetic and want to +reset them, or if you want to confirm determinism. +""" + +from __future__ import annotations + +import argparse +import shutil +import subprocess +import sys +from pathlib import Path + + +def _rm_tree(path: Path) -> None: + if path.exists(): + shutil.rmtree(path) + + +def _run(script_path: Path, args: list[str]) -> None: + subprocess.run([sys.executable, str(script_path), *args], check=True) + + +def main(argv: list[str] | None = None) -> int: + p = argparse.ArgumentParser(description="(Re)generate Track D datasets (deterministic).") + p.add_argument( + "--seed", + type=int, + default=123, + help="Random seed (default: 123). Keep 123 to match the canonical datasets.", + ) + p.add_argument( + "--root", + default="data/synthetic", + help="Dataset root folder (default: data/synthetic).", + ) + p.add_argument( + "--force", + action="store_true", + help="Delete existing dataset folders before regenerating.", + ) + p.add_argument( + "--no-validate", + action="store_true", + help="Skip the NSO dataset validation step.", + ) + + args = p.parse_args(argv) + + root = Path(args.root) + ledger_dir = root / "ledgerlab_ch01" + nso_dir = root / "nso_v1" + + if args.force: + _rm_tree(ledger_dir) + _rm_tree(nso_dir) + + ledger_dir.mkdir(parents=True, exist_ok=True) + nso_dir.mkdir(parents=True, exist_ok=True) + + scripts_dir = Path(__file__).resolve().parent + _run( + scripts_dir / "sim_business_ledgerlab.py", + ["--outdir", str(ledger_dir), "--seed", str(args.seed)], + ) + _run( + scripts_dir / "sim_business_nso_v1.py", + ["--outdir", str(nso_dir), "--seed", str(args.seed)], + ) + + if not args.no_validate: + outdir = Path("outputs/track_d") / "d00_setup_data_validate" + outdir.mkdir(parents=True, exist_ok=True) + _run( + scripts_dir / "business_validate_dataset.py", + [ + "--datadir", + str(nso_dir), + "--outdir", + str(outdir), + "--dataset", + "nso_v1", + "--seed", + str(args.seed), + ], + ) + + print("\n✅ Datasets ready under:", root) + print(" -", ledger_dir) + print(" -", nso_dir) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/pystatsv1/assets/workbook_track_d.zip b/src/pystatsv1/assets/workbook_track_d.zip index 68f95d4c924c27dac7619e228c08330ebe460a27..6f7ad7dab1490090121b48486e08f4250e004f54 100644 GIT binary patch delta 45044 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 G@&5opInd7l diff --git a/src/pystatsv1/cli.py b/src/pystatsv1/cli.py index b105485..bec4162 100644 --- a/src/pystatsv1/cli.py +++ b/src/pystatsv1/cli.py @@ -167,30 +167,31 @@ def cmd_workbook_list(args: argparse.Namespace) -> int: if track == "d": chapters = [ - "D00 Peek the Track D datasets (LedgerLab + NSO)", - "Ch01 Accounting as a measurement system", - "Ch02 Double-entry and the general ledger as a database", - "Ch03 Financial statements as summaries", - "Ch04 Assets: inventory + fixed assets", - "Ch05 Liabilities, payroll, taxes, and equity", - "Ch06 Reconciliations and quality control", - "Ch07 Preparing accounting data for analysis", - "Ch08 Descriptive statistics for financial performance", - "Ch09 Reporting style contract", - "Ch10 Probability and risk", - "Ch11 Sampling, estimation, and audit controls", - "Ch12 Hypothesis testing for decisions", - "Ch13 Correlation, causation, and controlled comparisons", - "Ch14 Regression and driver analysis", - "Ch15 Forecasting foundations", - "Ch16 Seasonality and baselines", - "Ch17 Revenue forecasting: segmentation + drivers", - "Ch18 Expense forecasting: fixed/variable/step + payroll", - "Ch19 Cash flow forecasting: direct method (13-week)", - "Ch20 Integrated forecasting: three statements", - "Ch21 Scenario planning: sensitivity + stress", - "Ch22 Financial statement analysis toolkit", - "Ch23 Communicating results and governance", + "D00 Setup/reset Track D datasets (run: d00_setup_data)", + "D00 Peek the Track D datasets (LedgerLab + NSO) (run: d00_peek_data)", + "D01 Ch01 Accounting as a measurement system (run: d01)", + "D02 Ch02 Double-entry and the general ledger as a database (run: d02)", + "D03 Ch03 Financial statements as summaries (run: d03)", + "D04 Ch04 Assets: inventory + fixed assets (run: d04)", + "D05 Ch05 Liabilities, payroll, taxes, and equity (run: d05)", + "D06 Ch06 Reconciliations and quality control (run: d06)", + "D07 Ch07 Preparing accounting data for analysis (run: d07)", + "D08 Ch08 Descriptive statistics for financial performance (run: d08)", + "D09 Ch09 Reporting style contract (run: d09)", + "D10 Ch10 Probability and risk (run: d10)", + "D11 Ch11 Sampling, estimation, and audit controls (run: d11)", + "D12 Ch12 Hypothesis testing for decisions (run: d12)", + "D13 Ch13 Correlation, causation, and controlled comparisons (run: d13)", + "D14 Ch14 Regression and driver analysis (run: d14)", + "D15 Ch15 Forecasting foundations (run: d15)", + "D16 Ch16 Seasonality and baselines (run: d16)", + "D17 Ch17 Revenue forecasting: segmentation + drivers (run: d17)", + "D18 Ch18 Expense forecasting: fixed/variable/step + payroll (run: d18)", + "D19 Ch19 Cash flow forecasting: direct method (13-week) (run: d19)", + "D20 Ch20 Integrated forecasting: three statements (run: d20)", + "D21 Ch21 Scenario planning: sensitivity + stress (run: d21)", + "D22 Ch22 Financial statement analysis toolkit (run: d22)", + "D23 Ch23 Communicating results and governance (run: d23)", ] print("\n".join(chapters)) return 0 diff --git a/tests/test_workbook_track_d_zip_smoke.py b/tests/test_workbook_track_d_zip_smoke.py index dea5317..4a176c0 100644 --- a/tests/test_workbook_track_d_zip_smoke.py +++ b/tests/test_workbook_track_d_zip_smoke.py @@ -1,52 +1,66 @@ +# SPDX-License-Identifier: MIT + from __future__ import annotations -import zipfile -from argparse import Namespace from pathlib import Path -import pystatsv1.cli as cli +import zipfile def test_workbook_track_d_zip_exists_and_has_expected_files() -> None: - zip_path = Path("src") / "pystatsv1" / "assets" / "workbook_track_d.zip" - assert zip_path.exists(), f"Missing Track D workbook zip at: {zip_path}" + """Ensure the Track D workbook template zip is present and looks sane.""" + zip_path = Path("src/pystatsv1/assets/workbook_track_d.zip") + assert zip_path.exists(), "workbook_track_d.zip missing" - with zipfile.ZipFile(zip_path, "r") as z: - names = set(z.namelist()) + with zipfile.ZipFile(zip_path) as zf: + names = set(zf.namelist()) expected = { "README.md", "Makefile", - "scripts/d00_peek_data.py", + "requirements.txt", "scripts/_cli.py", - "scripts/_business_etl.py", - "scripts/sim_business_nso_v1.py", + "scripts/d00_peek_data.py", + "scripts/d00_setup_data.py", "scripts/sim_business_ledgerlab.py", - "scripts/business_ch01_accounting_measurement.py", - "scripts/business_ch23_communicating_results_governance.py", - "data/synthetic/.gitkeep", + "scripts/sim_business_nso_v1.py", + "scripts/business_validate_dataset.py", + "tests/test_business_smoke.py", "data/synthetic/ledgerlab_ch01/.gitkeep", "data/synthetic/nso_v1/.gitkeep", - "outputs/track_d/.gitkeep", - "tests/test_business_smoke.py", } + # Convenience wrappers: d01.py .. d23.py + expected |= {f"scripts/d{i:02d}.py" for i in range(1, 24)} + missing = expected - names - assert not missing, f"missing from Track D starter zip: {sorted(missing)}" + assert not missing, f"Missing from workbook zip: {sorted(missing)}" + + +def test_extract_workbook_template_has_expected_layout(tmp_path: Path) -> None: + zip_path = Path("src/pystatsv1/assets/workbook_track_d.zip") + + with zipfile.ZipFile(zip_path) as zf: + zf.extractall(tmp_path) + assert (tmp_path / "README.md").exists() + assert (tmp_path / "scripts" / "d00_peek_data.py").exists() + assert (tmp_path / "scripts" / "d00_setup_data.py").exists() -def test_extract_workbook_template_track_d_extracts_scripts(tmp_path) -> None: - dest = tmp_path / "wb_d" - cli._extract_workbook_template(dest=dest, force=False, track="d") + # Spot-check a few wrapper scripts. + assert (tmp_path / "scripts" / "d01.py").exists() + assert (tmp_path / "scripts" / "d14.py").exists() + assert (tmp_path / "scripts" / "d23.py").exists() - assert (dest / "scripts" / "business_ch01_accounting_measurement.py").exists() - assert (dest / "scripts" / "d00_peek_data.py").exists() - assert (dest / "outputs" / "track_d").exists() +def test_workbook_list_track_d_mentions_track_d(capsys) -> None: + # Import and call the list command, then assert key UX strings are present. + from pystatsv1.cli import main -def test_workbook_list_track_d_mentions_ch01(capsys) -> None: - rc = cli.cmd_workbook_list(Namespace(track="d")) - assert rc == 0 + code = main(["workbook", "list", "--track", "d"]) + assert code == 0 out = capsys.readouterr().out - assert "Ch01" in out - assert "D00" in out + assert "run: d00_setup_data" in out + assert "run: d00_peek_data" in out + assert "run: d01" in out + assert "run: d23" in out