Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| howto:git:classroom50:cli [2026/08/18 12:23] – Sync aus BZZ-Commons/pygrader50 admin | howto:git:classroom50:cli [2026/08/25 10:07] (aktuell) – Veraltet - Inhalt jetzt unter github.com/BZZ-Commons/pygrader50/docs admin | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== Classroom 50: CLI-Referenz ====== | ||
| - | |||
| - | Zwei Kommandos aus [[https:// | ||
| - | eines bewertet, eines überträgt. Dazu ein Migrationsskript. | ||
| - | |||
| - | ===== python -m pygrader50 — bewerten ===== | ||
| - | |||
| - | Wird vom Classroom-50-Runner im Studi-Checkout aufgerufen. Keine Argumente — | ||
| - | alles kommt aus der Umgebung. | ||
| - | |||
| - | ==== Umgebung ==== | ||
| - | |||
| - | ^ Variable ^ Bedeutung ^ Pflicht ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | ==== Ausgabe ==== | ||
| - | |||
| - | ^ Datei ^ Inhalt ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | ==== Exit-Codes ==== | ||
| - | |||
| - | ^ Code ^ Bedeutung ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | Eine fehlende Bewertungs-Konfiguration ist **kein** Fehler: 0/0 mit Warnung im | ||
| - | Log, Exit 0. | ||
| - | |||
| - | ==== Lokal ausprobieren ==== | ||
| - | |||
| - | <code bash> | ||
| - | cd / | ||
| - | CLASSROOM=m320-ix25 \ | ||
| - | ASSIGNMENT=m320-lu04-a4-objektkommunikation \ | ||
| - | SUBMISSION_TAG=submit/ | ||
| - | OWNER=anna \ | ||
| - | python -m pygrader50 | ||
| - | cat release-body.md | ||
| - | </ | ||
| - | |||
| - | ===== python -m pygrader50.moodle — übertragen ===== | ||
| - | |||
| - | Liest '' | ||
| - | Kombination aus Aufgabe und Person geht die **neueste** Abgabe raus. | ||
| - | |||
| - | < | ||
| - | python -m pygrader50.moodle SCORES [Optionen] | ||
| - | </ | ||
| - | |||
| - | ==== Argumente und Optionen ==== | ||
| - | |||
| - | ^ Option ^ Wirkung ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | Der bei '' | ||
| - | eigene Lehrer-Account ist es meist nicht — Moodle antwortet dann | ||
| - | '' | ||
| - | |||
| - | ==== Umgebung ==== | ||
| - | |||
| - | ^ Variable ^ Bedeutung ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | Ohne '' | ||
| - | |||
| - | ==== Zustandsfile ==== | ||
| - | |||
| - | <code javascript> | ||
| - | { | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Übersprungen wird nur, wenn Abgabe **und** Punktzahl identisch sind — eine | ||
| - | Nachbewertung derselben Abgabe geht also erneut raus. Nur erfolgreiche | ||
| - | Übertragungen werden vermerkt; gescheiterte versucht der nächste Lauf wieder. | ||
| - | |||
| - | ==== Exit-Codes ==== | ||
| - | |||
| - | ^ Code ^ Bedeutung ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | Ein Fehler bricht den Lauf **nicht** ab: die übrigen Abgaben gehen trotzdem raus. | ||
| - | |||
| - | ==== Beispiele ==== | ||
| - | |||
| - | <code bash> | ||
| - | # Trockenlauf über alles, ohne Zugangsdaten | ||
| - | python -m pygrader50.moodle < | ||
| - | |||
| - | # Eine einzelne Person nachtragen | ||
| - | python -m pygrader50.moodle < | ||
| - | |||
| - | # Eine Aufgabe nach einer Nachbewertung komplett neu schicken | ||
| - | python -m pygrader50.moodle < | ||
| - | |||
| - | # Wie der Nachtlauf | ||
| - | python -m pygrader50.moodle < | ||
| - | --state < | ||
| - | </ | ||
| - | |||
| - | Ohne lokalen Klon des Config-Repos reicht die Datei allein: | ||
| - | |||
| - | <code bash> | ||
| - | gh api repos/< | ||
| - | -H ' | ||
| - | GH_TOKEN=$(gh auth token) python -m pygrader50.moodle scores.json --dry-run | ||
| - | </ | ||
| - | |||
| - | ==== Von Hand auslösen ==== | ||
| - | |||
| - | <code bash> | ||
| - | gh workflow run moodle-sync.yaml --repo < | ||
| - | -f classroom=< | ||
| - | </ | ||
| - | |||
| - | Oder im Config-Repo unter **Actions → Moodle Sync → Run workflow**. Bleibt das | ||
| - | Klassenzimmer leer, laufen alle Ordner mit einer '' | ||
| - | |||
| - | ===== scripts/ | ||
| - | |||
| - | Entfernt den alten GitHub-Classroom-Workflow aus den Template-Repos einer | ||
| - | migrierten Klasse und aus den bereits angenommenen Studi-Repos. | ||
| - | |||
| - | < | ||
| - | scripts/ | ||
| - | </ | ||
| - | |||
| - | ^ Aufruf ^ Wirkung ^ | ||
| - | | ohne '' | ||
| - | | mit '' | ||
| - | |||
| - | Die Zielliste kommt aus dem '' | ||
| - | ''< | ||
| - | Template-Organisation. Wiederholbar; | ||
| - | Fehler. Exit 1, sobald ein Repo scheitert. | ||
| - | |||
| - | Hintergrund und die nötige Token-Rotation: | ||
| - | |||
| - | ===== scripts/ | ||
| - | |||
| - | Hebt die Werkzeug-Versionen in den Template-Repos einer Klasse und legt | ||
| - | '' | ||
| - | |||
| - | < | ||
| - | scripts/ | ||
| - | </ | ||
| - | |||
| - | ^ Was ^ Verhalten ^ | ||
| - | | '' | ||
| - | | '' | ||
| - | | alles andere | bleibt Zeile für Zeile erhalten, inkl. Kommentaren | | ||
| - | | '' | ||
| - | |||
| - | Die Versionen stehen als Block am Kopf des Skripts und werden einmal pro | ||
| - | Semester angefasst. Wiederholbar: | ||
| - | |||
| - | <WRAP center round important 90%> | ||
| - | '' | ||
| - | sich nicht gemeinsam auflösen. Pakete, welche die Lernenden im Rahmen der | ||
| - | Aufgabe selbst eintragen sollen (Flask in den lu06-Aufgaben), | ||
| - | in die Pin-Liste. | ||
| - | </ | ||
| - | |||
| - | ===== scripts/ | ||
| - | |||
| - | Schreibt in jedes Template einen Modul-Docstring, | ||
| - | auf ihre Seite in diesem Wiki zeigt. | ||
| - | |||
| - | < | ||
| - | scripts/ | ||
| - | </ | ||
| - | |||
| - | <code python> | ||
| - | """ | ||
| - | |||
| - | Aufgabenstellung: | ||
| - | """ | ||
| - | </ | ||
| - | |||
| - | ^ Was ^ Verhalten ^ | ||
| - | | Zieldatei | die erste Datei aus '' | ||
| - | | vorhandener Modul-Docstring | wird ersetzt, nicht ergänzt | | ||
| - | | Datei ohne gültiges Python | Docstring wird vorangestellt, | ||
| - | | Aufgabe ohne eindeutige Wiki-Seite | '' | ||
| - | |||
| - | <WRAP center round important 90%> | ||
| - | Der Slug führt **nicht** zur Wiki-Seite: '' | ||
| - | unter '' | ||
| - | gegen die Seitennamen verschoben ('' | ||
| - | Schlüssel ist der Code '' | ||
| - | eine Aufgabenseite umbenennt, darf den Code nicht verlieren. | ||
| - | </ | ||
| - | |||
| - | Trägt ein Code mehrere Seiten, entscheidet der '' | ||
| - | Skripts — sonst wird übersprungen. Wiederholbar: | ||
| - | '' | ||
| - | |||
| - | ===== scripts/ | ||
| - | |||
| - | Spiegelt den Ordner '' | ||
| - | '' | ||
| - | '' | ||
| - | |||
| - | < | ||
| - | scripts/ | ||
| - | </ | ||
| - | |||
| - | Geschrieben wird nur, was abweicht — ein erneuter Lauf meldet alles als | ||
| - | '' | ||
| - | Umgebung: '' | ||
| - | '' | ||
| - | |||
| - | <WRAP center round important 90%> | ||
| - | Ein untauglicher API-Token wird **nicht abgelehnt, sondern ignoriert** — die | ||
| - | Aufrufe laufen dann als Gast weiter und scheitern erst beim Schreiben mit einer | ||
| - | 401, die wie ein falsches Passwort aussieht. Das Skript prüft deshalb vor dem | ||
| - | Schreiben per '' | ||
| - | fällt bei totem Token auf die Anmeldung per '' | ||
| - | </ | ||
| - | |||
| - | ===== gh teacher — Klassenzimmer verwalten ===== | ||
| - | |||
| - | <code bash> | ||
| - | gh extension install foundation50/ | ||
| - | gh auth refresh -h github.com -s admin: | ||
| - | |||
| - | gh teacher classroom list <ORG> | ||
| - | gh teacher autograder show <ORG> < | ||
| - | gh teacher autograder list <ORG> < | ||
| - | gh teacher autograder set-default <ORG> < | ||
| - | gh teacher rotate-service-token <ORG> | ||
| - | </ | ||
| - | |||
| - | Vollständige Referenz: [[https:// | ||