feat: add cli flags for input, template & output

This commit is contained in:
rsxri 2026-01-06 18:04:06 +00:00
parent 8239c4d57a
commit 8f1e12bac9

59
main.py
View file

@ -1,3 +1,4 @@
import argparse
import json import json
from pathlib import Path from pathlib import Path
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
@ -5,31 +6,59 @@ from jinja2 import Environment, FileSystemLoader
from schema import DocumentInput from schema import DocumentInput
def parse_args() -> argparse.Namespace:
# keep cli parsing separate so main stays about workflow
parser = argparse.ArgumentParser(description="Render document from JSON + Jinja2 template")
parser.add_argument(
"--input",
"-i",
type=Path,
required=True,
help="Path to input JSON file (e.g. examples/input.json)"
)
parser.add_argument(
"--template",
"-t",
default="doc.md.j2",
help="Template file (e.g. doc.md.j2)"
)
parser.add_argument(
"--output",
"-o",
type=Path,
required=True,
help="Path to write rendered output (e.g. out.md)"
)
return parser.parse_args()
def render_template(template_name: str, data: dict) -> str:
# Jinja env points at templates/
env = Environment(loader=FileSystemLoader("templates"),
trim_blocks=True,
lstrip_blocks=True)
template = env.get_template(template_name)
return template.render(data)
def main(): def main():
args = parse_args()
# load input data # load input data
# path() over hardcoding str # path() over hardcoding str
data = json.loads(Path("examples/input.json").read_text(encoding="utf-8")) data = json.loads(args.input.read_text(encoding="utf-8"))
# validate + normalise input # validate + normalise input
doc_input = DocumentInput(**data) doc_input = DocumentInput(**data)
# setup template eng
# create jinja2 env for templates
env = Environment(
# look in templates/
loader=FileSystemLoader("templates"),
# trim whitespaces
trim_blocks=True,
lstrip_blocks=True,
)
# load template to render # load template to render
# **data spreads dict so keys become template vars out = render_template(args.template, doc_input.model_dump())
template = env.get_template("doc.md.j2")
out = template.render(**doc_input.model_dump())
# write output - render md to file # write output - render md to file
Path("out.md").write_text(out, encoding="utf-8") args.output.write_text(out, encoding="utf-8")
print("wrote out.md") print(f"wrote {args.output}")
if __name__ == "__main__": if __name__ == "__main__":