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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
import click
from json import load, dump
from random import shuffle
from card import Card
from scheduler import getSchedulerClass, SCHEDULERS
from parser import parseFiles
@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)
try:
state = json.load(state_file)
except:
click.echo(f"Warning: could not load state from {state_file}, starting with clean state")
state = {}
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)
try:
with open(state_file, "r") as f:
state = load(f)
except:
click.echo(f"Warning: could not load state from {state_file}, starting with clean state")
state = {}
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)
with open(state_file, "w") as f:
dump(scheduler.getState(), f)
if __name__ == '__main__':
cli()
|