Source code for fastiot.cli.model.docker_template

from typing import Dict
from pydantic import BaseModel

from fastiot.util.classproperty import classproperty


[docs]class DockerTemplate(BaseModel): """ Docker template base class. Inherit from this class to define dockerfile templates. Via python's __subclasses__ mechanism they get imported and can be used in the service's manifest. """ name: str """ The template name used for referencing """ dir: str """ The template dir where this template is located """ filename: str = 'Dockerfile.j2' """ The filename of the template. Must reference a file inside template dir. """ @classproperty def all(cls) -> Dict[str, "DockerTemplate"]: """ Method to get a dict of all available services as instantiated :class:`fastiot.cli.model.infrastructure_service.InfrastructureService`. To append own services you simply have to inherit from this class and put them into your project. Then import those parts using :attr:`fastiot.cli.model.project.ProjectContext.extensions`. This method will try to import anything from there and for services. """ template_classes = DockerTemplate.__subclasses__() i_template_class = 0 while i_template_class < len(template_classes): for subcls in template_classes[i_template_class].__subclasses__(): if subcls not in template_classes: # We have to check for multiple inheritance template_classes.append(subcls) i_template_class += 1 templates_list = [t() for t in template_classes] templates = {t.name: t for t in templates_list} return {k: templates[k] for k in sorted(templates.keys())} # we need this line for Pycharm IDE to detect type-hinting properly. Maybe it is fixed in the future all: Dict[str, "DockerTemplate"]
[docs] @classmethod def get(cls, name: str) -> "DockerTemplate": template = cls.all.get(name) if template is None: raise ValueError(f"Template for name '{name}' not found. Please make sure to import it correctly.") return template