ArgTools

Argument Handling

ArgTools.ArgReadType
ArgRead = Union{AbstractString, AbstractCmd, IO}

Der ArgRead-Typ ist eine Vereinigung der Typen, die die Funktion arg_read in lesbare IO-Handles umwandeln kann. Siehe arg_read für Details.

source
ArgTools.ArgWriteType
ArgWrite = Union{AbstractString, AbstractCmd, IO}

Die ArgWrite-Typen sind eine Vereinigung der Typen, die die Funktion arg_write in beschreibbare IO-Handles umwandeln kann, mit Ausnahme von Nothing, das arg_write behandelt, indem es eine temporäre Datei erstellt. Siehe arg_write für Details.

source
ArgTools.arg_readFunction
arg_read(f::Function, arg::ArgRead) -> f(arg_io)

Die Funktion arg_read akzeptiert ein Argument arg, das eines der folgenden sein kann:

  • AbstractString: ein Dateipfad, der zum Lesen geöffnet werden soll
  • AbstractCmd: ein Befehl, der ausgeführt wird und von seiner Standardausgabe liest
  • IO: ein offenes IO-Handle, von dem gelesen werden soll

Ob der Körper normal zurückkehrt oder einen Fehler auslöst, ein geöffneter Pfad wird vor der Rückkehr von arg_read geschlossen und ein IO-Handle wird geleert, aber nicht geschlossen, bevor von arg_read zurückgekehrt wird.

Hinweis: Beim Öffnen einer Datei wird ArgTools lock = false an den Datei-open(...)-Aufruf übergeben. Daher sollte das von dieser Funktion zurückgegebene Objekt nicht von mehreren Threads verwendet werden. Diese Einschränkung könnte in Zukunft gelockert werden, was keinen funktionierenden Code brechen würde.

source
ArgTools.arg_writeFunction
arg_write(f::Function, arg::ArgWrite) -> arg
arg_write(f::Function, arg::Nothing) -> tempname()

Die Funktion arg_read akzeptiert ein Argument arg, das eines der folgenden sein kann:

  • AbstractString: ein Dateipfad, der zum Schreiben geöffnet werden soll
  • AbstractCmd: ein auszuführender Befehl, der in seine Standard-Eingabe schreibt
  • IO: ein offenes IO-Handle, in das geschrieben werden soll
  • Nothing: ein temporärer Pfad, in den geschrieben werden soll

Wenn der Körper normal zurückkehrt, wird ein geöffneter Pfad nach Abschluss geschlossen; ein IO-Handle-Argument bleibt offen, wird aber vor der Rückkehr geleert. Wenn das Argument nothing ist, wird ein temporärer Pfad zum Schreiben geöffnet und nach Abschluss geschlossen, und der Pfad wird von arg_write zurückgegeben. In allen anderen Fällen wird arg selbst zurückgegeben. Dies ist ein nützliches Muster, da Sie konsistent zurückgeben können, was auch immer geschrieben wurde, unabhängig davon, ob ein Argument übergeben wurde oder nicht.

Wenn während der Auswertung des Körpers ein Fehler auftritt, wird ein von arg_write zum Schreiben geöffneter Pfad gelöscht, unabhängig davon, ob er als Zeichenfolge übergeben wurde oder ein temporärer Pfad generiert wurde, wenn arg nothing ist.

Hinweis: Beim Öffnen einer Datei wird ArgTools lock = false an den Aufruf open(...) übergeben. Daher sollte das von dieser Funktion zurückgegebene Objekt nicht von mehreren Threads verwendet werden. Diese Einschränkung könnte in Zukunft gelockert werden, was keinen funktionierenden Code brechen würde.

source
ArgTools.arg_isdirFunction
arg_isdir(f::Function, arg::AbstractString) -> f(arg)

Die Funktion arg_isdir nimmt arg, das der Pfad zu einem vorhandenen Verzeichnis sein muss (ansonsten wird ein Fehler ausgelöst), und übergibt diesen Pfad an f, wobei schließlich das Ergebnis von f(arg) zurückgegeben wird. Dies ist definitiv das am wenigsten nützliche Werkzeug, das von ArgTools angeboten wird, und existiert hauptsächlich aus Symmetrie mit arg_mkdir und um konsistente Fehlermeldungen zu geben.

source
ArgTools.arg_mkdirFunction
arg_mkdir(f::Function, arg::AbstractString) -> arg
arg_mkdir(f::Function, arg::Nothing) -> mktempdir()

Die Funktion arg_mkdir nimmt arg, das entweder eines der folgenden sein muss:

  • ein Pfad zu einem bereits vorhandenen leeren Verzeichnis,
  • ein nicht vorhandener Pfad, der als Verzeichnis erstellt werden kann, oder
  • nothing, in diesem Fall wird ein temporäres Verzeichnis erstellt.

In allen Fällen wird der Pfad zum Verzeichnis zurückgegeben. Wenn ein Fehler während f(arg) auftritt, wird das Verzeichnis in seinen ursprünglichen Zustand zurückversetzt: Wenn es bereits existierte, aber leer war, wird es geleert; wenn es nicht existierte, wird es gelöscht.

source

Function Testing

ArgTools.arg_readersFunction
arg_readers(arg :: AbstractString, [ type = ArgRead ]) do arg::Function
    ## Vor-Testeinrichtung ##
    @arg_test arg begin
        arg :: ArgRead
        ## Test mit `arg` ##
    end
    ## Nach-Testbereinigung ##
end

Die Funktion arg_readers nimmt einen Pfad zum Lesen und einen Do-Block mit einem einzelnen Argument, der einmal für jeden Testlesertyp aufgerufen wird, den arg_read verarbeiten kann. Wenn das optionale Argument type angegeben ist, wird der Do-Block nur für Leser aufgerufen, die Argumente dieses Typs erzeugen.

Das arg, das an den Do-Block übergeben wird, ist nicht der Argumentwert selbst, da einige Testargumenttypen für jeden Testfall initialisiert und finalisiert werden müssen. Betrachten Sie ein offenes Dateihandle-Argument: Sobald Sie es für einen Test verwendet haben, können Sie es nicht erneut verwenden; Sie müssen es schließen und die Datei für den nächsten Test erneut öffnen. Diese Funktion arg kann in eine ArgRead-Instanz umgewandelt werden, indem Sie @arg_test arg begin ... end verwenden.

source
ArgTools.arg_writersFunction
arg_writers([ type = ArgWrite ]) do path::String, arg::Function
    ## Vor-Testeinrichtung ##
    @arg_test arg begin
        arg :: ArgWrite
        ## Test mit `arg` ##
    end
    ## Nach-Testbereinigung ##
end

Die Funktion arg_writers nimmt einen do-Block, der einmal für jeden Testschreiber-Typ aufgerufen wird, den arg_write verarbeiten kann, mit einem temporären (nicht existierenden) path und arg, das in verschiedene beschreibbare Argumenttypen umgewandelt werden kann, die in path schreiben. Wenn das optionale Argument type angegeben ist, wird der do-Block nur für Schreiber aufgerufen, die Argumente dieses Typs erzeugen.

Das arg, das an den do-Block übergeben wird, ist nicht der Argumentwert selbst, da einige Testargumenttypen für jeden Testfall initialisiert und finalisiert werden müssen. Betrachten Sie ein offenes Dateihandle-Argument: Sobald Sie es für einen Test verwendet haben, können Sie es nicht erneut verwenden; Sie müssen es schließen und die Datei für den nächsten Test erneut öffnen. Diese Funktion arg kann in eine ArgWrite-Instanz umgewandelt werden, indem Sie @arg_test arg begin ... end verwenden.

Es gibt auch eine arg_writers-Methode, die einen Pfadnamen wie arg_readers akzeptiert:

arg_writers(path::AbstractString, [ type = ArgWrite ]) do arg::Function
    ## Vor-Testeinrichtung ##
    @arg_test arg begin
        # hier `arg :: ArgWrite`
        ## Test mit `arg` ##
    end
    ## Nach-Testbereinigung ##
end

Diese Methode ist nützlich, wenn Sie path angeben müssen, anstatt den von tempname() generierten Pfadnamen zu verwenden. Da path von außerhalb von arg_writers übergeben wird, ist der Pfad in dieser Form kein Argument für den do-Block.

source
ArgTools.@arg_testMacro
@arg_test arg1 arg2 ... body

Das @arg_test Makro wird verwendet, um arg Funktionen, die von arg_readers und arg_writers bereitgestellt werden, in tatsächliche Argumentwerte umzuwandeln. Wenn Sie @arg_test arg body schreiben, ist es äquivalent zu arg(arg -> body).

source