Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions language_tool_python/download_lt.py
Original file line number Diff line number Diff line change
Expand Up @@ -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/",
Expand Down Expand Up @@ -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

Expand All @@ -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 = (
Expand All @@ -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)


Expand Down
3 changes: 2 additions & 1 deletion language_tool_python/integrity.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,5 @@
"6.4"="d5d517335d1ca33f33412920447fa0c742ef78d645521d650e0e22628fe0d3bd"
"6.5"="27f3ae5a29efbc8267a5a266908dfec205d16d312af8516e0b5bcec871edea0b"
"6.6"="53600506b399bb5ffe1e4c8dec794fd378212f14aaf38ccef9b6f89314d11631"
"6.7"="53600506b399bb5ffe1e4c8dec794fd378212f14aaf38ccef9b6f89314d11631"
"6.7"="110e0d6e1bbdb0d929247fc608b536fc32e70d05e7495ed3810742454e6fee35"
"6.8"="6a7f6b67b779ae9505f7579f0c41453ea8d1bd72ae750bdc2c55ba974281467d"
84 changes: 84 additions & 0 deletions tests/test_download.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down