Files
lush_grading/tasks/filesystem/todo_manager.toml
Cormac Shannon 18ce7e57cf Revamp questionnaire, parallelize run-all, add new tasks
- Replace 6 compound Likert questions with 12 atomic ones grouped by
  dimension (syntax, expressiveness, data/IO, errors, overall); drop
  free-form question. Responses now stored as ints, not strings.
- Back-compat layer maps legacy keys to new dimensions so existing
  results still render.
- Parallelize run-all with ThreadPoolExecutor (configurable workers)
  and add a thread-safe min-request-interval rate limiter to the
  Anthropic provider.
- Add new tasks: path_normalizer, todo_manager, currency_converter,
  locale_weather_url, network_info_parser, url_normalizer.
2026-04-07 19:07:21 +01:00

151 lines
3.2 KiB
TOML

name = "todo_manager"
category = "filesystem"
mode = "convert"
description = """
A simple todo list manager. Read commands from stdin, one per line:
add <task text> — append the task to the todo file
list — print all tasks numbered as "NN). <task>"
remove <N> — remove task number N (1-based)
clear — remove all tasks
The todo file is "todo.txt" in the working directory.
When listing, pad task numbers to two digits (01, 02, …).
After "add" or "remove", automatically list the remaining tasks.
If the list is empty, print "No tasks found".
"""
bash_source = '''
#!/bin/bash
TODOFILE="./todo.txt"
list_tasks() {
if [ -f "$TODOFILE" ] && [ -s "$TODOFILE" ]; then
count=1
IFS=$'\\n'
while read -r task; do
num=$count
if [ $count -lt 10 ]; then num="0$count"; fi
echo "$num). $task"
count=$(( count + 1 ))
done < "$TODOFILE"
else
echo "No tasks found"
fi
}
add_task() {
echo "$1" >> "$TODOFILE"
}
remove_task() {
taskNum=$1
totalLines=$(wc -l < "$TODOFILE" | tr -d ' ')
if [ "$taskNum" -gt "$totalLines" ] 2>/dev/null; then
echo "Error: task number $taskNum does not exist!"
return 1
fi
tmpfile="./todo_tmp.txt"
count=1
IFS=$'\\n'
while read -r task; do
if [ "$count" -ne "$taskNum" ]; then
echo "$task" >> "$tmpfile"
fi
count=$(( count + 1 ))
done < "$TODOFILE"
if [ -f "$tmpfile" ]; then
mv "$tmpfile" "$TODOFILE"
else
> "$TODOFILE"
fi
echo "Sucessfully removed task number $taskNum"
}
clear_tasks() {
> "$TODOFILE"
echo "Tasks cleared."
}
if [ ! -f "$TODOFILE" ]; then
touch "$TODOFILE"
fi
while IFS= read -r line || [[ -n "$line" ]]; do
cmd=$(echo "$line" | cut -d' ' -f1)
arg=$(echo "$line" | cut -d' ' -f2-)
case "$cmd" in
add)
add_task "$arg"
list_tasks
;;
list)
list_tasks
;;
remove)
remove_task "$arg"
list_tasks
;;
clear)
clear_tasks
;;
esac
done
'''
[[test_cases]]
description = "Add tasks then list"
stdin = """add Buy groceries
add Walk the dog
list"""
expected_stdout = """01). Buy groceries
01). Buy groceries
02). Walk the dog
01). Buy groceries
02). Walk the dog"""
[[test_cases]]
description = "Add, remove, list"
stdin = """add First task
add Second task
add Third task
remove 2
list"""
expected_stdout = """01). First task
01). First task
02). Second task
01). First task
02). Second task
03). Third task
Sucessfully removed task number 2
01). First task
02). Third task
01). First task
02). Third task"""
[[test_cases]]
description = "Empty list and clear"
stdin = """list
add Something
clear
list"""
expected_stdout = """No tasks found
01). Something
Tasks cleared.
No tasks found"""
[[test_cases]]
description = "Works with pre-existing todo file"
stdin = """list
add Third item
list"""
setup_files = { "todo.txt" = "Existing item one\nExisting item two\n" }
expected_stdout = """01). Existing item one
02). Existing item two
01). Existing item one
02). Existing item two
03). Third item
01). Existing item one
02). Existing item two
03). Third item"""
expected_files = { "todo.txt" = "Existing item one\nExisting item two\nThird item\n" }