runtime.txt: allow name-yyyy-mm-dd (no version)

pull/1428/head
Simon Li 2025-06-22 18:38:18 +01:00
rodzic 7ec064c128
commit 53cc506e8e
2 zmienionych plików z 38 dodań i 9 usunięć

Wyświetl plik

@ -759,6 +759,11 @@ class BaseImage(BuildPack):
Returns (runtime, version, date), tuple components may be None.
Returns (None, None, None) if runtime.txt not found.
Supported formats:
name-version
name-version-yyyy-mm-dd
name-yyyy-mm-dd
"""
if hasattr(self, "_runtime"):
return self._runtime
@ -776,15 +781,19 @@ class BaseImage(BuildPack):
version = None
date = None
parts = runtime_txt.split("-", 2)
if len(parts) > 0 and parts[0]:
name = parts[0]
if len(parts) > 1 and parts[1]:
parts = runtime_txt.split("-")
if len(parts) not in (2, 4, 5) or any(not (p) for p in parts):
raise ValueError(f"Invalid runtime.txt: {runtime_txt}")
name = parts[0]
if len(parts) in (2, 5):
version = parts[1]
if len(parts) > 2 and parts[2]:
date = parts[2]
if len(parts) in (4, 5):
date = "-".join(parts[-3:])
if not re.match(r"\d\d\d\d-\d\d-\d\d", date):
raise ValueError(f"Invalid date, expected YYYY-MM-DD: {date}")
raise ValueError(f"Invalid runtime.txt date: {date}")
date = datetime.datetime.fromisoformat(date).date()
self._runtime = (name, version, date)

Wyświetl plik

@ -57,10 +57,9 @@ def test_unsupported_python(tmpdir, python_version, base_image):
"runtime_txt, expected",
[
(None, (None, None, None)),
("", (None, None, None)),
("abc", ("abc", None, None)),
("abc-001", ("abc", "001", None)),
("abc-001-2025-06-22", ("abc", "001", date(2025, 6, 22))),
("abc-2025-06-22", ("abc", None, date(2025, 6, 22))),
("a_b/c-0.0.1-2025-06-22", ("a_b/c", "0.0.1", date(2025, 6, 22))),
],
)
@ -73,3 +72,24 @@ def test_runtime(tmpdir, runtime_txt, expected, base_image):
base = BaseImage(base_image)
assert base.runtime == expected
@pytest.mark.parametrize(
"runtime_txt",
[
"",
"abc",
"abc-001-25-06-22",
],
)
def test_invalid_runtime(tmpdir, runtime_txt, base_image):
tmpdir.chdir()
if runtime_txt is not None:
with open("runtime.txt", "w") as f:
f.write(runtime_txt)
base = BaseImage(base_image)
with pytest.raises(ValueError, match=r"^Invalid runtime.txt.*"):
base.runtime