Files
devx/tests/unit/test_check_doc_versions.py
T
emilandDevin <158243242+devin-ai-integration[bot]@users.noreply.github.com> bbf0c81c32
Post-merge / detect-type (push) Successful in 11s
Post-merge / validate-commit-msg (push) Successful in 13s
Post-merge / vikunja (push) Successful in 19s
Post-merge / configure-repo (push) Successful in 15s
Post-merge / release (push) Successful in 45s
Post-merge / sync-wiki (push) Successful in 50s
Post-merge / publish (push) Successful in 32s
Post-merge / badges (push) Failing after 36s
DEVX-118: feat: enhance documentation-as-code with badges, version refs, Vale
- Fix badge system: clean .badges dir from orphan branch, add version
  verification, make badges job depend on release (avoids stale version
  badge race condition)
- Add check_doc_versions.py: lint tool that verifies docs version
  references match current __version__, with --fix for auto-update
- Integrate check_doc_versions into release process (auto-updates docs
  on every release commit)
- Add Vale prose linter integration: .vale.ini, custom styles for
  terminology and code block language, CI step, make target
- Fix stale version references in docs (0.27.0 → 0.33.4)
- Fix e.g. → for example in docs (Google.Latin Vale rule)
- Add CI steps for check_doc_versions and Vale to quality workflow
- Add make targets: devx-check-doc-versions, devx-vale

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-07-06 10:03:47 +02:00

256 lines
9.5 KiB
Python

"""Tests for devx.tools.check_doc_versions."""
from __future__ import annotations
from pathlib import Path
from click.testing import CliRunner
import devx.tools.check_doc_versions as cdv
class TestDetectPackageName:
def test_finds_package(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "myproj"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "1.0.0"\n')
assert cdv.detect_package_name(tmp_path) == "myproj"
def test_no_src_dir(self, tmp_path: Path) -> None:
assert cdv.detect_package_name(tmp_path) is None
def test_no_init_py(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "myproj"
src.mkdir(parents=True)
assert cdv.detect_package_name(tmp_path) is None
class TestReadVersion:
def test_reads_version(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "myproj"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "2.3.4"\n')
assert cdv.read_version(tmp_path, "myproj") == "2.3.4"
def test_no_version(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "myproj"
src.mkdir(parents=True)
(src / "__init__.py").write_text("# no version here\n")
assert cdv.read_version(tmp_path, "myproj") is None
def test_no_init_file(self, tmp_path: Path) -> None:
assert cdv.read_version(tmp_path, "nonexistent") is None
class TestFindVersionRefs:
def test_finds_gte_ref(self) -> None:
content = ' "devx>=0.27.0",\n'
refs = cdv.find_version_refs(content, "devx")
assert len(refs) == 1
_, full, op, ver, _ = refs[0]
assert op == ">="
assert ver == "0.27.0"
def test_finds_eq_ref(self) -> None:
content = '"devx==0.33.4"'
refs = cdv.find_version_refs(content, "devx")
assert len(refs) == 1
_, _, op, ver, _ = refs[0]
assert op == "=="
assert ver == "0.33.4"
def test_finds_extras_ref(self) -> None:
content = '"devx[dev]>=0.27.0"'
refs = cdv.find_version_refs(content, "devx")
assert len(refs) == 1
_, _, op, ver, _ = refs[0]
assert op == ">="
assert ver == "0.27.0"
def test_finds_upper_bound(self) -> None:
content = '"devx>=0.27.0,<0.28"'
refs = cdv.find_version_refs(content, "devx")
assert len(refs) == 1
_, _, _, _, rest = refs[0]
assert "<0.28" in rest
def test_ignores_other_packages(self) -> None:
content = '"other-pkg>=1.0.0"'
refs = cdv.find_version_refs(content, "devx")
assert len(refs) == 0
def test_multiple_refs(self) -> None:
content = '"devx>=0.27.0"\n"devx==0.33.4"\n'
refs = cdv.find_version_refs(content, "devx")
assert len(refs) == 2
class TestFixVersionRefs:
def test_fixes_stale_version(self) -> None:
content = '"devx>=0.27.0"'
new, fixes = cdv.fix_version_refs(content, "devx", "0.33.4")
assert fixes == 1
assert "0.33.4" in new
assert "0.27.0" not in new
def test_no_fix_needed(self) -> None:
content = '"devx>=0.33.4"'
new, fixes = cdv.fix_version_refs(content, "devx", "0.33.4")
assert fixes == 0
assert new == content
def test_fixes_upper_bound(self) -> None:
content = '"devx>=0.27.0,<0.28"'
new, fixes = cdv.fix_version_refs(content, "devx", "0.33.4")
assert fixes == 1
assert "0.33.4" in new
assert "<0.34" in new
assert "<0.28" not in new
def test_ignores_other_packages(self) -> None:
content = '"other>=1.0.0"'
new, fixes = cdv.fix_version_refs(content, "devx", "0.33.4")
assert fixes == 0
assert new == content
class TestMain:
def test_pass_when_current(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "0.33.4"\n')
readme = tmp_path / "README.md"
readme.write_text('"devx>=0.33.4"\n')
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path)])
assert result.exit_code == 0
assert "PASS" in result.output
def test_fail_when_stale(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "0.33.4"\n')
readme = tmp_path / "README.md"
readme.write_text('"devx>=0.27.0"\n')
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path)])
assert result.exit_code == 1
assert "stale" in result.output
def test_fix_updates_files(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "0.33.4"\n')
readme = tmp_path / "README.md"
readme.write_text('"devx>=0.27.0"\n')
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path), "--fix"])
assert result.exit_code == 0
assert "0.33.4" in readme.read_text()
def test_no_package_skips(self, tmp_path: Path) -> None:
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path)])
assert result.exit_code == 0
assert "skipping" in result.output
def test_no_version_skips(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text("# no version\n")
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path)])
assert result.exit_code == 0
assert "Cannot read" in result.output
def test_docs_only_skips_readme(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "0.33.4"\n')
readme = tmp_path / "README.md"
readme.write_text('"devx>=0.27.0"\n')
docs = tmp_path / "docs"
docs.mkdir()
(docs / "index.md").write_text('"devx>=0.33.4"\n')
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path), "--docs-only"])
assert result.exit_code == 0
assert "PASS" in result.output
def test_fix_no_stale(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "0.33.4"\n')
readme = tmp_path / "README.md"
readme.write_text('"devx>=0.33.4"\n')
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path), "--fix"])
assert result.exit_code == 0
assert "No stale" in result.output
def test_checks_docs_dir(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "0.33.4"\n')
docs = tmp_path / "docs"
docs.mkdir()
(docs / "index.md").write_text('"devx>=0.27.0"\n')
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path)])
assert result.exit_code == 1
assert "docs/index.md" in result.output
def test_detect_package_with_non_dir_entry(self, tmp_path: Path) -> None:
src = tmp_path / "src"
src.mkdir(parents=True)
# `aaa_file.py` sorts before `devx/` so the non-dir branch is hit
(src / "aaa_file.py").touch()
pkg_dir = src / "devx"
pkg_dir.mkdir()
(pkg_dir / "__init__.py").write_text('__version__ = "1.0.0"\n')
assert cdv.detect_package_name(tmp_path) == "devx"
def test_read_version_auto_detect(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "3.2.1"\n')
assert cdv.read_version(tmp_path) == "3.2.1"
def test_read_version_no_package(self, tmp_path: Path) -> None:
assert cdv.read_version(tmp_path) is None
def test_main_with_file_without_refs(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "0.33.4"\n')
docs = tmp_path / "docs"
docs.mkdir()
(docs / "index.md").write_text("# No version refs here\n")
(docs / "other.md").write_text('"devx>=0.27.0"\n')
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path)])
assert result.exit_code == 1
assert "other.md" in result.output
def test_fix_with_file_without_refs(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "0.33.4"\n')
readme = tmp_path / "README.md"
readme.write_text("# No refs\n")
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path), "--fix"])
assert result.exit_code == 0
assert "No stale" in result.output
def test_fix_with_current_refs(self, tmp_path: Path) -> None:
src = tmp_path / "src" / "devx"
src.mkdir(parents=True)
(src / "__init__.py").write_text('__version__ = "0.33.4"\n')
readme = tmp_path / "README.md"
readme.write_text('"devx>=0.33.4"\n')
runner = CliRunner()
result = runner.invoke(cdv.main, ["--root", str(tmp_path), "--fix"])
assert result.exit_code == 0
assert "No stale" in result.output