Skip to main content

Ein Tool um Projektversionen zu generieren

Project description

Java Musterlösung (kurz jml) ist ein kleines Skript mit dem mehrere Projektversionen aus einer Musterlösung generiert werden können.

jml wurde ursprünglich für Java-Projekte entwickelt, kann aber durch diverse Optionen auch für andere Projekte genutzt werden.

Motivation

Zur Differenzierung im Informatikunterricht erstelle ich gerne mehrere Projektversionen mit mehr oder weniger Hilfestellungen, um dem Leistungsstand der Schülerinnen und Schüler besser gerecht zu werden. Inklusive einer Musterlösung können so schnell drei bis vier Projektversionen entstehen, die parallel weiterentwickelt werden müssen.

Befindet sich ein Fehler im Code, sollen die Aufgaben angepasst werden oder hat sich einfach ein Rechtschreibfehler in einen Kommentar eingeschlichen, müssen alle Projektversionen angepasst werden. Dabei habe ich schnell mal eine Version vergessen oder einen neuen Fehler eingebaut.

Vor einigen Jahren habe ich den Prozess mit jml vereinfacht. Das Skript generiert aus einer Basisversion, die mit Markierungen für Aufgaben und Lösungen versehen ist, die verschiedenen Projektversionen, die für den Unterricht nötig sind. Anpassungen sind nur noch im Basisprojekt notwendig.

Installation

Die Installation wird wie gewohnt mit pypi durchgeführt:

$ pip3 install jml

Bei erfolgreicher Installation ist nun das jml Kommando verfügbar.

$ jml --version
jml, version 0.2.4

Manuelle Installation

jml kann auch ohne pip einfach als Skriptdatei genutzt werden. Dazu die aktuelle Version der Datei jml.py aus dem Repository kopieren und auf der Festplatte speichern. Das Skript kann dann mit Python 3 ausgeführt werden:

$ python3 jml.py --version
jml, version 0.2.4

Benutzung

jml benötigt im einfachsten Fall den Pfad des Basisprojektes und den Pfad des Ausgabeordners:

$ jml pfad/zum/ProjektOrdner pfad/zum/ausgabeordner

Nach Ausführung befinden sich in pfad/zum/ausgabeordner die Musterlösung und die Projektversionen.

Die Inhalte und Anzahl an Versionen werden durch die Inhalte der Dateien im Projektordner bestimmt.

Angenommen in ProjektOrdner liegt eine Datei mit dem Namen Beispiel.java mit folgendem Inhalt:

class Example {
    /*aufg*
    // TODO: Erstelle eine Objektvariable "zahl" vom Typ int
    *aufg*/
    //ml*
    private int zahl;
    //*ml

    public int add( int pAndereZahl ) {
        /*aufg*
        // TODO: Gib die Summe aus der Objektvariablen "zahl" und "pAndereZahl" zurück.
        return 0;
        *aufg*/
        //ml*
        return zahl + pAndereZahl;
        //*ml
    }
}

Dann erzeugt jml diese Ordnerstruktur in pfad/zum/ausgabeordner:

pfad/zum/ausgabeordner/
├── ProjektOrdner/
│   └── Beispiel.java
└── ProjektOrdner_ML/
    └── Beispiel.java

Inhalt von ProjektOrdner_ML/Beispiel.java:

class Example {
    private int zahl;

    public int add( int pAndereZahl ) {
        return zahl + pAndereZahl;
    }
}

Inhalt von ProjektOrdner/Beispiel.java:

class Example {
    // TODO: Erstelle eine Objektvariable "zahl" vom Typ int

    public int add( int pAndereZahl ) {
        // TODO: Gib die Summe aus der Objektvariablen "zahl" und "pAndereZahl" zurück.
        return 0;
    }
}

Mehrere Versionen

Als Standard wird wie oben nur die Projektversion 0 erstellt. jml kann aber auch mehrere Projekte erstellen, wenn die Aufgaben-Markierungen mit einer entsprechenden Nummer versehen werden.

Angenommen die Beispiel.java von oben sieht so aus:

class Example {
    /*aufg*
    // TODO: Erstelle eine Objektvariable "zahl" vom Typ int
    *aufg*/
    //ml*
    private int zahl;
    //*ml

    public int add( int pAndereZahl ) {
        /*aufg*
        // TODO: Gib die Summe aus der Objektvariablen "zahl" und "pSummand" zurück.
        return 0;
        *aufg*/
        //ml*
        return zahl + pAndereZahl;
        //*ml
    }

    /*aufg* 2
    public int sub( int pAndereZahl ) {
        // TODO: Gib die Differenz aus der Objektvariablen "zahl" und "pSummand" zurück.
        return 0;
    }
    *aufg*/

}

Dann wird werden statt der Version 0 die Projektversionen 1 und 2 erzeugt, da im zweiten Aufgaben-Marker eine konkrete Versionsnummer angegeben wurde:

pfad/zum/ausgabeordner/
├── ProjektOrdner_1/
│   └── Beispiel.java
├── ProjektOrdner_2/
│   └── Beispiel.java
└── ProjektOrdner_ML/
    └── Beispiel.java

Es ist auch möglich eine Markierung für mehrere Projektversionen zu nutzen:

/*aufg* >1
// Taucht nur in Projektversionen nach Version 1 auf.
*aufg*/

/*aufg* !=2
// Taucht in allen Projektversionen außer 2 auf.
*aufg*/

/*aufg* <= 2
// Taucht nur in Projektversionen 1 und 2 auf.
*aufg*/

Optionen

Die Funktion von jml ist durch eine Vielzahl von Optionen anpassbar. Die Optionen können als Kommandozeilen-Argumente übergeben, oder in Konfigurationsdateien gespeichert werden.

Eine Übersicht der verfügbaren Kommandozeilen-Argumente ist mit -h abrufbar

$ jml -h

Alle Optionen (und noch eine Handvoll mehr) lassen sich auch in einer von mehreren Konfigurationsdateien festlegen. jml sucht dazu bei jedem Start nach .jml Dateien im Basisprojekt, im Gruppenverzeichnis (--project-root) und im Home-Ordner des angemeldeten Nutzers (~/.jml).

Die Konfigurationen werden dann in umgekehrter Reihenfolge geladen, die Einstellungen im Basisprojekt haben also die höchste Priorität. Sie werden nur noch von Kommandozeilen-Argumente überschrieben.

Für das Beispiel oben könnte der Aufbau so aussehen:

~/
├── .jml
├── pfad/zur/gruppe/
│   ├── .jml
│   └── ProjektOrdner/
│       ├── .jml
│       └── Beispiel.java
└── pfad/zum/ausgabeordner

Inhalt von ~/.jml:

[settings]
opening tag=/*<aufgabe>
closing tag=</aufgabe>*/
opening ml tag=//<loesung>
closing ml tag=//</loesung>

Inhalt von ~/pfad/zur/gruppe/.jml:

[settings]
zip = yes
ml suffix = Loesung
name format = {project}-{version}
include = *.java,*.txt

Inhalt von ~/pfad/zur/gruppe/ProjektOrdner/.jml:

[settings]
opening tag=/*aufgabe*
closing tag=*aufgabe*/
encoding = iso-8859-1
name = Maeusekampf

Der Aufruf von jml sieht dann so aus:

$ jml --project-root "~/pfad/zur/gruppe" "~/pfad/zur/gruppe/ProjektOrdner" "pfad/zum/ausgabeordner"

jml lädt nun zunächst ~/.jml und setzt die Start- und Endmarkierungen auf eine XML-Variante.

Danach wird ~/pfad/zur/gruppe/.jml geladen, da dies per --project-root Argument als Gruppenverzeichnis gesetzt wurde. Für diese Projektgruppe werden ZIP-Dateien der Projektversionen erzeugt, außerdem wird das Suffix für die Musterlösung von ML auf Loesung geändert. Das Format der Projektnamen wird angepasst (_ durch - ersetzt) und es werden auch .txt Dateien nach den Aufgaben- und Lösungs-Markierungen durchsucht.

Als drittes wird ~/pfad/zur/gruppe/ProjektOrdner/.jml geladen. Hier werden speziell für dieses eine Projekt die Aufgaben-Marker erneut verändert und die Datei-Codierung auf iso-8859-1 (statt utf-8) festgelegt. Schließlich wird noch der Projektname auf Maeusekampf festgelgt, anstatt den Ordnernamen ProjektOrdner zu verwenden.

Die Ausgabe sieht dann so aus (sofern die Aufgaben- und Lösungs-Markierungen in Beispiel.java angepasst wurden):

~/
├── .jml
├── pfad/zur/gruppe/
│   ├── .jml
│   └── ProjektOrdner/
│       ├── .jml
│       └── Beispiel.java
└── pfad/zum/ausgabeordner/
    ├── Maeusekampf-Loesung/
    │   └── Beispiel.java
    ├── Maeusekampf-1/
    │   └── Beispiel.java
    ├── Maeusekampf-2/
    │   └── Beispiel.java
    ├── Maeusekampf-Loesung.zip
    ├── Maeusekampf-1.zip
    └── Maeusekampf-2.zip

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

jml-0.2.4.tar.gz (13.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jml-0.2.4-py3-none-any.whl (10.2 kB view details)

Uploaded Python 3

File details

Details for the file jml-0.2.4.tar.gz.

File metadata

  • Download URL: jml-0.2.4.tar.gz
  • Upload date:
  • Size: 13.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.12 CPython/3.10.1 Darwin/21.2.0

File hashes

Hashes for jml-0.2.4.tar.gz
Algorithm Hash digest
SHA256 c6c495fbd7da20b19d289f629e5d812dca8852ffc56cabf247a1c480f2863cd3
MD5 5afc0bddfca888b11fcfd733458be8ca
BLAKE2b-256 519f3ef309b4087aecd31c5e09843e1a1d7fad4df9ba2b760ddc2b36230d0d73

See more details on using hashes here.

File details

Details for the file jml-0.2.4-py3-none-any.whl.

File metadata

  • Download URL: jml-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 10.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.12 CPython/3.10.1 Darwin/21.2.0

File hashes

Hashes for jml-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 6abdcd80bc84b7c0a1e47ab06ac20d91ff0a5a750ee94e66712e86dac7d1ca16
MD5 599a89d1741e07a8d54e44ad45fdd588
BLAKE2b-256 3efdc82a59e559ea82f1bab39e650daaff188086021494548d069873fe4eb6de

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page