From 29f8bab8f5fc4f517c35b30b57b0917966d63ef9 Mon Sep 17 00:00:00 2001 From: Ali Date: Thu, 18 Jun 2026 13:31:41 +0100 Subject: [PATCH 1/2] Add test coverage reporting with pytest-cov - pytest-cov in the dev extra; coverage source config in pyproject - CI runs pytest with --cov and a --cov-fail-under=85 gate (currently ~92%) - README Development section documents coverage usage --- .coverage | Bin 0 -> 53248 bytes .github/workflows/tests.yml | 6 +++--- README.md | 8 +++++--- pyproject.toml | 5 ++++- 4 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 .coverage diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..af55b1689aecfd70d905ad619ab8d92d0ea8b4ef GIT binary patch literal 53248 zcmeI)OKclO7zglu*m0aV*+5j85UNa7P!i=~ERf1W2tprfq4Ysh#EI?N9w*z{yUFgl zNrbB6QmI^W5+#Z7emF`mghg)GNuOon~S*IZg+#KmY;|fWW2^s2)xw(tUmMnNyyT zD{;>;^4tlYyLP_6dt!1oo1A!i|85rSV?!N`ma#E5!5n*z&2Wbm%@Sv(RWS30XIfLt zo90pIipvXP&Z2!ZYl(p4etfZ}n+1yH@hM7T#xcu=v%pU9g;761cs7sEd%+G$gqu^A z2*HNJ=)=t6MecAb&)pywLuO&PWBAk49f@>ruY8XCWip&R{dG2!hIZ77vad)9n=e?k`j$O`pHY=HyUrft2J=3-rpXd3C#|!Hga8#g03*pt5 zhSEAF3Un-p8J??7rxtmgm|^fRa*;A;*%50kqBu20_Va92$~huGUMbIr%Apv+i9Nen z%w};tJ1p!2*UdV0Su1Ztbw=c(MuS)t%bcz7)yf}bwV0!RF)VwOi9%2dc%ic`{c5i) zQLE(h?re$PI_XBmv;A$IDqqjiQ|jzf?TPfjfP8M&ZzzIC&zYXPx{_>YG^@LtG#zog zdAkw4q_L5RUQ{YEyXbcr5t{{-L#?^K&txJD!x0^g*52Yk z#RI)3nusORTeis6pht*tNj%~Wg%EpcU0}^b@Zi~>F}!JZZ{Edj%J^WsE&ckI zW*HY*(6i#X?QDMw3iJ|8?G3I+(DMJ z?GiVvU~Zro`&>Gw=`ueL_s&Xh*3xhnL>f~k2mL%nlZzPUC#lm#{fk!0Wy30j^Ocx} zgH&nk7oAg_Cm2L1A{(Sm=~5S6lV+4?cvOs7QTpREWFk^68-<{|i%O|Wac-L5lUy(x z?J_*>nPtvI5I-}1!9#rqwc0?8HS@A5c zlH0{wx$1zNNRN!j)k@fdgTYC6>778?h{_snDh(}b&B0nDJ4mB6y+x{TTmrn#P;3Tg z5F=tx?YV$13KhOV>KGOm__B6eqCYGUfB*y_009U<00Izz00bZa0SIh90aaGygt-1! zw7(_o3O!+g00bZa0SG_<0uX=z1Rwwb2teS86i6xRRxSFskQaMowZAX?AAlX>*_X$& z9aJhsyDVv!wd+r00g-74KmY;|fB*y_009U<00Izz00dSAQtDPY`WQgzQ2UeNrvT#n z|9E#v(!S9Q?dk6Gw2B1+5P$##AOHafKmY;|fB*y_(2~HBcucB}WRALYGk^@;!pF(% zvgfRlZ4}(h9$pxm7~AR4&+{|IlAaeU`V_b5W*(mH(5^Yh- zr|gOE|Kr_dN&B|D-2JQ8tL0j%Vnl`j1Rwwb2tWV=5P$##AOHafNYZ4iIwH4t?Yj2* zKYl1y-QH@V_1FKg12MX7UyHe{UH_{OBe~l3ze34vOSYK1y6b=3{|_A#0uX=z1Rwwb z2tWV=5P$##Ah4+gR9Tg}#P|QQwk**f76?E90uX=z1Rwwb2tWV=5P$##Hlcv3b|wAa z|7(kqc2oOPJFk65t5_fa0SG_<0uX=z1Rwwb2tWV=5ZFk8?eUnL+^Z;(^z-cRD?jeJ z^~>UN@{_v@OFy3a?e6D)oc(%b>&LxaF$(mYsw`f6{>I?^kzSQHhhoZ(t1GA5zklP) z8+Vp&b#7B==dQSN@p$pf=?hnW`01IyE-v4>uylL*`d7<0udXb;W5wlIGTD9H|NXyq zNz!g>m$ZMhf3<5HSwN%>0SG_<0uX=z1Rwwb2tWV=5P-l22(;1X0J0MIU(}fY5>x$` zxDule0Q~R&rJfBqGm?Y=1Rwwb2tWV=5P$##AOHafK;W?v5a0jf`v0-14rBxZ5P$## yAOHafKmY;|fB*y_upt8C_y4&5-w;|P3IPZ}00Izz00bZa0SG_<0uXp?1pWsb$d@Ak literal 0 HcmV?d00001 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7b8257a..5dfe3ed 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -28,8 +28,8 @@ jobs: # works without a Flower install. run: | python -m pip install --upgrade pip - pip install pytest "rocrate>=0.13" "tomli>=2.0; python_version < '3.11'" + pip install pytest pytest-cov "rocrate>=0.13" "tomli>=2.0; python_version < '3.11'" pip install -e . --no-deps - - name: Run tests - run: pytest -q + - name: Run tests with coverage + run: pytest -q --cov=flwrcrate --cov-report=term-missing --cov-fail-under=85 diff --git a/README.md b/README.md index 20b37c9..f4bd085 100644 --- a/README.md +++ b/README.md @@ -259,15 +259,17 @@ it produced. ## Development ```bash -pip install -e ".[dev]" # installs pytest -pytest # run the full unit + integration suite +pip install -e ".[dev]" # installs pytest + pytest-cov +pytest # run the full unit + integration suite +pytest --cov=flwrcrate --cov-report=term-missing # with a coverage report ``` The suite is split into fast **unit** tests (dependency parsing, metric handling, slug/person helpers, crate assembly) and **integration** tests that drive the whole `FLCrateTracker` lifecycle and assert a complete, correct `ro-crate-metadata.json` — without needing Flower, Ray, or any ML framework -installed. CI runs it on Python 3.10–3.12 (see the badge above). +installed. CI runs it on Python 3.10–3.12 (see the badge above) and enforces a +minimum coverage of 85% (currently ~92%). ## License diff --git a/pyproject.toml b/pyproject.toml index 92a4411..f2fd4ea 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,10 +16,13 @@ dependencies = [ ] [project.optional-dependencies] -dev = ["pytest>=7.0"] +dev = ["pytest>=7.0", "pytest-cov>=4.0"] [tool.hatch.build.targets.wheel] packages = ["flwrcrate"] [tool.pytest.ini_options] testpaths = ["tests"] + +[tool.coverage.run] +source = ["flwrcrate"] From 1a0cfda6436911ad366c384b5c29b2ffc34e3d81 Mon Sep 17 00:00:00 2001 From: Ali Date: Wed, 24 Jun 2026 12:33:39 +0100 Subject: [PATCH 2/2] Remove stray .coverage artifact; gitignore coverage/test outputs --- .coverage | Bin 53248 -> 0 bytes .gitignore | 6 ++++++ 2 files changed, 6 insertions(+) delete mode 100644 .coverage diff --git a/.coverage b/.coverage deleted file mode 100644 index af55b1689aecfd70d905ad619ab8d92d0ea8b4ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 zcmeI)OKclO7zglu*m0aV*+5j85UNa7P!i=~ERf1W2tprfq4Ysh#EI?N9w*z{yUFgl zNrbB6QmI^W5+#Z7emF`mghg)GNuOon~S*IZg+#KmY;|fWW2^s2)xw(tUmMnNyyT zD{;>;^4tlYyLP_6dt!1oo1A!i|85rSV?!N`ma#E5!5n*z&2Wbm%@Sv(RWS30XIfLt zo90pIipvXP&Z2!ZYl(p4etfZ}n+1yH@hM7T#xcu=v%pU9g;761cs7sEd%+G$gqu^A z2*HNJ=)=t6MecAb&)pywLuO&PWBAk49f@>ruY8XCWip&R{dG2!hIZ77vad)9n=e?k`j$O`pHY=HyUrft2J=3-rpXd3C#|!Hga8#g03*pt5 zhSEAF3Un-p8J??7rxtmgm|^fRa*;A;*%50kqBu20_Va92$~huGUMbIr%Apv+i9Nen z%w};tJ1p!2*UdV0Su1Ztbw=c(MuS)t%bcz7)yf}bwV0!RF)VwOi9%2dc%ic`{c5i) zQLE(h?re$PI_XBmv;A$IDqqjiQ|jzf?TPfjfP8M&ZzzIC&zYXPx{_>YG^@LtG#zog zdAkw4q_L5RUQ{YEyXbcr5t{{-L#?^K&txJD!x0^g*52Yk z#RI)3nusORTeis6pht*tNj%~Wg%EpcU0}^b@Zi~>F}!JZZ{Edj%J^WsE&ckI zW*HY*(6i#X?QDMw3iJ|8?G3I+(DMJ z?GiVvU~Zro`&>Gw=`ueL_s&Xh*3xhnL>f~k2mL%nlZzPUC#lm#{fk!0Wy30j^Ocx} zgH&nk7oAg_Cm2L1A{(Sm=~5S6lV+4?cvOs7QTpREWFk^68-<{|i%O|Wac-L5lUy(x z?J_*>nPtvI5I-}1!9#rqwc0?8HS@A5c zlH0{wx$1zNNRN!j)k@fdgTYC6>778?h{_snDh(}b&B0nDJ4mB6y+x{TTmrn#P;3Tg z5F=tx?YV$13KhOV>KGOm__B6eqCYGUfB*y_009U<00Izz00bZa0SIh90aaGygt-1! zw7(_o3O!+g00bZa0SG_<0uX=z1Rwwb2teS86i6xRRxSFskQaMowZAX?AAlX>*_X$& z9aJhsyDVv!wd+r00g-74KmY;|fB*y_009U<00Izz00dSAQtDPY`WQgzQ2UeNrvT#n z|9E#v(!S9Q?dk6Gw2B1+5P$##AOHafKmY;|fB*y_(2~HBcucB}WRALYGk^@;!pF(% zvgfRlZ4}(h9$pxm7~AR4&+{|IlAaeU`V_b5W*(mH(5^Yh- zr|gOE|Kr_dN&B|D-2JQ8tL0j%Vnl`j1Rwwb2tWV=5P$##AOHafNYZ4iIwH4t?Yj2* zKYl1y-QH@V_1FKg12MX7UyHe{UH_{OBe~l3ze34vOSYK1y6b=3{|_A#0uX=z1Rwwb z2tWV=5P$##Ah4+gR9Tg}#P|QQwk**f76?E90uX=z1Rwwb2tWV=5P$##Hlcv3b|wAa z|7(kqc2oOPJFk65t5_fa0SG_<0uX=z1Rwwb2tWV=5ZFk8?eUnL+^Z;(^z-cRD?jeJ z^~>UN@{_v@OFy3a?e6D)oc(%b>&LxaF$(mYsw`f6{>I?^kzSQHhhoZ(t1GA5zklP) z8+Vp&b#7B==dQSN@p$pf=?hnW`01IyE-v4>uylL*`d7<0udXb;W5wlIGTD9H|NXyq zNz!g>m$ZMhf3<5HSwN%>0SG_<0uX=z1Rwwb2tWV=5P-l22(;1X0J0MIU(}fY5>x$` zxDule0Q~R&rJfBqGm?Y=1Rwwb2tWV=5P$##AOHafK;W?v5a0jf`v0-14rBxZ5P$## yAOHafKmY;|fB*y_upt8C_y4&5-w;|P3IPZ}00Izz00bZa0SG_<0uXp?1pWsb$d@Ak diff --git a/.gitignore b/.gitignore index 069a5b7..3d22253 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,11 @@ dist/ fl_crate_out/ *.tmp +# Test / coverage artifacts +.coverage +.coverage.* +.pytest_cache/ +htmlcov/ + # macOS .DS_Store