Source code for nefelibata.publishers

from pathlib import Path
from typing import Any
from typing import Dict
from typing import List

from pkg_resources import iter_entry_points


[docs]class Publisher: def __init__(self, root: Path, config: Dict[str, Any], *args: Any, **kwargs: Any): self.root = root self.config = config
[docs] def find_modified_files(self, force: bool, since: float) -> List[Path]: build = self.root / "build" queue = [build] # manually walk, since `glob("**/*")` doesn't follow symlinks paths: List[Path] = [] while queue: current = queue.pop() for path in current.glob("*"): if not path.exists(): # broken symlink continue if path.is_dir(): queue.append(path) elif force or path.stat().st_mtime > since: paths.append(path) return paths
[docs] def publish(self, force: bool = False) -> None: raise NotImplementedError("Subclasses must implement publish")
[docs]def get_publishers(root: Path, config: Dict[str, Any]) -> List[Publisher]: """Return all publishers.""" names = config["publish-to"] or [] if isinstance(names, str): names = [names] publishers = {p.name: p.load() for p in iter_entry_points("nefelibata.publisher")} return [publishers[name](root, config, **config[name]) for name in names]