Skip to content

Commit

Permalink
Merge pull request #69 from hey2022/feat/learning-task-list
Browse files Browse the repository at this point in the history
Better format of tasks
  • Loading branch information
hey2022 authored Dec 13, 2024
2 parents 802ff71 + 950cf90 commit d00c13b
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 22 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ tls-xb is a cli tool that fetches scores and GPA from [Tsinglan Xiaobao](https:/
- View scores from previous semesters.
- Color coded scores depending on performance.
- Tabled output.
- Tasks (`-t`, `--tasks`)
- View task scores, even for unreleased tasks.
- View proportion of each individual task.

## Prerequisites

Expand Down
45 changes: 29 additions & 16 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ fn print_subject(subject: &Subject, cli: &Cli) {
}
let mut data = vec![(
colorize(&subject.subject_name, &subject.score_level),
format!("{}", (subject.total_score*10.0).round()/10.0),
format!("{}", (subject.total_score * 10.0).round() / 10.0),
subject.score_level.to_string(),
subject.gpa.to_string(),
subject.score_mapping_list_id.to_string() + if subject.elective { " Elective" } else { "" },
Expand All @@ -151,7 +151,7 @@ fn print_subject(subject: &Subject, cli: &Cli) {
let row = get_evaluation_project_row(evaluation_project);
data.push(row);
if cli.tasks {
let tasks = get_evaluation_project_task_list_row(evaluation_project);
let tasks = get_evaluation_project_task_list_row(subject, evaluation_project);
for task in tasks {
data.push(task);
}
Expand All @@ -161,15 +161,19 @@ fn print_subject(subject: &Subject, cli: &Cli) {
continue;
}
for evaluation_project in &evaluation_project.evaluation_project_list {
if !evaluation_project.score_is_null {
let mut row = get_evaluation_project_row(evaluation_project);
row.0.insert_str(0, "- ");
data.push(row);
if evaluation_project.score_is_null {
continue;
}

let mut row = get_evaluation_project_row(evaluation_project);
row.0.insert_str(0, "- ");
row.4.insert_str(0, "- ");
data.push(row);
if cli.tasks {
let mut tasks = get_evaluation_project_task_list_row(evaluation_project);
let mut tasks = get_evaluation_project_task_list_row(subject, evaluation_project);
for task in &mut tasks {
task.0.insert(0, '-');
task.4.insert(0, '-');
data.push(task.clone());
}
}
Expand All @@ -190,17 +194,19 @@ fn get_evaluation_project_row(
&evaluation_project.evaluation_project_e_name,
&evaluation_project.score_level,
),
format!("{}", (evaluation_project.score*10.0).round()/10.0),
format!("{}", (evaluation_project.score * 10.0).round() / 10.0),
evaluation_project.score_level.to_string(),
evaluation_project.gpa.to_string(),
format!(
"{}% ({}%)",
(evaluation_project.adjusted_proportion*100.0).round()/100.0, (evaluation_project.proportion*100.0).round()/100.0
(evaluation_project.adjusted_proportion * 100.0).round() / 100.0,
(evaluation_project.proportion * 100.0).round() / 100.0
),
)
}

fn get_evaluation_project_task_list_row(
subject: &Subject,
evaluation_project: &EvaluationProject,
) -> Vec<(String, String, String, String, String)> {
let mut task_rows = Vec::new();
Expand All @@ -211,19 +217,26 @@ fn get_evaluation_project_task_list_row(
.collect();
for learning_task in &learning_tasks {
let weight = evaluation_project.adjusted_proportion / learning_tasks.len() as f64;
let score =
(learning_task.score.unwrap_or(f64::NAN) / learning_task.total_score * 100.0 * 100.0)
.round()
/ 100.0;
let row = (
format!("- {}", learning_task.name),
format!(
"{:4} / {}",
learning_task.score.unwrap_or(f64::NAN),
learning_task.total_score
"- {}",
colorize(
&learning_task.name,
&score_level_from_score(score, &subject.score_mapping_list)
)
),
format!(
"{:.2}%",
learning_task.score.unwrap_or(f64::NAN) / learning_task.total_score * 100.0
"{} / {}",
learning_task.score.unwrap_or(f64::NAN),
learning_task.total_score
),
format!("{score}%"),
String::new(),
format!("- {weight:.2}%"),
format!("- {}%", (weight * 100.0).round() / 100.0),
);
task_rows.push(row);
}
Expand Down
15 changes: 9 additions & 6 deletions src/subject.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ pub struct Subject {
pub total_score: f64,
pub evaluation_projects: Vec<EvaluationProject>,
pub score_mapping_list_id: ScoreMappingId,
pub score_mapping_list: Vec<ScoreMappingConfig>,
pub gpa: f64,
pub max_gpa: f64,
pub unweighted_gpa: f64,
Expand All @@ -47,21 +48,22 @@ pub async fn get_subject(
let evaluation_projects = get_subject_evaluation_projects(client, &subject_detail).await;
let total_score = get_subject_score(&evaluation_projects);
let score_mapping_list_id = get_score_mapping_list_id(&subject_detail);
let score_mapping_list = &score_mapping_lists[&score_mapping_list_id];
let gpa = gpa_from_score(total_score, score_mapping_list);
let max_gpa = gpa_from_score(100.0, score_mapping_list);
let score_mapping_list = score_mapping_lists[&score_mapping_list_id].clone();
let gpa = gpa_from_score(total_score, &score_mapping_list);
let max_gpa = gpa_from_score(100.0, &score_mapping_list);
let unweighted_gpa = gpa_from_score(
total_score,
&score_mapping_lists[&ScoreMappingId::NonWeighted],
);
let score_level = score_level_from_score(total_score, score_mapping_list);
let score_level = score_level_from_score(total_score, &score_mapping_list);
Subject {
subject_name: subject_detail.subject_name,
subject_id,
class_id: subject_detail.class_id,
total_score,
evaluation_projects,
score_mapping_list_id,
score_mapping_list,
gpa,
max_gpa,
unweighted_gpa,
Expand Down Expand Up @@ -162,8 +164,9 @@ async fn get_subject_evaluation_projects(
.map(|evaluation_project| evaluation_project.proportion)
.sum();
for sub_evaluation_project in &mut evaluation_project.evaluation_project_list {
sub_evaluation_project.adjusted_proportion =
sub_evaluation_project.proportion / total_proportion * evaluation_project.adjusted_proportion;
sub_evaluation_project.adjusted_proportion = sub_evaluation_project.proportion
/ total_proportion
* evaluation_project.adjusted_proportion;
}
}
evaluation_projects
Expand Down

0 comments on commit d00c13b

Please sign in to comment.