Source code for scale.olm.report

from pathlib import Path
import scale.olm.internal as internal
import scale.olm.core as core
import json
from typing import Literal

__all__ = ["rst2pdf"]

_TYPE_RST2PDF = "scale.olm.report:rst2pdf"


def _schema_rst2pdf(with_state: bool = False):
    _schema = internal._infer_schema(_TYPE_RST2PDF, with_state=with_state)
    return _schema


def _test_args_rst2pdf(with_state: bool = False):
    return {"_type": _TYPE_RST2PDF, "template": "report.jt.rst"}


[docs] def rst2pdf( template: str = "", _model: dict = {}, _env: dict = {}, dry_run: bool = False, _type: Literal[_TYPE_RST2PDF] = None, ): """Generate a report using rst2pdf. Report templates are provided in restructured text. This function expands those templates with a report.olm.json file that has data from all the other stages. 1. generate 2. run 3. assemble 4. check """ if dry_run: return {} # Load the template file. template_path = Path(_env["config_file"]).parent / template internal.logger.info("Initializing report", template=str(template_path)) with open(template_path, "r") as f: template_text = f.read() # Load data files. work_path = Path(_env["work_dir"]) data = {"model": _model} for x in ["generate", "run", "assemble", "check"]: j = work_path / (x + ".olm.json") with open(j, "r") as f: data[x] = json.load(f) rst = work_path / (_model["name"] + ".rst") pdf = rst.with_suffix(".pdf") report_data_path = work_path / "report.olm.json" with open(report_data_path, "w") as f: internal.logger.info("Writing report data", report_data=str(report_data_path)) json.dump(data, f, indent=4) # Expand template. filled_text = core.TemplateManager.expand_text(template_text, data) with open(rst, "w") as f: internal.logger.info("Writing report content", rst_file=str(rst)) f.write(filled_text) # Generate PDF. internal.run_command(f"rst2pdf -s twocolumn {rst}", check_return_code=False) internal.logger.info("Generated report", pdf_file=str(pdf)) data["_"] = { "work_dir": str(work_path), "template": str(template_path), "pdf_file": str(pdf), "rst_file": str(rst), } return data