diff --git a/language_tool_python/download_lt.py b/language_tool_python/download_lt.py index 8252412..2f78144 100755 --- a/language_tool_python/download_lt.py +++ b/language_tool_python/download_lt.py @@ -43,6 +43,10 @@ "https://internal1.languagetool.org/snapshots/", ) FILENAME_SNAPSHOT = "LanguageTool-{version}-snapshot.zip" +BASE_URL_NEW_RELEASES = os.environ.get( + "LTP_DOWNLOAD_HOST_NEW_RELEASES", + "https://github.com/jxmorris12/language_tool_python/releases/download/LanguageTool-{version}/", +) BASE_URL_RELEASE = os.environ.get( "LTP_DOWNLOAD_HOST_RELEASE", "https://languagetool.org/download/", @@ -806,7 +810,8 @@ def download_url(self) -> str: Get the download URL for this release version. URLs are constructed based on version: - - Versions >= 6.0 are downloaded from the main release page + - Versions >= 6.7 are downloaded from the new release page + - Versions 6.0 - 6.6 are downloaded from the main release page - Versions 4.0 - 5.9 are downloaded from the archive - Versions < 4.0 are not supported @@ -815,9 +820,13 @@ def download_url(self) -> str: :raises PathError: If the version is below 4.0 (unsupported). """ version_num = Version(self._version_name) + filename = FILENAME_RELEASE.format(version=self._version_name) + # Versions >= 6.7 from new release page + if version_num >= Version("6.7"): + base_url = BASE_URL_NEW_RELEASES.format(version=self._version_name) + return urljoin(base_url, filename) # Versions >= 6.0 from main download page if version_num >= Version("6.0"): - filename = FILENAME_RELEASE.format(version=self._version_name) return urljoin(BASE_URL_RELEASE, filename) if version_num < Version("4.0"): err = ( @@ -826,7 +835,6 @@ def download_url(self) -> str: ) raise PathError(err) # Versions < 6.0 from archive - filename = FILENAME_RELEASE.format(version=self._version_name) return urljoin(BASE_URL_ARCHIVE, filename) diff --git a/language_tool_python/integrity.toml b/language_tool_python/integrity.toml index 845b6de..b9544a9 100644 --- a/language_tool_python/integrity.toml +++ b/language_tool_python/integrity.toml @@ -31,4 +31,5 @@ "6.4"="d5d517335d1ca33f33412920447fa0c742ef78d645521d650e0e22628fe0d3bd" "6.5"="27f3ae5a29efbc8267a5a266908dfec205d16d312af8516e0b5bcec871edea0b" "6.6"="53600506b399bb5ffe1e4c8dec794fd378212f14aaf38ccef9b6f89314d11631" -"6.7"="53600506b399bb5ffe1e4c8dec794fd378212f14aaf38ccef9b6f89314d11631" +"6.7"="110e0d6e1bbdb0d929247fc608b536fc32e70d05e7495ed3810742454e6fee35" +"6.8"="6a7f6b67b779ae9505f7579f0c41453ea8d1bd72ae750bdc2c55ba974281467d" diff --git a/tests/test_download.py b/tests/test_download.py index a21c7e9..ed6beae 100644 --- a/tests/test_download.py +++ b/tests/test_download.py @@ -264,6 +264,90 @@ def test_http_get_rejects_invalid_content_length( LocalLanguageTool.from_version_name()._get_remote_zip(io.BytesIO()) +@pytest.mark.parametrize("release_version", ["6.7", "6.8"]) # type: ignore[untyped-decorator] +def test_release_download_url_uses_new_release_base_from_6_7( + release_version: str, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """ + Test that releases 6.7 and newer include the version in the base URL. + """ + monkeypatch.setattr( + download_lt, + "BASE_URL_NEW_RELEASES", + "https://example.test/releases/LanguageTool-{version}/", + ) + + local_language_tool = LocalLanguageTool.from_version_name(release_version) + + expected_url = ( + f"https://example.test/releases/LanguageTool-{release_version}/" + f"LanguageTool-{release_version}.zip" + ) + + assert local_language_tool.download_url == expected_url + + +def test_release_download_url_keeps_main_release_base_for_6_6( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """ + Test that release 6.6 keeps using the versioned filename. + """ + monkeypatch.setattr( + download_lt, + "BASE_URL_RELEASE", + "https://example.test/download/", + ) + + local_language_tool = LocalLanguageTool.from_version_name("6.6") + + assert ( + local_language_tool.download_url + == "https://example.test/download/LanguageTool-6.6.zip" + ) + + +def test_release_download_url_keeps_main_release_base_before_6_7( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """ + Test that earlier 6.x releases keep using the versioned filename. + """ + monkeypatch.setattr( + download_lt, + "BASE_URL_RELEASE", + "https://example.test/download/", + ) + + local_language_tool = LocalLanguageTool.from_version_name("6.5") + + assert ( + local_language_tool.download_url + == "https://example.test/download/LanguageTool-6.5.zip" + ) + + +def test_release_download_url_keeps_archive_base_before_6_0( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """ + Test that older supported releases keep using the archive base URL. + """ + monkeypatch.setattr( + download_lt, + "BASE_URL_ARCHIVE", + "https://example.test/archive/", + ) + + local_language_tool = LocalLanguageTool.from_version_name("5.9") + + assert ( + local_language_tool.download_url + == "https://example.test/archive/LanguageTool-5.9.zip" + ) + + def test_http_get_verifies_configured_sha256( monkeypatch: pytest.MonkeyPatch, ) -> None: