Slop은 기억하기 쉬운 구문과 친숙한 API를 갖춘 간단한 옵션 파서입니다.
gem install slop
opts = Slop . parse do | o |
o . string '-h' , '--host' , 'a hostname'
o . integer '--port' , 'custom port' , default : 80
o . string '-l' , '--login' , required : true
o . symbol '-m' , '--method' , default : :get
o . bool '-v' , '--verbose' , 'enable verbose mode'
o . bool '-q' , '--quiet' , 'suppress output (quiet mode)'
o . bool '-c' , '--check-ssl-certificate' , 'check SSL certificate for host'
o . bool '-k' , '--use-keychain' , 'store passphrase in OS keychain'
o . on '--version' , 'print the version' do
puts Slop :: VERSION
exit
end
end
ARGV #=> -v --login alice --host 192.168.0.1 -m post --check-ssl-certificate --use-keychain false
opts [ :host ] #=> 192.168.0.1
opts [ :login ] #=> alice
opts [ :method ] #=> :post
opts [ :use_keychain ] #=> false
# We can also check if a flag was passed (this has no bearing on the options default value):
opts . use_keychain? #=> true
opts . verbose? #=> true
opts . quiet? #=> false
opts . check_ssl_certificate? #=> true
opts . to_hash #=> { host: "192.168.0.1", port: 80, login: "alice", method: :post, verbose: true, quiet: false, check_ssl_certificate: true }
--version
플래그에 추가한 블록은 구문 분석 시간 동안 실행됩니다. 따라서 이러한 블록은 플래그 존재에 즉시 반응하기 위해 예약되어야 합니다. 다른 옵션에 액세스하거나 값을 변경하려면 아래의 "사용자 정의 옵션 유형" 섹션을 확인하고 #finish
메소드를 구현하세요.
내장 옵션 유형은 다음과 같습니다.
o . string #=> Slop::StringOption, expects an argument
o . bool #=> Slop::BoolOption, argument optional, aliased to BooleanOption
o . integer #=> Slop::IntegerOption, expects an argument, aliased to IntOption
o . float #=> Slop::FloatOption, expects an argument
o . array #=> Slop::ArrayOption, expects an argument
o . regexp #=> Slop::RegexpOption, expects an argument
o . symbol #=> Slop::SymbolOption, expects an argument
o . null #=> Slop::NullOption, no argument and ignored from `to_hash`
o . on #=> alias for o.null
slop/types.rb
에서 모든 내장 유형을 볼 수 있습니다. 더 많은 유형에 대한 제안이나 끌어오기 요청을 환영합니다.
이 예는 실제로 기본 API가 작동하는 방식을 설명하기 위한 것입니다. 반드시 최선의 방법은 아닙니다.
opts = Slop :: Options . new
opts . banner = "usage: connect [options] ..."
opts . separator ""
opts . separator "Connection options:"
opts . string "-H" , "--hostname" , "a hostname"
opts . int "-p" , "--port" , "a port" , default : 80
opts . separator ""
opts . separator "Extra options:"
opts . array "--files" , "a list of files to import"
opts . bool "-v" , "--verbose" , "enable verbose mode" , default : true
parser = Slop :: Parser . new ( opts )
result = parser . parse ( [ "--hostname" , "192.168.0.1" , "--no-verbose" ] )
result . to_hash #=> { hostname: "192.168.0.1", port: 80,
# files: [], verbose: false }
puts opts # prints out help
파서에서 처리되지 않은 인수 배열(예: 옵션 또는 소비된 인수)을 검색하려는 것이 일반적입니다. Result#arguments
메소드를 사용하면 됩니다:
args = %w( connect --host google.com GET )
opts = Slop . parse args do | o |
o . string '--host'
end
p opts . arguments #=> ["connect", "GET"] # also aliased to `args`
이는 ARGF
로 스크립트를 작성할 때 특히 유용합니다.
opts = Slop . parse do | blah |
# ...
end
# make sure sloptions aren't consumed by ARGF
ARGV . replace opts . arguments
ARGF . each { | line |
# ...
}
Slop에는 배열 값을 처리하기 위한 ArrayOption
이 내장되어 있습니다.
opts = Slop . parse do | o |
# the delimiter defaults to ','
o . array '--files' , 'a list of files' , delimiter : ','
end
# Both of these will return o[:files] as ["foo.txt", "bar.rb"]:
# --files foo.txt,bar.rb
# --files foo.txt --files bar.rb
# This will return o[:files] as []:
# --files ""
내장된 문자열 분할을 비활성화하려면 구분 기호를 nil
로 설정하세요.
Slop은 추가된 모든 새 옵션에 대해 옵션 유형 클래스를 사용합니다. 기본값은 NullOption
입니다. o.array
입력하면 Slop은 Slop::ArrayOption
이라는 옵션을 찾습니다. 이 클래스에는 call
메소드가 1개 이상 포함되어 있어야 합니다. 이 메서드는 구문 분석 시 실행되며 이 메서드의 반환 값은 옵션 값으로 사용됩니다. 이를 사용하여 사용자 정의 옵션 유형을 만들 수 있습니다.
module Slop
class PathOption < Option
def call ( value )
Pathname . new ( value )
end
end
end
opts = Slop . parse %w( --path ~/ ) do | o |
o . path '--path' , 'a custom path name'
end
p opts [ :path ] #=> #<Pathname:~/>
사용자 정의 옵션은 finish
메소드를 구현할 수도 있습니다. 이 메서드는 기본적으로 아무 작업도 수행하지 않지만 모든 옵션이 구문 분석되면 실행됩니다. 이를 통해 특정 순서로 구문 분석되는 옵션에 의존하지 않고도 돌아가서 상태를 변경할 수 있습니다. 예는 다음과 같습니다.
module Slop
class FilesOption < ArrayOption
def finish ( opts )
if opts . expand?
self . value = value . map { | f | File . expand_path ( f ) }
end
end
end
end
opts = Slop . parse %w( --files foo.txt,bar.rb -e ) do | o |
o . files '--files' , 'an array of files'
o . bool '-e' , '--expand' , 'if used, list of files will be expanded'
end
p opts [ :files ] #=> ["/full/path/foo.txt", "/full/path/bar.rb"]
Slop은 다음에 대한 오류를 발생시킵니다.
Slop::MissingArgument
Slop::UnknownOption
required
로 표시된 옵션: Slop::MissingRequiredOption
validate_types
로 표시된 옵션(예: integer
의 경우 bla
): Slop::InvalidOptionValue
이러한 오류는 Slop::Error
에서 상속되므로 모두 구제할 수 있습니다. 또는 suppress_errors
구성 옵션을 사용하여 이러한 오류를 억제할 수 있습니다.
opts = Slop . parse suppress_errors : true do
o . string '-name'
end
# or per option:
opts = Slop . parse do
o . string '-host' , suppress_errors : true
o . int '-port'
end
기본적으로 Slop은 인수가 주어진 옵션에 대해 유효한 값인지 여부를 확인하지 않습니다. 대신 옵션에 기본값이 있으면 제공된 잘못된 인수보다 먼저 사용됩니다. 유형(예: integer
및 float
)의 유효성을 검사하고 제공된 값이 유효하지 않음을 표시하려면 인수 자체 또는 해당 옵션 세트에 추가 옵션을 제공할 수 있습니다.
opts = Slop :: Options . new
opts . int "-p" , "--port" , "a port" , default : 80 , validate_types : true
parser = Slop :: Parser . new ( opts )
result = parser . parse ( [ "--port" , "bla" ] )
# invalid value for -p, --port (Slop::InvalidOptionValue)
# Or to the option set...
opts = Slop :: Options . new ( validate_types : true )
opts . int "-p" , "--port" , "a port" , default : 80
parser = Slop :: Parser . new ( opts )
result = parser . parse ( [ "--port" , "bla" ] )
# invalid value for -p, --port (Slop::InvalidOptionValue)
Slop.parse
의 반환 값은 옵션을 표시하는 데 유용한 도움말 문자열을 제공하는 Slop::Result
입니다. puts opts
opts.to_s
호출하세요.
opts = Slop . parse do | o |
o . string '-h' , '--host' , 'hostname'
o . int '-p' , '--port' , 'port (default: 80)' , default : 80
o . string '--username'
o . separator ''
o . separator 'other options:'
o . bool '--quiet' , 'suppress output'
o . on '-v' , '--version' do
puts "1.1.1"
end
end
puts opts
산출:
% ruby run.rb
usage: run.rb [options]
-h, --host hostname
-p, --port port (default: 80)
--username
other options:
--quiet suppress output
-v, --version
이 메서드는 선택적 prefix
값을 사용하며 기본값은 " " * 4
입니다.
puts opts.to_s(prefix: " ")
가장 긴 옵션 플래그에 따라 설명을 정렬하는 작업을 처리합니다.
다음은 자신만의 도움말 옵션을 추가하는 예입니다.
o . on '--help' do
puts o
exit
end
Slop은 더 이상 git 스타일 하위 명령을 지원하지 않습니다.