Source code for projectreport.report.latex
from typing import List
import pyexlatex as pl
from pyexlatex.models.format.breaks import OutputLineBreak
from pyexlatex.models.item import ItemBase
from pyexlatex.models.section.base import TextAreaMixin
[docs]class SubProjectLatex(TextAreaMixin, ItemBase):
[docs] def __init__(self, data, **kwargs):
contents = self.get_contents(data)
super().__init__(None, contents, **kwargs)
[docs] def get_contents(self, data):
line_break = OutputLineBreak()
green = pl.RGB(42, 138, 11, color_name="darkgreen")
commits_str = (
"Commits" if data["num_commits"] and data["num_commits"] > 1 else "Commit"
)
contents = [
pl.Bold(data["name"]) if data["name"] else None,
f"(v{data['version']})" if data["version"] else None,
pl.TextColor(f"{data['lines']} LOC", color=green)
if data["lines"]
else None,
["|", pl.TextColor(f"{data['num_commits']} {commits_str}", color="blue")]
if data["num_commits"]
else None,
["|", f'Created {data["created"].date()}'] if data["created"] else None,
["|", f'Updated {data["updated"].date()}'] if data["updated"] else None,
line_break,
data["docstring"],
]
if data["topics"]:
contents.append(line_break)
contents.append("Topics: " + ", ".join(data["topics"]))
contents = [content for content in contents if content is not None]
if not contents[-1] == line_break:
contents.append(line_break)
return contents
def __str__(self):
from pyexlatex.logic.builder import _build
if isinstance(self.contents, str):
return self.contents
return _build(self.contents)
[docs]def project_latex(data: dict):
contents = []
contents.append(SubProjectLatex(data))
if "subprojects" in data:
for project in data["subprojects"]:
contents.append(
pl.ParagraphIndent(project_latex(data["subprojects"][project]))
)
return contents
[docs]def multi_project_latex(data: List[dict]):
contents = []
for data_dict in data:
contents.extend(
[
project_latex(data_dict),
pl.HLine(),
pl.VSpace(0.5),
]
)
del contents[-2:] # remove last horizontal line and vertical spacing
return contents
[docs]def project_latex_document(data) -> pl.Document:
contents = project_latex(data)
return _get_document(contents)
[docs]def multi_project_latex_document(data: List[dict]) -> pl.Document:
contents = multi_project_latex(data)
return _get_document(contents)
def _get_document(contents) -> pl.Document:
doc = pl.Document(contents, title="Project Report")
return doc