1.4.0: Basic implementation of grades

This commit is contained in:
Adam Blažek 2020-09-27 15:51:44 +02:00
parent e38fe7d1c3
commit 2005610c7c
3 changed files with 66 additions and 5 deletions

View File

@ -1,6 +1,6 @@
# Package
version = "1.3.4"
version = "1.4.0"
author = "Adam Blažek"
description = "CLI client for Bakaláři"
license = "GPL-3.0"
@ -12,6 +12,8 @@ bin = @["bk"]
# Dependencies
requires "nim >= 1.2.4"
requires "cligen >= 1.2.0"
requires "elvis >= 0.2.0"
requires "colorize >= 0.2.0"
requires "elvis >= 0.2.0"
requires "zero_functional >= 1.2.0"

View File

@ -1,11 +1,21 @@
import httpcore, httpclient, json, options, strformat, tables, times, uri
import elvis
import elvis, zero_functional
type
Bakalari* = ref object
website*: Uri
accessToken*: string
refreshToken*: string
Grade* = object
text*: string
weight*: int
caption*: string
addTime*: DateTime
editTime*: DateTime
GradedSubject* = object
name*: string
abbrev*: string
grades*: seq[Grade]
Homework* = object
id*: string
subject*: string
@ -113,6 +123,23 @@ proc postEndpoint*(bakalari: Bakalari, endpoint: string): JsonNode =
bakalari.renewTokens
result = body.parseJson
iterator grades*(bakalari: Bakalari): GradedSubject =
let root = bakalari.getEndpoint("marks")
for subjectNode in root{"Subjects"}:
yield GradedSubject(
name: subjectNode{"Subject"}{"Name"}.getStr,
abbrev: subjectNode{"Subject"}{"Abbrev"}.getStr,
grades: subjectNode{"Marks"} --> (gradeNode) --> map(
Grade(
text: gradeNode{"MarkText"}.getStr,
weight: gradeNode{"Weight"}.getInt,
caption: gradeNode{"Caption"}.getStr,
addTime: gradeNode{"MarkDate"}.getStr.parse(iso8601),
editTime: gradeNode{"EditDate"}.getStr.parse(iso8601),
)
)
)
iterator homework*(bakalari: Bakalari): Homework =
let root = bakalari.getEndpoint("homeworks")
for node in root{"Homeworks"}.getElems:

View File

@ -1,6 +1,7 @@
import json, net, options, os, times, unicode, uri
import json, net, options, os, strscans, times, unicode, uri
from strutils import ffDecimal, formatFloat
import cligen, colorize, elvis
from bakalari as baka import newBakalari
from bakalari as baka import Grade, newBakalari
type
Config = object
@ -65,6 +66,34 @@ proc signin(
)
configFile.saveConfig(config)
proc average(grades: seq[Grade]): float =
var sum, weightSum: float
for grade in grades:
var value: int
if scanf(grade.text, "$i-", value):
sum += (value.float + 0.5) * grade.weight.float
weightSum += grade.weight.float
elif scanf(grade.text, "$i", value):
sum += value.float * grade.weight.float
weightSum += grade.weight.float
return weightSum ? (sum / weightSum) ! 0.0
proc grades(
configFile = defaultConfigFile,
) =
## display the list of grades and calculate averages
withBakalari(configFile):
for subject in baka.grades(bakalari):
stdout.writeLine subject.name.fgLightYellow & " " & subject.grades.average.formatFloat(ffDecimal, 2)
for grade in subject.grades:
var line = ""
line &= grade.text.align(2).fgLightMagenta
line &= " "
line &= ($grade.weight).align(2).fgLightCyan
line &= " "
line &= grade.caption
stdout.writeLine line
proc homework(
configFile = defaultConfigFile,
) =
@ -124,6 +153,9 @@ try:
"password": "your password (will not be stored anywhere)",
"config-file": "where to store the credentials",
}],
[grades, help = {
"config-file": "where the credentials are stored",
}],
[homework, help = {
"config-file": "where the credentials are stored",
}],