import enum import typing import importlib import os from pathlib import Path from shutil import copytree from time import perf_counter from typing import List, Callable import typer app = typer.Typer() class AssignmentPart(str, enum.Enum): One = "1" Two = "2" def day(assignment_part: str) -> str: return AssignmentPart(assignment_part).name def kwargs(kwarg: str) -> List: return kwarg.split("=") @app.command() def run(day: str, part: str = typer.Option("One", '--part', help="Assignment part. Defaults to 'One'.", show_choices=True), example: bool = typer.Option(False, '--example', help="Use an example input file"), kwargs: List[str] = typer.Argument(None) ): assignment_day = importlib.import_module(day) Assignment = getattr(assignment_day, f"Assignment{part}") assignment = Assignment( path=os.path.dirname(assignment_day.__file__), **dict(kwargs) ) start = perf_counter() typer.echo( assignment.run( input=assignment.read_input(example=example), ) ) end = perf_counter() delta = end - start typer.secho(f'\n{(delta if delta > 1 else delta * 1000):.3f}{"s" if delta > 1 else "ms"}', fg="green") @app.command() def new(day: str): self = importlib.import_module(".", package="aoc") path = Path(self.__file__) template = path.parent.joinpath("template") target = path.parent.parent.joinpath(day) try: copytree(template, target) except FileExistsError: typer.secho(f"{day} already exists", fg="red") if __name__ == "__main__": app()