Source code for mendevi.plot.printer

"""Generate a Python code that allows you to plot the graph."""

import datetime
import itertools
import logging
import re
import shlex
import subprocess
import sys

from mendevi import __version__
from mendevi.cst.plot import COLORS, FIGSIZE, MARKERS, MARKERSIZE
from mendevi.database.extract import SqlLinker
from mendevi.database.meta import Scale, get_extractor, merge_extractors


[docs] def printer(**kwargs: dict) -> str: """Create an excecutable python code.""" # create code code: list[str] = [] code.extend(print_header()) code.extend(print_import()) code.extend(print_cst(**kwargs)) code.extend(print_mean_std()) code.extend(print_read_sql(**kwargs)) code.extend(print_fill_axe(**kwargs)) code.extend(print_main(**kwargs)) code.extend(print_entry()) code = "\n".join(code) # format code try: result = subprocess.run( ["ruff", "format", "--line-length", "100", "-"], input=code.encode(), capture_output=True, check=True, ) except FileNotFoundError: logging.getLogger(__name__).warning( "Ruff is not installed, please install it (uv pip install ruff)", ) except subprocess.CalledProcessError as err: logging.getLogger(__name__).warning("Ruff formatting failed: %s", err.stderr.decode()) else: code = result.stdout.decode() # substitution for pattern, repl in kwargs["sub"]: code = re.sub(pattern, repl, code) # injection of substitution-sensitive patterns return code.replace("{cmd}", repr(shlex.join(sys.argv)))
[docs] def print_entry() -> list[str]: """Return the code of the entry point.""" return [ 'if __name__ == "__main__":', " values: dict[str] = read_sql(DATABASE)", " main(values)", "", ]
[docs] def safe_lbl(lbl: str) -> str: """Convert the label into a valid lowercase variable.""" assert isinstance(lbl, str), lbl.__class__.__name__ for symb, rep in [("+", "plus"), ("-", "minus"), ("*", "times"), ("/", "per")]: lbl = lbl.replace(symb, f"_{rep}_") return re.sub(r"[^0-9a-zA-Z]+", "_", lbl.lower())