import click from random import shuffle from card import Card from scheduler import getSchedulerClass, SCHEDULERS from parser import parseFiles from state_json import save, load @click.group() def cli(): pass @cli.command() @click.argument("state_file", nargs=1, type=click.Path()) @click.argument("card_files", nargs=-1, type=click.Path(exists=True)) @click.option("--scheduler", "scheduler_name", default="brutal", type=click.Choice(SCHEDULERS, case_sensitive=False), help="Name of desired scheduler") @click.option("--count", default=20, type=int, help="Number of cards to show during the session") @click.option("--random_flip", is_flag=True, help="Prompt with card front or back randomly instead of always front") def practice(state_file, card_files, scheduler_name, count, random_flip): """ Run a practice session with the specified scheduler, using the provided state and card files. """ all_cards = parseFiles(card_files) state = load(state_file) scheduler = getSchedulerClass(scheduler_name)(all_cards, state) cards = scheduler.practice(count) for i, id in enumerate(cards): click.echo(click.style(f"{i + 1}/{len(cards)} ===========================================================", fg="blue")) faces = [all_cards[id].front, all_cards[id].back] if random_flip: shuffle(faces) click.echo(click.style(faces.pop(0), fg="yellow")) input() click.echo(faces.pop(0)) @cli.command() @click.argument("state_file", nargs=1, type=click.Path()) @click.argument("card_files", nargs=-1, type=click.Path(exists=True)) @click.option("--scheduler", "scheduler_name", default="brutal", type=click.Choice(SCHEDULERS, case_sensitive=False), help="Name of desired scheduler") @click.option("--count", default=20, type=int, help="Number of cards to show during the session") @click.option("--random_flip", is_flag=True, help="Prompt with card front or back randomly instead of always front") def test(state_file, card_files, scheduler_name, count, random_flip): """ Run a test session with the specified scheduler, using the provided state and card files. """ all_cards = parseFiles(card_files) state = load(state_file) scheduler = getSchedulerClass(scheduler_name)(all_cards, state) cards = scheduler.test(count) results = {} for i, id in enumerate(cards): click.echo(click.style(f"{i + 1}/{len(cards)} ===========================================================", fg="blue")) faces = [all_cards[id].front, all_cards[id].back] if random_flip: shuffle(faces) click.echo(click.style(faces.pop(0), fg="yellow")) input() click.echo(faces.pop(0)) click.echo() results[id] = int(click.confirm(click.style("Correct?", bold=True))) scheduler.update(results) save(state_file, scheduler.getState()) if __name__ == '__main__': cli()