Source code for nefelibata.builders
from enum import Enum
from pathlib import Path
from typing import Any
from typing import Dict
from typing import List
from typing import Optional
from nefelibata.post import Post
from pkg_resources import iter_entry_points
[docs]class Scope(Enum):
POST = "post"
SITE = "site"
[docs]class Builder:
scopes: List[Scope] = []
def __init__(self, root: Path, config: Dict[str, Any], *args: Any, **kwargs: Any):
self.root = root
self.config = config
[docs] def process_post(self, post: Post, force: bool = False) -> None:
if Scope.POST not in self.scopes:
raise Exception(f'Scope "post" not supported by {self.__class__.__name__}')
raise NotImplementedError("Subclasses MUST implement `process_post`")
[docs] def process_site(self, force: bool = False) -> None:
if Scope.SITE not in self.scopes:
raise Exception(f'Scope "site" not supported by {self.__class__.__name__}')
raise NotImplementedError("Subclasses MUST implement `process_site`")
[docs]def get_builders(
root: Path, config: Dict[str, Any], scope: Optional[Scope] = None,
) -> List[Builder]:
names = config["builders"] or []
builders = {a.name: a.load() for a in iter_entry_points("nefelibata.builder")}
return [
builders[name](root, config, **config.get(name, {}))
for name in names
if scope in builders[name].scopes or scope is None
]