ArgTools

Argument Handling

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

ArgRead タイプは、arg_read 関数が読み取り可能な IO ハンドルに変換する方法を知っているタイプのユニオンです。詳細については arg_read を参照してください。

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

ArgWrite タイプは、arg_write 関数が書き込み可能な IO ハンドルに変換する方法を知っているタイプのユニオンであり、Nothingarg_write が一時ファイルを生成することで処理します。詳細については arg_write を参照してください。

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

arg_read 関数は、次のいずれかの引数 arg を受け入れます:

  • AbstractString: 読み取りのために開かれるファイルパス
  • AbstractCmd: 標準出力から読み取るコマンド
  • IO: 読み取るために開かれた IO ハンドル

本体が正常に戻るかエラーをスローするかにかかわらず、開かれたパスは arg_read から戻る前に閉じられ、IO ハンドルは arg_read から戻る前にフラッシュされますが、閉じられません。

注意:ファイルを開くとき、ArgTools はファイル open(...) 呼び出しに lock = false を渡します。したがって、この関数から返されるオブジェクトは複数のスレッドから使用されるべきではありません。この制限は将来的に緩和される可能性がありますが、動作しているコードを壊すことはありません。

source
ArgTools.arg_writeFunction
arg_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 によって書き込みのために開かれたパスは削除されます。これは、文字列として渡された場合でも、argnothing のときに生成された一時的なパスでも同様です。

注意:ファイルを開く際、ArgTools はファイル open(...) 呼び出しに lock = false を渡します。したがって、この関数によって返されるオブジェクトは、複数のスレッドから使用されるべきではありません。この制限は将来的に緩和される可能性がありますが、それによって動作するコードが壊れることはありません。

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

arg_isdir 関数は arg を受け取り、これは既存のディレクトリへのパスでなければなりません(そうでない場合はエラーが発生します)そしてそのパスを f に渡し、最終的に f(arg) の結果を返します。これは ArgTools が提供する最も役に立たないツールであり、主に arg_mkdir との対称性を持たせ、一貫したエラーメッセージを提供するために存在します。

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

arg_mkdir 関数は arg を受け取り、これは次のいずれかでなければなりません:

  • 既に存在する空のディレクトリへのパス、
  • ディレクトリとして作成可能な存在しないパス、または
  • nothing の場合、一時ディレクトリが作成されます。

すべての場合において、ディレクトリへのパスが返されます。f(arg) の実行中にエラーが発生した場合、ディレクトリは元の状態に戻されます:既に存在していたが空であった場合は空にされ、存在しなかった場合は削除されます。

source

Function Testing

ArgTools.arg_readersFunction
arg_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インスタンスに変換できます。

source
ArgTools.arg_writersFunction
arg_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を指定する必要がある場合に便利です。patharg_writersの外部から渡されるため、この形式ではdoブロックの引数ではありません。

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

@arg_test マクロは、arg_readers および arg_writers によって提供される arg 関数を実際の引数値に変換するために使用されます。@arg_test arg body と書くと、arg(arg -> body) と同等になります。

source