Skip to content

Commit 5a70ccc

Browse files
authored
feat(download_it): add the possibility to download missing versions (jxmorris12#166)
1 parent 6d15762 commit 5a70ccc

3 files changed

Lines changed: 97 additions & 4 deletions

File tree

language_tool_python/download_lt.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
"https://internal1.languagetool.org/snapshots/",
4444
)
4545
FILENAME_SNAPSHOT = "LanguageTool-{version}-snapshot.zip"
46+
BASE_URL_NEW_RELEASES = os.environ.get(
47+
"LTP_DOWNLOAD_HOST_NEW_RELEASES",
48+
"https://github.com/jxmorris12/language_tool_python/releases/download/LanguageTool-{version}/",
49+
)
4650
BASE_URL_RELEASE = os.environ.get(
4751
"LTP_DOWNLOAD_HOST_RELEASE",
4852
"https://languagetool.org/download/",
@@ -806,7 +810,8 @@ def download_url(self) -> str:
806810
Get the download URL for this release version.
807811
808812
URLs are constructed based on version:
809-
- Versions >= 6.0 are downloaded from the main release page
813+
- Versions >= 6.7 are downloaded from the new release page
814+
- Versions 6.0 - 6.6 are downloaded from the main release page
810815
- Versions 4.0 - 5.9 are downloaded from the archive
811816
- Versions < 4.0 are not supported
812817
@@ -815,9 +820,13 @@ def download_url(self) -> str:
815820
:raises PathError: If the version is below 4.0 (unsupported).
816821
"""
817822
version_num = Version(self._version_name)
823+
filename = FILENAME_RELEASE.format(version=self._version_name)
824+
# Versions >= 6.7 from new release page
825+
if version_num >= Version("6.7"):
826+
base_url = BASE_URL_NEW_RELEASES.format(version=self._version_name)
827+
return urljoin(base_url, filename)
818828
# Versions >= 6.0 from main download page
819829
if version_num >= Version("6.0"):
820-
filename = FILENAME_RELEASE.format(version=self._version_name)
821830
return urljoin(BASE_URL_RELEASE, filename)
822831
if version_num < Version("4.0"):
823832
err = (
@@ -826,7 +835,6 @@ def download_url(self) -> str:
826835
)
827836
raise PathError(err)
828837
# Versions < 6.0 from archive
829-
filename = FILENAME_RELEASE.format(version=self._version_name)
830838
return urljoin(BASE_URL_ARCHIVE, filename)
831839

832840

language_tool_python/integrity.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@
3131
"6.4"="d5d517335d1ca33f33412920447fa0c742ef78d645521d650e0e22628fe0d3bd"
3232
"6.5"="27f3ae5a29efbc8267a5a266908dfec205d16d312af8516e0b5bcec871edea0b"
3333
"6.6"="53600506b399bb5ffe1e4c8dec794fd378212f14aaf38ccef9b6f89314d11631"
34-
"6.7"="53600506b399bb5ffe1e4c8dec794fd378212f14aaf38ccef9b6f89314d11631"
34+
"6.7"="110e0d6e1bbdb0d929247fc608b536fc32e70d05e7495ed3810742454e6fee35"
35+
"6.8"="6a7f6b67b779ae9505f7579f0c41453ea8d1bd72ae750bdc2c55ba974281467d"

tests/test_download.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,90 @@ def test_http_get_rejects_invalid_content_length(
264264
LocalLanguageTool.from_version_name()._get_remote_zip(io.BytesIO())
265265

266266

267+
@pytest.mark.parametrize("release_version", ["6.7", "6.8"]) # type: ignore[untyped-decorator]
268+
def test_release_download_url_uses_new_release_base_from_6_7(
269+
release_version: str,
270+
monkeypatch: pytest.MonkeyPatch,
271+
) -> None:
272+
"""
273+
Test that releases 6.7 and newer include the version in the base URL.
274+
"""
275+
monkeypatch.setattr(
276+
download_lt,
277+
"BASE_URL_NEW_RELEASES",
278+
"https://example.test/releases/LanguageTool-{version}/",
279+
)
280+
281+
local_language_tool = LocalLanguageTool.from_version_name(release_version)
282+
283+
expected_url = (
284+
f"https://example.test/releases/LanguageTool-{release_version}/"
285+
f"LanguageTool-{release_version}.zip"
286+
)
287+
288+
assert local_language_tool.download_url == expected_url
289+
290+
291+
def test_release_download_url_keeps_main_release_base_for_6_6(
292+
monkeypatch: pytest.MonkeyPatch,
293+
) -> None:
294+
"""
295+
Test that release 6.6 keeps using the versioned filename.
296+
"""
297+
monkeypatch.setattr(
298+
download_lt,
299+
"BASE_URL_RELEASE",
300+
"https://example.test/download/",
301+
)
302+
303+
local_language_tool = LocalLanguageTool.from_version_name("6.6")
304+
305+
assert (
306+
local_language_tool.download_url
307+
== "https://example.test/download/LanguageTool-6.6.zip"
308+
)
309+
310+
311+
def test_release_download_url_keeps_main_release_base_before_6_7(
312+
monkeypatch: pytest.MonkeyPatch,
313+
) -> None:
314+
"""
315+
Test that earlier 6.x releases keep using the versioned filename.
316+
"""
317+
monkeypatch.setattr(
318+
download_lt,
319+
"BASE_URL_RELEASE",
320+
"https://example.test/download/",
321+
)
322+
323+
local_language_tool = LocalLanguageTool.from_version_name("6.5")
324+
325+
assert (
326+
local_language_tool.download_url
327+
== "https://example.test/download/LanguageTool-6.5.zip"
328+
)
329+
330+
331+
def test_release_download_url_keeps_archive_base_before_6_0(
332+
monkeypatch: pytest.MonkeyPatch,
333+
) -> None:
334+
"""
335+
Test that older supported releases keep using the archive base URL.
336+
"""
337+
monkeypatch.setattr(
338+
download_lt,
339+
"BASE_URL_ARCHIVE",
340+
"https://example.test/archive/",
341+
)
342+
343+
local_language_tool = LocalLanguageTool.from_version_name("5.9")
344+
345+
assert (
346+
local_language_tool.download_url
347+
== "https://example.test/archive/LanguageTool-5.9.zip"
348+
)
349+
350+
267351
def test_http_get_verifies_configured_sha256(
268352
monkeypatch: pytest.MonkeyPatch,
269353
) -> None:

0 commit comments

Comments
 (0)