summaryrefslogtreecommitdiffstats
path: root/cli-project/flashcard_cli.py
blob: bb2847f4fd021d35e229c739570470952fd35047 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import click
from random import shuffle

from flashcards import Session, SCHEDULERS

@click.group()
def cli():
    pass

def displayCard(card, index: int, count: int, prompt_mode: str) -> None:
    click.echo(click.style(f"{index + 1}/{count} ===========================================================", fg="blue"))

    match prompt_mode:
        case "front":
            faces = [card.front, card.back]
        case "back":
            faces = [card.back, card.front]
        case "random":
            faces = [card.front, card.back]
            shuffle(faces)
        case _:
            raise Exception(f"Invalid prompt mode: {prompt_mode}")

    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("--prompt", default="front", type=click.Choice(["front", "back", "random"], case_sensitive=False), help="Prompt using card front, back, or randomly choose")
def practice(state_file, card_files, scheduler_name, count, prompt):
    """
    Run a practice session with the specified scheduler, using the provided state and card files.
    """
    session = Session(scheduler_name, card_files, state_file)

    for i, card in enumerate(session.practice(count)):
        displayCard(card, i, count, prompt)

@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("--prompt", default="front", type=click.Choice(["front", "back", "random"], case_sensitive=False), help="Prompt using card front, back, or randomly choose")
def test(state_file, card_files, scheduler_name, count, prompt):
    """
    Run a test session with the specified scheduler, using the provided state and card files.
    """
    session = Session(scheduler_name, card_files, state_file)

    for i, (card, correct) in enumerate(session.test(count)):
        displayCard(card, i, count, prompt)
        correct(click.confirm(click.style("Correct?", bold=True)))

if __name__ == '__main__':
    cli()