From 06972e243c79a4f83bf68c734ce55868df0eadef Mon Sep 17 00:00:00 2001 From: Lasse Borgholt Date: Tue, 23 Jun 2026 10:06:48 +0200 Subject: [PATCH 1/5] Fix coverage double-counting between src/ and installed package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI installs the package non-editably (to compile the C++ extension), so imports resolve to site-packages while --cov=src separately measured the untouched src/ tree at 0% — doubling the denominator and roughly halving reported coverage (~93% -> ~50%). Measure a single source (--cov=error_align) and add [tool.coverage.paths] to merge the src/ and site-packages copies into one logical path. Co-Authored-By: Claude Opus 4.8 (1M context) --- pyproject.toml | 10 ++++++++++ pytest.ini | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5193622..1dc4236 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -100,3 +100,13 @@ build-dir = "build/{wheel_tag}" [tool.scikit-build.sdist] include = ["cpp/*", "CMakeLists.txt", "error_align/*", "README.md", "pyproject.toml"] + +# Map the editable source tree and the installed (non-editable) copy to the same +# logical paths so coverage merges them instead of double-counting. CI installs the +# package into site-packages (to compile the C++ extension), so without this the +# untouched src/ tree would otherwise be reported separately at 0%. +[tool.coverage.paths] +source = ["src/error_align", "*/site-packages/error_align"] + +[tool.coverage.run] +source = ["error_align"] diff --git a/pytest.ini b/pytest.ini index 0bfcf15..04e8685 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,2 +1,2 @@ [pytest] -addopts = --cov=src --cov-report=term --cov-report=xml --typeguard-packages error_align \ No newline at end of file +addopts = --cov=error_align --cov-report=term --cov-report=xml --typeguard-packages error_align From 0e56ca12f46b767d9c078dc9bfc2a610bc3ba564 Mon Sep 17 00:00:00 2001 From: Lasse Borgholt Date: Tue, 23 Jun 2026 10:14:46 +0200 Subject: [PATCH 2/5] Omit research baselines from coverage measurement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The baselines/ modules (POWER, etc.) are optional and largely untested. They only started counting toward coverage when rapidfuzz became a core dependency (#21), since that made error_align.baselines importable in CI — dropping reported coverage from ~93% to ~50%. The codecov.yml ignore glob ("src/error_align/baselines/*") never matched their installed path ("error_align/baselines/..."), so they slipped through. Omit them at the coverage layer (source-independent) and fix the codecov ignore glob to match any baselines path. Co-Authored-By: Claude Opus 4.8 (1M context) --- codecov.yml | 2 +- pyproject.toml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/codecov.yml b/codecov.yml index cf50f45..0751d5c 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,5 +1,5 @@ ignore: - - "src/error_align/baselines/*" + - "**/baselines/**" coverage: status: diff --git a/pyproject.toml b/pyproject.toml index 1dc4236..7d7f31c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -110,3 +110,7 @@ source = ["src/error_align", "*/site-packages/error_align"] [tool.coverage.run] source = ["error_align"] +# Exclude the research baselines (POWER, etc.): they are optional, largely +# untested, and only became measurable once rapidfuzz became a core dependency. +# The codecov.yml ignore glob does not match their installed path, so omit here. +omit = ["*/baselines/*"] From 78075c94b521b7f174aaf0232eb0d1b0e230ec65 Mon Sep 17 00:00:00 2001 From: Lasse Borgholt Date: Tue, 23 Jun 2026 10:26:52 +0200 Subject: [PATCH 3/5] Consolidate coverage config in .coveragerc (address Copilot review) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit .coveragerc takes precedence over pyproject.toml, so the [tool.coverage.*] config added earlier was silently ignored — two configs that could diverge. Remove it and keep .coveragerc as the single source of truth. Also fix its omit glob: src/error_align/baselines/* only matched the editable layout, so in CI (site-packages) baselines were not omitted by coverage.py and were excluded only by the codecov ignore. Use */baselines/* to match both. Co-Authored-By: Claude Opus 4.8 (1M context) --- .coveragerc | 5 ++++- pyproject.toml | 16 +++------------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/.coveragerc b/.coveragerc index 3f6a94f..51fea79 100644 --- a/.coveragerc +++ b/.coveragerc @@ -3,4 +3,7 @@ branch = True source = error_align [report] -omit = src/error_align/baselines/* \ No newline at end of file +# Match both the editable (src/error_align/...) and installed +# (.../site-packages/error_align/...) layouts so baselines are omitted in +# both local and CI runs. +omit = */baselines/* diff --git a/pyproject.toml b/pyproject.toml index 7d7f31c..4afaa80 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,16 +101,6 @@ build-dir = "build/{wheel_tag}" [tool.scikit-build.sdist] include = ["cpp/*", "CMakeLists.txt", "error_align/*", "README.md", "pyproject.toml"] -# Map the editable source tree and the installed (non-editable) copy to the same -# logical paths so coverage merges them instead of double-counting. CI installs the -# package into site-packages (to compile the C++ extension), so without this the -# untouched src/ tree would otherwise be reported separately at 0%. -[tool.coverage.paths] -source = ["src/error_align", "*/site-packages/error_align"] - -[tool.coverage.run] -source = ["error_align"] -# Exclude the research baselines (POWER, etc.): they are optional, largely -# untested, and only became measurable once rapidfuzz became a core dependency. -# The codecov.yml ignore glob does not match their installed path, so omit here. -omit = ["*/baselines/*"] +# NOTE: Coverage.py configuration lives in .coveragerc (which takes precedence +# over pyproject.toml). Keep it there as the single source of truth rather than +# splitting/duplicating coverage settings across two files. From e5a2bb48219d6bbe0047523b1746f0d17b87065d Mon Sep 17 00:00:00 2001 From: Lasse Borgholt Date: Tue, 23 Jun 2026 10:34:29 +0200 Subject: [PATCH 4/5] Update citation to ICASSP 2026 publication Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4161cb3..4f5a42c 100644 --- a/README.md +++ b/README.md @@ -60,11 +60,13 @@ Alignment(INSERT: "period") ## Citation and Research ``` -@article{borgholt2025text, - title={A Text-To-Text Alignment Algorithm for Better Evaluation of Modern Speech Recognition Systems}, +@inproceedings{borgholt2026text, + title={A text-to-text alignment algorithm for better evaluation of modern speech recognition systems}, author={Borgholt, Lasse and Havtorn, Jakob and Igel, Christian and Maal{\o}e, Lars and Tan, Zheng-Hua}, - journal={arXiv preprint arXiv:2509.24478}, - year={2025} + booktitle={ICASSP 2026-2026 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)}, + pages={3476--3480}, + year={2026}, + organization={IEEE} } ``` From 59d5334eac45a6fcd1ce13026a97b85a4ed108fe Mon Sep 17 00:00:00 2001 From: Lasse Borgholt Date: Tue, 23 Jun 2026 10:35:53 +0200 Subject: [PATCH 5/5] Restore title casing in citation title Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f5a42c..1c460a6 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Alignment(INSERT: "period") ``` @inproceedings{borgholt2026text, - title={A text-to-text alignment algorithm for better evaluation of modern speech recognition systems}, + title={A Text-To-Text Alignment Algorithm for Better Evaluation of Modern Speech Recognition Systems}, author={Borgholt, Lasse and Havtorn, Jakob and Igel, Christian and Maal{\o}e, Lars and Tan, Zheng-Hua}, booktitle={ICASSP 2026-2026 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)}, pages={3476--3480},