added datafile

This commit is contained in:
ickyicky 2021-07-10 23:27:11 +02:00
parent 1ee2b7c448
commit c28cac3805
5 changed files with 95 additions and 28 deletions

View file

@ -1 +1,9 @@
{"user_input_valid_color": 3, "user_input_invalid_color": 2, "reference_text_color": 8, "stats_template": "\n\nwpm: {stats.wpm}\ntime: {stats.total_seconds}s", "stats_color": 5, "summary_template": "WPM: {stats.wpm}\nCPM: {stats.cpm}\nRAW WPM: {stats.raw_wpm}\nRAW CPM: {stats.raw_cpm}\ntotal seconds: {stats.total_seconds}\ntotal minutes: {stats.total_minutes}\ncorrect words: {stats.correct_words}\ncorrect chars: {stats.correct_chars}\nincorrect words: {stats.incorrect_words}\nincorrect chars: {stats.incorrect_chars}\ntotal words: {stats.total_words}\ntotal chars: {stats.total_chars}\naccuracy: {stats.accuracy}%"}
{
"user_input_valid_color": 3,
"user_input_invalid_color": 2,
"reference_text_color": 8,
"stats_template": "\n\nwpm: {stats.wpm}\ntime: {stats.total_seconds}s",
"stats_color": 5,
"summary_template": "WPM: {stats.wpm}\nCPM: {stats.cpm}\nRAW WPM: {stats.raw_wpm}\nRAW CPM: {stats.raw_cpm}\ntotal seconds: {stats.total_seconds}\ntotal minutes: {stats.total_minutes}\ncorrect words: {stats.correct_words}\ncorrect chars: {stats.correct_chars}\nincorrect words: {stats.incorrect_words}\nincorrect chars: {stats.incorrect_chars}\ntotal words: {stats.total_words}\ntotal chars: {stats.total_chars}\naccuracy: {stats.accuracy}%",
"summary_datafile": "~/.config/cache/fasttyper/datafile.csv"
}

View file

@ -12,32 +12,7 @@ import argparse
import json
def main():
parser = argparse.ArgumentParser()
parser.add_argument("file", metavar="FILE", nargs="?")
parser.add_argument(
"--config",
"-c",
metavar="FILE",
help="configuration file",
default="~/.config/fasttyper/config.json",
)
args = parser.parse_args()
if args.file is None:
input_lines = sys.stdin.readlines()
os.dup2(3, 0)
rbuffer = io.StringIO("".join(input_lines))
else:
with open(args.file) as f:
rbuffer = io.StringIO(f.read())
try:
with open(args.config) as f:
configmap = json.load(f)
except FileNotFoundError:
configmap = {}
def initialize(configmap, rbuffer):
config = Config(configmap)
reference_buffer = Buffer(rbuffer)
@ -59,7 +34,41 @@ def main():
user_buffer.close()
reference_buffer.close()
print(config.get("summary_template").format(stats=application.stats))
application.summarize()
def main():
is_tty = sys.stdin.isatty()
parser = argparse.ArgumentParser()
if is_tty:
parser.add_argument("file", metavar="FILE")
parser.add_argument(
"--config",
"-c",
metavar="FILE",
help="configuration file",
default="~/.config/fasttyper/config.json",
)
args = parser.parse_args()
if is_tty:
with open(os.path.expanduser(args.file)) as f:
rbuffer = io.StringIO(f.read())
else:
input_lines = sys.stdin.readlines()
os.dup2(3, 0)
rbuffer = io.StringIO("".join(input_lines))
try:
with open(os.path.expanduser(args.config)) as f:
configmap = json.load(f)
except FileNotFoundError:
configmap = {}
initialize(configmap, rbuffer)
if __name__ == "__main__":

View file

@ -43,6 +43,10 @@ class Application:
self._running = False
self.stats.signal_stop()
def summarize(self):
self.stats.summarize(self.config.get("summary_template"))
self.stats.export_to_datafile(self.config.get("summary_datafile"))
class StoppingSignal(Exception):
pass

View file

@ -20,6 +20,7 @@ class Config:
"total chars: {stats.total_chars}\n"
"accuracy: {stats.accuracy}%"
),
"summary_datafile": "~/.config/cache/fasttyper/datafile.csv",
}
def __init__(self, configmap):

View file

@ -1,5 +1,8 @@
from .listener import Action
from datetime import datetime
import os
import csv
import pathlib
class Stats:
@ -72,3 +75,45 @@ class Stats:
if self.total_chars:
return self.correct_chars / self.total_chars * 100
return 100
def summarize(self, template):
print(template.format(stats=self))
def produce_record(self):
return {
"start_dtime": self.start_dtime.isoformat(),
"stop_dtime": self.stop_dtime.isoformat(),
"total_seconds": self.total_seconds,
"total_minutes": self.total_minutes,
"total_chars": self.total_chars,
"correct_chars": self.correct_chars,
"incorrect_chars": self.incorrect_chars,
"total_words": self.total_words,
"correct_words": self.correct_words,
"incorrect_words": self.incorrect_words,
"wpm": self.wpm,
"cpm": self.cpm,
"raw_wpm": self.raw_wpm,
"raw_cpm": self.raw_cpm,
"accuracy": self.accuracy,
}
def export_to_datafile(self, datafile):
if datafile is None:
return
datafile = os.path.expanduser(datafile)
data_dir, filename = os.path.split(datafile)
pathlib.Path(data_dir).mkdir(exist_ok=True, parents=True)
exists = os.path.isfile(datafile)
record = self.produce_record()
with open(datafile, "w") as f:
writter = csv.DictWriter(f, fieldnames=record.keys())
if not exists:
writter.writeheader()
writter.writerow(record)