@@ -6,8 +6,8 @@ mod release
66default :
77 @ just --list
88
9- # Build the project
10- build :
9+ # Build the project and local dev/test browser dependency
10+ build : _install-playwright-browsers
1111 {{ ninja }} pylib qt
1212
1313# Build wheels (needed for some platforms)
@@ -18,66 +18,92 @@ wheels:
1818check :
1919 {{ ninja }} pylib qt check
2020
21- # Run all tests (Rust, Python, TypeScript). Pass --coverage to enforce coverage.
22- test coverage = ' ':
23- just {{ if coverage == " --coverage" { " coverage" } else { " _test" } }}
21+ # Run all tests (Rust, Python, TypeScript). Pass --coverage to enforce coverage, and --html to include HTML reports.
22+ [arg (" coverage" , long=" coverage" , value=" --coverage" )]
23+ [arg (" html" , long=" html" , value=" --html" )]
24+ test coverage = ' ' html = ' ':
25+ just {{ if coverage == " --coverage" { " coverage " + html } else { " _test" } }}
2426
2527# Run coverage for Rust, Python, TypeScript, and Svelte-related Vitest tests
26- coverage :
27- just _coverage-rust
28- just _coverage-py
29- just _coverage-ts
30-
31- # Run Rust tests. Pass --coverage to enforce Rust coverage.
32- test-rust coverage = ' ':
33- just {{ if coverage == " --coverage" { " _coverage-rust" } else { " _test-rust" } }}
34-
35- # Run Python tests. Pass --coverage to enforce pylib and Qt Python coverage.
36- test-py coverage = ' ':
37- just {{ if coverage == " --coverage" { " _coverage-py" } else { " _test-py" } }}
38-
39- # Run TypeScript/Svelte-related Vitest tests. Pass --coverage to enforce Vitest coverage.
40- test-ts coverage = ' ':
41- just {{ if coverage == " --coverage" { " _coverage-ts" } else { " _test-ts" } }}
42-
28+ [arg (" html" , long=" html" , value=" --html" )]
29+ coverage html = ' ':
30+ just _coverage-rust {{ html }}
31+ just _coverage-py {{ html }}
32+ just _coverage-ts {{ html }}
33+
34+ # Run Rust tests. Pass --coverage to enforce Rust coverage, and --html to include an HTML report.
35+ [arg (" coverage" , long=" coverage" , value=" --coverage" )]
36+ [arg (" html" , long=" html" , value=" --html" )]
37+ test-rust coverage = ' ' html = ' ':
38+ just {{ if coverage == " --coverage" { " _coverage-rust " + html } else { " _test-rust" } }}
39+
40+ # Run Python tests. Pass --coverage to enforce pylib and Qt Python coverage, and --html to include HTML reports.
41+ [arg (" coverage" , long=" coverage" , value=" --coverage" )]
42+ [arg (" html" , long=" html" , value=" --html" )]
43+ test-py coverage = ' ' html = ' ':
44+ just {{ if coverage == " --coverage" { " _coverage-py " + html } else { " _test-py" } }}
45+
46+ # Run TypeScript/Svelte-related Vitest tests. Pass --coverage to enforce Vitest coverage, and --html to include an HTML report.
47+ [arg (" coverage" , long=" coverage" , value=" --coverage" )]
48+ [arg (" html" , long=" html" , value=" --html" )]
49+ test-ts coverage = ' ' html = ' ':
50+ just {{ if coverage == " --coverage" { " _coverage-ts " + html } else { " _test-ts" } }}
51+
52+ [private ]
4353_ test :
4454 {{ ninja }} check:rust_test check:pytest check:vitest
4555
56+ [private ]
4657_ test-rust :
4758 {{ ninja }} check:rust_test
4859
60+ [private ]
4961_ test-py :
5062 {{ ninja }} check:pytest
5163
64+ [private ]
5265_ test-ts :
5366 {{ ninja }} check:vitest
5467
55- _ coverage-rust :
68+ [private ]
69+ _ coverage-rust html = ' ':
5670 mkdir -p out/ coverage/ rust out/ bin
5771 test -x out/ bin/ cargo-llvm-cov || cargo install cargo-llvm-cov --version 0.8.4 --locked --root out
5872 ANKI_TEST_MODE=1 out/ bin/ cargo-llvm-cov llvm-cov --workspace --locked --json --summary-only --output-path out/ coverage/ rust/ coverage-summary.json --fail-under-lines 60
73+ {{ if html == " --html" { " ANKI_TEST_MODE=1 out/bin/cargo-llvm-cov llvm-cov report --html --output-dir out/coverage/rust/html" } else { " true" } }}
5974
60- _ coverage-py :
75+ [private ]
76+ _ coverage-py html = ' ':
6177 {{ ninja }} pylib qt
62- just _coverage-py-pylib
63- just _coverage-py-qt
78+ just _coverage-py-pylib {{ html }}
79+ just _coverage-py-qt {{ html }}
6480
65- _ coverage-py-pylib :
81+ [private ]
82+ _ coverage-py-pylib html = ' ':
6683 mkdir -p out/ coverage/ python-pylib
6784 PYTHONPATH=out/ pylib ANKI_TEST_MODE=1 out/ pyenv/ bin/ python -m coverage run --source=pylib/ anki --data-file=out/ coverage/ python-pylib/ .coverage -m pytest -p no:cacheprovider pylib/ tests
6885 out/ pyenv/ bin/ python -m coverage json --data-file=out/ coverage/ python-pylib/ .coverage -o out/ coverage/ python-pylib/ coverage-summary.json
6986 out/ pyenv/ bin/ python -m coverage report --data-file=out/ coverage/ python-pylib/ .coverage --fail-under=65
87+ {{ if html == " --html" { " out/pyenv/bin/python -m coverage html --data-file=out/coverage/python-pylib/.coverage -d out/coverage/python-pylib/html --fail-under=65" } else { " true" } }}
7088
71- _ coverage-py-qt :
89+ [private ]
90+ _ coverage-py-qt html = ' ':
7291 mkdir -p out/ coverage/ python-qt
7392 PYTHONPATH=pylib:out/ pylib:out/ qt ANKI_TEST_MODE=1 out/ pyenv/ bin/ python -m coverage run --source=qt/ aqt --data-file=out/ coverage/ python-qt/ .coverage -m pytest -p no:cacheprovider qt/ tests
7493 out/ pyenv/ bin/ python -m coverage json --data-file=out/ coverage/ python-qt/ .coverage -o out/ coverage/ python-qt/ coverage-summary.json
7594 out/ pyenv/ bin/ python -m coverage report --data-file=out/ coverage/ python-qt/ .coverage --fail-under=20
95+ {{ if html == " --html" { " out/pyenv/bin/python -m coverage html --data-file=out/coverage/python-qt/.coverage -d out/coverage/python-qt/html --fail-under=20" } else { " true" } }}
7696
77- _ coverage-ts :
97+ [private ]
98+ _ coverage-ts html = ' ':
7899 {{ ninja }} node_modules ts:generated
79100 mkdir -p out/ coverage/ typescript
80- out/ extracted/ node/ bin/ yarn vitest:once --coverage.enabled true --coverage.provider=v8 --coverage.reporter=text-summary --coverage.reporter=json-summary --coverage.reportsDirectory=../ out/ coverage/ typescript --coverage.thresholds.lines=5
101+ {{ yarn }} vitest:once --coverage.enabled true --coverage.provider=v8 --coverage.reporter=text-summary --coverage.reporter=json-summary {{ if html == " --html" { " --coverage.reporter=html" } else { " " } }} --coverage.reportsDirectory=../ out/ coverage/ typescript --coverage.thresholds.lines=5
102+
103+ [private ]
104+ _ install-playwright-browsers :
105+ {{ ninja }} node_modules
106+ {{ playwright_env }} {{ yarn }} playwright install chromium
81107
82108# Check formatting (fast, no build needed)
83109fmt :
@@ -134,11 +160,13 @@ docs-rust:
134160ci branch :
135161 gh workflow run ci.yml --ref {{ branch }}
136162
137- # Run TS Playwright e2e tests against a temporary Anki instance
138- # (Playwright's webServer config invokes qt/tests/launch_anki_for_e2e.py)
139- test-e2e * args :
140- {{ ninja }} node_modules ts:generated pylib qt
141- out/ extracted/ node/ bin/ yarn playwright test {{ args }}
163+ # Run TS Playwright e2e tests against a temporary Anki instance.
164+ test-e2e * args : _install-playwright-browsers
165+ {{ ninja }} ts:generated pylib qt
166+ {{ playwright_env }} {{ yarn }} playwright test {{ args }}
167+
168+ # Helpers to get the right commands for the platform
142169
143- # Helper to get the right ninja command for the platform
144170ninja := if os () == " windows" { " tools\\ ninja" } else { " ./ninja" }
171+ playwright_env := if os () == " windows" { " set PLAYWRIGHT_BROWSERS_PATH=out\\ playwright-browsers&&" } else { " PLAYWRIGHT_BROWSERS_PATH=out/playwright-browsers" }
172+ yarn := if os () == " windows" { " out\\ extracted\\ node\\ yarn.cmd" } else { " out/extracted/node/bin/yarn" }
0 commit comments