mirror of
https://github.com/fatedier/frp.git
synced 2024-12-15 19:21:01 +01:00
958 lines
12 KiB
Plaintext
958 lines
12 KiB
Plaintext
r"""Usage: prog
|
|
|
|
"""
|
|
$ prog
|
|
{}
|
|
|
|
$ prog --xxx
|
|
"user-error"
|
|
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
Options: -a All.
|
|
|
|
"""
|
|
$ prog
|
|
{"-a": false}
|
|
|
|
$ prog -a
|
|
{"-a": true}
|
|
|
|
$ prog -x
|
|
"user-error"
|
|
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
Options: --all All.
|
|
|
|
"""
|
|
$ prog
|
|
{"--all": false}
|
|
|
|
$ prog --all
|
|
{"--all": true}
|
|
|
|
$ prog --xxx
|
|
"user-error"
|
|
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
Options: -v, --verbose Verbose.
|
|
|
|
"""
|
|
$ prog --verbose
|
|
{"--verbose": true}
|
|
|
|
$ prog --ver
|
|
{"--verbose": true}
|
|
|
|
$ prog -v
|
|
{"--verbose": true}
|
|
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
Options: -p PATH
|
|
|
|
"""
|
|
$ prog -p home/
|
|
{"-p": "home/"}
|
|
|
|
$ prog -phome/
|
|
{"-p": "home/"}
|
|
|
|
$ prog -p
|
|
"user-error"
|
|
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
Options: --path <path>
|
|
|
|
"""
|
|
$ prog --path home/
|
|
{"--path": "home/"}
|
|
|
|
$ prog --path=home/
|
|
{"--path": "home/"}
|
|
|
|
$ prog --pa home/
|
|
{"--path": "home/"}
|
|
|
|
$ prog --pa=home/
|
|
{"--path": "home/"}
|
|
|
|
$ prog --path
|
|
"user-error"
|
|
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
Options: -p PATH, --path=<path> Path to files.
|
|
|
|
"""
|
|
$ prog -proot
|
|
{"--path": "root"}
|
|
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
Options: -p --path PATH Path to files.
|
|
|
|
"""
|
|
$ prog -p root
|
|
{"--path": "root"}
|
|
|
|
$ prog --path root
|
|
{"--path": "root"}
|
|
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
Options:
|
|
-p PATH Path to files [default: ./]
|
|
|
|
"""
|
|
$ prog
|
|
{"-p": "./"}
|
|
|
|
$ prog -phome
|
|
{"-p": "home"}
|
|
|
|
|
|
r"""UsAgE: prog [options]
|
|
|
|
OpTiOnS: --path=<files> Path to files
|
|
[dEfAuLt: /root]
|
|
|
|
"""
|
|
$ prog
|
|
{"--path": "/root"}
|
|
|
|
$ prog --path=home
|
|
{"--path": "home"}
|
|
|
|
|
|
r"""usage: prog [options]
|
|
|
|
options:
|
|
-a Add
|
|
-r Remote
|
|
-m <msg> Message
|
|
|
|
"""
|
|
$ prog -a -r -m Hello
|
|
{"-a": true,
|
|
"-r": true,
|
|
"-m": "Hello"}
|
|
|
|
$ prog -armyourass
|
|
{"-a": true,
|
|
"-r": true,
|
|
"-m": "yourass"}
|
|
|
|
$ prog -a -r
|
|
{"-a": true,
|
|
"-r": true,
|
|
"-m": null}
|
|
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
Options: --version
|
|
--verbose
|
|
|
|
"""
|
|
$ prog --version
|
|
{"--version": true,
|
|
"--verbose": false}
|
|
|
|
$ prog --verbose
|
|
{"--version": false,
|
|
"--verbose": true}
|
|
|
|
$ prog --ver
|
|
"user-error"
|
|
|
|
$ prog --verb
|
|
{"--version": false,
|
|
"--verbose": true}
|
|
|
|
|
|
r"""usage: prog [-a -r -m <msg>]
|
|
|
|
options:
|
|
-a Add
|
|
-r Remote
|
|
-m <msg> Message
|
|
|
|
"""
|
|
$ prog -armyourass
|
|
{"-a": true,
|
|
"-r": true,
|
|
"-m": "yourass"}
|
|
|
|
|
|
r"""usage: prog [-armmsg]
|
|
|
|
options: -a Add
|
|
-r Remote
|
|
-m <msg> Message
|
|
|
|
"""
|
|
$ prog -a -r -m Hello
|
|
{"-a": true,
|
|
"-r": true,
|
|
"-m": "Hello"}
|
|
|
|
|
|
r"""usage: prog -a -b
|
|
|
|
options:
|
|
-a
|
|
-b
|
|
|
|
"""
|
|
$ prog -a -b
|
|
{"-a": true, "-b": true}
|
|
|
|
$ prog -b -a
|
|
{"-a": true, "-b": true}
|
|
|
|
$ prog -a
|
|
"user-error"
|
|
|
|
$ prog
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog (-a -b)
|
|
|
|
options: -a
|
|
-b
|
|
|
|
"""
|
|
$ prog -a -b
|
|
{"-a": true, "-b": true}
|
|
|
|
$ prog -b -a
|
|
{"-a": true, "-b": true}
|
|
|
|
$ prog -a
|
|
"user-error"
|
|
|
|
$ prog
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog [-a] -b
|
|
|
|
options: -a
|
|
-b
|
|
|
|
"""
|
|
$ prog -a -b
|
|
{"-a": true, "-b": true}
|
|
|
|
$ prog -b -a
|
|
{"-a": true, "-b": true}
|
|
|
|
$ prog -a
|
|
"user-error"
|
|
|
|
$ prog -b
|
|
{"-a": false, "-b": true}
|
|
|
|
$ prog
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog [(-a -b)]
|
|
|
|
options: -a
|
|
-b
|
|
|
|
"""
|
|
$ prog -a -b
|
|
{"-a": true, "-b": true}
|
|
|
|
$ prog -b -a
|
|
{"-a": true, "-b": true}
|
|
|
|
$ prog -a
|
|
"user-error"
|
|
|
|
$ prog -b
|
|
"user-error"
|
|
|
|
$ prog
|
|
{"-a": false, "-b": false}
|
|
|
|
|
|
r"""usage: prog (-a|-b)
|
|
|
|
options: -a
|
|
-b
|
|
|
|
"""
|
|
$ prog -a -b
|
|
"user-error"
|
|
|
|
$ prog
|
|
"user-error"
|
|
|
|
$ prog -a
|
|
{"-a": true, "-b": false}
|
|
|
|
$ prog -b
|
|
{"-a": false, "-b": true}
|
|
|
|
|
|
r"""usage: prog [ -a | -b ]
|
|
|
|
options: -a
|
|
-b
|
|
|
|
"""
|
|
$ prog -a -b
|
|
"user-error"
|
|
|
|
$ prog
|
|
{"-a": false, "-b": false}
|
|
|
|
$ prog -a
|
|
{"-a": true, "-b": false}
|
|
|
|
$ prog -b
|
|
{"-a": false, "-b": true}
|
|
|
|
|
|
r"""usage: prog <arg>"""
|
|
$ prog 10
|
|
{"<arg>": "10"}
|
|
|
|
$ prog 10 20
|
|
"user-error"
|
|
|
|
$ prog
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog [<arg>]"""
|
|
$ prog 10
|
|
{"<arg>": "10"}
|
|
|
|
$ prog 10 20
|
|
"user-error"
|
|
|
|
$ prog
|
|
{"<arg>": null}
|
|
|
|
|
|
r"""usage: prog <kind> <name> <type>"""
|
|
$ prog 10 20 40
|
|
{"<kind>": "10", "<name>": "20", "<type>": "40"}
|
|
|
|
$ prog 10 20
|
|
"user-error"
|
|
|
|
$ prog
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog <kind> [<name> <type>]"""
|
|
$ prog 10 20 40
|
|
{"<kind>": "10", "<name>": "20", "<type>": "40"}
|
|
|
|
$ prog 10 20
|
|
{"<kind>": "10", "<name>": "20", "<type>": null}
|
|
|
|
$ prog
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog [<kind> | <name> <type>]"""
|
|
$ prog 10 20 40
|
|
"user-error"
|
|
|
|
$ prog 20 40
|
|
{"<kind>": null, "<name>": "20", "<type>": "40"}
|
|
|
|
$ prog
|
|
{"<kind>": null, "<name>": null, "<type>": null}
|
|
|
|
|
|
r"""usage: prog (<kind> --all | <name>)
|
|
|
|
options:
|
|
--all
|
|
|
|
"""
|
|
$ prog 10 --all
|
|
{"<kind>": "10", "--all": true, "<name>": null}
|
|
|
|
$ prog 10
|
|
{"<kind>": null, "--all": false, "<name>": "10"}
|
|
|
|
$ prog
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog [<name> <name>]"""
|
|
$ prog 10 20
|
|
{"<name>": ["10", "20"]}
|
|
|
|
$ prog 10
|
|
{"<name>": ["10"]}
|
|
|
|
$ prog
|
|
{"<name>": []}
|
|
|
|
|
|
r"""usage: prog [(<name> <name>)]"""
|
|
$ prog 10 20
|
|
{"<name>": ["10", "20"]}
|
|
|
|
$ prog 10
|
|
"user-error"
|
|
|
|
$ prog
|
|
{"<name>": []}
|
|
|
|
|
|
r"""usage: prog NAME..."""
|
|
$ prog 10 20
|
|
{"NAME": ["10", "20"]}
|
|
|
|
$ prog 10
|
|
{"NAME": ["10"]}
|
|
|
|
$ prog
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog [NAME]..."""
|
|
$ prog 10 20
|
|
{"NAME": ["10", "20"]}
|
|
|
|
$ prog 10
|
|
{"NAME": ["10"]}
|
|
|
|
$ prog
|
|
{"NAME": []}
|
|
|
|
|
|
r"""usage: prog [NAME...]"""
|
|
$ prog 10 20
|
|
{"NAME": ["10", "20"]}
|
|
|
|
$ prog 10
|
|
{"NAME": ["10"]}
|
|
|
|
$ prog
|
|
{"NAME": []}
|
|
|
|
|
|
r"""usage: prog [NAME [NAME ...]]"""
|
|
$ prog 10 20
|
|
{"NAME": ["10", "20"]}
|
|
|
|
$ prog 10
|
|
{"NAME": ["10"]}
|
|
|
|
$ prog
|
|
{"NAME": []}
|
|
|
|
|
|
r"""usage: prog (NAME | --foo NAME)
|
|
|
|
options: --foo
|
|
|
|
"""
|
|
$ prog 10
|
|
{"NAME": "10", "--foo": false}
|
|
|
|
$ prog --foo 10
|
|
{"NAME": "10", "--foo": true}
|
|
|
|
$ prog --foo=10
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog (NAME | --foo) [--bar | NAME]
|
|
|
|
options: --foo
|
|
options: --bar
|
|
|
|
"""
|
|
$ prog 10
|
|
{"NAME": ["10"], "--foo": false, "--bar": false}
|
|
|
|
$ prog 10 20
|
|
{"NAME": ["10", "20"], "--foo": false, "--bar": false}
|
|
|
|
$ prog --foo --bar
|
|
{"NAME": [], "--foo": true, "--bar": true}
|
|
|
|
|
|
r"""Naval Fate.
|
|
|
|
Usage:
|
|
prog ship new <name>...
|
|
prog ship [<name>] move <x> <y> [--speed=<kn>]
|
|
prog ship shoot <x> <y>
|
|
prog mine (set|remove) <x> <y> [--moored|--drifting]
|
|
prog -h | --help
|
|
prog --version
|
|
|
|
Options:
|
|
-h --help Show this screen.
|
|
--version Show version.
|
|
--speed=<kn> Speed in knots [default: 10].
|
|
--moored Mored (anchored) mine.
|
|
--drifting Drifting mine.
|
|
|
|
"""
|
|
$ prog ship Guardian move 150 300 --speed=20
|
|
{"--drifting": false,
|
|
"--help": false,
|
|
"--moored": false,
|
|
"--speed": "20",
|
|
"--version": false,
|
|
"<name>": ["Guardian"],
|
|
"<x>": "150",
|
|
"<y>": "300",
|
|
"mine": false,
|
|
"move": true,
|
|
"new": false,
|
|
"remove": false,
|
|
"set": false,
|
|
"ship": true,
|
|
"shoot": false}
|
|
|
|
|
|
r"""usage: prog --hello"""
|
|
$ prog --hello
|
|
{"--hello": true}
|
|
|
|
|
|
r"""usage: prog [--hello=<world>]"""
|
|
$ prog
|
|
{"--hello": null}
|
|
|
|
$ prog --hello wrld
|
|
{"--hello": "wrld"}
|
|
|
|
|
|
r"""usage: prog [-o]"""
|
|
$ prog
|
|
{"-o": false}
|
|
|
|
$ prog -o
|
|
{"-o": true}
|
|
|
|
|
|
r"""usage: prog [-opr]"""
|
|
$ prog -op
|
|
{"-o": true, "-p": true, "-r": false}
|
|
|
|
|
|
r"""usage: prog --aabb | --aa"""
|
|
$ prog --aa
|
|
{"--aabb": false, "--aa": true}
|
|
|
|
$ prog --a
|
|
"user-error" # not a unique prefix
|
|
|
|
#
|
|
# Counting number of flags
|
|
#
|
|
|
|
r"""Usage: prog -v"""
|
|
$ prog -v
|
|
{"-v": true}
|
|
|
|
|
|
r"""Usage: prog [-v -v]"""
|
|
$ prog
|
|
{"-v": 0}
|
|
|
|
$ prog -v
|
|
{"-v": 1}
|
|
|
|
$ prog -vv
|
|
{"-v": 2}
|
|
|
|
|
|
r"""Usage: prog -v ..."""
|
|
$ prog
|
|
"user-error"
|
|
|
|
$ prog -v
|
|
{"-v": 1}
|
|
|
|
$ prog -vv
|
|
{"-v": 2}
|
|
|
|
$ prog -vvvvvv
|
|
{"-v": 6}
|
|
|
|
|
|
r"""Usage: prog [-v | -vv | -vvv]
|
|
|
|
This one is probably most readable user-friednly variant.
|
|
|
|
"""
|
|
$ prog
|
|
{"-v": 0}
|
|
|
|
$ prog -v
|
|
{"-v": 1}
|
|
|
|
$ prog -vv
|
|
{"-v": 2}
|
|
|
|
$ prog -vvvv
|
|
"user-error"
|
|
|
|
|
|
r"""usage: prog [--ver --ver]"""
|
|
$ prog --ver --ver
|
|
{"--ver": 2}
|
|
|
|
|
|
#
|
|
# Counting commands
|
|
#
|
|
|
|
r"""usage: prog [go]"""
|
|
$ prog go
|
|
{"go": true}
|
|
|
|
|
|
r"""usage: prog [go go]"""
|
|
$ prog
|
|
{"go": 0}
|
|
|
|
$ prog go
|
|
{"go": 1}
|
|
|
|
$ prog go go
|
|
{"go": 2}
|
|
|
|
$ prog go go go
|
|
"user-error"
|
|
|
|
r"""usage: prog go..."""
|
|
$ prog go go go go go
|
|
{"go": 5}
|
|
|
|
#
|
|
# [options] does not include options from usage-pattern
|
|
#
|
|
r"""usage: prog [options] [-a]
|
|
|
|
options: -a
|
|
-b
|
|
"""
|
|
$ prog -a
|
|
{"-a": true, "-b": false}
|
|
|
|
$ prog -aa
|
|
"user-error"
|
|
|
|
#
|
|
# Test [options] shourtcut
|
|
#
|
|
|
|
r"""Usage: prog [options] A
|
|
Options:
|
|
-q Be quiet
|
|
-v Be verbose.
|
|
|
|
"""
|
|
$ prog arg
|
|
{"A": "arg", "-v": false, "-q": false}
|
|
|
|
$ prog -v arg
|
|
{"A": "arg", "-v": true, "-q": false}
|
|
|
|
$ prog -q arg
|
|
{"A": "arg", "-v": false, "-q": true}
|
|
|
|
#
|
|
# Test single dash
|
|
#
|
|
|
|
r"""usage: prog [-]"""
|
|
|
|
$ prog -
|
|
{"-": true}
|
|
|
|
$ prog
|
|
{"-": false}
|
|
|
|
#
|
|
# If argument is repeated, its value should always be a list
|
|
#
|
|
|
|
r"""usage: prog [NAME [NAME ...]]"""
|
|
|
|
$ prog a b
|
|
{"NAME": ["a", "b"]}
|
|
|
|
$ prog
|
|
{"NAME": []}
|
|
|
|
#
|
|
# Option's argument defaults to null/None
|
|
#
|
|
|
|
r"""usage: prog [options]
|
|
options:
|
|
-a Add
|
|
-m <msg> Message
|
|
|
|
"""
|
|
$ prog -a
|
|
{"-m": null, "-a": true}
|
|
|
|
#
|
|
# Test options without description
|
|
#
|
|
|
|
r"""usage: prog --hello"""
|
|
$ prog --hello
|
|
{"--hello": true}
|
|
|
|
r"""usage: prog [--hello=<world>]"""
|
|
$ prog
|
|
{"--hello": null}
|
|
|
|
$ prog --hello wrld
|
|
{"--hello": "wrld"}
|
|
|
|
r"""usage: prog [-o]"""
|
|
$ prog
|
|
{"-o": false}
|
|
|
|
$ prog -o
|
|
{"-o": true}
|
|
|
|
r"""usage: prog [-opr]"""
|
|
$ prog -op
|
|
{"-o": true, "-p": true, "-r": false}
|
|
|
|
r"""usage: git [-v | --verbose]"""
|
|
$ prog -v
|
|
{"-v": true, "--verbose": false}
|
|
|
|
r"""usage: git remote [-v | --verbose]"""
|
|
$ prog remote -v
|
|
{"remote": true, "-v": true, "--verbose": false}
|
|
|
|
#
|
|
# Test empty usage pattern
|
|
#
|
|
|
|
r"""usage: prog"""
|
|
$ prog
|
|
{}
|
|
|
|
r"""usage: prog
|
|
prog <a> <b>
|
|
"""
|
|
$ prog 1 2
|
|
{"<a>": "1", "<b>": "2"}
|
|
|
|
$ prog
|
|
{"<a>": null, "<b>": null}
|
|
|
|
r"""usage: prog <a> <b>
|
|
prog
|
|
"""
|
|
$ prog
|
|
{"<a>": null, "<b>": null}
|
|
|
|
#
|
|
# Option's argument should not capture default value from usage pattern
|
|
#
|
|
|
|
r"""usage: prog [--file=<f>]"""
|
|
$ prog
|
|
{"--file": null}
|
|
|
|
r"""usage: prog [--file=<f>]
|
|
|
|
options: --file <a>
|
|
|
|
"""
|
|
$ prog
|
|
{"--file": null}
|
|
|
|
r"""Usage: prog [-a <host:port>]
|
|
|
|
Options: -a, --address <host:port> TCP address [default: localhost:6283].
|
|
|
|
"""
|
|
$ prog
|
|
{"--address": "localhost:6283"}
|
|
|
|
#
|
|
# If option with argument could be repeated,
|
|
# its arguments should be accumulated into a list
|
|
#
|
|
|
|
r"""usage: prog --long=<arg> ..."""
|
|
|
|
$ prog --long one
|
|
{"--long": ["one"]}
|
|
|
|
$ prog --long one --long two
|
|
{"--long": ["one", "two"]}
|
|
|
|
#
|
|
# Test multiple elements repeated at once
|
|
#
|
|
|
|
r"""usage: prog (go <direction> --speed=<km/h>)..."""
|
|
$ prog go left --speed=5 go right --speed=9
|
|
{"go": 2, "<direction>": ["left", "right"], "--speed": ["5", "9"]}
|
|
|
|
#
|
|
# Required options should work with option shortcut
|
|
#
|
|
|
|
r"""usage: prog [options] -a
|
|
|
|
options: -a
|
|
|
|
"""
|
|
$ prog -a
|
|
{"-a": true}
|
|
|
|
#
|
|
# If option could be repeated its defaults should be split into a list
|
|
#
|
|
|
|
r"""usage: prog [-o <o>]...
|
|
|
|
options: -o <o> [default: x]
|
|
|
|
"""
|
|
$ prog -o this -o that
|
|
{"-o": ["this", "that"]}
|
|
|
|
$ prog
|
|
{"-o": ["x"]}
|
|
|
|
r"""usage: prog [-o <o>]...
|
|
|
|
options: -o <o> [default: x y]
|
|
|
|
"""
|
|
$ prog -o this
|
|
{"-o": ["this"]}
|
|
|
|
$ prog
|
|
{"-o": ["x", "y"]}
|
|
|
|
#
|
|
# Test stacked option's argument
|
|
#
|
|
|
|
r"""usage: prog -pPATH
|
|
|
|
options: -p PATH
|
|
|
|
"""
|
|
$ prog -pHOME
|
|
{"-p": "HOME"}
|
|
|
|
#
|
|
# Issue 56: Repeated mutually exclusive args give nested lists sometimes
|
|
#
|
|
|
|
r"""Usage: foo (--xx=x|--yy=y)..."""
|
|
$ prog --xx=1 --yy=2
|
|
{"--xx": ["1"], "--yy": ["2"]}
|
|
|
|
#
|
|
# POSIXly correct tokenization
|
|
#
|
|
|
|
r"""usage: prog [<input file>]"""
|
|
$ prog f.txt
|
|
{"<input file>": "f.txt"}
|
|
|
|
r"""usage: prog [--input=<file name>]..."""
|
|
$ prog --input a.txt --input=b.txt
|
|
{"--input": ["a.txt", "b.txt"]}
|
|
|
|
#
|
|
# Issue 85: `[options]` shourtcut with multiple subcommands
|
|
#
|
|
|
|
r"""usage: prog good [options]
|
|
prog fail [options]
|
|
|
|
options: --loglevel=N
|
|
|
|
"""
|
|
$ prog fail --loglevel 5
|
|
{"--loglevel": "5", "fail": true, "good": false}
|
|
|
|
#
|
|
# Usage-section syntax
|
|
#
|
|
|
|
r"""usage:prog --foo"""
|
|
$ prog --foo
|
|
{"--foo": true}
|
|
|
|
r"""PROGRAM USAGE: prog --foo"""
|
|
$ prog --foo
|
|
{"--foo": true}
|
|
|
|
r"""Usage: prog --foo
|
|
prog --bar
|
|
NOT PART OF SECTION"""
|
|
$ prog --foo
|
|
{"--foo": true, "--bar": false}
|
|
|
|
r"""Usage:
|
|
prog --foo
|
|
prog --bar
|
|
|
|
NOT PART OF SECTION"""
|
|
$ prog --foo
|
|
{"--foo": true, "--bar": false}
|
|
|
|
r"""Usage:
|
|
prog --foo
|
|
prog --bar
|
|
NOT PART OF SECTION"""
|
|
$ prog --foo
|
|
{"--foo": true, "--bar": false}
|
|
|
|
#
|
|
# Options-section syntax
|
|
#
|
|
|
|
r"""Usage: prog [options]
|
|
|
|
global options: --foo
|
|
local options: --baz
|
|
--bar
|
|
other options:
|
|
--egg
|
|
--spam
|
|
-not-an-option-
|
|
|
|
"""
|
|
$ prog --baz --egg
|
|
{"--foo": false, "--baz": true, "--bar": false, "--egg": true, "--spam": false}
|