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.
This commit is contained in:
Cormac Shannon
2026-04-07 19:07:21 +01:00
parent 20e62f60f6
commit 18ce7e57cf
13 changed files with 943 additions and 206 deletions

View File

@@ -0,0 +1,150 @@
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" }