from dataclasses import dataclass from collections.abc import Iterable, Iterator from typing import Optional import requests @dataclass(frozen=True) class ListFileEntry: entry: str comment: Optional[str] class ListFileIterator(Iterator[ListFileEntry]): def __init__(self, entries: list[ListFileEntry]): self._entries = entries self.index = -1 def __next__(self) -> ListFileEntry: if self.index == len(self._entries): raise StopIteration self.index += 1 return self._entries[self.index] @dataclass(frozen=True) class ListFile(Iterable[ListFileEntry]): def __init__(self, contents: str): self._contents = contents acc = [] comment_acc = "" for line in contents.splitlines(): if line.startswith("#"): continue elif line.startswith("##"): comment_acc += line[2:].strip() else: acc.append(ListFileEntry(comment = comment_acc if comment_acc else None, entry = line)) self._entries = acc def __iter__(self) -> ListFileIterator: return ListFileIterator(self._entries) def entries(self) -> list[ListFileEntry]: return self._entries @classmethod def from_url(cls, url: str): return cls(requests.get(url, stream = False).text)