From 646d743dce4a3704febfa28be3abce405823baef Mon Sep 17 00:00:00 2001 From: alyx Date: Sat, 25 Nov 2023 13:25:26 -0500 Subject: Modelling, guts basically done. --- src/bbss/sizes.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/bbss/sizes.py (limited to 'src/bbss/sizes.py') diff --git a/src/bbss/sizes.py b/src/bbss/sizes.py new file mode 100644 index 0000000..26818e9 --- /dev/null +++ b/src/bbss/sizes.py @@ -0,0 +1,38 @@ +from .lists import BaseListFile, ListFileEntry, parse_listfile +from .buttons import ButtonListFile +from dataclasses import dataclass +from typing import Optional, Self +from collections.abc import Sequence +import requests + +@dataclass(frozen=True) +class SizeListFileEntry(ListFileEntry): + root: str + + def url(self) -> str: + return self.root + "/" + self.entry + "/list.txt" + + def exists(self) -> bool: + return requests.head(self.url()).ok + + def get(self) -> Optional[ButtonListFile]: + return ButtonListFile.from_url(self.url()) + +class SizeListFile(BaseListFile[SizeListFileEntry]): + def __init__(self, contents: str, root: str): + super().__init__(contents) + self._root = root + + def construct_entry(entry: str, comment: Optional[str]): + return SizeListFileEntry(entry, comment, root) + self._entries = parse_listfile(contents, construct_entry) + + @classmethod + def from_url(cls, url: str) -> Optional[Self]: + (root, _, _) = url.rpartition('/') + req = requests.get(url, stream = False) + if not req.ok: + return None + return cls(req.text, root) + +__all__ = ["SizeListFileEntry", "SizeListFile"] -- cgit v1.2.3-54-g00ecf