Skip to content

Commit 55bf70d

Browse files
authored
fix(download_lt): set default version to latest release (jxmorris12#167)
1 parent 5a70ccc commit 55bf70d

4 files changed

Lines changed: 85 additions & 27 deletions

File tree

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ It can:
1616
- call your own remote LanguageTool server,
1717
- be used from Python code and from a CLI.
1818

19-
Default local download target: `latest` snapshot (currently `6.9-SNAPSHOT`).
19+
Default local download target: LanguageTool `6.8`.
2020

2121
## Documentation
2222

@@ -90,9 +90,9 @@ with language_tool_python.LanguageTool(
9090
```
9191

9292
Accepted formats:
93-
- `latest` (default): latest snapshot configured by this package (`6.9-SNAPSHOT` at the moment)
93+
- `latest`: latest snapshot available from the snapshot server
9494
- `YYYYMMDD`: snapshot by date (example: `20260201`)
95-
- `X.Y`: release version (example: `6.7`, `4.0`)
95+
- `X.Y`: release version (default: `6.8`. Examples: `6.7`, `4.0`)
9696

9797
Notes:
9898
- Only relevant when using a local server (no `remote_server`).
@@ -341,8 +341,8 @@ Example:
341341

342342
```bash
343343
export LTP_PATH=/path/to/cache
344-
export LTP_JAR_DIR_PATH=/path/to/LanguageTool-6.9-SNAPSHOT
345-
export LTP_DOWNLOAD_SHA256_6_9_SNAPSHOT=<sha256>
344+
export LTP_JAR_DIR_PATH=/path/to/LanguageTool-6.8
345+
export LTP_DOWNLOAD_SHA256_6_8=<sha256>
346346
# export LTP_BYPASS_VERIFIED_DOWNLOADS=true
347347
```
348348

language_tool_python/download_lt.py

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@
5757
)
5858
FILENAME_RELEASE = "LanguageTool-{version}.zip"
5959

60-
LTP_DOWNLOAD_VERSION = "latest"
61-
LT_SNAPSHOT_CURRENT_VERSION = "6.9-SNAPSHOT"
60+
LTP_DOWNLOAD_VERSION = "6.8"
61+
LT_SNAPSHOT_LATEST_VERSION = "latest"
6262
LTP_DOWNLOAD_SHA256_ENV_VAR = "LTP_DOWNLOAD_SHA256"
6363
LTP_BYPASS_VERIFIED_DOWNLOADS_ENV_VAR = "LTP_BYPASS_VERIFIED_DOWNLOADS"
6464
LTP_MAX_DOWNLOAD_BYTES_ENV_VAR = "LTP_MAX_DOWNLOAD_BYTES"
@@ -399,13 +399,16 @@ def from_version_name(
399399
This factory method determines the appropriate subclass (ReleaseLocalLanguageTool
400400
or SnapshotLocalLanguageTool) based on the version name format.
401401
402-
:param version_name: The version name (e.g., '6.0', '20240101', or 'latest').
402+
:param version_name: The version name (e.g., '6.8', '20240101', or 'latest').
403403
:type version_name: str
404404
:return: An instance of the appropriate LocalLanguageTool subclass.
405405
:rtype: LocalLanguageTool
406406
:raises ValueError: If the version name format is not recognized.
407407
"""
408-
if re.match(r"^\d{8}$", version_name) or version_name == LTP_DOWNLOAD_VERSION:
408+
if (
409+
re.match(r"^\d{8}$", version_name)
410+
or version_name == LT_SNAPSHOT_LATEST_VERSION
411+
):
409412
return SnapshotLocalLanguageTool(version_name)
410413
if re.match(r"^\d+\.\d+$", version_name):
411414
return ReleaseLocalLanguageTool(version_name)
@@ -430,11 +433,7 @@ def from_path(cls, path: Path) -> "LocalLanguageTool":
430433
err = f"Could not determine LanguageTool version from path: {path}"
431434
raise ValueError(err)
432435
version_name = match.group(1)
433-
return cls.from_version_name(
434-
version_name
435-
if version_name != LT_SNAPSHOT_CURRENT_VERSION
436-
else LTP_DOWNLOAD_VERSION
437-
)
436+
return cls.from_version_name(version_name)
438437

439438
@abstractmethod
440439
def download(self) -> None:
@@ -856,6 +855,11 @@ def __init__(self, version_name: str) -> None:
856855
Initialize a SnapshotLocalLanguageTool instance.
857856
"""
858857
self._version_name = version_name
858+
self._install_version_name = (
859+
datetime.now().strftime("%Y%m%d")
860+
if version_name == LT_SNAPSHOT_LATEST_VERSION
861+
else version_name
862+
)
859863

860864
def download(self) -> None:
861865
"""
@@ -915,15 +919,13 @@ def version_name(self) -> str:
915919
"""
916920
Get the snapshot version name.
917921
918-
Returns the current snapshot version string if 'latest' was specified,
919-
otherwise returns the specified date string.
922+
Returns the current date if 'latest' was specified, otherwise returns the
923+
specified date string.
920924
921925
:return: The snapshot version string.
922926
:rtype: str
923927
"""
924-
if self._version_name == LTP_DOWNLOAD_VERSION:
925-
return LT_SNAPSHOT_CURRENT_VERSION
926-
return self._version_name
928+
return self._install_version_name
927929

928930
@property
929931
def version_into(self) -> datetime:
@@ -936,11 +938,7 @@ def version_into(self) -> datetime:
936938
:return: A datetime object representing the snapshot date.
937939
:rtype: datetime
938940
"""
939-
if self._version_name == LTP_DOWNLOAD_VERSION:
940-
date_str = datetime.now().strftime("%Y%m%d")
941-
else:
942-
date_str = self._version_name
943-
return datetime.strptime(date_str, "%Y%m%d")
941+
return datetime.strptime(self.version_name, "%Y%m%d")
944942

945943
@property
946944
def download_url(self) -> str:

tests/test_download.py

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

266266

267+
def test_latest_snapshot_uses_latest_download_url_and_current_date(
268+
monkeypatch: pytest.MonkeyPatch,
269+
) -> None:
270+
"""
271+
Test that latest remains a snapshot alias installed under the current date.
272+
"""
273+
monkeypatch.setattr(
274+
download_lt,
275+
"BASE_URL_SNAPSHOT",
276+
"https://example.test/snapshots/",
277+
)
278+
279+
with patch("language_tool_python.download_lt.datetime") as datetime_mock:
280+
datetime_mock.now.return_value.strftime.return_value = "20240514"
281+
local_language_tool = LocalLanguageTool.from_version_name("latest")
282+
283+
assert local_language_tool.version_name == "20240514"
284+
assert (
285+
local_language_tool.download_url
286+
== "https://example.test/snapshots/LanguageTool-latest-snapshot.zip"
287+
)
288+
289+
267290
@pytest.mark.parametrize("release_version", ["6.7", "6.8"]) # type: ignore[untyped-decorator]
268291
def test_release_download_url_uses_new_release_base_from_6_7(
269292
release_version: str,
@@ -497,6 +520,44 @@ def test_snapshot_download_renames_archive_root_to_requested_date(
497520
get_mock.assert_not_called()
498521

499522

523+
def test_latest_snapshot_download_renames_archive_root_to_current_date(
524+
monkeypatch: pytest.MonkeyPatch,
525+
) -> None:
526+
"""
527+
Test that latest snapshots are installed under the current date name.
528+
"""
529+
current_snapshot_date = "20240514"
530+
payload = make_zip_payload(
531+
{"LanguageTool-6.9-SNAPSHOT/languagetool-server.jar": b"jar"}
532+
)
533+
with patch("language_tool_python.download_lt.datetime") as datetime_mock:
534+
datetime_mock.now.return_value.strftime.return_value = current_snapshot_date
535+
local_language_tool = LocalLanguageTool.from_version_name("latest")
536+
monkeypatch.setattr(download_lt, "confirm_java_compatibility", lambda _: None)
537+
538+
with (
539+
workspace_temp_dir() as temp_dir,
540+
patch(
541+
"language_tool_python.download_lt.requests.get",
542+
return_value=MockDownloadResponse(payload),
543+
),
544+
):
545+
monkeypatch.setattr(
546+
download_lt, "get_language_tool_download_path", lambda: temp_dir
547+
)
548+
local_language_tool.download()
549+
550+
expected_dir = temp_dir / f"LanguageTool-{current_snapshot_date}"
551+
assert (expected_dir / "languagetool-server.jar").read_bytes() == b"jar"
552+
assert not (temp_dir / "LanguageTool-6.9-SNAPSHOT").exists()
553+
assert local_language_tool.get_directory_path() == expected_dir
554+
555+
with patch("language_tool_python.download_lt.requests.get") as get_mock:
556+
local_language_tool.download()
557+
558+
get_mock.assert_not_called()
559+
560+
500561
def test_install_oldest_supported_version() -> None:
501562
"""
502563
Test that downloading the oldest supported LanguageTool version works correctly.

tests/test_server_local.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,11 @@ def test_session_only_new_spellings() -> None:
8282
import hashlib
8383

8484
import language_tool_python
85-
from language_tool_python.download_lt import LT_SNAPSHOT_CURRENT_VERSION
85+
from language_tool_python.download_lt import LTP_DOWNLOAD_VERSION
8686
from language_tool_python.utils import get_language_tool_download_path
8787

8888
library_path = (
89-
get_language_tool_download_path()
90-
/ f"LanguageTool-{LT_SNAPSHOT_CURRENT_VERSION}"
89+
get_language_tool_download_path() / f"LanguageTool-{LTP_DOWNLOAD_VERSION}"
9190
)
9291
spelling_file_path = (
9392
library_path

0 commit comments

Comments
 (0)