CourseLink CSV grading helper
Project description
CourseLink CSV Grading Helper
This project is a Typer CLI for CourseLink CSV exports.
The source lives under src/, and the packaged CLI command is courselink-grader.
It uses color-coded terminal output via rich to make statuses and workflow steps easier to follow.
What it does
Option 1 (option1)
- Loads a CourseLink export CSV.
- If
fzfis installed, prompts whether to usefzffor CSV selection. - Detects the assignment grade column by matching
"Points Grade"in the header. - Creates a new CSV that is ready to import by removing rows where the grade cell is empty.
- Keeps all columns and headers unchanged for remaining rows, including
End-of-Line Indicator. - Keeps valid
0grades.
Option 2 (option2)
- Opens a CSV and runs an interactive grading harness.
- If
fzfis installed, prompts whether to usefzffor CSV and student selection. - Without
fzf, the built-in CSV picker starts at the current working directory by default and behaves like a simple directory tree:- arrow keys move the selection
EnterorRightopens a directory or selects a CSVLeftorBackspacemoves to the parent directory
--root PATHlets you override where CSV browsing starts.- In
fzfmode, student matching uses case-insensitive fuzzy matching against a hidden search key (name, username, IDs) while showing a clean display column for stable selection. - Uses ranked fuzzy search (live filter, arrow keys, Enter) to find students by:
Last NameFirst NameUsernameOrgDefinedId
- Prioritizes stronger matches (for example,
Coleshould rank above weaker partial matches). - If you press Enter after typing a close match (even without explicitly accepting completion text), it resolves to the best student match.
- Displays
UsernameandOrgDefinedIdwithout the leading#for readability (the saved CSV still keeps original values). - If
fzfselection is cancelled or fails, it falls back to the built-in picker. - Lets you enter decimal grades and validates:
- grade is not empty
- grade is numeric
- grade is not negative
- grade is
<= MaxPointsparsed from header text like:Homework 6 Points Grade <Numeric MaxPoints:12 Weight:1>
- Autosaves after every entered grade into a progress CSV in the current directory.
- Supports resume by reopening that progress CSV.
- Keyboard controls:
Ctrl-Q: quitCtrl-B: jump to previously graded student
Install
Install from PyPI
After publishing, the simplest global installs are:
uv tool install courselink-grader
# or
pipx install courselink-grader
That puts courselink-grader on your PATH, so you can run it from any directory.
Install from this repo during development
uv tool install .
# or, for a project-local environment:
uv sync
Usage
Run courselink-grader from the directory that contains your grading files, or pass --root to browse somewhere else.
CSV files can live directly in the current directory or in nested folders such as ./grading/assignments/assignment1.csv.
Run menu mode (choose option 1 or 2):
courselink-grader
Direct command usage:
# Option 1: ready-to-import CSV
courselink-grader option1
courselink-grader option1 --csv "grading/assignments/assignment1.csv" --out "ready_import.csv"
courselink-grader option1 --root "~/Courses/CS101"
# Option 2: grading harness
courselink-grader option2
courselink-grader option2 --csv "grading/assignments/assignment1.csv"
courselink-grader option2 --csv "grading/assignments/assignment1.csv" --progress-out "my_progress.csv"
courselink-grader option2 --root "~/Courses/CS101"
Notes
- When
--csvis not provided, CSV selection starts at the current working directory by default. - The built-in picker shows only directories that contain at least one CSV somewhere below them, plus CSV files in the current directory.
fzfmode searches recursively across CSV paths under the active browse root.fzfis optional and not a Python dependency; install separately if desired.- Progress files use
__progress.csvsuffix by default. - Output from option 1 uses
__ready_to_import.csvsuffix by default.
Release Workflow
- For local publishing, use a PyPI token with
UV_PUBLISH_TOKENinstead of entering credentials interactively. - For CI/CD publishing, this repo includes GitHub Actions workflows for pull-request CI and tagged PyPI releases.
- The recommended flow is feature branch -> pull request -> merge to
main-> version bump ->vX.Y.Ztag -> publish workflow. - Detailed setup and release steps are in
RELEASING.md.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file courselink_grader-0.1.2.tar.gz.
File metadata
- Download URL: courselink_grader-0.1.2.tar.gz
- Upload date:
- Size: 14.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5180034bb5d2294b0aacc1735ac7694f66a8ebe91907e38de43534628e461ce2
|
|
| MD5 |
44dc6d8a3edd17e8f8f13c2ac69ddb7c
|
|
| BLAKE2b-256 |
320c1f57600974a4f3ff925357708095c3c1621d5eb4a1a0958c46635a32f109
|
File details
Details for the file courselink_grader-0.1.2-py3-none-any.whl.
File metadata
- Download URL: courselink_grader-0.1.2-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.9 {"installer":{"name":"uv","version":"0.10.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfdc3950e3813797d1f46d670f0062a48c4baa92d8625261e08da7800088dd2f
|
|
| MD5 |
27979e5d2bc635878c550f6a19171706
|
|
| BLAKE2b-256 |
b169419b9734ef78e52e0335f5961f96b3c83a226451e9e6e5f25a51d66daa85
|