ArgTools
Argument Handling
ArgTools.ArgRead
— TypeArgRead = Union{AbstractString, AbstractCmd, IO}
ArgRead
タイプは、arg_read
関数が読み取り可能な IO ハンドルに変換する方法を知っているタイプのユニオンです。詳細については arg_read
を参照してください。
ArgTools.ArgWrite
— TypeArgWrite = Union{AbstractString, AbstractCmd, IO}
ArgWrite
タイプは、arg_write
関数が書き込み可能な IO ハンドルに変換する方法を知っているタイプのユニオンであり、Nothing
は arg_write
が一時ファイルを生成することで処理します。詳細については arg_write
を参照してください。
ArgTools.arg_read
— Functionarg_read(f::Function, arg::ArgRead) -> f(arg_io)
arg_read
関数は、次のいずれかの引数 arg
を受け入れます:
AbstractString
: 読み取りのために開かれるファイルパスAbstractCmd
: 標準出力から読み取るコマンドIO
: 読み取るために開かれた IO ハンドル
本体が正常に戻るかエラーをスローするかにかかわらず、開かれたパスは arg_read
から戻る前に閉じられ、IO
ハンドルは arg_read
から戻る前にフラッシュされますが、閉じられません。
注意:ファイルを開くとき、ArgTools はファイル open(...)
呼び出しに lock = false
を渡します。したがって、この関数から返されるオブジェクトは複数のスレッドから使用されるべきではありません。この制限は将来的に緩和される可能性がありますが、動作しているコードを壊すことはありません。
ArgTools.arg_write
— Functionarg_write(f::Function, arg::ArgWrite) -> arg
arg_write(f::Function, arg::Nothing) -> tempname()
arg_read
関数は、次のいずれかの引数 arg
を受け入れます:
AbstractString
: 書き込みのために開かれるファイルパスAbstractCmd
: 標準入力に書き込むコマンドIO
: 書き込むために開かれた IO ハンドルNothing
: 一時的なパスに書き込むべき
本体が正常に返されると、開かれたパスは完了時に閉じられます。IO ハンドル引数はオープンのままですが、返す前にフラッシュされます。引数が nothing
の場合、一時的なパスが書き込みのために開かれ、完了時に閉じられ、そのパスが arg_write
から返されます。他のすべてのケースでは、arg
自体が返されます。これは、引数が渡されたかどうかにかかわらず、書き込まれたものを一貫して返すことができる便利なパターンです。
本体の評価中にエラーが発生した場合、arg_write
によって書き込みのために開かれたパスは削除されます。これは、文字列として渡された場合でも、arg
が nothing
のときに生成された一時的なパスでも同様です。
注意:ファイルを開く際、ArgTools はファイル open(...)
呼び出しに lock = false
を渡します。したがって、この関数によって返されるオブジェクトは、複数のスレッドから使用されるべきではありません。この制限は将来的に緩和される可能性がありますが、それによって動作するコードが壊れることはありません。
ArgTools.arg_isdir
— Functionarg_isdir(f::Function, arg::AbstractString) -> f(arg)
arg_isdir
関数は arg
を受け取り、これは既存のディレクトリへのパスでなければなりません(そうでない場合はエラーが発生します)そしてそのパスを f
に渡し、最終的に f(arg)
の結果を返します。これは ArgTools
が提供する最も役に立たないツールであり、主に arg_mkdir
との対称性を持たせ、一貫したエラーメッセージを提供するために存在します。
ArgTools.arg_mkdir
— Functionarg_mkdir(f::Function, arg::AbstractString) -> arg
arg_mkdir(f::Function, arg::Nothing) -> mktempdir()
arg_mkdir
関数は arg
を受け取り、これは次のいずれかでなければなりません:
- 既に存在する空のディレクトリへのパス、
- ディレクトリとして作成可能な存在しないパス、または
nothing
の場合、一時ディレクトリが作成されます。
すべての場合において、ディレクトリへのパスが返されます。f(arg)
の実行中にエラーが発生した場合、ディレクトリは元の状態に戻されます:既に存在していたが空であった場合は空にされ、存在しなかった場合は削除されます。
Function Testing
ArgTools.arg_readers
— Functionarg_readers(arg :: AbstractString, [ type = ArgRead ]) do arg::Function
## プレテストセットアップ ##
@arg_test arg begin
arg :: ArgRead
## `arg`を使用したテスト ##
end
## ポストテストクリーンアップ ##
end
arg_readers
関数は、読み取るパスと単一引数のdoブロックを受け取り、arg_read
が処理できる各テストリーダータイプごとに一度呼び出されます。オプションのtype
引数が指定されている場合、doブロックはそのタイプの引数を生成するリーダーに対してのみ呼び出されます。
doブロックに渡されるarg
は、引数の値そのものではありません。なぜなら、いくつかのテスト引数タイプは、各テストケースのために初期化および最終化する必要があるからです。オープンファイルハンドル引数を考えてみてください:一度テストに使用したら、再度使用することはできません。次のテストのためにそれを閉じて、ファイルを再度開く必要があります。この関数arg
は、@arg_test arg begin ... end
を使用してArgRead
インスタンスに変換できます。
ArgTools.arg_writers
— Functionarg_writers([ type = ArgWrite ]) do path::String, arg::Function
## テスト前のセットアップ ##
@arg_test arg begin
arg :: ArgWrite
## `arg`を使ったテスト ##
end
## テスト後のクリーンアップ ##
end
arg_writers
関数はdoブロックを受け取り、arg_write
が処理できる各テストライタータイプごとに一度呼び出されます。これは一時的(存在しない)なpath
と、path
に書き込むさまざまな書き込み可能な引数タイプに変換できるarg
を持ちます。オプションのtype
引数が指定されている場合、doブロックはそのタイプの引数を生成するライターに対してのみ呼び出されます。
doブロックに渡されるarg
は引数の値そのものではありません。なぜなら、いくつかのテスト引数タイプは各テストケースのために初期化および最終化する必要があるからです。オープンファイルハンドル引数を考えてみてください:一度テストに使用したら、再度使用することはできません。次のテストのためにファイルを閉じて再度開く必要があります。このarg
関数は、@arg_test arg begin ... end
を使用してArgWrite
インスタンスに変換できます。
arg_readers
のようにパス名を受け取るarg_writers
メソッドもあります:
arg_writers(path::AbstractString, [ type = ArgWrite ]) do arg::Function
## テスト前のセットアップ ##
@arg_test arg begin
# ここで`arg :: ArgWrite`
## `arg`を使ったテスト ##
end
## テスト後のクリーンアップ ##
end
このメソッドは、tempname()
によって生成されたパス名を使用する代わりにpath
を指定する必要がある場合に便利です。path
はarg_writers
の外部から渡されるため、この形式ではdoブロックの引数ではありません。
ArgTools.@arg_test
— Macro@arg_test arg1 arg2 ... body
@arg_test
マクロは、arg_readers
および arg_writers
によって提供される arg
関数を実際の引数値に変換するために使用されます。@arg_test arg body
と書くと、arg(arg -> body)
と同等になります。