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와 다양한 쓰기 가능한 인수 유형으로 변환될 수 있는 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_readersarg_writers에서 제공하는 arg 함수를 실제 인수 값으로 변환하는 데 사용됩니다. @arg_test arg body를 작성하면 arg(arg -> body)와 동일합니다.

source