"""Infrastructure and deployment artifact types."""
from projspec.artifact.base import BaseArtifact, FileArtifact
from projspec.proj.base import Project
from projspec.utils import run_subprocess
[docs]
class ComposeStack(BaseArtifact):
"""A multi-service stack managed by Docker Compose.
``make()`` runs ``docker compose up -d``
``clean()`` runs ``docker compose down``
``state`` is inferred by ``docker compose ps`` (checks for running services).
"""
icon = "🗂️"
def __init__(self, proj: Project, file: str = "docker-compose.yml", **kwargs):
self.compose_file = file
cmd = ["docker", "compose", "-f", file, "up", "-d"]
super().__init__(proj, cmd=cmd, **kwargs)
def _make(self, **kwargs):
run_subprocess(self.cmd, cwd=self.proj.url, output=False, **kwargs)
def clean(self):
run_subprocess(
["docker", "compose", "-f", self.compose_file, "down"],
cwd=self.proj.url,
output=False,
)
def _is_done(self) -> bool:
try:
result = run_subprocess(
["docker", "compose", "-f", self.compose_file, "ps", "-q"],
cwd=self.proj.url,
)
return bool(result.stdout.strip())
except Exception:
return False
def _is_clean(self) -> bool:
return not self._is_done()
[docs]
class StaticSite(FileArtifact):
"""A static website produced by a build tool (MkDocs, Sphinx, Docusaurus, Quarto, etc.).
``fn`` should be the glob pattern for the output index file, e.g.
``<proj>/site/index.html``.
"""
icon = "🌐"
pass