ArgTools
Argument Handling
ArgTools.ArgRead
— TypeArgRead = 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.
ArgTools.ArgWrite
— TypeArgWrite = 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.
ArgTools.arg_read
— Functionarg_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 sollAbstractCmd
: ein Befehl, der ausgeführt wird und von seiner Standardausgabe liestIO
: 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.
ArgTools.arg_write
— Functionarg_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 sollAbstractCmd
: ein auszuführender Befehl, der in seine Standard-Eingabe schreibtIO
: ein offenes IO-Handle, in das geschrieben werden sollNothing
: 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.
ArgTools.arg_isdir
— Functionarg_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.
ArgTools.arg_mkdir
— Functionarg_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.
Function Testing
ArgTools.arg_readers
— Functionarg_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.
ArgTools.arg_writers
— Functionarg_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.
ArgTools.@arg_test
— Macro@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)
.