add email to Person.all_names and Config.all_names
[utils.git] / src / budget_sync / write_budget_markdown.py
1 from pathlib import Path
2 from typing import Dict, List, Any
3 from io import StringIO
4 from budget_sync.budget_graph import BudgetGraph, Node, Payment, PayeeState
5 from budget_sync.config import Person, Milestone, Config
6
7
8 def _markdown_escape_char(char: str) -> str:
9 if char == "<":
10 return "&lt;"
11 if char == "&":
12 return "&amp;"
13 if char in "\\`*_{}[]()#+-.!":
14 return "\\" + char
15 return char
16
17
18 def _markdown_escape(v: Any) -> str:
19 return "".join([char for char in str(v)])
20
21
22 def _markdown_for_person(person: Person,
23 payments_dict: Dict[Milestone, List[Payment]]) -> str:
24 buffer = StringIO()
25 print(f"<!-- autogenerated by budget-sync -->", file=buffer)
26 print(f"# {person.identifier}", file=buffer)
27 print(file=buffer)
28 print(f"# Status Tracking", file=buffer)
29 for milestone, payments_list in payments_dict.items():
30 if len(payments_list) == 0:
31 continue
32 print(f"## {milestone.identifier}", file=buffer)
33 for payment in payments_list:
34 # TODO: finish
35 summary = _markdown_escape(payment.node.bug.summary)
36 print(f"* [Bug #{payment.node.bug.id}]({payment.node.bug_url}): "
37 f"{summary}",
38 file=buffer)
39 return buffer.getvalue()
40
41
42 def write_budget_markdown(budget_graph: BudgetGraph,
43 output_dir: Path):
44 output_dir.mkdir(parents=True, exist_ok=True)
45 for person, payments_dict in budget_graph.payments.items():
46 output_dir.joinpath(person.output_markdown_file) \
47 .write_text(_markdown_for_person(person, payments_dict),
48 encoding="utf-8")