Skip to content

Commit 608a71d

Browse files
committed
Add time resolution to date prefix of generate_unique_id
1 parent 6a45415 commit 608a71d

3 files changed

Lines changed: 33 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ and start a new "In Progress" section above it.
2121

2222
## In progress
2323

24+
- Add time resolution to date prefix of `generate_unique_id()`
2425

2526
## 0.122.0
2627

openeo_driver/utils.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,14 +334,20 @@ def get_package_versions(packages: List[str], na_value="n/a") -> dict:
334334
return version_info
335335

336336

337-
def generate_unique_id(prefix: Optional[str] = None, date_prefix: bool = True) -> str:
337+
def generate_unique_id(prefix: Optional[str] = None, *, date_prefix: Union[bool, str] = True) -> str:
338338
"""
339339
Generate a random, unique identifier, to be used as job id, request id
340340
correlation id, error id, ...
341+
342+
:param date_prefix: enable a date/time based prefix
343+
(e.g. so that alphabetical ordering implies temporal ordering)
344+
Can be boolean, or string template to be used with `strftime`
341345
"""
342346
id = uuid.uuid4().hex
343347
if date_prefix:
344-
date_repr = datetime.datetime.now(datetime.timezone.utc).strftime("%y%m%d")
348+
if not isinstance(date_prefix, str):
349+
date_prefix = "%y%m%d%H%M%S"
350+
date_repr = datetime.datetime.now(datetime.timezone.utc).strftime(date_prefix)
345351
id = f"{date_repr}{id[len(date_repr):]}"
346352
if prefix:
347353
id = f"{prefix}-{id}"

tests/test_utils.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import re
22
import typing
3+
from unittest import mock
34

45
import pytest
56
import time_machine
@@ -278,16 +279,33 @@ def test_get_package_versions_na():
278279
}
279280

280281

281-
def test_generate_unique_id():
282+
@pytest.fixture
283+
def generate_unique_id_mock() -> str:
284+
"""Fixture to fix the UUID used in `generate_unique_id`"""
285+
# TODO: make this more reusable
286+
with mock.patch("openeo_driver.utils.uuid") as uuid:
287+
fake_uuid = "0123456789abcdef0123456789abcdef"
288+
uuid.uuid4.return_value.hex = fake_uuid
289+
yield fake_uuid
290+
291+
292+
def test_generate_unique_id_basics():
282293
assert re.match("^[0-9a-f]{32}$", generate_unique_id())
283294
assert re.match("^j-[0-9a-f]{32}$", generate_unique_id("j"))
284295

285296

286-
def test_generate_unique_id_date_prefix():
287-
with time_machine.travel("2022-12-14T12:34:56Z"):
288-
job_id = generate_unique_id("j")
289-
assert re.match("^j-[0-9a-f]{32}$", generate_unique_id("j"))
290-
assert job_id.startswith("j-221214")
297+
@pytest.mark.parametrize(
298+
["date_prefix", "expected"],
299+
[
300+
(False, "j-0123456789abcdef0123456789abcdef"),
301+
(True, "j-191227070809cdef0123456789abcdef"),
302+
("%Y%m", "j-2019126789abcdef0123456789abcdef"),
303+
("d%y%m%d-T%H%M-", "j-d191227-T0708-ef0123456789abcdef"),
304+
],
305+
)
306+
def test_generate_unique_id_date_prefix(generate_unique_id_mock, date_prefix, expected):
307+
with time_machine.travel("2019-12-27T07:08:09Z"):
308+
assert generate_unique_id("j", date_prefix=date_prefix) == expected
291309

292310

293311
def test_filter_supported_kwargs_basic():

0 commit comments

Comments
 (0)