Source code for satorbis_kit.pgstac.uploader.filename
"""Helpers for building STAC-compliant filenames."""
from __future__ import annotations
from datetime import date, datetime
from typing import Optional, Union
from ...storage import StorageError
DateInput = Union[str, date, datetime]
[docs]
def build_stac_filename(acquisition_date: DateInput, tile: Optional[str] = None) -> str:
"""Build the canonical STAC filename (YYYYMMDD[_TILE].tif)."""
date_str = normalize_date(acquisition_date)
tile_part = ""
if tile:
tile_part = f"_{normalize_tile(tile)}"
return f"{date_str}{tile_part}.tif"
[docs]
def normalize_date(acquisition_date: DateInput) -> str:
"""Return YYYYMMDD string from supported date inputs."""
if isinstance(acquisition_date, datetime):
value = acquisition_date.strftime("%Y%m%d")
elif isinstance(acquisition_date, date):
value = acquisition_date.strftime("%Y%m%d")
elif isinstance(acquisition_date, str):
digits = acquisition_date.replace("-", "").replace("/", "")
if len(digits) != 8 or not digits.isdigit():
raise StorageError("acquisition_date must be YYYYMMDD (optionally with '-' or '/')")
value = digits
else:
raise StorageError("acquisition_date must be a str, date, or datetime")
year = int(value[0:4])
month = int(value[4:6])
day = int(value[6:8])
if year < 1900 or year > 2100:
raise StorageError("acquisition_date year must be between 1900 and 2100")
if month < 1 or month > 12:
raise StorageError("acquisition_date month must be between 01 and 12")
if day < 1 or day > 31:
raise StorageError("acquisition_date day must be between 01 and 31")
return value
[docs]
def normalize_tile(tile: str) -> str:
"""Sanitize tile identifiers while preserving delimiters."""
formatted = tile.strip().upper()
if not formatted:
raise StorageError("tile cannot be an empty string")
sanitized = formatted.replace("-", "").replace("_", "")
if not sanitized.isalnum():
raise StorageError("tile must be alphanumeric (hyphen/underscore allowed)")
return formatted