Source code for psij.executors.batch.script_generator
import pathlib
from abc import ABC
from typing import Dict, Callable, IO
import pystache
from psij import Job, JobExecutorConfig
from .escape_functions import bash_escape
[docs]class SubmitScriptGenerator(ABC):
"""A base class representing a submit script generator.
A submit script generator is used to render a :class:`~psij.Job` (together with all its
properties, including :class:`~psij.JobSpec`, :class:`~psij.ResourceSpec`, etc.) into a submit
script specific to a certain batch scheduler.
"""
def __init__(self, config: JobExecutorConfig) -> None:
"""
Parameters
----------
config
An executor configuration containing configuration properties for the executor that
is attempting to use this generator. Submit script generators are meant to work in
close cooperation with batch scheduler job executors, hence the sharing of a
configuration mechanism.
"""
self.config = config
[docs] def generate_submit_script(self, job: Job, context: Dict[str, object], out: IO[str]) -> None:
"""Generates a job submit script.
Concerete implementations of submit script generators must implement this method. Its
purpose is to generate the content of the submit script. For an extensive explanation of
the mechanism behind this process, see :class:`~.BatchSchedulerExecutor`.
Parameters
----------
job
The job for which the submit script is to be generated.
context
A dictionary containing information about the context in which the job is being
submitted. For details, see :class:`~.BatchSchedulerExecutor`.
out
An opened file-like object to which the contents of the submit script should be
written.
"""
pass
[docs]class TemplatedScriptGenerator(SubmitScriptGenerator):
"""A Mustache templates submit script generator.
This script generator uses Pystache (https://pypi.org/project/pystache/), which is a Python
implementation of the Mustache templating language (https://mustache.github.io/).
"""
def __init__(self, config: JobExecutorConfig, template_path: pathlib.Path,
escape: Callable[[object], str] = bash_escape) -> None:
"""
Parameters
----------
config
A configuration, which is passed to the base class.
template_path
The path to a Mustache template.
escape
An escape function to use for escaping values. By default, a function that escapes
strings for use in bash scripts is used.
"""
super().__init__(config)
with template_path.open('r') as template_file:
self.template = pystache.parse(template_file.read())
self.renderer = pystache.Renderer(escape=escape)
[docs] def generate_submit_script(self, job: Job, context: Dict[str, object], out: IO[str]) -> None:
"""See :func:`~SubmitScriptGenerator.generate_submit_script`.
Renders a submit script using the template specified when this generator was constructed.
"""
out.write(self.renderer.render(self.template, context))