diff --git a/download.py b/download.py index 791e0e4..3261ab9 100644 --- a/download.py +++ b/download.py @@ -7,7 +7,7 @@ import pathlib import sys import time import urllib.parse -from typing import List +from typing import List, Optional import random import bs4 @@ -142,21 +142,6 @@ def get_token_from_file(path: pathlib.Path) -> str: return token -def download_latest_inputs(output_dir: pathlib.Path, token: str): - date = PuzzleDate.get_latest() - - step = None - try: - step = "download sample inputs" - download_sample_inputs(date, output_dir) - step = "download input" - download_input(date, token, output_dir) - except requests.exceptions.HTTPError as err: - LOG.error(f"Failed to {step}: {err}") - LOG.debug(f"Response body: {err.response.text}") - sys.exit(1) - - def wait_for_next_puzzle(): next_date = PuzzleDate.get_next() next_datetime = datetime.datetime(year=next_date.year, month=12, day=next_date.day) @@ -181,7 +166,17 @@ def setup_logs(verbose: bool): ) -@click.command() +class FetchCommand(click.Command): + def invoke(self, ctx: click.Context): + year = ctx.params.get("year") + day = ctx.params.get("day") + if (year and not day) or (not day and year): + raise click.ClickException("day and year must be specified together") + + return super().invoke(ctx) + + +@click.command(cls=FetchCommand) @click.option("-v", "--verbose", is_flag=True) @click.option( "--token", "passed_token", type=str, help="The advent of code session token." @@ -201,14 +196,17 @@ def setup_logs(verbose: bool): help="The location of the advent of code session token. Ignored if --token is provided.", ) @click.option("--wait", is_flag=True, help="Wait until new puzzle inputs are ready") +@click.option("--year", type=int) +@click.option("--day", type=int) def main( verbose: bool, passed_token: str, token_path: pathlib.Path, output_dir: pathlib.Path, wait: bool, + day: Optional[int], + year: Optional[int], ): - PuzzleDate.get_next() token = passed_token if not token and not token_path: LOG.error("no token file given") @@ -226,7 +224,18 @@ def main( if wait: wait_for_next_puzzle() - download_latest_inputs(output_dir, token) + specified_date = PuzzleDate(year=year, day=day) if day and year else None + date_to_fetch = specified_date or PuzzleDate.get_latest() + step = None + try: + step = "download sample inputs" + download_sample_inputs(date_to_fetch, output_dir) + step = "download input" + download_input(date_to_fetch, token, output_dir) + except requests.exceptions.HTTPError as err: + LOG.error(f"Failed to {step}: {err}") + LOG.debug(f"Response body: {err.response.text}") + sys.exit(1) if __name__ == "__main__":