from __future__ import annotations | |
from dataclasses import dataclass, field | |
import huggingface_hub | |
import semantic_version | |
import semantic_version as semver | |
class ThemeAsset: | |
filename: str | |
version: semver.Version = field(init=False) | |
def __post_init__(self): | |
self.version = semver.Version(self.filename.split("@")[1].replace(".json", "")) | |
def get_theme_assets(space_info: huggingface_hub.hf_api.SpaceInfo) -> list[ThemeAsset]: | |
# Commenting out as it seems that the `huggingface_hub` library is not parsing tags | |
# if "gradio-theme" not in getattr(space_info, "tags", []): | |
# raise ValueError(f"{space_info.id} is not a valid gradio-theme space!") | |
return [ | |
ThemeAsset(filename.rfilename) | |
for filename in space_info.siblings | |
if filename.rfilename.startswith("themes/") | |
] | |
def get_matching_version( | |
assets: list[ThemeAsset], expression: str | None | |
) -> ThemeAsset | None: | |
expression = expression or "*" | |
# Return most recent version that matches | |
matching_version = semantic_version.SimpleSpec(expression).select( | |
[a.version for a in assets] | |
) | |
return next((a for a in assets if a.version == matching_version), None) | |