from __future__ import annotations import json from pathlib import Path import sys import tempfile import unittest META_ROOT = Path(__file__).resolve().parents[1] RELEASE_ROOT = META_ROOT / "tools" / "release" if str(RELEASE_ROOT) not in sys.path: sys.path.insert(0, str(RELEASE_ROOT)) from govoplan_release.version_metadata import ( # noqa: E402 VersionMetadataError, apply_version_metadata_mutations, version_metadata_mutations, ) class ReleaseVersionMetadataTests(unittest.TestCase): def test_updates_shared_module_version_without_rewriting_independent_interfaces(self) -> None: with tempfile.TemporaryDirectory() as temp_dir: root = Path(temp_dir) backend = root / "src" / "govoplan_example" / "backend" backend.mkdir(parents=True) manifest = backend / "manifest.py" manifest.write_text( 'MODULE_VERSION: str = "1.2.3"\n' 'manifest = ModuleManifest(id="example", version=MODULE_VERSION,\n' ' provides_interfaces=(ModuleInterfaceProvider(name="api", version="2.0"),))\n', encoding="utf-8", ) changed = apply_version_metadata_mutations(root, target_version="1.2.4") self.assertEqual(("src/govoplan_example/backend/manifest.py",), changed) self.assertIn('MODULE_VERSION: str = "1.2.4"', manifest.read_text()) self.assertIn('version="2.0"', manifest.read_text()) self.assertEqual((), version_metadata_mutations(root, target_version="1.2.4")) def test_dynamic_module_version_fails_before_any_metadata_is_written(self) -> None: with tempfile.TemporaryDirectory() as temp_dir: root = Path(temp_dir) backend = root / "src" / "govoplan_example" / "backend" backend.mkdir(parents=True) project = root / "pyproject.toml" project.write_text('[project]\nname="govoplan-example"\nversion="1.2.3"\n') before = project.read_bytes() (backend / "manifest.py").write_text( 'MODULE_VERSION = compute_version()\n' 'manifest = ModuleManifest(id="example", version=MODULE_VERSION)\n', ) with self.assertRaisesRegex(VersionMetadataError, "no literal MODULE_VERSION"): apply_version_metadata_mutations(root, target_version="1.2.4") self.assertEqual(before, project.read_bytes()) def test_updates_recognized_metadata_without_changing_interface_versions( self, ) -> None: with tempfile.TemporaryDirectory() as temp_dir: root = Path(temp_dir) package = root / "src" / "govoplan_example" backend = package / "backend" webui = root / "webui" backend.mkdir(parents=True) webui.mkdir() (root / "pyproject.toml").write_text( '[project]\nname = "govoplan-example"\nversion = "1.2.3"\n', encoding="utf-8", ) (root / "package.json").write_text( '{"name":"root","version":"1.2.3"}\n', encoding="utf-8", ) (webui / "package.json").write_text( '{"name":"@govoplan/example-webui","version":"1.2.3"}\n', encoding="utf-8", ) (webui / "package-lock.json").write_text( json.dumps( { "name": "@govoplan/example-webui", "version": "1.2.3", "packages": { "": { "name": "@govoplan/example-webui", "version": "1.2.3", } }, } ) + "\n", encoding="utf-8", ) (backend / "manifest.py").write_text( "def get_manifest():\n" " return ModuleManifest(\n" ' id="example",\n' ' version="1.2.3",\n' " provides_interfaces=(\n" ' ModuleInterfaceProvider(name="example.api", version="4.0"),\n' " ),\n" " )\n", encoding="utf-8", ) (package / "__init__.py").write_text( '__version__ = "1.2.3"\n', encoding="utf-8", ) preview = version_metadata_mutations( root, target_version="1.2.4", ) changed = apply_version_metadata_mutations( root, target_version="1.2.4", ) self.assertEqual( {mutation.path for mutation in preview}, set(changed), ) self.assertEqual( "1.2.4", json.loads((webui / "package-lock.json").read_text())[ "packages" ][""]["version"], ) manifest = (backend / "manifest.py").read_text(encoding="utf-8") self.assertIn('version="1.2.4"', manifest) self.assertIn('version="4.0"', manifest) self.assertEqual( '__version__ = "1.2.4"\n', (package / "__init__.py").read_text(encoding="utf-8"), ) if __name__ == "__main__": unittest.main()